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|  10.9k|{
  876|  10.9k|	static gsize gtype_id = 0;
  877|       |
  878|  10.9k|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|  10.9k|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|  10.9k|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 10.9k]
  |  |  ------------------
  |  |  249|  10.9k|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|  10.9k|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|  10.9k|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|  10.9k|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|  21.8k|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|  10.9k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|  21.8k|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|  10.9k|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|  21.8k|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|  21.8k|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|  21.8k|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|  21.8k|    gapg_temp_newval;                                                        \
  |  |  |  |  131|  21.8k|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 10.9k]
  |  |  ------------------
  |  |  252|  10.9k|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|  10.9k|  }))
  ------------------
  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|  10.9k|	return (GType) gtype_id;
  894|  10.9k|}
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|     11|{
  970|     11|	static gsize gtype_id = 0;
  971|       |
  972|     11|	if (g_once_init_enter(&gtype_id)) {
  ------------------
  |  |  248|     11|  (G_GNUC_EXTENSION ({                                               \
  |  |  ------------------
  |  |  |  |   54|     11|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  |  Branch (248:3): [True: 1, False: 10]
  |  |  ------------------
  |  |  249|     11|    G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer));       \
  |  |  ------------------
  |  |  |  |  745|     11|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  250|     11|    (void) (0 ? (gpointer) *(location) : NULL);                      \
  |  |  ------------------
  |  |  |  Branch (250:13): [Folded - Ignored]
  |  |  ------------------
  |  |  251|     11|    (!g_atomic_pointer_get (location) &&                             \
  |  |  ------------------
  |  |  |  |  125|     22|  (G_GNUC_EXTENSION ({                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|     11|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  126|     22|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer));                 \
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|     11|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  |  |  ------------------
  |  |  |  |  127|     22|    gpointer gapg_temp_newval;                                               \
  |  |  |  |  128|     22|    gpointer *gapg_temp_atomic = (gpointer *)(atomic);                       \
  |  |  |  |  129|     22|    __atomic_load (gapg_temp_atomic, &gapg_temp_newval, __ATOMIC_SEQ_CST);   \
  |  |  |  |  130|     22|    gapg_temp_newval;                                                        \
  |  |  |  |  131|     22|  }))
  |  |  ------------------
  |  |  |  Branch (251:6): [True: 1, False: 10]
  |  |  ------------------
  |  |  252|     11|     g_once_init_enter (location));                                  \
  |  |  ------------------
  |  |  |  Branch (252:6): [True: 1, False: 0]
  |  |  ------------------
  |  |  253|     11|  }))
  ------------------
  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|     11|	return (GType) gtype_id;
 1004|     11|}
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|  8.16M|{
   61|  8.16M|  typedef gint (*GMarshalFunc_INT__VOID) (gpointer data1,
   62|  8.16M|                                          gpointer data2);
   63|  8.16M|  GCClosure *cc = (GCClosure *) closure;
   64|  8.16M|  gpointer data1, data2;
   65|  8.16M|  GMarshalFunc_INT__VOID callback;
   66|  8.16M|  gint v_return;
   67|       |
   68|  8.16M|  g_return_if_fail (return_value != NULL);
  ------------------
  |  |  572|  8.16M|#define g_return_if_fail(expr) G_STMT_START{ (void)0; }G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  8.16M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_return_if_fail(expr) G_STMT_START{ (void)0; }G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  8.16M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   69|  8.16M|  g_return_if_fail (n_param_values == 1);
  ------------------
  |  |  572|  8.16M|#define g_return_if_fail(expr) G_STMT_START{ (void)0; }G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  8.16M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_return_if_fail(expr) G_STMT_START{ (void)0; }G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  8.16M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   70|       |
   71|  8.16M|  if (G_CCLOSURE_SWAP_DATA (closure))
  ------------------
  |  |   63|  8.16M|#define	G_CCLOSURE_SWAP_DATA(cclosure)	 (((GClosure*) (cclosure))->derivative_flag)
  |  |  ------------------
  |  |  |  Branch (63:41): [True: 0, False: 8.16M]
  |  |  ------------------
  ------------------
   72|      0|    {
   73|      0|      data1 = closure->data;
   74|      0|      data2 = g_value_peek_pointer (param_values + 0);
   75|      0|    }
   76|  8.16M|  else
   77|  8.16M|    {
   78|  8.16M|      data1 = g_value_peek_pointer (param_values + 0);
   79|  8.16M|      data2 = closure->data;
   80|  8.16M|    }
   81|  8.16M|  callback = (GMarshalFunc_INT__VOID) (marshal_data ? marshal_data : cc->callback);
  ------------------
  |  Branch (81:40): [True: 8.16M, False: 0]
  ------------------
   82|       |
   83|  8.16M|  v_return = callback (data1,
   84|  8.16M|                       data2);
   85|       |
   86|  8.16M|  g_value_set_int (return_value, v_return);
   87|  8.16M|}

LLVMFuzzerInitialize:
    5|      2|{
    6|      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))
  ------------------
    7|      0|		return -1;
    8|       |
    9|      2|	vips_concurrency_set(1);
   10|      2|	return 0;
   11|      2|}
LLVMFuzzerTestOneInput:
   15|  32.5k|{
   16|  32.5k|	VipsImage *image, *out;
   17|  32.5k|	double d;
   18|       |
   19|  32.5k|	if (!(image = vips_image_new_from_buffer(data, size, "", nullptr)))
  ------------------
  |  Branch (19:6): [True: 12.1k, False: 20.4k]
  ------------------
   20|  12.1k|		return 0;
   21|       |
   22|  20.4k|	if (image->Xsize > 100 ||
  ------------------
  |  Branch (22:6): [True: 693, False: 19.7k]
  ------------------
   23|  20.4k|		image->Ysize > 100 ||
  ------------------
  |  Branch (23:3): [True: 401, False: 19.3k]
  ------------------
   24|  20.4k|		image->Bands > 4) {
  ------------------
  |  Branch (24:3): [True: 31, False: 19.3k]
  ------------------
   25|  1.12k|		g_object_unref(image);
   26|  1.12k|		return 0;
   27|  1.12k|	}
   28|       |
   29|  19.3k|	if (vips_smartcrop(image, &out, 32, 32, nullptr)) {
  ------------------
  |  Branch (29:6): [True: 11.4k, False: 7.82k]
  ------------------
   30|  11.4k|		g_object_unref(image);
   31|  11.4k|		return 0;
   32|  11.4k|	}
   33|       |
   34|  7.82k|	vips_min(out, &d, nullptr);
   35|       |
   36|  7.82k|	g_object_unref(out);
   37|  7.82k|	g_object_unref(image);
   38|       |
   39|  7.82k|	return 0;
   40|  19.3k|}

vips_abs:
  231|  19.0k|{
  232|  19.0k|	va_list ap;
  233|  19.0k|	int result;
  234|       |
  235|  19.0k|	va_start(ap, out);
  236|  19.0k|	result = vips_call_split("abs", ap, in, out);
  237|  19.0k|	va_end(ap);
  238|       |
  239|  19.0k|	return result;
  240|  19.0k|}
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|}
abs.c:vips_abs_build:
   85|  19.0k|{
   86|  19.0k|	VipsUnary *unary = (VipsUnary *) object;
   87|       |
   88|  19.0k|	if (unary->in &&
  ------------------
  |  Branch (88:6): [True: 19.0k, False: 0]
  ------------------
   89|  19.0k|		vips_band_format_isuint(unary->in->BandFmt))
  ------------------
  |  Branch (89:3): [True: 0, False: 19.0k]
  ------------------
   90|      0|		return vips_unary_copy(unary);
   91|       |
   92|  19.0k|	if (VIPS_OBJECT_CLASS(vips_abs_parent_class)->build(object))
  ------------------
  |  |  435|  19.0k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  19.0k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  19.0k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (92:6): [True: 0, False: 19.0k]
  ------------------
   93|      0|		return -1;
   94|       |
   95|  19.0k|	return 0;
   96|  19.0k|}
abs.c:vips_abs_buffer:
  140|   252k|{
  141|   252k|	VipsImage *im = arithmetic->ready[0];
  142|   252k|	const int bands = vips_image_get_bands(im);
  143|   252k|	int sz = width * bands;
  144|       |
  145|   252k|	switch (vips_image_get_format(im)) {
  146|      0|	case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (146:2): [True: 0, False: 252k]
  ------------------
  147|      0|		ABS_INT(signed char);
  ------------------
  |  |  101|      0|	{ \
  |  |  102|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  103|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  104|      0|		int x; \
  |  |  105|      0|\
  |  |  106|      0|		for (x = 0; x < sz; x++) \
  |  |  ------------------
  |  |  |  Branch (106:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  107|      0|			q[x] = p[x] < 0 ? 0 - p[x] : p[x]; \
  |  |  ------------------
  |  |  |  Branch (107:11): [True: 0, False: 0]
  |  |  ------------------
  |  |  108|      0|	}
  ------------------
  148|      0|		break;
  149|      0|	case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (149:2): [True: 0, False: 252k]
  ------------------
  150|      0|		ABS_INT(signed short);
  ------------------
  |  |  101|      0|	{ \
  |  |  102|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  103|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  104|      0|		int x; \
  |  |  105|      0|\
  |  |  106|      0|		for (x = 0; x < sz; x++) \
  |  |  ------------------
  |  |  |  Branch (106:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  107|      0|			q[x] = p[x] < 0 ? 0 - p[x] : p[x]; \
  |  |  ------------------
  |  |  |  Branch (107:11): [True: 0, False: 0]
  |  |  ------------------
  |  |  108|      0|	}
  ------------------
  151|      0|		break;
  152|      0|	case VIPS_FORMAT_INT:
  ------------------
  |  Branch (152:2): [True: 0, False: 252k]
  ------------------
  153|      0|		ABS_INT(signed int);
  ------------------
  |  |  101|      0|	{ \
  |  |  102|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  103|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  104|      0|		int x; \
  |  |  105|      0|\
  |  |  106|      0|		for (x = 0; x < sz; x++) \
  |  |  ------------------
  |  |  |  Branch (106:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  107|      0|			q[x] = p[x] < 0 ? 0 - p[x] : p[x]; \
  |  |  ------------------
  |  |  |  Branch (107:11): [True: 0, False: 0]
  |  |  ------------------
  |  |  108|      0|	}
  ------------------
  154|      0|		break;
  155|   252k|	case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (155:2): [True: 252k, False: 0]
  ------------------
  156|   252k|		ABS_FLOAT(float);
  ------------------
  |  |  113|   252k|	{ \
  |  |  114|   252k|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  115|   252k|		TYPE *restrict q = (TYPE *) out; \
  |  |  116|   252k|		int x; \
  |  |  117|   252k|\
  |  |  118|  8.33M|		for (x = 0; x < sz; x++) \
  |  |  ------------------
  |  |  |  Branch (118:15): [True: 8.08M, False: 252k]
  |  |  ------------------
  |  |  119|  8.08M|			q[x] = VIPS_FABS(p[x]); \
  |  |  ------------------
  |  |  |  |   76|  8.33M|#define VIPS_FABS(V) __builtin_fabs(V)
  |  |  ------------------
  |  |  120|   252k|	}
  ------------------
  157|   252k|		break;
  158|      0|	case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (158:2): [True: 0, False: 252k]
  ------------------
  159|      0|		ABS_FLOAT(double);
  ------------------
  |  |  113|      0|	{ \
  |  |  114|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  115|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  116|      0|		int x; \
  |  |  117|      0|\
  |  |  118|      0|		for (x = 0; x < sz; x++) \
  |  |  ------------------
  |  |  |  Branch (118:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  119|      0|			q[x] = VIPS_FABS(p[x]); \
  |  |  ------------------
  |  |  |  |   76|      0|#define VIPS_FABS(V) __builtin_fabs(V)
  |  |  ------------------
  |  |  120|      0|	}
  ------------------
  160|      0|		break;
  161|      0|	case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (161:2): [True: 0, False: 252k]
  ------------------
  162|      0|		ABS_COMPLEX(float);
  ------------------
  |  |  126|      0|	{ \
  |  |  127|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  128|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  129|      0|		int x; \
  |  |  130|      0|\
  |  |  131|      0|		for (x = 0; x < sz; x++) { \
  |  |  ------------------
  |  |  |  Branch (131:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  132|      0|			q[x] = hypot(p[0], p[1]); \
  |  |  133|      0|			p += 2; \
  |  |  134|      0|		} \
  |  |  135|      0|	}
  ------------------
  163|      0|		break;
  164|      0|	case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (164:2): [True: 0, False: 252k]
  ------------------
  165|      0|		ABS_COMPLEX(double);
  ------------------
  |  |  126|      0|	{ \
  |  |  127|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  128|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |  129|      0|		int x; \
  |  |  130|      0|\
  |  |  131|      0|		for (x = 0; x < sz; x++) { \
  |  |  ------------------
  |  |  |  Branch (131:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  132|      0|			q[x] = hypot(p[0], p[1]); \
  |  |  133|      0|			p += 2; \
  |  |  134|      0|		} \
  |  |  135|      0|	}
  ------------------
  166|      0|		break;
  167|       |
  168|      0|	default:
  ------------------
  |  Branch (168:2): [True: 0, False: 252k]
  ------------------
  169|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  170|   252k|	}
  171|   252k|}
abs.c:vips_abs_init:
  210|  19.0k|{
  211|  19.0k|}

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|   548k|{
  321|   548k|	int i;
  322|   548k|	VipsBandFormat format;
  323|       |
  324|   548k|	g_assert(n >= 1);
  ------------------
  |  |  166|   548k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   548k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   548k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  325|       |
  326|   548k|	format = in[0]->BandFmt;
  327|   884k|	for (i = 1; i < n; i++)
  ------------------
  |  Branch (327:14): [True: 336k, False: 548k]
  ------------------
  328|   336k|		format = vips_format_common(format, in[i]->BandFmt);
  329|       |
  330|  1.43M|	for (i = 0; i < n; i++)
  ------------------
  |  Branch (330:14): [True: 884k, False: 548k]
  ------------------
  331|   884k|		if (in[i]->BandFmt == format) {
  ------------------
  |  Branch (331:7): [True: 845k, False: 38.1k]
  ------------------
  332|       |			/* Already in the right format ... just copy the image
  333|       |			 * pointer and add a ref.
  334|       |			 */
  335|   845k|			out[i] = in[i];
  336|   845k|			g_object_ref(in[i]);
  337|   845k|		}
  338|  38.1k|		else {
  339|  38.1k|			if (vips_cast(in[i], &out[i], format, NULL))
  ------------------
  |  Branch (339:8): [True: 0, False: 38.1k]
  ------------------
  340|      0|				return -1;
  341|  38.1k|		}
  342|       |
  343|   548k|	return 0;
  344|   548k|}
vips__sizealike_vec:
  348|   548k|{
  349|   548k|	int i;
  350|   548k|	int width_max;
  351|   548k|	int height_max;
  352|       |
  353|   548k|	g_assert(n >= 1);
  ------------------
  |  |  166|   548k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   548k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   548k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  354|       |
  355|   548k|	width_max = in[0]->Xsize;
  356|   548k|	height_max = in[0]->Ysize;
  357|   922k|	for (i = 1; i < n; i++) {
  ------------------
  |  Branch (357:14): [True: 374k, False: 548k]
  ------------------
  358|   374k|		width_max = VIPS_MAX(width_max, in[i]->Xsize);
  ------------------
  |  |   54|   374k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 374k]
  |  |  ------------------
  ------------------
  359|   374k|		height_max = VIPS_MAX(height_max, in[i]->Ysize);
  ------------------
  |  |   54|   374k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 374k]
  |  |  ------------------
  ------------------
  360|   374k|	}
  361|       |
  362|  1.47M|	for (i = 0; i < n; i++)
  ------------------
  |  Branch (362:14): [True: 922k, False: 548k]
  ------------------
  363|   922k|		if (in[i]->Xsize == width_max &&
  ------------------
  |  Branch (363:7): [True: 922k, False: 0]
  ------------------
  364|   922k|			in[i]->Ysize == height_max) {
  ------------------
  |  Branch (364:4): [True: 922k, False: 0]
  ------------------
  365|       |			/* Already the right size ... just copy the image
  366|       |			 * pointer and add a ref.
  367|       |			 */
  368|   922k|			out[i] = in[i];
  369|   922k|			g_object_ref(in[i]);
  370|   922k|		}
  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|   548k|	return 0;
  378|   548k|}
vips__bandup:
  384|  19.0k|{
  385|  19.0k|	VipsImage **bands;
  386|  19.0k|	int i;
  387|  19.0k|	int result;
  388|       |
  389|  19.0k|	if (in->Bands == n)
  ------------------
  |  Branch (389:6): [True: 0, False: 19.0k]
  ------------------
  390|      0|		return vips_copy(in, out, NULL);
  391|  19.0k|	if (in->Bands != 1) {
  ------------------
  |  Branch (391:6): [True: 0, False: 19.0k]
  ------------------
  392|      0|		vips_error(domain, _("not one band or %d bands"), n);
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  393|      0|		return -1;
  394|      0|	}
  395|  19.0k|	if (n > VIPS_MAX_COORD ||
  ------------------
  |  |   69|  38.1k|#define VIPS_MAX_COORD (vips_max_coord_get())
  ------------------
  |  Branch (395:6): [True: 0, False: 19.0k]
  ------------------
  396|  19.0k|		n < 1) {
  ------------------
  |  Branch (396:3): [True: 0, False: 19.0k]
  ------------------
  397|      0|		vips_error(domain, "%s", _("bad bands"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  398|      0|		return -1;
  399|      0|	}
  400|       |
  401|  19.0k|	if (!(bands = VIPS_ARRAY(NULL, n, VipsImage *)))
  ------------------
  |  |   72|  19.0k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  19.0k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  19.0k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  19.0k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  19.0k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (401:6): [True: 0, False: 19.0k]
  ------------------
  402|      0|		return -1;
  403|  76.3k|	for (i = 0; i < n; i++)
  ------------------
  |  Branch (403:14): [True: 57.2k, False: 19.0k]
  ------------------
  404|  57.2k|		bands[i] = in;
  405|  19.0k|	result = vips_bandjoin(bands, out, n, NULL);
  406|  19.0k|	VIPS_FREE(bands);
  ------------------
  |  |   50|  19.0k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  19.0k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  19.0k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  19.0k|	{ \
  |  |  |  |   43|  19.0k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 19.0k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  19.0k|			(void) F((S)); \
  |  |  |  |   45|  19.0k|			(S) = 0; \
  |  |  |  |   46|  19.0k|		} \
  |  |  |  |   47|  19.0k|	} \
  |  |  |  |   48|  19.0k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  19.0k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  407|       |
  408|  19.0k|	return result;
  409|  19.0k|}
vips__bandalike_vec:
  420|   381k|{
  421|   381k|	int i;
  422|   381k|	int max_bands;
  423|   381k|	VipsInterpretation interpretation;
  424|       |
  425|   381k|	g_assert(n >= 1);
  ------------------
  |  |  166|   381k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   381k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   381k|#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|   381k|	max_bands = base_bands;
  433|   381k|	interpretation = VIPS_INTERPRETATION_ERROR;
  434|  1.08M|	for (i = 0; i < n; i++) {
  ------------------
  |  Branch (434:14): [True: 706k, False: 381k]
  ------------------
  435|       |		/* >= so we can pick up interpretation if base_bands is equal
  436|       |		 * to the number of bands of the largest image.
  437|       |		 */
  438|   706k|		if (in[i]->Bands >= max_bands) {
  ------------------
  |  Branch (438:7): [True: 686k, False: 19.0k]
  ------------------
  439|   686k|			max_bands = in[i]->Bands;
  440|   686k|			interpretation = in[i]->Type;
  441|   686k|		}
  442|   706k|	}
  443|       |
  444|  1.08M|	for (i = 0; i < n; i++)
  ------------------
  |  Branch (444:14): [True: 706k, False: 381k]
  ------------------
  445|   706k|		if (in[i]->Bands == max_bands) {
  ------------------
  |  Branch (445:7): [True: 686k, False: 19.0k]
  ------------------
  446|       |			/* Already the right number of bands ... just copy the
  447|       |			 * image pointer and add a ref.
  448|       |			 */
  449|   686k|			out[i] = in[i];
  450|   686k|			g_object_ref(in[i]);
  451|   686k|		}
  452|  19.0k|		else {
  453|  19.0k|			if (vips__bandup(domain, in[i], &out[i], max_bands))
  ------------------
  |  Branch (453:8): [True: 0, False: 19.0k]
  ------------------
  454|      0|				return -1;
  455|       |
  456|  19.0k|			if (interpretation != VIPS_INTERPRETATION_ERROR)
  ------------------
  |  Branch (456:8): [True: 19.0k, False: 0]
  ------------------
  457|  19.0k|				out[i]->Type = interpretation;
  458|  19.0k|		}
  459|       |
  460|   381k|	return 0;
  461|   381k|}
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|   343k|{
  645|   343k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|   343k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|   343k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|   343k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  646|   343k|	VipsArithmetic *arithmetic = VIPS_ARITHMETIC(object);
  ------------------
  |  |   42|   343k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   343k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   343k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|   343k|		VIPS_TYPE_ARITHMETIC, VipsArithmetic))
  ------------------
  647|   343k|	VipsArithmeticClass *aclass = VIPS_ARITHMETIC_GET_CLASS(arithmetic);
  ------------------
  |  |   52|   343k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|   343k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|   343k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   53|   343k|		VIPS_TYPE_ARITHMETIC, VipsArithmeticClass))
  ------------------
  648|       |
  649|   343k|	VipsImage **decode;
  650|   343k|	VipsImage **format;
  651|   343k|	VipsImage **band;
  652|   343k|	VipsImage **size;
  653|   343k|	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|   343k|	if (VIPS_OBJECT_CLASS(vips_arithmetic_parent_class)->build(object))
  ------------------
  |  |  435|   343k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|   343k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   343k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (661:6): [True: 0, False: 343k]
  ------------------
  662|      0|		return -1;
  663|       |
  664|   343k|	g_object_set(arithmetic, "out", vips_image_new(), NULL);
  665|       |
  666|   343k|	decode = (VipsImage **)
  667|   343k|		vips_object_local_array(object, arithmetic->n);
  668|   343k|	format = (VipsImage **)
  669|   343k|		vips_object_local_array(object, arithmetic->n);
  670|   343k|	band = (VipsImage **)
  671|   343k|		vips_object_local_array(object, arithmetic->n);
  672|   343k|	size = (VipsImage **)
  673|   343k|		vips_object_local_array(object, arithmetic->n);
  674|       |
  675|       |	/* Decode RAD/LABQ etc.
  676|       |	 */
  677|   935k|	for (i = 0; i < arithmetic->n; i++)
  ------------------
  |  Branch (677:14): [True: 591k, False: 343k]
  ------------------
  678|   591k|		if (vips_image_decode(arithmetic->in[i], &decode[i]))
  ------------------
  |  Branch (678:7): [True: 0, False: 591k]
  ------------------
  679|      0|			return -1;
  680|       |
  681|       |	/* Cast our input images up to a common format, bands and size.
  682|       |	 */
  683|   343k|	if (vips__formatalike_vec(decode, format, arithmetic->n) ||
  ------------------
  |  Branch (683:6): [True: 0, False: 343k]
  ------------------
  684|   343k|		vips__bandalike_vec(class->nickname,
  ------------------
  |  Branch (684:3): [True: 0, False: 343k]
  ------------------
  685|   343k|			format, band, arithmetic->n, arithmetic->base_bands) ||
  686|   343k|		vips__sizealike_vec(band, size, arithmetic->n))
  ------------------
  |  Branch (686:3): [True: 0, False: 343k]
  ------------------
  687|      0|		return -1;
  688|       |
  689|       |	/* Keep a copy of the processed images here for subclasses.
  690|       |	 */
  691|   343k|	arithmetic->ready = size;
  692|       |
  693|   343k|	if (vips_image_pipeline_array(arithmetic->out,
  ------------------
  |  Branch (693:6): [True: 0, False: 343k]
  ------------------
  694|   343k|			VIPS_DEMAND_STYLE_THINSTRIP, arithmetic->ready))
  695|      0|		return -1;
  696|       |
  697|   343k|	arithmetic->out->Bands = arithmetic->ready[0]->Bands;
  698|   343k|	if (arithmetic->format != VIPS_FORMAT_NOTSET)
  ------------------
  |  Branch (698:6): [True: 0, False: 343k]
  ------------------
  699|      0|		arithmetic->out->BandFmt = arithmetic->format;
  700|   343k|	else
  701|   343k|		arithmetic->out->BandFmt =
  702|   343k|			aclass->format_table[arithmetic->ready[0]->BandFmt];
  703|       |
  704|   343k|	if (vips_image_generate(arithmetic->out,
  ------------------
  |  Branch (704:6): [True: 0, False: 343k]
  ------------------
  705|   343k|			vips_arithmetic_start,
  706|   343k|			vips_arithmetic_gen,
  707|   343k|			vips_arithmetic_stop,
  708|   343k|			arithmetic->ready, arithmetic))
  709|      0|		return -1;
  710|       |
  711|   343k|	return 0;
  712|   343k|}
arithmetic.c:vips_arithmetic_start:
  557|   148k|{
  558|   148k|	VipsImage **in = (VipsImage **) a;
  559|   148k|	VipsArithmetic *arithmetic = (VipsArithmetic *) b;
  560|       |
  561|   148k|	VipsArithmeticSequence *seq;
  562|   148k|	int i, n;
  563|       |
  564|   148k|	if (!(seq = VIPS_NEW(NULL, VipsArithmeticSequence)))
  ------------------
  |  |   70|   148k|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|   148k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|   148k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|   148k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|   148k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (564:6): [True: 0, False: 148k]
  ------------------
  565|      0|		return NULL;
  566|       |
  567|   148k|	seq->arithmetic = arithmetic;
  568|   148k|	seq->ir = NULL;
  569|   148k|	seq->p = NULL;
  570|       |
  571|       |	/* How many images?
  572|       |	 */
  573|   399k|	for (n = 0; in[n]; n++)
  ------------------
  |  Branch (573:14): [True: 251k, False: 148k]
  ------------------
  574|   251k|		;
  575|       |
  576|       |	/* Allocate space for region array.
  577|       |	 */
  578|   148k|	if (!(seq->ir = VIPS_ARRAY(NULL, n + 1, VipsRegion *))) {
  ------------------
  |  |   72|   148k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|   148k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|   148k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|   148k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|   148k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (578:6): [True: 0, False: 148k]
  ------------------
  579|      0|		vips_arithmetic_stop(seq, NULL, NULL);
  580|      0|		return NULL;
  581|      0|	}
  582|       |
  583|       |	/* Create a set of regions.
  584|       |	 */
  585|   399k|	for (i = 0; i < n; i++)
  ------------------
  |  Branch (585:14): [True: 251k, False: 148k]
  ------------------
  586|   251k|		if (!(seq->ir[i] = vips_region_new(in[i]))) {
  ------------------
  |  Branch (586:7): [True: 0, False: 251k]
  ------------------
  587|      0|			vips_arithmetic_stop(seq, NULL, NULL);
  588|      0|			return NULL;
  589|      0|		}
  590|   148k|	seq->ir[n] = NULL;
  591|       |
  592|       |	/* Input pointers.
  593|       |	 */
  594|   148k|	if (!(seq->p = VIPS_ARRAY(NULL, n + 1, VipsPel *))) {
  ------------------
  |  |   72|   148k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|   148k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|   148k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|   148k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|   148k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (594:6): [True: 0, False: 148k]
  ------------------
  595|      0|		vips_arithmetic_stop(seq, NULL, NULL);
  596|      0|		return NULL;
  597|      0|	}
  598|       |
  599|   148k|	return seq;
  600|   148k|}
arithmetic.c:vips_arithmetic_gen:
  605|   148k|{
  606|   148k|	VipsArithmeticSequence *seq = (VipsArithmeticSequence *) vseq;
  607|   148k|	VipsRegion **ir = seq->ir;
  608|   148k|	VipsArithmetic *arithmetic = VIPS_ARITHMETIC(b);
  ------------------
  |  |   42|   148k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   148k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   148k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|   148k|		VIPS_TYPE_ARITHMETIC, VipsArithmetic))
  ------------------
  609|   148k|	VipsArithmeticClass *class = VIPS_ARITHMETIC_GET_CLASS(arithmetic);
  ------------------
  |  |   52|   148k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|   148k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|   148k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   53|   148k|		VIPS_TYPE_ARITHMETIC, VipsArithmeticClass))
  ------------------
  610|   148k|	VipsRect *r = &out_region->valid;
  611|       |
  612|   148k|	VipsPel *q;
  613|   148k|	int i, y;
  614|       |
  615|       |	/* Prepare all input regions and make buffer pointers.
  616|       |	 */
  617|   148k|	if (vips_reorder_prepare_many(out_region->im, ir, r))
  ------------------
  |  Branch (617:6): [True: 33.5k, False: 114k]
  ------------------
  618|  33.5k|		return -1;
  619|   310k|	for (i = 0; ir[i]; i++)
  ------------------
  |  Branch (619:14): [True: 195k, False: 114k]
  ------------------
  620|   195k|		seq->p[i] = (VipsPel *)
  621|   195k|			VIPS_REGION_ADDR(ir[i], r->left, r->top);
  ------------------
  |  |  227|   310k|	((R)->data + \
  |  |  228|   310k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   195k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   310k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   195k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   195k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   195k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  622|   114k|	seq->p[i] = NULL;
  623|   114k|	q = (VipsPel *) VIPS_REGION_ADDR(out_region, r->left, r->top);
  ------------------
  |  |  227|   114k|	((R)->data + \
  |  |  228|   114k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   114k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   114k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   114k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   114k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   114k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  624|       |
  625|   114k|	VIPS_GATE_START("vips_arithmetic_gen: work");
  ------------------
  |  |   41|   114k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   114k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   114k|	{ \
  |  |   43|   114k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 114k]
  |  |  ------------------
  |  |   44|   114k|			vips__thread_gate_start(NAME); \
  |  |   45|   114k|	} \
  |  |   46|   114k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   114k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  626|       |
  627|  3.59M|	for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (627:14): [True: 3.48M, False: 114k]
  ------------------
  628|  3.48M|		class->process_line(arithmetic, q, seq->p, r->width);
  629|       |
  630|  9.55M|		for (i = 0; ir[i]; i++)
  ------------------
  |  Branch (630:15): [True: 6.07M, False: 3.48M]
  ------------------
  631|  6.07M|			seq->p[i] += VIPS_REGION_LSKIP(ir[i]);
  ------------------
  |  |  195|  6.07M|	((size_t) ((R)->bpl))
  ------------------
  632|  3.48M|		q += VIPS_REGION_LSKIP(out_region);
  ------------------
  |  |  195|  3.48M|	((size_t) ((R)->bpl))
  ------------------
  633|  3.48M|	}
  634|       |
  635|   114k|	VIPS_GATE_STOP("vips_arithmetic_gen: work");
  ------------------
  |  |   49|   114k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   114k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|   114k|	{ \
  |  |   51|   114k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 114k]
  |  |  ------------------
  |  |   52|   114k|			vips__thread_gate_stop(NAME); \
  |  |   53|   114k|	} \
  |  |   54|   114k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   114k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  636|       |
  637|   114k|	VIPS_COUNT_PIXELS(out_region, VIPS_OBJECT_CLASS(class)->nickname);
  ------------------
  |  |  189|   114k|#define VIPS_COUNT_PIXELS(R, N) vips__region_count_pixels(R, N)
  ------------------
  638|       |
  639|   114k|	return 0;
  640|   148k|}
arithmetic.c:vips_arithmetic_stop:
  537|   148k|{
  538|   148k|	VipsArithmeticSequence *seq = (VipsArithmeticSequence *) vseq;
  539|       |
  540|   148k|	if (seq->ir) {
  ------------------
  |  Branch (540:6): [True: 148k, False: 0]
  ------------------
  541|   148k|		int i;
  542|       |
  543|   399k|		for (i = 0; seq->ir[i]; i++)
  ------------------
  |  Branch (543:15): [True: 251k, False: 148k]
  ------------------
  544|   251k|			VIPS_UNREF(seq->ir[i]);
  ------------------
  |  |   57|   148k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|   251k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   251k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|   251k|	{ \
  |  |  |  |   43|   251k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 251k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|   251k|			(void) F((S)); \
  |  |  |  |   45|   251k|			(S) = 0; \
  |  |  |  |   46|   251k|		} \
  |  |  |  |   47|   251k|	} \
  |  |  |  |   48|   251k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   251k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  545|   148k|		VIPS_FREE(seq->ir);
  ------------------
  |  |   50|   148k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|   148k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   148k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|   148k|	{ \
  |  |  |  |   43|   148k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 148k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|   148k|			(void) F((S)); \
  |  |  |  |   45|   148k|			(S) = 0; \
  |  |  |  |   46|   148k|		} \
  |  |  |  |   47|   148k|	} \
  |  |  |  |   48|   148k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   148k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  546|   148k|	}
  547|       |
  548|   148k|	VIPS_FREE(seq->p);
  ------------------
  |  |   50|   148k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|   148k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   148k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|   148k|	{ \
  |  |  |  |   43|   148k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 148k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|   148k|			(void) F((S)); \
  |  |  |  |   45|   148k|			(S) = 0; \
  |  |  |  |   46|   148k|		} \
  |  |  |  |   47|   148k|	} \
  |  |  |  |   48|   148k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   148k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  549|       |
  550|   148k|	VIPS_FREE(seq);
  ------------------
  |  |   50|   148k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|   148k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   148k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|   148k|	{ \
  |  |  |  |   43|   148k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 148k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|   148k|			(void) F((S)); \
  |  |  |  |   45|   148k|			(S) = 0; \
  |  |  |  |   46|   148k|		} \
  |  |  |  |   47|   148k|	} \
  |  |  |  |   48|   148k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   148k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  551|       |
  552|   148k|	return 0;
  553|   148k|}
arithmetic.c:vips_arithmetic_init:
  739|   343k|{
  740|   343k|	arithmetic->base_bands = 1;
  741|   343k|	arithmetic->format = VIPS_FORMAT_NOTSET;
  742|   343k|}
arithmetic.c:vips_format_common:
  297|   336k|{
  298|   336k|	if (vips_band_format_iscomplex(a) ||
  ------------------
  |  Branch (298:6): [True: 0, False: 336k]
  ------------------
  299|   336k|		vips_band_format_iscomplex(b)) {
  ------------------
  |  Branch (299:3): [True: 0, False: 336k]
  ------------------
  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|   336k|	else if (vips_band_format_isfloat(a) ||
  ------------------
  |  Branch (306:11): [True: 326k, False: 9.52k]
  ------------------
  307|   336k|		vips_band_format_isfloat(b)) {
  ------------------
  |  Branch (307:3): [True: 0, False: 9.52k]
  ------------------
  308|   326k|		if (a == VIPS_FORMAT_DOUBLE ||
  ------------------
  |  Branch (308:7): [True: 0, False: 326k]
  ------------------
  309|   326k|			b == VIPS_FORMAT_DOUBLE)
  ------------------
  |  Branch (309:4): [True: 0, False: 326k]
  ------------------
  310|      0|			return VIPS_FORMAT_DOUBLE;
  311|   326k|		else
  312|   326k|			return VIPS_FORMAT_FLOAT;
  313|   326k|	}
  314|  9.52k|	else
  315|  9.52k|		return format_largest[a][b];
  316|   336k|}

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|}
binary.c:vips_binary_build:
   59|   133k|{
   60|   133k|	VipsArithmetic *arithmetic = VIPS_ARITHMETIC(object);
  ------------------
  |  |   42|   133k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   133k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   133k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|   133k|		VIPS_TYPE_ARITHMETIC, VipsArithmetic))
  ------------------
   61|   133k|	VipsBinary *binary = VIPS_BINARY(object);
  ------------------
  |  |   44|   133k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_BINARY, VipsBinary))
  |  |  ------------------
  |  |  |  |  484|   133k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   133k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   62|       |
   63|   133k|	arithmetic->n = 2;
   64|   133k|	arithmetic->in = (VipsImage **) vips_object_local_array(object, 2);
   65|   133k|	arithmetic->in[0] = binary->left;
   66|   133k|	arithmetic->in[1] = binary->right;
   67|       |
   68|   133k|	if (arithmetic->in[0])
  ------------------
  |  Branch (68:6): [True: 133k, False: 0]
  ------------------
   69|   133k|		g_object_ref(arithmetic->in[0]);
   70|   133k|	if (arithmetic->in[1])
  ------------------
  |  Branch (70:6): [True: 133k, False: 0]
  ------------------
   71|   133k|		g_object_ref(arithmetic->in[1]);
   72|       |
   73|   133k|	if (VIPS_OBJECT_CLASS(vips_binary_parent_class)->build(object))
  ------------------
  |  |  435|   133k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|   133k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   133k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (73:6): [True: 0, False: 133k]
  ------------------
   74|      0|		return -1;
   75|       |
   76|   133k|	return 0;
   77|   133k|}
binary.c:vips_binary_init:
  110|   133k|{
  111|       |	/* Init our instance fields.
  112|       |	 */
  113|   133k|}

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|}

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|}

vips_divide:
  308|  19.0k|{
  309|  19.0k|	va_list ap;
  310|  19.0k|	int result;
  311|       |
  312|  19.0k|	va_start(ap, out);
  313|  19.0k|	result = vips_call_split("divide", ap, left, right, out);
  314|  19.0k|	va_end(ap);
  315|       |
  316|  19.0k|	return result;
  317|  19.0k|}
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|}
divide.c:vips_divide_buffer:
  136|   189k|{
  137|   189k|	VipsImage *im = arithmetic->ready[0];
  138|   189k|	const int sz = width * vips_image_get_bands(im);
  139|       |
  140|   189k|	int x;
  141|       |
  142|       |	/* Keep types here in sync with vips_divide_format_table[]
  143|       |	 * below.
  144|       |	 */
  145|   189k|	switch (vips_image_get_format(im)) {
  146|      0|	case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (146:2): [True: 0, False: 189k]
  ------------------
  147|      0|		RLOOP(signed char, float);
  ------------------
  |  |  124|      0|	{ \
  |  |  125|      0|		IN *restrict left = (IN *) in[0]; \
  |  |  126|      0|		IN *restrict right = (IN *) in[1]; \
  |  |  127|      0|		OUT *restrict q = (OUT *) out; \
  |  |  128|      0|\
  |  |  129|      0|		for (x = 0; x < sz; x++) \
  |  |  ------------------
  |  |  |  Branch (129:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  130|      0|			q[x] = right[x] == 0 ? 0 : (OUT) left[x] / (OUT) right[x]; \
  |  |  ------------------
  |  |  |  Branch (130:11): [True: 0, False: 0]
  |  |  ------------------
  |  |  131|      0|	}
  ------------------
  148|      0|		break;
  149|      0|	case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (149:2): [True: 0, False: 189k]
  ------------------
  150|      0|		RLOOP(unsigned char, float);
  ------------------
  |  |  124|      0|	{ \
  |  |  125|      0|		IN *restrict left = (IN *) in[0]; \
  |  |  126|      0|		IN *restrict right = (IN *) in[1]; \
  |  |  127|      0|		OUT *restrict q = (OUT *) out; \
  |  |  128|      0|\
  |  |  129|      0|		for (x = 0; x < sz; x++) \
  |  |  ------------------
  |  |  |  Branch (129:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  130|      0|			q[x] = right[x] == 0 ? 0 : (OUT) left[x] / (OUT) right[x]; \
  |  |  ------------------
  |  |  |  Branch (130:11): [True: 0, False: 0]
  |  |  ------------------
  |  |  131|      0|	}
  ------------------
  151|      0|		break;
  152|      0|	case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (152:2): [True: 0, False: 189k]
  ------------------
  153|      0|		RLOOP(signed short, float);
  ------------------
  |  |  124|      0|	{ \
  |  |  125|      0|		IN *restrict left = (IN *) in[0]; \
  |  |  126|      0|		IN *restrict right = (IN *) in[1]; \
  |  |  127|      0|		OUT *restrict q = (OUT *) out; \
  |  |  128|      0|\
  |  |  129|      0|		for (x = 0; x < sz; x++) \
  |  |  ------------------
  |  |  |  Branch (129:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  130|      0|			q[x] = right[x] == 0 ? 0 : (OUT) left[x] / (OUT) right[x]; \
  |  |  ------------------
  |  |  |  Branch (130:11): [True: 0, False: 0]
  |  |  ------------------
  |  |  131|      0|	}
  ------------------
  154|      0|		break;
  155|      0|	case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (155:2): [True: 0, False: 189k]
  ------------------
  156|      0|		RLOOP(unsigned short, float);
  ------------------
  |  |  124|      0|	{ \
  |  |  125|      0|		IN *restrict left = (IN *) in[0]; \
  |  |  126|      0|		IN *restrict right = (IN *) in[1]; \
  |  |  127|      0|		OUT *restrict q = (OUT *) out; \
  |  |  128|      0|\
  |  |  129|      0|		for (x = 0; x < sz; x++) \
  |  |  ------------------
  |  |  |  Branch (129:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  130|      0|			q[x] = right[x] == 0 ? 0 : (OUT) left[x] / (OUT) right[x]; \
  |  |  ------------------
  |  |  |  Branch (130:11): [True: 0, False: 0]
  |  |  ------------------
  |  |  131|      0|	}
  ------------------
  157|      0|		break;
  158|      0|	case VIPS_FORMAT_INT:
  ------------------
  |  Branch (158:2): [True: 0, False: 189k]
  ------------------
  159|      0|		RLOOP(signed int, float);
  ------------------
  |  |  124|      0|	{ \
  |  |  125|      0|		IN *restrict left = (IN *) in[0]; \
  |  |  126|      0|		IN *restrict right = (IN *) in[1]; \
  |  |  127|      0|		OUT *restrict q = (OUT *) out; \
  |  |  128|      0|\
  |  |  129|      0|		for (x = 0; x < sz; x++) \
  |  |  ------------------
  |  |  |  Branch (129:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  130|      0|			q[x] = right[x] == 0 ? 0 : (OUT) left[x] / (OUT) right[x]; \
  |  |  ------------------
  |  |  |  Branch (130:11): [True: 0, False: 0]
  |  |  ------------------
  |  |  131|      0|	}
  ------------------
  160|      0|		break;
  161|      0|	case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (161:2): [True: 0, False: 189k]
  ------------------
  162|      0|		RLOOP(unsigned int, float);
  ------------------
  |  |  124|      0|	{ \
  |  |  125|      0|		IN *restrict left = (IN *) in[0]; \
  |  |  126|      0|		IN *restrict right = (IN *) in[1]; \
  |  |  127|      0|		OUT *restrict q = (OUT *) out; \
  |  |  128|      0|\
  |  |  129|      0|		for (x = 0; x < sz; x++) \
  |  |  ------------------
  |  |  |  Branch (129:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  130|      0|			q[x] = right[x] == 0 ? 0 : (OUT) left[x] / (OUT) right[x]; \
  |  |  ------------------
  |  |  |  Branch (130:11): [True: 0, False: 0]
  |  |  ------------------
  |  |  131|      0|	}
  ------------------
  163|      0|		break;
  164|   189k|	case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (164:2): [True: 189k, False: 0]
  ------------------
  165|   189k|		RLOOP(float, float);
  ------------------
  |  |  124|   189k|	{ \
  |  |  125|   189k|		IN *restrict left = (IN *) in[0]; \
  |  |  126|   189k|		IN *restrict right = (IN *) in[1]; \
  |  |  127|   189k|		OUT *restrict q = (OUT *) out; \
  |  |  128|   189k|\
  |  |  129|  18.3M|		for (x = 0; x < sz; x++) \
  |  |  ------------------
  |  |  |  Branch (129:15): [True: 18.1M, False: 189k]
  |  |  ------------------
  |  |  130|  18.1M|			q[x] = right[x] == 0 ? 0 : (OUT) left[x] / (OUT) right[x]; \
  |  |  ------------------
  |  |  |  Branch (130:11): [True: 4.47M, False: 13.7M]
  |  |  ------------------
  |  |  131|   189k|	}
  ------------------
  166|   189k|		break;
  167|      0|	case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (167:2): [True: 0, False: 189k]
  ------------------
  168|      0|		RLOOP(double, double);
  ------------------
  |  |  124|      0|	{ \
  |  |  125|      0|		IN *restrict left = (IN *) in[0]; \
  |  |  126|      0|		IN *restrict right = (IN *) in[1]; \
  |  |  127|      0|		OUT *restrict q = (OUT *) out; \
  |  |  128|      0|\
  |  |  129|      0|		for (x = 0; x < sz; x++) \
  |  |  ------------------
  |  |  |  Branch (129:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  130|      0|			q[x] = right[x] == 0 ? 0 : (OUT) left[x] / (OUT) right[x]; \
  |  |  ------------------
  |  |  |  Branch (130:11): [True: 0, False: 0]
  |  |  ------------------
  |  |  131|      0|	}
  ------------------
  169|      0|		break;
  170|      0|	case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (170:2): [True: 0, False: 189k]
  ------------------
  171|      0|		CLOOP(float);
  ------------------
  |  |   88|      0|	{ \
  |  |   89|      0|		TYPE *restrict left = (TYPE *) in[0]; \
  |  |   90|      0|		TYPE *restrict right = (TYPE *) in[1]; \
  |  |   91|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |   92|      0|		int i; \
  |  |   93|      0|\
  |  |   94|      0|		for (i = 0; i < sz; i++) { \
  |  |  ------------------
  |  |  |  Branch (94:15): [True: 0, False: 0]
  |  |  ------------------
  |  |   95|      0|			if (right[0] == 0.0 && \
  |  |  ------------------
  |  |  |  Branch (95:8): [True: 0, False: 0]
  |  |  ------------------
  |  |   96|      0|				right[1] == 0.0) { \
  |  |  ------------------
  |  |  |  Branch (96:5): [True: 0, False: 0]
  |  |  ------------------
  |  |   97|      0|				q[0] = 0.0; \
  |  |   98|      0|				q[1] = 0.0; \
  |  |   99|      0|			} \
  |  |  100|      0|			else if (VIPS_FABS(right[0]) > VIPS_FABS(right[1])) { \
  |  |  ------------------
  |  |  |  |   76|      0|#define VIPS_FABS(V) __builtin_fabs(V)
  |  |  ------------------
  |  |               			else if (VIPS_FABS(right[0]) > VIPS_FABS(right[1])) { \
  |  |  ------------------
  |  |  |  |   76|      0|#define VIPS_FABS(V) __builtin_fabs(V)
  |  |  ------------------
  |  |  |  Branch (100:13): [True: 0, False: 0]
  |  |  ------------------
  |  |  101|      0|				double a = right[1] / right[0]; \
  |  |  102|      0|				double b = right[0] + right[1] * a; \
  |  |  103|      0|\
  |  |  104|      0|				q[0] = (left[0] + left[1] * a) / b; \
  |  |  105|      0|				q[1] = (left[1] - left[0] * a) / b; \
  |  |  106|      0|			} \
  |  |  107|      0|			else { \
  |  |  108|      0|				double a = right[0] / right[1]; \
  |  |  109|      0|				double b = right[1] + right[0] * a; \
  |  |  110|      0|\
  |  |  111|      0|				q[0] = (left[0] * a + left[1]) / b; \
  |  |  112|      0|				q[1] = (left[1] * a - left[0]) / b; \
  |  |  113|      0|			} \
  |  |  114|      0|\
  |  |  115|      0|			left += 2; \
  |  |  116|      0|			right += 2; \
  |  |  117|      0|			q += 2; \
  |  |  118|      0|		} \
  |  |  119|      0|	}
  ------------------
  172|      0|		break;
  173|      0|	case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (173:2): [True: 0, False: 189k]
  ------------------
  174|      0|		CLOOP(double);
  ------------------
  |  |   88|      0|	{ \
  |  |   89|      0|		TYPE *restrict left = (TYPE *) in[0]; \
  |  |   90|      0|		TYPE *restrict right = (TYPE *) in[1]; \
  |  |   91|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |   92|      0|		int i; \
  |  |   93|      0|\
  |  |   94|      0|		for (i = 0; i < sz; i++) { \
  |  |  ------------------
  |  |  |  Branch (94:15): [True: 0, False: 0]
  |  |  ------------------
  |  |   95|      0|			if (right[0] == 0.0 && \
  |  |  ------------------
  |  |  |  Branch (95:8): [True: 0, False: 0]
  |  |  ------------------
  |  |   96|      0|				right[1] == 0.0) { \
  |  |  ------------------
  |  |  |  Branch (96:5): [True: 0, False: 0]
  |  |  ------------------
  |  |   97|      0|				q[0] = 0.0; \
  |  |   98|      0|				q[1] = 0.0; \
  |  |   99|      0|			} \
  |  |  100|      0|			else if (VIPS_FABS(right[0]) > VIPS_FABS(right[1])) { \
  |  |  ------------------
  |  |  |  |   76|      0|#define VIPS_FABS(V) __builtin_fabs(V)
  |  |  ------------------
  |  |               			else if (VIPS_FABS(right[0]) > VIPS_FABS(right[1])) { \
  |  |  ------------------
  |  |  |  |   76|      0|#define VIPS_FABS(V) __builtin_fabs(V)
  |  |  ------------------
  |  |  |  Branch (100:13): [True: 0, False: 0]
  |  |  ------------------
  |  |  101|      0|				double a = right[1] / right[0]; \
  |  |  102|      0|				double b = right[0] + right[1] * a; \
  |  |  103|      0|\
  |  |  104|      0|				q[0] = (left[0] + left[1] * a) / b; \
  |  |  105|      0|				q[1] = (left[1] - left[0] * a) / b; \
  |  |  106|      0|			} \
  |  |  107|      0|			else { \
  |  |  108|      0|				double a = right[0] / right[1]; \
  |  |  109|      0|				double b = right[1] + right[0] * a; \
  |  |  110|      0|\
  |  |  111|      0|				q[0] = (left[0] * a + left[1]) / b; \
  |  |  112|      0|				q[1] = (left[1] * a - left[0]) / b; \
  |  |  113|      0|			} \
  |  |  114|      0|\
  |  |  115|      0|			left += 2; \
  |  |  116|      0|			right += 2; \
  |  |  117|      0|			q += 2; \
  |  |  118|      0|		} \
  |  |  119|      0|	}
  ------------------
  175|      0|		break;
  176|       |
  177|      0|	default:
  ------------------
  |  Branch (177:2): [True: 0, False: 189k]
  ------------------
  178|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  179|   189k|	}
  180|   189k|}
divide.c:vips_divide_init:
  219|  19.0k|{
  220|  19.0k|}

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|  38.1k|{
  532|  38.1k|	va_list ap;
  533|  38.1k|	int result;
  534|       |
  535|  38.1k|	va_start(ap, n);
  536|  38.1k|	result = vips_linearv(in, out, a, b, n, ap);
  537|  38.1k|	va_end(ap);
  538|       |
  539|  38.1k|	return result;
  540|  38.1k|}
vips_linear1:
  562|  38.1k|{
  563|  38.1k|	va_list ap;
  564|  38.1k|	int result;
  565|       |
  566|  38.1k|	va_start(ap, b);
  567|  38.1k|	result = vips_linearv(in, out, &a, &b, 1, ap);
  568|  38.1k|	va_end(ap);
  569|       |
  570|  38.1k|	return result;
  571|  38.1k|}
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|  76.3k|{
  121|  76.3k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  76.3k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  76.3k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  76.3k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  122|  76.3k|	VipsArithmetic *arithmetic = VIPS_ARITHMETIC(object);
  ------------------
  |  |   42|  76.3k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  76.3k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  76.3k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|  76.3k|		VIPS_TYPE_ARITHMETIC, VipsArithmetic))
  ------------------
  123|  76.3k|	VipsUnary *unary = (VipsUnary *) object;
  124|  76.3k|	VipsLinear *linear = (VipsLinear *) object;
  125|       |
  126|  76.3k|	int i;
  127|       |
  128|       |	/* If we have a three-element vector, we need to bandup the image to
  129|       |	 * match.
  130|       |	 */
  131|  76.3k|	linear->n = 1;
  132|  76.3k|	if (linear->a)
  ------------------
  |  Branch (132:6): [True: 76.3k, False: 0]
  ------------------
  133|  76.3k|		linear->n = VIPS_MAX(linear->n, linear->a->n);
  ------------------
  |  |   54|  76.3k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 76.3k]
  |  |  ------------------
  ------------------
  134|  76.3k|	if (linear->b)
  ------------------
  |  Branch (134:6): [True: 76.3k, False: 0]
  ------------------
  135|  76.3k|		linear->n = VIPS_MAX(linear->n, linear->b->n);
  ------------------
  |  |   54|  76.3k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 76.3k]
  |  |  ------------------
  ------------------
  136|  76.3k|	if (unary->in) {
  ------------------
  |  Branch (136:6): [True: 76.3k, False: 0]
  ------------------
  137|  76.3k|		int bands;
  138|       |
  139|  76.3k|		vips_image_decode_predict(unary->in, &bands, NULL);
  140|  76.3k|		linear->n = VIPS_MAX(linear->n, bands);
  ------------------
  |  |   54|  76.3k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 76.3k]
  |  |  ------------------
  ------------------
  141|  76.3k|	}
  142|  76.3k|	arithmetic->base_bands = linear->n;
  143|       |
  144|  76.3k|	if (unary->in &&
  ------------------
  |  Branch (144:6): [True: 76.3k, False: 0]
  ------------------
  145|  76.3k|		linear->a &&
  ------------------
  |  Branch (145:3): [True: 76.3k, False: 0]
  ------------------
  146|  76.3k|		linear->b) {
  ------------------
  |  Branch (146:3): [True: 76.3k, False: 0]
  ------------------
  147|  76.3k|		if (vips_check_vector(class->nickname,
  ------------------
  |  Branch (147:7): [True: 0, False: 76.3k]
  ------------------
  148|  76.3k|				linear->a->n, unary->in) ||
  149|  76.3k|			vips_check_vector(class->nickname,
  ------------------
  |  Branch (149:4): [True: 0, False: 76.3k]
  ------------------
  150|  76.3k|				linear->b->n, unary->in))
  151|      0|			return -1;
  152|  76.3k|	}
  153|       |
  154|       |	/* If all elements of the constants are equal, we can shrink them down
  155|       |	 * to a single element.
  156|       |	 */
  157|  76.3k|	if (linear->a) {
  ------------------
  |  Branch (157:6): [True: 76.3k, False: 0]
  ------------------
  158|  76.3k|		double *ary = (double *) linear->a->data;
  159|  76.3k|		gboolean all_equal;
  160|       |
  161|  76.3k|		all_equal = TRUE;
  ------------------
  |  |  798|  76.3k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  76.3k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  162|   114k|		for (i = 1; i < linear->a->n; i++)
  ------------------
  |  Branch (162:15): [True: 38.1k, False: 76.3k]
  ------------------
  163|  38.1k|			if (ary[i] != ary[0]) {
  ------------------
  |  Branch (163:8): [True: 0, False: 38.1k]
  ------------------
  164|      0|				all_equal = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  165|      0|				break;
  166|      0|			}
  167|       |
  168|  76.3k|		if (all_equal)
  ------------------
  |  Branch (168:7): [True: 76.3k, False: 0]
  ------------------
  169|  76.3k|			linear->a->n = 1;
  170|  76.3k|	}
  171|  76.3k|	if (linear->b) {
  ------------------
  |  Branch (171:6): [True: 76.3k, False: 0]
  ------------------
  172|  76.3k|		double *ary = (double *) linear->b->data;
  173|  76.3k|		gboolean all_equal;
  174|       |
  175|  76.3k|		all_equal = TRUE;
  ------------------
  |  |  798|  76.3k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  76.3k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  176|  76.3k|		for (i = 1; i < linear->b->n; i++)
  ------------------
  |  Branch (176:15): [True: 19.0k, False: 57.2k]
  ------------------
  177|  19.0k|			if (ary[i] != ary[0]) {
  ------------------
  |  Branch (177:8): [True: 19.0k, False: 0]
  ------------------
  178|  19.0k|				all_equal = FALSE;
  ------------------
  |  |  794|  19.0k|#define	FALSE	(0)
  ------------------
  179|  19.0k|				break;
  180|  19.0k|			}
  181|       |
  182|  76.3k|		if (all_equal)
  ------------------
  |  Branch (182:7): [True: 57.2k, False: 19.0k]
  ------------------
  183|  57.2k|			linear->b->n = 1;
  184|  76.3k|	}
  185|       |
  186|       |	/* Make up-banded versions of our constants.
  187|       |	 */
  188|  76.3k|	linear->a_ready = VIPS_ARRAY(linear, linear->n, double);
  ------------------
  |  |   72|  76.3k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  76.3k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  76.3k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  76.3k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  76.3k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  189|  76.3k|	linear->b_ready = VIPS_ARRAY(linear, linear->n, double);
  ------------------
  |  |   72|  76.3k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  76.3k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  76.3k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  76.3k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  76.3k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  190|       |
  191|   190k|	for (i = 0; i < linear->n; i++) {
  ------------------
  |  Branch (191:14): [True: 114k, False: 76.3k]
  ------------------
  192|   114k|		if (linear->a) {
  ------------------
  |  Branch (192:7): [True: 114k, False: 0]
  ------------------
  193|   114k|			double *ary = (double *) linear->a->data;
  194|   114k|			int j = VIPS_MIN(i, linear->a->n - 1);
  ------------------
  |  |   55|   114k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 0, False: 114k]
  |  |  ------------------
  ------------------
  195|       |
  196|   114k|			linear->a_ready[i] = ary[j];
  197|   114k|		}
  198|       |
  199|   114k|		if (linear->b) {
  ------------------
  |  Branch (199:7): [True: 114k, False: 0]
  ------------------
  200|   114k|			double *ary = (double *) linear->b->data;
  201|   114k|			int j = VIPS_MIN(i, linear->b->n - 1);
  ------------------
  |  |   55|   114k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 38.1k, False: 76.3k]
  |  |  ------------------
  ------------------
  202|       |
  203|   114k|			linear->b_ready[i] = ary[j];
  204|   114k|		}
  205|   114k|	}
  206|       |
  207|  76.3k|	if (linear->uchar)
  ------------------
  |  Branch (207:6): [True: 0, False: 76.3k]
  ------------------
  208|      0|		arithmetic->format = VIPS_FORMAT_UCHAR;
  209|       |
  210|  76.3k|	if (VIPS_OBJECT_CLASS(vips_linear_parent_class)->build(object))
  ------------------
  |  |  435|  76.3k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  76.3k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  76.3k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (210:6): [True: 0, False: 76.3k]
  ------------------
  211|      0|		return -1;
  212|       |
  213|  76.3k|	return 0;
  214|  76.3k|}
linear.c:vips_linear_buffer:
  332|   637k|{
  333|   637k|	VipsImage *im = arithmetic->ready[0];
  334|   637k|	VipsLinear *linear = (VipsLinear *) arithmetic;
  335|   637k|	double *restrict a = linear->a_ready;
  336|   637k|	double *restrict b = linear->b_ready;
  337|   637k|	int nb = im->Bands;
  338|       |
  339|   637k|	int i, x, k;
  340|       |
  341|   637k|	if (linear->uchar)
  ------------------
  |  Branch (341:6): [True: 0, False: 637k]
  ------------------
  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|   637k|	else
  378|   637k|		switch (vips_image_get_format(im)) {
  379|  6.14k|		case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (379:3): [True: 6.14k, False: 631k]
  ------------------
  380|  6.14k|			LOOP(unsigned char, float);
  ------------------
  |  |  243|  6.14k|	{ \
  |  |  244|  6.14k|		if (linear->a->n == 1 && linear->b->n == 1) { \
  |  |  ------------------
  |  |  |  Branch (244:7): [True: 6.14k, False: 0]
  |  |  |  Branch (244:28): [True: 6.14k, False: 0]
  |  |  ------------------
  |  |  245|  6.14k|			LOOP1(IN, OUT); \
  |  |  ------------------
  |  |  |  |  219|  6.14k|	{ \
  |  |  |  |  220|  6.14k|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  221|  6.14k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  222|  6.14k|		OUT a1 = a[0]; \
  |  |  |  |  223|  6.14k|		OUT b1 = b[0]; \
  |  |  |  |  224|  6.14k|		int sz = width * nb; \
  |  |  |  |  225|  6.14k|\
  |  |  |  |  226|  12.3k|		for (x = 0; x < sz; x++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (226:15): [True: 6.19k, False: 6.14k]
  |  |  |  |  ------------------
  |  |  |  |  227|  6.19k|			q[x] = a1 * (OUT) p[x] + b1; \
  |  |  |  |  228|  6.14k|	}
  |  |  ------------------
  |  |  246|  6.14k|		} \
  |  |  247|  6.14k|		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|  6.14k|	}
  ------------------
  381|  6.14k|			break;
  382|      0|		case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (382:3): [True: 0, False: 637k]
  ------------------
  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: 637k]
  ------------------
  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: 637k]
  ------------------
  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: 637k]
  ------------------
  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: 637k]
  ------------------
  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|   631k|		case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (397:3): [True: 631k, False: 6.14k]
  ------------------
  398|   631k|			LOOP(float, float);
  ------------------
  |  |  243|   631k|	{ \
  |  |  244|   631k|		if (linear->a->n == 1 && linear->b->n == 1) { \
  |  |  ------------------
  |  |  |  Branch (244:7): [True: 631k, False: 0]
  |  |  |  Branch (244:28): [True: 442k, False: 189k]
  |  |  ------------------
  |  |  245|   442k|			LOOP1(IN, OUT); \
  |  |  ------------------
  |  |  |  |  219|   442k|	{ \
  |  |  |  |  220|   442k|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  221|   442k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  222|   442k|		OUT a1 = a[0]; \
  |  |  |  |  223|   442k|		OUT b1 = b[0]; \
  |  |  |  |  224|   442k|		int sz = width * nb; \
  |  |  |  |  225|   442k|\
  |  |  |  |  226|  14.5M|		for (x = 0; x < sz; x++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (226:15): [True: 14.1M, False: 442k]
  |  |  |  |  ------------------
  |  |  |  |  227|  14.1M|			q[x] = a1 * (OUT) p[x] + b1; \
  |  |  |  |  228|   442k|	}
  |  |  ------------------
  |  |  246|   442k|		} \
  |  |  247|   631k|		else { \
  |  |  248|   189k|			LOOPN(IN, OUT); \
  |  |  ------------------
  |  |  |  |  233|   189k|	{ \
  |  |  |  |  234|   189k|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  235|   189k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  236|   189k|\
  |  |  |  |  237|  6.25M|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (237:22): [True: 6.06M, False: 189k]
  |  |  |  |  ------------------
  |  |  |  |  238|  24.2M|			for (k = 0; k < nb; k++, i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (238:16): [True: 18.1M, False: 6.06M]
  |  |  |  |  ------------------
  |  |  |  |  239|  18.1M|				q[i] = a[k] * (OUT) p[i] + b[k]; \
  |  |  |  |  240|   189k|	}
  |  |  ------------------
  |  |  249|   189k|		} \
  |  |  250|   631k|	}
  ------------------
  399|   631k|			break;
  400|      0|		case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (400:3): [True: 0, False: 637k]
  ------------------
  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: 637k]
  ------------------
  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: 637k]
  ------------------
  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: 637k]
  ------------------
  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|   637k|		}
  413|   637k|}
linear.c:vips_linear_init:
  477|  76.3k|{
  478|  76.3k|}
linear.c:vips_linearv:
  483|  76.3k|{
  484|  76.3k|	VipsArea *area_a;
  485|  76.3k|	VipsArea *area_b;
  486|  76.3k|	int result;
  487|       |
  488|  76.3k|	area_a = VIPS_AREA(vips_array_double_new(a, n));
  ------------------
  |  |  137|  76.3k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  489|  76.3k|	area_b = VIPS_AREA(vips_array_double_new(b, n));
  ------------------
  |  |  137|  76.3k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  490|       |
  491|  76.3k|	result = vips_call_split("linear", ap, in, out, area_a, area_b);
  492|       |
  493|  76.3k|	vips_area_unref(area_a);
  494|  76.3k|	vips_area_unref(area_b);
  495|       |
  496|  76.3k|	return result;
  497|  76.3k|}

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|}

vips_pow_const1:
  669|  38.1k|{
  670|  38.1k|	va_list ap;
  671|  38.1k|	int result;
  672|       |
  673|  38.1k|	va_start(ap, c);
  674|  38.1k|	result = vips_math2_constv(in, out,
  675|  38.1k|		VIPS_OPERATION_MATH2_POW, &c, 1, ap);
  676|  38.1k|	va_end(ap);
  677|       |
  678|  38.1k|	return result;
  679|  38.1k|}
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|}
math2.c:vips_math2_const_build:
  396|  38.1k|{
  397|  38.1k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  38.1k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  38.1k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  38.1k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  398|  38.1k|	VipsUnary *unary = (VipsUnary *) object;
  399|       |
  400|  38.1k|	if (unary->in &&
  ------------------
  |  Branch (400:6): [True: 38.1k, False: 0]
  ------------------
  401|  38.1k|		vips_check_noncomplex(class->nickname, unary->in))
  ------------------
  |  Branch (401:3): [True: 0, False: 38.1k]
  ------------------
  402|      0|		return -1;
  403|       |
  404|  38.1k|	if (VIPS_OBJECT_CLASS(vips_math2_const_parent_class)->build(object))
  ------------------
  |  |  435|  38.1k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  38.1k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  38.1k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (404:6): [True: 0, False: 38.1k]
  ------------------
  405|      0|		return -1;
  406|       |
  407|  38.1k|	return 0;
  408|  38.1k|}
math2.c:vips_math2_const_buffer:
  424|   379k|{
  425|   379k|	VipsUnaryConst *uconst = (VipsUnaryConst *) arithmetic;
  426|   379k|	VipsMath2Const *math2 = (VipsMath2Const *) arithmetic;
  427|   379k|	VipsImage *im = arithmetic->ready[0];
  428|   379k|	int bands = im->Bands;
  429|       |
  430|   379k|	int i, x, b;
  431|       |
  432|   379k|	switch (math2->math2) {
  433|   379k|	case VIPS_OPERATION_MATH2_POW:
  ------------------
  |  Branch (433:2): [True: 379k, False: 0]
  ------------------
  434|   379k|		SWITCH(LOOPC, POW);
  ------------------
  |  |  117|   379k|	switch (vips_image_get_format(im)) { \
  |  |  118|      0|	case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (118:2): [True: 0, False: 379k]
  |  |  ------------------
  |  |  119|      0|		L(unsigned char, float, OP); \
  |  |  ------------------
  |  |  |  |  434|      0|		SWITCH(LOOPC, POW);
  |  |  |  |  ------------------
  |  |  |  |  |  |  411|      0|	{ \
  |  |  |  |  |  |  412|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  |  |  413|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  |  |  414|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  415|      0|\
  |  |  |  |  |  |  416|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (416:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  417|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (417:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  418|      0|				OP(q[i], p[i], c[b]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  434|      0|		SWITCH(LOOPC, POW);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  148|      0|	{ \
  |  |  |  |  |  |  |  |  |  |  149|      0|		double left = (double) (X); \
  |  |  |  |  |  |  |  |  |  |  150|      0|		double right = (double) (E); \
  |  |  |  |  |  |  |  |  |  |  151|      0|\
  |  |  |  |  |  |  |  |  |  |  152|      0|		/* Special case for **-1 and **0.5, since they are so common. Also \
  |  |  |  |  |  |  |  |  |  |  153|      0|		 * watch for /0. \
  |  |  |  |  |  |  |  |  |  |  154|      0|		 */ \
  |  |  |  |  |  |  |  |  |  |  155|      0|		(Y) = (left == 0.0) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (155:9): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  156|      0|			? 0.0 \
  |  |  |  |  |  |  |  |  |  |  157|      0|			: (right == -1) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (157:6): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  158|      0|			? 1.0 / left \
  |  |  |  |  |  |  |  |  |  |  159|      0|			: (right == 0.5) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (159:6): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  160|      0|			? sqrt(left) \
  |  |  |  |  |  |  |  |  |  |  161|      0|			: pow(left, right); \
  |  |  |  |  |  |  |  |  |  |  162|      0|	}
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  419|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  120|      0|		break; \
  |  |  121|      0|	case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (121:2): [True: 0, False: 379k]
  |  |  ------------------
  |  |  122|      0|		L(signed char, float, OP); \
  |  |  ------------------
  |  |  |  |  434|      0|		SWITCH(LOOPC, POW);
  |  |  |  |  ------------------
  |  |  |  |  |  |  411|      0|	{ \
  |  |  |  |  |  |  412|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  |  |  413|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  |  |  414|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  415|      0|\
  |  |  |  |  |  |  416|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (416:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  417|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (417:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  418|      0|				OP(q[i], p[i], c[b]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  434|      0|		SWITCH(LOOPC, POW);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  148|      0|	{ \
  |  |  |  |  |  |  |  |  |  |  149|      0|		double left = (double) (X); \
  |  |  |  |  |  |  |  |  |  |  150|      0|		double right = (double) (E); \
  |  |  |  |  |  |  |  |  |  |  151|      0|\
  |  |  |  |  |  |  |  |  |  |  152|      0|		/* Special case for **-1 and **0.5, since they are so common. Also \
  |  |  |  |  |  |  |  |  |  |  153|      0|		 * watch for /0. \
  |  |  |  |  |  |  |  |  |  |  154|      0|		 */ \
  |  |  |  |  |  |  |  |  |  |  155|      0|		(Y) = (left == 0.0) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (155:9): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  156|      0|			? 0.0 \
  |  |  |  |  |  |  |  |  |  |  157|      0|			: (right == -1) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (157:6): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  158|      0|			? 1.0 / left \
  |  |  |  |  |  |  |  |  |  |  159|      0|			: (right == 0.5) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (159:6): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  160|      0|			? sqrt(left) \
  |  |  |  |  |  |  |  |  |  |  161|      0|			: pow(left, right); \
  |  |  |  |  |  |  |  |  |  |  162|      0|	}
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  419|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  123|      0|		break; \
  |  |  124|      0|	case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (124:2): [True: 0, False: 379k]
  |  |  ------------------
  |  |  125|      0|		L(unsigned short, float, OP); \
  |  |  ------------------
  |  |  |  |  434|      0|		SWITCH(LOOPC, POW);
  |  |  |  |  ------------------
  |  |  |  |  |  |  411|      0|	{ \
  |  |  |  |  |  |  412|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  |  |  413|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  |  |  414|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  415|      0|\
  |  |  |  |  |  |  416|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (416:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  417|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (417:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  418|      0|				OP(q[i], p[i], c[b]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  434|      0|		SWITCH(LOOPC, POW);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  148|      0|	{ \
  |  |  |  |  |  |  |  |  |  |  149|      0|		double left = (double) (X); \
  |  |  |  |  |  |  |  |  |  |  150|      0|		double right = (double) (E); \
  |  |  |  |  |  |  |  |  |  |  151|      0|\
  |  |  |  |  |  |  |  |  |  |  152|      0|		/* Special case for **-1 and **0.5, since they are so common. Also \
  |  |  |  |  |  |  |  |  |  |  153|      0|		 * watch for /0. \
  |  |  |  |  |  |  |  |  |  |  154|      0|		 */ \
  |  |  |  |  |  |  |  |  |  |  155|      0|		(Y) = (left == 0.0) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (155:9): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  156|      0|			? 0.0 \
  |  |  |  |  |  |  |  |  |  |  157|      0|			: (right == -1) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (157:6): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  158|      0|			? 1.0 / left \
  |  |  |  |  |  |  |  |  |  |  159|      0|			: (right == 0.5) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (159:6): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  160|      0|			? sqrt(left) \
  |  |  |  |  |  |  |  |  |  |  161|      0|			: pow(left, right); \
  |  |  |  |  |  |  |  |  |  |  162|      0|	}
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  419|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  126|      0|		break; \
  |  |  127|      0|	case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (127:2): [True: 0, False: 379k]
  |  |  ------------------
  |  |  128|      0|		L(signed short, float, OP); \
  |  |  ------------------
  |  |  |  |  434|      0|		SWITCH(LOOPC, POW);
  |  |  |  |  ------------------
  |  |  |  |  |  |  411|      0|	{ \
  |  |  |  |  |  |  412|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  |  |  413|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  |  |  414|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  415|      0|\
  |  |  |  |  |  |  416|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (416:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  417|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (417:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  418|      0|				OP(q[i], p[i], c[b]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  434|      0|		SWITCH(LOOPC, POW);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  148|      0|	{ \
  |  |  |  |  |  |  |  |  |  |  149|      0|		double left = (double) (X); \
  |  |  |  |  |  |  |  |  |  |  150|      0|		double right = (double) (E); \
  |  |  |  |  |  |  |  |  |  |  151|      0|\
  |  |  |  |  |  |  |  |  |  |  152|      0|		/* Special case for **-1 and **0.5, since they are so common. Also \
  |  |  |  |  |  |  |  |  |  |  153|      0|		 * watch for /0. \
  |  |  |  |  |  |  |  |  |  |  154|      0|		 */ \
  |  |  |  |  |  |  |  |  |  |  155|      0|		(Y) = (left == 0.0) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (155:9): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  156|      0|			? 0.0 \
  |  |  |  |  |  |  |  |  |  |  157|      0|			: (right == -1) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (157:6): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  158|      0|			? 1.0 / left \
  |  |  |  |  |  |  |  |  |  |  159|      0|			: (right == 0.5) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (159:6): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  160|      0|			? sqrt(left) \
  |  |  |  |  |  |  |  |  |  |  161|      0|			: pow(left, right); \
  |  |  |  |  |  |  |  |  |  |  162|      0|	}
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  419|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  129|      0|		break; \
  |  |  130|      0|	case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (130:2): [True: 0, False: 379k]
  |  |  ------------------
  |  |  131|      0|		L(unsigned int, float, OP); \
  |  |  ------------------
  |  |  |  |  434|      0|		SWITCH(LOOPC, POW);
  |  |  |  |  ------------------
  |  |  |  |  |  |  411|      0|	{ \
  |  |  |  |  |  |  412|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  |  |  413|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  |  |  414|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  415|      0|\
  |  |  |  |  |  |  416|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (416:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  417|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (417:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  418|      0|				OP(q[i], p[i], c[b]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  434|      0|		SWITCH(LOOPC, POW);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  148|      0|	{ \
  |  |  |  |  |  |  |  |  |  |  149|      0|		double left = (double) (X); \
  |  |  |  |  |  |  |  |  |  |  150|      0|		double right = (double) (E); \
  |  |  |  |  |  |  |  |  |  |  151|      0|\
  |  |  |  |  |  |  |  |  |  |  152|      0|		/* Special case for **-1 and **0.5, since they are so common. Also \
  |  |  |  |  |  |  |  |  |  |  153|      0|		 * watch for /0. \
  |  |  |  |  |  |  |  |  |  |  154|      0|		 */ \
  |  |  |  |  |  |  |  |  |  |  155|      0|		(Y) = (left == 0.0) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (155:9): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  156|      0|			? 0.0 \
  |  |  |  |  |  |  |  |  |  |  157|      0|			: (right == -1) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (157:6): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  158|      0|			? 1.0 / left \
  |  |  |  |  |  |  |  |  |  |  159|      0|			: (right == 0.5) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (159:6): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  160|      0|			? sqrt(left) \
  |  |  |  |  |  |  |  |  |  |  161|      0|			: pow(left, right); \
  |  |  |  |  |  |  |  |  |  |  162|      0|	}
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  419|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      0|		break; \
  |  |  133|      0|	case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (133:2): [True: 0, False: 379k]
  |  |  ------------------
  |  |  134|      0|		L(signed int, float, OP); \
  |  |  ------------------
  |  |  |  |  434|      0|		SWITCH(LOOPC, POW);
  |  |  |  |  ------------------
  |  |  |  |  |  |  411|      0|	{ \
  |  |  |  |  |  |  412|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  |  |  413|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  |  |  414|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  415|      0|\
  |  |  |  |  |  |  416|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (416:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  417|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (417:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  418|      0|				OP(q[i], p[i], c[b]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  434|      0|		SWITCH(LOOPC, POW);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  148|      0|	{ \
  |  |  |  |  |  |  |  |  |  |  149|      0|		double left = (double) (X); \
  |  |  |  |  |  |  |  |  |  |  150|      0|		double right = (double) (E); \
  |  |  |  |  |  |  |  |  |  |  151|      0|\
  |  |  |  |  |  |  |  |  |  |  152|      0|		/* Special case for **-1 and **0.5, since they are so common. Also \
  |  |  |  |  |  |  |  |  |  |  153|      0|		 * watch for /0. \
  |  |  |  |  |  |  |  |  |  |  154|      0|		 */ \
  |  |  |  |  |  |  |  |  |  |  155|      0|		(Y) = (left == 0.0) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (155:9): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  156|      0|			? 0.0 \
  |  |  |  |  |  |  |  |  |  |  157|      0|			: (right == -1) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (157:6): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  158|      0|			? 1.0 / left \
  |  |  |  |  |  |  |  |  |  |  159|      0|			: (right == 0.5) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (159:6): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  160|      0|			? sqrt(left) \
  |  |  |  |  |  |  |  |  |  |  161|      0|			: pow(left, right); \
  |  |  |  |  |  |  |  |  |  |  162|      0|	}
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  419|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  135|      0|		break; \
  |  |  136|   379k|	case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (136:2): [True: 379k, False: 0]
  |  |  ------------------
  |  |  137|   379k|		L(float, float, OP); \
  |  |  ------------------
  |  |  |  |  434|   379k|		SWITCH(LOOPC, POW);
  |  |  |  |  ------------------
  |  |  |  |  |  |  411|   379k|	{ \
  |  |  |  |  |  |  412|   379k|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  |  |  413|   379k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  |  |  414|   379k|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  415|   379k|\
  |  |  |  |  |  |  416|  12.5M|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (416:22): [True: 12.1M, False: 379k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  417|  24.2M|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (417:16): [True: 12.1M, False: 12.1M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  418|  12.1M|				OP(q[i], p[i], c[b]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  434|  12.1M|		SWITCH(LOOPC, POW);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  148|  12.5M|	{ \
  |  |  |  |  |  |  |  |  |  |  149|  12.5M|		double left = (double) (X); \
  |  |  |  |  |  |  |  |  |  |  150|  12.5M|		double right = (double) (E); \
  |  |  |  |  |  |  |  |  |  |  151|  12.5M|\
  |  |  |  |  |  |  |  |  |  |  152|  12.5M|		/* Special case for **-1 and **0.5, since they are so common. Also \
  |  |  |  |  |  |  |  |  |  |  153|  12.5M|		 * watch for /0. \
  |  |  |  |  |  |  |  |  |  |  154|  12.5M|		 */ \
  |  |  |  |  |  |  |  |  |  |  155|  12.5M|		(Y) = (left == 0.0) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (155:9): [True: 1.49M, False: 10.6M]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  156|  12.5M|			? 0.0 \
  |  |  |  |  |  |  |  |  |  |  157|  12.5M|			: (right == -1) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (157:6): [True: 0, False: 10.6M]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  158|  10.6M|			? 1.0 / left \
  |  |  |  |  |  |  |  |  |  |  159|  10.6M|			: (right == 0.5) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (159:6): [True: 10.6M, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  160|  10.6M|			? sqrt(left) \
  |  |  |  |  |  |  |  |  |  |  161|  10.6M|			: pow(left, right); \
  |  |  |  |  |  |  |  |  |  |  162|  12.5M|	}
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  419|   379k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  138|   379k|		break; \
  |  |  139|      0|	case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (139:2): [True: 0, False: 379k]
  |  |  ------------------
  |  |  140|      0|		L(double, double, OP); \
  |  |  ------------------
  |  |  |  |  434|      0|		SWITCH(LOOPC, POW);
  |  |  |  |  ------------------
  |  |  |  |  |  |  411|      0|	{ \
  |  |  |  |  |  |  412|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  |  |  413|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  |  |  414|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  415|      0|\
  |  |  |  |  |  |  416|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (416:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  417|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (417:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  418|      0|				OP(q[i], p[i], c[b]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  434|      0|		SWITCH(LOOPC, POW);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  148|      0|	{ \
  |  |  |  |  |  |  |  |  |  |  149|      0|		double left = (double) (X); \
  |  |  |  |  |  |  |  |  |  |  150|      0|		double right = (double) (E); \
  |  |  |  |  |  |  |  |  |  |  151|      0|\
  |  |  |  |  |  |  |  |  |  |  152|      0|		/* Special case for **-1 and **0.5, since they are so common. Also \
  |  |  |  |  |  |  |  |  |  |  153|      0|		 * watch for /0. \
  |  |  |  |  |  |  |  |  |  |  154|      0|		 */ \
  |  |  |  |  |  |  |  |  |  |  155|      0|		(Y) = (left == 0.0) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (155:9): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  156|      0|			? 0.0 \
  |  |  |  |  |  |  |  |  |  |  157|      0|			: (right == -1) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (157:6): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  158|      0|			? 1.0 / left \
  |  |  |  |  |  |  |  |  |  |  159|      0|			: (right == 0.5) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (159:6): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  160|      0|			? sqrt(left) \
  |  |  |  |  |  |  |  |  |  |  161|      0|			: pow(left, right); \
  |  |  |  |  |  |  |  |  |  |  162|      0|	}
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  419|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  141|      0|		break; \
  |  |  142|      0|\
  |  |  143|      0|	default: \
  |  |  ------------------
  |  |  |  Branch (143:2): [True: 0, False: 379k]
  |  |  ------------------
  |  |  144|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  145|   379k|	}
  ------------------
  435|   379k|		break;
  436|       |
  437|      0|	case VIPS_OPERATION_MATH2_WOP:
  ------------------
  |  Branch (437:2): [True: 0, False: 379k]
  ------------------
  438|      0|		SWITCH(LOOPC, WOP);
  ------------------
  |  |  117|      0|	switch (vips_image_get_format(im)) { \
  |  |  118|      0|	case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (118:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  119|      0|		L(unsigned char, float, OP); \
  |  |  ------------------
  |  |  |  |  438|      0|		SWITCH(LOOPC, WOP);
  |  |  |  |  ------------------
  |  |  |  |  |  |  411|      0|	{ \
  |  |  |  |  |  |  412|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  |  |  413|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  |  |  414|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  415|      0|\
  |  |  |  |  |  |  416|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (416:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  417|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (417:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  418|      0|				OP(q[i], p[i], c[b]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  438|      0|		SWITCH(LOOPC, WOP);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  164|      0|#define WOP(Y, X, E) POW(Y, E, X)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  148|      0|	{ \
  |  |  |  |  |  |  |  |  |  |  |  |  149|      0|		double left = (double) (X); \
  |  |  |  |  |  |  |  |  |  |  |  |  150|      0|		double right = (double) (E); \
  |  |  |  |  |  |  |  |  |  |  |  |  151|      0|\
  |  |  |  |  |  |  |  |  |  |  |  |  152|      0|		/* Special case for **-1 and **0.5, since they are so common. Also \
  |  |  |  |  |  |  |  |  |  |  |  |  153|      0|		 * watch for /0. \
  |  |  |  |  |  |  |  |  |  |  |  |  154|      0|		 */ \
  |  |  |  |  |  |  |  |  |  |  |  |  155|      0|		(Y) = (left == 0.0) \
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (155:9): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  156|      0|			? 0.0 \
  |  |  |  |  |  |  |  |  |  |  |  |  157|      0|			: (right == -1) \
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (157:6): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  158|      0|			? 1.0 / left \
  |  |  |  |  |  |  |  |  |  |  |  |  159|      0|			: (right == 0.5) \
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (159:6): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  160|      0|			? sqrt(left) \
  |  |  |  |  |  |  |  |  |  |  |  |  161|      0|			: pow(left, right); \
  |  |  |  |  |  |  |  |  |  |  |  |  162|      0|	}
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  419|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  120|      0|		break; \
  |  |  121|      0|	case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (121:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  122|      0|		L(signed char, float, OP); \
  |  |  ------------------
  |  |  |  |  438|      0|		SWITCH(LOOPC, WOP);
  |  |  |  |  ------------------
  |  |  |  |  |  |  411|      0|	{ \
  |  |  |  |  |  |  412|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  |  |  413|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  |  |  414|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  415|      0|\
  |  |  |  |  |  |  416|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (416:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  417|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (417:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  418|      0|				OP(q[i], p[i], c[b]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  438|      0|		SWITCH(LOOPC, WOP);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  164|      0|#define WOP(Y, X, E) POW(Y, E, X)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  148|      0|	{ \
  |  |  |  |  |  |  |  |  |  |  |  |  149|      0|		double left = (double) (X); \
  |  |  |  |  |  |  |  |  |  |  |  |  150|      0|		double right = (double) (E); \
  |  |  |  |  |  |  |  |  |  |  |  |  151|      0|\
  |  |  |  |  |  |  |  |  |  |  |  |  152|      0|		/* Special case for **-1 and **0.5, since they are so common. Also \
  |  |  |  |  |  |  |  |  |  |  |  |  153|      0|		 * watch for /0. \
  |  |  |  |  |  |  |  |  |  |  |  |  154|      0|		 */ \
  |  |  |  |  |  |  |  |  |  |  |  |  155|      0|		(Y) = (left == 0.0) \
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (155:9): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  156|      0|			? 0.0 \
  |  |  |  |  |  |  |  |  |  |  |  |  157|      0|			: (right == -1) \
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (157:6): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  158|      0|			? 1.0 / left \
  |  |  |  |  |  |  |  |  |  |  |  |  159|      0|			: (right == 0.5) \
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (159:6): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  160|      0|			? sqrt(left) \
  |  |  |  |  |  |  |  |  |  |  |  |  161|      0|			: pow(left, right); \
  |  |  |  |  |  |  |  |  |  |  |  |  162|      0|	}
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  419|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  123|      0|		break; \
  |  |  124|      0|	case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (124:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  125|      0|		L(unsigned short, float, OP); \
  |  |  ------------------
  |  |  |  |  438|      0|		SWITCH(LOOPC, WOP);
  |  |  |  |  ------------------
  |  |  |  |  |  |  411|      0|	{ \
  |  |  |  |  |  |  412|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  |  |  413|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  |  |  414|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  415|      0|\
  |  |  |  |  |  |  416|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (416:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  417|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (417:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  418|      0|				OP(q[i], p[i], c[b]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  438|      0|		SWITCH(LOOPC, WOP);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  164|      0|#define WOP(Y, X, E) POW(Y, E, X)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  148|      0|	{ \
  |  |  |  |  |  |  |  |  |  |  |  |  149|      0|		double left = (double) (X); \
  |  |  |  |  |  |  |  |  |  |  |  |  150|      0|		double right = (double) (E); \
  |  |  |  |  |  |  |  |  |  |  |  |  151|      0|\
  |  |  |  |  |  |  |  |  |  |  |  |  152|      0|		/* Special case for **-1 and **0.5, since they are so common. Also \
  |  |  |  |  |  |  |  |  |  |  |  |  153|      0|		 * watch for /0. \
  |  |  |  |  |  |  |  |  |  |  |  |  154|      0|		 */ \
  |  |  |  |  |  |  |  |  |  |  |  |  155|      0|		(Y) = (left == 0.0) \
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (155:9): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  156|      0|			? 0.0 \
  |  |  |  |  |  |  |  |  |  |  |  |  157|      0|			: (right == -1) \
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (157:6): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  158|      0|			? 1.0 / left \
  |  |  |  |  |  |  |  |  |  |  |  |  159|      0|			: (right == 0.5) \
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (159:6): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  160|      0|			? sqrt(left) \
  |  |  |  |  |  |  |  |  |  |  |  |  161|      0|			: pow(left, right); \
  |  |  |  |  |  |  |  |  |  |  |  |  162|      0|	}
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  419|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  126|      0|		break; \
  |  |  127|      0|	case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (127:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  128|      0|		L(signed short, float, OP); \
  |  |  ------------------
  |  |  |  |  438|      0|		SWITCH(LOOPC, WOP);
  |  |  |  |  ------------------
  |  |  |  |  |  |  411|      0|	{ \
  |  |  |  |  |  |  412|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  |  |  413|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  |  |  414|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  415|      0|\
  |  |  |  |  |  |  416|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (416:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  417|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (417:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  418|      0|				OP(q[i], p[i], c[b]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  438|      0|		SWITCH(LOOPC, WOP);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  164|      0|#define WOP(Y, X, E) POW(Y, E, X)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  148|      0|	{ \
  |  |  |  |  |  |  |  |  |  |  |  |  149|      0|		double left = (double) (X); \
  |  |  |  |  |  |  |  |  |  |  |  |  150|      0|		double right = (double) (E); \
  |  |  |  |  |  |  |  |  |  |  |  |  151|      0|\
  |  |  |  |  |  |  |  |  |  |  |  |  152|      0|		/* Special case for **-1 and **0.5, since they are so common. Also \
  |  |  |  |  |  |  |  |  |  |  |  |  153|      0|		 * watch for /0. \
  |  |  |  |  |  |  |  |  |  |  |  |  154|      0|		 */ \
  |  |  |  |  |  |  |  |  |  |  |  |  155|      0|		(Y) = (left == 0.0) \
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (155:9): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  156|      0|			? 0.0 \
  |  |  |  |  |  |  |  |  |  |  |  |  157|      0|			: (right == -1) \
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (157:6): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  158|      0|			? 1.0 / left \
  |  |  |  |  |  |  |  |  |  |  |  |  159|      0|			: (right == 0.5) \
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (159:6): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  160|      0|			? sqrt(left) \
  |  |  |  |  |  |  |  |  |  |  |  |  161|      0|			: pow(left, right); \
  |  |  |  |  |  |  |  |  |  |  |  |  162|      0|	}
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  419|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  129|      0|		break; \
  |  |  130|      0|	case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (130:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  131|      0|		L(unsigned int, float, OP); \
  |  |  ------------------
  |  |  |  |  438|      0|		SWITCH(LOOPC, WOP);
  |  |  |  |  ------------------
  |  |  |  |  |  |  411|      0|	{ \
  |  |  |  |  |  |  412|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  |  |  413|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  |  |  414|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  415|      0|\
  |  |  |  |  |  |  416|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (416:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  417|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (417:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  418|      0|				OP(q[i], p[i], c[b]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  438|      0|		SWITCH(LOOPC, WOP);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  164|      0|#define WOP(Y, X, E) POW(Y, E, X)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  148|      0|	{ \
  |  |  |  |  |  |  |  |  |  |  |  |  149|      0|		double left = (double) (X); \
  |  |  |  |  |  |  |  |  |  |  |  |  150|      0|		double right = (double) (E); \
  |  |  |  |  |  |  |  |  |  |  |  |  151|      0|\
  |  |  |  |  |  |  |  |  |  |  |  |  152|      0|		/* Special case for **-1 and **0.5, since they are so common. Also \
  |  |  |  |  |  |  |  |  |  |  |  |  153|      0|		 * watch for /0. \
  |  |  |  |  |  |  |  |  |  |  |  |  154|      0|		 */ \
  |  |  |  |  |  |  |  |  |  |  |  |  155|      0|		(Y) = (left == 0.0) \
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (155:9): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  156|      0|			? 0.0 \
  |  |  |  |  |  |  |  |  |  |  |  |  157|      0|			: (right == -1) \
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (157:6): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  158|      0|			? 1.0 / left \
  |  |  |  |  |  |  |  |  |  |  |  |  159|      0|			: (right == 0.5) \
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (159:6): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  160|      0|			? sqrt(left) \
  |  |  |  |  |  |  |  |  |  |  |  |  161|      0|			: pow(left, right); \
  |  |  |  |  |  |  |  |  |  |  |  |  162|      0|	}
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  419|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      0|		break; \
  |  |  133|      0|	case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (133:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  134|      0|		L(signed int, float, OP); \
  |  |  ------------------
  |  |  |  |  438|      0|		SWITCH(LOOPC, WOP);
  |  |  |  |  ------------------
  |  |  |  |  |  |  411|      0|	{ \
  |  |  |  |  |  |  412|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  |  |  413|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  |  |  414|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  415|      0|\
  |  |  |  |  |  |  416|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (416:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  417|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (417:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  418|      0|				OP(q[i], p[i], c[b]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  438|      0|		SWITCH(LOOPC, WOP);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  164|      0|#define WOP(Y, X, E) POW(Y, E, X)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  148|      0|	{ \
  |  |  |  |  |  |  |  |  |  |  |  |  149|      0|		double left = (double) (X); \
  |  |  |  |  |  |  |  |  |  |  |  |  150|      0|		double right = (double) (E); \
  |  |  |  |  |  |  |  |  |  |  |  |  151|      0|\
  |  |  |  |  |  |  |  |  |  |  |  |  152|      0|		/* Special case for **-1 and **0.5, since they are so common. Also \
  |  |  |  |  |  |  |  |  |  |  |  |  153|      0|		 * watch for /0. \
  |  |  |  |  |  |  |  |  |  |  |  |  154|      0|		 */ \
  |  |  |  |  |  |  |  |  |  |  |  |  155|      0|		(Y) = (left == 0.0) \
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (155:9): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  156|      0|			? 0.0 \
  |  |  |  |  |  |  |  |  |  |  |  |  157|      0|			: (right == -1) \
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (157:6): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  158|      0|			? 1.0 / left \
  |  |  |  |  |  |  |  |  |  |  |  |  159|      0|			: (right == 0.5) \
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (159:6): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  160|      0|			? sqrt(left) \
  |  |  |  |  |  |  |  |  |  |  |  |  161|      0|			: pow(left, right); \
  |  |  |  |  |  |  |  |  |  |  |  |  162|      0|	}
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  419|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  135|      0|		break; \
  |  |  136|      0|	case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (136:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  137|      0|		L(float, float, OP); \
  |  |  ------------------
  |  |  |  |  438|      0|		SWITCH(LOOPC, WOP);
  |  |  |  |  ------------------
  |  |  |  |  |  |  411|      0|	{ \
  |  |  |  |  |  |  412|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  |  |  413|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  |  |  414|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  415|      0|\
  |  |  |  |  |  |  416|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (416:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  417|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (417:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  418|      0|				OP(q[i], p[i], c[b]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  438|      0|		SWITCH(LOOPC, WOP);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  164|      0|#define WOP(Y, X, E) POW(Y, E, X)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  148|      0|	{ \
  |  |  |  |  |  |  |  |  |  |  |  |  149|      0|		double left = (double) (X); \
  |  |  |  |  |  |  |  |  |  |  |  |  150|      0|		double right = (double) (E); \
  |  |  |  |  |  |  |  |  |  |  |  |  151|      0|\
  |  |  |  |  |  |  |  |  |  |  |  |  152|      0|		/* Special case for **-1 and **0.5, since they are so common. Also \
  |  |  |  |  |  |  |  |  |  |  |  |  153|      0|		 * watch for /0. \
  |  |  |  |  |  |  |  |  |  |  |  |  154|      0|		 */ \
  |  |  |  |  |  |  |  |  |  |  |  |  155|      0|		(Y) = (left == 0.0) \
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (155:9): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  156|      0|			? 0.0 \
  |  |  |  |  |  |  |  |  |  |  |  |  157|      0|			: (right == -1) \
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (157:6): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  158|      0|			? 1.0 / left \
  |  |  |  |  |  |  |  |  |  |  |  |  159|      0|			: (right == 0.5) \
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (159:6): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  160|      0|			? sqrt(left) \
  |  |  |  |  |  |  |  |  |  |  |  |  161|      0|			: pow(left, right); \
  |  |  |  |  |  |  |  |  |  |  |  |  162|      0|	}
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  419|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  138|      0|		break; \
  |  |  139|      0|	case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (139:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  140|      0|		L(double, double, OP); \
  |  |  ------------------
  |  |  |  |  438|      0|		SWITCH(LOOPC, WOP);
  |  |  |  |  ------------------
  |  |  |  |  |  |  411|      0|	{ \
  |  |  |  |  |  |  412|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  |  |  413|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  |  |  414|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  415|      0|\
  |  |  |  |  |  |  416|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (416:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  417|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (417:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  418|      0|				OP(q[i], p[i], c[b]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  438|      0|		SWITCH(LOOPC, WOP);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  164|      0|#define WOP(Y, X, E) POW(Y, E, X)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  148|      0|	{ \
  |  |  |  |  |  |  |  |  |  |  |  |  149|      0|		double left = (double) (X); \
  |  |  |  |  |  |  |  |  |  |  |  |  150|      0|		double right = (double) (E); \
  |  |  |  |  |  |  |  |  |  |  |  |  151|      0|\
  |  |  |  |  |  |  |  |  |  |  |  |  152|      0|		/* Special case for **-1 and **0.5, since they are so common. Also \
  |  |  |  |  |  |  |  |  |  |  |  |  153|      0|		 * watch for /0. \
  |  |  |  |  |  |  |  |  |  |  |  |  154|      0|		 */ \
  |  |  |  |  |  |  |  |  |  |  |  |  155|      0|		(Y) = (left == 0.0) \
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (155:9): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  156|      0|			? 0.0 \
  |  |  |  |  |  |  |  |  |  |  |  |  157|      0|			: (right == -1) \
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (157:6): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  158|      0|			? 1.0 / left \
  |  |  |  |  |  |  |  |  |  |  |  |  159|      0|			: (right == 0.5) \
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (159:6): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  160|      0|			? sqrt(left) \
  |  |  |  |  |  |  |  |  |  |  |  |  161|      0|			: pow(left, right); \
  |  |  |  |  |  |  |  |  |  |  |  |  162|      0|	}
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  419|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  141|      0|		break; \
  |  |  142|      0|\
  |  |  143|      0|	default: \
  |  |  ------------------
  |  |  |  Branch (143:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  144|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  145|      0|	}
  ------------------
  439|      0|		break;
  440|       |
  441|      0|	case VIPS_OPERATION_MATH2_ATAN2:
  ------------------
  |  Branch (441:2): [True: 0, False: 379k]
  ------------------
  442|      0|		SWITCH(LOOPC, ATAN2);
  ------------------
  |  |  117|      0|	switch (vips_image_get_format(im)) { \
  |  |  118|      0|	case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (118:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  119|      0|		L(unsigned char, float, OP); \
  |  |  ------------------
  |  |  |  |  442|      0|		SWITCH(LOOPC, ATAN2);
  |  |  |  |  ------------------
  |  |  |  |  |  |  411|      0|	{ \
  |  |  |  |  |  |  412|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  |  |  413|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  |  |  414|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  415|      0|\
  |  |  |  |  |  |  416|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (416:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  417|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (417:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  418|      0|				OP(q[i], p[i], c[b]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  442|      0|		SWITCH(LOOPC, ATAN2);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  167|      0|	{ \
  |  |  |  |  |  |  |  |  |  |  168|      0|		double left = (double) (L); \
  |  |  |  |  |  |  |  |  |  |  169|      0|		double right = (double) (R); \
  |  |  |  |  |  |  |  |  |  |  170|      0|\
  |  |  |  |  |  |  |  |  |  |  171|      0|		(Y) = VIPS_DEG(atan2(left, right)); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   52|      0|#define VIPS_DEG(A) (((A) / (2.0 * VIPS_PI)) * 360.0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   47|      0|#define VIPS_PI (3.14159265358979323846)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  172|      0|		if ((Y) < 0.0) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (172:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  173|      0|			(Y) += 360; \
  |  |  |  |  |  |  |  |  |  |  174|      0|	}
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  419|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  120|      0|		break; \
  |  |  121|      0|	case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (121:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  122|      0|		L(signed char, float, OP); \
  |  |  ------------------
  |  |  |  |  442|      0|		SWITCH(LOOPC, ATAN2);
  |  |  |  |  ------------------
  |  |  |  |  |  |  411|      0|	{ \
  |  |  |  |  |  |  412|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  |  |  413|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  |  |  414|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  415|      0|\
  |  |  |  |  |  |  416|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (416:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  417|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (417:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  418|      0|				OP(q[i], p[i], c[b]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  442|      0|		SWITCH(LOOPC, ATAN2);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  167|      0|	{ \
  |  |  |  |  |  |  |  |  |  |  168|      0|		double left = (double) (L); \
  |  |  |  |  |  |  |  |  |  |  169|      0|		double right = (double) (R); \
  |  |  |  |  |  |  |  |  |  |  170|      0|\
  |  |  |  |  |  |  |  |  |  |  171|      0|		(Y) = VIPS_DEG(atan2(left, right)); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   52|      0|#define VIPS_DEG(A) (((A) / (2.0 * VIPS_PI)) * 360.0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   47|      0|#define VIPS_PI (3.14159265358979323846)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  172|      0|		if ((Y) < 0.0) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (172:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  173|      0|			(Y) += 360; \
  |  |  |  |  |  |  |  |  |  |  174|      0|	}
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  419|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  123|      0|		break; \
  |  |  124|      0|	case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (124:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  125|      0|		L(unsigned short, float, OP); \
  |  |  ------------------
  |  |  |  |  442|      0|		SWITCH(LOOPC, ATAN2);
  |  |  |  |  ------------------
  |  |  |  |  |  |  411|      0|	{ \
  |  |  |  |  |  |  412|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  |  |  413|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  |  |  414|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  415|      0|\
  |  |  |  |  |  |  416|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (416:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  417|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (417:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  418|      0|				OP(q[i], p[i], c[b]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  442|      0|		SWITCH(LOOPC, ATAN2);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  167|      0|	{ \
  |  |  |  |  |  |  |  |  |  |  168|      0|		double left = (double) (L); \
  |  |  |  |  |  |  |  |  |  |  169|      0|		double right = (double) (R); \
  |  |  |  |  |  |  |  |  |  |  170|      0|\
  |  |  |  |  |  |  |  |  |  |  171|      0|		(Y) = VIPS_DEG(atan2(left, right)); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   52|      0|#define VIPS_DEG(A) (((A) / (2.0 * VIPS_PI)) * 360.0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   47|      0|#define VIPS_PI (3.14159265358979323846)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  172|      0|		if ((Y) < 0.0) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (172:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  173|      0|			(Y) += 360; \
  |  |  |  |  |  |  |  |  |  |  174|      0|	}
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  419|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  126|      0|		break; \
  |  |  127|      0|	case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (127:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  128|      0|		L(signed short, float, OP); \
  |  |  ------------------
  |  |  |  |  442|      0|		SWITCH(LOOPC, ATAN2);
  |  |  |  |  ------------------
  |  |  |  |  |  |  411|      0|	{ \
  |  |  |  |  |  |  412|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  |  |  413|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  |  |  414|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  415|      0|\
  |  |  |  |  |  |  416|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (416:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  417|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (417:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  418|      0|				OP(q[i], p[i], c[b]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  442|      0|		SWITCH(LOOPC, ATAN2);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  167|      0|	{ \
  |  |  |  |  |  |  |  |  |  |  168|      0|		double left = (double) (L); \
  |  |  |  |  |  |  |  |  |  |  169|      0|		double right = (double) (R); \
  |  |  |  |  |  |  |  |  |  |  170|      0|\
  |  |  |  |  |  |  |  |  |  |  171|      0|		(Y) = VIPS_DEG(atan2(left, right)); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   52|      0|#define VIPS_DEG(A) (((A) / (2.0 * VIPS_PI)) * 360.0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   47|      0|#define VIPS_PI (3.14159265358979323846)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  172|      0|		if ((Y) < 0.0) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (172:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  173|      0|			(Y) += 360; \
  |  |  |  |  |  |  |  |  |  |  174|      0|	}
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  419|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  129|      0|		break; \
  |  |  130|      0|	case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (130:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  131|      0|		L(unsigned int, float, OP); \
  |  |  ------------------
  |  |  |  |  442|      0|		SWITCH(LOOPC, ATAN2);
  |  |  |  |  ------------------
  |  |  |  |  |  |  411|      0|	{ \
  |  |  |  |  |  |  412|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  |  |  413|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  |  |  414|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  415|      0|\
  |  |  |  |  |  |  416|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (416:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  417|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (417:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  418|      0|				OP(q[i], p[i], c[b]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  442|      0|		SWITCH(LOOPC, ATAN2);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  167|      0|	{ \
  |  |  |  |  |  |  |  |  |  |  168|      0|		double left = (double) (L); \
  |  |  |  |  |  |  |  |  |  |  169|      0|		double right = (double) (R); \
  |  |  |  |  |  |  |  |  |  |  170|      0|\
  |  |  |  |  |  |  |  |  |  |  171|      0|		(Y) = VIPS_DEG(atan2(left, right)); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   52|      0|#define VIPS_DEG(A) (((A) / (2.0 * VIPS_PI)) * 360.0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   47|      0|#define VIPS_PI (3.14159265358979323846)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  172|      0|		if ((Y) < 0.0) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (172:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  173|      0|			(Y) += 360; \
  |  |  |  |  |  |  |  |  |  |  174|      0|	}
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  419|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      0|		break; \
  |  |  133|      0|	case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (133:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  134|      0|		L(signed int, float, OP); \
  |  |  ------------------
  |  |  |  |  442|      0|		SWITCH(LOOPC, ATAN2);
  |  |  |  |  ------------------
  |  |  |  |  |  |  411|      0|	{ \
  |  |  |  |  |  |  412|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  |  |  413|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  |  |  414|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  415|      0|\
  |  |  |  |  |  |  416|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (416:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  417|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (417:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  418|      0|				OP(q[i], p[i], c[b]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  442|      0|		SWITCH(LOOPC, ATAN2);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  167|      0|	{ \
  |  |  |  |  |  |  |  |  |  |  168|      0|		double left = (double) (L); \
  |  |  |  |  |  |  |  |  |  |  169|      0|		double right = (double) (R); \
  |  |  |  |  |  |  |  |  |  |  170|      0|\
  |  |  |  |  |  |  |  |  |  |  171|      0|		(Y) = VIPS_DEG(atan2(left, right)); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   52|      0|#define VIPS_DEG(A) (((A) / (2.0 * VIPS_PI)) * 360.0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   47|      0|#define VIPS_PI (3.14159265358979323846)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  172|      0|		if ((Y) < 0.0) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (172:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  173|      0|			(Y) += 360; \
  |  |  |  |  |  |  |  |  |  |  174|      0|	}
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  419|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  135|      0|		break; \
  |  |  136|      0|	case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (136:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  137|      0|		L(float, float, OP); \
  |  |  ------------------
  |  |  |  |  442|      0|		SWITCH(LOOPC, ATAN2);
  |  |  |  |  ------------------
  |  |  |  |  |  |  411|      0|	{ \
  |  |  |  |  |  |  412|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  |  |  413|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  |  |  414|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  415|      0|\
  |  |  |  |  |  |  416|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (416:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  417|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (417:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  418|      0|				OP(q[i], p[i], c[b]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  442|      0|		SWITCH(LOOPC, ATAN2);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  167|      0|	{ \
  |  |  |  |  |  |  |  |  |  |  168|      0|		double left = (double) (L); \
  |  |  |  |  |  |  |  |  |  |  169|      0|		double right = (double) (R); \
  |  |  |  |  |  |  |  |  |  |  170|      0|\
  |  |  |  |  |  |  |  |  |  |  171|      0|		(Y) = VIPS_DEG(atan2(left, right)); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   52|      0|#define VIPS_DEG(A) (((A) / (2.0 * VIPS_PI)) * 360.0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   47|      0|#define VIPS_PI (3.14159265358979323846)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  172|      0|		if ((Y) < 0.0) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (172:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  173|      0|			(Y) += 360; \
  |  |  |  |  |  |  |  |  |  |  174|      0|	}
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  419|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  138|      0|		break; \
  |  |  139|      0|	case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (139:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  140|      0|		L(double, double, OP); \
  |  |  ------------------
  |  |  |  |  442|      0|		SWITCH(LOOPC, ATAN2);
  |  |  |  |  ------------------
  |  |  |  |  |  |  411|      0|	{ \
  |  |  |  |  |  |  412|      0|		IN *restrict p = (IN *) in[0]; \
  |  |  |  |  |  |  413|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  |  |  414|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  415|      0|\
  |  |  |  |  |  |  416|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (416:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  417|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (417:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  418|      0|				OP(q[i], p[i], c[b]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  442|      0|		SWITCH(LOOPC, ATAN2);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  167|      0|	{ \
  |  |  |  |  |  |  |  |  |  |  168|      0|		double left = (double) (L); \
  |  |  |  |  |  |  |  |  |  |  169|      0|		double right = (double) (R); \
  |  |  |  |  |  |  |  |  |  |  170|      0|\
  |  |  |  |  |  |  |  |  |  |  171|      0|		(Y) = VIPS_DEG(atan2(left, right)); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   52|      0|#define VIPS_DEG(A) (((A) / (2.0 * VIPS_PI)) * 360.0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   47|      0|#define VIPS_PI (3.14159265358979323846)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  172|      0|		if ((Y) < 0.0) \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (172:7): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  173|      0|			(Y) += 360; \
  |  |  |  |  |  |  |  |  |  |  174|      0|	}
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  419|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  141|      0|		break; \
  |  |  142|      0|\
  |  |  143|      0|	default: \
  |  |  ------------------
  |  |  |  Branch (143:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  144|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  145|      0|	}
  ------------------
  443|      0|		break;
  444|       |
  445|      0|	default:
  ------------------
  |  Branch (445:2): [True: 0, False: 379k]
  ------------------
  446|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  447|      0|		break;
  448|   379k|	}
  449|   379k|}
math2.c:vips_math2_const_init:
  480|  38.1k|{
  481|  38.1k|}
math2.c:vips_math2_constv:
  486|  38.1k|{
  487|  38.1k|	VipsArea *area_c;
  488|  38.1k|	double *array;
  489|  38.1k|	int result;
  490|  38.1k|	int i;
  491|       |
  492|  38.1k|	area_c = vips_area_new_array(G_TYPE_DOUBLE, sizeof(double), n);
  ------------------
  |  |  148|  38.1k|#define G_TYPE_DOUBLE			G_TYPE_MAKE_FUNDAMENTAL (15)
  |  |  ------------------
  |  |  |  |  221|  38.1k|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|  38.1k|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  493|  38.1k|	array = (double *) area_c->data;
  494|  76.3k|	for (i = 0; i < n; i++)
  ------------------
  |  Branch (494:14): [True: 38.1k, False: 38.1k]
  ------------------
  495|  38.1k|		array[i] = c[i];
  496|       |
  497|  38.1k|	result = vips_call_split("math2_const", ap, in, out, math2, area_c);
  498|       |
  499|  38.1k|	vips_area_unref(area_c);
  500|       |
  501|  38.1k|	return result;
  502|  38.1k|}

vips_max:
  549|  19.0k|{
  550|  19.0k|	va_list ap;
  551|  19.0k|	int result;
  552|       |
  553|  19.0k|	va_start(ap, out);
  554|  19.0k|	result = vips_call_split("max", ap, in, out);
  555|  19.0k|	va_end(ap);
  556|       |
  557|  19.0k|	return result;
  558|  19.0k|}
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|}
max.c:vips_max_build:
  200|  19.0k|{
  201|  19.0k|	VipsStatistic *statistic = VIPS_STATISTIC(object);
  ------------------
  |  |   40|  19.0k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  19.0k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  19.0k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  19.0k|		VIPS_TYPE_STATISTIC, VipsStatistic))
  ------------------
  202|  19.0k|	VipsMax *max = (VipsMax *) object;
  203|  19.0k|	VipsValues *values = &max->values;
  204|       |
  205|  19.0k|	vips_values_init(values, max);
  206|       |
  207|  19.0k|	if (VIPS_OBJECT_CLASS(vips_max_parent_class)->build(object))
  ------------------
  |  |  435|  19.0k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  19.0k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  19.0k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (207:6): [True: 11.1k, False: 7.89k]
  ------------------
  208|  11.1k|		return -1;
  209|       |
  210|       |	/* For speed we accumulate max ** 2 for complex.
  211|       |	 */
  212|  7.89k|	if (vips_band_format_iscomplex(
  ------------------
  |  Branch (212:6): [True: 0, False: 7.89k]
  ------------------
  213|  7.89k|			vips_image_get_format(statistic->in))) {
  214|      0|		int i;
  215|       |
  216|      0|		for (i = 0; i < values->n; i++)
  ------------------
  |  Branch (216:15): [True: 0, False: 0]
  ------------------
  217|      0|			values->value[i] = sqrt(values->value[i]);
  218|      0|	}
  219|       |
  220|       |	/* Don't set if there's no value (eg. if every pixel is NaN). This
  221|       |	 * will trigger an error later.
  222|       |	 */
  223|  7.89k|	if (values->n > 0) {
  ------------------
  |  Branch (223:6): [True: 7.82k, False: 66]
  ------------------
  224|  7.82k|		VipsArrayDouble *out_array;
  225|  7.82k|		VipsArrayInt *x_array;
  226|  7.82k|		VipsArrayInt *y_array;
  227|       |
  228|  7.82k|		out_array = vips_array_double_new(values->value, values->n);
  229|  7.82k|		x_array = vips_array_int_new(values->x_pos, values->n);
  230|  7.82k|		y_array = vips_array_int_new(values->y_pos, values->n);
  231|       |
  232|       |		/* We have to set the props via g_object_set() to stop vips
  233|       |		 * complaining they are unset.
  234|       |		 */
  235|  7.82k|		g_object_set(max,
  236|  7.82k|			"out", values->value[values->n - 1],
  237|  7.82k|			"x", values->x_pos[values->n - 1],
  238|  7.82k|			"y", values->y_pos[values->n - 1],
  239|  7.82k|			"out_array", out_array,
  240|  7.82k|			"x_array", x_array,
  241|  7.82k|			"y_array", y_array,
  242|  7.82k|			NULL);
  243|       |
  244|  7.82k|		vips_area_unref(VIPS_AREA(out_array));
  ------------------
  |  |  137|  7.82k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  245|  7.82k|		vips_area_unref(VIPS_AREA(x_array));
  ------------------
  |  |  137|  7.82k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  246|  7.82k|		vips_area_unref(VIPS_AREA(y_array));
  ------------------
  |  |  137|  7.82k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  247|  7.82k|	}
  248|       |
  249|       |#ifdef DEBUG
  250|       |	{
  251|       |		int i;
  252|       |
  253|       |		printf("vips_max_build: %d values found\n", values->n);
  254|       |		for (i = 0; i < values->n; i++)
  255|       |			printf("%d) %g\t%d\t%d\n",
  256|       |				i,
  257|       |				values->value[i],
  258|       |				values->x_pos[i], values->y_pos[i]);
  259|       |	}
  260|       |#endif /*DEBUG*/
  261|       |
  262|  7.89k|	return 0;
  263|  19.0k|}
max.c:vips_values_init:
  129|  38.1k|{
  130|  38.1k|	values->max = max;
  131|       |
  132|  38.1k|	values->size = max->size;
  133|  38.1k|	values->n = 0;
  134|  38.1k|	values->value = VIPS_ARRAY(max, values->size, double);
  ------------------
  |  |   72|  38.1k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  38.1k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  38.1k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  38.1k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  38.1k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  135|  38.1k|	values->x_pos = VIPS_ARRAY(max, values->size, int);
  ------------------
  |  |   72|  38.1k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  38.1k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  38.1k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  38.1k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  38.1k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  136|  38.1k|	values->y_pos = VIPS_ARRAY(max, values->size, int);
  ------------------
  |  |   72|  38.1k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  38.1k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  38.1k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  38.1k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  38.1k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  137|  38.1k|}
max.c:vips_max_start:
  269|  19.0k|{
  270|  19.0k|	VipsValues *values;
  271|       |
  272|  19.0k|	values = g_new(VipsValues, 1);
  ------------------
  |  |  282|  19.0k|#define g_new(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc)
  |  |  ------------------
  |  |  |  |  227|  19.0k|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|  19.0k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|  19.0k|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|  19.0k|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|  19.0k|	  gpointer __p;						\
  |  |  |  |  231|  19.0k|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 19.0k]
  |  |  |  |  ------------------
  |  |  |  |  232|  19.0k|	    __p = g_##func (__n);				\
  |  |  |  |  233|  19.0k|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 19.0k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|  19.0k|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 19.0k]
  |  |  |  |  |  Branch (234:26): [True: 19.0k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|  19.0k|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|  19.0k|	  else							\
  |  |  |  |  237|  19.0k|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|  19.0k|	  __p;							\
  |  |  |  |  239|  19.0k|	}))
  |  |  ------------------
  ------------------
  273|  19.0k|	vips_values_init(values, (VipsMax *) statistic);
  274|       |
  275|  19.0k|	return (void *) values;
  276|  19.0k|}
max.c:vips_max_scan:
  385|   252k|{
  386|   252k|	VipsValues *values = (VipsValues *) seq;
  387|   252k|	const int bands = vips_image_get_bands(statistic->in);
  388|   252k|	const int sz = n * bands;
  389|       |
  390|   252k|	int i;
  391|       |
  392|   252k|	switch (vips_image_get_format(statistic->in)) {
  393|      0|	case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (393:2): [True: 0, False: 252k]
  ------------------
  394|      0|		LOOPU(unsigned char, UCHAR_MAX);
  ------------------
  |  |  308|      0|	{ \
  |  |  309|      0|		TYPE *p = (TYPE *) in; \
  |  |  310|      0|		TYPE m; \
  |  |  311|      0|\
  |  |  312|      0|		for (i = 0; i < sz && values->n < values->size; i++) \
  |  |  ------------------
  |  |  |  Branch (312:15): [True: 0, False: 0]
  |  |  |  Branch (312:25): [True: 0, False: 0]
  |  |  ------------------
  |  |  313|      0|			vips_values_add(values, p[i], x + i / bands, y); \
  |  |  314|      0|		m = values->value[0]; \
  |  |  315|      0|\
  |  |  316|      0|		for (; i < sz; i++) { \
  |  |  ------------------
  |  |  |  Branch (316:10): [True: 0, False: 0]
  |  |  ------------------
  |  |  317|      0|			if (p[i] > m) { \
  |  |  ------------------
  |  |  |  Branch (317:8): [True: 0, False: 0]
  |  |  ------------------
  |  |  318|      0|				vips_values_add(values, p[i], x + i / bands, y); \
  |  |  319|      0|				m = values->value[0]; \
  |  |  320|      0|\
  |  |  321|      0|				if (m >= UPPER) { \
  |  |  ------------------
  |  |  |  Branch (321:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  322|      0|					statistic->stop = TRUE; \
  |  |  ------------------
  |  |  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  |  |  ------------------
  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  323|      0|					break; \
  |  |  324|      0|				} \
  |  |  325|      0|			} \
  |  |  326|      0|		} \
  |  |  327|      0|	}
  ------------------
  395|      0|		break;
  396|      0|	case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (396:2): [True: 0, False: 252k]
  ------------------
  397|      0|		LOOPU(signed char, SCHAR_MAX);
  ------------------
  |  |  308|      0|	{ \
  |  |  309|      0|		TYPE *p = (TYPE *) in; \
  |  |  310|      0|		TYPE m; \
  |  |  311|      0|\
  |  |  312|      0|		for (i = 0; i < sz && values->n < values->size; i++) \
  |  |  ------------------
  |  |  |  Branch (312:15): [True: 0, False: 0]
  |  |  |  Branch (312:25): [True: 0, False: 0]
  |  |  ------------------
  |  |  313|      0|			vips_values_add(values, p[i], x + i / bands, y); \
  |  |  314|      0|		m = values->value[0]; \
  |  |  315|      0|\
  |  |  316|      0|		for (; i < sz; i++) { \
  |  |  ------------------
  |  |  |  Branch (316:10): [True: 0, False: 0]
  |  |  ------------------
  |  |  317|      0|			if (p[i] > m) { \
  |  |  ------------------
  |  |  |  Branch (317:8): [True: 0, False: 0]
  |  |  ------------------
  |  |  318|      0|				vips_values_add(values, p[i], x + i / bands, y); \
  |  |  319|      0|				m = values->value[0]; \
  |  |  320|      0|\
  |  |  321|      0|				if (m >= UPPER) { \
  |  |  ------------------
  |  |  |  Branch (321:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  322|      0|					statistic->stop = TRUE; \
  |  |  ------------------
  |  |  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  |  |  ------------------
  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  323|      0|					break; \
  |  |  324|      0|				} \
  |  |  325|      0|			} \
  |  |  326|      0|		} \
  |  |  327|      0|	}
  ------------------
  398|      0|		break;
  399|      0|	case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (399:2): [True: 0, False: 252k]
  ------------------
  400|      0|		LOOPU(unsigned short, USHRT_MAX);
  ------------------
  |  |  308|      0|	{ \
  |  |  309|      0|		TYPE *p = (TYPE *) in; \
  |  |  310|      0|		TYPE m; \
  |  |  311|      0|\
  |  |  312|      0|		for (i = 0; i < sz && values->n < values->size; i++) \
  |  |  ------------------
  |  |  |  Branch (312:15): [True: 0, False: 0]
  |  |  |  Branch (312:25): [True: 0, False: 0]
  |  |  ------------------
  |  |  313|      0|			vips_values_add(values, p[i], x + i / bands, y); \
  |  |  314|      0|		m = values->value[0]; \
  |  |  315|      0|\
  |  |  316|      0|		for (; i < sz; i++) { \
  |  |  ------------------
  |  |  |  Branch (316:10): [True: 0, False: 0]
  |  |  ------------------
  |  |  317|      0|			if (p[i] > m) { \
  |  |  ------------------
  |  |  |  Branch (317:8): [True: 0, False: 0]
  |  |  ------------------
  |  |  318|      0|				vips_values_add(values, p[i], x + i / bands, y); \
  |  |  319|      0|				m = values->value[0]; \
  |  |  320|      0|\
  |  |  321|      0|				if (m >= UPPER) { \
  |  |  ------------------
  |  |  |  Branch (321:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  322|      0|					statistic->stop = TRUE; \
  |  |  ------------------
  |  |  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  |  |  ------------------
  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  323|      0|					break; \
  |  |  324|      0|				} \
  |  |  325|      0|			} \
  |  |  326|      0|		} \
  |  |  327|      0|	}
  ------------------
  401|      0|		break;
  402|      0|	case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (402:2): [True: 0, False: 252k]
  ------------------
  403|      0|		LOOPU(signed short, SHRT_MAX);
  ------------------
  |  |  308|      0|	{ \
  |  |  309|      0|		TYPE *p = (TYPE *) in; \
  |  |  310|      0|		TYPE m; \
  |  |  311|      0|\
  |  |  312|      0|		for (i = 0; i < sz && values->n < values->size; i++) \
  |  |  ------------------
  |  |  |  Branch (312:15): [True: 0, False: 0]
  |  |  |  Branch (312:25): [True: 0, False: 0]
  |  |  ------------------
  |  |  313|      0|			vips_values_add(values, p[i], x + i / bands, y); \
  |  |  314|      0|		m = values->value[0]; \
  |  |  315|      0|\
  |  |  316|      0|		for (; i < sz; i++) { \
  |  |  ------------------
  |  |  |  Branch (316:10): [True: 0, False: 0]
  |  |  ------------------
  |  |  317|      0|			if (p[i] > m) { \
  |  |  ------------------
  |  |  |  Branch (317:8): [True: 0, False: 0]
  |  |  ------------------
  |  |  318|      0|				vips_values_add(values, p[i], x + i / bands, y); \
  |  |  319|      0|				m = values->value[0]; \
  |  |  320|      0|\
  |  |  321|      0|				if (m >= UPPER) { \
  |  |  ------------------
  |  |  |  Branch (321:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  322|      0|					statistic->stop = TRUE; \
  |  |  ------------------
  |  |  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  |  |  ------------------
  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  323|      0|					break; \
  |  |  324|      0|				} \
  |  |  325|      0|			} \
  |  |  326|      0|		} \
  |  |  327|      0|	}
  ------------------
  404|      0|		break;
  405|      0|	case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (405:2): [True: 0, False: 252k]
  ------------------
  406|      0|		LOOPU(unsigned int, UINT_MAX);
  ------------------
  |  |  308|      0|	{ \
  |  |  309|      0|		TYPE *p = (TYPE *) in; \
  |  |  310|      0|		TYPE m; \
  |  |  311|      0|\
  |  |  312|      0|		for (i = 0; i < sz && values->n < values->size; i++) \
  |  |  ------------------
  |  |  |  Branch (312:15): [True: 0, False: 0]
  |  |  |  Branch (312:25): [True: 0, False: 0]
  |  |  ------------------
  |  |  313|      0|			vips_values_add(values, p[i], x + i / bands, y); \
  |  |  314|      0|		m = values->value[0]; \
  |  |  315|      0|\
  |  |  316|      0|		for (; i < sz; i++) { \
  |  |  ------------------
  |  |  |  Branch (316:10): [True: 0, False: 0]
  |  |  ------------------
  |  |  317|      0|			if (p[i] > m) { \
  |  |  ------------------
  |  |  |  Branch (317:8): [True: 0, False: 0]
  |  |  ------------------
  |  |  318|      0|				vips_values_add(values, p[i], x + i / bands, y); \
  |  |  319|      0|				m = values->value[0]; \
  |  |  320|      0|\
  |  |  321|      0|				if (m >= UPPER) { \
  |  |  ------------------
  |  |  |  Branch (321:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  322|      0|					statistic->stop = TRUE; \
  |  |  ------------------
  |  |  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  |  |  ------------------
  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  323|      0|					break; \
  |  |  324|      0|				} \
  |  |  325|      0|			} \
  |  |  326|      0|		} \
  |  |  327|      0|	}
  ------------------
  407|      0|		break;
  408|      0|	case VIPS_FORMAT_INT:
  ------------------
  |  Branch (408:2): [True: 0, False: 252k]
  ------------------
  409|      0|		LOOPU(signed int, INT_MAX);
  ------------------
  |  |  308|      0|	{ \
  |  |  309|      0|		TYPE *p = (TYPE *) in; \
  |  |  310|      0|		TYPE m; \
  |  |  311|      0|\
  |  |  312|      0|		for (i = 0; i < sz && values->n < values->size; i++) \
  |  |  ------------------
  |  |  |  Branch (312:15): [True: 0, False: 0]
  |  |  |  Branch (312:25): [True: 0, False: 0]
  |  |  ------------------
  |  |  313|      0|			vips_values_add(values, p[i], x + i / bands, y); \
  |  |  314|      0|		m = values->value[0]; \
  |  |  315|      0|\
  |  |  316|      0|		for (; i < sz; i++) { \
  |  |  ------------------
  |  |  |  Branch (316:10): [True: 0, False: 0]
  |  |  ------------------
  |  |  317|      0|			if (p[i] > m) { \
  |  |  ------------------
  |  |  |  Branch (317:8): [True: 0, False: 0]
  |  |  ------------------
  |  |  318|      0|				vips_values_add(values, p[i], x + i / bands, y); \
  |  |  319|      0|				m = values->value[0]; \
  |  |  320|      0|\
  |  |  321|      0|				if (m >= UPPER) { \
  |  |  ------------------
  |  |  |  Branch (321:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  322|      0|					statistic->stop = TRUE; \
  |  |  ------------------
  |  |  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  |  |  ------------------
  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  323|      0|					break; \
  |  |  324|      0|				} \
  |  |  325|      0|			} \
  |  |  326|      0|		} \
  |  |  327|      0|	}
  ------------------
  410|      0|		break;
  411|       |
  412|   252k|	case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (412:2): [True: 252k, False: 0]
  ------------------
  413|   252k|		LOOPF(float);
  ------------------
  |  |  335|   252k|	{ \
  |  |  336|   252k|		TYPE *p = (TYPE *) in; \
  |  |  337|   252k|		TYPE m; \
  |  |  338|   252k|\
  |  |  339|   351k|		for (i = 0; i < sz && values->n < values->size; i++) \
  |  |  ------------------
  |  |  |  Branch (339:15): [True: 348k, False: 2.83k]
  |  |  |  Branch (339:25): [True: 99.1k, False: 249k]
  |  |  ------------------
  |  |  340|   252k|			if (!VIPS_ISNAN(p[i])) \
  |  |  ------------------
  |  |  |  |   71|  99.1k|#define VIPS_ISNAN(V) __builtin_isnan(V)
  |  |  ------------------
  |  |  |  Branch (340:8): [True: 7.82k, False: 91.3k]
  |  |  ------------------
  |  |  341|  99.1k|				vips_values_add(values, p[i], x + i / bands, y); \
  |  |  342|   252k|		m = values->value[0]; \
  |  |  343|   252k|\
  |  |  344|  8.23M|		for (; i < sz; i++) \
  |  |  ------------------
  |  |  |  Branch (344:10): [True: 7.98M, False: 252k]
  |  |  ------------------
  |  |  345|  7.98M|			if (p[i] > m) { \
  |  |  ------------------
  |  |  |  Branch (345:8): [True: 114k, False: 7.86M]
  |  |  ------------------
  |  |  346|   114k|				vips_values_add(values, p[i], x + i / bands, y); \
  |  |  347|   114k|				m = values->value[0]; \
  |  |  348|   114k|			} \
  |  |  349|   252k|	}
  ------------------
  414|   252k|		break;
  415|      0|	case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (415:2): [True: 0, False: 252k]
  ------------------
  416|      0|		LOOPF(double);
  ------------------
  |  |  335|      0|	{ \
  |  |  336|      0|		TYPE *p = (TYPE *) in; \
  |  |  337|      0|		TYPE m; \
  |  |  338|      0|\
  |  |  339|      0|		for (i = 0; i < sz && values->n < values->size; i++) \
  |  |  ------------------
  |  |  |  Branch (339:15): [True: 0, False: 0]
  |  |  |  Branch (339:25): [True: 0, False: 0]
  |  |  ------------------
  |  |  340|      0|			if (!VIPS_ISNAN(p[i])) \
  |  |  ------------------
  |  |  |  |   71|      0|#define VIPS_ISNAN(V) __builtin_isnan(V)
  |  |  ------------------
  |  |  |  Branch (340:8): [True: 0, False: 0]
  |  |  ------------------
  |  |  341|      0|				vips_values_add(values, p[i], x + i / bands, y); \
  |  |  342|      0|		m = values->value[0]; \
  |  |  343|      0|\
  |  |  344|      0|		for (; i < sz; i++) \
  |  |  ------------------
  |  |  |  Branch (344:10): [True: 0, False: 0]
  |  |  ------------------
  |  |  345|      0|			if (p[i] > m) { \
  |  |  ------------------
  |  |  |  Branch (345:8): [True: 0, False: 0]
  |  |  ------------------
  |  |  346|      0|				vips_values_add(values, p[i], x + i / bands, y); \
  |  |  347|      0|				m = values->value[0]; \
  |  |  348|      0|			} \
  |  |  349|      0|	}
  ------------------
  417|      0|		break;
  418|       |
  419|      0|	case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (419:2): [True: 0, False: 252k]
  ------------------
  420|      0|		LOOPC(float);
  ------------------
  |  |  354|      0|	{ \
  |  |  355|      0|		TYPE *p = (TYPE *) in; \
  |  |  356|      0|		TYPE m; \
  |  |  357|      0|\
  |  |  358|      0|		for (i = 0; i < sz && values->n < values->size; i++) { \
  |  |  ------------------
  |  |  |  Branch (358:15): [True: 0, False: 0]
  |  |  |  Branch (358:25): [True: 0, False: 0]
  |  |  ------------------
  |  |  359|      0|			TYPE mod2 = p[0] * p[0] + p[1] * p[1]; \
  |  |  360|      0|\
  |  |  361|      0|			if (!VIPS_ISNAN(mod2)) \
  |  |  ------------------
  |  |  |  |   71|      0|#define VIPS_ISNAN(V) __builtin_isnan(V)
  |  |  ------------------
  |  |  |  Branch (361:8): [True: 0, False: 0]
  |  |  ------------------
  |  |  362|      0|				vips_values_add(values, p[i], x + i / bands, y); \
  |  |  363|      0|\
  |  |  364|      0|			p += 2; \
  |  |  365|      0|		} \
  |  |  366|      0|		m = values->value[0]; \
  |  |  367|      0|\
  |  |  368|      0|		for (; i < sz; i++) { \
  |  |  ------------------
  |  |  |  Branch (368:10): [True: 0, False: 0]
  |  |  ------------------
  |  |  369|      0|			TYPE mod2 = p[0] * p[0] + p[1] * p[1]; \
  |  |  370|      0|\
  |  |  371|      0|			if (mod2 > m) { \
  |  |  ------------------
  |  |  |  Branch (371:8): [True: 0, False: 0]
  |  |  ------------------
  |  |  372|      0|				vips_values_add(values, mod2, x + i / bands, y); \
  |  |  373|      0|				m = values->value[0]; \
  |  |  374|      0|			} \
  |  |  375|      0|\
  |  |  376|      0|			p += 2; \
  |  |  377|      0|		} \
  |  |  378|      0|	}
  ------------------
  421|      0|		break;
  422|      0|	case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (422:2): [True: 0, False: 252k]
  ------------------
  423|      0|		LOOPC(double);
  ------------------
  |  |  354|      0|	{ \
  |  |  355|      0|		TYPE *p = (TYPE *) in; \
  |  |  356|      0|		TYPE m; \
  |  |  357|      0|\
  |  |  358|      0|		for (i = 0; i < sz && values->n < values->size; i++) { \
  |  |  ------------------
  |  |  |  Branch (358:15): [True: 0, False: 0]
  |  |  |  Branch (358:25): [True: 0, False: 0]
  |  |  ------------------
  |  |  359|      0|			TYPE mod2 = p[0] * p[0] + p[1] * p[1]; \
  |  |  360|      0|\
  |  |  361|      0|			if (!VIPS_ISNAN(mod2)) \
  |  |  ------------------
  |  |  |  |   71|      0|#define VIPS_ISNAN(V) __builtin_isnan(V)
  |  |  ------------------
  |  |  |  Branch (361:8): [True: 0, False: 0]
  |  |  ------------------
  |  |  362|      0|				vips_values_add(values, p[i], x + i / bands, y); \
  |  |  363|      0|\
  |  |  364|      0|			p += 2; \
  |  |  365|      0|		} \
  |  |  366|      0|		m = values->value[0]; \
  |  |  367|      0|\
  |  |  368|      0|		for (; i < sz; i++) { \
  |  |  ------------------
  |  |  |  Branch (368:10): [True: 0, False: 0]
  |  |  ------------------
  |  |  369|      0|			TYPE mod2 = p[0] * p[0] + p[1] * p[1]; \
  |  |  370|      0|\
  |  |  371|      0|			if (mod2 > m) { \
  |  |  ------------------
  |  |  |  Branch (371:8): [True: 0, False: 0]
  |  |  ------------------
  |  |  372|      0|				vips_values_add(values, mod2, x + i / bands, y); \
  |  |  373|      0|				m = values->value[0]; \
  |  |  374|      0|			} \
  |  |  375|      0|\
  |  |  376|      0|			p += 2; \
  |  |  377|      0|		} \
  |  |  378|      0|	}
  ------------------
  424|      0|		break;
  425|       |
  426|      0|	default:
  ------------------
  |  Branch (426:2): [True: 0, False: 252k]
  ------------------
  427|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  428|   252k|	}
  429|       |
  430|   252k|	return 0;
  431|   252k|}
max.c:vips_values_add:
  143|   130k|{
  144|   130k|	int i, j;
  145|       |
  146|       |	/* Find insertion point.
  147|       |	 */
  148|   245k|	for (i = 0; i < values->n; i++) {
  ------------------
  |  Branch (148:14): [True: 114k, False: 130k]
  ------------------
  149|   114k|		if (v < values->value[i])
  ------------------
  |  Branch (149:7): [True: 0, False: 114k]
  ------------------
  150|      0|			break;
  151|       |
  152|   114k|		if (v == values->value[i]) {
  ------------------
  |  Branch (152:7): [True: 0, False: 114k]
  ------------------
  153|      0|			if (y < values->y_pos[i])
  ------------------
  |  Branch (153:8): [True: 0, False: 0]
  ------------------
  154|      0|				break;
  155|       |
  156|      0|			if (y == values->y_pos[i])
  ------------------
  |  Branch (156:8): [True: 0, False: 0]
  ------------------
  157|      0|				if (x <= values->x_pos[i])
  ------------------
  |  Branch (157:9): [True: 0, False: 0]
  ------------------
  158|      0|					break;
  159|      0|		}
  160|   114k|	}
  161|       |
  162|       |	/* Array full?
  163|       |	 */
  164|   130k|	if (values->n == values->size) {
  ------------------
  |  Branch (164:6): [True: 114k, False: 15.6k]
  ------------------
  165|   114k|		if (i > 0) {
  ------------------
  |  Branch (165:7): [True: 114k, False: 0]
  ------------------
  166|       |			/* We need to move stuff to the left to make space,
  167|       |			 * shunting the smallest out.
  168|       |			 */
  169|   114k|			for (j = 0; j < i - 1; j++) {
  ------------------
  |  Branch (169:16): [True: 0, False: 114k]
  ------------------
  170|      0|				values->value[j] = values->value[j + 1];
  171|      0|				values->x_pos[j] = values->x_pos[j + 1];
  172|      0|				values->y_pos[j] = values->y_pos[j + 1];
  173|      0|			}
  174|   114k|			values->value[i - 1] = v;
  175|   114k|			values->x_pos[i - 1] = x;
  176|   114k|			values->y_pos[i - 1] = y;
  177|   114k|		}
  178|   114k|	}
  179|  15.6k|	else {
  180|       |		/* Not full, move stuff to the right into empty space.
  181|       |		 */
  182|  15.6k|		for (j = values->n; j > i; j--) {
  ------------------
  |  Branch (182:23): [True: 0, False: 15.6k]
  ------------------
  183|      0|			values->value[j] = values->value[j - 1];
  184|      0|			values->x_pos[j] = values->x_pos[j - 1];
  185|      0|			values->y_pos[j] = values->y_pos[j - 1];
  186|      0|		}
  187|  15.6k|		values->value[i] = v;
  188|  15.6k|		values->x_pos[i] = x;
  189|  15.6k|		values->y_pos[i] = y;
  190|  15.6k|		values->n += 1;
  191|  15.6k|	}
  192|   130k|}
max.c:vips_max_stop:
  282|  19.0k|{
  283|  19.0k|	VipsMax *max = (VipsMax *) statistic;
  284|  19.0k|	VipsValues *values = (VipsValues *) seq;
  285|       |
  286|  19.0k|	int i;
  287|       |
  288|  26.9k|	for (i = 0; i < values->n; i++)
  ------------------
  |  Branch (288:14): [True: 7.82k, False: 19.0k]
  ------------------
  289|  7.82k|		vips_values_add(&max->values,
  290|  7.82k|			values->value[i], values->x_pos[i], values->y_pos[i]);
  291|       |
  292|  19.0k|	g_free(values);
  293|       |
  294|  19.0k|	return 0;
  295|  19.0k|}
max.c:vips_max_init:
  503|  19.0k|{
  504|  19.0k|	max->size = 1;
  505|  19.0k|}

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|}

vips_min:
  550|  7.82k|{
  551|  7.82k|	va_list ap;
  552|  7.82k|	int result;
  553|       |
  554|  7.82k|	va_start(ap, out);
  555|  7.82k|	result = vips_call_split("min", ap, in, out);
  556|  7.82k|	va_end(ap);
  557|       |
  558|  7.82k|	return result;
  559|  7.82k|}
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|}
min.c:vips_min_build:
  200|  7.82k|{
  201|  7.82k|	VipsStatistic *statistic = VIPS_STATISTIC(object);
  ------------------
  |  |   40|  7.82k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  7.82k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  7.82k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  7.82k|		VIPS_TYPE_STATISTIC, VipsStatistic))
  ------------------
  202|  7.82k|	VipsMin *min = (VipsMin *) object;
  203|  7.82k|	VipsValues *values = &min->values;
  204|       |
  205|  7.82k|	vips_values_init(values, min);
  206|       |
  207|  7.82k|	if (VIPS_OBJECT_CLASS(vips_min_parent_class)->build(object))
  ------------------
  |  |  435|  7.82k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  7.82k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  7.82k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (207:6): [True: 0, False: 7.82k]
  ------------------
  208|      0|		return -1;
  209|       |
  210|       |	/* For speed we accumulate min ** 2 for complex.
  211|       |	 */
  212|  7.82k|	if (vips_band_format_iscomplex(
  ------------------
  |  Branch (212:6): [True: 0, False: 7.82k]
  ------------------
  213|  7.82k|			vips_image_get_format(statistic->in))) {
  214|      0|		int i;
  215|       |
  216|      0|		for (i = 0; i < values->n; i++)
  ------------------
  |  Branch (216:15): [True: 0, False: 0]
  ------------------
  217|      0|			values->value[i] = sqrt(values->value[i]);
  218|      0|	}
  219|       |
  220|       |	/* Don't set if there's no value (eg. if every pixel is NaN). This
  221|       |	 * will trigger an error later.
  222|       |	 */
  223|  7.82k|	if (values->n > 0) {
  ------------------
  |  Branch (223:6): [True: 7.82k, False: 1]
  ------------------
  224|  7.82k|		VipsArrayDouble *out_array;
  225|  7.82k|		VipsArrayInt *x_array;
  226|  7.82k|		VipsArrayInt *y_array;
  227|       |
  228|  7.82k|		out_array = vips_array_double_new(values->value, values->n);
  229|  7.82k|		x_array = vips_array_int_new(values->x_pos, values->n);
  230|  7.82k|		y_array = vips_array_int_new(values->y_pos, values->n);
  231|       |
  232|       |		/* We have to set the props via g_object_set() to stop vips
  233|       |		 * complaining they are unset.
  234|       |		 */
  235|  7.82k|		g_object_set(min,
  236|  7.82k|			"out", values->value[values->n - 1],
  237|  7.82k|			"x", values->x_pos[values->n - 1],
  238|  7.82k|			"y", values->y_pos[values->n - 1],
  239|  7.82k|			"out_array", out_array,
  240|  7.82k|			"x_array", x_array,
  241|  7.82k|			"y_array", y_array,
  242|  7.82k|			NULL);
  243|       |
  244|  7.82k|		vips_area_unref(VIPS_AREA(out_array));
  ------------------
  |  |  137|  7.82k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  245|  7.82k|		vips_area_unref(VIPS_AREA(x_array));
  ------------------
  |  |  137|  7.82k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  246|  7.82k|		vips_area_unref(VIPS_AREA(y_array));
  ------------------
  |  |  137|  7.82k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  247|  7.82k|	}
  248|       |
  249|       |#ifdef DEBUG
  250|       |	{
  251|       |		int i;
  252|       |
  253|       |		printf("vips_min_build: %d values found\n", values->n);
  254|       |		for (i = 0; i < values->n; i++)
  255|       |			printf("%d) %g\t%d\t%d\n",
  256|       |				i,
  257|       |				values->value[i],
  258|       |				values->x_pos[i], values->y_pos[i]);
  259|       |	}
  260|       |#endif /*DEBUG*/
  261|       |
  262|  7.82k|	return 0;
  263|  7.82k|}
min.c:vips_values_init:
  129|  15.6k|{
  130|  15.6k|	values->min = min;
  131|       |
  132|  15.6k|	values->size = min->size;
  133|  15.6k|	values->n = 0;
  134|  15.6k|	values->value = VIPS_ARRAY(min, values->size, double);
  ------------------
  |  |   72|  15.6k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  15.6k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  15.6k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  15.6k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  15.6k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  135|  15.6k|	values->x_pos = VIPS_ARRAY(min, values->size, int);
  ------------------
  |  |   72|  15.6k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  15.6k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  15.6k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  15.6k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  15.6k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  136|  15.6k|	values->y_pos = VIPS_ARRAY(min, values->size, int);
  ------------------
  |  |   72|  15.6k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  15.6k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  15.6k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  15.6k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  15.6k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  137|  15.6k|}
min.c:vips_min_start:
  269|  7.82k|{
  270|  7.82k|	VipsValues *values;
  271|       |
  272|  7.82k|	values = g_new(VipsValues, 1);
  ------------------
  |  |  282|  7.82k|#define g_new(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc)
  |  |  ------------------
  |  |  |  |  227|  7.82k|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|  7.82k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|  7.82k|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|  7.82k|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|  7.82k|	  gpointer __p;						\
  |  |  |  |  231|  7.82k|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 7.82k]
  |  |  |  |  ------------------
  |  |  |  |  232|  7.82k|	    __p = g_##func (__n);				\
  |  |  |  |  233|  7.82k|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 7.82k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|  7.82k|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 7.82k]
  |  |  |  |  |  Branch (234:26): [True: 7.82k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|  7.82k|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|  7.82k|	  else							\
  |  |  |  |  237|  7.82k|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|  7.82k|	  __p;							\
  |  |  |  |  239|  7.82k|	}))
  |  |  ------------------
  ------------------
  273|  7.82k|	vips_values_init(values, (VipsMin *) statistic);
  274|       |
  275|  7.82k|	return (void *) values;
  276|  7.82k|}
min.c:vips_min_scan:
  385|   250k|{
  386|   250k|	VipsValues *values = (VipsValues *) seq;
  387|   250k|	const int bands = vips_image_get_bands(statistic->in);
  388|   250k|	const int sz = n * bands;
  389|       |
  390|   250k|	int i;
  391|       |
  392|   250k|	switch (vips_image_get_format(statistic->in)) {
  393|   183k|	case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (393:2): [True: 183k, False: 67.2k]
  ------------------
  394|   183k|		LOOPU(unsigned char, 0);
  ------------------
  |  |  308|   183k|	{ \
  |  |  309|   183k|		TYPE *p = (TYPE *) in; \
  |  |  310|   183k|		TYPE m; \
  |  |  311|   183k|\
  |  |  312|   188k|		for (i = 0; i < sz && values->n < values->size; i++) \
  |  |  ------------------
  |  |  |  Branch (312:15): [True: 188k, False: 0]
  |  |  |  Branch (312:25): [True: 5.72k, False: 183k]
  |  |  ------------------
  |  |  313|   183k|			vips_values_add(values, p[i], x + i / bands, y); \
  |  |  314|   183k|		m = values->value[0]; \
  |  |  315|   183k|\
  |  |  316|  13.0M|		for (; i < sz; i++) { \
  |  |  ------------------
  |  |  |  Branch (316:10): [True: 12.8M, False: 180k]
  |  |  ------------------
  |  |  317|  12.8M|			if (p[i] < m) { \
  |  |  ------------------
  |  |  |  Branch (317:8): [True: 6.46k, False: 12.8M]
  |  |  ------------------
  |  |  318|  6.46k|				vips_values_add(values, p[i], x + i / bands, y); \
  |  |  319|  6.46k|				m = values->value[0]; \
  |  |  320|  6.46k|\
  |  |  321|  6.46k|				if (m <= LOWER) { \
  |  |  ------------------
  |  |  |  Branch (321:9): [True: 2.40k, False: 4.05k]
  |  |  ------------------
  |  |  322|  2.40k|					statistic->stop = TRUE; \
  |  |  ------------------
  |  |  |  |  798|  2.40k|#define	TRUE	(!FALSE)
  |  |  |  |  ------------------
  |  |  |  |  |  |  794|  2.40k|#define	FALSE	(0)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  323|  2.40k|					break; \
  |  |  324|  2.40k|				} \
  |  |  325|  6.46k|			} \
  |  |  326|  12.8M|		} \
  |  |  327|   183k|	}
  ------------------
  395|   183k|		break;
  396|  6.65k|	case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (396:2): [True: 6.65k, False: 243k]
  ------------------
  397|  6.65k|		LOOPU(signed char, SCHAR_MIN);
  ------------------
  |  |  308|  6.65k|	{ \
  |  |  309|  6.65k|		TYPE *p = (TYPE *) in; \
  |  |  310|  6.65k|		TYPE m; \
  |  |  311|  6.65k|\
  |  |  312|  6.86k|		for (i = 0; i < sz && values->n < values->size; i++) \
  |  |  ------------------
  |  |  |  Branch (312:15): [True: 6.86k, False: 0]
  |  |  |  Branch (312:25): [True: 208, False: 6.65k]
  |  |  ------------------
  |  |  313|  6.65k|			vips_values_add(values, p[i], x + i / bands, y); \
  |  |  314|  6.65k|		m = values->value[0]; \
  |  |  315|  6.65k|\
  |  |  316|   656k|		for (; i < sz; i++) { \
  |  |  ------------------
  |  |  |  Branch (316:10): [True: 650k, False: 6.55k]
  |  |  ------------------
  |  |  317|   650k|			if (p[i] < m) { \
  |  |  ------------------
  |  |  |  Branch (317:8): [True: 402, False: 649k]
  |  |  ------------------
  |  |  318|    402|				vips_values_add(values, p[i], x + i / bands, y); \
  |  |  319|    402|				m = values->value[0]; \
  |  |  320|    402|\
  |  |  321|    402|				if (m <= LOWER) { \
  |  |  ------------------
  |  |  |  Branch (321:9): [True: 101, False: 301]
  |  |  ------------------
  |  |  322|    101|					statistic->stop = TRUE; \
  |  |  ------------------
  |  |  |  |  798|    101|#define	TRUE	(!FALSE)
  |  |  |  |  ------------------
  |  |  |  |  |  |  794|    101|#define	FALSE	(0)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  323|    101|					break; \
  |  |  324|    101|				} \
  |  |  325|    402|			} \
  |  |  326|   650k|		} \
  |  |  327|  6.65k|	}
  ------------------
  398|  6.65k|		break;
  399|  12.3k|	case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (399:2): [True: 12.3k, False: 238k]
  ------------------
  400|  12.3k|		LOOPU(unsigned short, 0);
  ------------------
  |  |  308|  12.3k|	{ \
  |  |  309|  12.3k|		TYPE *p = (TYPE *) in; \
  |  |  310|  12.3k|		TYPE m; \
  |  |  311|  12.3k|\
  |  |  312|  12.7k|		for (i = 0; i < sz && values->n < values->size; i++) \
  |  |  ------------------
  |  |  |  Branch (312:15): [True: 12.7k, False: 0]
  |  |  |  Branch (312:25): [True: 386, False: 12.3k]
  |  |  ------------------
  |  |  313|  12.3k|			vips_values_add(values, p[i], x + i / bands, y); \
  |  |  314|  12.3k|		m = values->value[0]; \
  |  |  315|  12.3k|\
  |  |  316|   995k|		for (; i < sz; i++) { \
  |  |  ------------------
  |  |  |  Branch (316:10): [True: 983k, False: 12.1k]
  |  |  ------------------
  |  |  317|   983k|			if (p[i] < m) { \
  |  |  ------------------
  |  |  |  Branch (317:8): [True: 645, False: 983k]
  |  |  ------------------
  |  |  318|    645|				vips_values_add(values, p[i], x + i / bands, y); \
  |  |  319|    645|				m = values->value[0]; \
  |  |  320|    645|\
  |  |  321|    645|				if (m <= LOWER) { \
  |  |  ------------------
  |  |  |  Branch (321:9): [True: 190, False: 455]
  |  |  ------------------
  |  |  322|    190|					statistic->stop = TRUE; \
  |  |  ------------------
  |  |  |  |  798|    190|#define	TRUE	(!FALSE)
  |  |  |  |  ------------------
  |  |  |  |  |  |  794|    190|#define	FALSE	(0)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  323|    190|					break; \
  |  |  324|    190|				} \
  |  |  325|    645|			} \
  |  |  326|   983k|		} \
  |  |  327|  12.3k|	}
  ------------------
  401|  12.3k|		break;
  402|  8.57k|	case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (402:2): [True: 8.57k, False: 241k]
  ------------------
  403|  8.57k|		LOOPU(signed short, SHRT_MIN);
  ------------------
  |  |  308|  8.57k|	{ \
  |  |  309|  8.57k|		TYPE *p = (TYPE *) in; \
  |  |  310|  8.57k|		TYPE m; \
  |  |  311|  8.57k|\
  |  |  312|  8.84k|		for (i = 0; i < sz && values->n < values->size; i++) \
  |  |  ------------------
  |  |  |  Branch (312:15): [True: 8.84k, False: 0]
  |  |  |  Branch (312:25): [True: 268, False: 8.57k]
  |  |  ------------------
  |  |  313|  8.57k|			vips_values_add(values, p[i], x + i / bands, y); \
  |  |  314|  8.57k|		m = values->value[0]; \
  |  |  315|  8.57k|\
  |  |  316|   749k|		for (; i < sz; i++) { \
  |  |  ------------------
  |  |  |  Branch (316:10): [True: 740k, False: 8.50k]
  |  |  ------------------
  |  |  317|   740k|			if (p[i] < m) { \
  |  |  ------------------
  |  |  |  Branch (317:8): [True: 1.03k, False: 739k]
  |  |  ------------------
  |  |  318|  1.03k|				vips_values_add(values, p[i], x + i / bands, y); \
  |  |  319|  1.03k|				m = values->value[0]; \
  |  |  320|  1.03k|\
  |  |  321|  1.03k|				if (m <= LOWER) { \
  |  |  ------------------
  |  |  |  Branch (321:9): [True: 70, False: 961]
  |  |  ------------------
  |  |  322|     70|					statistic->stop = TRUE; \
  |  |  ------------------
  |  |  |  |  798|     70|#define	TRUE	(!FALSE)
  |  |  |  |  ------------------
  |  |  |  |  |  |  794|     70|#define	FALSE	(0)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  323|     70|					break; \
  |  |  324|     70|				} \
  |  |  325|  1.03k|			} \
  |  |  326|   740k|		} \
  |  |  327|  8.57k|	}
  ------------------
  404|  8.57k|		break;
  405|  15.6k|	case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (405:2): [True: 15.6k, False: 234k]
  ------------------
  406|  15.6k|		LOOPU(unsigned int, 0);
  ------------------
  |  |  308|  15.6k|	{ \
  |  |  309|  15.6k|		TYPE *p = (TYPE *) in; \
  |  |  310|  15.6k|		TYPE m; \
  |  |  311|  15.6k|\
  |  |  312|  16.1k|		for (i = 0; i < sz && values->n < values->size; i++) \
  |  |  ------------------
  |  |  |  Branch (312:15): [True: 16.1k, False: 0]
  |  |  |  Branch (312:25): [True: 490, False: 15.6k]
  |  |  ------------------
  |  |  313|  15.6k|			vips_values_add(values, p[i], x + i / bands, y); \
  |  |  314|  15.6k|		m = values->value[0]; \
  |  |  315|  15.6k|\
  |  |  316|  1.08M|		for (; i < sz; i++) { \
  |  |  ------------------
  |  |  |  Branch (316:10): [True: 1.06M, False: 15.5k]
  |  |  ------------------
  |  |  317|  1.06M|			if (p[i] < m) { \
  |  |  ------------------
  |  |  |  Branch (317:8): [True: 497, False: 1.06M]
  |  |  ------------------
  |  |  318|    497|				vips_values_add(values, p[i], x + i / bands, y); \
  |  |  319|    497|				m = values->value[0]; \
  |  |  320|    497|\
  |  |  321|    497|				if (m <= LOWER) { \
  |  |  ------------------
  |  |  |  Branch (321:9): [True: 123, False: 374]
  |  |  ------------------
  |  |  322|    123|					statistic->stop = TRUE; \
  |  |  ------------------
  |  |  |  |  798|    123|#define	TRUE	(!FALSE)
  |  |  |  |  ------------------
  |  |  |  |  |  |  794|    123|#define	FALSE	(0)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  323|    123|					break; \
  |  |  324|    123|				} \
  |  |  325|    497|			} \
  |  |  326|  1.06M|		} \
  |  |  327|  15.6k|	}
  ------------------
  407|  15.6k|		break;
  408|  7.87k|	case VIPS_FORMAT_INT:
  ------------------
  |  Branch (408:2): [True: 7.87k, False: 242k]
  ------------------
  409|  7.87k|		LOOPU(signed int, INT_MIN);
  ------------------
  |  |  308|  7.87k|	{ \
  |  |  309|  7.87k|		TYPE *p = (TYPE *) in; \
  |  |  310|  7.87k|		TYPE m; \
  |  |  311|  7.87k|\
  |  |  312|  8.11k|		for (i = 0; i < sz && values->n < values->size; i++) \
  |  |  ------------------
  |  |  |  Branch (312:15): [True: 8.11k, False: 0]
  |  |  |  Branch (312:25): [True: 246, False: 7.87k]
  |  |  ------------------
  |  |  313|  7.87k|			vips_values_add(values, p[i], x + i / bands, y); \
  |  |  314|  7.87k|		m = values->value[0]; \
  |  |  315|  7.87k|\
  |  |  316|   613k|		for (; i < sz; i++) { \
  |  |  ------------------
  |  |  |  Branch (316:10): [True: 605k, False: 7.82k]
  |  |  ------------------
  |  |  317|   605k|			if (p[i] < m) { \
  |  |  ------------------
  |  |  |  Branch (317:8): [True: 891, False: 604k]
  |  |  ------------------
  |  |  318|    891|				vips_values_add(values, p[i], x + i / bands, y); \
  |  |  319|    891|				m = values->value[0]; \
  |  |  320|    891|\
  |  |  321|    891|				if (m <= LOWER) { \
  |  |  ------------------
  |  |  |  Branch (321:9): [True: 47, False: 844]
  |  |  ------------------
  |  |  322|     47|					statistic->stop = TRUE; \
  |  |  ------------------
  |  |  |  |  798|     47|#define	TRUE	(!FALSE)
  |  |  |  |  ------------------
  |  |  |  |  |  |  794|     47|#define	FALSE	(0)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  323|     47|					break; \
  |  |  324|     47|				} \
  |  |  325|    891|			} \
  |  |  326|   605k|		} \
  |  |  327|  7.87k|	}
  ------------------
  410|  7.87k|		break;
  411|       |
  412|  16.1k|	case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (412:2): [True: 16.1k, False: 234k]
  ------------------
  413|  16.1k|		LOOPF(float);
  ------------------
  |  |  335|  16.1k|	{ \
  |  |  336|  16.1k|		TYPE *p = (TYPE *) in; \
  |  |  337|  16.1k|		TYPE m; \
  |  |  338|  16.1k|\
  |  |  339|  18.8k|		for (i = 0; i < sz && values->n < values->size; i++) \
  |  |  ------------------
  |  |  |  Branch (339:15): [True: 18.7k, False: 32]
  |  |  |  Branch (339:25): [True: 2.65k, False: 16.1k]
  |  |  ------------------
  |  |  340|  16.1k|			if (!VIPS_ISNAN(p[i])) \
  |  |  ------------------
  |  |  |  |   71|  2.65k|#define VIPS_ISNAN(V) __builtin_isnan(V)
  |  |  ------------------
  |  |  |  Branch (340:8): [True: 504, False: 2.14k]
  |  |  ------------------
  |  |  341|  2.65k|				vips_values_add(values, p[i], x + i / bands, y); \
  |  |  342|  16.1k|		m = values->value[0]; \
  |  |  343|  16.1k|\
  |  |  344|  1.54M|		for (; i < sz; i++) \
  |  |  ------------------
  |  |  |  Branch (344:10): [True: 1.52M, False: 16.1k]
  |  |  ------------------
  |  |  345|  1.52M|			if (p[i] < m) { \
  |  |  ------------------
  |  |  |  Branch (345:8): [True: 1.13k, False: 1.52M]
  |  |  ------------------
  |  |  346|  1.13k|				vips_values_add(values, p[i], x + i / bands, y); \
  |  |  347|  1.13k|				m = values->value[0]; \
  |  |  348|  1.13k|			} \
  |  |  349|  16.1k|	}
  ------------------
  414|  16.1k|		break;
  415|      0|	case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (415:2): [True: 0, False: 250k]
  ------------------
  416|      0|		LOOPF(double);
  ------------------
  |  |  335|      0|	{ \
  |  |  336|      0|		TYPE *p = (TYPE *) in; \
  |  |  337|      0|		TYPE m; \
  |  |  338|      0|\
  |  |  339|      0|		for (i = 0; i < sz && values->n < values->size; i++) \
  |  |  ------------------
  |  |  |  Branch (339:15): [True: 0, False: 0]
  |  |  |  Branch (339:25): [True: 0, False: 0]
  |  |  ------------------
  |  |  340|      0|			if (!VIPS_ISNAN(p[i])) \
  |  |  ------------------
  |  |  |  |   71|      0|#define VIPS_ISNAN(V) __builtin_isnan(V)
  |  |  ------------------
  |  |  |  Branch (340:8): [True: 0, False: 0]
  |  |  ------------------
  |  |  341|      0|				vips_values_add(values, p[i], x + i / bands, y); \
  |  |  342|      0|		m = values->value[0]; \
  |  |  343|      0|\
  |  |  344|      0|		for (; i < sz; i++) \
  |  |  ------------------
  |  |  |  Branch (344:10): [True: 0, False: 0]
  |  |  ------------------
  |  |  345|      0|			if (p[i] < m) { \
  |  |  ------------------
  |  |  |  Branch (345:8): [True: 0, False: 0]
  |  |  ------------------
  |  |  346|      0|				vips_values_add(values, p[i], x + i / bands, y); \
  |  |  347|      0|				m = values->value[0]; \
  |  |  348|      0|			} \
  |  |  349|      0|	}
  ------------------
  417|      0|		break;
  418|       |
  419|      0|	case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (419:2): [True: 0, False: 250k]
  ------------------
  420|      0|		LOOPC(float);
  ------------------
  |  |  354|      0|	{ \
  |  |  355|      0|		TYPE *p = (TYPE *) in; \
  |  |  356|      0|		TYPE m; \
  |  |  357|      0|\
  |  |  358|      0|		for (i = 0; i < sz && values->n < values->size; i++) { \
  |  |  ------------------
  |  |  |  Branch (358:15): [True: 0, False: 0]
  |  |  |  Branch (358:25): [True: 0, False: 0]
  |  |  ------------------
  |  |  359|      0|			TYPE mod2 = p[0] * p[0] + p[1] * p[1]; \
  |  |  360|      0|\
  |  |  361|      0|			if (!VIPS_ISNAN(mod2)) \
  |  |  ------------------
  |  |  |  |   71|      0|#define VIPS_ISNAN(V) __builtin_isnan(V)
  |  |  ------------------
  |  |  |  Branch (361:8): [True: 0, False: 0]
  |  |  ------------------
  |  |  362|      0|				vips_values_add(values, p[i], x + i / bands, y); \
  |  |  363|      0|\
  |  |  364|      0|			p += 2; \
  |  |  365|      0|		} \
  |  |  366|      0|		m = values->value[0]; \
  |  |  367|      0|\
  |  |  368|      0|		for (; i < sz; i++) { \
  |  |  ------------------
  |  |  |  Branch (368:10): [True: 0, False: 0]
  |  |  ------------------
  |  |  369|      0|			TYPE mod2 = p[0] * p[0] + p[1] * p[1]; \
  |  |  370|      0|\
  |  |  371|      0|			if (mod2 < m) { \
  |  |  ------------------
  |  |  |  Branch (371:8): [True: 0, False: 0]
  |  |  ------------------
  |  |  372|      0|				vips_values_add(values, mod2, x + i / bands, y); \
  |  |  373|      0|				m = values->value[0]; \
  |  |  374|      0|			} \
  |  |  375|      0|\
  |  |  376|      0|			p += 2; \
  |  |  377|      0|		} \
  |  |  378|      0|	}
  ------------------
  421|      0|		break;
  422|      0|	case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (422:2): [True: 0, False: 250k]
  ------------------
  423|      0|		LOOPC(double);
  ------------------
  |  |  354|      0|	{ \
  |  |  355|      0|		TYPE *p = (TYPE *) in; \
  |  |  356|      0|		TYPE m; \
  |  |  357|      0|\
  |  |  358|      0|		for (i = 0; i < sz && values->n < values->size; i++) { \
  |  |  ------------------
  |  |  |  Branch (358:15): [True: 0, False: 0]
  |  |  |  Branch (358:25): [True: 0, False: 0]
  |  |  ------------------
  |  |  359|      0|			TYPE mod2 = p[0] * p[0] + p[1] * p[1]; \
  |  |  360|      0|\
  |  |  361|      0|			if (!VIPS_ISNAN(mod2)) \
  |  |  ------------------
  |  |  |  |   71|      0|#define VIPS_ISNAN(V) __builtin_isnan(V)
  |  |  ------------------
  |  |  |  Branch (361:8): [True: 0, False: 0]
  |  |  ------------------
  |  |  362|      0|				vips_values_add(values, p[i], x + i / bands, y); \
  |  |  363|      0|\
  |  |  364|      0|			p += 2; \
  |  |  365|      0|		} \
  |  |  366|      0|		m = values->value[0]; \
  |  |  367|      0|\
  |  |  368|      0|		for (; i < sz; i++) { \
  |  |  ------------------
  |  |  |  Branch (368:10): [True: 0, False: 0]
  |  |  ------------------
  |  |  369|      0|			TYPE mod2 = p[0] * p[0] + p[1] * p[1]; \
  |  |  370|      0|\
  |  |  371|      0|			if (mod2 < m) { \
  |  |  ------------------
  |  |  |  Branch (371:8): [True: 0, False: 0]
  |  |  ------------------
  |  |  372|      0|				vips_values_add(values, mod2, x + i / bands, y); \
  |  |  373|      0|				m = values->value[0]; \
  |  |  374|      0|			} \
  |  |  375|      0|\
  |  |  376|      0|			p += 2; \
  |  |  377|      0|		} \
  |  |  378|      0|	}
  ------------------
  424|      0|		break;
  425|       |
  426|      0|	default:
  ------------------
  |  Branch (426:2): [True: 0, False: 250k]
  ------------------
  427|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  428|   250k|	}
  429|       |
  430|   250k|	return 0;
  431|   250k|}
min.c:vips_values_add:
  143|  26.7k|{
  144|  26.7k|	int i, j;
  145|       |
  146|       |	/* Find insertion point.
  147|       |	 */
  148|  37.7k|	for (i = 0; i < values->n; i++) {
  ------------------
  |  Branch (148:14): [True: 11.0k, False: 26.7k]
  ------------------
  149|  11.0k|		if (v > values->value[i])
  ------------------
  |  Branch (149:7): [True: 0, False: 11.0k]
  ------------------
  150|      0|			break;
  151|       |
  152|  11.0k|		if (v == values->value[i]) {
  ------------------
  |  Branch (152:7): [True: 0, False: 11.0k]
  ------------------
  153|      0|			if (y < values->y_pos[i])
  ------------------
  |  Branch (153:8): [True: 0, False: 0]
  ------------------
  154|      0|				break;
  155|       |
  156|      0|			if (y == values->y_pos[i])
  ------------------
  |  Branch (156:8): [True: 0, False: 0]
  ------------------
  157|      0|				if (x <= values->x_pos[i])
  ------------------
  |  Branch (157:9): [True: 0, False: 0]
  ------------------
  158|      0|					break;
  159|      0|		}
  160|  11.0k|	}
  161|       |
  162|       |	/* Array full?
  163|       |	 */
  164|  26.7k|	if (values->n == values->size) {
  ------------------
  |  Branch (164:6): [True: 11.0k, False: 15.6k]
  ------------------
  165|  11.0k|		if (i > 0) {
  ------------------
  |  Branch (165:7): [True: 11.0k, False: 0]
  ------------------
  166|       |			/* We need to move stuff to the left to make space,
  167|       |			 * shunting the largest out.
  168|       |			 */
  169|  11.0k|			for (j = 0; j < i - 1; j++) {
  ------------------
  |  Branch (169:16): [True: 0, False: 11.0k]
  ------------------
  170|      0|				values->value[j] = values->value[j + 1];
  171|      0|				values->x_pos[j] = values->x_pos[j + 1];
  172|      0|				values->y_pos[j] = values->y_pos[j + 1];
  173|      0|			}
  174|  11.0k|			values->value[i - 1] = v;
  175|  11.0k|			values->x_pos[i - 1] = x;
  176|  11.0k|			values->y_pos[i - 1] = y;
  177|  11.0k|		}
  178|  11.0k|	}
  179|  15.6k|	else {
  180|       |		/* Not full, move stuff to the right into empty space.
  181|       |		 */
  182|  15.6k|		for (j = values->n; j > i; j--) {
  ------------------
  |  Branch (182:23): [True: 0, False: 15.6k]
  ------------------
  183|      0|			values->value[j] = values->value[j - 1];
  184|      0|			values->x_pos[j] = values->x_pos[j - 1];
  185|      0|			values->y_pos[j] = values->y_pos[j - 1];
  186|      0|		}
  187|  15.6k|		values->value[i] = v;
  188|  15.6k|		values->x_pos[i] = x;
  189|  15.6k|		values->y_pos[i] = y;
  190|  15.6k|		values->n += 1;
  191|  15.6k|	}
  192|  26.7k|}
min.c:vips_min_stop:
  282|  7.82k|{
  283|  7.82k|	VipsMin *min = (VipsMin *) statistic;
  284|  7.82k|	VipsValues *values = (VipsValues *) seq;
  285|       |
  286|  7.82k|	int i;
  287|       |
  288|  15.6k|	for (i = 0; i < values->n; i++)
  ------------------
  |  Branch (288:14): [True: 7.82k, False: 7.82k]
  ------------------
  289|  7.82k|		vips_values_add(&min->values,
  290|  7.82k|			values->value[i], values->x_pos[i], values->y_pos[i]);
  291|       |
  292|  7.82k|	g_free(values);
  293|       |
  294|  7.82k|	return 0;
  295|  7.82k|}
min.c:vips_min_init:
  503|  7.82k|{
  504|  7.82k|	min->size = 1;
  505|  7.82k|}

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|}

vips_multiply:
  292|   114k|{
  293|   114k|	va_list ap;
  294|   114k|	int result;
  295|       |
  296|   114k|	va_start(ap, out);
  297|   114k|	result = vips_call_split("multiply", ap, left, right, out);
  298|   114k|	va_end(ap);
  299|       |
  300|   114k|	return result;
  301|   114k|}
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|}
multiply.c:vips_multiply_buffer:
  120|  1.13M|{
  121|  1.13M|	VipsImage *im = arithmetic->ready[0];
  122|  1.13M|	const int sz = width * vips_image_get_bands(im);
  123|       |
  124|  1.13M|	int x;
  125|       |
  126|       |	/* Keep types here in sync with vips_bandfmt_multiply[]
  127|       |	 * below.
  128|       |	 */
  129|  1.13M|	switch (vips_image_get_format(im)) {
  130|      0|	case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (130:2): [True: 0, False: 1.13M]
  ------------------
  131|      0|		RLOOP(signed char, signed short);
  ------------------
  |  |  108|      0|	{ \
  |  |  109|      0|		IN *restrict left = (IN *) in[0]; \
  |  |  110|      0|		IN *restrict right = (IN *) in[1]; \
  |  |  111|      0|		OUT *restrict q = (OUT *) out; \
  |  |  112|      0|\
  |  |  113|      0|		for (x = 0; x < sz; x++) \
  |  |  ------------------
  |  |  |  Branch (113:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  114|      0|			q[x] = left[x] * right[x]; \
  |  |  115|      0|	}
  ------------------
  132|      0|		break;
  133|      0|	case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (133:2): [True: 0, False: 1.13M]
  ------------------
  134|      0|		RLOOP(unsigned char, signed short);
  ------------------
  |  |  108|      0|	{ \
  |  |  109|      0|		IN *restrict left = (IN *) in[0]; \
  |  |  110|      0|		IN *restrict right = (IN *) in[1]; \
  |  |  111|      0|		OUT *restrict q = (OUT *) out; \
  |  |  112|      0|\
  |  |  113|      0|		for (x = 0; x < sz; x++) \
  |  |  ------------------
  |  |  |  Branch (113:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  114|      0|			q[x] = left[x] * right[x]; \
  |  |  115|      0|	}
  ------------------
  135|      0|		break;
  136|      0|	case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (136:2): [True: 0, False: 1.13M]
  ------------------
  137|      0|		RLOOP(signed short, signed int);
  ------------------
  |  |  108|      0|	{ \
  |  |  109|      0|		IN *restrict left = (IN *) in[0]; \
  |  |  110|      0|		IN *restrict right = (IN *) in[1]; \
  |  |  111|      0|		OUT *restrict q = (OUT *) out; \
  |  |  112|      0|\
  |  |  113|      0|		for (x = 0; x < sz; x++) \
  |  |  ------------------
  |  |  |  Branch (113:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  114|      0|			q[x] = left[x] * right[x]; \
  |  |  115|      0|	}
  ------------------
  138|      0|		break;
  139|      0|	case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (139:2): [True: 0, False: 1.13M]
  ------------------
  140|      0|		RLOOP(unsigned short, signed int);
  ------------------
  |  |  108|      0|	{ \
  |  |  109|      0|		IN *restrict left = (IN *) in[0]; \
  |  |  110|      0|		IN *restrict right = (IN *) in[1]; \
  |  |  111|      0|		OUT *restrict q = (OUT *) out; \
  |  |  112|      0|\
  |  |  113|      0|		for (x = 0; x < sz; x++) \
  |  |  ------------------
  |  |  |  Branch (113:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  114|      0|			q[x] = left[x] * right[x]; \
  |  |  115|      0|	}
  ------------------
  141|      0|		break;
  142|      0|	case VIPS_FORMAT_INT:
  ------------------
  |  Branch (142:2): [True: 0, False: 1.13M]
  ------------------
  143|      0|		RLOOP(signed int, signed int);
  ------------------
  |  |  108|      0|	{ \
  |  |  109|      0|		IN *restrict left = (IN *) in[0]; \
  |  |  110|      0|		IN *restrict right = (IN *) in[1]; \
  |  |  111|      0|		OUT *restrict q = (OUT *) out; \
  |  |  112|      0|\
  |  |  113|      0|		for (x = 0; x < sz; x++) \
  |  |  ------------------
  |  |  |  Branch (113:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  114|      0|			q[x] = left[x] * right[x]; \
  |  |  115|      0|	}
  ------------------
  144|      0|		break;
  145|      0|	case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (145:2): [True: 0, False: 1.13M]
  ------------------
  146|      0|		RLOOP(unsigned int, signed int);
  ------------------
  |  |  108|      0|	{ \
  |  |  109|      0|		IN *restrict left = (IN *) in[0]; \
  |  |  110|      0|		IN *restrict right = (IN *) in[1]; \
  |  |  111|      0|		OUT *restrict q = (OUT *) out; \
  |  |  112|      0|\
  |  |  113|      0|		for (x = 0; x < sz; x++) \
  |  |  ------------------
  |  |  |  Branch (113:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  114|      0|			q[x] = left[x] * right[x]; \
  |  |  115|      0|	}
  ------------------
  147|      0|		break;
  148|  1.13M|	case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (148:2): [True: 1.13M, False: 0]
  ------------------
  149|  1.13M|		RLOOP(float, float);
  ------------------
  |  |  108|  1.13M|	{ \
  |  |  109|  1.13M|		IN *restrict left = (IN *) in[0]; \
  |  |  110|  1.13M|		IN *restrict right = (IN *) in[1]; \
  |  |  111|  1.13M|		OUT *restrict q = (OUT *) out; \
  |  |  112|  1.13M|\
  |  |  113|  37.5M|		for (x = 0; x < sz; x++) \
  |  |  ------------------
  |  |  |  Branch (113:15): [True: 36.3M, False: 1.13M]
  |  |  ------------------
  |  |  114|  36.3M|			q[x] = left[x] * right[x]; \
  |  |  115|  1.13M|	}
  ------------------
  150|  1.13M|		break;
  151|      0|	case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (151:2): [True: 0, False: 1.13M]
  ------------------
  152|      0|		RLOOP(double, double);
  ------------------
  |  |  108|      0|	{ \
  |  |  109|      0|		IN *restrict left = (IN *) in[0]; \
  |  |  110|      0|		IN *restrict right = (IN *) in[1]; \
  |  |  111|      0|		OUT *restrict q = (OUT *) out; \
  |  |  112|      0|\
  |  |  113|      0|		for (x = 0; x < sz; x++) \
  |  |  ------------------
  |  |  |  Branch (113:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  114|      0|			q[x] = left[x] * right[x]; \
  |  |  115|      0|	}
  ------------------
  153|      0|		break;
  154|       |
  155|      0|	case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (155:2): [True: 0, False: 1.13M]
  ------------------
  156|      0|		CLOOP(float);
  ------------------
  |  |   84|      0|	{ \
  |  |   85|      0|		TYPE *restrict left = (TYPE *) in[0]; \
  |  |   86|      0|		TYPE *restrict right = (TYPE *) in[1]; \
  |  |   87|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |   88|      0|\
  |  |   89|      0|		for (x = 0; x < sz; x++) { \
  |  |  ------------------
  |  |  |  Branch (89:15): [True: 0, False: 0]
  |  |  ------------------
  |  |   90|      0|			double x1 = left[0]; \
  |  |   91|      0|			double y1 = left[1]; \
  |  |   92|      0|			double x2 = right[0]; \
  |  |   93|      0|			double y2 = right[1]; \
  |  |   94|      0|\
  |  |   95|      0|			left += 2; \
  |  |   96|      0|			right += 2; \
  |  |   97|      0|\
  |  |   98|      0|			q[0] = x1 * x2 - y1 * y2; \
  |  |   99|      0|			q[1] = x1 * y2 + x2 * y1; \
  |  |  100|      0|\
  |  |  101|      0|			q += 2; \
  |  |  102|      0|		} \
  |  |  103|      0|	}
  ------------------
  157|      0|		break;
  158|      0|	case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (158:2): [True: 0, False: 1.13M]
  ------------------
  159|      0|		CLOOP(double);
  ------------------
  |  |   84|      0|	{ \
  |  |   85|      0|		TYPE *restrict left = (TYPE *) in[0]; \
  |  |   86|      0|		TYPE *restrict right = (TYPE *) in[1]; \
  |  |   87|      0|		TYPE *restrict q = (TYPE *) out; \
  |  |   88|      0|\
  |  |   89|      0|		for (x = 0; x < sz; x++) { \
  |  |  ------------------
  |  |  |  Branch (89:15): [True: 0, False: 0]
  |  |  ------------------
  |  |   90|      0|			double x1 = left[0]; \
  |  |   91|      0|			double y1 = left[1]; \
  |  |   92|      0|			double x2 = right[0]; \
  |  |   93|      0|			double y2 = right[1]; \
  |  |   94|      0|\
  |  |   95|      0|			left += 2; \
  |  |   96|      0|			right += 2; \
  |  |   97|      0|\
  |  |   98|      0|			q[0] = x1 * x2 - y1 * y2; \
  |  |   99|      0|			q[1] = x1 * y2 + x2 * y1; \
  |  |  100|      0|\
  |  |  101|      0|			q += 2; \
  |  |  102|      0|		} \
  |  |  103|      0|	}
  ------------------
  160|      0|		break;
  161|       |
  162|      0|	default:
  ------------------
  |  Branch (162:2): [True: 0, False: 1.13M]
  ------------------
  163|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  164|  1.13M|	}
  165|  1.13M|}
multiply.c:vips_multiply_init:
  204|   114k|{
  205|   114k|}

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|}
nary.c:vips_nary_build:
   55|  57.2k|{
   56|  57.2k|	VipsArithmetic *arithmetic = VIPS_ARITHMETIC(object);
  ------------------
  |  |   42|  57.2k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  57.2k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  57.2k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|  57.2k|		VIPS_TYPE_ARITHMETIC, VipsArithmetic))
  ------------------
   57|  57.2k|	VipsNary *nary = VIPS_NARY(object);
  ------------------
  |  |   44|  57.2k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_NARY, VipsNary))
  |  |  ------------------
  |  |  |  |  484|  57.2k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  57.2k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   58|       |
   59|  57.2k|	if (nary->in) {
  ------------------
  |  Branch (59:6): [True: 57.2k, False: 0]
  ------------------
   60|  57.2k|		arithmetic->in = nary->in->data;
   61|  57.2k|		arithmetic->n = nary->in->n;
   62|  57.2k|	}
   63|       |
   64|  57.2k|	if (VIPS_OBJECT_CLASS(vips_nary_parent_class)->build(object))
  ------------------
  |  |  435|  57.2k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  57.2k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  57.2k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (64:6): [True: 0, False: 57.2k]
  ------------------
   65|      0|		return -1;
   66|       |
   67|  57.2k|	return 0;
   68|  57.2k|}
nary.c:vips_nary_init:
   96|  57.2k|{
   97|       |	/* Init our instance fields.
   98|       |	 */
   99|  57.2k|}

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|}

vips_more_const1:
  995|  19.0k|{
  996|  19.0k|	va_list ap;
  997|  19.0k|	int result;
  998|       |
  999|  19.0k|	va_start(ap, c);
 1000|  19.0k|	result = vips_relational_constv(in, out,
 1001|  19.0k|		VIPS_OPERATION_RELATIONAL_MORE, &c, 1, ap);
 1002|  19.0k|	va_end(ap);
 1003|       |
 1004|  19.0k|	return result;
 1005|  19.0k|}
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|}
relational.c:vips_relational_const_buffer:
  521|   252k|{
  522|   252k|	VipsUnaryConst *uconst = (VipsUnaryConst *) arithmetic;
  523|   252k|	VipsRelationalConst *rconst = (VipsRelationalConst *) arithmetic;
  524|   252k|	VipsImage *im = arithmetic->ready[0];
  525|   252k|	int bands = im->Bands;
  526|   252k|	gboolean is_int = uconst->is_int &&
  ------------------
  |  Branch (526:20): [True: 252k, False: 0]
  ------------------
  527|   252k|		vips_band_format_isint(im->BandFmt);
  ------------------
  |  Branch (527:3): [True: 0, False: 252k]
  ------------------
  528|       |
  529|   252k|	int i, x, b;
  530|       |
  531|   252k|	switch (rconst->relational) {
  532|      0|	case VIPS_OPERATION_RELATIONAL_EQUAL:
  ------------------
  |  Branch (532:2): [True: 0, False: 252k]
  ------------------
  533|      0|		if (is_int) {
  ------------------
  |  Branch (533:7): [True: 0, False: 0]
  ------------------
  534|      0|			SWITCH(RLOOPCI, CLOOPC, ==, CEQUAL);
  ------------------
  |  |  117|      0|	switch (vips_image_get_format(im)) { \
  |  |  118|      0|	case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (118:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  119|      0|		R(unsigned char, ROP); \
  |  |  ------------------
  |  |  |  |  534|      0|			SWITCH(RLOOPCI, CLOOPC, ==, CEQUAL);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  120|      0|		break; \
  |  |  121|      0|	case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (121:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  122|      0|		R(signed char, ROP); \
  |  |  ------------------
  |  |  |  |  534|      0|			SWITCH(RLOOPCI, CLOOPC, ==, CEQUAL);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  123|      0|		break; \
  |  |  124|      0|	case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (124:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  125|      0|		R(unsigned short, ROP); \
  |  |  ------------------
  |  |  |  |  534|      0|			SWITCH(RLOOPCI, CLOOPC, ==, CEQUAL);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  126|      0|		break; \
  |  |  127|      0|	case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (127:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  128|      0|		R(signed short, ROP); \
  |  |  ------------------
  |  |  |  |  534|      0|			SWITCH(RLOOPCI, CLOOPC, ==, CEQUAL);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  129|      0|		break; \
  |  |  130|      0|	case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (130:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  131|      0|		R(unsigned int, ROP); \
  |  |  ------------------
  |  |  |  |  534|      0|			SWITCH(RLOOPCI, CLOOPC, ==, CEQUAL);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      0|		break; \
  |  |  133|      0|	case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (133:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  134|      0|		R(signed int, ROP); \
  |  |  ------------------
  |  |  |  |  534|      0|			SWITCH(RLOOPCI, CLOOPC, ==, CEQUAL);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  135|      0|		break; \
  |  |  136|      0|	case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (136:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  137|      0|		R(float, ROP); \
  |  |  ------------------
  |  |  |  |  534|      0|			SWITCH(RLOOPCI, CLOOPC, ==, CEQUAL);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  138|      0|		break; \
  |  |  139|      0|	case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (139:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  140|      0|		R(double, ROP); \
  |  |  ------------------
  |  |  |  |  534|      0|			SWITCH(RLOOPCI, CLOOPC, ==, CEQUAL);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  141|      0|		break; \
  |  |  142|      0|	case VIPS_FORMAT_COMPLEX: \
  |  |  ------------------
  |  |  |  Branch (142:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|      0|		C(float, COP); \
  |  |  ------------------
  |  |  |  |  534|      0|			SWITCH(RLOOPCI, CLOOPC, ==, CEQUAL);
  |  |  |  |  ------------------
  |  |  |  |  |  |  503|      0|	{ \
  |  |  |  |  |  |  504|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  505|      0|\
  |  |  |  |  |  |  506|      0|		for (i = 0, x = 0; x < width; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (506:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  507|      0|			double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  508|      0|\
  |  |  |  |  |  |  509|      0|			for (b = 0; b < bands; b++, i++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (509:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|				out[i] = OP(p[0], p[1], c[0], c[1]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  534|      0|			SWITCH(RLOOPCI, CLOOPC, ==, CEQUAL);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  153|      0|#define CEQUAL(x1, y1, x2, y2) (x1 == x2 && y1 == y2)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (153:33): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  Branch (153:45): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  511|      0|\
  |  |  |  |  |  |  512|      0|				p += 2; \
  |  |  |  |  |  |  513|      0|				c += 2; \
  |  |  |  |  |  |  514|      0|			} \
  |  |  |  |  |  |  515|      0|		} \
  |  |  |  |  |  |  516|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  144|      0|		break; \
  |  |  145|      0|	case VIPS_FORMAT_DPCOMPLEX: \
  |  |  ------------------
  |  |  |  Branch (145:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  146|      0|		C(double, COP); \
  |  |  ------------------
  |  |  |  |  534|      0|			SWITCH(RLOOPCI, CLOOPC, ==, CEQUAL);
  |  |  |  |  ------------------
  |  |  |  |  |  |  503|      0|	{ \
  |  |  |  |  |  |  504|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  505|      0|\
  |  |  |  |  |  |  506|      0|		for (i = 0, x = 0; x < width; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (506:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  507|      0|			double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  508|      0|\
  |  |  |  |  |  |  509|      0|			for (b = 0; b < bands; b++, i++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (509:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|				out[i] = OP(p[0], p[1], c[0], c[1]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  534|      0|			SWITCH(RLOOPCI, CLOOPC, ==, CEQUAL);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  153|      0|#define CEQUAL(x1, y1, x2, y2) (x1 == x2 && y1 == y2)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (153:33): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  Branch (153:45): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  511|      0|\
  |  |  |  |  |  |  512|      0|				p += 2; \
  |  |  |  |  |  |  513|      0|				c += 2; \
  |  |  |  |  |  |  514|      0|			} \
  |  |  |  |  |  |  515|      0|		} \
  |  |  |  |  |  |  516|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  147|      0|		break; \
  |  |  148|      0|\
  |  |  149|      0|	default: \
  |  |  ------------------
  |  |  |  Branch (149:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  150|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      0|	}
  ------------------
  535|      0|		}
  536|      0|		else {
  537|      0|			SWITCH(RLOOPCF, CLOOPC, ==, CEQUAL);
  ------------------
  |  |  117|      0|	switch (vips_image_get_format(im)) { \
  |  |  118|      0|	case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (118:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  119|      0|		R(unsigned char, ROP); \
  |  |  ------------------
  |  |  |  |  537|      0|			SWITCH(RLOOPCF, CLOOPC, ==, CEQUAL);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  120|      0|		break; \
  |  |  121|      0|	case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (121:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  122|      0|		R(signed char, ROP); \
  |  |  ------------------
  |  |  |  |  537|      0|			SWITCH(RLOOPCF, CLOOPC, ==, CEQUAL);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  123|      0|		break; \
  |  |  124|      0|	case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (124:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  125|      0|		R(unsigned short, ROP); \
  |  |  ------------------
  |  |  |  |  537|      0|			SWITCH(RLOOPCF, CLOOPC, ==, CEQUAL);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  126|      0|		break; \
  |  |  127|      0|	case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (127:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  128|      0|		R(signed short, ROP); \
  |  |  ------------------
  |  |  |  |  537|      0|			SWITCH(RLOOPCF, CLOOPC, ==, CEQUAL);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  129|      0|		break; \
  |  |  130|      0|	case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (130:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  131|      0|		R(unsigned int, ROP); \
  |  |  ------------------
  |  |  |  |  537|      0|			SWITCH(RLOOPCF, CLOOPC, ==, CEQUAL);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      0|		break; \
  |  |  133|      0|	case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (133:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  134|      0|		R(signed int, ROP); \
  |  |  ------------------
  |  |  |  |  537|      0|			SWITCH(RLOOPCF, CLOOPC, ==, CEQUAL);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  135|      0|		break; \
  |  |  136|      0|	case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (136:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  137|      0|		R(float, ROP); \
  |  |  ------------------
  |  |  |  |  537|      0|			SWITCH(RLOOPCF, CLOOPC, ==, CEQUAL);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  138|      0|		break; \
  |  |  139|      0|	case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (139:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  140|      0|		R(double, ROP); \
  |  |  ------------------
  |  |  |  |  537|      0|			SWITCH(RLOOPCF, CLOOPC, ==, CEQUAL);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  141|      0|		break; \
  |  |  142|      0|	case VIPS_FORMAT_COMPLEX: \
  |  |  ------------------
  |  |  |  Branch (142:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|      0|		C(float, COP); \
  |  |  ------------------
  |  |  |  |  537|      0|			SWITCH(RLOOPCF, CLOOPC, ==, CEQUAL);
  |  |  |  |  ------------------
  |  |  |  |  |  |  503|      0|	{ \
  |  |  |  |  |  |  504|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  505|      0|\
  |  |  |  |  |  |  506|      0|		for (i = 0, x = 0; x < width; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (506:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  507|      0|			double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  508|      0|\
  |  |  |  |  |  |  509|      0|			for (b = 0; b < bands; b++, i++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (509:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|				out[i] = OP(p[0], p[1], c[0], c[1]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  537|      0|			SWITCH(RLOOPCF, CLOOPC, ==, CEQUAL);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  153|      0|#define CEQUAL(x1, y1, x2, y2) (x1 == x2 && y1 == y2)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (153:33): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  Branch (153:45): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  511|      0|\
  |  |  |  |  |  |  512|      0|				p += 2; \
  |  |  |  |  |  |  513|      0|				c += 2; \
  |  |  |  |  |  |  514|      0|			} \
  |  |  |  |  |  |  515|      0|		} \
  |  |  |  |  |  |  516|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  144|      0|		break; \
  |  |  145|      0|	case VIPS_FORMAT_DPCOMPLEX: \
  |  |  ------------------
  |  |  |  Branch (145:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  146|      0|		C(double, COP); \
  |  |  ------------------
  |  |  |  |  537|      0|			SWITCH(RLOOPCF, CLOOPC, ==, CEQUAL);
  |  |  |  |  ------------------
  |  |  |  |  |  |  503|      0|	{ \
  |  |  |  |  |  |  504|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  505|      0|\
  |  |  |  |  |  |  506|      0|		for (i = 0, x = 0; x < width; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (506:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  507|      0|			double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  508|      0|\
  |  |  |  |  |  |  509|      0|			for (b = 0; b < bands; b++, i++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (509:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|				out[i] = OP(p[0], p[1], c[0], c[1]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  537|      0|			SWITCH(RLOOPCF, CLOOPC, ==, CEQUAL);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  153|      0|#define CEQUAL(x1, y1, x2, y2) (x1 == x2 && y1 == y2)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (153:33): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  Branch (153:45): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  511|      0|\
  |  |  |  |  |  |  512|      0|				p += 2; \
  |  |  |  |  |  |  513|      0|				c += 2; \
  |  |  |  |  |  |  514|      0|			} \
  |  |  |  |  |  |  515|      0|		} \
  |  |  |  |  |  |  516|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  147|      0|		break; \
  |  |  148|      0|\
  |  |  149|      0|	default: \
  |  |  ------------------
  |  |  |  Branch (149:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  150|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      0|	}
  ------------------
  538|      0|		}
  539|      0|		break;
  540|       |
  541|      0|	case VIPS_OPERATION_RELATIONAL_NOTEQ:
  ------------------
  |  Branch (541:2): [True: 0, False: 252k]
  ------------------
  542|      0|		if (is_int) {
  ------------------
  |  Branch (542:7): [True: 0, False: 0]
  ------------------
  543|      0|			SWITCH(RLOOPCI, CLOOPC, !=, CNOTEQ);
  ------------------
  |  |  117|      0|	switch (vips_image_get_format(im)) { \
  |  |  118|      0|	case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (118:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  119|      0|		R(unsigned char, ROP); \
  |  |  ------------------
  |  |  |  |  543|      0|			SWITCH(RLOOPCI, CLOOPC, !=, CNOTEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  120|      0|		break; \
  |  |  121|      0|	case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (121:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  122|      0|		R(signed char, ROP); \
  |  |  ------------------
  |  |  |  |  543|      0|			SWITCH(RLOOPCI, CLOOPC, !=, CNOTEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  123|      0|		break; \
  |  |  124|      0|	case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (124:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  125|      0|		R(unsigned short, ROP); \
  |  |  ------------------
  |  |  |  |  543|      0|			SWITCH(RLOOPCI, CLOOPC, !=, CNOTEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  126|      0|		break; \
  |  |  127|      0|	case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (127:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  128|      0|		R(signed short, ROP); \
  |  |  ------------------
  |  |  |  |  543|      0|			SWITCH(RLOOPCI, CLOOPC, !=, CNOTEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  129|      0|		break; \
  |  |  130|      0|	case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (130:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  131|      0|		R(unsigned int, ROP); \
  |  |  ------------------
  |  |  |  |  543|      0|			SWITCH(RLOOPCI, CLOOPC, !=, CNOTEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      0|		break; \
  |  |  133|      0|	case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (133:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  134|      0|		R(signed int, ROP); \
  |  |  ------------------
  |  |  |  |  543|      0|			SWITCH(RLOOPCI, CLOOPC, !=, CNOTEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  135|      0|		break; \
  |  |  136|      0|	case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (136:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  137|      0|		R(float, ROP); \
  |  |  ------------------
  |  |  |  |  543|      0|			SWITCH(RLOOPCI, CLOOPC, !=, CNOTEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  138|      0|		break; \
  |  |  139|      0|	case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (139:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  140|      0|		R(double, ROP); \
  |  |  ------------------
  |  |  |  |  543|      0|			SWITCH(RLOOPCI, CLOOPC, !=, CNOTEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  141|      0|		break; \
  |  |  142|      0|	case VIPS_FORMAT_COMPLEX: \
  |  |  ------------------
  |  |  |  Branch (142:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|      0|		C(float, COP); \
  |  |  ------------------
  |  |  |  |  543|      0|			SWITCH(RLOOPCI, CLOOPC, !=, CNOTEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  503|      0|	{ \
  |  |  |  |  |  |  504|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  505|      0|\
  |  |  |  |  |  |  506|      0|		for (i = 0, x = 0; x < width; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (506:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  507|      0|			double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  508|      0|\
  |  |  |  |  |  |  509|      0|			for (b = 0; b < bands; b++, i++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (509:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|				out[i] = OP(p[0], p[1], c[0], c[1]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  543|      0|			SWITCH(RLOOPCI, CLOOPC, !=, CNOTEQ);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  154|      0|#define CNOTEQ(x1, y1, x2, y2) (x1 != x2 || y1 != y2)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (154:33): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  Branch (154:45): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  511|      0|\
  |  |  |  |  |  |  512|      0|				p += 2; \
  |  |  |  |  |  |  513|      0|				c += 2; \
  |  |  |  |  |  |  514|      0|			} \
  |  |  |  |  |  |  515|      0|		} \
  |  |  |  |  |  |  516|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  144|      0|		break; \
  |  |  145|      0|	case VIPS_FORMAT_DPCOMPLEX: \
  |  |  ------------------
  |  |  |  Branch (145:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  146|      0|		C(double, COP); \
  |  |  ------------------
  |  |  |  |  543|      0|			SWITCH(RLOOPCI, CLOOPC, !=, CNOTEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  503|      0|	{ \
  |  |  |  |  |  |  504|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  505|      0|\
  |  |  |  |  |  |  506|      0|		for (i = 0, x = 0; x < width; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (506:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  507|      0|			double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  508|      0|\
  |  |  |  |  |  |  509|      0|			for (b = 0; b < bands; b++, i++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (509:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|				out[i] = OP(p[0], p[1], c[0], c[1]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  543|      0|			SWITCH(RLOOPCI, CLOOPC, !=, CNOTEQ);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  154|      0|#define CNOTEQ(x1, y1, x2, y2) (x1 != x2 || y1 != y2)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (154:33): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  Branch (154:45): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  511|      0|\
  |  |  |  |  |  |  512|      0|				p += 2; \
  |  |  |  |  |  |  513|      0|				c += 2; \
  |  |  |  |  |  |  514|      0|			} \
  |  |  |  |  |  |  515|      0|		} \
  |  |  |  |  |  |  516|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  147|      0|		break; \
  |  |  148|      0|\
  |  |  149|      0|	default: \
  |  |  ------------------
  |  |  |  Branch (149:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  150|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      0|	}
  ------------------
  544|      0|		}
  545|      0|		else {
  546|      0|			SWITCH(RLOOPCF, CLOOPC, !=, CNOTEQ);
  ------------------
  |  |  117|      0|	switch (vips_image_get_format(im)) { \
  |  |  118|      0|	case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (118:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  119|      0|		R(unsigned char, ROP); \
  |  |  ------------------
  |  |  |  |  546|      0|			SWITCH(RLOOPCF, CLOOPC, !=, CNOTEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  120|      0|		break; \
  |  |  121|      0|	case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (121:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  122|      0|		R(signed char, ROP); \
  |  |  ------------------
  |  |  |  |  546|      0|			SWITCH(RLOOPCF, CLOOPC, !=, CNOTEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  123|      0|		break; \
  |  |  124|      0|	case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (124:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  125|      0|		R(unsigned short, ROP); \
  |  |  ------------------
  |  |  |  |  546|      0|			SWITCH(RLOOPCF, CLOOPC, !=, CNOTEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  126|      0|		break; \
  |  |  127|      0|	case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (127:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  128|      0|		R(signed short, ROP); \
  |  |  ------------------
  |  |  |  |  546|      0|			SWITCH(RLOOPCF, CLOOPC, !=, CNOTEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  129|      0|		break; \
  |  |  130|      0|	case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (130:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  131|      0|		R(unsigned int, ROP); \
  |  |  ------------------
  |  |  |  |  546|      0|			SWITCH(RLOOPCF, CLOOPC, !=, CNOTEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      0|		break; \
  |  |  133|      0|	case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (133:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  134|      0|		R(signed int, ROP); \
  |  |  ------------------
  |  |  |  |  546|      0|			SWITCH(RLOOPCF, CLOOPC, !=, CNOTEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  135|      0|		break; \
  |  |  136|      0|	case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (136:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  137|      0|		R(float, ROP); \
  |  |  ------------------
  |  |  |  |  546|      0|			SWITCH(RLOOPCF, CLOOPC, !=, CNOTEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  138|      0|		break; \
  |  |  139|      0|	case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (139:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  140|      0|		R(double, ROP); \
  |  |  ------------------
  |  |  |  |  546|      0|			SWITCH(RLOOPCF, CLOOPC, !=, CNOTEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  141|      0|		break; \
  |  |  142|      0|	case VIPS_FORMAT_COMPLEX: \
  |  |  ------------------
  |  |  |  Branch (142:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|      0|		C(float, COP); \
  |  |  ------------------
  |  |  |  |  546|      0|			SWITCH(RLOOPCF, CLOOPC, !=, CNOTEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  503|      0|	{ \
  |  |  |  |  |  |  504|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  505|      0|\
  |  |  |  |  |  |  506|      0|		for (i = 0, x = 0; x < width; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (506:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  507|      0|			double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  508|      0|\
  |  |  |  |  |  |  509|      0|			for (b = 0; b < bands; b++, i++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (509:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|				out[i] = OP(p[0], p[1], c[0], c[1]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  546|      0|			SWITCH(RLOOPCF, CLOOPC, !=, CNOTEQ);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  154|      0|#define CNOTEQ(x1, y1, x2, y2) (x1 != x2 || y1 != y2)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (154:33): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  Branch (154:45): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  511|      0|\
  |  |  |  |  |  |  512|      0|				p += 2; \
  |  |  |  |  |  |  513|      0|				c += 2; \
  |  |  |  |  |  |  514|      0|			} \
  |  |  |  |  |  |  515|      0|		} \
  |  |  |  |  |  |  516|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  144|      0|		break; \
  |  |  145|      0|	case VIPS_FORMAT_DPCOMPLEX: \
  |  |  ------------------
  |  |  |  Branch (145:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  146|      0|		C(double, COP); \
  |  |  ------------------
  |  |  |  |  546|      0|			SWITCH(RLOOPCF, CLOOPC, !=, CNOTEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  503|      0|	{ \
  |  |  |  |  |  |  504|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  505|      0|\
  |  |  |  |  |  |  506|      0|		for (i = 0, x = 0; x < width; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (506:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  507|      0|			double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  508|      0|\
  |  |  |  |  |  |  509|      0|			for (b = 0; b < bands; b++, i++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (509:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|				out[i] = OP(p[0], p[1], c[0], c[1]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  546|      0|			SWITCH(RLOOPCF, CLOOPC, !=, CNOTEQ);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  154|      0|#define CNOTEQ(x1, y1, x2, y2) (x1 != x2 || y1 != y2)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (154:33): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  Branch (154:45): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  511|      0|\
  |  |  |  |  |  |  512|      0|				p += 2; \
  |  |  |  |  |  |  513|      0|				c += 2; \
  |  |  |  |  |  |  514|      0|			} \
  |  |  |  |  |  |  515|      0|		} \
  |  |  |  |  |  |  516|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  147|      0|		break; \
  |  |  148|      0|\
  |  |  149|      0|	default: \
  |  |  ------------------
  |  |  |  Branch (149:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  150|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      0|	}
  ------------------
  547|      0|		}
  548|      0|		break;
  549|       |
  550|      0|	case VIPS_OPERATION_RELATIONAL_LESS:
  ------------------
  |  Branch (550:2): [True: 0, False: 252k]
  ------------------
  551|      0|		if (is_int) {
  ------------------
  |  Branch (551:7): [True: 0, False: 0]
  ------------------
  552|      0|			SWITCH(RLOOPCI, CLOOPC, <, CLESS);
  ------------------
  |  |  117|      0|	switch (vips_image_get_format(im)) { \
  |  |  118|      0|	case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (118:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  119|      0|		R(unsigned char, ROP); \
  |  |  ------------------
  |  |  |  |  552|      0|			SWITCH(RLOOPCI, CLOOPC, <, CLESS);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  120|      0|		break; \
  |  |  121|      0|	case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (121:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  122|      0|		R(signed char, ROP); \
  |  |  ------------------
  |  |  |  |  552|      0|			SWITCH(RLOOPCI, CLOOPC, <, CLESS);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  123|      0|		break; \
  |  |  124|      0|	case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (124:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  125|      0|		R(unsigned short, ROP); \
  |  |  ------------------
  |  |  |  |  552|      0|			SWITCH(RLOOPCI, CLOOPC, <, CLESS);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  126|      0|		break; \
  |  |  127|      0|	case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (127:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  128|      0|		R(signed short, ROP); \
  |  |  ------------------
  |  |  |  |  552|      0|			SWITCH(RLOOPCI, CLOOPC, <, CLESS);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  129|      0|		break; \
  |  |  130|      0|	case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (130:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  131|      0|		R(unsigned int, ROP); \
  |  |  ------------------
  |  |  |  |  552|      0|			SWITCH(RLOOPCI, CLOOPC, <, CLESS);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      0|		break; \
  |  |  133|      0|	case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (133:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  134|      0|		R(signed int, ROP); \
  |  |  ------------------
  |  |  |  |  552|      0|			SWITCH(RLOOPCI, CLOOPC, <, CLESS);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  135|      0|		break; \
  |  |  136|      0|	case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (136:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  137|      0|		R(float, ROP); \
  |  |  ------------------
  |  |  |  |  552|      0|			SWITCH(RLOOPCI, CLOOPC, <, CLESS);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  138|      0|		break; \
  |  |  139|      0|	case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (139:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  140|      0|		R(double, ROP); \
  |  |  ------------------
  |  |  |  |  552|      0|			SWITCH(RLOOPCI, CLOOPC, <, CLESS);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  141|      0|		break; \
  |  |  142|      0|	case VIPS_FORMAT_COMPLEX: \
  |  |  ------------------
  |  |  |  Branch (142:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|      0|		C(float, COP); \
  |  |  ------------------
  |  |  |  |  552|      0|			SWITCH(RLOOPCI, CLOOPC, <, CLESS);
  |  |  |  |  ------------------
  |  |  |  |  |  |  503|      0|	{ \
  |  |  |  |  |  |  504|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  505|      0|\
  |  |  |  |  |  |  506|      0|		for (i = 0, x = 0; x < width; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (506:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  507|      0|			double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  508|      0|\
  |  |  |  |  |  |  509|      0|			for (b = 0; b < bands; b++, i++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (509:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|				out[i] = OP(p[0], p[1], c[0], c[1]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  552|      0|			SWITCH(RLOOPCI, CLOOPC, <, CLESS);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  155|      0|#define CLESS(x1, y1, x2, y2) (x1 * x1 + y1 * y1 < x2 * x2 + y2 * y2)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (155:31): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  511|      0|\
  |  |  |  |  |  |  512|      0|				p += 2; \
  |  |  |  |  |  |  513|      0|				c += 2; \
  |  |  |  |  |  |  514|      0|			} \
  |  |  |  |  |  |  515|      0|		} \
  |  |  |  |  |  |  516|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  144|      0|		break; \
  |  |  145|      0|	case VIPS_FORMAT_DPCOMPLEX: \
  |  |  ------------------
  |  |  |  Branch (145:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  146|      0|		C(double, COP); \
  |  |  ------------------
  |  |  |  |  552|      0|			SWITCH(RLOOPCI, CLOOPC, <, CLESS);
  |  |  |  |  ------------------
  |  |  |  |  |  |  503|      0|	{ \
  |  |  |  |  |  |  504|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  505|      0|\
  |  |  |  |  |  |  506|      0|		for (i = 0, x = 0; x < width; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (506:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  507|      0|			double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  508|      0|\
  |  |  |  |  |  |  509|      0|			for (b = 0; b < bands; b++, i++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (509:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|				out[i] = OP(p[0], p[1], c[0], c[1]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  552|      0|			SWITCH(RLOOPCI, CLOOPC, <, CLESS);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  155|      0|#define CLESS(x1, y1, x2, y2) (x1 * x1 + y1 * y1 < x2 * x2 + y2 * y2)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (155:31): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  511|      0|\
  |  |  |  |  |  |  512|      0|				p += 2; \
  |  |  |  |  |  |  513|      0|				c += 2; \
  |  |  |  |  |  |  514|      0|			} \
  |  |  |  |  |  |  515|      0|		} \
  |  |  |  |  |  |  516|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  147|      0|		break; \
  |  |  148|      0|\
  |  |  149|      0|	default: \
  |  |  ------------------
  |  |  |  Branch (149:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  150|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      0|	}
  ------------------
  553|      0|		}
  554|      0|		else {
  555|      0|			SWITCH(RLOOPCF, CLOOPC, <, CLESS);
  ------------------
  |  |  117|      0|	switch (vips_image_get_format(im)) { \
  |  |  118|      0|	case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (118:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  119|      0|		R(unsigned char, ROP); \
  |  |  ------------------
  |  |  |  |  555|      0|			SWITCH(RLOOPCF, CLOOPC, <, CLESS);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  120|      0|		break; \
  |  |  121|      0|	case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (121:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  122|      0|		R(signed char, ROP); \
  |  |  ------------------
  |  |  |  |  555|      0|			SWITCH(RLOOPCF, CLOOPC, <, CLESS);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  123|      0|		break; \
  |  |  124|      0|	case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (124:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  125|      0|		R(unsigned short, ROP); \
  |  |  ------------------
  |  |  |  |  555|      0|			SWITCH(RLOOPCF, CLOOPC, <, CLESS);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  126|      0|		break; \
  |  |  127|      0|	case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (127:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  128|      0|		R(signed short, ROP); \
  |  |  ------------------
  |  |  |  |  555|      0|			SWITCH(RLOOPCF, CLOOPC, <, CLESS);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  129|      0|		break; \
  |  |  130|      0|	case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (130:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  131|      0|		R(unsigned int, ROP); \
  |  |  ------------------
  |  |  |  |  555|      0|			SWITCH(RLOOPCF, CLOOPC, <, CLESS);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      0|		break; \
  |  |  133|      0|	case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (133:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  134|      0|		R(signed int, ROP); \
  |  |  ------------------
  |  |  |  |  555|      0|			SWITCH(RLOOPCF, CLOOPC, <, CLESS);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  135|      0|		break; \
  |  |  136|      0|	case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (136:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  137|      0|		R(float, ROP); \
  |  |  ------------------
  |  |  |  |  555|      0|			SWITCH(RLOOPCF, CLOOPC, <, CLESS);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  138|      0|		break; \
  |  |  139|      0|	case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (139:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  140|      0|		R(double, ROP); \
  |  |  ------------------
  |  |  |  |  555|      0|			SWITCH(RLOOPCF, CLOOPC, <, CLESS);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  141|      0|		break; \
  |  |  142|      0|	case VIPS_FORMAT_COMPLEX: \
  |  |  ------------------
  |  |  |  Branch (142:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|      0|		C(float, COP); \
  |  |  ------------------
  |  |  |  |  555|      0|			SWITCH(RLOOPCF, CLOOPC, <, CLESS);
  |  |  |  |  ------------------
  |  |  |  |  |  |  503|      0|	{ \
  |  |  |  |  |  |  504|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  505|      0|\
  |  |  |  |  |  |  506|      0|		for (i = 0, x = 0; x < width; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (506:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  507|      0|			double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  508|      0|\
  |  |  |  |  |  |  509|      0|			for (b = 0; b < bands; b++, i++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (509:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|				out[i] = OP(p[0], p[1], c[0], c[1]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  555|      0|			SWITCH(RLOOPCF, CLOOPC, <, CLESS);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  155|      0|#define CLESS(x1, y1, x2, y2) (x1 * x1 + y1 * y1 < x2 * x2 + y2 * y2)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (155:31): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  511|      0|\
  |  |  |  |  |  |  512|      0|				p += 2; \
  |  |  |  |  |  |  513|      0|				c += 2; \
  |  |  |  |  |  |  514|      0|			} \
  |  |  |  |  |  |  515|      0|		} \
  |  |  |  |  |  |  516|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  144|      0|		break; \
  |  |  145|      0|	case VIPS_FORMAT_DPCOMPLEX: \
  |  |  ------------------
  |  |  |  Branch (145:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  146|      0|		C(double, COP); \
  |  |  ------------------
  |  |  |  |  555|      0|			SWITCH(RLOOPCF, CLOOPC, <, CLESS);
  |  |  |  |  ------------------
  |  |  |  |  |  |  503|      0|	{ \
  |  |  |  |  |  |  504|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  505|      0|\
  |  |  |  |  |  |  506|      0|		for (i = 0, x = 0; x < width; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (506:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  507|      0|			double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  508|      0|\
  |  |  |  |  |  |  509|      0|			for (b = 0; b < bands; b++, i++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (509:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|				out[i] = OP(p[0], p[1], c[0], c[1]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  555|      0|			SWITCH(RLOOPCF, CLOOPC, <, CLESS);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  155|      0|#define CLESS(x1, y1, x2, y2) (x1 * x1 + y1 * y1 < x2 * x2 + y2 * y2)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (155:31): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  511|      0|\
  |  |  |  |  |  |  512|      0|				p += 2; \
  |  |  |  |  |  |  513|      0|				c += 2; \
  |  |  |  |  |  |  514|      0|			} \
  |  |  |  |  |  |  515|      0|		} \
  |  |  |  |  |  |  516|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  147|      0|		break; \
  |  |  148|      0|\
  |  |  149|      0|	default: \
  |  |  ------------------
  |  |  |  Branch (149:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  150|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      0|	}
  ------------------
  556|      0|		}
  557|      0|		break;
  558|       |
  559|      0|	case VIPS_OPERATION_RELATIONAL_LESSEQ:
  ------------------
  |  Branch (559:2): [True: 0, False: 252k]
  ------------------
  560|      0|		if (is_int) {
  ------------------
  |  Branch (560:7): [True: 0, False: 0]
  ------------------
  561|      0|			SWITCH(RLOOPCI, CLOOPC, <=, CLESSEQ);
  ------------------
  |  |  117|      0|	switch (vips_image_get_format(im)) { \
  |  |  118|      0|	case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (118:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  119|      0|		R(unsigned char, ROP); \
  |  |  ------------------
  |  |  |  |  561|      0|			SWITCH(RLOOPCI, CLOOPC, <=, CLESSEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  120|      0|		break; \
  |  |  121|      0|	case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (121:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  122|      0|		R(signed char, ROP); \
  |  |  ------------------
  |  |  |  |  561|      0|			SWITCH(RLOOPCI, CLOOPC, <=, CLESSEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  123|      0|		break; \
  |  |  124|      0|	case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (124:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  125|      0|		R(unsigned short, ROP); \
  |  |  ------------------
  |  |  |  |  561|      0|			SWITCH(RLOOPCI, CLOOPC, <=, CLESSEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  126|      0|		break; \
  |  |  127|      0|	case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (127:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  128|      0|		R(signed short, ROP); \
  |  |  ------------------
  |  |  |  |  561|      0|			SWITCH(RLOOPCI, CLOOPC, <=, CLESSEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  129|      0|		break; \
  |  |  130|      0|	case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (130:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  131|      0|		R(unsigned int, ROP); \
  |  |  ------------------
  |  |  |  |  561|      0|			SWITCH(RLOOPCI, CLOOPC, <=, CLESSEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      0|		break; \
  |  |  133|      0|	case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (133:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  134|      0|		R(signed int, ROP); \
  |  |  ------------------
  |  |  |  |  561|      0|			SWITCH(RLOOPCI, CLOOPC, <=, CLESSEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  135|      0|		break; \
  |  |  136|      0|	case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (136:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  137|      0|		R(float, ROP); \
  |  |  ------------------
  |  |  |  |  561|      0|			SWITCH(RLOOPCI, CLOOPC, <=, CLESSEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  138|      0|		break; \
  |  |  139|      0|	case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (139:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  140|      0|		R(double, ROP); \
  |  |  ------------------
  |  |  |  |  561|      0|			SWITCH(RLOOPCI, CLOOPC, <=, CLESSEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  141|      0|		break; \
  |  |  142|      0|	case VIPS_FORMAT_COMPLEX: \
  |  |  ------------------
  |  |  |  Branch (142:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|      0|		C(float, COP); \
  |  |  ------------------
  |  |  |  |  561|      0|			SWITCH(RLOOPCI, CLOOPC, <=, CLESSEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  503|      0|	{ \
  |  |  |  |  |  |  504|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  505|      0|\
  |  |  |  |  |  |  506|      0|		for (i = 0, x = 0; x < width; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (506:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  507|      0|			double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  508|      0|\
  |  |  |  |  |  |  509|      0|			for (b = 0; b < bands; b++, i++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (509:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|				out[i] = OP(p[0], p[1], c[0], c[1]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  561|      0|			SWITCH(RLOOPCI, CLOOPC, <=, CLESSEQ);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  156|      0|#define CLESSEQ(x1, y1, x2, y2) (x1 * x1 + y1 * y1 <= x2 * x2 + y2 * y2)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (156:33): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  511|      0|\
  |  |  |  |  |  |  512|      0|				p += 2; \
  |  |  |  |  |  |  513|      0|				c += 2; \
  |  |  |  |  |  |  514|      0|			} \
  |  |  |  |  |  |  515|      0|		} \
  |  |  |  |  |  |  516|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  144|      0|		break; \
  |  |  145|      0|	case VIPS_FORMAT_DPCOMPLEX: \
  |  |  ------------------
  |  |  |  Branch (145:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  146|      0|		C(double, COP); \
  |  |  ------------------
  |  |  |  |  561|      0|			SWITCH(RLOOPCI, CLOOPC, <=, CLESSEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  503|      0|	{ \
  |  |  |  |  |  |  504|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  505|      0|\
  |  |  |  |  |  |  506|      0|		for (i = 0, x = 0; x < width; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (506:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  507|      0|			double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  508|      0|\
  |  |  |  |  |  |  509|      0|			for (b = 0; b < bands; b++, i++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (509:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|				out[i] = OP(p[0], p[1], c[0], c[1]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  561|      0|			SWITCH(RLOOPCI, CLOOPC, <=, CLESSEQ);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  156|      0|#define CLESSEQ(x1, y1, x2, y2) (x1 * x1 + y1 * y1 <= x2 * x2 + y2 * y2)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (156:33): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  511|      0|\
  |  |  |  |  |  |  512|      0|				p += 2; \
  |  |  |  |  |  |  513|      0|				c += 2; \
  |  |  |  |  |  |  514|      0|			} \
  |  |  |  |  |  |  515|      0|		} \
  |  |  |  |  |  |  516|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  147|      0|		break; \
  |  |  148|      0|\
  |  |  149|      0|	default: \
  |  |  ------------------
  |  |  |  Branch (149:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  150|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      0|	}
  ------------------
  562|      0|		}
  563|      0|		else {
  564|      0|			SWITCH(RLOOPCF, CLOOPC, <=, CLESSEQ);
  ------------------
  |  |  117|      0|	switch (vips_image_get_format(im)) { \
  |  |  118|      0|	case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (118:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  119|      0|		R(unsigned char, ROP); \
  |  |  ------------------
  |  |  |  |  564|      0|			SWITCH(RLOOPCF, CLOOPC, <=, CLESSEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  120|      0|		break; \
  |  |  121|      0|	case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (121:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  122|      0|		R(signed char, ROP); \
  |  |  ------------------
  |  |  |  |  564|      0|			SWITCH(RLOOPCF, CLOOPC, <=, CLESSEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  123|      0|		break; \
  |  |  124|      0|	case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (124:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  125|      0|		R(unsigned short, ROP); \
  |  |  ------------------
  |  |  |  |  564|      0|			SWITCH(RLOOPCF, CLOOPC, <=, CLESSEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  126|      0|		break; \
  |  |  127|      0|	case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (127:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  128|      0|		R(signed short, ROP); \
  |  |  ------------------
  |  |  |  |  564|      0|			SWITCH(RLOOPCF, CLOOPC, <=, CLESSEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  129|      0|		break; \
  |  |  130|      0|	case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (130:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  131|      0|		R(unsigned int, ROP); \
  |  |  ------------------
  |  |  |  |  564|      0|			SWITCH(RLOOPCF, CLOOPC, <=, CLESSEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      0|		break; \
  |  |  133|      0|	case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (133:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  134|      0|		R(signed int, ROP); \
  |  |  ------------------
  |  |  |  |  564|      0|			SWITCH(RLOOPCF, CLOOPC, <=, CLESSEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  135|      0|		break; \
  |  |  136|      0|	case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (136:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  137|      0|		R(float, ROP); \
  |  |  ------------------
  |  |  |  |  564|      0|			SWITCH(RLOOPCF, CLOOPC, <=, CLESSEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  138|      0|		break; \
  |  |  139|      0|	case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (139:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  140|      0|		R(double, ROP); \
  |  |  ------------------
  |  |  |  |  564|      0|			SWITCH(RLOOPCF, CLOOPC, <=, CLESSEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  141|      0|		break; \
  |  |  142|      0|	case VIPS_FORMAT_COMPLEX: \
  |  |  ------------------
  |  |  |  Branch (142:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|      0|		C(float, COP); \
  |  |  ------------------
  |  |  |  |  564|      0|			SWITCH(RLOOPCF, CLOOPC, <=, CLESSEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  503|      0|	{ \
  |  |  |  |  |  |  504|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  505|      0|\
  |  |  |  |  |  |  506|      0|		for (i = 0, x = 0; x < width; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (506:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  507|      0|			double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  508|      0|\
  |  |  |  |  |  |  509|      0|			for (b = 0; b < bands; b++, i++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (509:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|				out[i] = OP(p[0], p[1], c[0], c[1]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  564|      0|			SWITCH(RLOOPCF, CLOOPC, <=, CLESSEQ);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  156|      0|#define CLESSEQ(x1, y1, x2, y2) (x1 * x1 + y1 * y1 <= x2 * x2 + y2 * y2)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (156:33): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  511|      0|\
  |  |  |  |  |  |  512|      0|				p += 2; \
  |  |  |  |  |  |  513|      0|				c += 2; \
  |  |  |  |  |  |  514|      0|			} \
  |  |  |  |  |  |  515|      0|		} \
  |  |  |  |  |  |  516|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  144|      0|		break; \
  |  |  145|      0|	case VIPS_FORMAT_DPCOMPLEX: \
  |  |  ------------------
  |  |  |  Branch (145:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  146|      0|		C(double, COP); \
  |  |  ------------------
  |  |  |  |  564|      0|			SWITCH(RLOOPCF, CLOOPC, <=, CLESSEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  503|      0|	{ \
  |  |  |  |  |  |  504|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  505|      0|\
  |  |  |  |  |  |  506|      0|		for (i = 0, x = 0; x < width; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (506:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  507|      0|			double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  508|      0|\
  |  |  |  |  |  |  509|      0|			for (b = 0; b < bands; b++, i++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (509:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|				out[i] = OP(p[0], p[1], c[0], c[1]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  564|      0|			SWITCH(RLOOPCF, CLOOPC, <=, CLESSEQ);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  156|      0|#define CLESSEQ(x1, y1, x2, y2) (x1 * x1 + y1 * y1 <= x2 * x2 + y2 * y2)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (156:33): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  511|      0|\
  |  |  |  |  |  |  512|      0|				p += 2; \
  |  |  |  |  |  |  513|      0|				c += 2; \
  |  |  |  |  |  |  514|      0|			} \
  |  |  |  |  |  |  515|      0|		} \
  |  |  |  |  |  |  516|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  147|      0|		break; \
  |  |  148|      0|\
  |  |  149|      0|	default: \
  |  |  ------------------
  |  |  |  Branch (149:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  150|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      0|	}
  ------------------
  565|      0|		}
  566|      0|		break;
  567|       |
  568|   252k|	case VIPS_OPERATION_RELATIONAL_MORE:
  ------------------
  |  Branch (568:2): [True: 252k, False: 0]
  ------------------
  569|   252k|		if (is_int) {
  ------------------
  |  Branch (569:7): [True: 0, False: 252k]
  ------------------
  570|      0|			SWITCH(RLOOPCI, CLOOPC, >, CMORE);
  ------------------
  |  |  117|      0|	switch (vips_image_get_format(im)) { \
  |  |  118|      0|	case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (118:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  119|      0|		R(unsigned char, ROP); \
  |  |  ------------------
  |  |  |  |  570|      0|			SWITCH(RLOOPCI, CLOOPC, >, CMORE);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  120|      0|		break; \
  |  |  121|      0|	case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (121:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  122|      0|		R(signed char, ROP); \
  |  |  ------------------
  |  |  |  |  570|      0|			SWITCH(RLOOPCI, CLOOPC, >, CMORE);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  123|      0|		break; \
  |  |  124|      0|	case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (124:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  125|      0|		R(unsigned short, ROP); \
  |  |  ------------------
  |  |  |  |  570|      0|			SWITCH(RLOOPCI, CLOOPC, >, CMORE);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  126|      0|		break; \
  |  |  127|      0|	case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (127:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  128|      0|		R(signed short, ROP); \
  |  |  ------------------
  |  |  |  |  570|      0|			SWITCH(RLOOPCI, CLOOPC, >, CMORE);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  129|      0|		break; \
  |  |  130|      0|	case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (130:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  131|      0|		R(unsigned int, ROP); \
  |  |  ------------------
  |  |  |  |  570|      0|			SWITCH(RLOOPCI, CLOOPC, >, CMORE);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      0|		break; \
  |  |  133|      0|	case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (133:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  134|      0|		R(signed int, ROP); \
  |  |  ------------------
  |  |  |  |  570|      0|			SWITCH(RLOOPCI, CLOOPC, >, CMORE);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  135|      0|		break; \
  |  |  136|      0|	case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (136:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  137|      0|		R(float, ROP); \
  |  |  ------------------
  |  |  |  |  570|      0|			SWITCH(RLOOPCI, CLOOPC, >, CMORE);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  138|      0|		break; \
  |  |  139|      0|	case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (139:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  140|      0|		R(double, ROP); \
  |  |  ------------------
  |  |  |  |  570|      0|			SWITCH(RLOOPCI, CLOOPC, >, CMORE);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  141|      0|		break; \
  |  |  142|      0|	case VIPS_FORMAT_COMPLEX: \
  |  |  ------------------
  |  |  |  Branch (142:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|      0|		C(float, COP); \
  |  |  ------------------
  |  |  |  |  570|      0|			SWITCH(RLOOPCI, CLOOPC, >, CMORE);
  |  |  |  |  ------------------
  |  |  |  |  |  |  503|      0|	{ \
  |  |  |  |  |  |  504|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  505|      0|\
  |  |  |  |  |  |  506|      0|		for (i = 0, x = 0; x < width; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (506:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  507|      0|			double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  508|      0|\
  |  |  |  |  |  |  509|      0|			for (b = 0; b < bands; b++, i++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (509:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|				out[i] = OP(p[0], p[1], c[0], c[1]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  570|      0|			SWITCH(RLOOPCI, CLOOPC, >, CMORE);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  157|      0|#define CMORE(x1, y1, x2, y2) (x1 * x1 + y1 * y1 > x2 * x2 + y2 * y2)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (157:31): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  511|      0|\
  |  |  |  |  |  |  512|      0|				p += 2; \
  |  |  |  |  |  |  513|      0|				c += 2; \
  |  |  |  |  |  |  514|      0|			} \
  |  |  |  |  |  |  515|      0|		} \
  |  |  |  |  |  |  516|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  144|      0|		break; \
  |  |  145|      0|	case VIPS_FORMAT_DPCOMPLEX: \
  |  |  ------------------
  |  |  |  Branch (145:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  146|      0|		C(double, COP); \
  |  |  ------------------
  |  |  |  |  570|      0|			SWITCH(RLOOPCI, CLOOPC, >, CMORE);
  |  |  |  |  ------------------
  |  |  |  |  |  |  503|      0|	{ \
  |  |  |  |  |  |  504|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  505|      0|\
  |  |  |  |  |  |  506|      0|		for (i = 0, x = 0; x < width; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (506:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  507|      0|			double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  508|      0|\
  |  |  |  |  |  |  509|      0|			for (b = 0; b < bands; b++, i++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (509:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|				out[i] = OP(p[0], p[1], c[0], c[1]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  570|      0|			SWITCH(RLOOPCI, CLOOPC, >, CMORE);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  157|      0|#define CMORE(x1, y1, x2, y2) (x1 * x1 + y1 * y1 > x2 * x2 + y2 * y2)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (157:31): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  511|      0|\
  |  |  |  |  |  |  512|      0|				p += 2; \
  |  |  |  |  |  |  513|      0|				c += 2; \
  |  |  |  |  |  |  514|      0|			} \
  |  |  |  |  |  |  515|      0|		} \
  |  |  |  |  |  |  516|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  147|      0|		break; \
  |  |  148|      0|\
  |  |  149|      0|	default: \
  |  |  ------------------
  |  |  |  Branch (149:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  150|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      0|	}
  ------------------
  571|      0|		}
  572|   252k|		else {
  573|   252k|			SWITCH(RLOOPCF, CLOOPC, >, CMORE);
  ------------------
  |  |  117|   252k|	switch (vips_image_get_format(im)) { \
  |  |  118|      0|	case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (118:2): [True: 0, False: 252k]
  |  |  ------------------
  |  |  119|      0|		R(unsigned char, ROP); \
  |  |  ------------------
  |  |  |  |  573|      0|			SWITCH(RLOOPCF, CLOOPC, >, CMORE);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  120|      0|		break; \
  |  |  121|      0|	case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (121:2): [True: 0, False: 252k]
  |  |  ------------------
  |  |  122|      0|		R(signed char, ROP); \
  |  |  ------------------
  |  |  |  |  573|      0|			SWITCH(RLOOPCF, CLOOPC, >, CMORE);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  123|      0|		break; \
  |  |  124|      0|	case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (124:2): [True: 0, False: 252k]
  |  |  ------------------
  |  |  125|      0|		R(unsigned short, ROP); \
  |  |  ------------------
  |  |  |  |  573|      0|			SWITCH(RLOOPCF, CLOOPC, >, CMORE);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  126|      0|		break; \
  |  |  127|      0|	case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (127:2): [True: 0, False: 252k]
  |  |  ------------------
  |  |  128|      0|		R(signed short, ROP); \
  |  |  ------------------
  |  |  |  |  573|      0|			SWITCH(RLOOPCF, CLOOPC, >, CMORE);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  129|      0|		break; \
  |  |  130|      0|	case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (130:2): [True: 0, False: 252k]
  |  |  ------------------
  |  |  131|      0|		R(unsigned int, ROP); \
  |  |  ------------------
  |  |  |  |  573|      0|			SWITCH(RLOOPCF, CLOOPC, >, CMORE);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      0|		break; \
  |  |  133|      0|	case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (133:2): [True: 0, False: 252k]
  |  |  ------------------
  |  |  134|      0|		R(signed int, ROP); \
  |  |  ------------------
  |  |  |  |  573|      0|			SWITCH(RLOOPCF, CLOOPC, >, CMORE);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  135|      0|		break; \
  |  |  136|   252k|	case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (136:2): [True: 252k, False: 0]
  |  |  ------------------
  |  |  137|   252k|		R(float, ROP); \
  |  |  ------------------
  |  |  |  |  573|   252k|			SWITCH(RLOOPCF, CLOOPC, >, CMORE);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|   252k|	{ \
  |  |  |  |  |  |  494|   252k|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|   252k|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|   252k|\
  |  |  |  |  |  |  497|  8.33M|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 8.08M, False: 252k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|  16.1M|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 8.08M, False: 8.08M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|  8.08M|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 3.67M, False: 4.40M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|   252k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  138|   252k|		break; \
  |  |  139|      0|	case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (139:2): [True: 0, False: 252k]
  |  |  ------------------
  |  |  140|      0|		R(double, ROP); \
  |  |  ------------------
  |  |  |  |  573|      0|			SWITCH(RLOOPCF, CLOOPC, >, CMORE);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  141|      0|		break; \
  |  |  142|      0|	case VIPS_FORMAT_COMPLEX: \
  |  |  ------------------
  |  |  |  Branch (142:2): [True: 0, False: 252k]
  |  |  ------------------
  |  |  143|      0|		C(float, COP); \
  |  |  ------------------
  |  |  |  |  573|      0|			SWITCH(RLOOPCF, CLOOPC, >, CMORE);
  |  |  |  |  ------------------
  |  |  |  |  |  |  503|      0|	{ \
  |  |  |  |  |  |  504|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  505|      0|\
  |  |  |  |  |  |  506|      0|		for (i = 0, x = 0; x < width; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (506:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  507|      0|			double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  508|      0|\
  |  |  |  |  |  |  509|      0|			for (b = 0; b < bands; b++, i++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (509:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|				out[i] = OP(p[0], p[1], c[0], c[1]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  573|      0|			SWITCH(RLOOPCF, CLOOPC, >, CMORE);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  157|      0|#define CMORE(x1, y1, x2, y2) (x1 * x1 + y1 * y1 > x2 * x2 + y2 * y2)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (157:31): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  511|      0|\
  |  |  |  |  |  |  512|      0|				p += 2; \
  |  |  |  |  |  |  513|      0|				c += 2; \
  |  |  |  |  |  |  514|      0|			} \
  |  |  |  |  |  |  515|      0|		} \
  |  |  |  |  |  |  516|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  144|      0|		break; \
  |  |  145|      0|	case VIPS_FORMAT_DPCOMPLEX: \
  |  |  ------------------
  |  |  |  Branch (145:2): [True: 0, False: 252k]
  |  |  ------------------
  |  |  146|      0|		C(double, COP); \
  |  |  ------------------
  |  |  |  |  573|      0|			SWITCH(RLOOPCF, CLOOPC, >, CMORE);
  |  |  |  |  ------------------
  |  |  |  |  |  |  503|      0|	{ \
  |  |  |  |  |  |  504|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  505|      0|\
  |  |  |  |  |  |  506|      0|		for (i = 0, x = 0; x < width; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (506:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  507|      0|			double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  508|      0|\
  |  |  |  |  |  |  509|      0|			for (b = 0; b < bands; b++, i++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (509:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|				out[i] = OP(p[0], p[1], c[0], c[1]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  573|      0|			SWITCH(RLOOPCF, CLOOPC, >, CMORE);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  157|      0|#define CMORE(x1, y1, x2, y2) (x1 * x1 + y1 * y1 > x2 * x2 + y2 * y2)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (157:31): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  511|      0|\
  |  |  |  |  |  |  512|      0|				p += 2; \
  |  |  |  |  |  |  513|      0|				c += 2; \
  |  |  |  |  |  |  514|      0|			} \
  |  |  |  |  |  |  515|      0|		} \
  |  |  |  |  |  |  516|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  147|      0|		break; \
  |  |  148|      0|\
  |  |  149|      0|	default: \
  |  |  ------------------
  |  |  |  Branch (149:2): [True: 0, False: 252k]
  |  |  ------------------
  |  |  150|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|   252k|	}
  ------------------
  574|   252k|		}
  575|   252k|		break;
  576|       |
  577|   252k|	case VIPS_OPERATION_RELATIONAL_MOREEQ:
  ------------------
  |  Branch (577:2): [True: 0, False: 252k]
  ------------------
  578|      0|		if (is_int) {
  ------------------
  |  Branch (578:7): [True: 0, False: 0]
  ------------------
  579|      0|			SWITCH(RLOOPCI, CLOOPC, >=, CMOREEQ);
  ------------------
  |  |  117|      0|	switch (vips_image_get_format(im)) { \
  |  |  118|      0|	case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (118:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  119|      0|		R(unsigned char, ROP); \
  |  |  ------------------
  |  |  |  |  579|      0|			SWITCH(RLOOPCI, CLOOPC, >=, CMOREEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  120|      0|		break; \
  |  |  121|      0|	case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (121:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  122|      0|		R(signed char, ROP); \
  |  |  ------------------
  |  |  |  |  579|      0|			SWITCH(RLOOPCI, CLOOPC, >=, CMOREEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  123|      0|		break; \
  |  |  124|      0|	case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (124:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  125|      0|		R(unsigned short, ROP); \
  |  |  ------------------
  |  |  |  |  579|      0|			SWITCH(RLOOPCI, CLOOPC, >=, CMOREEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  126|      0|		break; \
  |  |  127|      0|	case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (127:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  128|      0|		R(signed short, ROP); \
  |  |  ------------------
  |  |  |  |  579|      0|			SWITCH(RLOOPCI, CLOOPC, >=, CMOREEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  129|      0|		break; \
  |  |  130|      0|	case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (130:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  131|      0|		R(unsigned int, ROP); \
  |  |  ------------------
  |  |  |  |  579|      0|			SWITCH(RLOOPCI, CLOOPC, >=, CMOREEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      0|		break; \
  |  |  133|      0|	case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (133:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  134|      0|		R(signed int, ROP); \
  |  |  ------------------
  |  |  |  |  579|      0|			SWITCH(RLOOPCI, CLOOPC, >=, CMOREEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  135|      0|		break; \
  |  |  136|      0|	case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (136:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  137|      0|		R(float, ROP); \
  |  |  ------------------
  |  |  |  |  579|      0|			SWITCH(RLOOPCI, CLOOPC, >=, CMOREEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  138|      0|		break; \
  |  |  139|      0|	case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (139:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  140|      0|		R(double, ROP); \
  |  |  ------------------
  |  |  |  |  579|      0|			SWITCH(RLOOPCI, CLOOPC, >=, CMOREEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  483|      0|	{ \
  |  |  |  |  |  |  484|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  485|      0|		int *restrict c = uconst->c_int; \
  |  |  |  |  |  |  486|      0|\
  |  |  |  |  |  |  487|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (487:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  488|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (488:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  489|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (489:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  490|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  141|      0|		break; \
  |  |  142|      0|	case VIPS_FORMAT_COMPLEX: \
  |  |  ------------------
  |  |  |  Branch (142:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|      0|		C(float, COP); \
  |  |  ------------------
  |  |  |  |  579|      0|			SWITCH(RLOOPCI, CLOOPC, >=, CMOREEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  503|      0|	{ \
  |  |  |  |  |  |  504|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  505|      0|\
  |  |  |  |  |  |  506|      0|		for (i = 0, x = 0; x < width; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (506:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  507|      0|			double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  508|      0|\
  |  |  |  |  |  |  509|      0|			for (b = 0; b < bands; b++, i++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (509:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|				out[i] = OP(p[0], p[1], c[0], c[1]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  579|      0|			SWITCH(RLOOPCI, CLOOPC, >=, CMOREEQ);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  158|      0|#define CMOREEQ(x1, y1, x2, y2) (x1 * x1 + y1 * y1 >= x2 * x2 + y2 * y2)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (158:33): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  511|      0|\
  |  |  |  |  |  |  512|      0|				p += 2; \
  |  |  |  |  |  |  513|      0|				c += 2; \
  |  |  |  |  |  |  514|      0|			} \
  |  |  |  |  |  |  515|      0|		} \
  |  |  |  |  |  |  516|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  144|      0|		break; \
  |  |  145|      0|	case VIPS_FORMAT_DPCOMPLEX: \
  |  |  ------------------
  |  |  |  Branch (145:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  146|      0|		C(double, COP); \
  |  |  ------------------
  |  |  |  |  579|      0|			SWITCH(RLOOPCI, CLOOPC, >=, CMOREEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  503|      0|	{ \
  |  |  |  |  |  |  504|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  505|      0|\
  |  |  |  |  |  |  506|      0|		for (i = 0, x = 0; x < width; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (506:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  507|      0|			double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  508|      0|\
  |  |  |  |  |  |  509|      0|			for (b = 0; b < bands; b++, i++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (509:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|				out[i] = OP(p[0], p[1], c[0], c[1]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  579|      0|			SWITCH(RLOOPCI, CLOOPC, >=, CMOREEQ);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  158|      0|#define CMOREEQ(x1, y1, x2, y2) (x1 * x1 + y1 * y1 >= x2 * x2 + y2 * y2)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (158:33): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  511|      0|\
  |  |  |  |  |  |  512|      0|				p += 2; \
  |  |  |  |  |  |  513|      0|				c += 2; \
  |  |  |  |  |  |  514|      0|			} \
  |  |  |  |  |  |  515|      0|		} \
  |  |  |  |  |  |  516|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  147|      0|		break; \
  |  |  148|      0|\
  |  |  149|      0|	default: \
  |  |  ------------------
  |  |  |  Branch (149:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  150|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      0|	}
  ------------------
  580|      0|		}
  581|      0|		else {
  582|      0|			SWITCH(RLOOPCF, CLOOPC, >=, CMOREEQ);
  ------------------
  |  |  117|      0|	switch (vips_image_get_format(im)) { \
  |  |  118|      0|	case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (118:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  119|      0|		R(unsigned char, ROP); \
  |  |  ------------------
  |  |  |  |  582|      0|			SWITCH(RLOOPCF, CLOOPC, >=, CMOREEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  120|      0|		break; \
  |  |  121|      0|	case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (121:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  122|      0|		R(signed char, ROP); \
  |  |  ------------------
  |  |  |  |  582|      0|			SWITCH(RLOOPCF, CLOOPC, >=, CMOREEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  123|      0|		break; \
  |  |  124|      0|	case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (124:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  125|      0|		R(unsigned short, ROP); \
  |  |  ------------------
  |  |  |  |  582|      0|			SWITCH(RLOOPCF, CLOOPC, >=, CMOREEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  126|      0|		break; \
  |  |  127|      0|	case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (127:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  128|      0|		R(signed short, ROP); \
  |  |  ------------------
  |  |  |  |  582|      0|			SWITCH(RLOOPCF, CLOOPC, >=, CMOREEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  129|      0|		break; \
  |  |  130|      0|	case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (130:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  131|      0|		R(unsigned int, ROP); \
  |  |  ------------------
  |  |  |  |  582|      0|			SWITCH(RLOOPCF, CLOOPC, >=, CMOREEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  132|      0|		break; \
  |  |  133|      0|	case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (133:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  134|      0|		R(signed int, ROP); \
  |  |  ------------------
  |  |  |  |  582|      0|			SWITCH(RLOOPCF, CLOOPC, >=, CMOREEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  135|      0|		break; \
  |  |  136|      0|	case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (136:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  137|      0|		R(float, ROP); \
  |  |  ------------------
  |  |  |  |  582|      0|			SWITCH(RLOOPCF, CLOOPC, >=, CMOREEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  138|      0|		break; \
  |  |  139|      0|	case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (139:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  140|      0|		R(double, ROP); \
  |  |  ------------------
  |  |  |  |  582|      0|			SWITCH(RLOOPCF, CLOOPC, >=, CMOREEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  493|      0|	{ \
  |  |  |  |  |  |  494|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  495|      0|		double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  496|      0|\
  |  |  |  |  |  |  497|      0|		for (i = 0, x = 0; x < width; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (497:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  498|      0|			for (b = 0; b < bands; b++, i++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (498:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  499|      0|				out[i] = (p[i] OP c[b]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (499:14): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  500|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  141|      0|		break; \
  |  |  142|      0|	case VIPS_FORMAT_COMPLEX: \
  |  |  ------------------
  |  |  |  Branch (142:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|      0|		C(float, COP); \
  |  |  ------------------
  |  |  |  |  582|      0|			SWITCH(RLOOPCF, CLOOPC, >=, CMOREEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  503|      0|	{ \
  |  |  |  |  |  |  504|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  505|      0|\
  |  |  |  |  |  |  506|      0|		for (i = 0, x = 0; x < width; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (506:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  507|      0|			double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  508|      0|\
  |  |  |  |  |  |  509|      0|			for (b = 0; b < bands; b++, i++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (509:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|				out[i] = OP(p[0], p[1], c[0], c[1]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  582|      0|			SWITCH(RLOOPCF, CLOOPC, >=, CMOREEQ);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  158|      0|#define CMOREEQ(x1, y1, x2, y2) (x1 * x1 + y1 * y1 >= x2 * x2 + y2 * y2)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (158:33): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  511|      0|\
  |  |  |  |  |  |  512|      0|				p += 2; \
  |  |  |  |  |  |  513|      0|				c += 2; \
  |  |  |  |  |  |  514|      0|			} \
  |  |  |  |  |  |  515|      0|		} \
  |  |  |  |  |  |  516|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  144|      0|		break; \
  |  |  145|      0|	case VIPS_FORMAT_DPCOMPLEX: \
  |  |  ------------------
  |  |  |  Branch (145:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  146|      0|		C(double, COP); \
  |  |  ------------------
  |  |  |  |  582|      0|			SWITCH(RLOOPCF, CLOOPC, >=, CMOREEQ);
  |  |  |  |  ------------------
  |  |  |  |  |  |  503|      0|	{ \
  |  |  |  |  |  |  504|      0|		TYPE *restrict p = (TYPE *) in[0]; \
  |  |  |  |  |  |  505|      0|\
  |  |  |  |  |  |  506|      0|		for (i = 0, x = 0; x < width; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (506:22): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  507|      0|			double *restrict c = uconst->c_double; \
  |  |  |  |  |  |  508|      0|\
  |  |  |  |  |  |  509|      0|			for (b = 0; b < bands; b++, i++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (509:16): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  510|      0|				out[i] = OP(p[0], p[1], c[0], c[1]) ? 255 : 0; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  582|      0|			SWITCH(RLOOPCF, CLOOPC, >=, CMOREEQ);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  158|      0|#define CMOREEQ(x1, y1, x2, y2) (x1 * x1 + y1 * y1 >= x2 * x2 + y2 * y2)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (158:33): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  511|      0|\
  |  |  |  |  |  |  512|      0|				p += 2; \
  |  |  |  |  |  |  513|      0|				c += 2; \
  |  |  |  |  |  |  514|      0|			} \
  |  |  |  |  |  |  515|      0|		} \
  |  |  |  |  |  |  516|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  147|      0|		break; \
  |  |  148|      0|\
  |  |  149|      0|	default: \
  |  |  ------------------
  |  |  |  Branch (149:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  150|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|      0|	}
  ------------------
  583|      0|		}
  584|      0|		break;
  585|       |
  586|      0|	default:
  ------------------
  |  Branch (586:2): [True: 0, False: 252k]
  ------------------
  587|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  588|   252k|	}
  589|   252k|}
relational.c:vips_relational_const_init:
  621|  19.0k|{
  622|  19.0k|}
relational.c:vips_relational_constv:
  627|  19.0k|{
  628|  19.0k|	VipsArea *area_c;
  629|  19.0k|	double *array;
  630|  19.0k|	int result;
  631|  19.0k|	int i;
  632|       |
  633|  19.0k|	area_c = vips_area_new_array(G_TYPE_DOUBLE, sizeof(double), n);
  ------------------
  |  |  148|  19.0k|#define G_TYPE_DOUBLE			G_TYPE_MAKE_FUNDAMENTAL (15)
  |  |  ------------------
  |  |  |  |  221|  19.0k|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|  19.0k|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  634|  19.0k|	array = (double *) area_c->data;
  635|  38.1k|	for (i = 0; i < n; i++)
  ------------------
  |  Branch (635:14): [True: 19.0k, False: 19.0k]
  ------------------
  636|  19.0k|		array[i] = c[i];
  637|       |
  638|  19.0k|	result = vips_call_split("relational_const", ap,
  639|  19.0k|		in, out, relational, area_c);
  640|       |
  641|  19.0k|	vips_area_unref(area_c);
  642|       |
  643|  19.0k|	return result;
  644|  19.0k|}

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|}
statistic.c:vips_statistic_build:
  111|  26.9k|{
  112|  26.9k|	VipsStatistic *statistic = VIPS_STATISTIC(object);
  ------------------
  |  |   40|  26.9k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  26.9k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  26.9k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  26.9k|		VIPS_TYPE_STATISTIC, VipsStatistic))
  ------------------
  113|  26.9k|	VipsStatisticClass *sclass = VIPS_STATISTIC_GET_CLASS(statistic);
  ------------------
  |  |   50|  26.9k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  26.9k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  26.9k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   51|  26.9k|		VIPS_TYPE_STATISTIC, VipsStatisticClass))
  ------------------
  114|  26.9k|	VipsImage **t = (VipsImage **) vips_object_local_array(object, 2);
  115|       |
  116|       |#ifdef DEBUG
  117|       |	printf("vips_statistic_build: ");
  118|       |	vips_object_print_name(object);
  119|       |	printf("\n");
  120|       |#endif /*DEBUG*/
  121|       |
  122|  26.9k|	if (VIPS_OBJECT_CLASS(vips_statistic_parent_class)->build(object))
  ------------------
  |  |  435|  26.9k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  26.9k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  26.9k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (122:6): [True: 0, False: 26.9k]
  ------------------
  123|      0|		return -1;
  124|       |
  125|  26.9k|	statistic->ready = statistic->in;
  126|       |
  127|  26.9k|	if (vips_image_decode(statistic->ready, &t[0]))
  ------------------
  |  Branch (127:6): [True: 0, False: 26.9k]
  ------------------
  128|      0|		return -1;
  129|  26.9k|	statistic->ready = t[0];
  130|       |
  131|       |	/* If there's a format table, cast the input.
  132|       |	 */
  133|  26.9k|	if (sclass->format_table) {
  ------------------
  |  Branch (133:6): [True: 0, False: 26.9k]
  ------------------
  134|      0|		if (vips_cast(statistic->ready, &t[1],
  ------------------
  |  Branch (134:7): [True: 0, False: 0]
  ------------------
  135|      0|				sclass->format_table[statistic->in->BandFmt], NULL))
  136|      0|			return -1;
  137|      0|		statistic->ready = t[1];
  138|      0|	}
  139|       |
  140|  26.9k|	if (vips_sink(statistic->ready,
  ------------------
  |  Branch (140:6): [True: 11.1k, False: 15.7k]
  ------------------
  141|  26.9k|			vips_statistic_scan_start,
  142|  26.9k|			vips_statistic_scan,
  143|  26.9k|			vips_statistic_scan_stop,
  144|  26.9k|			statistic, NULL))
  145|  11.1k|		return -1;
  146|       |
  147|  15.7k|	return 0;
  148|  26.9k|}
statistic.c:vips_statistic_scan_start:
   61|  26.9k|{
   62|  26.9k|	VipsStatistic *statistic = VIPS_STATISTIC(a);
  ------------------
  |  |   40|  26.9k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  26.9k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  26.9k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  26.9k|		VIPS_TYPE_STATISTIC, VipsStatistic))
  ------------------
   63|  26.9k|	VipsStatisticClass *class = VIPS_STATISTIC_GET_CLASS(statistic);
  ------------------
  |  |   50|  26.9k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  26.9k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  26.9k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   51|  26.9k|		VIPS_TYPE_STATISTIC, VipsStatisticClass))
  ------------------
   64|       |
   65|  26.9k|	return class->start(statistic);
   66|  26.9k|}
statistic.c:vips_statistic_scan:
   71|  22.0k|{
   72|  22.0k|	VipsStatistic *statistic = VIPS_STATISTIC(a);
  ------------------
  |  |   40|  22.0k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  22.0k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  22.0k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  22.0k|		VIPS_TYPE_STATISTIC, VipsStatistic))
  ------------------
   73|  22.0k|	VipsStatisticClass *class = VIPS_STATISTIC_GET_CLASS(statistic);
  ------------------
  |  |   50|  22.0k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  22.0k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  22.0k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   51|  22.0k|		VIPS_TYPE_STATISTIC, VipsStatisticClass))
  ------------------
   74|       |
   75|  22.0k|	VipsRect *r = &region->valid;
   76|  22.0k|	int lsk = VIPS_REGION_LSKIP(region);
  ------------------
  |  |  195|  22.0k|	((size_t) ((R)->bpl))
  ------------------
   77|       |
   78|  22.0k|	int y;
   79|  22.0k|	VipsPel *p;
   80|       |
   81|  22.0k|	VIPS_DEBUG_MSG("vips_statistic_scan: %d x %d @ %d x %d\n",
  ------------------
  |  |   47|  22.0k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  22.0k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  22.0k|	{ \
  |  |   49|  22.0k|		; \
  |  |   50|  22.0k|	} \
  |  |   51|  22.0k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  22.0k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   82|  22.0k|		r->width, r->height, r->left, r->top);
   83|       |
   84|  22.0k|	p = VIPS_REGION_ADDR(region, r->left, r->top);
  ------------------
  |  |  227|  22.0k|	((R)->data + \
  |  |  228|  22.0k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  22.0k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  22.0k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  22.0k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  22.0k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  22.0k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   85|   525k|	for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (85:14): [True: 503k, False: 22.0k]
  ------------------
   86|   503k|		if (class->scan(statistic,
  ------------------
  |  Branch (86:7): [True: 0, False: 503k]
  ------------------
   87|   503k|				seq, r->left, r->top + y, p, r->width))
   88|      0|			return -1;
   89|   503k|		p += lsk;
   90|   503k|	}
   91|       |
   92|       |	/* If we've requested stop, pass the message on.
   93|       |	 */
   94|  22.0k|	if (statistic->stop)
  ------------------
  |  Branch (94:6): [True: 5.12k, False: 16.9k]
  ------------------
   95|  5.12k|		*stop = TRUE;
  ------------------
  |  |  798|  5.12k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  5.12k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
   96|       |
   97|  22.0k|	return 0;
   98|  22.0k|}
statistic.c:vips_statistic_scan_stop:
  102|  26.9k|{
  103|  26.9k|	VipsStatistic *statistic = VIPS_STATISTIC(a);
  ------------------
  |  |   40|  26.9k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  26.9k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  26.9k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  26.9k|		VIPS_TYPE_STATISTIC, VipsStatistic))
  ------------------
  104|  26.9k|	VipsStatisticClass *class = VIPS_STATISTIC_GET_CLASS(statistic);
  ------------------
  |  |   50|  26.9k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  26.9k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  26.9k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   51|  26.9k|		VIPS_TYPE_STATISTIC, VipsStatisticClass))
  ------------------
  105|       |
  106|  26.9k|	return class->stop(statistic, seq);
  107|  26.9k|}
statistic.c:vips_statistic_init:
  175|  26.9k|{
  176|  26.9k|}

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|}

vips_sum:
  259|  57.2k|{
  260|  57.2k|	va_list ap;
  261|  57.2k|	int result;
  262|       |
  263|  57.2k|	va_start(ap, n);
  264|  57.2k|	result = vips_sumv(in, out, n, ap);
  265|  57.2k|	va_end(ap);
  266|       |
  267|  57.2k|	return result;
  268|  57.2k|}
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|}
sum.c:sum_buffer:
   73|   631k|{
   74|   631k|	VipsImage *im = arithmetic->ready[0];
   75|   631k|	int n = arithmetic->n;
   76|       |
   77|       |	/* Complex just doubles the size.
   78|       |	 */
   79|   631k|	const int sz = width * vips_image_get_bands(im) *
   80|   631k|		(vips_band_format_iscomplex(vips_image_get_format(im)) ? 2 : 1);
  ------------------
  |  Branch (80:4): [True: 0, False: 631k]
  ------------------
   81|       |
   82|   631k|	int x;
   83|   631k|	int i;
   84|       |
   85|       |	/* Sum all input types. Keep types here in sync with
   86|       |	 * vips_sum_format_table[] below.
   87|       |	 */
   88|   631k|	switch (vips_image_get_format(im)) {
   89|      0|	case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (89:2): [True: 0, False: 631k]
  ------------------
   90|      0|		LOOP(unsigned char, unsigned int);
  ------------------
  |  |   57|      0|	{ \
  |  |   58|      0|		IN **restrict p = (IN **) in; \
  |  |   59|      0|		OUT *restrict q = (OUT *) out; \
  |  |   60|      0|\
  |  |   61|      0|		for (x = 0; x < sz; x++) { \
  |  |  ------------------
  |  |  |  Branch (61:15): [True: 0, False: 0]
  |  |  ------------------
  |  |   62|      0|			OUT sum; \
  |  |   63|      0|\
  |  |   64|      0|			sum = p[0][x]; \
  |  |   65|      0|			for (i = 1; i < n; i++) \
  |  |  ------------------
  |  |  |  Branch (65:16): [True: 0, False: 0]
  |  |  ------------------
  |  |   66|      0|				sum += p[i][x]; \
  |  |   67|      0|			q[x] = sum; \
  |  |   68|      0|		} \
  |  |   69|      0|	}
  ------------------
   91|      0|		break;
   92|      0|	case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (92:2): [True: 0, False: 631k]
  ------------------
   93|      0|		LOOP(signed char, signed int);
  ------------------
  |  |   57|      0|	{ \
  |  |   58|      0|		IN **restrict p = (IN **) in; \
  |  |   59|      0|		OUT *restrict q = (OUT *) out; \
  |  |   60|      0|\
  |  |   61|      0|		for (x = 0; x < sz; x++) { \
  |  |  ------------------
  |  |  |  Branch (61:15): [True: 0, False: 0]
  |  |  ------------------
  |  |   62|      0|			OUT sum; \
  |  |   63|      0|\
  |  |   64|      0|			sum = p[0][x]; \
  |  |   65|      0|			for (i = 1; i < n; i++) \
  |  |  ------------------
  |  |  |  Branch (65:16): [True: 0, False: 0]
  |  |  ------------------
  |  |   66|      0|				sum += p[i][x]; \
  |  |   67|      0|			q[x] = sum; \
  |  |   68|      0|		} \
  |  |   69|      0|	}
  ------------------
   94|      0|		break;
   95|      0|	case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (95:2): [True: 0, False: 631k]
  ------------------
   96|      0|		LOOP(unsigned short, unsigned int);
  ------------------
  |  |   57|      0|	{ \
  |  |   58|      0|		IN **restrict p = (IN **) in; \
  |  |   59|      0|		OUT *restrict q = (OUT *) out; \
  |  |   60|      0|\
  |  |   61|      0|		for (x = 0; x < sz; x++) { \
  |  |  ------------------
  |  |  |  Branch (61:15): [True: 0, False: 0]
  |  |  ------------------
  |  |   62|      0|			OUT sum; \
  |  |   63|      0|\
  |  |   64|      0|			sum = p[0][x]; \
  |  |   65|      0|			for (i = 1; i < n; i++) \
  |  |  ------------------
  |  |  |  Branch (65:16): [True: 0, False: 0]
  |  |  ------------------
  |  |   66|      0|				sum += p[i][x]; \
  |  |   67|      0|			q[x] = sum; \
  |  |   68|      0|		} \
  |  |   69|      0|	}
  ------------------
   97|      0|		break;
   98|      0|	case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (98:2): [True: 0, False: 631k]
  ------------------
   99|      0|		LOOP(signed short, signed int);
  ------------------
  |  |   57|      0|	{ \
  |  |   58|      0|		IN **restrict p = (IN **) in; \
  |  |   59|      0|		OUT *restrict q = (OUT *) out; \
  |  |   60|      0|\
  |  |   61|      0|		for (x = 0; x < sz; x++) { \
  |  |  ------------------
  |  |  |  Branch (61:15): [True: 0, False: 0]
  |  |  ------------------
  |  |   62|      0|			OUT sum; \
  |  |   63|      0|\
  |  |   64|      0|			sum = p[0][x]; \
  |  |   65|      0|			for (i = 1; i < n; i++) \
  |  |  ------------------
  |  |  |  Branch (65:16): [True: 0, False: 0]
  |  |  ------------------
  |  |   66|      0|				sum += p[i][x]; \
  |  |   67|      0|			q[x] = sum; \
  |  |   68|      0|		} \
  |  |   69|      0|	}
  ------------------
  100|      0|		break;
  101|      0|	case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (101:2): [True: 0, False: 631k]
  ------------------
  102|      0|		LOOP(unsigned int, unsigned int);
  ------------------
  |  |   57|      0|	{ \
  |  |   58|      0|		IN **restrict p = (IN **) in; \
  |  |   59|      0|		OUT *restrict q = (OUT *) out; \
  |  |   60|      0|\
  |  |   61|      0|		for (x = 0; x < sz; x++) { \
  |  |  ------------------
  |  |  |  Branch (61:15): [True: 0, False: 0]
  |  |  ------------------
  |  |   62|      0|			OUT sum; \
  |  |   63|      0|\
  |  |   64|      0|			sum = p[0][x]; \
  |  |   65|      0|			for (i = 1; i < n; i++) \
  |  |  ------------------
  |  |  |  Branch (65:16): [True: 0, False: 0]
  |  |  ------------------
  |  |   66|      0|				sum += p[i][x]; \
  |  |   67|      0|			q[x] = sum; \
  |  |   68|      0|		} \
  |  |   69|      0|	}
  ------------------
  103|      0|		break;
  104|      0|	case VIPS_FORMAT_INT:
  ------------------
  |  Branch (104:2): [True: 0, False: 631k]
  ------------------
  105|      0|		LOOP(signed int, signed int);
  ------------------
  |  |   57|      0|	{ \
  |  |   58|      0|		IN **restrict p = (IN **) in; \
  |  |   59|      0|		OUT *restrict q = (OUT *) out; \
  |  |   60|      0|\
  |  |   61|      0|		for (x = 0; x < sz; x++) { \
  |  |  ------------------
  |  |  |  Branch (61:15): [True: 0, False: 0]
  |  |  ------------------
  |  |   62|      0|			OUT sum; \
  |  |   63|      0|\
  |  |   64|      0|			sum = p[0][x]; \
  |  |   65|      0|			for (i = 1; i < n; i++) \
  |  |  ------------------
  |  |  |  Branch (65:16): [True: 0, False: 0]
  |  |  ------------------
  |  |   66|      0|				sum += p[i][x]; \
  |  |   67|      0|			q[x] = sum; \
  |  |   68|      0|		} \
  |  |   69|      0|	}
  ------------------
  106|      0|		break;
  107|       |
  108|   631k|	case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (108:2): [True: 631k, False: 0]
  ------------------
  109|   631k|	case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (109:2): [True: 0, False: 631k]
  ------------------
  110|   631k|		LOOP(float, float);
  ------------------
  |  |   57|   631k|	{ \
  |  |   58|   631k|		IN **restrict p = (IN **) in; \
  |  |   59|   631k|		OUT *restrict q = (OUT *) out; \
  |  |   60|   631k|\
  |  |   61|  20.8M|		for (x = 0; x < sz; x++) { \
  |  |  ------------------
  |  |  |  Branch (61:15): [True: 20.2M, False: 631k]
  |  |  ------------------
  |  |   62|  20.2M|			OUT sum; \
  |  |   63|  20.2M|\
  |  |   64|  20.2M|			sum = p[0][x]; \
  |  |   65|  60.6M|			for (i = 1; i < n; i++) \
  |  |  ------------------
  |  |  |  Branch (65:16): [True: 40.4M, False: 20.2M]
  |  |  ------------------
  |  |   66|  40.4M|				sum += p[i][x]; \
  |  |   67|  20.2M|			q[x] = sum; \
  |  |   68|  20.2M|		} \
  |  |   69|   631k|	}
  ------------------
  111|   631k|		break;
  112|       |
  113|      0|	case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (113:2): [True: 0, False: 631k]
  ------------------
  114|      0|	case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (114:2): [True: 0, False: 631k]
  ------------------
  115|      0|		LOOP(double, double);
  ------------------
  |  |   57|      0|	{ \
  |  |   58|      0|		IN **restrict p = (IN **) in; \
  |  |   59|      0|		OUT *restrict q = (OUT *) out; \
  |  |   60|      0|\
  |  |   61|      0|		for (x = 0; x < sz; x++) { \
  |  |  ------------------
  |  |  |  Branch (61:15): [True: 0, False: 0]
  |  |  ------------------
  |  |   62|      0|			OUT sum; \
  |  |   63|      0|\
  |  |   64|      0|			sum = p[0][x]; \
  |  |   65|      0|			for (i = 1; i < n; i++) \
  |  |  ------------------
  |  |  |  Branch (65:16): [True: 0, False: 0]
  |  |  ------------------
  |  |   66|      0|				sum += p[i][x]; \
  |  |   67|      0|			q[x] = sum; \
  |  |   68|      0|		} \
  |  |   69|      0|	}
  ------------------
  116|      0|		break;
  117|       |
  118|      0|	default:
  ------------------
  |  Branch (118:2): [True: 0, False: 631k]
  ------------------
  119|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  120|   631k|	}
  121|   631k|}
sum.c:vips_sum_init:
  158|  57.2k|{
  159|  57.2k|}
sum.c:vips_sumv:
  163|  57.2k|{
  164|  57.2k|	VipsArrayImage *array;
  165|  57.2k|	int result;
  166|       |
  167|  57.2k|	array = vips_array_image_new(in, n);
  168|  57.2k|	result = vips_call_split("sum", ap, array, out);
  169|  57.2k|	vips_area_unref(VIPS_AREA(array));
  ------------------
  |  |  137|  57.2k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  170|       |
  171|  57.2k|	return result;
  172|  57.2k|}

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|   152k|{
   56|   152k|	VipsArithmetic *arithmetic = VIPS_ARITHMETIC(object);
  ------------------
  |  |   42|   152k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   152k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   152k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|   152k|		VIPS_TYPE_ARITHMETIC, VipsArithmetic))
  ------------------
   57|   152k|	VipsUnary *unary = VIPS_UNARY(object);
  ------------------
  |  |   42|   152k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_UNARY, VipsUnary))
  |  |  ------------------
  |  |  |  |  484|   152k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   152k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   58|       |
   59|   152k|	arithmetic->n = 1;
   60|   152k|	arithmetic->in = (VipsImage **) vips_object_local_array(object, 1);
   61|   152k|	arithmetic->in[0] = unary->in;
   62|   152k|	if (arithmetic->in[0])
  ------------------
  |  Branch (62:6): [True: 152k, False: 0]
  ------------------
   63|   152k|		g_object_ref(arithmetic->in[0]);
   64|       |
   65|   152k|	if (VIPS_OBJECT_CLASS(vips_unary_parent_class)->build(object))
  ------------------
  |  |  435|   152k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|   152k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   152k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (65:6): [True: 0, False: 152k]
  ------------------
   66|      0|		return -1;
   67|       |
   68|   152k|	return 0;
   69|   152k|}
unary.c:vips_unary_init:
   96|   152k|{
   97|       |	/* Init our instance fields.
   98|       |	 */
   99|   152k|}

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|  57.2k|{
   58|  57.2k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  57.2k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  57.2k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  57.2k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   59|  57.2k|	VipsArithmetic *arithmetic = VIPS_ARITHMETIC(object);
  ------------------
  |  |   42|  57.2k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  57.2k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  57.2k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|  57.2k|		VIPS_TYPE_ARITHMETIC, VipsArithmetic))
  ------------------
   60|  57.2k|	VipsUnary *unary = (VipsUnary *) object;
   61|  57.2k|	VipsUnaryConst *uconst = (VipsUnaryConst *) object;
   62|       |
   63|       |	/* If we have a three-element vector we need to bandup the image to
   64|       |	 * match.
   65|       |	 */
   66|  57.2k|	uconst->n = 1;
   67|  57.2k|	if (uconst->c)
  ------------------
  |  Branch (67:6): [True: 57.2k, False: 0]
  ------------------
   68|  57.2k|		uconst->n = VIPS_MAX(uconst->n, uconst->c->n);
  ------------------
  |  |   54|  57.2k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 57.2k]
  |  |  ------------------
  ------------------
   69|  57.2k|	if (unary->in)
  ------------------
  |  Branch (69:6): [True: 57.2k, False: 0]
  ------------------
   70|  57.2k|		uconst->n = VIPS_MAX(uconst->n, unary->in->Bands);
  ------------------
  |  |   54|  57.2k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 57.2k]
  |  |  ------------------
  ------------------
   71|  57.2k|	arithmetic->base_bands = uconst->n;
   72|       |
   73|  57.2k|	if (unary->in &&
  ------------------
  |  Branch (73:6): [True: 57.2k, False: 0]
  ------------------
   74|  57.2k|		uconst->c) {
  ------------------
  |  Branch (74:3): [True: 57.2k, False: 0]
  ------------------
   75|  57.2k|		if (vips_check_vector(class->nickname,
  ------------------
  |  Branch (75:7): [True: 0, False: 57.2k]
  ------------------
   76|  57.2k|				uconst->c->n, unary->in))
   77|      0|			return -1;
   78|  57.2k|	}
   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|  57.2k|	if (uconst->c) {
  ------------------
  |  Branch (90:6): [True: 57.2k, False: 0]
  ------------------
   91|  57.2k|		gboolean is_complex =
   92|  57.2k|			vips_band_format_iscomplex(unary->in->BandFmt);
   93|  57.2k|		int step = is_complex ? 2 : 1;
  ------------------
  |  Branch (93:14): [True: 0, False: 57.2k]
  ------------------
   94|  57.2k|		int n = step * uconst->n;
   95|  57.2k|		double *c = (double *) uconst->c->data;
   96|       |
   97|  57.2k|		int i;
   98|       |
   99|  57.2k|		uconst->c_int = VIPS_ARRAY(object, n, int);
  ------------------
  |  |   72|  57.2k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  57.2k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  57.2k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  57.2k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  57.2k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  100|  57.2k|		uconst->c_double = VIPS_ARRAY(object, n, double);
  ------------------
  |  |   72|  57.2k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  57.2k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  57.2k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  57.2k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  57.2k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  101|  57.2k|		if (!uconst->c_int ||
  ------------------
  |  Branch (101:7): [True: 0, False: 57.2k]
  ------------------
  102|  57.2k|			!uconst->c_double)
  ------------------
  |  Branch (102:4): [True: 0, False: 57.2k]
  ------------------
  103|      0|			return -1;
  104|  57.2k|		memset(uconst->c_int, 0, n * sizeof(int));
  105|  57.2k|		memset(uconst->c_double, 0, n * sizeof(double));
  106|       |
  107|   114k|		for (i = 0; i < n; i += step)
  ------------------
  |  Branch (107:15): [True: 57.2k, False: 57.2k]
  ------------------
  108|  57.2k|			uconst->c_double[i] =
  109|  57.2k|				c[VIPS_MIN(i / step, uconst->c->n - 1)];
  ------------------
  |  |   55|  57.2k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 0, False: 57.2k]
  |  |  ------------------
  ------------------
  110|       |
  111|   114k|		for (i = 0; i < n; i += step)
  ------------------
  |  Branch (111:15): [True: 57.2k, False: 57.2k]
  ------------------
  112|  57.2k|			uconst->c_int[i] = uconst->c_double[i];
  113|       |
  114|  57.2k|		uconst->is_int = TRUE;
  ------------------
  |  |  798|  57.2k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  57.2k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  115|  76.3k|		for (i = 0; i < n; i += step)
  ------------------
  |  Branch (115:15): [True: 57.2k, False: 19.0k]
  ------------------
  116|  57.2k|			if (uconst->c_int[i] != uconst->c_double[i]) {
  ------------------
  |  Branch (116:8): [True: 38.1k, False: 19.0k]
  ------------------
  117|  38.1k|				uconst->is_int = FALSE;
  ------------------
  |  |  794|  38.1k|#define	FALSE	(0)
  ------------------
  118|  38.1k|				break;
  119|  38.1k|			}
  120|  57.2k|	}
  121|       |
  122|  57.2k|	if (VIPS_OBJECT_CLASS(vips_unary_const_parent_class)->build(object))
  ------------------
  |  |  435|  57.2k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  57.2k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  57.2k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (122:6): [True: 0, False: 57.2k]
  ------------------
  123|      0|		return -1;
  124|       |
  125|  57.2k|	return 0;
  126|  57.2k|}
unaryconst.c:vips_unary_const_init:
  151|  57.2k|{
  152|  57.2k|}

vips_CMYK2XYZ:
  222|    840|{
  223|    840|	va_list ap;
  224|    840|	int result;
  225|       |
  226|    840|	va_start(ap, out);
  227|    840|	result = vips_call_split("CMYK2XYZ", ap, in, out);
  228|    840|	va_end(ap);
  229|       |
  230|    840|	return result;
  231|    840|}
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|}
CMYK2XYZ.c:vips_CMYK2XYZ_build:
   79|    840|{
   80|    840|	VipsCMYK2XYZ *CMYK2XYZ = (VipsCMYK2XYZ *) object;
   81|       |
   82|    840|	VipsImage *out;
   83|    840|	VipsImage *t;
   84|       |
   85|    840|	if (VIPS_OBJECT_CLASS(vips_CMYK2XYZ_parent_class)->build(object))
  ------------------
  |  |  435|    840|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|    840|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    840|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (85:6): [True: 0, False: 840]
  ------------------
   86|      0|		return -1;
   87|       |
   88|    840|	out = vips_image_new();
   89|    840|	g_object_set(object, "out", out, NULL);
   90|       |
   91|    840|	if (vips__colourspace_process_n("CMYK2XYZ",
  ------------------
  |  Branch (91:6): [True: 0, False: 840]
  ------------------
   92|    840|			CMYK2XYZ->in, &t, 4, vips_CMYK2XYZ_process))
   93|      0|		return -1;
   94|    840|	if (vips_image_write(t, out)) {
  ------------------
  |  Branch (94:6): [True: 0, False: 840]
  ------------------
   95|      0|		g_object_unref(t);
   96|      0|		return -1;
   97|      0|	}
   98|    840|	g_object_unref(t);
   99|       |
  100|    840|	return 0;
  101|    840|}
CMYK2XYZ.c:vips_CMYK2XYZ_process:
   69|    840|{
   70|    840|	return vips_icc_import(in, out,
   71|    840|		"input_profile", "cmyk",
   72|    840|		"embedded", TRUE,
  ------------------
  |  |  798|    840|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|    840|#define	FALSE	(0)
  |  |  ------------------
  ------------------
   73|    840|		"pcs", VIPS_PCS_XYZ,
   74|    840|		NULL);
   75|    840|}
CMYK2XYZ.c:vips_CMYK2XYZ_init:
  134|    840|{
  135|    840|}

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|    166|{
  220|    166|	va_list ap;
  221|    166|	int result;
  222|       |
  223|    166|	va_start(ap, out);
  224|    166|	result = vips_call_split("Lab2XYZ", ap, in, out);
  225|    166|	va_end(ap);
  226|       |
  227|    166|	return result;
  228|    166|}
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|    166|{
  148|    166|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|    166|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|    166|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|    166|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  149|    166|	VipsLab2XYZ *Lab2XYZ = (VipsLab2XYZ *) object;
  150|       |
  151|    166|	if (Lab2XYZ->temp) {
  ------------------
  |  Branch (151:6): [True: 0, False: 166]
  ------------------
  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|    166|	if (VIPS_OBJECT_CLASS(vips_Lab2XYZ_parent_class)->build(object))
  ------------------
  |  |  435|    166|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|    166|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    166|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (160:6): [True: 0, False: 166]
  ------------------
  161|      0|		return -1;
  162|       |
  163|    166|	return 0;
  164|    166|}
Lab2XYZ.c:vips_Lab2XYZ_line:
  115|  4.67k|{
  116|  4.67k|	VipsLab2XYZ *Lab2XYZ = (VipsLab2XYZ *) colour;
  117|  4.67k|	float *restrict p = (float *) in[0];
  118|  4.67k|	float *restrict q = (float *) out;
  119|       |
  120|  4.67k|	int x;
  121|       |
  122|  4.67k|	VIPS_DEBUG_MSG("vips_Lab2XYZ_line: X0 = %g, Y0 = %g, Z0 = %g\n",
  ------------------
  |  |   47|  4.67k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  4.67k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  4.67k|	{ \
  |  |   49|  4.67k|		; \
  |  |   50|  4.67k|	} \
  |  |   51|  4.67k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  4.67k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  123|  4.67k|		Lab2XYZ->X0, Lab2XYZ->Y0, Lab2XYZ->Z0);
  124|       |
  125|   154k|	for (x = 0; x < width; x++) {
  ------------------
  |  Branch (125:14): [True: 149k, False: 4.67k]
  ------------------
  126|   149k|		float L, a, b;
  127|   149k|		float X, Y, Z;
  128|       |
  129|   149k|		L = p[0];
  130|   149k|		a = p[1];
  131|   149k|		b = p[2];
  132|   149k|		p += 3;
  133|       |
  134|   149k|		vips_col_Lab2XYZ_helper(Lab2XYZ, L, a, b, &X, &Y, &Z);
  135|       |
  136|       |		/* Write.
  137|       |		 */
  138|   149k|		q[0] = X;
  139|   149k|		q[1] = Y;
  140|   149k|		q[2] = Z;
  141|   149k|		q += 3;
  142|   149k|	}
  143|  4.67k|}
Lab2XYZ.c:vips_Lab2XYZ_init:
  192|    166|{
  193|    166|	VipsColour *colour = VIPS_COLOUR(Lab2XYZ);
  ------------------
  |  |   42|    166|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|    166|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    166|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|    166|		VIPS_TYPE_COLOUR, VipsColour))
  ------------------
  194|       |
  195|    166|	Lab2XYZ->X0 = VIPS_D65_X0;
  ------------------
  |  |   58|    166|#define VIPS_D65_X0 (95.0470)
  ------------------
  196|    166|	Lab2XYZ->Y0 = VIPS_D65_Y0;
  ------------------
  |  |   59|    166|#define VIPS_D65_Y0 (100.0)
  ------------------
  197|    166|	Lab2XYZ->Z0 = VIPS_D65_Z0;
  ------------------
  |  |   60|    166|#define VIPS_D65_Z0 (108.8827)
  ------------------
  198|       |
  199|    166|	colour->interpretation = VIPS_INTERPRETATION_XYZ;
  200|    166|}
Lab2XYZ.c:vips_col_Lab2XYZ_helper:
   86|   149k|{
   87|   149k|	double cby, tmp;
   88|       |
   89|   149k|	if (L < 8.0) {
  ------------------
  |  Branch (89:6): [True: 125k, False: 23.9k]
  ------------------
   90|   125k|		*Y = (L * Lab2XYZ->Y0) / 903.3;
   91|   125k|		cby = 7.787 * (*Y / Lab2XYZ->Y0) + 16.0 / 116.0;
   92|   125k|	}
   93|  23.9k|	else {
   94|  23.9k|		cby = (L + 16.0) / 116.0;
   95|  23.9k|		*Y = Lab2XYZ->Y0 * cby * cby * cby;
   96|  23.9k|	}
   97|       |
   98|   149k|	tmp = a / 500.0 + cby;
   99|   149k|	if (tmp < 0.2069)
  ------------------
  |  Branch (99:6): [True: 122k, False: 26.5k]
  ------------------
  100|   122k|		*X = Lab2XYZ->X0 * (tmp - 0.13793) / 7.787;
  101|  26.5k|	else
  102|  26.5k|		*X = Lab2XYZ->X0 * tmp * tmp * tmp;
  103|       |
  104|   149k|	tmp = cby - b / 200.0;
  105|   149k|	if (tmp < 0.2069)
  ------------------
  |  Branch (105:6): [True: 129k, False: 19.7k]
  ------------------
  106|   129k|		*Z = Lab2XYZ->Z0 * (tmp - 0.13793) / 7.787;
  107|  19.7k|	else
  108|  19.7k|		*Z = Lab2XYZ->Z0 * tmp * tmp * tmp;
  109|   149k|}

vips_LabQ2Lab:
  158|     89|{
  159|     89|	va_list ap;
  160|     89|	int result;
  161|       |
  162|     89|	va_start(ap, out);
  163|     89|	result = vips_call_split("LabQ2Lab", ap, in, out);
  164|     89|	va_end(ap);
  165|       |
  166|     89|	return result;
  167|     89|}
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|     89|{
  133|     89|	VipsColour *colour = VIPS_COLOUR(LabQ2Lab);
  ------------------
  |  |   42|     89|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|     89|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|     89|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|     89|		VIPS_TYPE_COLOUR, VipsColour))
  ------------------
  134|     89|	VipsColourCode *code = VIPS_COLOUR_CODE(LabQ2Lab);
  ------------------
  |  |  135|     89|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|     89|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|     89|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  136|     89|		VIPS_TYPE_COLOUR_CODE, VipsColourCode))
  ------------------
  135|       |
  136|     89|	colour->coding = VIPS_CODING_NONE;
  137|     89|	colour->interpretation = VIPS_INTERPRETATION_LAB;
  138|     89|	colour->format = VIPS_FORMAT_FLOAT;
  139|     89|	colour->bands = 3;
  140|       |
  141|     89|	code->input_coding = VIPS_CODING_LABQ;
  142|     89|}
LabQ2Lab.c:vips_LabQ2Lab_line:
   76|  2.74k|{
   77|  2.74k|	signed char *restrict p = (signed char *) in[0];
   78|  2.74k|	float *restrict q = (float *) out;
   79|       |
   80|  2.74k|	int l;
   81|  2.74k|	int lsbs; /* for lsbs byte */
   82|  2.74k|	int i;	  /* counter      */
   83|       |
   84|       |	/* Read input with a signed pointer to get signed ab easily.
   85|       |	 */
   86|   124k|	for (i = 0; i < width; i++) {
  ------------------
  |  Branch (86:14): [True: 121k, False: 2.74k]
  ------------------
   87|       |		/* Get extra bits.
   88|       |		 */
   89|   121k|		lsbs = ((unsigned char *) p)[3];
   90|       |
   91|       |		/* Build L.
   92|       |		 */
   93|   121k|		l = ((unsigned char *) p)[0];
   94|   121k|		l = (l << 2) | (lsbs >> 6);
   95|   121k|		q[0] = (float) l * (100.0 / 1023.0);
   96|       |
   97|       |		/* Build a.
   98|       |		 */
   99|   121k|		l = VIPS_LSHIFT_INT(p[1], 3) | ((lsbs >> 3) & 0x7);
  ------------------
  |  |   87|   121k|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  ------------------
  100|   121k|		q[1] = (float) l * 0.125;
  101|       |
  102|       |		/* And b.
  103|       |		 */
  104|   121k|		l = VIPS_LSHIFT_INT(p[2], 3) | (lsbs & 0x7);
  ------------------
  |  |   87|   121k|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  ------------------
  105|   121k|		q[2] = (float) l * 0.125;
  106|       |
  107|   121k|		p += 4;
  108|   121k|		q += 3;
  109|   121k|	}
  110|  2.74k|}

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|  6.47k|{
  172|  6.47k|	static GOnce once = G_ONCE_INIT;
  ------------------
  |  |  102|  6.47k|#define G_ONCE_INIT { G_ONCE_STATUS_NOTCALLED, NULL }
  ------------------
  173|       |
  174|  6.47k|	VIPS_ONCE(&once, calcul_tables_8, NULL);
  ------------------
  |  |   93|  6.47k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  6.47k|#define G_STMT_START  do
  |  |  ------------------
  |  |   94|  6.47k|	{ \
  |  |   95|  6.47k|		if (G_UNLIKELY((ONCE)->status != G_ONCE_STATUS_READY)) \
  |  |  ------------------
  |  |  |  |  935|  6.47k|#define G_UNLIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 0))
  |  |  |  |  ------------------
  |  |  |  |  |  |  926|  6.47k| G_GNUC_EXTENSION ({                            \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  6.47k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  927|  6.47k|   int _g_boolean_var_;                         \
  |  |  |  |  |  |  928|  6.47k|   if (expr)                                    \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (928:8): [True: 1, False: 6.47k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  929|  6.47k|      _g_boolean_var_ = 1;                      \
  |  |  |  |  |  |  930|  6.47k|   else                                         \
  |  |  |  |  |  |  931|  6.47k|      _g_boolean_var_ = 0;                      \
  |  |  |  |  |  |  932|  6.47k|   _g_boolean_var_;                             \
  |  |  |  |  |  |  933|  6.47k|})
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (935:26): [True: 1, False: 6.47k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   96|  6.47k|			(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|  6.47k|	} \
  |  |   98|  6.47k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  6.47k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  175|  6.47k|}
vips_col_make_tables_RGB_16:
  195|    478|{
  196|    478|	static GOnce once = G_ONCE_INIT;
  ------------------
  |  |  102|    478|#define G_ONCE_INIT { G_ONCE_STATUS_NOTCALLED, NULL }
  ------------------
  197|       |
  198|    478|	VIPS_ONCE(&once, calcul_tables_16, NULL);
  ------------------
  |  |   93|    478|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    478|#define G_STMT_START  do
  |  |  ------------------
  |  |   94|    478|	{ \
  |  |   95|    478|		if (G_UNLIKELY((ONCE)->status != G_ONCE_STATUS_READY)) \
  |  |  ------------------
  |  |  |  |  935|    478|#define G_UNLIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 0))
  |  |  |  |  ------------------
  |  |  |  |  |  |  926|    478| G_GNUC_EXTENSION ({                            \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|    478|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  927|    478|   int _g_boolean_var_;                         \
  |  |  |  |  |  |  928|    478|   if (expr)                                    \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (928:8): [True: 1, False: 477]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  929|    478|      _g_boolean_var_ = 1;                      \
  |  |  |  |  |  |  930|    478|   else                                         \
  |  |  |  |  |  |  931|    478|      _g_boolean_var_ = 0;                      \
  |  |  |  |  |  |  932|    478|   _g_boolean_var_;                             \
  |  |  |  |  |  |  933|    478|})
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (935:26): [True: 1, False: 477]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   96|    478|			(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|    478|	} \
  |  |   98|    478|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    478|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  199|    478|}
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: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|      2|{
  132|      2|	int i;
  133|       |
  134|  65.7k|	for (i = 0; i < range; i++) {
  ------------------
  |  Branch (134:14): [True: 65.7k, False: 2]
  ------------------
  135|  65.7k|		float f = (float) i / (range - 1);
  136|  65.7k|		float v;
  137|       |
  138|  65.7k|		if (f <= 0.0031308)
  ------------------
  |  Branch (138:7): [True: 207, False: 65.5k]
  ------------------
  139|    207|			v = 12.92 * f;
  140|  65.5k|		else
  141|  65.5k|			v = (1.0 + 0.055) * pow(f, 1.0 / 2.4) - 0.055;
  142|       |
  143|  65.7k|		Y2v[i] = VIPS_RINT((range - 1) * v);
  ------------------
  |  |   74|  65.7k|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  144|  65.7k|	}
  145|       |
  146|       |	/* Copy the final element. This is used in the piecewise linear
  147|       |	 * interpolator below.
  148|       |	 */
  149|      2|	Y2v[range] = Y2v[range - 1];
  150|       |
  151|  65.7k|	for (i = 0; i < range; i++) {
  ------------------
  |  Branch (151:14): [True: 65.7k, False: 2]
  ------------------
  152|  65.7k|		float f = (float) i / (range - 1);
  153|       |
  154|  65.7k|		if (f <= 0.04045)
  ------------------
  |  Branch (154:7): [True: 2.66k, False: 63.1k]
  ------------------
  155|  2.66k|			v2Y[i] = f / 12.92;
  156|  63.1k|		else
  157|  63.1k|			v2Y[i] = pow((f + 0.055) / (1 + 0.055), 2.4);
  158|  65.7k|	}
  159|      2|}
LabQ2sRGB.c:calcul_tables_16:
  187|      1|{
  188|      1|	calcul_tables(65536, vips_Y2v_16, vips_v2Y_16);
  189|       |
  190|      1|	return NULL;
  191|      1|}

vips_LabS2Lab:
  112|    119|{
  113|    119|	va_list ap;
  114|    119|	int result;
  115|       |
  116|    119|	va_start(ap, out);
  117|    119|	result = vips_call_split("LabS2Lab", ap, in, out);
  118|    119|	va_end(ap);
  119|       |
  120|    119|	return result;
  121|    119|}
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|  3.80k|{
   57|  3.80k|	signed short *p = (signed short *) in[0];
   58|  3.80k|	float *q = (float *) out;
   59|  3.80k|	int i;
   60|       |
   61|   125k|	for (i = 0; i < width; i++) {
  ------------------
  |  Branch (61:14): [True: 121k, False: 3.80k]
  ------------------
   62|   121k|		q[0] = p[0] / (32767.0 / 100.0);
   63|   121k|		q[1] = p[1] / (32768.0 / 128.0);
   64|   121k|		q[2] = p[2] / (32768.0 / 128.0);
   65|       |
   66|   121k|		p += 3;
   67|   121k|		q += 3;
   68|   121k|	}
   69|  3.80k|}
LabS2Lab.c:vips_LabS2Lab_init:
   85|    119|{
   86|    119|	VipsColour *colour = VIPS_COLOUR(LabS2Lab);
  ------------------
  |  |   42|    119|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|    119|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    119|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|    119|		VIPS_TYPE_COLOUR, VipsColour))
  ------------------
   87|    119|	VipsColourCode *code = VIPS_COLOUR_CODE(LabS2Lab);
  ------------------
  |  |  135|    119|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|    119|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    119|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  136|    119|		VIPS_TYPE_COLOUR_CODE, VipsColourCode))
  ------------------
   88|       |
   89|    119|	colour->interpretation = VIPS_INTERPRETATION_LAB;
   90|    119|	colour->format = VIPS_FORMAT_FLOAT;
   91|    119|	colour->input_bands = 3;
   92|    119|	colour->bands = 3;
   93|       |
   94|    119|	code->input_coding = VIPS_CODING_NONE;
   95|    119|	code->input_format = VIPS_FORMAT_SHORT;
   96|    119|}

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|}

vips_XYZ2Lab:
  272|  19.0k|{
  273|  19.0k|	va_list ap;
  274|  19.0k|	int result;
  275|       |
  276|  19.0k|	va_start(ap, out);
  277|  19.0k|	result = vips_call_split("XYZ2Lab", ap, in, out);
  278|  19.0k|	va_end(ap);
  279|       |
  280|  19.0k|	return result;
  281|  19.0k|}
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|}
XYZ2Lab.c:vips_XYZ2Lab_build:
  200|  19.0k|{
  201|  19.0k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  19.0k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  19.0k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  19.0k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  202|  19.0k|	VipsXYZ2Lab *XYZ2Lab = (VipsXYZ2Lab *) object;
  203|       |
  204|  19.0k|	if (XYZ2Lab->temp) {
  ------------------
  |  Branch (204:6): [True: 0, False: 19.0k]
  ------------------
  205|      0|		if (vips_check_vector_length(class->nickname,
  ------------------
  |  Branch (205:7): [True: 0, False: 0]
  ------------------
  206|      0|				XYZ2Lab->temp->n, 3))
  207|      0|			return -1;
  208|      0|		XYZ2Lab->X0 = ((double *) XYZ2Lab->temp->data)[0];
  209|      0|		XYZ2Lab->Y0 = ((double *) XYZ2Lab->temp->data)[1];
  210|      0|		XYZ2Lab->Z0 = ((double *) XYZ2Lab->temp->data)[2];
  211|      0|	}
  212|       |
  213|  19.0k|	if (VIPS_OBJECT_CLASS(vips_XYZ2Lab_parent_class)->build(object))
  ------------------
  |  |  435|  19.0k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  19.0k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  19.0k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (213:6): [True: 0, False: 19.0k]
  ------------------
  214|      0|		return -1;
  215|       |
  216|  19.0k|	return 0;
  217|  19.0k|}
XYZ2Lab.c:vips_XYZ2Lab_init:
  245|  19.0k|{
  246|  19.0k|	VipsColour *colour = VIPS_COLOUR(XYZ2Lab);
  ------------------
  |  |   42|  19.0k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  19.0k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  19.0k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|  19.0k|		VIPS_TYPE_COLOUR, VipsColour))
  ------------------
  247|       |
  248|  19.0k|	XYZ2Lab->X0 = VIPS_D65_X0;
  ------------------
  |  |   58|  19.0k|#define VIPS_D65_X0 (95.0470)
  ------------------
  249|  19.0k|	XYZ2Lab->Y0 = VIPS_D65_Y0;
  ------------------
  |  |   59|  19.0k|#define VIPS_D65_Y0 (100.0)
  ------------------
  250|  19.0k|	XYZ2Lab->Z0 = VIPS_D65_Z0;
  ------------------
  |  |   60|  19.0k|#define VIPS_D65_Z0 (108.8827)
  ------------------
  251|       |
  252|  19.0k|	colour->interpretation = VIPS_INTERPRETATION_LAB;
  253|  19.0k|}
XYZ2Lab.c:table_init:
   93|      1|{
   94|      1|	int i;
   95|       |
   96|   100k|	for (i = 0; i < QUANT_ELEMENTS; i++) {
  ------------------
  |  |   66|   100k|#define QUANT_ELEMENTS (100000)
  ------------------
  |  Branch (96:14): [True: 100k, False: 1]
  ------------------
   97|   100k|		float Y = (double) i / QUANT_ELEMENTS;
  ------------------
  |  |   66|   100k|#define QUANT_ELEMENTS (100000)
  ------------------
   98|       |
   99|   100k|		if (Y < 0.008856)
  ------------------
  |  Branch (99:7): [True: 886, False: 99.1k]
  ------------------
  100|    886|			cbrt_table[i] = 7.787 * Y + (16.0 / 116.0);
  101|  99.1k|		else
  102|  99.1k|			cbrt_table[i] = cbrt(Y);
  103|   100k|	}
  104|       |
  105|      1|	return NULL;
  106|      1|}
XYZ2Lab.c:vips_col_XYZ2Lab_helper:
  111|  6.06M|{
  112|  6.06M|	float nX, nY, nZ;
  113|  6.06M|	int i;
  114|  6.06M|	float f;
  115|  6.06M|	float cbx, cby, cbz;
  116|       |
  117|  6.06M|	nX = QUANT_ELEMENTS * X / XYZ2Lab->X0;
  ------------------
  |  |   66|  6.06M|#define QUANT_ELEMENTS (100000)
  ------------------
  118|  6.06M|	nY = QUANT_ELEMENTS * Y / XYZ2Lab->Y0;
  ------------------
  |  |   66|  6.06M|#define QUANT_ELEMENTS (100000)
  ------------------
  119|  6.06M|	nZ = QUANT_ELEMENTS * Z / XYZ2Lab->Z0;
  ------------------
  |  |   66|  6.06M|#define QUANT_ELEMENTS (100000)
  ------------------
  120|       |
  121|       |	/* CLIP is much faster than FCLIP, and we want an int result.
  122|       |	 */
  123|  6.06M|	i = VIPS_CLIP(0, (int) nX, QUANT_ELEMENTS - 2);
  ------------------
  |  |   57|  6.06M|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|  12.1M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 129k, False: 5.93M]
  |  |  |  |  |  Branch (54:32): [True: 1.34M, False: 4.71M]
  |  |  |  |  |  Branch (54:44): [True: 1.34M, False: 4.58M]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  124|  6.06M|	f = nX - i;
  125|  6.06M|	cbx = cbrt_table[i] + f * (cbrt_table[i + 1] - cbrt_table[i]);
  126|       |
  127|  6.06M|	i = VIPS_CLIP(0, (int) nY, QUANT_ELEMENTS - 2);
  ------------------
  |  |   57|  6.06M|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|  12.1M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 132k, False: 5.93M]
  |  |  |  |  |  Branch (54:32): [True: 1.36M, False: 4.69M]
  |  |  |  |  |  Branch (54:44): [True: 1.36M, False: 4.56M]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  128|  6.06M|	f = nY - i;
  129|  6.06M|	cby = cbrt_table[i] + f * (cbrt_table[i + 1] - cbrt_table[i]);
  130|       |
  131|  6.06M|	i = VIPS_CLIP(0, (int) nZ, QUANT_ELEMENTS - 2);
  ------------------
  |  |   57|  6.06M|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|  12.1M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 147k, False: 5.91M]
  |  |  |  |  |  Branch (54:32): [True: 1.37M, False: 4.69M]
  |  |  |  |  |  Branch (54:44): [True: 1.37M, False: 4.54M]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  132|  6.06M|	f = nZ - i;
  133|  6.06M|	cbz = cbrt_table[i] + f * (cbrt_table[i + 1] - cbrt_table[i]);
  134|       |
  135|  6.06M|	*L = 116.0 * cby - 16.0;
  136|  6.06M|	*a = 500.0 * (cbx - cby);
  137|  6.06M|	*b = 200.0 * (cby - cbz);
  138|  6.06M|}
XYZ2Lab.c:vips_XYZ2Lab_line.avx.0:
  145|   189k|{
  146|   189k|	VipsXYZ2Lab *XYZ2Lab = (VipsXYZ2Lab *) colour;
  147|   189k|	float *p = (float *) in[0];
  148|   189k|	float *q = (float *) out;
  149|       |
  150|   189k|	int x;
  151|       |
  152|   189k|	VIPS_ONCE(&table_init_once, table_init, NULL);
  ------------------
  |  |   93|   189k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   189k|#define G_STMT_START  do
  |  |  ------------------
  |  |   94|   189k|	{ \
  |  |   95|   189k|		if (G_UNLIKELY((ONCE)->status != G_ONCE_STATUS_READY)) \
  |  |  ------------------
  |  |  |  |  935|   189k|#define G_UNLIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 0))
  |  |  |  |  ------------------
  |  |  |  |  |  |  926|   189k| G_GNUC_EXTENSION ({                            \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   189k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  927|   189k|   int _g_boolean_var_;                         \
  |  |  |  |  |  |  928|   189k|   if (expr)                                    \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (928:8): [True: 1, False: 189k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  929|   189k|      _g_boolean_var_ = 1;                      \
  |  |  |  |  |  |  930|   189k|   else                                         \
  |  |  |  |  |  |  931|   189k|      _g_boolean_var_ = 0;                      \
  |  |  |  |  |  |  932|   189k|   _g_boolean_var_;                             \
  |  |  |  |  |  |  933|   189k|})
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (935:26): [True: 1, False: 189k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   96|   189k|			(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|   189k|	} \
  |  |   98|   189k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   189k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  153|       |
  154|  6.25M|	for (x = 0; x < width; x++) {
  ------------------
  |  Branch (154:14): [True: 6.06M, False: 189k]
  ------------------
  155|  6.06M|		float X, Y, Z;
  156|  6.06M|		float L, a, b;
  157|       |
  158|  6.06M|		X = p[0];
  159|  6.06M|		Y = p[1];
  160|  6.06M|		Z = p[2];
  161|  6.06M|		p += 3;
  162|       |
  163|  6.06M|		vips_col_XYZ2Lab_helper(XYZ2Lab, X, Y, Z, &L, &a, &b);
  164|       |
  165|  6.06M|		q[0] = L;
  166|  6.06M|		q[1] = a;
  167|  6.06M|		q[2] = b;
  168|  6.06M|		q += 3;
  169|  6.06M|	}
  170|   189k|}

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|}

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|}

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|  20.4k|{
  268|  20.4k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  20.4k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  20.4k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  20.4k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  269|  20.4k|	VipsColour *colour = VIPS_COLOUR(object);
  ------------------
  |  |   42|  20.4k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  20.4k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  20.4k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|  20.4k|		VIPS_TYPE_COLOUR, VipsColour))
  ------------------
  270|       |
  271|  20.4k|	VipsImage **in;
  272|  20.4k|	VipsImage **extra_bands;
  273|  20.4k|	VipsImage *out;
  274|       |
  275|  20.4k|	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|  20.4k|	if (VIPS_OBJECT_CLASS(vips_colour_parent_class)->build(object))
  ------------------
  |  |  435|  20.4k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  20.4k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  20.4k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (283:6): [True: 0, False: 20.4k]
  ------------------
  284|      0|		return -1;
  285|       |
  286|  20.4k|	if (colour->n > MAX_INPUT_IMAGES) {
  ------------------
  |  |  223|  20.4k|#define MAX_INPUT_IMAGES (64)
  ------------------
  |  Branch (286:6): [True: 0, False: 20.4k]
  ------------------
  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|  40.9k|	for (i = 0; i < colour->n; i++)
  ------------------
  |  Branch (291:14): [True: 20.4k, False: 20.4k]
  ------------------
  292|  20.4k|		if (vips_image_pio_input(colour->in[i]))
  ------------------
  |  Branch (292:7): [True: 0, False: 20.4k]
  ------------------
  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|  20.4k|	g_assert(!colour->in[colour->n]);
  ------------------
  |  |  166|  20.4k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  20.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  20.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  299|       |
  300|  20.4k|	in = colour->in;
  301|  20.4k|	extra_bands = (VipsImage **)
  302|  20.4k|		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|  20.4k|	if (colour->input_bands > 0) {
  ------------------
  |  Branch (307:6): [True: 20.2k, False: 289]
  ------------------
  308|  20.2k|		VipsImage **new_in = (VipsImage **)
  309|  20.2k|			vips_object_local_array(object, colour->n);
  310|       |
  311|  40.4k|		for (i = 0; i < colour->n; i++) {
  ------------------
  |  Branch (311:15): [True: 20.2k, False: 20.2k]
  ------------------
  312|  20.2k|			if (vips_check_bands_atleast(class->nickname,
  ------------------
  |  Branch (312:8): [True: 0, False: 20.2k]
  ------------------
  313|  20.2k|					in[i], colour->input_bands))
  314|      0|				return -1;
  315|       |
  316|  20.2k|			if (in[i]->Bands > colour->input_bands) {
  ------------------
  |  Branch (316:8): [True: 225, False: 19.9k]
  ------------------
  317|    225|				if (vips_extract_band(in[i], &new_in[i], 0,
  ------------------
  |  Branch (317:9): [True: 0, False: 225]
  ------------------
  318|    225|						"n", colour->input_bands,
  319|    225|						NULL))
  320|      0|					return -1;
  321|    225|			}
  322|  19.9k|			else {
  323|  19.9k|				new_in[i] = in[i];
  324|  19.9k|				g_object_ref(new_in[i]);
  325|  19.9k|			}
  326|       |
  327|  20.2k|			if (in[i]->Bands > colour->input_bands)
  ------------------
  |  Branch (327:8): [True: 225, False: 19.9k]
  ------------------
  328|    225|				if (vips_extract_band(in[i], &extra_bands[i],
  ------------------
  |  Branch (328:9): [True: 0, False: 225]
  ------------------
  329|    225|						colour->input_bands,
  330|    225|						"n", in[i]->Bands - colour->input_bands,
  331|    225|						NULL))
  332|      0|					return -1;
  333|  20.2k|		}
  334|       |
  335|  20.2k|		in = new_in;
  336|  20.2k|	}
  337|       |
  338|  20.4k|	out = vips_image_new();
  339|  20.4k|	if (vips_image_pipeline_array(out,
  ------------------
  |  Branch (339:6): [True: 0, False: 20.4k]
  ------------------
  340|  20.4k|			VIPS_DEMAND_STYLE_THINSTRIP, in)) {
  341|      0|		g_object_unref(out);
  342|      0|		return -1;
  343|      0|	}
  344|  20.4k|	out->Coding = colour->coding;
  345|  20.4k|	out->Type = colour->interpretation;
  346|  20.4k|	out->BandFmt = colour->format;
  347|  20.4k|	out->Bands = colour->bands;
  348|       |
  349|  20.4k|	if (colour->profile_filename &&
  ------------------
  |  Branch (349:6): [True: 0, False: 20.4k]
  ------------------
  350|  20.4k|		vips__profile_set(out, colour->profile_filename))
  ------------------
  |  Branch (350:3): [True: 0, False: 0]
  ------------------
  351|      0|		return -1;
  352|       |
  353|  20.4k|	if (vips_image_generate(out,
  ------------------
  |  Branch (353:6): [True: 0, False: 20.4k]
  ------------------
  354|  20.4k|			vips_start_many, vips_colour_gen, vips_stop_many,
  355|  20.4k|			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|  40.7k|	for (i = 0; i < colour->n; i++)
  ------------------
  |  Branch (363:14): [True: 20.4k, False: 20.2k]
  ------------------
  364|  20.4k|		if (extra_bands[i]) {
  ------------------
  |  Branch (364:7): [True: 225, False: 20.2k]
  ------------------
  365|    225|			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|    225|			if (vips_cast(extra_bands[i], &t1, out->BandFmt,
  ------------------
  |  Branch (373:8): [True: 0, False: 225]
  ------------------
  374|    225|					"shift", TRUE,
  ------------------
  |  |  798|    225|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|    225|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  375|    225|					NULL)) {
  376|      0|				g_object_unref(out);
  377|      0|				return -1;
  378|      0|			}
  379|       |
  380|    225|			if (vips_bandjoin2(out, t1, &t2,
  ------------------
  |  Branch (380:8): [True: 0, False: 225]
  ------------------
  381|    225|					NULL)) {
  382|      0|				g_object_unref(t1);
  383|      0|				g_object_unref(out);
  384|      0|				return -1;
  385|      0|			}
  386|    225|			g_object_unref(out);
  387|    225|			g_object_unref(t1);
  388|    225|			out = t2;
  389|       |
  390|    225|			break;
  391|    225|		}
  392|       |
  393|  20.4k|	g_object_set(colour, "out", out, NULL);
  394|       |
  395|  20.4k|	return 0;
  396|  20.4k|}
colour.c:vips_colour_gen:
  228|  7.41k|{
  229|  7.41k|	VipsRegion **ir = (VipsRegion **) seq;
  230|  7.41k|	VipsColour *colour = VIPS_COLOUR(b);
  ------------------
  |  |   42|  7.41k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  7.41k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  7.41k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|  7.41k|		VIPS_TYPE_COLOUR, VipsColour))
  ------------------
  231|  7.41k|	VipsColourClass *class = VIPS_COLOUR_GET_CLASS(colour);
  ------------------
  |  |   52|  7.41k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  7.41k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  7.41k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   53|  7.41k|		VIPS_TYPE_COLOUR, VipsColourClass))
  ------------------
  232|  7.41k|	VipsRect *r = &out_region->valid;
  233|       |
  234|  7.41k|	int i, y;
  235|  7.41k|	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|  7.41k|	if (vips_reorder_prepare_many(out_region->im, ir, r))
  ------------------
  |  Branch (244:6): [True: 624, False: 6.78k]
  ------------------
  245|    624|		return -1;
  246|       |
  247|  7.41k|	VIPS_GATE_START("vips_colour_gen: work");
  ------------------
  |  |   41|  6.78k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  6.78k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  6.78k|	{ \
  |  |   43|  6.78k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 6.78k]
  |  |  ------------------
  |  |   44|  6.78k|			vips__thread_gate_start(NAME); \
  |  |   45|  6.78k|	} \
  |  |   46|  7.41k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  7.41k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  248|       |
  249|   222k|	for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (249:14): [True: 215k, False: 6.78k]
  ------------------
  250|   431k|		for (i = 0; ir[i]; i++)
  ------------------
  |  Branch (250:15): [True: 215k, False: 215k]
  ------------------
  251|   215k|			p[i] = VIPS_REGION_ADDR(ir[i], r->left, r->top + y);
  ------------------
  |  |  227|   215k|	((R)->data + \
  |  |  228|   215k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   215k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   215k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   215k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   215k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   215k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  252|   215k|		p[i] = NULL;
  253|   215k|		q = VIPS_REGION_ADDR(out_region, r->left, r->top + y);
  ------------------
  |  |  227|   215k|	((R)->data + \
  |  |  228|   215k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   215k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   215k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   215k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   215k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   215k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  254|       |
  255|   215k|		class->process_line(colour, q, p, r->width);
  256|   215k|	}
  257|       |
  258|  6.78k|	VIPS_GATE_STOP("vips_colour_gen: work");
  ------------------
  |  |   49|  6.78k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  6.78k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  6.78k|	{ \
  |  |   51|  6.78k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 6.78k]
  |  |  ------------------
  |  |   52|  6.78k|			vips__thread_gate_stop(NAME); \
  |  |   53|  6.78k|	} \
  |  |   54|  6.78k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  6.78k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  259|       |
  260|  6.78k|	VIPS_COUNT_PIXELS(out_region, VIPS_OBJECT_GET_CLASS(colour)->nickname);
  ------------------
  |  |  189|  6.78k|#define VIPS_COUNT_PIXELS(R, N) vips__region_count_pixels(R, N)
  ------------------
  261|       |
  262|  6.78k|	return 0;
  263|  7.41k|}
colour.c:vips_colour_init:
  423|  20.4k|{
  424|  20.4k|	colour->coding = VIPS_CODING_NONE;
  425|  20.4k|	colour->interpretation = VIPS_INTERPRETATION_sRGB;
  426|  20.4k|	colour->format = VIPS_FORMAT_UCHAR;
  427|  20.4k|	colour->bands = 3;
  428|  20.4k|	colour->input_bands = -1;
  429|  20.4k|}
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|  19.2k|{
  437|  19.2k|	VipsColour *colour = VIPS_COLOUR(object);
  ------------------
  |  |   42|  19.2k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  19.2k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  19.2k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|  19.2k|		VIPS_TYPE_COLOUR, VipsColour))
  ------------------
  438|  19.2k|	VipsColourTransform *transform = VIPS_COLOUR_TRANSFORM(object);
  ------------------
  |  |  103|  19.2k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  19.2k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  19.2k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  104|  19.2k|		VIPS_TYPE_COLOUR_TRANSFORM, VipsColourTransform))
  ------------------
  439|  19.2k|	VipsImage **t = (VipsImage **) vips_object_local_array(object, 1);
  440|       |
  441|       |	/* We only process float.
  442|       |	 */
  443|  19.2k|	if (transform->in &&
  ------------------
  |  Branch (443:6): [True: 19.2k, False: 0]
  ------------------
  444|  19.2k|		transform->in->BandFmt != VIPS_FORMAT_FLOAT) {
  ------------------
  |  Branch (444:3): [True: 1, False: 19.2k]
  ------------------
  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|  19.2k|	else {
  449|  19.2k|		t[0] = transform->in;
  450|  19.2k|		g_object_ref(t[0]);
  451|  19.2k|	}
  452|       |
  453|       |	/* We always do 3 bands -> 3 bands.
  454|       |	 */
  455|  19.2k|	colour->input_bands = 3;
  456|       |
  457|  19.2k|	colour->n = 1;
  458|  19.2k|	colour->in = t;
  459|       |
  460|  19.2k|	if (VIPS_OBJECT_CLASS(vips_colour_transform_parent_class)->build(object))
  ------------------
  |  |  435|  19.2k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  19.2k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  19.2k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (460:6): [True: 0, False: 19.2k]
  ------------------
  461|      0|		return -1;
  462|       |
  463|  19.2k|	return 0;
  464|  19.2k|}
colour.c:vips_colour_transform_init:
  488|  19.2k|{
  489|  19.2k|	VipsColour *colour = (VipsColour *) space;
  490|       |
  491|       |	/* What we write. interpretation should be overwritten in subclass
  492|       |	 * builds.
  493|       |	 */
  494|  19.2k|	colour->coding = VIPS_CODING_NONE;
  495|  19.2k|	colour->interpretation = VIPS_INTERPRETATION_LAB;
  496|  19.2k|	colour->format = VIPS_FORMAT_FLOAT;
  497|  19.2k|	colour->bands = 3;
  498|  19.2k|}
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|  1.24k|{
  505|  1.24k|	VipsColour *colour = VIPS_COLOUR(object);
  ------------------
  |  |   42|  1.24k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  1.24k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.24k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|  1.24k|		VIPS_TYPE_COLOUR, VipsColour))
  ------------------
  506|  1.24k|	VipsColourCode *code = VIPS_COLOUR_CODE(object);
  ------------------
  |  |  135|  1.24k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  1.24k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.24k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  136|  1.24k|		VIPS_TYPE_COLOUR_CODE, VipsColourCode))
  ------------------
  507|  1.24k|	VipsColourCodeClass *class = VIPS_COLOUR_CODE_GET_CLASS(object);
  ------------------
  |  |  145|  1.24k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  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))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  146|  1.24k|		VIPS_TYPE_COLOUR_CODE, VipsColourCodeClass))
  ------------------
  508|  1.24k|	VipsImage **t = (VipsImage **) vips_object_local_array(object, 6);
  509|       |
  510|  1.24k|	VipsImage *in;
  511|       |
  512|  1.24k|	in = code->in;
  513|       |
  514|       |	/* If this is a LABQ and the coder wants uncoded, unpack.
  515|       |	 */
  516|  1.24k|	if (in &&
  ------------------
  |  Branch (516:6): [True: 1.24k, False: 0]
  ------------------
  517|  1.24k|		in->Coding == VIPS_CODING_LABQ &&
  ------------------
  |  Branch (517:3): [True: 89, False: 1.15k]
  ------------------
  518|  1.24k|		code->input_coding == VIPS_CODING_NONE) {
  ------------------
  |  Branch (518:3): [True: 0, False: 89]
  ------------------
  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|  1.24k|	if (in &&
  ------------------
  |  Branch (524:6): [True: 1.24k, False: 0]
  ------------------
  525|  1.24k|		vips_check_coding(VIPS_OBJECT_CLASS(class)->nickname,
  ------------------
  |  |  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 (525:3): [True: 0, False: 1.24k]
  ------------------
  526|  1.24k|			in, code->input_coding))
  527|      0|		return -1;
  528|       |
  529|  1.24k|	if (in &&
  ------------------
  |  Branch (529:6): [True: 1.24k, False: 0]
  ------------------
  530|  1.24k|		code->input_coding == VIPS_CODING_NONE &&
  ------------------
  |  Branch (530:3): [True: 959, False: 289]
  ------------------
  531|  1.24k|		code->input_format != VIPS_FORMAT_NOTSET &&
  ------------------
  |  Branch (531:3): [True: 959, False: 0]
  ------------------
  532|  1.24k|		in->BandFmt != code->input_format) {
  ------------------
  |  Branch (532:3): [True: 151, False: 808]
  ------------------
  533|    151|		if (vips_cast(in, &t[3], code->input_format, NULL))
  ------------------
  |  Branch (533:7): [True: 0, False: 151]
  ------------------
  534|      0|			return -1;
  535|    151|		in = t[3];
  536|    151|	}
  537|       |
  538|  1.24k|	if (in &&
  ------------------
  |  Branch (538:6): [True: 1.24k, False: 0]
  ------------------
  539|  1.24k|		code->input_coding == VIPS_CODING_NONE &&
  ------------------
  |  Branch (539:3): [True: 959, False: 289]
  ------------------
  540|  1.24k|		code->input_interpretation != VIPS_INTERPRETATION_ERROR &&
  ------------------
  |  Branch (540:3): [True: 0, False: 959]
  ------------------
  541|  1.24k|		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|  1.24k|	colour->n = 1;
  549|  1.24k|	colour->in = VIPS_ARRAY(object, 2, VipsImage *);
  ------------------
  |  |   72|  1.24k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  1.24k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  1.24k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  1.24k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  1.24k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  550|  1.24k|	colour->in[0] = in;
  551|  1.24k|	colour->in[1] = NULL;
  552|       |
  553|  1.24k|	if (VIPS_OBJECT_CLASS(vips_colour_code_parent_class)->build(object))
  ------------------
  |  |  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 (553:6): [True: 0, False: 1.24k]
  ------------------
  554|      0|		return -1;
  555|       |
  556|  1.24k|	return 0;
  557|  1.24k|}
colour.c:vips_colour_code_init:
  581|  1.24k|{
  582|  1.24k|	code->input_coding = VIPS_CODING_NONE;
  583|  1.24k|	code->input_interpretation = VIPS_INTERPRETATION_ERROR;
  584|  1.24k|	code->input_format = VIPS_FORMAT_NOTSET;
  585|  1.24k|}
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|  6.03k|{
  119|  6.03k|	if (in->Bands > n) {
  ------------------
  |  Branch (119:6): [True: 1.09k, False: 4.94k]
  ------------------
  120|  1.09k|		VipsImage *scope = vips_image_new();
  121|  1.09k|		VipsImage **t = (VipsImage **)
  122|  1.09k|			vips_object_local_array(VIPS_OBJECT(scope), 4);
  ------------------
  |  |  433|  1.09k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  1.09k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.09k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  123|       |
  124|  1.09k|		if (vips_extract_band(in, &t[0], 0,
  ------------------
  |  Branch (124:7): [True: 0, False: 1.09k]
  ------------------
  125|  1.09k|				"n", n,
  126|  1.09k|				NULL) ||
  127|  1.09k|			vips_extract_band(in, &t[1], n,
  ------------------
  |  Branch (127:4): [True: 0, False: 1.09k]
  ------------------
  128|  1.09k|				"n", in->Bands - n,
  129|  1.09k|				NULL) ||
  130|  1.09k|			fn(t[0], &t[2], NULL) ||
  ------------------
  |  Branch (130:4): [True: 0, False: 1.09k]
  ------------------
  131|  1.09k|			vips_cast(t[1], &t[3], t[2]->BandFmt,
  ------------------
  |  Branch (131:4): [True: 0, False: 1.09k]
  ------------------
  132|  1.09k|				NULL) ||
  133|  1.09k|			vips_bandjoin2(t[2], t[3], out, NULL)) {
  ------------------
  |  Branch (133:4): [True: 0, False: 1.09k]
  ------------------
  134|      0|			g_object_unref(scope);
  135|      0|			return -1;
  136|      0|		}
  137|       |
  138|  1.09k|		g_object_unref(scope);
  139|  1.09k|	}
  140|  4.94k|	else if (in->Bands == n) {
  ------------------
  |  Branch (140:11): [True: 4.94k, False: 0]
  ------------------
  141|  4.94k|		if (fn(in, out, NULL))
  ------------------
  |  Branch (141:7): [True: 0, False: 4.94k]
  ------------------
  142|      0|			return -1;
  143|  4.94k|	}
  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|  6.03k|	return 0;
  150|  6.03k|}
vips_colourspace:
  616|  38.1k|{
  617|  38.1k|	va_list ap;
  618|  38.1k|	int result;
  619|       |
  620|  38.1k|	va_start(ap, space);
  621|  38.1k|	result = vips_call_split("colourspace", ap, in, out, space);
  622|  38.1k|	va_end(ap);
  623|       |
  624|  38.1k|	return result;
  625|  38.1k|}
colourspace.c:vips_GREY162RGB16:
  179|    395|{
  180|    395|	if (vips__colourspace_process_n("GREY162RGB16",
  ------------------
  |  Branch (180:6): [True: 0, False: 395]
  ------------------
  181|    395|			in, out, 1, vips_BW2sRGB_op))
  182|      0|		return -1;
  183|    395|	(*out)->Type = VIPS_INTERPRETATION_RGB16;
  184|       |
  185|    395|	return 0;
  186|    395|}
colourspace.c:vips_BW2sRGB_op:
  154|  5.19k|{
  155|  5.19k|	VipsImage *t[3];
  156|       |
  157|  5.19k|	t[0] = in;
  158|  5.19k|	t[1] = in;
  159|  5.19k|	t[2] = in;
  160|  5.19k|	if (vips_bandjoin(t, out, 3, NULL))
  ------------------
  |  Branch (160:6): [True: 0, False: 5.19k]
  ------------------
  161|      0|		return -1;
  162|       |
  163|  5.19k|	return 0;
  164|  5.19k|}
colourspace.c:vips_BW2sRGB:
  168|  4.80k|{
  169|  4.80k|	if (vips__colourspace_process_n("BW2sRGB",
  ------------------
  |  Branch (169:6): [True: 0, False: 4.80k]
  ------------------
  170|  4.80k|			in, out, 1, vips_BW2sRGB_op))
  171|      0|		return -1;
  172|  4.80k|	(*out)->Type = VIPS_INTERPRETATION_sRGB;
  173|       |
  174|  4.80k|	return 0;
  175|  4.80k|}
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|  38.1k|{
  467|  38.1k|	VipsColourspace *colourspace = (VipsColourspace *) object;
  468|       |
  469|  38.1k|	int i, j;
  470|  38.1k|	VipsImage *x;
  471|  38.1k|	VipsImage **t = (VipsImage **)
  472|  38.1k|		vips_object_local_array(object, 1);
  473|  38.1k|	VipsImage **pipe = (VipsImage **)
  474|  38.1k|		vips_object_local_array(object, MAX_STEPS);
  ------------------
  |  |  191|  38.1k|#define MAX_STEPS (10)
  ------------------
  475|       |
  476|  38.1k|	VipsInterpretation interpretation;
  477|       |
  478|       |	/* Verify that all input args have been set.
  479|       |	 */
  480|  38.1k|	if (VIPS_OBJECT_CLASS(vips_colourspace_parent_class)->build(object))
  ------------------
  |  |  435|  38.1k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  38.1k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  38.1k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (480:6): [True: 0, False: 38.1k]
  ------------------
  481|      0|		return -1;
  482|       |
  483|  38.1k|	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|  38.1k|	if (x->Coding == VIPS_CODING_RAD) {
  ------------------
  |  Branch (488:6): [True: 0, False: 38.1k]
  ------------------
  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|  38.1k|	if (vips_object_argument_isset(object, "source_space"))
  ------------------
  |  Branch (494:6): [True: 0, False: 38.1k]
  ------------------
  495|      0|		interpretation = colourspace->source_space;
  496|  38.1k|	else
  497|  38.1k|		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|  38.1k|	if (interpretation == VIPS_INTERPRETATION_RGB)
  ------------------
  |  Branch (502:6): [True: 0, False: 38.1k]
  ------------------
  503|      0|		interpretation = VIPS_INTERPRETATION_sRGB;
  504|       |
  505|       |	/* No conversion necessary.
  506|       |	 */
  507|  38.1k|	if (interpretation == colourspace->space) {
  ------------------
  |  Branch (507:6): [True: 262, False: 37.9k]
  ------------------
  508|    262|		g_object_set(colourspace, "out", vips_image_new(), NULL);
  509|       |
  510|    262|		return vips_image_write(colourspace->in, colourspace->out);
  511|    262|	}
  512|       |
  513|  2.28M|	for (i = 0; i < VIPS_NUMBER(vips_colour_routes); i++)
  ------------------
  |  |   60|  2.28M|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (513:14): [True: 2.28M, False: 6]
  ------------------
  514|  2.28M|		if (vips_colour_routes[i].from == interpretation &&
  ------------------
  |  Branch (514:7): [True: 37.9k, False: 2.24M]
  ------------------
  515|  2.28M|			vips_colour_routes[i].to == colourspace->space)
  ------------------
  |  Branch (515:4): [True: 37.9k, False: 0]
  ------------------
  516|  37.9k|			break;
  517|  37.9k|	if (i == VIPS_NUMBER(vips_colour_routes)) {
  ------------------
  |  |   60|  37.9k|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (517:6): [True: 6, False: 37.9k]
  ------------------
  518|      6|		vips_error("vips_colourspace",
  519|      6|			_("no known route from '%s' to '%s'"),
  ------------------
  |  |   30|      6|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      6|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  520|      6|			vips_enum_nick(VIPS_TYPE_INTERPRETATION,
  ------------------
  |  |  142|      6|#define VIPS_TYPE_INTERPRETATION (vips_interpretation_get_type())
  ------------------
  521|      6|				interpretation),
  522|      6|			vips_enum_nick(VIPS_TYPE_INTERPRETATION,
  ------------------
  |  |  142|      6|#define VIPS_TYPE_INTERPRETATION (vips_interpretation_get_type())
  ------------------
  523|      6|				colourspace->space));
  524|      6|		return -1;
  525|      6|	}
  526|       |
  527|  98.6k|	for (j = 0; vips_colour_routes[i].route[j]; j++) {
  ------------------
  |  Branch (527:14): [True: 60.7k, False: 37.9k]
  ------------------
  528|  60.7k|		if (vips_colour_routes[i].route[j](x, &pipe[j], NULL))
  ------------------
  |  Branch (528:7): [True: 0, False: 60.7k]
  ------------------
  529|      0|			return -1;
  530|  60.7k|		x = pipe[j];
  531|  60.7k|	}
  532|       |
  533|  37.9k|	g_object_set(colourspace, "out", vips_image_new(), NULL);
  534|  37.9k|	if (vips_image_write(x, colourspace->out))
  ------------------
  |  Branch (534:6): [True: 0, False: 37.9k]
  ------------------
  535|      0|		return -1;
  536|       |
  537|  37.9k|	return 0;
  538|  37.9k|}
colourspace.c:vips_colourspace_init:
  585|  38.1k|{
  586|  38.1k|	colourspace->source_space = VIPS_INTERPRETATION_sRGB;
  587|  38.1k|}

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_import:
 1451|    840|{
 1452|    840|	va_list ap;
 1453|    840|	int result;
 1454|       |
 1455|    840|	va_start(ap, out);
 1456|    840|	result = vips_call_split("icc_import", ap, in, out);
 1457|    840|	va_end(ap);
 1458|       |
 1459|    840|	return result;
 1460|    840|}
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|    840|{
  188|    840|	VipsIcc *icc = (VipsIcc *) gobject;
  189|       |
  190|    840|	VIPS_FREEF(cmsDeleteTransform, icc->trans);
  ------------------
  |  |   41|    840|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    840|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|    840|	{ \
  |  |   43|    840|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 840, False: 0]
  |  |  ------------------
  |  |   44|    840|			(void) F((S)); \
  |  |   45|    840|			(S) = 0; \
  |  |   46|    840|		} \
  |  |   47|    840|	} \
  |  |   48|    840|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    840|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  191|    840|	VIPS_FREEF(cmsCloseProfile, icc->in_profile);
  ------------------
  |  |   41|    840|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    840|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|    840|	{ \
  |  |   43|    840|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 840, False: 0]
  |  |  ------------------
  |  |   44|    840|			(void) F((S)); \
  |  |   45|    840|			(S) = 0; \
  |  |   46|    840|		} \
  |  |   47|    840|	} \
  |  |   48|    840|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    840|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  192|    840|	VIPS_FREEF(cmsCloseProfile, icc->out_profile);
  ------------------
  |  |   41|    840|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    840|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|    840|	{ \
  |  |   43|    840|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 840, False: 0]
  |  |  ------------------
  |  |   44|    840|			(void) F((S)); \
  |  |   45|    840|			(S) = 0; \
  |  |   46|    840|		} \
  |  |   47|    840|	} \
  |  |   48|    840|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    840|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  193|       |
  194|    840|	if (icc->in_blob) {
  ------------------
  |  Branch (194:6): [True: 840, False: 0]
  ------------------
  195|    840|		vips_area_unref((VipsArea *) icc->in_blob);
  196|    840|		icc->in_blob = NULL;
  197|    840|	}
  198|       |
  199|    840|	if (icc->out_blob) {
  ------------------
  |  Branch (199:6): [True: 0, False: 840]
  ------------------
  200|      0|		vips_area_unref((VipsArea *) icc->out_blob);
  201|      0|		icc->out_blob = NULL;
  202|      0|	}
  203|       |
  204|    840|	G_OBJECT_CLASS(vips_icc_parent_class)->dispose(gobject);
  ------------------
  |  |   58|    840|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|    840|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    840|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  205|    840|}
icc_transform.c:vips_icc_build:
  258|    840|{
  259|    840|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|    840|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|    840|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|    840|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  260|    840|	VipsColour *colour = (VipsColour *) object;
  261|    840|	VipsColourCode *code = (VipsColourCode *) object;
  262|    840|	VipsIcc *icc = (VipsIcc *) object;
  263|       |
  264|    840|	cmsUInt32Number flags;
  265|       |
  266|    840|	if (icc->depth != 8 &&
  ------------------
  |  Branch (266:6): [True: 0, False: 840]
  ------------------
  267|    840|		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|    840|	if (icc->in_profile &&
  ------------------
  |  Branch (273:6): [True: 840, False: 0]
  ------------------
  274|    840|		code->in) {
  ------------------
  |  Branch (274:3): [True: 840, False: 0]
  ------------------
  275|    840|		int signature;
  276|    840|		VipsIccInfo *info;
  277|       |
  278|    840|		signature = cmsGetColorSpace(icc->in_profile);
  279|    840|		if (!(info = vips_icc_info(signature))) {
  ------------------
  |  Branch (279:7): [True: 0, False: 840]
  ------------------
  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|    840|		colour->input_bands = info->bands;
  287|       |
  288|    840|		switch (signature) {
  289|      0|		case cmsSigGrayData:
  ------------------
  |  Branch (289:3): [True: 0, False: 840]
  ------------------
  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: 840]
  ------------------
  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: 840]
  ------------------
  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: 840]
  ------------------
  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|    840|		case cmsSigCmykData:
  ------------------
  |  Branch (321:3): [True: 840, False: 0]
  ------------------
  322|    840|		case cmsSig5colorData:
  ------------------
  |  Branch (322:3): [True: 0, False: 840]
  ------------------
  323|    840|		case cmsSig6colorData:
  ------------------
  |  Branch (323:3): [True: 0, False: 840]
  ------------------
  324|    840|		case cmsSig7colorData:
  ------------------
  |  Branch (324:3): [True: 0, False: 840]
  ------------------
  325|    840|		case cmsSig8colorData:
  ------------------
  |  Branch (325:3): [True: 0, False: 840]
  ------------------
  326|    840|		case cmsSig9colorData:
  ------------------
  |  Branch (326:3): [True: 0, False: 840]
  ------------------
  327|    840|		case cmsSig10colorData:
  ------------------
  |  Branch (327:3): [True: 0, False: 840]
  ------------------
  328|    840|		case cmsSig11colorData:
  ------------------
  |  Branch (328:3): [True: 0, False: 840]
  ------------------
  329|    840|		case cmsSig12colorData:
  ------------------
  |  Branch (329:3): [True: 0, False: 840]
  ------------------
  330|       |			/* Treat as forms of CMYK.
  331|       |			 */
  332|    840|			info = vips_icc_info(
  333|    840|				cmsGetColorSpace(icc->in_profile));
  334|       |
  335|    840|			code->input_format = code->in->BandFmt == VIPS_FORMAT_USHORT
  ------------------
  |  Branch (335:25): [True: 1, False: 839]
  ------------------
  336|    840|				? VIPS_FORMAT_USHORT
  337|    840|				: VIPS_FORMAT_UCHAR;
  338|    840|			icc->in_icc_format =
  339|    840|				code->in->BandFmt == VIPS_FORMAT_USHORT
  ------------------
  |  Branch (339:5): [True: 1, False: 839]
  ------------------
  340|    840|				? info->lcms_type16
  341|    840|				: info->lcms_type8;
  342|    840|			break;
  343|       |
  344|      0|		default:
  ------------------
  |  Branch (344:3): [True: 0, False: 840]
  ------------------
  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|    840|		}
  348|    840|	}
  349|       |
  350|    840|	if (icc->out_profile) {
  ------------------
  |  Branch (350:6): [True: 840, False: 0]
  ------------------
  351|    840|		int signature;
  352|    840|		VipsIccInfo *info;
  353|       |
  354|    840|		signature = cmsGetColorSpace(icc->out_profile);
  355|    840|		if (!(info = vips_icc_info(signature))) {
  ------------------
  |  Branch (355:7): [True: 0, False: 840]
  ------------------
  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|    840|		colour->bands = info->bands;
  363|       |
  364|    840|		switch (signature) {
  365|      0|		case cmsSigGrayData:
  ------------------
  |  Branch (365:3): [True: 0, False: 840]
  ------------------
  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: 840]
  ------------------
  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: 840]
  ------------------
  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|    840|		case cmsSigXYZData:
  ------------------
  |  Branch (395:3): [True: 840, False: 0]
  ------------------
  396|    840|			colour->interpretation = VIPS_INTERPRETATION_XYZ;
  397|    840|			colour->format = VIPS_FORMAT_FLOAT;
  398|    840|			icc->out_icc_format = info->lcms_type16;
  399|    840|			break;
  400|       |
  401|      0|		case cmsSigCmykData:
  ------------------
  |  Branch (401:3): [True: 0, False: 840]
  ------------------
  402|      0|		case cmsSig5colorData:
  ------------------
  |  Branch (402:3): [True: 0, False: 840]
  ------------------
  403|      0|		case cmsSig6colorData:
  ------------------
  |  Branch (403:3): [True: 0, False: 840]
  ------------------
  404|      0|		case cmsSig7colorData:
  ------------------
  |  Branch (404:3): [True: 0, False: 840]
  ------------------
  405|      0|		case cmsSig8colorData:
  ------------------
  |  Branch (405:3): [True: 0, False: 840]
  ------------------
  406|      0|		case cmsSig9colorData:
  ------------------
  |  Branch (406:3): [True: 0, False: 840]
  ------------------
  407|      0|		case cmsSig10colorData:
  ------------------
  |  Branch (407:3): [True: 0, False: 840]
  ------------------
  408|      0|		case cmsSig11colorData:
  ------------------
  |  Branch (408:3): [True: 0, False: 840]
  ------------------
  409|      0|		case cmsSig12colorData:
  ------------------
  |  Branch (409:3): [True: 0, False: 840]
  ------------------
  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: 840]
  ------------------
  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|    840|		}
  425|    840|	}
  426|       |
  427|       |	/* At least one must be a device profile.
  428|       |	 */
  429|    840|	if (icc->in_profile &&
  ------------------
  |  Branch (429:6): [True: 840, False: 0]
  ------------------
  430|    840|		icc->out_profile &&
  ------------------
  |  Branch (430:3): [True: 840, False: 0]
  ------------------
  431|    840|		is_pcs(icc->in_profile) &&
  ------------------
  |  Branch (431:3): [True: 0, False: 840]
  ------------------
  432|    840|		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|    840|	flags = cmsFLAGS_NOCACHE;
  ------------------
  |  | 1722|    840|#define cmsFLAGS_NOCACHE                  0x0040    // Inhibit 1-pixel cache
  ------------------
  442|       |
  443|    840|	if (icc->black_point_compensation)
  ------------------
  |  Branch (443:6): [True: 0, False: 840]
  ------------------
  444|      0|		flags |= cmsFLAGS_BLACKPOINTCOMPENSATION;
  ------------------
  |  | 1731|      0|#define cmsFLAGS_BLACKPOINTCOMPENSATION   0x2000
  ------------------
  445|       |
  446|    840|	if (!(icc->trans = cmsCreateTransform(
  ------------------
  |  Branch (446:6): [True: 0, False: 840]
  ------------------
  447|    840|			  icc->in_profile, icc->in_icc_format,
  448|    840|			  icc->out_profile, icc->out_icc_format,
  449|    840|			  icc->intent, flags)))
  450|      0|		return -1;
  451|       |
  452|    840|	if (VIPS_OBJECT_CLASS(vips_icc_parent_class)->build(object))
  ------------------
  |  |  435|    840|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|    840|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    840|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (452:6): [True: 0, False: 840]
  ------------------
  453|      0|		return -1;
  454|       |
  455|    840|	return 0;
  456|    840|}
icc_transform.c:is_pcs:
  211|    840|{
  212|    840|	return cmsGetColorSpace(profile) == cmsSigLabData ||
  ------------------
  |  Branch (212:9): [True: 0, False: 840]
  ------------------
  213|    840|		cmsGetColorSpace(profile) == cmsSigXYZData;
  ------------------
  |  Branch (213:3): [True: 0, False: 840]
  ------------------
  214|    840|}
icc_transform.c:vips_icc_init:
  787|    840|{
  788|    840|	icc->intent = VIPS_INTENT_RELATIVE;
  789|    840|	icc->pcs = VIPS_PCS_LAB;
  790|    840|	icc->depth = 8;
  791|    840|}
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|    840|{
  808|    840|	VipsColour *colour = (VipsColour *) object;
  809|    840|	VipsIcc *icc = (VipsIcc *) object;
  810|    840|	VipsIccImport *import = (VipsIccImport *) object;
  811|       |
  812|    840|	if (vips_icc_set_import(icc,
  ------------------
  |  Branch (812:6): [True: 0, False: 840]
  ------------------
  813|    840|			import->embedded, import->input_profile_filename))
  814|      0|		return -1;
  815|       |
  816|    840|	if (icc->pcs == VIPS_PCS_LAB) {
  ------------------
  |  Branch (816:6): [True: 0, False: 840]
  ------------------
  817|      0|		cmsCIExyY white;
  818|      0|		cmsWhitePointFromTemp(&white, 6504);
  819|       |
  820|      0|		icc->out_profile = cmsCreateLab4Profile(&white);
  821|      0|	}
  822|    840|	else
  823|    840|		icc->out_profile = cmsCreateXYZProfile();
  824|       |
  825|    840|	if (VIPS_OBJECT_CLASS(vips_icc_import_parent_class)->build(object))
  ------------------
  |  |  435|    840|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|    840|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    840|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (825:6): [True: 0, False: 840]
  ------------------
  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|    840|	if (icc->non_standard_input_profile &&
  ------------------
  |  Branch (834:6): [True: 840, False: 0]
  ------------------
  835|    840|		icc->in_blob) {
  ------------------
  |  Branch (835:3): [True: 840, False: 0]
  ------------------
  836|    840|		const void *data;
  837|    840|		size_t size;
  838|       |
  839|    840|		data = vips_blob_get(icc->in_blob, &size);
  840|    840|		vips_image_set_blob(colour->out, VIPS_META_ICC_NAME,
  ------------------
  |  |   78|    840|#define VIPS_META_ICC_NAME "icc-profile-data"
  ------------------
  841|    840|			NULL, data, size);
  842|    840|	}
  843|       |
  844|    840|	return 0;
  845|    840|}
icc_transform.c:vips_icc_set_import:
  688|    840|{
  689|    840|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(icc);
  ------------------
  |  |  441|    840|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|    840|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|    840|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  690|    840|	VipsColourCode *code = (VipsColourCode *) icc;
  691|       |
  692|    840|	icc->non_standard_input_profile = FALSE;
  ------------------
  |  |  794|    840|#define	FALSE	(0)
  ------------------
  693|       |
  694|       |	/* Try embedded profile.
  695|       |	 */
  696|    840|	if (code->in &&
  ------------------
  |  Branch (696:6): [True: 840, False: 0]
  ------------------
  697|    840|		(embedded || !input_profile_filename)) {
  ------------------
  |  Branch (697:4): [True: 840, False: 0]
  |  Branch (697:16): [True: 0, False: 0]
  ------------------
  698|    840|		icc->in_blob = vips_icc_get_profile_image(code->in);
  699|    840|		icc->in_profile = vips_icc_verify_blob(icc, &icc->in_blob);
  700|    840|	}
  701|       |
  702|       |	/* Try profile from filename.
  703|       |	 */
  704|    840|	if (code->in &&
  ------------------
  |  Branch (704:6): [True: 840, False: 0]
  ------------------
  705|    840|		!icc->in_blob &&
  ------------------
  |  Branch (705:3): [True: 840, False: 0]
  ------------------
  706|    840|		input_profile_filename) {
  ------------------
  |  Branch (706:3): [True: 840, False: 0]
  ------------------
  707|    840|		if (!vips_profile_load(input_profile_filename, &icc->in_blob, NULL) &&
  ------------------
  |  Branch (707:7): [True: 840, False: 0]
  ------------------
  708|    840|			(icc->in_profile = vips_icc_verify_blob(icc, &icc->in_blob)))
  ------------------
  |  Branch (708:4): [True: 840, False: 0]
  ------------------
  709|    840|			icc->non_standard_input_profile = TRUE;
  ------------------
  |  |  798|    840|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|    840|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  710|    840|	}
  711|       |
  712|       |	/* Try a built-in profile.
  713|       |	 */
  714|    840|	if (code->in &&
  ------------------
  |  Branch (714:6): [True: 840, False: 0]
  ------------------
  715|    840|		!icc->in_profile) {
  ------------------
  |  Branch (715:3): [True: 0, False: 840]
  ------------------
  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|    840|	if (!icc->in_profile) {
  ------------------
  |  Branch (738:6): [True: 0, False: 840]
  ------------------
  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|    840|	return 0;
  745|    840|}
icc_transform.c:vips_icc_get_profile_image:
  462|    840|{
  463|    840|	const void *data;
  464|    840|	size_t size;
  465|       |
  466|    840|	if (!vips_image_get_typeof(image, VIPS_META_ICC_NAME))
  ------------------
  |  |   78|    840|#define VIPS_META_ICC_NAME "icc-profile-data"
  ------------------
  |  Branch (466:6): [True: 840, False: 0]
  ------------------
  467|    840|		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.68k|{
  655|  1.68k|	if (*blob) {
  ------------------
  |  Branch (655:6): [True: 840, False: 840]
  ------------------
  656|    840|		VipsColourCode *code = (VipsColourCode *) icc;
  657|    840|		cmsHPROFILE profile = vips_icc_load_profile_blob(*blob,
  658|    840|			code->in, icc->intent, LCMS_USED_AS_INPUT);
  ------------------
  |  | 1555|    840|#define LCMS_USED_AS_INPUT      0
  ------------------
  659|       |
  660|    840|		if (!profile) {
  ------------------
  |  Branch (660:7): [True: 0, False: 840]
  ------------------
  661|      0|			vips_area_unref((VipsArea *) *blob);
  662|      0|			*blob = NULL;
  663|      0|		}
  664|       |
  665|    840|		return profile;
  666|    840|	}
  667|       |
  668|    840|	return NULL;
  669|  1.68k|}
icc_transform.c:vips_icc_load_profile_blob:
  601|    840|{
  602|    840|	const void *data;
  603|    840|	size_t size;
  604|    840|	cmsHPROFILE profile;
  605|    840|	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|    840|	data = vips_blob_get(blob, &size);
  615|    840|	if (!(profile = cmsOpenProfileFromMem(data, size))) {
  ------------------
  |  Branch (615:6): [True: 0, False: 840]
  ------------------
  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|    840|	if (!(info = vips_icc_info(cmsGetColorSpace(profile)))) {
  ------------------
  |  Branch (624:6): [True: 0, False: 840]
  ------------------
  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|    840|	if (image &&
  ------------------
  |  Branch (630:6): [True: 840, False: 0]
  ------------------
  631|    840|		!vips_image_is_profile_compatible(image, info->bands)) {
  ------------------
  |  Branch (631:3): [True: 0, False: 840]
  ------------------
  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|    840|	if (!cmsIsIntentSupported(profile, intent, direction)) {
  ------------------
  |  Branch (637:6): [True: 0, False: 840]
  ------------------
  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|    840|	return profile;
  646|    840|}
icc_transform.c:vips_icc_import_line:
  909|  13.5k|{
  910|  13.5k|	VipsIcc *icc = (VipsIcc *) colour;
  911|       |
  912|  13.5k|	VipsPel *p;
  913|  13.5k|	float *q;
  914|  13.5k|	int i;
  915|       |
  916|       |	/* Buffer of encoded 16-bit pixels we transform.
  917|       |	 */
  918|  13.5k|	guint16 encoded[3 * PIXEL_BUFFER_SIZE];
  919|       |
  920|  13.5k|	p = (VipsPel *) in[0];
  921|  13.5k|	q = (float *) out;
  922|  27.0k|	for (i = 0; i < width; i += PIXEL_BUFFER_SIZE) {
  ------------------
  |  |  101|  13.5k|#define PIXEL_BUFFER_SIZE (10000)
  ------------------
  |  Branch (922:14): [True: 13.5k, False: 13.5k]
  ------------------
  923|  13.5k|		const int chunk = VIPS_MIN(width - i, PIXEL_BUFFER_SIZE);
  ------------------
  |  |   55|  13.5k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 13.5k, False: 0]
  |  |  ------------------
  ------------------
  924|       |
  925|  13.5k|		cmsDoTransform(icc->trans, p, encoded, chunk);
  926|       |
  927|  13.5k|		if (icc->pcs == VIPS_PCS_LAB)
  ------------------
  |  Branch (927:7): [True: 0, False: 13.5k]
  ------------------
  928|      0|			decode_lab(encoded, q, chunk);
  929|  13.5k|		else
  930|  13.5k|			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|  13.5k|		p += PIXEL_BUFFER_SIZE *
  ------------------
  |  |  101|  13.5k|#define PIXEL_BUFFER_SIZE (10000)
  ------------------
  935|  13.5k|			colour->input_bands *
  936|  13.5k|			VIPS_IMAGE_SIZEOF_ELEMENT(colour->in[0]);
  ------------------
  |  |  382|  13.5k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  ------------------
  937|  13.5k|		q += PIXEL_BUFFER_SIZE * 3;
  ------------------
  |  |  101|  13.5k|#define PIXEL_BUFFER_SIZE (10000)
  ------------------
  938|  13.5k|	}
  939|  13.5k|}
icc_transform.c:decode_xyz:
  871|  13.5k|{
  872|  13.5k|	int i;
  873|       |
  874|   445k|	for (i = 0; i < n; i++) {
  ------------------
  |  Branch (874:14): [True: 432k, False: 13.5k]
  ------------------
  875|       |		/* cmsXYZEncoded2Float inlined.
  876|       |		 */
  877|   432k|		float X = fixed[0] / 32768.0;
  878|   432k|		float Y = fixed[1] / 32768.0;
  879|   432k|		float Z = fixed[2] / 32768.0;
  880|       |
  881|   432k|		X *= SCALE;
  ------------------
  |  |  867|   432k|#define SCALE (VIPS_D65_Y0)
  |  |  ------------------
  |  |  |  |   59|   432k|#define VIPS_D65_Y0 (100.0)
  |  |  ------------------
  ------------------
  882|   432k|		Y *= SCALE;
  ------------------
  |  |  867|   432k|#define SCALE (VIPS_D65_Y0)
  |  |  ------------------
  |  |  |  |   59|   432k|#define VIPS_D65_Y0 (100.0)
  |  |  ------------------
  ------------------
  883|   432k|		Z *= SCALE;
  ------------------
  |  |  867|   432k|#define SCALE (VIPS_D65_Y0)
  |  |  ------------------
  |  |  |  |   59|   432k|#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|   432k|		xyz[0] = 0.955513 * X +
  890|   432k|			-0.023073 * Y +
  891|   432k|			0.063309 * Z;
  892|   432k|		xyz[1] = -0.028325 * X +
  893|   432k|			1.009942 * Y +
  894|   432k|			0.021055 * Z;
  895|   432k|		xyz[2] = 0.012329 * X +
  896|   432k|			-0.020536 * Y +
  897|   432k|			1.330714 * Z;
  898|       |
  899|   432k|		xyz += 3;
  900|   432k|		fixed += 3;
  901|   432k|	}
  902|  13.5k|}
icc_transform.c:vips_icc_import_init:
  974|    840|{
  975|    840|}
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|  3.36k|{
  247|  3.36k|	int i;
  248|       |
  249|  15.9k|	for (i = 0; i < VIPS_NUMBER(vips_icc_info_table); i++)
  ------------------
  |  |   60|  15.9k|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (249:14): [True: 15.9k, False: 0]
  ------------------
  250|  15.9k|		if (vips_icc_info_table[i].signature == signature)
  ------------------
  |  Branch (250:7): [True: 3.36k, False: 12.6k]
  ------------------
  251|  3.36k|			return &vips_icc_info_table[i];
  252|       |
  253|      0|	return NULL;
  254|  3.36k|}
icc_transform.c:vips_image_is_profile_compatible:
  553|    840|{
  554|    840|	switch (image->Type) {
  555|      0|	case VIPS_INTERPRETATION_B_W:
  ------------------
  |  Branch (555:2): [True: 0, False: 840]
  ------------------
  556|      0|	case VIPS_INTERPRETATION_GREY16:
  ------------------
  |  Branch (556:2): [True: 0, False: 840]
  ------------------
  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: 840]
  ------------------
  562|      0|	case VIPS_INTERPRETATION_LAB:
  ------------------
  |  Branch (562:2): [True: 0, False: 840]
  ------------------
  563|      0|	case VIPS_INTERPRETATION_LABQ:
  ------------------
  |  Branch (563:2): [True: 0, False: 840]
  ------------------
  564|      0|	case VIPS_INTERPRETATION_RGB:
  ------------------
  |  Branch (564:2): [True: 0, False: 840]
  ------------------
  565|      0|	case VIPS_INTERPRETATION_CMC:
  ------------------
  |  Branch (565:2): [True: 0, False: 840]
  ------------------
  566|      0|	case VIPS_INTERPRETATION_LCH:
  ------------------
  |  Branch (566:2): [True: 0, False: 840]
  ------------------
  567|      0|	case VIPS_INTERPRETATION_LABS:
  ------------------
  |  Branch (567:2): [True: 0, False: 840]
  ------------------
  568|      0|	case VIPS_INTERPRETATION_sRGB:
  ------------------
  |  Branch (568:2): [True: 0, False: 840]
  ------------------
  569|      0|	case VIPS_INTERPRETATION_YXY:
  ------------------
  |  Branch (569:2): [True: 0, False: 840]
  ------------------
  570|      0|	case VIPS_INTERPRETATION_RGB16:
  ------------------
  |  Branch (570:2): [True: 0, False: 840]
  ------------------
  571|      0|	case VIPS_INTERPRETATION_scRGB:
  ------------------
  |  Branch (571:2): [True: 0, False: 840]
  ------------------
  572|      0|	case VIPS_INTERPRETATION_HSV:
  ------------------
  |  Branch (572:2): [True: 0, False: 840]
  ------------------
  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|      0|		return VIPS_MIN(3, image->Bands) == profile_bands;
  ------------------
  |  |   55|      0|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  577|       |
  578|    840|	case VIPS_INTERPRETATION_CMYK:
  ------------------
  |  Branch (578:2): [True: 840, False: 0]
  ------------------
  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|    840|		return profile_bands >= 4;
  583|       |
  584|      0|	case VIPS_INTERPRETATION_MULTIBAND:
  ------------------
  |  Branch (584:2): [True: 0, False: 840]
  ------------------
  585|      0|	case VIPS_INTERPRETATION_HISTOGRAM:
  ------------------
  |  Branch (585:2): [True: 0, False: 840]
  ------------------
  586|      0|	case VIPS_INTERPRETATION_MATRIX:
  ------------------
  |  Branch (586:2): [True: 0, False: 840]
  ------------------
  587|      0|	case VIPS_INTERPRETATION_FOURIER:
  ------------------
  |  Branch (587:2): [True: 0, False: 840]
  ------------------
  588|      0|	default:
  ------------------
  |  Branch (588:2): [True: 0, False: 840]
  ------------------
  589|      0|		return image->Bands >= profile_bands;
  590|    840|	}
  591|    840|}

vips_profile_load:
  195|    840|{
  196|    840|	va_list ap;
  197|    840|	int result;
  198|       |
  199|    840|	va_start(ap, profile);
  200|    840|	result = vips_call_split("profile_load", ap, name, profile);
  201|    840|	va_end(ap);
  202|       |
  203|    840|	return result;
  204|    840|}
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|    724|{
  102|    724|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|    724|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|    724|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|    724|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  103|    724|	VipsProfileLoad *load = (VipsProfileLoad *) object;
  104|       |
  105|    724|	size_t length;
  106|    724|	const void *data;
  107|    724|	VipsBlob *profile;
  108|       |
  109|    724|	if (VIPS_OBJECT_CLASS(vips_profile_load_parent_class)->build(object))
  ------------------
  |  |  435|    724|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|    724|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    724|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (109:6): [True: 0, False: 724]
  ------------------
  110|      0|		return -1;
  111|       |
  112|    724|	if (g_ascii_strcasecmp(load->name, "none") == 0)
  ------------------
  |  Branch (112:6): [True: 0, False: 724]
  ------------------
  113|      0|		profile = NULL;
  114|    724|	else if ((data = vips_profile_fallback_get(load->name, &length)))
  ------------------
  |  Branch (114:11): [True: 724, False: 0]
  ------------------
  115|    724|		profile = vips_blob_new(
  116|    724|			(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|    724|	g_object_set(object, "profile", profile, NULL);
  128|       |
  129|    724|	if (profile) {
  ------------------
  |  Branch (129:6): [True: 724, False: 0]
  ------------------
  130|    724|		vips_area_unref((VipsArea *) profile);
  131|    724|		profile = NULL;
  132|    724|	}
  133|       |
  134|    724|	return 0;
  135|    724|}
profile_load.c:vips_profile_fallback_get:
   63|    724|{
   64|    724|	int i;
   65|    724|	VipsProfileFallback *fallback;
   66|       |
   67|    724|	for (i = 0; (fallback = vips__profile_fallback_table[i]); i++)
  ------------------
  |  Branch (67:14): [True: 724, False: 0]
  ------------------
   68|    724|		if (g_ascii_strcasecmp(fallback->name, name) == 0) {
  ------------------
  |  Branch (68:7): [True: 724, False: 0]
  ------------------
   69|    724|			void *data;
   70|    724|			GConverter *converter;
   71|    724|			GConverterResult res;
   72|    724|			gsize bytes_read;
   73|    724|			gsize bytes_written;
   74|       |
   75|    724|			data = g_malloc0(fallback->length);
   76|    724|			converter = G_CONVERTER(g_zlib_decompressor_new(
  ------------------
  |  |   33|    724|#define G_CONVERTER(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_CONVERTER, GConverter))
  |  |  ------------------
  |  |  |  |  484|    724|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    724|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   77|    724|				G_ZLIB_COMPRESSOR_FORMAT_ZLIB));
   78|       |
   79|    724|			res = g_converter_convert(converter,
   80|    724|				fallback->data, fallback->length,
   81|    724|				data, fallback->length,
   82|    724|				G_CONVERTER_INPUT_AT_END,
   83|    724|				&bytes_read, &bytes_written, NULL);
   84|    724|			g_object_unref(converter);
   85|       |
   86|    724|			if (res == G_CONVERTER_FINISHED) {
  ------------------
  |  Branch (86:8): [True: 724, False: 0]
  ------------------
   87|    724|				*length = fallback->length;
   88|    724|				return data;
   89|    724|			}
   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|    724|		}
   95|       |
   96|      0|	return NULL;
   97|    724|}
profile_load.c:vips_profile_load_init:
  167|    840|{
  168|    840|}

vips_rad2float:
  217|    200|{
  218|    200|	va_list ap;
  219|    200|	int result;
  220|       |
  221|    200|	va_start(ap, out);
  222|    200|	result = vips_call_split("rad2float", ap, in, out);
  223|    200|	va_end(ap);
  224|       |
  225|    200|	return result;
  226|    200|}
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|  1.36k|{
  167|  1.36k|	COLR *inp = (COLR *) in[0];
  168|  1.36k|	COLOR *outbuf = (COLOR *) out;
  169|       |
  170|  1.36k|	int i;
  171|       |
  172|  68.7k|	for (i = 0; i < width; i++)
  ------------------
  |  Branch (172:14): [True: 67.3k, False: 1.36k]
  ------------------
  173|  67.3k|		colr_color(outbuf[i], inp[i]);
  174|  1.36k|}
rad2float.c:colr_color:
  144|  67.3k|{
  145|  67.3k|	if (clr[EXP] == 0)
  ------------------
  |  |  125|  67.3k|#define EXP 3	  /* exponent same for either format */
  ------------------
  |  Branch (145:6): [True: 11.5k, False: 55.8k]
  ------------------
  146|  11.5k|		col[RED] = col[GRN] = col[BLU] = 0.0;
  ------------------
  |  |  119|  11.5k|#define RED 0
  ------------------
              		col[RED] = col[GRN] = col[BLU] = 0.0;
  ------------------
  |  |  120|  11.5k|#define GRN 1
  ------------------
              		col[RED] = col[GRN] = col[BLU] = 0.0;
  ------------------
  |  |  121|  11.5k|#define BLU 2
  ------------------
  147|  55.8k|	else {
  148|  55.8k|		double f = ldexp(1.0, (int) clr[EXP] - (COLXS + 8));
  ------------------
  |  |  125|  55.8k|#define EXP 3	  /* exponent same for either format */
  ------------------
              		double f = ldexp(1.0, (int) clr[EXP] - (COLXS + 8));
  ------------------
  |  |  126|  55.8k|#define COLXS 128 /* excess used for exponent */
  ------------------
  149|       |
  150|  55.8k|		col[RED] = (clr[RED] + 0.5) * f;
  ------------------
  |  |  119|  55.8k|#define RED 0
  ------------------
              		col[RED] = (clr[RED] + 0.5) * f;
  ------------------
  |  |  119|  55.8k|#define RED 0
  ------------------
  151|  55.8k|		col[GRN] = (clr[GRN] + 0.5) * f;
  ------------------
  |  |  120|  55.8k|#define GRN 1
  ------------------
              		col[GRN] = (clr[GRN] + 0.5) * f;
  ------------------
  |  |  120|  55.8k|#define GRN 1
  ------------------
  152|  55.8k|		col[BLU] = (clr[BLU] + 0.5) * f;
  ------------------
  |  |  121|  55.8k|#define BLU 2
  ------------------
              		col[BLU] = (clr[BLU] + 0.5) * f;
  ------------------
  |  |  121|  55.8k|#define BLU 2
  ------------------
  153|  55.8k|	}
  154|  67.3k|}
rad2float.c:vips_rad2float_init:
  191|    200|{
  192|    200|	VipsColour *colour = VIPS_COLOUR(rad2float);
  ------------------
  |  |   42|    200|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|    200|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    200|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|    200|		VIPS_TYPE_COLOUR, VipsColour))
  ------------------
  193|    200|	VipsColourCode *code = VIPS_COLOUR_CODE(rad2float);
  ------------------
  |  |  135|    200|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|    200|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    200|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  136|    200|		VIPS_TYPE_COLOUR_CODE, VipsColourCode))
  ------------------
  194|       |
  195|    200|	colour->coding = VIPS_CODING_NONE;
  196|    200|	colour->interpretation = VIPS_INTERPRETATION_scRGB;
  197|    200|	colour->format = VIPS_FORMAT_FLOAT;
  198|    200|	colour->bands = 3;
  199|       |
  200|    200|	code->input_coding = VIPS_CODING_RAD;
  201|    200|}

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|}

vips_sRGB2scRGB:
  323|  17.5k|{
  324|  17.5k|	va_list ap;
  325|  17.5k|	int result;
  326|       |
  327|  17.5k|	va_start(ap, out);
  328|  17.5k|	result = vips_call_split("sRGB2scRGB", ap, in, out);
  329|  17.5k|	va_end(ap);
  330|       |
  331|  17.5k|	return result;
  332|  17.5k|}
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|}
sRGB2scRGB.c:vips_sRGB2scRGB_build:
  216|  17.5k|{
  217|  17.5k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  17.5k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  17.5k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  17.5k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  218|  17.5k|	VipssRGB2scRGB *sRGB2scRGB = (VipssRGB2scRGB *) object;
  219|       |
  220|  17.5k|	VipsImage **t = (VipsImage **) vips_object_local_array(object, 2);
  221|       |
  222|  17.5k|	VipsImage *in;
  223|  17.5k|	VipsImage *out;
  224|  17.5k|	VipsBandFormat format;
  225|       |
  226|  17.5k|	if (VIPS_OBJECT_CLASS(vips_sRGB2scRGB_parent_class)->build(object))
  ------------------
  |  |  435|  17.5k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  17.5k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  17.5k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (226:6): [True: 0, False: 17.5k]
  ------------------
  227|      0|		return -1;
  228|       |
  229|  17.5k|	in = sRGB2scRGB->in;
  230|  17.5k|	if (vips_check_bands_atleast(class->nickname, in, 3))
  ------------------
  |  Branch (230:6): [True: 0, False: 17.5k]
  ------------------
  231|      0|		return -1;
  232|       |
  233|       |	// we are changing the gamma, so any profile on the image can no longer
  234|       |	// work (and will cause horrible problems in any downstream colour
  235|       |	// handling)
  236|  17.5k|	if (vips_copy(in, &t[0], NULL))
  ------------------
  |  Branch (236:6): [True: 0, False: 17.5k]
  ------------------
  237|      0|		return -1;
  238|  17.5k|	in = t[0];
  239|  17.5k|	vips_image_remove(in, VIPS_META_ICC_NAME);
  ------------------
  |  |   78|  17.5k|#define VIPS_META_ICC_NAME "icc-profile-data"
  ------------------
  240|       |
  241|  17.5k|	format = in->Type == VIPS_INTERPRETATION_RGB16
  ------------------
  |  Branch (241:11): [True: 2.23k, False: 15.2k]
  ------------------
  242|  17.5k|		? VIPS_FORMAT_USHORT
  243|  17.5k|		: VIPS_FORMAT_UCHAR;
  244|  17.5k|	if (in->BandFmt != format) {
  ------------------
  |  Branch (244:6): [True: 4.54k, False: 12.9k]
  ------------------
  245|  4.54k|		if (vips_cast(in, &t[1], format, NULL))
  ------------------
  |  Branch (245:7): [True: 0, False: 4.54k]
  ------------------
  246|      0|			return -1;
  247|  4.54k|		in = t[1];
  248|  4.54k|	}
  249|       |
  250|  17.5k|	out = vips_image_new();
  251|  17.5k|	if (vips_image_pipelinev(out,
  ------------------
  |  Branch (251:6): [True: 0, False: 17.5k]
  ------------------
  252|  17.5k|			VIPS_DEMAND_STYLE_THINSTRIP, in, NULL)) {
  253|      0|		g_object_unref(out);
  254|      0|		return -1;
  255|      0|	}
  256|  17.5k|	out->Type = VIPS_INTERPRETATION_scRGB;
  257|  17.5k|	out->BandFmt = VIPS_FORMAT_FLOAT;
  258|       |
  259|  17.5k|	if (vips_image_generate(out,
  ------------------
  |  Branch (259:6): [True: 0, False: 17.5k]
  ------------------
  260|  17.5k|			vips_start_one, vips_sRGB2scRGB_gen, vips_stop_one,
  261|  17.5k|			in, sRGB2scRGB)) {
  262|      0|		g_object_unref(out);
  263|      0|		return -1;
  264|      0|	}
  265|       |
  266|  17.5k|	g_object_set(object, "out", out, NULL);
  267|       |
  268|  17.5k|	return 0;
  269|  17.5k|}
sRGB2scRGB.c:vips_sRGB2scRGB_gen:
  173|  17.5k|{
  174|  17.5k|	VipsRegion *ir = (VipsRegion *) seq;
  175|  17.5k|	VipsRect *r = &out_region->valid;
  176|  17.5k|	VipsImage *in = ir->im;
  177|       |
  178|  17.5k|	int y;
  179|       |
  180|  17.5k|	if (vips_region_prepare(ir, r))
  ------------------
  |  Branch (180:6): [True: 10.5k, False: 6.95k]
  ------------------
  181|  10.5k|		return -1;
  182|       |
  183|  17.5k|	VIPS_GATE_START("vips_sRGB2scRGB_gen: work");
  ------------------
  |  |   41|  6.95k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  6.95k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  6.95k|	{ \
  |  |   43|  6.95k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 6.95k]
  |  |  ------------------
  |  |   44|  6.95k|			vips__thread_gate_start(NAME); \
  |  |   45|  6.95k|	} \
  |  |   46|  17.5k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  17.5k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  184|       |
  185|  6.95k|	if (in->BandFmt == VIPS_FORMAT_UCHAR) {
  ------------------
  |  Branch (185:6): [True: 6.47k, False: 478]
  ------------------
  186|  6.47k|		vips_col_make_tables_RGB_8();
  187|       |
  188|   213k|		for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (188:15): [True: 207k, False: 6.47k]
  ------------------
  189|   207k|			VipsPel *p = VIPS_REGION_ADDR(ir, r->left, r->top + y);
  ------------------
  |  |  227|   207k|	((R)->data + \
  |  |  228|   207k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   207k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   207k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   207k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   207k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   207k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  190|   207k|			float *q = (float *)
  191|   207k|				VIPS_REGION_ADDR(out_region, r->left, r->top + y);
  ------------------
  |  |  227|   207k|	((R)->data + \
  |  |  228|   207k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   207k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   207k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   207k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   207k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   207k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  192|       |
  193|   207k|			vips_sRGB2scRGB_line_8(q, p, in->Bands - 3, r->width);
  194|   207k|		}
  195|  6.47k|	}
  196|    478|	else {
  197|    478|		vips_col_make_tables_RGB_16();
  198|       |
  199|  15.7k|		for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (199:15): [True: 15.2k, False: 478]
  ------------------
  200|  15.2k|			VipsPel *p = VIPS_REGION_ADDR(ir, r->left, r->top + y);
  ------------------
  |  |  227|  15.2k|	((R)->data + \
  |  |  228|  15.2k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  15.2k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  15.2k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  15.2k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  15.2k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  15.2k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  201|  15.2k|			float *q = (float *)
  202|  15.2k|				VIPS_REGION_ADDR(out_region, r->left, r->top + y);
  ------------------
  |  |  227|  15.2k|	((R)->data + \
  |  |  228|  15.2k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  15.2k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  15.2k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  15.2k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  15.2k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  15.2k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  203|       |
  204|  15.2k|			vips_sRGB2scRGB_line_16(q, (unsigned short *) p,
  205|  15.2k|				in->Bands - 3, r->width);
  206|  15.2k|		}
  207|    478|	}
  208|       |
  209|  6.95k|	VIPS_GATE_STOP("vips_sRGB2scRGB_gen: work");
  ------------------
  |  |   49|  6.95k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  6.95k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  6.95k|	{ \
  |  |   51|  6.95k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 6.95k]
  |  |  ------------------
  |  |   52|  6.95k|			vips__thread_gate_stop(NAME); \
  |  |   53|  6.95k|	} \
  |  |   54|  6.95k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  6.95k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  210|       |
  211|  6.95k|	return 0;
  212|  17.5k|}
sRGB2scRGB.c:vips_sRGB2scRGB_line_8:
   83|   207k|{
   84|   207k|	int i, j;
   85|       |
   86|   207k|	if (extra_bands == 0) {
  ------------------
  |  Branch (86:6): [True: 148k, False: 58.7k]
  ------------------
   87|  4.89M|		for (i = 0; i < width; i++) {
  ------------------
  |  Branch (87:15): [True: 4.74M, False: 148k]
  ------------------
   88|  4.74M|			q[0] = vips_v2Y_8[p[0]];
   89|  4.74M|			q[1] = vips_v2Y_8[p[1]];
   90|  4.74M|			q[2] = vips_v2Y_8[p[2]];
   91|       |
   92|  4.74M|			p += 3;
   93|  4.74M|			q += 3;
   94|  4.74M|		}
   95|   148k|	}
   96|  58.7k|	else if (extra_bands == 1) {
  ------------------
  |  Branch (96:11): [True: 51.9k, False: 6.81k]
  ------------------
   97|  1.71M|		for (i = 0; i < width; i++) {
  ------------------
  |  Branch (97:15): [True: 1.66M, False: 51.9k]
  ------------------
   98|  1.66M|			q[0] = vips_v2Y_8[p[0]];
   99|  1.66M|			q[1] = vips_v2Y_8[p[1]];
  100|  1.66M|			q[2] = vips_v2Y_8[p[2]];
  101|  1.66M|			q[3] = p[3] / 255.0;
  102|       |
  103|  1.66M|			p += 4;
  104|  1.66M|			q += 4;
  105|  1.66M|		}
  106|  51.9k|	}
  107|  6.81k|	else {
  108|   224k|		for (i = 0; i < width; i++) {
  ------------------
  |  Branch (108:15): [True: 218k, False: 6.81k]
  ------------------
  109|   218k|			q[0] = vips_v2Y_8[p[0]];
  110|   218k|			q[1] = vips_v2Y_8[p[1]];
  111|   218k|			q[2] = vips_v2Y_8[p[2]];
  112|       |
  113|   218k|			p += 3;
  114|   218k|			q += 3;
  115|       |
  116|   759k|			for (j = 0; j < extra_bands; j++)
  ------------------
  |  Branch (116:16): [True: 541k, False: 218k]
  ------------------
  117|   541k|				q[j] = p[j] / 255.0;
  118|   218k|			p += extra_bands;
  119|   218k|			q += extra_bands;
  120|   218k|		}
  121|  6.81k|	}
  122|   207k|}
sRGB2scRGB.c:vips_sRGB2scRGB_line_16:
  129|  15.2k|{
  130|  15.2k|	int i, j;
  131|       |
  132|  15.2k|	if (extra_bands == 0) {
  ------------------
  |  Branch (132:6): [True: 6.81k, False: 8.48k]
  ------------------
  133|   224k|		for (i = 0; i < width; i++) {
  ------------------
  |  Branch (133:15): [True: 218k, False: 6.81k]
  ------------------
  134|   218k|			q[0] = vips_v2Y_16[p[0]];
  135|   218k|			q[1] = vips_v2Y_16[p[1]];
  136|   218k|			q[2] = vips_v2Y_16[p[2]];
  137|       |
  138|   218k|			p += 3;
  139|   218k|			q += 3;
  140|   218k|		}
  141|  6.81k|	}
  142|  8.48k|	else if (extra_bands == 1) {
  ------------------
  |  Branch (142:11): [True: 7.00k, False: 1.47k]
  ------------------
  143|   231k|		for (i = 0; i < width; i++) {
  ------------------
  |  Branch (143:15): [True: 224k, False: 7.00k]
  ------------------
  144|   224k|			q[0] = vips_v2Y_16[p[0]];
  145|   224k|			q[1] = vips_v2Y_16[p[1]];
  146|   224k|			q[2] = vips_v2Y_16[p[2]];
  147|   224k|			q[3] = p[3] / 65535.0;
  148|       |
  149|   224k|			p += 4;
  150|   224k|			q += 4;
  151|   224k|		}
  152|  7.00k|	}
  153|  1.47k|	else {
  154|  48.5k|		for (i = 0; i < width; i++) {
  ------------------
  |  Branch (154:15): [True: 47.1k, False: 1.47k]
  ------------------
  155|  47.1k|			q[0] = vips_v2Y_16[p[0]];
  156|  47.1k|			q[1] = vips_v2Y_16[p[1]];
  157|  47.1k|			q[2] = vips_v2Y_16[p[2]];
  158|       |
  159|  47.1k|			p += 3;
  160|  47.1k|			q += 3;
  161|       |
  162|   169k|			for (j = 0; j < extra_bands; j++)
  ------------------
  |  Branch (162:16): [True: 122k, False: 47.1k]
  ------------------
  163|   122k|				q[j] = p[j] / 65535.0;
  164|  47.1k|			p += extra_bands;
  165|  47.1k|			q += extra_bands;
  166|  47.1k|		}
  167|  1.47k|	}
  168|  15.2k|}
sRGB2scRGB.c:vips_sRGB2scRGB_init:
  302|  17.5k|{
  303|  17.5k|}

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|}

vips_scRGB2XYZ:
  220|  17.8k|{
  221|  17.8k|	va_list ap;
  222|  17.8k|	int result;
  223|       |
  224|  17.8k|	va_start(ap, out);
  225|  17.8k|	result = vips_call_split("scRGB2XYZ", ap, in, out);
  226|  17.8k|	va_end(ap);
  227|       |
  228|  17.8k|	return result;
  229|  17.8k|}
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|}
scRGB2XYZ.c:vips_scRGB2XYZ_build:
  133|  17.8k|{
  134|  17.8k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  17.8k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  17.8k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  17.8k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  135|  17.8k|	VipsscRGB2XYZ *scRGB2XYZ = (VipsscRGB2XYZ *) object;
  136|       |
  137|  17.8k|	VipsImage **t = (VipsImage **) vips_object_local_array(object, 2);
  138|       |
  139|  17.8k|	VipsImage *in;
  140|  17.8k|	VipsImage *out;
  141|       |
  142|  17.8k|	if (VIPS_OBJECT_CLASS(vips_scRGB2XYZ_parent_class)->build(object))
  ------------------
  |  |  435|  17.8k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  17.8k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  17.8k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (142:6): [True: 0, False: 17.8k]
  ------------------
  143|      0|		return -1;
  144|       |
  145|  17.8k|	in = scRGB2XYZ->in;
  146|  17.8k|	if (vips_check_bands_atleast(class->nickname, in, 3))
  ------------------
  |  Branch (146:6): [True: 0, False: 17.8k]
  ------------------
  147|      0|		return -1;
  148|       |
  149|  17.8k|	if (vips_cast_float(in, &t[0], NULL))
  ------------------
  |  Branch (149:6): [True: 0, False: 17.8k]
  ------------------
  150|      0|		return -1;
  151|  17.8k|	in = t[0];
  152|       |
  153|  17.8k|	out = vips_image_new();
  154|  17.8k|	if (vips_image_pipelinev(out,
  ------------------
  |  Branch (154:6): [True: 0, False: 17.8k]
  ------------------
  155|  17.8k|			VIPS_DEMAND_STYLE_THINSTRIP, in, NULL)) {
  156|      0|		g_object_unref(out);
  157|      0|		return -1;
  158|      0|	}
  159|  17.8k|	out->Type = VIPS_INTERPRETATION_XYZ;
  160|  17.8k|	out->BandFmt = VIPS_FORMAT_FLOAT;
  161|       |
  162|  17.8k|	if (vips_image_generate(out,
  ------------------
  |  Branch (162:6): [True: 0, False: 17.8k]
  ------------------
  163|  17.8k|			vips_start_one, vips_scRGB2XYZ_gen, vips_stop_one,
  164|  17.8k|			in, scRGB2XYZ)) {
  165|      0|		g_object_unref(out);
  166|      0|		return -1;
  167|      0|	}
  168|       |
  169|  17.8k|	g_object_set(object, "out", out, NULL);
  170|       |
  171|  17.8k|	return 0;
  172|  17.8k|}
scRGB2XYZ.c:vips_scRGB2XYZ_gen:
  105|  17.8k|{
  106|  17.8k|	VipsRegion *ir = (VipsRegion *) seq;
  107|  17.8k|	VipsRect *r = &out_region->valid;
  108|  17.8k|	VipsImage *in = ir->im;
  109|       |
  110|  17.8k|	int y;
  111|       |
  112|  17.8k|	if (vips_region_prepare(ir, r))
  ------------------
  |  Branch (112:6): [True: 10.7k, False: 7.06k]
  ------------------
  113|  10.7k|		return -1;
  114|       |
  115|  17.8k|	VIPS_GATE_START("vips_scRGB2XYZ_gen: work");
  ------------------
  |  |   41|  7.06k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  7.06k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  7.06k|	{ \
  |  |   43|  7.06k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 7.06k]
  |  |  ------------------
  |  |   44|  7.06k|			vips__thread_gate_start(NAME); \
  |  |   45|  7.06k|	} \
  |  |   46|  17.8k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  17.8k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  116|       |
  117|   233k|	for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (117:14): [True: 226k, False: 7.06k]
  ------------------
  118|   226k|		float *p = (float *)
  119|   226k|			VIPS_REGION_ADDR(ir, r->left, r->top + y);
  ------------------
  |  |  227|   226k|	((R)->data + \
  |  |  228|   226k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   226k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   226k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   226k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   226k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   226k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  120|   226k|		float *q = (float *)
  121|   226k|			VIPS_REGION_ADDR(out_region, r->left, r->top + y);
  ------------------
  |  |  227|   226k|	((R)->data + \
  |  |  228|   226k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   226k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   226k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   226k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   226k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   226k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  122|       |
  123|   226k|		vips_scRGB2XYZ_line(q, p, in->Bands - 3, r->width);
  124|   226k|	}
  125|       |
  126|  7.06k|	VIPS_GATE_STOP("vips_scRGB2XYZ_gen: work");
  ------------------
  |  |   49|  7.06k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  7.06k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  7.06k|	{ \
  |  |   51|  7.06k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 7.06k]
  |  |  ------------------
  |  |   52|  7.06k|			vips__thread_gate_stop(NAME); \
  |  |   53|  7.06k|	} \
  |  |   54|  7.06k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  7.06k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  127|       |
  128|  7.06k|	return 0;
  129|  17.8k|}
scRGB2XYZ.c:vips_scRGB2XYZ_line:
   70|   226k|{
   71|   226k|	int i, j;
   72|       |
   73|  7.46M|	for (i = 0; i < width; i++) {
  ------------------
  |  Branch (73:14): [True: 7.23M, False: 226k]
  ------------------
   74|  7.23M|		const float R = p[0] * VIPS_D65_Y0;
  ------------------
  |  |   59|  7.23M|#define VIPS_D65_Y0 (100.0)
  ------------------
   75|  7.23M|		const float G = p[1] * VIPS_D65_Y0;
  ------------------
  |  |   59|  7.23M|#define VIPS_D65_Y0 (100.0)
  ------------------
   76|  7.23M|		const float B = p[2] * VIPS_D65_Y0;
  ------------------
  |  |   59|  7.23M|#define VIPS_D65_Y0 (100.0)
  ------------------
   77|       |
   78|       |		/* Manually inlined logic from the vips_col_scRGB2XYZ function
   79|       |		 * as the original is defined in a separate file and is part of
   80|       |		 * the public API so a compiler will not inline.
   81|       |		 */
   82|  7.23M|		q[0] = 0.4124 * R +
   83|  7.23M|			0.3576 * G +
   84|  7.23M|			0.1805 * B;
   85|  7.23M|		q[1] = 0.2126 * R +
   86|  7.23M|			0.7152 * G +
   87|  7.23M|			0.0722 * B;
   88|  7.23M|		q[2] = 0.0193 * R +
   89|  7.23M|			0.1192 * G +
   90|  7.23M|			0.9505 * B;
   91|       |
   92|  7.23M|		p += 3;
   93|  7.23M|		q += 3;
   94|       |
   95|  9.87M|		for (j = 0; j < extra_bands; j++)
  ------------------
  |  Branch (95:15): [True: 2.64M, False: 7.23M]
  ------------------
   96|  7.23M|			q[j] = VIPS_CLIP(0, p[j] * 255.0, 255.0);
  ------------------
  |  |   57|  2.64M|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|  5.28M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 21.7k, False: 2.62M]
  |  |  |  |  |  Branch (54:32): [True: 15.2k, False: 2.62M]
  |  |  |  |  |  Branch (54:44): [True: 15.2k, False: 2.60M]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   97|  7.23M|		p += extra_bands;
   98|  7.23M|		q += extra_bands;
   99|  7.23M|	}
  100|   226k|}
scRGB2XYZ.c:vips_scRGB2XYZ_init:
  205|  17.8k|{
  206|  17.8k|}

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|}

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|}

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|  10.9k|{
   99|  10.9k|	(void) vips_image_remove(image, VIPS_META_ORIENTATION);
  ------------------
  |  |  149|  10.9k|#define VIPS_META_ORIENTATION "orientation"
  ------------------
  100|  10.9k|	(void) vips_image_map(image, vips_autorot_remove_angle_sub, NULL);
  101|  10.9k|}
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|   125k|{
   77|   125k|	if (strcmp(field, "exif-ifd0-Orientation") == 0) {
  ------------------
  |  Branch (77:6): [True: 0, False: 125k]
  ------------------
   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|   125k|	return NULL;
   86|   125k|}

vips_bandary_copy:
  274|  14.4k|{
  275|  14.4k|	VipsObjectClass *object_class = VIPS_OBJECT_GET_CLASS(bandary);
  ------------------
  |  |  441|  14.4k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  14.4k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  14.4k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  276|  14.4k|	VipsConversion *conversion = VIPS_CONVERSION(bandary);
  ------------------
  |  |   40|  14.4k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  14.4k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  14.4k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  14.4k|		VIPS_TYPE_CONVERSION, VipsConversion))
  ------------------
  277|       |
  278|  14.4k|	if (!bandary->in) {
  ------------------
  |  Branch (278:6): [True: 0, False: 14.4k]
  ------------------
  279|      0|		vips_error(object_class->nickname,
  280|      0|			"%s", _("no input images"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  281|      0|		return -1;
  282|      0|	}
  283|       |
  284|       |	/* This isn't set by arith until build(), so we have to set
  285|       |	 * again here.
  286|       |	 *
  287|       |	 * Should arith set out in _init()?
  288|       |	 */
  289|  14.4k|	g_object_set(bandary, "out", vips_image_new(), NULL);
  290|       |
  291|  14.4k|	return vips_image_write(bandary->in[0], conversion->out);
  292|  14.4k|}
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|   166k|{
  196|   166k|	VipsObjectClass *object_class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|   166k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|   166k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|   166k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  197|   166k|	VipsBandaryClass *class = VIPS_BANDARY_GET_CLASS(object);
  ------------------
  |  |   52|   166k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|   166k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|   166k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   53|   166k|		VIPS_TYPE_BANDARY, VipsBandaryClass))
  ------------------
  198|   166k|	VipsConversion *conversion = VIPS_CONVERSION(object);
  ------------------
  |  |   40|   166k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   166k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   166k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|   166k|		VIPS_TYPE_CONVERSION, VipsConversion))
  ------------------
  199|   166k|	VipsBandary *bandary = VIPS_BANDARY(object);
  ------------------
  |  |   42|   166k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   166k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   166k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|   166k|		VIPS_TYPE_BANDARY, VipsBandary))
  ------------------
  200|       |
  201|   166k|	int i;
  202|   166k|	VipsImage **decode;
  203|   166k|	VipsImage **format;
  204|   166k|	VipsImage **size;
  205|       |
  206|   166k|	if (VIPS_OBJECT_CLASS(vips_bandary_parent_class)->build(object))
  ------------------
  |  |  435|   166k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|   166k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   166k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (206:6): [True: 0, False: 166k]
  ------------------
  207|      0|		return -1;
  208|       |
  209|   166k|	if (bandary->n <= 0) {
  ------------------
  |  Branch (209:6): [True: 0, False: 166k]
  ------------------
  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|   166k|	decode = (VipsImage **) vips_object_local_array(object, bandary->n);
  216|   166k|	format = (VipsImage **) vips_object_local_array(object, bandary->n);
  217|   166k|	size = (VipsImage **) vips_object_local_array(object, bandary->n);
  218|       |
  219|   382k|	for (i = 0; i < bandary->n; i++)
  ------------------
  |  Branch (219:14): [True: 216k, False: 166k]
  ------------------
  220|   216k|		if (vips_image_decode(bandary->in[i], &decode[i]))
  ------------------
  |  Branch (220:7): [True: 0, False: 216k]
  ------------------
  221|      0|			return -1;
  222|   166k|	if (vips__formatalike_vec(decode, format, bandary->n) ||
  ------------------
  |  Branch (222:6): [True: 0, False: 166k]
  ------------------
  223|   166k|		vips__sizealike_vec(format, size, bandary->n))
  ------------------
  |  Branch (223:3): [True: 0, False: 166k]
  ------------------
  224|      0|		return -1;
  225|   166k|	bandary->ready = size;
  226|       |
  227|   166k|	if (vips_image_pipeline_array(conversion->out,
  ------------------
  |  Branch (227:6): [True: 0, False: 166k]
  ------------------
  228|   166k|			VIPS_DEMAND_STYLE_THINSTRIP, bandary->ready))
  229|      0|		return -1;
  230|       |
  231|   166k|	conversion->out->Bands = bandary->out_bands;
  232|   166k|	if (class->format_table)
  ------------------
  |  Branch (232:6): [True: 0, False: 166k]
  ------------------
  233|      0|		conversion->out->BandFmt =
  234|      0|			class->format_table[bandary->ready[0]->BandFmt];
  235|       |
  236|   166k|	if (vips_image_generate(conversion->out,
  ------------------
  |  Branch (236:6): [True: 0, False: 166k]
  ------------------
  237|   166k|			vips_bandary_start, vips_bandary_gen, vips_bandary_stop,
  238|   166k|			bandary->ready, bandary))
  239|      0|		return -1;
  240|       |
  241|   166k|	return 0;
  242|   166k|}
bandary.c:vips_bandary_start:
  105|  74.1k|{
  106|  74.1k|	VipsImage **in = (VipsImage **) a;
  107|  74.1k|	VipsBandary *bandary = (VipsBandary *) b;
  108|       |
  109|  74.1k|	VipsBandarySequence *seq;
  110|  74.1k|	int i, n;
  111|       |
  112|  74.1k|	if (!(seq = VIPS_NEW(NULL, VipsBandarySequence)))
  ------------------
  |  |   70|  74.1k|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  74.1k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  74.1k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  74.1k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  74.1k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (112:6): [True: 0, False: 74.1k]
  ------------------
  113|      0|		return NULL;
  114|       |
  115|  74.1k|	seq->bandary = bandary;
  116|  74.1k|	seq->ir = NULL;
  117|  74.1k|	seq->p = NULL;
  118|  74.1k|	seq->pixels = NULL;
  119|       |
  120|       |	/* How many images?
  121|       |	 */
  122|   171k|	for (n = 0; in[n]; n++)
  ------------------
  |  Branch (122:14): [True: 97.6k, False: 74.1k]
  ------------------
  123|  97.6k|		;
  124|       |
  125|       |	/* Allocate space for region array.
  126|       |	 */
  127|  74.1k|	if (!(seq->ir = VIPS_ARRAY(NULL, n + 1, VipsRegion *))) {
  ------------------
  |  |   72|  74.1k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  74.1k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  74.1k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  74.1k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  74.1k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (127:6): [True: 0, False: 74.1k]
  ------------------
  128|      0|		vips_bandary_stop(seq, NULL, NULL);
  129|      0|		return NULL;
  130|      0|	}
  131|       |
  132|       |	/* Create a set of regions.
  133|       |	 */
  134|   171k|	for (i = 0; i < n; i++)
  ------------------
  |  Branch (134:14): [True: 97.6k, False: 74.1k]
  ------------------
  135|  97.6k|		if (!(seq->ir[i] = vips_region_new(in[i]))) {
  ------------------
  |  Branch (135:7): [True: 0, False: 97.6k]
  ------------------
  136|      0|			vips_bandary_stop(seq, NULL, NULL);
  137|      0|			return NULL;
  138|      0|		}
  139|  74.1k|	seq->ir[n] = NULL;
  140|       |
  141|       |	/* Input pointers.
  142|       |	 */
  143|  74.1k|	if (!(seq->p = VIPS_ARRAY(NULL, n + 1, VipsPel *))) {
  ------------------
  |  |   72|  74.1k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  74.1k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  74.1k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  74.1k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  74.1k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (143:6): [True: 0, False: 74.1k]
  ------------------
  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|  74.1k|	if (!(seq->pixels = VIPS_ARRAY(NULL,
  ------------------
  |  |   72|  74.1k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  74.1k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  74.1k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  74.1k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  74.1k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (150:6): [True: 0, False: 74.1k]
  ------------------
  151|  74.1k|			  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|  74.1k|	return seq;
  157|  74.1k|}
bandary.c:vips_bandary_gen:
  162|  74.1k|{
  163|  74.1k|	VipsBandarySequence *seq = (VipsBandarySequence *) vseq;
  164|  74.1k|	VipsBandary *bandary = (VipsBandary *) b;
  165|  74.1k|	VipsBandaryClass *class = VIPS_BANDARY_GET_CLASS(bandary);
  ------------------
  |  |   52|  74.1k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  74.1k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  74.1k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   53|  74.1k|		VIPS_TYPE_BANDARY, VipsBandaryClass))
  ------------------
  166|  74.1k|	VipsRect *r = &out_region->valid;
  167|       |
  168|  74.1k|	VipsPel *q;
  169|  74.1k|	int y, i;
  170|       |
  171|  74.1k|	if (vips_reorder_prepare_many(out_region->im, seq->ir, r))
  ------------------
  |  Branch (171:6): [True: 14.6k, False: 59.4k]
  ------------------
  172|  14.6k|		return -1;
  173|   140k|	for (i = 0; i < bandary->n; i++)
  ------------------
  |  Branch (173:14): [True: 80.9k, False: 59.4k]
  ------------------
  174|  80.9k|		seq->p[i] = VIPS_REGION_ADDR(seq->ir[i], r->left, r->top);
  ------------------
  |  |  227|   140k|	((R)->data + \
  |  |  228|   140k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  80.9k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   140k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  80.9k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  80.9k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  80.9k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  175|  59.4k|	seq->p[i] = NULL;
  176|  59.4k|	q = VIPS_REGION_ADDR(out_region, r->left, r->top);
  ------------------
  |  |  227|  59.4k|	((R)->data + \
  |  |  228|  59.4k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  59.4k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  59.4k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  59.4k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  59.4k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  59.4k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  177|       |
  178|  59.4k|	VIPS_GATE_START("vips_bandary_gen: work");
  ------------------
  |  |   41|  59.4k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  59.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  59.4k|	{ \
  |  |   43|  59.4k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 59.4k]
  |  |  ------------------
  |  |   44|  59.4k|			vips__thread_gate_start(NAME); \
  |  |   45|  59.4k|	} \
  |  |   46|  59.4k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  59.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  179|       |
  180|  1.96M|	for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (180:14): [True: 1.90M, False: 59.4k]
  ------------------
  181|  1.90M|		class->process_line(seq, q, seq->p, r->width);
  182|       |
  183|  4.49M|		for (i = 0; i < bandary->n; i++)
  ------------------
  |  Branch (183:15): [True: 2.59M, False: 1.90M]
  ------------------
  184|  2.59M|			seq->p[i] += VIPS_REGION_LSKIP(seq->ir[i]);
  ------------------
  |  |  195|  2.59M|	((size_t) ((R)->bpl))
  ------------------
  185|  1.90M|		q += VIPS_REGION_LSKIP(out_region);
  ------------------
  |  |  195|  1.90M|	((size_t) ((R)->bpl))
  ------------------
  186|  1.90M|	}
  187|       |
  188|  59.4k|	VIPS_GATE_STOP("vips_bandary_gen: work");
  ------------------
  |  |   49|  59.4k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  59.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  59.4k|	{ \
  |  |   51|  59.4k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 59.4k]
  |  |  ------------------
  |  |   52|  59.4k|			vips__thread_gate_stop(NAME); \
  |  |   53|  59.4k|	} \
  |  |   54|  59.4k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  59.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  189|       |
  190|  59.4k|	return 0;
  191|  74.1k|}
bandary.c:vips_bandary_stop:
   84|  74.1k|{
   85|  74.1k|	VipsBandarySequence *seq = (VipsBandarySequence *) vseq;
   86|       |
   87|  74.1k|	if (seq->ir) {
  ------------------
  |  Branch (87:6): [True: 74.1k, False: 0]
  ------------------
   88|  74.1k|		int i;
   89|       |
   90|   171k|		for (i = 0; seq->ir[i]; i++)
  ------------------
  |  Branch (90:15): [True: 97.6k, False: 74.1k]
  ------------------
   91|  97.6k|			VIPS_UNREF(seq->ir[i]);
  ------------------
  |  |   57|  74.1k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  97.6k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  97.6k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  97.6k|	{ \
  |  |  |  |   43|  97.6k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 97.6k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  97.6k|			(void) F((S)); \
  |  |  |  |   45|  97.6k|			(S) = 0; \
  |  |  |  |   46|  97.6k|		} \
  |  |  |  |   47|  97.6k|	} \
  |  |  |  |   48|  97.6k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  97.6k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   92|  74.1k|		VIPS_FREE(seq->ir);
  ------------------
  |  |   50|  74.1k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  74.1k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  74.1k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  74.1k|	{ \
  |  |  |  |   43|  74.1k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 74.1k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  74.1k|			(void) F((S)); \
  |  |  |  |   45|  74.1k|			(S) = 0; \
  |  |  |  |   46|  74.1k|		} \
  |  |  |  |   47|  74.1k|	} \
  |  |  |  |   48|  74.1k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  74.1k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   93|  74.1k|	}
   94|       |
   95|  74.1k|	VIPS_FREE(seq->p);
  ------------------
  |  |   50|  74.1k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  74.1k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  74.1k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  74.1k|	{ \
  |  |  |  |   43|  74.1k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 74.1k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  74.1k|			(void) F((S)); \
  |  |  |  |   45|  74.1k|			(S) = 0; \
  |  |  |  |   46|  74.1k|		} \
  |  |  |  |   47|  74.1k|	} \
  |  |  |  |   48|  74.1k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  74.1k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   96|  74.1k|	VIPS_FREE(seq->pixels);
  ------------------
  |  |   50|  74.1k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  74.1k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  74.1k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  74.1k|	{ \
  |  |  |  |   43|  74.1k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 74.1k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  74.1k|			(void) F((S)); \
  |  |  |  |   45|  74.1k|			(S) = 0; \
  |  |  |  |   46|  74.1k|		} \
  |  |  |  |   47|  74.1k|	} \
  |  |  |  |   48|  74.1k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  74.1k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   97|       |
   98|  74.1k|	VIPS_FREE(seq);
  ------------------
  |  |   50|  74.1k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  74.1k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  74.1k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  74.1k|	{ \
  |  |  |  |   43|  74.1k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 74.1k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  74.1k|			(void) F((S)); \
  |  |  |  |   45|  74.1k|			(S) = 0; \
  |  |  |  |   46|  74.1k|		} \
  |  |  |  |   47|  74.1k|	} \
  |  |  |  |   48|  74.1k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  74.1k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   99|       |
  100|  74.1k|	return 0;
  101|  74.1k|}
bandary.c:vips_bandary_init:
  265|   199k|{
  266|   199k|	bandary->out_bands = -1;
  267|   199k|}

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|  24.2k|{
  256|  24.2k|	va_list ap;
  257|  24.2k|	int result;
  258|       |
  259|  24.2k|	va_start(ap, n);
  260|  24.2k|	result = vips_bandjoinv(in, out, n, ap);
  261|  24.2k|	va_end(ap);
  262|       |
  263|  24.2k|	return result;
  264|  24.2k|}
vips_bandjoin2:
  279|  1.31k|{
  280|  1.31k|	va_list ap;
  281|  1.31k|	int result;
  282|  1.31k|	VipsImage *in[2];
  283|       |
  284|  1.31k|	in[0] = in1;
  285|  1.31k|	in[1] = in2;
  286|       |
  287|  1.31k|	va_start(ap, out);
  288|  1.31k|	result = vips_bandjoinv(in, out, 2, ap);
  289|  1.31k|	va_end(ap);
  290|       |
  291|  1.31k|	return result;
  292|  1.31k|}
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|  25.5k|{
  157|  25.5k|	VipsBandary *bandary = (VipsBandary *) object;
  158|  25.5k|	VipsBandjoin *bandjoin = (VipsBandjoin *) object;
  159|       |
  160|  25.5k|	if (bandjoin->in) {
  ------------------
  |  Branch (160:6): [True: 25.5k, False: 0]
  ------------------
  161|  25.5k|		bandary->in = vips_array_image_get(bandjoin->in, &bandary->n);
  162|       |
  163|  25.5k|		if (bandary->n == 1)
  ------------------
  |  Branch (163:7): [True: 0, False: 25.5k]
  ------------------
  164|      0|			return vips_bandary_copy(bandary);
  165|  25.5k|		else {
  166|  25.5k|			int i;
  167|       |
  168|  25.5k|			bandary->out_bands = 0;
  169|   101k|			for (i = 0; i < bandary->n; i++)
  ------------------
  |  Branch (169:16): [True: 75.4k, False: 25.5k]
  ------------------
  170|  75.4k|				if (bandary->in[i])
  ------------------
  |  Branch (170:9): [True: 75.4k, False: 0]
  ------------------
  171|  75.4k|					bandary->out_bands +=
  172|  75.4k|						bandary->in[i]->Bands;
  173|  25.5k|		}
  174|  25.5k|	}
  175|       |
  176|  25.5k|	if (VIPS_OBJECT_CLASS(vips_bandjoin_parent_class)->build(object))
  ------------------
  |  |  435|  25.5k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  25.5k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  25.5k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (176:6): [True: 0, False: 25.5k]
  ------------------
  177|      0|		return -1;
  178|       |
  179|  25.5k|	return 0;
  180|  25.5k|}
bandjoin.c:vips_bandjoin_buffer:
   93|   362k|{
   94|   362k|	VipsBandary *bandary = seq->bandary;
   95|   362k|	VipsConversion *conversion = (VipsConversion *) bandary;
   96|   362k|	VipsImage **in = bandary->ready;
   97|       |
   98|       |	/* Output pel size.
   99|       |	 */
  100|   362k|	const int ops = VIPS_IMAGE_SIZEOF_PEL(conversion->out);
  ------------------
  |  |  384|   362k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|   362k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  101|       |
  102|   362k|	int i;
  103|       |
  104|       |	/* Loop for each input image. Scattered write is faster than
  105|       |	 * scattered read.
  106|       |	 */
  107|  1.41M|	for (i = 0; i < bandary->n; i++) {
  ------------------
  |  Branch (107:14): [True: 1.05M, False: 362k]
  ------------------
  108|       |		/* Input pel size.
  109|       |		 */
  110|  1.05M|		int ips = VIPS_IMAGE_SIZEOF_PEL(in[i]);
  ------------------
  |  |  384|  1.05M|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|  1.05M|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  111|       |
  112|  1.05M|		VipsPel *restrict p1;
  113|  1.05M|		VipsPel *restrict q1;
  114|  1.05M|		int x, z;
  115|       |
  116|  1.05M|		q1 = q;
  117|  1.05M|		p1 = p[i];
  118|       |
  119|  1.05M|		if (ips == 1) {
  ------------------
  |  Branch (119:7): [True: 298k, False: 752k]
  ------------------
  120|  9.86M|			for (x = 0; x < width; x++) {
  ------------------
  |  Branch (120:16): [True: 9.56M, False: 298k]
  ------------------
  121|  9.56M|				q1[0] = p1[x];
  122|       |
  123|  9.56M|				q1 += ops;
  124|  9.56M|			}
  125|       |
  126|   298k|			q += ips;
  127|   298k|		}
  128|   752k|		else if (ips == 3) {
  ------------------
  |  Branch (128:12): [True: 3.96k, False: 748k]
  ------------------
  129|   130k|			for (x = 0; x < width; x++) {
  ------------------
  |  Branch (129:16): [True: 126k, False: 3.96k]
  ------------------
  130|   126k|				q1[0] = p1[0];
  131|   126k|				q1[1] = p1[1];
  132|   126k|				q1[2] = p1[2];
  133|       |
  134|   126k|				p1 += ips;
  135|   126k|				q1 += ops;
  136|   126k|			}
  137|       |
  138|  3.96k|			q += ips;
  139|  3.96k|		}
  140|   748k|		else {
  141|  24.6M|			for (x = 0; x < width; x++) {
  ------------------
  |  Branch (141:16): [True: 23.9M, False: 748k]
  ------------------
  142|   127M|				for (z = 0; z < ips; z++)
  ------------------
  |  Branch (142:17): [True: 103M, False: 23.9M]
  ------------------
  143|   103M|					q1[z] = p1[z];
  144|       |
  145|  23.9M|				p1 += ips;
  146|  23.9M|				q1 += ops;
  147|  23.9M|			}
  148|       |
  149|   748k|			q += ips;
  150|   748k|		}
  151|  1.05M|	}
  152|   362k|}
bandjoin.c:vips_bandjoin_init:
  210|  25.5k|{
  211|       |	/* Init our instance fields.
  212|       |	 */
  213|  25.5k|}
bandjoin.c:vips_bandjoinv:
  217|  25.5k|{
  218|  25.5k|	VipsArrayImage *array;
  219|  25.5k|	int result;
  220|       |
  221|  25.5k|	array = vips_array_image_new(in, n);
  222|  25.5k|	result = vips_call_split("bandjoin", ap, array, out);
  223|  25.5k|	vips_area_unref(VIPS_AREA(array));
  ------------------
  |  |  137|  25.5k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  224|       |
  225|  25.5k|	return result;
  226|  25.5k|}
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|}

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|   255k|{
  590|   255k|	va_list ap;
  591|   255k|	int result;
  592|       |
  593|   255k|	va_start(ap, format);
  594|   255k|	result = vips_castv(in, out, format, ap);
  595|   255k|	va_end(ap);
  596|       |
  597|   255k|	return result;
  598|   255k|}
vips_cast_float:
  750|  17.8k|{
  751|  17.8k|	va_list ap;
  752|  17.8k|	int result;
  753|       |
  754|  17.8k|	va_start(ap, out);
  755|  17.8k|	result = vips_castv(in, out, VIPS_FORMAT_FLOAT, ap);
  756|  17.8k|	va_end(ap);
  757|       |
  758|  17.8k|	return result;
  759|  17.8k|}
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|   253k|{
  462|   253k|	VipsConversion *conversion = VIPS_CONVERSION(object);
  ------------------
  |  |   40|   253k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   253k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   253k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|   253k|		VIPS_TYPE_CONVERSION, VipsConversion))
  ------------------
  463|   253k|	VipsCast *cast = (VipsCast *) object;
  464|   253k|	VipsImage **t = (VipsImage **)
  465|   253k|		vips_object_local_array(object, 2);
  466|       |
  467|   253k|	VipsImage *in;
  468|       |
  469|   253k|	if (VIPS_OBJECT_CLASS(vips_cast_parent_class)->build(object))
  ------------------
  |  |  435|   253k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|   253k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   253k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (469:6): [True: 0, False: 253k]
  ------------------
  470|      0|		return -1;
  471|       |
  472|   253k|	in = cast->in;
  473|       |
  474|       |	/* Trivial case: fall back to copy().
  475|       |	 */
  476|   253k|	if (in->BandFmt == cast->format)
  ------------------
  |  Branch (476:6): [True: 209k, False: 43.8k]
  ------------------
  477|   209k|		return vips_image_write(in, conversion->out);
  478|       |
  479|  43.8k|	if (vips_image_decode(in, &t[0]))
  ------------------
  |  Branch (479:6): [True: 0, False: 43.8k]
  ------------------
  480|      0|		return -1;
  481|  43.8k|	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|  43.8k|	if (cast->shift &&
  ------------------
  |  Branch (488:6): [True: 112, False: 43.7k]
  ------------------
  489|  43.8k|		!vips_band_format_isint(in->BandFmt) &&
  ------------------
  |  Branch (489:3): [True: 0, False: 112]
  ------------------
  490|  43.8k|		vips_band_format_isint(cast->format)) {
  ------------------
  |  Branch (490:3): [True: 0, False: 0]
  ------------------
  491|      0|		if (vips_cast(in, &t[1],
  ------------------
  |  Branch (491:7): [True: 0, False: 0]
  ------------------
  492|      0|				vips_image_guess_format(in), NULL))
  493|      0|			return -1;
  494|      0|		in = t[1];
  495|      0|	}
  496|       |
  497|  43.8k|	if (vips_image_pipelinev(conversion->out,
  ------------------
  |  Branch (497:6): [True: 0, False: 43.8k]
  ------------------
  498|  43.8k|			VIPS_DEMAND_STYLE_THINSTRIP, in, NULL))
  499|      0|		return -1;
  500|       |
  501|  43.8k|	conversion->out->BandFmt = cast->format;
  502|       |
  503|  43.8k|	if (vips_image_generate(conversion->out,
  ------------------
  |  Branch (503:6): [True: 0, False: 43.8k]
  ------------------
  504|  43.8k|			vips_start_one, vips_cast_gen, vips_stop_one,
  505|  43.8k|			in, cast))
  506|      0|		return -1;
  507|       |
  508|  43.8k|	return 0;
  509|  43.8k|}
cast.c:vips_cast_gen:
  360|  19.8k|{
  361|  19.8k|	VipsRegion *ir = (VipsRegion *) vseq;
  362|  19.8k|	VipsCast *cast = (VipsCast *) b;
  363|  19.8k|	VipsConversion *conversion = (VipsConversion *) b;
  364|  19.8k|	VipsRect *r = &out_region->valid;
  365|  19.8k|	int sz = VIPS_REGION_N_ELEMENTS(out_region);
  ------------------
  |  |  197|  19.8k|	((size_t) ((R)->valid.width * (R)->im->Bands))
  ------------------
  366|       |
  367|  19.8k|	int x, y;
  368|       |
  369|  19.8k|	if (vips_region_prepare(ir, r))
  ------------------
  |  Branch (369:6): [True: 2.06k, False: 17.7k]
  ------------------
  370|  2.06k|		return -1;
  371|       |
  372|  19.8k|	VIPS_GATE_START("vips_cast_gen: work");
  ------------------
  |  |   41|  17.7k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  17.7k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  17.7k|	{ \
  |  |   43|  17.7k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 17.7k]
  |  |  ------------------
  |  |   44|  17.7k|			vips__thread_gate_start(NAME); \
  |  |   45|  17.7k|	} \
  |  |   46|  19.8k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  19.8k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  373|       |
  374|   351k|	for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (374:14): [True: 334k, False: 17.7k]
  ------------------
  375|   334k|		VipsPel *in = VIPS_REGION_ADDR(ir, r->left, r->top + y);
  ------------------
  |  |  227|   334k|	((R)->data + \
  |  |  228|   334k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   334k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   334k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   334k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   334k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   334k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  376|   334k|		VipsPel *out = VIPS_REGION_ADDR(out_region, r->left, r->top + y);
  ------------------
  |  |  227|   334k|	((R)->data + \
  |  |  228|   334k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   334k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   334k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   334k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   334k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   334k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  377|       |
  378|   334k|		switch (ir->im->BandFmt) {
  379|   195k|		case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (379:3): [True: 195k, False: 138k]
  ------------------
  380|   195k|			BAND_SWITCH_INNER(unsigned char,
  ------------------
  |  |  310|   195k|	{ \
  |  |  311|   195k|		switch (conversion->out->BandFmt) { \
  |  |  312|      0|		case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (312:3): [True: 0, False: 195k]
  |  |  ------------------
  |  |  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: 195k]
  |  |  ------------------
  |  |  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: 195k]
  |  |  ------------------
  |  |  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: 195k]
  |  |  ------------------
  |  |  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: 195k]
  |  |  ------------------
  |  |  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: 195k]
  |  |  ------------------
  |  |  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|   195k|		case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (336:3): [True: 195k, False: 0]
  |  |  ------------------
  |  |  337|   195k|			FLOAT(ITYPE, float); \
  |  |  ------------------
  |  |  |  |  382|   195k|				CAST_REAL_FLOAT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  259|   195k|	{ \
  |  |  |  |  |  |  260|   195k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  261|   195k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  262|   195k|\
  |  |  |  |  |  |  263|  6.46M|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (263:15): [True: 6.26M, False: 195k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  264|  6.26M|			q[x] = p[x]; \
  |  |  |  |  |  |  265|   195k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  338|   195k|			break; \
  |  |  339|      0|\
  |  |  340|      0|		case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (340:3): [True: 0, False: 195k]
  |  |  ------------------
  |  |  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: 195k]
  |  |  ------------------
  |  |  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: 195k]
  |  |  ------------------
  |  |  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: 195k]
  |  |  ------------------
  |  |  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|   195k|		} \
  |  |  355|   195k|	}
  ------------------
  381|   195k|				INT_INT,
  382|   195k|				CAST_REAL_FLOAT,
  383|   195k|				CAST_REAL_COMPLEX);
  384|   195k|			break;
  385|       |
  386|  3.87k|		case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (386:3): [True: 3.87k, False: 330k]
  ------------------
  387|  3.87k|			BAND_SWITCH_INNER(signed char,
  ------------------
  |  |  310|  3.87k|	{ \
  |  |  311|  3.87k|		switch (conversion->out->BandFmt) { \
  |  |  312|  3.87k|		case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (312:3): [True: 3.87k, False: 0]
  |  |  ------------------
  |  |  313|  3.87k|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  ------------------
  |  |  |  |  388|  3.87k|				INT_INT_SIGNED,
  |  |  |  |  ------------------
  |  |  |  |  |  |  213|  3.87k|	{ \
  |  |  |  |  |  |  214|  3.87k|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (214:7): [True: 0, False: 3.87k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  215|  3.87k|			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.87k|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (218:12): [True: 0, False: 3.87k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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.87k|		else { \
  |  |  |  |  |  |  222|  3.87k|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|  3.87k|	{ \
  |  |  |  |  |  |  |  |  184|  3.87k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|  3.87k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|  3.87k|\
  |  |  |  |  |  |  |  |  187|   414k|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 410k, False: 3.87k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|   410k|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|   410k|\
  |  |  |  |  |  |  |  |  190|   410k|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  313|   410k|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  123|   410k|#define CAST_UCHAR(X) VIPS_CLIP(0, (X), UCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|   410k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|   821k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 104k, False: 306k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 410k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 306k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|   410k|		} \
  |  |  |  |  |  |  |  |  192|  3.87k|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|  3.87k|		} \
  |  |  |  |  |  |  224|  3.87k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  314|  3.87k|			break; \
  |  |  315|      0|\
  |  |  316|      0|		case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (316:3): [True: 0, False: 3.87k]
  |  |  ------------------
  |  |  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: 3.87k]
  |  |  ------------------
  |  |  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: 3.87k]
  |  |  ------------------
  |  |  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: 3.87k]
  |  |  ------------------
  |  |  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: 3.87k]
  |  |  ------------------
  |  |  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: 3.87k]
  |  |  ------------------
  |  |  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: 3.87k]
  |  |  ------------------
  |  |  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: 3.87k]
  |  |  ------------------
  |  |  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: 3.87k]
  |  |  ------------------
  |  |  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: 3.87k]
  |  |  ------------------
  |  |  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.87k|		} \
  |  |  355|  3.87k|	}
  ------------------
  388|  3.87k|				INT_INT_SIGNED,
  389|  3.87k|				CAST_REAL_FLOAT,
  390|  3.87k|				CAST_REAL_COMPLEX);
  391|  3.87k|			break;
  392|       |
  393|  2.27k|		case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (393:3): [True: 2.27k, False: 331k]
  ------------------
  394|  2.27k|			BAND_SWITCH_INNER(unsigned short,
  ------------------
  |  |  310|  2.27k|	{ \
  |  |  311|  2.27k|		switch (conversion->out->BandFmt) { \
  |  |  312|  2.27k|		case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (312:3): [True: 2.27k, False: 0]
  |  |  ------------------
  |  |  313|  2.27k|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  ------------------
  |  |  |  |  395|  2.27k|				INT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|  2.27k|	{ \
  |  |  |  |  |  |  198|  2.27k|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (198:7): [True: 0, False: 2.27k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  199|  2.27k|			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|  2.27k|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (202:12): [True: 0, False: 2.27k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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|  2.27k|		else { \
  |  |  |  |  |  |  206|  2.27k|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|  2.27k|	{ \
  |  |  |  |  |  |  |  |  184|  2.27k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|  2.27k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|  2.27k|\
  |  |  |  |  |  |  |  |  187|   259k|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 257k, False: 2.27k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|   257k|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|   257k|\
  |  |  |  |  |  |  |  |  190|   257k|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  313|   257k|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  123|   257k|#define CAST_UCHAR(X) VIPS_CLIP(0, (X), UCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|   257k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|   514k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 257k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 42.4k, False: 214k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 42.4k, False: 214k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|   257k|		} \
  |  |  |  |  |  |  |  |  192|  2.27k|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  207|  2.27k|		} \
  |  |  |  |  |  |  208|  2.27k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  314|  2.27k|			break; \
  |  |  315|      0|\
  |  |  316|      0|		case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (316:3): [True: 0, False: 2.27k]
  |  |  ------------------
  |  |  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: 2.27k]
  |  |  ------------------
  |  |  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: 2.27k]
  |  |  ------------------
  |  |  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: 2.27k]
  |  |  ------------------
  |  |  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: 2.27k]
  |  |  ------------------
  |  |  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: 2.27k]
  |  |  ------------------
  |  |  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: 2.27k]
  |  |  ------------------
  |  |  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: 2.27k]
  |  |  ------------------
  |  |  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: 2.27k]
  |  |  ------------------
  |  |  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: 2.27k]
  |  |  ------------------
  |  |  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.27k|		} \
  |  |  355|  2.27k|	}
  ------------------
  395|  2.27k|				INT_INT,
  396|  2.27k|				CAST_REAL_FLOAT,
  397|  2.27k|				CAST_REAL_COMPLEX);
  398|  2.27k|			break;
  399|       |
  400|  7.26k|		case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (400:3): [True: 7.26k, False: 326k]
  ------------------
  401|  7.26k|			BAND_SWITCH_INNER(signed short,
  ------------------
  |  |  310|  7.26k|	{ \
  |  |  311|  7.26k|		switch (conversion->out->BandFmt) { \
  |  |  312|  2.43k|		case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (312:3): [True: 2.43k, False: 4.83k]
  |  |  ------------------
  |  |  313|  2.43k|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  ------------------
  |  |  |  |  402|  2.43k|				INT_INT_SIGNED,
  |  |  |  |  ------------------
  |  |  |  |  |  |  213|  2.43k|	{ \
  |  |  |  |  |  |  214|  2.43k|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (214:7): [True: 0, False: 2.43k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  215|  2.43k|			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.43k|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (218:12): [True: 0, False: 2.43k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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.43k|		else { \
  |  |  |  |  |  |  222|  2.43k|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|  2.43k|	{ \
  |  |  |  |  |  |  |  |  184|  2.43k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|  2.43k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|  2.43k|\
  |  |  |  |  |  |  |  |  187|   289k|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 286k, False: 2.43k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|   286k|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|   286k|\
  |  |  |  |  |  |  |  |  190|   286k|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  313|   286k|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  123|   286k|#define CAST_UCHAR(X) VIPS_CLIP(0, (X), UCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|   286k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|   573k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 84.3k, False: 202k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 115k, False: 171k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 115k, False: 87.1k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|   286k|		} \
  |  |  |  |  |  |  |  |  192|  2.43k|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|  2.43k|		} \
  |  |  |  |  |  |  224|  2.43k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  314|  2.43k|			break; \
  |  |  315|      0|\
  |  |  316|      0|		case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (316:3): [True: 0, False: 7.26k]
  |  |  ------------------
  |  |  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|  1.24k|		case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (320:3): [True: 1.24k, False: 6.01k]
  |  |  ------------------
  |  |  321|  1.24k|			INT(ITYPE, unsigned short, int, CAST_USHORT); \
  |  |  ------------------
  |  |  |  |  402|  1.24k|				INT_INT_SIGNED,
  |  |  |  |  ------------------
  |  |  |  |  |  |  213|  1.24k|	{ \
  |  |  |  |  |  |  214|  1.24k|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (214:7): [True: 0, False: 1.24k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  215|  1.24k|			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|  1.24k|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (218:12): [True: 0, False: 1.24k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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.24k|		else { \
  |  |  |  |  |  |  222|  1.24k|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|  1.24k|	{ \
  |  |  |  |  |  |  |  |  184|  1.24k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|  1.24k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|  1.24k|\
  |  |  |  |  |  |  |  |  187|   121k|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 119k, False: 1.24k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|   119k|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|   119k|\
  |  |  |  |  |  |  |  |  190|   119k|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  321|   119k|			INT(ITYPE, unsigned short, int, CAST_USHORT); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  125|   119k|#define CAST_USHORT(X) VIPS_CLIP(0, (X), USHRT_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|   119k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|   239k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 39.7k, False: 80.0k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 119k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 80.0k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|   119k|		} \
  |  |  |  |  |  |  |  |  192|  1.24k|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|  1.24k|		} \
  |  |  |  |  |  |  224|  1.24k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  322|  1.24k|			break; \
  |  |  323|      0|\
  |  |  324|      0|		case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (324:3): [True: 0, False: 7.26k]
  |  |  ------------------
  |  |  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: 7.26k]
  |  |  ------------------
  |  |  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: 7.26k]
  |  |  ------------------
  |  |  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|  3.58k|		case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (336:3): [True: 3.58k, False: 3.68k]
  |  |  ------------------
  |  |  337|  3.58k|			FLOAT(ITYPE, float); \
  |  |  ------------------
  |  |  |  |  403|  3.58k|				CAST_REAL_FLOAT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  259|  3.58k|	{ \
  |  |  |  |  |  |  260|  3.58k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  261|  3.58k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  262|  3.58k|\
  |  |  |  |  |  |  263|   118k|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (263:15): [True: 114k, False: 3.58k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  264|   114k|			q[x] = p[x]; \
  |  |  |  |  |  |  265|  3.58k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  338|  3.58k|			break; \
  |  |  339|      0|\
  |  |  340|      0|		case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (340:3): [True: 0, False: 7.26k]
  |  |  ------------------
  |  |  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: 7.26k]
  |  |  ------------------
  |  |  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: 7.26k]
  |  |  ------------------
  |  |  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: 7.26k]
  |  |  ------------------
  |  |  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|  7.26k|		} \
  |  |  355|  7.26k|	}
  ------------------
  402|  7.26k|				INT_INT_SIGNED,
  403|  7.26k|				CAST_REAL_FLOAT,
  404|  7.26k|				CAST_REAL_COMPLEX);
  405|  7.26k|			break;
  406|       |
  407|  12.8k|		case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (407:3): [True: 12.8k, False: 321k]
  ------------------
  408|  12.8k|			BAND_SWITCH_INNER(unsigned int,
  ------------------
  |  |  310|  12.8k|	{ \
  |  |  311|  12.8k|		switch (conversion->out->BandFmt) { \
  |  |  312|  12.8k|		case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (312:3): [True: 12.8k, False: 32]
  |  |  ------------------
  |  |  313|  12.8k|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  ------------------
  |  |  |  |  409|  12.8k|				INT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|  12.8k|	{ \
  |  |  |  |  |  |  198|  12.8k|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (198:7): [True: 0, False: 12.8k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  199|  12.8k|			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|  12.8k|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (202:12): [True: 0, False: 12.8k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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|  12.8k|		else { \
  |  |  |  |  |  |  206|  12.8k|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|  12.8k|	{ \
  |  |  |  |  |  |  |  |  184|  12.8k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|  12.8k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|  12.8k|\
  |  |  |  |  |  |  |  |  187|  1.31M|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 1.30M, False: 12.8k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  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.60M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 157k, False: 1.14M]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 143k, False: 1.15M]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 143k, False: 1.00M]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|  1.30M|		} \
  |  |  |  |  |  |  |  |  192|  12.8k|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  207|  12.8k|		} \
  |  |  |  |  |  |  208|  12.8k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  314|  12.8k|			break; \
  |  |  315|      0|\
  |  |  316|      0|		case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (316:3): [True: 0, False: 12.8k]
  |  |  ------------------
  |  |  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: 12.8k]
  |  |  ------------------
  |  |  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: 12.8k]
  |  |  ------------------
  |  |  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: 12.8k]
  |  |  ------------------
  |  |  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: 12.8k]
  |  |  ------------------
  |  |  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|     32|		case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (336:3): [True: 32, False: 12.8k]
  |  |  ------------------
  |  |  337|     32|			FLOAT(ITYPE, float); \
  |  |  ------------------
  |  |  |  |  410|     32|				CAST_REAL_FLOAT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  259|     32|	{ \
  |  |  |  |  |  |  260|     32|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  261|     32|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  262|     32|\
  |  |  |  |  |  |  263|  3.10k|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (263:15): [True: 3.07k, False: 32]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  264|  3.07k|			q[x] = p[x]; \
  |  |  |  |  |  |  265|     32|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  338|     32|			break; \
  |  |  339|      0|\
  |  |  340|      0|		case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (340:3): [True: 0, False: 12.8k]
  |  |  ------------------
  |  |  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: 12.8k]
  |  |  ------------------
  |  |  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: 12.8k]
  |  |  ------------------
  |  |  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: 12.8k]
  |  |  ------------------
  |  |  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|  12.8k|		} \
  |  |  355|  12.8k|	}
  ------------------
  409|  12.8k|				INT_INT,
  410|  12.8k|				CAST_REAL_FLOAT,
  411|  12.8k|				CAST_REAL_COMPLEX);
  412|  12.8k|			break;
  413|       |
  414|  4.09k|		case VIPS_FORMAT_INT:
  ------------------
  |  Branch (414:3): [True: 4.09k, False: 329k]
  ------------------
  415|  4.09k|			BAND_SWITCH_INNER(signed int,
  ------------------
  |  |  310|  4.09k|	{ \
  |  |  311|  4.09k|		switch (conversion->out->BandFmt) { \
  |  |  312|  4.09k|		case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (312:3): [True: 4.09k, False: 0]
  |  |  ------------------
  |  |  313|  4.09k|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  ------------------
  |  |  |  |  416|  4.09k|				INT_INT_SIGNED,
  |  |  |  |  ------------------
  |  |  |  |  |  |  213|  4.09k|	{ \
  |  |  |  |  |  |  214|  4.09k|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (214:7): [True: 0, False: 4.09k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  215|  4.09k|			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|  4.09k|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (218:12): [True: 0, False: 4.09k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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|  4.09k|		else { \
  |  |  |  |  |  |  222|  4.09k|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|  4.09k|	{ \
  |  |  |  |  |  |  |  |  184|  4.09k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|  4.09k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|  4.09k|\
  |  |  |  |  |  |  |  |  187|   467k|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 463k, False: 4.09k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|   463k|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|   463k|\
  |  |  |  |  |  |  |  |  190|   463k|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  313|   463k|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  123|   463k|#define CAST_UCHAR(X) VIPS_CLIP(0, (X), UCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|   463k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|   927k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 130k, False: 333k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 166k, False: 297k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 166k, False: 166k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|   463k|		} \
  |  |  |  |  |  |  |  |  192|  4.09k|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|  4.09k|		} \
  |  |  |  |  |  |  224|  4.09k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  314|  4.09k|			break; \
  |  |  315|      0|\
  |  |  316|      0|		case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (316:3): [True: 0, False: 4.09k]
  |  |  ------------------
  |  |  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: 4.09k]
  |  |  ------------------
  |  |  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: 4.09k]
  |  |  ------------------
  |  |  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: 4.09k]
  |  |  ------------------
  |  |  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: 4.09k]
  |  |  ------------------
  |  |  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: 4.09k]
  |  |  ------------------
  |  |  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: 4.09k]
  |  |  ------------------
  |  |  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: 4.09k]
  |  |  ------------------
  |  |  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: 4.09k]
  |  |  ------------------
  |  |  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: 4.09k]
  |  |  ------------------
  |  |  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|  4.09k|		} \
  |  |  355|  4.09k|	}
  ------------------
  416|  4.09k|				INT_INT_SIGNED,
  417|  4.09k|				CAST_REAL_FLOAT,
  418|  4.09k|				CAST_REAL_COMPLEX);
  419|  4.09k|			break;
  420|       |
  421|   107k|		case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (421:3): [True: 107k, False: 226k]
  ------------------
  422|   107k|			BAND_SWITCH_INNER(float,
  ------------------
  |  |  310|   107k|	{ \
  |  |  311|   107k|		switch (conversion->out->BandFmt) { \
  |  |  312|  64.1k|		case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (312:3): [True: 64.1k, False: 43.5k]
  |  |  ------------------
  |  |  313|  64.1k|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  ------------------
  |  |  |  |  423|  64.1k|				CAST_FLOAT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  232|  64.1k|	{ \
  |  |  |  |  |  |  233|  64.1k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  234|  64.1k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  235|  64.1k|\
  |  |  |  |  |  |  236|  8.00M|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (236:15): [True: 7.94M, False: 64.1k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  237|  7.94M|			q[x] = CAST((double) p[x]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  313|  64.1k|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  123|  64.1k|#define CAST_UCHAR(X) VIPS_CLIP(0, (X), UCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|  7.94M|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|  15.8M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 467k, False: 7.47M]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 402k, False: 7.54M]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 402k, False: 7.07M]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  238|  64.1k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  314|  64.1k|			break; \
  |  |  315|      0|\
  |  |  316|  7.77k|		case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (316:3): [True: 7.77k, False: 99.9k]
  |  |  ------------------
  |  |  317|  7.77k|			INT(ITYPE, signed char, int, CAST_CHAR); \
  |  |  ------------------
  |  |  |  |  423|  7.77k|				CAST_FLOAT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  232|  7.77k|	{ \
  |  |  |  |  |  |  233|  7.77k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  234|  7.77k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  235|  7.77k|\
  |  |  |  |  |  |  236|  1.09M|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (236:15): [True: 1.08M, False: 7.77k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  237|  1.08M|			q[x] = CAST((double) p[x]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|  7.77k|			INT(ITYPE, signed char, int, CAST_CHAR); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  124|  7.77k|#define CAST_CHAR(X) VIPS_CLIP(SCHAR_MIN, (X), SCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|  1.08M|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|  2.16M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 23.1k, False: 1.05M]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 111k, False: 971k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 111k, False: 948k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  238|  7.77k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  318|  7.77k|			break; \
  |  |  319|      0|\
  |  |  320|  11.5k|		case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (320:3): [True: 11.5k, False: 96.1k]
  |  |  ------------------
  |  |  321|  11.5k|			INT(ITYPE, unsigned short, int, CAST_USHORT); \
  |  |  ------------------
  |  |  |  |  423|  11.5k|				CAST_FLOAT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  232|  11.5k|	{ \
  |  |  |  |  |  |  233|  11.5k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  234|  11.5k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  235|  11.5k|\
  |  |  |  |  |  |  236|  1.50M|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (236:15): [True: 1.49M, False: 11.5k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  237|  1.49M|			q[x] = CAST((double) p[x]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  321|  11.5k|			INT(ITYPE, unsigned short, int, CAST_USHORT); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  125|  11.5k|#define CAST_USHORT(X) VIPS_CLIP(0, (X), USHRT_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|  1.49M|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|  2.99M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 142k, False: 1.35M]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 12.2k, False: 1.48M]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 12.2k, False: 1.34M]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  238|  11.5k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  322|  11.5k|			break; \
  |  |  323|      0|\
  |  |  324|  8.25k|		case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (324:3): [True: 8.25k, False: 99.4k]
  |  |  ------------------
  |  |  325|  8.25k|			INT(ITYPE, signed short, int, CAST_SHORT); \
  |  |  ------------------
  |  |  |  |  423|  8.25k|				CAST_FLOAT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  232|  8.25k|	{ \
  |  |  |  |  |  |  233|  8.25k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  234|  8.25k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  235|  8.25k|\
  |  |  |  |  |  |  236|  1.08M|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (236:15): [True: 1.07M, False: 8.25k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  237|  1.07M|			q[x] = CAST((double) p[x]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  325|  8.25k|			INT(ITYPE, signed short, int, CAST_SHORT); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  126|  8.25k|#define CAST_SHORT(X) VIPS_CLIP(SHRT_MIN, (X), SHRT_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|  1.07M|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|  2.15M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 4.32k, False: 1.07M]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 9.94k, False: 1.06M]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 9.94k, False: 1.06M]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  238|  8.25k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  326|  8.25k|			break; \
  |  |  327|      0|\
  |  |  328|  7.48k|		case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (328:3): [True: 7.48k, False: 100k]
  |  |  ------------------
  |  |  329|  7.48k|			INT(ITYPE, unsigned int, gint64, CAST_UINT); \
  |  |  ------------------
  |  |  |  |  423|  7.48k|				CAST_FLOAT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  232|  7.48k|	{ \
  |  |  |  |  |  |  233|  7.48k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  234|  7.48k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  235|  7.48k|\
  |  |  |  |  |  |  236|   867k|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (236:15): [True: 859k, False: 7.48k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  237|   859k|			q[x] = CAST((double) p[x]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  329|  7.48k|			INT(ITYPE, unsigned int, gint64, CAST_UINT); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  130|  7.48k|#define CAST_UINT(X) VIPS_CLIP(0, (X), UINT_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|   859k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|  1.71M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 859k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 3.67k, False: 856k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 3.67k, False: 856k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  238|  7.48k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  330|  7.48k|			break; \
  |  |  331|      0|\
  |  |  332|  8.45k|		case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (332:3): [True: 8.45k, False: 99.2k]
  |  |  ------------------
  |  |  333|  8.45k|			INT(ITYPE, signed int, gint64, CAST_INT); \
  |  |  ------------------
  |  |  |  |  423|  8.45k|				CAST_FLOAT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  232|  8.45k|	{ \
  |  |  |  |  |  |  233|  8.45k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  234|  8.45k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  235|  8.45k|\
  |  |  |  |  |  |  236|   992k|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (236:15): [True: 984k, False: 8.45k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  237|   984k|			q[x] = CAST((double) p[x]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  333|  8.45k|			INT(ITYPE, signed int, gint64, CAST_INT); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  131|  8.45k|#define CAST_INT(X) VIPS_CLIP(INT_MIN, (X), INT_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|   984k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|  1.96M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 2.67k, False: 981k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 3.39k, False: 980k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 3.39k, False: 978k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  238|  8.45k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  334|  8.45k|			break; \
  |  |  335|      0|\
  |  |  336|      0|		case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (336:3): [True: 0, False: 107k]
  |  |  ------------------
  |  |  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: 107k]
  |  |  ------------------
  |  |  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: 107k]
  |  |  ------------------
  |  |  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: 107k]
  |  |  ------------------
  |  |  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: 107k]
  |  |  ------------------
  |  |  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|   107k|		} \
  |  |  355|   107k|	}
  ------------------
  423|   107k|				CAST_FLOAT_INT,
  424|   107k|				CAST_REAL_FLOAT,
  425|   107k|				CAST_REAL_COMPLEX);
  426|   107k|			break;
  427|       |
  428|      0|		case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (428:3): [True: 0, False: 334k]
  ------------------
  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: 334k]
  ------------------
  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: 334k]
  ------------------
  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: 334k]
  ------------------
  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|   334k|		}
  452|   334k|	}
  453|       |
  454|  17.7k|	VIPS_GATE_STOP("vips_cast_gen: work");
  ------------------
  |  |   49|  17.7k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  17.7k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  17.7k|	{ \
  |  |   51|  17.7k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 17.7k]
  |  |  ------------------
  |  |   52|  17.7k|			vips__thread_gate_stop(NAME); \
  |  |   53|  17.7k|	} \
  |  |   54|  17.7k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  17.7k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  455|       |
  456|  17.7k|	return 0;
  457|  17.7k|}
cast.c:vips_cast_init:
  552|   272k|{
  553|   272k|}
cast.c:vips_castv:
  557|   272k|{
  558|   272k|	return vips_call_split("cast", ap, in, out, format);
  559|   272k|}

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|  1.69M|{
  316|  1.69M|	VipsConversion *conversion = VIPS_CONVERSION(object);
  ------------------
  |  |   40|  1.69M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  1.69M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.69M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  1.69M|		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|  1.69M|	g_object_set(conversion, "out", vips_image_new(), NULL);
  325|       |
  326|  1.69M|	if (VIPS_OBJECT_CLASS(vips_conversion_parent_class)->build(object))
  ------------------
  |  |  435|  1.69M|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  1.69M|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  1.69M|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (326:6): [True: 0, False: 1.69M]
  ------------------
  327|      0|		return -1;
  328|       |
  329|  1.69M|	return 0;
  330|  1.69M|}
conversion.c:vips_conversion_init:
  354|  1.74M|{
  355|  1.74M|}

vips_copy:
  395|  1.04M|{
  396|  1.04M|	va_list ap;
  397|  1.04M|	int result;
  398|       |
  399|  1.04M|	va_start(ap, out);
  400|  1.04M|	result = vips_call_split("copy", ap, in, out);
  401|  1.04M|	va_end(ap);
  402|       |
  403|  1.04M|	return result;
  404|  1.04M|}
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|  1.04M|{
  165|  1.04M|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  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))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  166|  1.04M|	VipsConversion *conversion = VIPS_CONVERSION(object);
  ------------------
  |  |   40|  1.04M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  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)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  1.04M|		VIPS_TYPE_CONVERSION, VipsConversion))
  ------------------
  167|  1.04M|	VipsCopy *copy = (VipsCopy *) object;
  168|       |
  169|  1.04M|	guint64 pel_size_before;
  170|  1.04M|	guint64 pel_size_after;
  171|  1.04M|	VipsImage copy_of_fields;
  172|  1.04M|	int i;
  173|       |
  174|  1.04M|	if (VIPS_OBJECT_CLASS(vips_copy_parent_class)->build(object))
  ------------------
  |  |  435|  1.04M|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  1.04M|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  1.04M|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (174:6): [True: 0, False: 1.04M]
  ------------------
  175|      0|		return -1;
  176|       |
  177|  1.04M|	if (vips_image_pio_input(copy->in))
  ------------------
  |  Branch (177:6): [True: 0, False: 1.04M]
  ------------------
  178|      0|		return -1;
  179|       |
  180|  1.04M|	if (copy->swap)
  ------------------
  |  Branch (180:6): [True: 0, False: 1.04M]
  ------------------
  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|  1.04M|			_("copy swap is deprecated, use byteswap instead"));
  183|       |
  184|  1.04M|	if (vips_image_pipelinev(conversion->out,
  ------------------
  |  Branch (184:6): [True: 0, False: 1.04M]
  ------------------
  185|  1.04M|			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|  1.04M|	copy_of_fields = *conversion->out;
  192|       |
  193|       |	/* Use props to adjust header fields.
  194|       |	 */
  195|  11.4M|	for (i = 0; i < VIPS_NUMBER(vips_copy_names); i++) {
  ------------------
  |  |   60|  11.4M|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (195:14): [True: 10.4M, False: 1.04M]
  ------------------
  196|  10.4M|		const char *name = vips_copy_names[i];
  197|       |
  198|  10.4M|		GParamSpec *pspec;
  199|  10.4M|		VipsArgumentClass *argument_class;
  200|  10.4M|		VipsArgumentInstance *argument_instance;
  201|       |
  202|  10.4M|		if (vips_object_get_argument(object, name,
  ------------------
  |  Branch (202:7): [True: 0, False: 10.4M]
  ------------------
  203|  10.4M|				&pspec, &argument_class, &argument_instance))
  204|      0|			return -1;
  205|       |
  206|  10.4M|		if (argument_instance->assigned) {
  ------------------
  |  Branch (206:7): [True: 95.3k, False: 10.3M]
  ------------------
  207|  95.3k|			GType type = G_PARAM_SPEC_VALUE_TYPE(pspec);
  ------------------
  |  |  103|  95.3k|#define	G_PARAM_SPEC_VALUE_TYPE(pspec)	(G_PARAM_SPEC (pspec)->value_type)
  |  |  ------------------
  |  |  |  |   45|  95.3k|#define G_PARAM_SPEC(pspec)		(G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM, GParamSpec))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|  95.3k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|  95.3k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  208|  95.3k|			GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|  95.3k|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
  209|       |
  210|  95.3k|			g_value_init(&value, type);
  211|  95.3k|			g_object_get_property(G_OBJECT(object),
  ------------------
  |  |   51|  95.3k|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|  95.3k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  95.3k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  212|  95.3k|				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|  95.3k|			g_object_set_property(G_OBJECT(conversion->out),
  ------------------
  |  |   51|  95.3k|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|  95.3k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  95.3k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  225|  95.3k|				name, &value);
  226|  95.3k|			g_value_unset(&value);
  227|  95.3k|		}
  228|  10.4M|	}
  229|       |
  230|       |	/* Disallow changes which alter sizeof(pel).
  231|       |	 */
  232|  1.04M|	pel_size_before = VIPS_IMAGE_SIZEOF_PEL(&copy_of_fields);
  ------------------
  |  |  384|  1.04M|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|  1.04M|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  233|  1.04M|	pel_size_after = VIPS_IMAGE_SIZEOF_PEL(conversion->out);
  ------------------
  |  |  384|  1.04M|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|  1.04M|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  234|  1.04M|	if (pel_size_after != pel_size_before) {
  ------------------
  |  Branch (234:6): [True: 0, False: 1.04M]
  ------------------
  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|  1.04M|	if (vips_image_generate(conversion->out,
  ------------------
  |  Branch (240:6): [True: 0, False: 1.04M]
  ------------------
  241|  1.04M|			vips_start_one, vips_copy_gen, vips_stop_one,
  242|  1.04M|			copy->in, copy))
  243|      0|		return -1;
  244|       |
  245|  1.04M|	return 0;
  246|  1.04M|}
copy.c:vips_copy_gen:
  136|   545k|{
  137|   545k|	VipsRegion *ir = (VipsRegion *) seq;
  138|   545k|	VipsRect *r = &out_region->valid;
  139|       |
  140|   545k|	if (vips_region_prepare(ir, r) ||
  ------------------
  |  Branch (140:6): [True: 133k, False: 411k]
  ------------------
  141|   545k|		vips_region_region(out_region, ir, r, r->left, r->top))
  ------------------
  |  Branch (141:3): [True: 0, False: 411k]
  ------------------
  142|   133k|		return -1;
  143|       |
  144|   411k|	return 0;
  145|   545k|}
copy.c:vips_copy_init:
  357|  1.04M|{
  358|       |	/* Init our instance fields.
  359|       |	 */
  360|  1.04M|}

vips_embed:
  703|   105k|{
  704|   105k|	va_list ap;
  705|   105k|	int result;
  706|       |
  707|   105k|	va_start(ap, height);
  708|   105k|	result = vips_call_split("embed", ap, in, out, x, y, width, height);
  709|   105k|	va_end(ap);
  710|       |
  711|   105k|	return result;
  712|   105k|}
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_base_build:
  353|   105k|{
  354|   105k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|   105k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|   105k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|   105k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  355|   105k|	VipsConversion *conversion = VIPS_CONVERSION(object);
  ------------------
  |  |   40|   105k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   105k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   105k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|   105k|		VIPS_TYPE_CONVERSION, VipsConversion))
  ------------------
  356|   105k|	VipsEmbedBase *base = (VipsEmbedBase *) object;
  357|   105k|	VipsImage **t = (VipsImage **) vips_object_local_array(object, 7);
  358|       |
  359|   105k|	VipsRect want;
  360|       |
  361|   105k|	if (VIPS_OBJECT_CLASS(vips_embed_base_parent_class)->build(object))
  ------------------
  |  |  435|   105k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|   105k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   105k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (361:6): [True: 0, False: 105k]
  ------------------
  362|      0|		return -1;
  363|       |
  364|       |	/* nip2 can generate this quite often ... just copy.
  365|       |	 */
  366|   105k|	if (base->x == 0 &&
  ------------------
  |  Branch (366:6): [True: 51.2k, False: 54.1k]
  ------------------
  367|   105k|		base->y == 0 &&
  ------------------
  |  Branch (367:3): [True: 19.0k, False: 32.1k]
  ------------------
  368|   105k|		base->width == base->in->Xsize &&
  ------------------
  |  Branch (368:3): [True: 0, False: 19.0k]
  ------------------
  369|   105k|		base->height == base->in->Ysize)
  ------------------
  |  Branch (369:3): [True: 0, False: 0]
  ------------------
  370|      0|		return vips_image_write(base->in, conversion->out);
  371|       |
  372|   105k|	if (!vips_object_argument_isset(object, "extend") &&
  ------------------
  |  Branch (372:6): [True: 0, False: 105k]
  ------------------
  373|   105k|		vips_object_argument_isset(object, "background"))
  ------------------
  |  Branch (373:3): [True: 0, False: 0]
  ------------------
  374|      0|		base->extend = VIPS_EXTEND_BACKGROUND; // FIXME: Invalidates operation cache
  375|       |
  376|   105k|	if (base->extend == VIPS_EXTEND_BACKGROUND)
  ------------------
  |  Branch (376:6): [True: 0, False: 105k]
  ------------------
  377|      0|		if (!(base->ink = vips__vector_to_ink(
  ------------------
  |  Branch (377:7): [True: 0, False: 0]
  ------------------
  378|      0|				  class->nickname, base->in,
  379|      0|				  VIPS_AREA(base->background)->data, NULL,
  ------------------
  |  |  137|      0|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  380|      0|				  VIPS_AREA(base->background)->n)))
  ------------------
  |  |  137|      0|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  381|      0|			return -1;
  382|       |
  383|   105k|	switch (base->extend) {
  384|      0|	case VIPS_EXTEND_REPEAT: {
  ------------------
  |  Branch (384:2): [True: 0, False: 105k]
  ------------------
  385|       |		/* Clock arithmetic: we want negative x/y to wrap around
  386|       |		 * nicely.
  387|       |		 */
  388|      0|		const int nx = base->x < 0
  ------------------
  |  Branch (388:18): [True: 0, False: 0]
  ------------------
  389|      0|			? -base->x % base->in->Xsize
  390|      0|			: base->in->Xsize - base->x % base->in->Xsize;
  391|      0|		const int ny = base->y < 0
  ------------------
  |  Branch (391:18): [True: 0, False: 0]
  ------------------
  392|      0|			? -base->y % base->in->Ysize
  393|      0|			: base->in->Ysize - base->y % base->in->Ysize;
  394|       |
  395|      0|		if (vips_replicate(base->in, &t[0],
  ------------------
  |  Branch (395:7): [True: 0, False: 0]
  ------------------
  396|      0|				base->width / base->in->Xsize + 2,
  397|      0|				base->height / base->in->Ysize + 2, NULL) ||
  398|      0|			vips_extract_area(t[0], &t[1],
  ------------------
  |  Branch (398:4): [True: 0, False: 0]
  ------------------
  399|      0|				nx, ny, base->width, base->height, NULL) ||
  400|      0|			vips_image_write(t[1], conversion->out))
  ------------------
  |  Branch (400:4): [True: 0, False: 0]
  ------------------
  401|      0|			return -1;
  402|      0|	} break;
  403|       |
  404|      0|	case VIPS_EXTEND_MIRROR: {
  ------------------
  |  Branch (404:2): [True: 0, False: 105k]
  ------------------
  405|       |		/* As repeat, but the tiles are twice the size because of
  406|       |		 * mirroring.
  407|       |		 */
  408|      0|		const int w2 = base->in->Xsize * 2;
  409|      0|		const int h2 = base->in->Ysize * 2;
  410|       |
  411|      0|		const int nx = base->x < 0 ? -base->x % w2 : w2 - base->x % w2;
  ------------------
  |  Branch (411:18): [True: 0, False: 0]
  ------------------
  412|      0|		const int ny = base->y < 0 ? -base->y % h2 : h2 - base->y % h2;
  ------------------
  |  Branch (412:18): [True: 0, False: 0]
  ------------------
  413|       |
  414|      0|		if (
  415|       |			/* Make a 2x2 mirror tile.
  416|       |			 */
  417|      0|			vips_flip(base->in, &t[0],
  ------------------
  |  Branch (417:4): [True: 0, False: 0]
  ------------------
  418|      0|				VIPS_DIRECTION_HORIZONTAL, NULL) ||
  419|      0|			vips_join(base->in, t[0], &t[1],
  ------------------
  |  Branch (419:4): [True: 0, False: 0]
  ------------------
  420|      0|				VIPS_DIRECTION_HORIZONTAL, NULL) ||
  421|      0|			vips_flip(t[1], &t[2],
  ------------------
  |  Branch (421:4): [True: 0, False: 0]
  ------------------
  422|      0|				VIPS_DIRECTION_VERTICAL, NULL) ||
  423|      0|			vips_join(t[1], t[2], &t[3],
  ------------------
  |  Branch (423:4): [True: 0, False: 0]
  ------------------
  424|      0|				VIPS_DIRECTION_VERTICAL, NULL) ||
  425|       |
  426|       |			/* Repeat, then cut out the centre.
  427|       |			 */
  428|      0|			vips_replicate(t[3], &t[4],
  ------------------
  |  Branch (428:4): [True: 0, False: 0]
  ------------------
  429|      0|				base->width / t[3]->Xsize + 2,
  430|      0|				base->height / t[3]->Ysize + 2, NULL) ||
  431|      0|			vips_extract_area(t[4], &t[5],
  ------------------
  |  Branch (431:4): [True: 0, False: 0]
  ------------------
  432|      0|				nx, ny, base->width, base->height, NULL) ||
  433|       |
  434|       |			/* Overwrite the centre with the in, much faster
  435|       |			 * for centre pixels.
  436|       |			 */
  437|      0|			vips_insert(t[5], base->in, &t[6],
  ------------------
  |  Branch (437:4): [True: 0, False: 0]
  ------------------
  438|      0|				base->x, base->y, NULL) ||
  439|       |
  440|      0|			vips_image_write(t[6], conversion->out))
  ------------------
  |  Branch (440:4): [True: 0, False: 0]
  ------------------
  441|      0|			return -1;
  442|      0|	} break;
  443|       |
  444|      0|	case VIPS_EXTEND_BLACK:
  ------------------
  |  Branch (444:2): [True: 0, False: 105k]
  ------------------
  445|      0|	case VIPS_EXTEND_WHITE:
  ------------------
  |  Branch (445:2): [True: 0, False: 105k]
  ------------------
  446|      0|	case VIPS_EXTEND_BACKGROUND:
  ------------------
  |  Branch (446:2): [True: 0, False: 105k]
  ------------------
  447|   105k|	case VIPS_EXTEND_COPY:
  ------------------
  |  Branch (447:2): [True: 105k, False: 0]
  ------------------
  448|       |		/* embed is used in many places. We don't really care about
  449|       |		 * geometry, so use ANY to avoid disturbing all pipelines.
  450|       |		 */
  451|   105k|		if (vips_image_pipelinev(conversion->out,
  ------------------
  |  Branch (451:7): [True: 0, False: 105k]
  ------------------
  452|   105k|				VIPS_DEMAND_STYLE_ANY, base->in, NULL))
  453|      0|			return -1;
  454|       |
  455|   105k|		conversion->out->Xsize = base->width;
  456|   105k|		conversion->out->Ysize = base->height;
  457|       |
  458|       |		/* Whole output area.
  459|       |		 */
  460|   105k|		base->rout.left = 0;
  461|   105k|		base->rout.top = 0;
  462|   105k|		base->rout.width = conversion->out->Xsize;
  463|   105k|		base->rout.height = conversion->out->Ysize;
  464|       |
  465|       |		/* Rect occupied by image (can be clipped to nothing).
  466|       |		 */
  467|   105k|		want.left = base->x;
  468|   105k|		want.top = base->y;
  469|   105k|		want.width = base->in->Xsize;
  470|   105k|		want.height = base->in->Ysize;
  471|   105k|		vips_rect_intersectrect(&want, &base->rout, &base->rsub);
  472|       |
  473|       |		/* FIXME ... actually, it can't. base_find_edge() will fail
  474|       |		 * if rsub is empty. Make this more general at some point
  475|       |		 * and remove this test.
  476|       |		 */
  477|   105k|		if (vips_rect_isempty(&base->rsub)) {
  ------------------
  |  Branch (477:7): [True: 0, False: 105k]
  ------------------
  478|      0|			vips_error(class->nickname,
  479|      0|				"%s", _("bad dimensions"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  480|      0|			return -1;
  481|      0|		}
  482|       |
  483|       |		/* Edge rects of new pixels ... top, right, bottom, left. Order
  484|       |		 * important. Can be empty.
  485|       |		 */
  486|   105k|		base->border[0].left = base->rsub.left;
  487|   105k|		base->border[0].top = 0;
  488|   105k|		base->border[0].width = base->rsub.width;
  489|   105k|		base->border[0].height = base->rsub.top;
  490|       |
  491|   105k|		base->border[1].left = VIPS_RECT_RIGHT(&base->rsub);
  ------------------
  |  |   48|   105k|#define VIPS_RECT_RIGHT(R) ((R)->left + (R)->width)
  ------------------
  492|   105k|		base->border[1].top = base->rsub.top;
  493|   105k|		base->border[1].width = conversion->out->Xsize -
  494|   105k|			VIPS_RECT_RIGHT(&base->rsub);
  ------------------
  |  |   48|   105k|#define VIPS_RECT_RIGHT(R) ((R)->left + (R)->width)
  ------------------
  495|   105k|		base->border[1].height = base->rsub.height;
  496|       |
  497|   105k|		base->border[2].left = base->rsub.left;
  498|   105k|		base->border[2].top = VIPS_RECT_BOTTOM(&base->rsub);
  ------------------
  |  |   49|   105k|#define VIPS_RECT_BOTTOM(R) ((R)->top + (R)->height)
  ------------------
  499|   105k|		base->border[2].width = base->rsub.width;
  500|   105k|		base->border[2].height = conversion->out->Ysize -
  501|   105k|			VIPS_RECT_BOTTOM(&base->rsub);
  ------------------
  |  |   49|   105k|#define VIPS_RECT_BOTTOM(R) ((R)->top + (R)->height)
  ------------------
  502|       |
  503|   105k|		base->border[3].left = 0;
  504|   105k|		base->border[3].top = base->rsub.top;
  505|   105k|		base->border[3].width = base->rsub.left;
  506|   105k|		base->border[3].height = base->rsub.height;
  507|       |
  508|       |		/* Corner rects. Top-left, top-right, bottom-right,
  509|       |		 * bottom-left. Order important.
  510|       |		 */
  511|   105k|		base->border[4].left = 0;
  512|   105k|		base->border[4].top = 0;
  513|   105k|		base->border[4].width = base->rsub.left;
  514|   105k|		base->border[4].height = base->rsub.top;
  515|       |
  516|   105k|		base->border[5].left = VIPS_RECT_RIGHT(&base->rsub);
  ------------------
  |  |   48|   105k|#define VIPS_RECT_RIGHT(R) ((R)->left + (R)->width)
  ------------------
  517|   105k|		base->border[5].top = 0;
  518|   105k|		base->border[5].width = conversion->out->Xsize -
  519|   105k|			VIPS_RECT_RIGHT(&base->rsub);
  ------------------
  |  |   48|   105k|#define VIPS_RECT_RIGHT(R) ((R)->left + (R)->width)
  ------------------
  520|   105k|		base->border[5].height = base->rsub.top;
  521|       |
  522|   105k|		base->border[6].left = VIPS_RECT_RIGHT(&base->rsub);
  ------------------
  |  |   48|   105k|#define VIPS_RECT_RIGHT(R) ((R)->left + (R)->width)
  ------------------
  523|   105k|		base->border[6].top = VIPS_RECT_BOTTOM(&base->rsub);
  ------------------
  |  |   49|   105k|#define VIPS_RECT_BOTTOM(R) ((R)->top + (R)->height)
  ------------------
  524|   105k|		base->border[6].width = conversion->out->Xsize -
  525|   105k|			VIPS_RECT_RIGHT(&base->rsub);
  ------------------
  |  |   48|   105k|#define VIPS_RECT_RIGHT(R) ((R)->left + (R)->width)
  ------------------
  526|   105k|		base->border[6].height = conversion->out->Ysize -
  527|   105k|			VIPS_RECT_BOTTOM(&base->rsub);
  ------------------
  |  |   49|   105k|#define VIPS_RECT_BOTTOM(R) ((R)->top + (R)->height)
  ------------------
  528|       |
  529|   105k|		base->border[7].left = 0;
  530|   105k|		base->border[7].top = VIPS_RECT_BOTTOM(&base->rsub);
  ------------------
  |  |   49|   105k|#define VIPS_RECT_BOTTOM(R) ((R)->top + (R)->height)
  ------------------
  531|   105k|		base->border[7].width = base->rsub.left;
  532|   105k|		base->border[7].height = conversion->out->Ysize -
  533|   105k|			VIPS_RECT_BOTTOM(&base->rsub);
  ------------------
  |  |   49|   105k|#define VIPS_RECT_BOTTOM(R) ((R)->top + (R)->height)
  ------------------
  534|       |
  535|   105k|		if (vips_image_generate(conversion->out,
  ------------------
  |  Branch (535:7): [True: 0, False: 105k]
  ------------------
  536|   105k|				vips_start_one, vips_embed_base_gen, vips_stop_one,
  537|   105k|				base->in, base))
  538|      0|			return -1;
  539|       |
  540|   105k|		break;
  541|       |
  542|   105k|	default:
  ------------------
  |  Branch (542:2): [True: 0, False: 105k]
  ------------------
  543|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  544|   105k|	}
  545|       |
  546|   105k|	return 0;
  547|   105k|}
embed.c:vips_embed_base_gen:
  230|  92.4k|{
  231|  92.4k|	VipsRegion *ir = (VipsRegion *) seq;
  232|  92.4k|	VipsEmbedBase *base = (VipsEmbedBase *) b;
  233|  92.4k|	VipsRect *r = &out_region->valid;
  234|       |
  235|  92.4k|	VipsRect ovl;
  236|  92.4k|	int i;
  237|  92.4k|	VipsPel *p;
  238|  92.4k|	int plsk;
  239|  92.4k|	int ink;
  240|       |
  241|       |	/* Entirely within the input image? Generate the subimage and copy
  242|       |	 * pointers.
  243|       |	 */
  244|  92.4k|	if (vips_rect_includesrect(&base->rsub, r)) {
  ------------------
  |  Branch (244:6): [True: 0, False: 92.4k]
  ------------------
  245|      0|		VipsRect need;
  246|       |
  247|      0|		need = *r;
  248|      0|		need.left -= base->x;
  249|      0|		need.top -= base->y;
  250|      0|		if (vips_region_prepare(ir, &need) ||
  ------------------
  |  Branch (250:7): [True: 0, False: 0]
  ------------------
  251|      0|			vips_region_region(out_region, ir, r, need.left, need.top))
  ------------------
  |  Branch (251:4): [True: 0, False: 0]
  ------------------
  252|      0|			return -1;
  253|       |
  254|      0|		return 0;
  255|      0|	}
  256|       |
  257|       |	/* Does any of the input image appear in the area we have been asked
  258|       |	 * to make? Paste it in.
  259|       |	 */
  260|  92.4k|	vips_rect_intersectrect(r, &base->rsub, &ovl);
  261|  92.4k|	if (!vips_rect_isempty(&ovl)) {
  ------------------
  |  Branch (261:6): [True: 92.4k, False: 0]
  ------------------
  262|       |		/* Paint the bits coming from the input image.
  263|       |		 */
  264|  92.4k|		ovl.left -= base->x;
  265|  92.4k|		ovl.top -= base->y;
  266|  92.4k|		if (vips_region_prepare_to(ir, out_region, &ovl,
  ------------------
  |  Branch (266:7): [True: 48.3k, False: 44.0k]
  ------------------
  267|  92.4k|				ovl.left + base->x, ovl.top + base->y))
  268|  48.3k|			return -1;
  269|  44.0k|		ovl.left += base->x;
  270|  44.0k|		ovl.top += base->y;
  271|  44.0k|	}
  272|       |
  273|  44.0k|	switch (base->extend) {
  274|      0|	case VIPS_EXTEND_BLACK:
  ------------------
  |  Branch (274:2): [True: 0, False: 44.0k]
  ------------------
  275|      0|	case VIPS_EXTEND_WHITE:
  ------------------
  |  Branch (275:2): [True: 0, False: 44.0k]
  ------------------
  276|      0|		VIPS_GATE_START("vips_embed_base_gen: work1");
  ------------------
  |  |   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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  277|       |
  278|      0|		ink = base->extend == VIPS_EXTEND_BLACK
  ------------------
  |  Branch (278:9): [True: 0, False: 0]
  ------------------
  279|      0|			? 0
  280|      0|			: (int) vips_interpretation_max_alpha(base->in->Type);
  281|       |
  282|       |		/* Paint the borders a solid value.
  283|       |		 */
  284|      0|		for (i = 0; i < 8; i++)
  ------------------
  |  Branch (284:15): [True: 0, False: 0]
  ------------------
  285|      0|			vips_region_paint(out_region, &base->border[i], ink);
  286|       |
  287|      0|		VIPS_GATE_STOP("vips_embed_base_gen: work1");
  ------------------
  |  |   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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  288|       |
  289|      0|		break;
  290|       |
  291|      0|	case VIPS_EXTEND_BACKGROUND:
  ------------------
  |  Branch (291:2): [True: 0, False: 44.0k]
  ------------------
  292|      0|		VIPS_GATE_START("vips_embed_base_gen: work2");
  ------------------
  |  |   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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  293|       |
  294|       |		/* Paint the borders a solid value.
  295|       |		 */
  296|      0|		for (i = 0; i < 8; i++)
  ------------------
  |  Branch (296:15): [True: 0, False: 0]
  ------------------
  297|      0|			vips_region_paint_pel(out_region, &base->border[i], base->ink);
  298|       |
  299|      0|		VIPS_GATE_STOP("vips_embed_base_gen: work2");
  ------------------
  |  |   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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  300|       |
  301|      0|		break;
  302|       |
  303|  44.0k|	case VIPS_EXTEND_COPY:
  ------------------
  |  Branch (303:2): [True: 44.0k, False: 0]
  ------------------
  304|       |		/* Extend the borders.
  305|       |		 */
  306|   396k|		for (i = 0; i < 8; i++) {
  ------------------
  |  Branch (306:15): [True: 352k, False: 44.0k]
  ------------------
  307|   352k|			VipsRect todo;
  308|   352k|			VipsRect edge;
  309|       |
  310|   352k|			vips_rect_intersectrect(r, &base->border[i], &todo);
  311|   352k|			if (!vips_rect_isempty(&todo)) {
  ------------------
  |  Branch (311:8): [True: 141k, False: 210k]
  ------------------
  312|   141k|				vips_embed_base_find_edge(base,
  313|   141k|					&todo, i, &edge);
  314|       |
  315|       |				/* Did we paint any of the input image? If we
  316|       |				 * did, we can fetch the edge pixels from
  317|       |				 * that.
  318|       |				 */
  319|   141k|				if (!vips_rect_isempty(&ovl)) {
  ------------------
  |  Branch (319:9): [True: 141k, False: 0]
  ------------------
  320|   141k|					p = VIPS_REGION_ADDR(out_region,
  ------------------
  |  |  227|   141k|	((R)->data + \
  |  |  228|   141k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   141k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   141k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   141k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   141k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   141k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  321|   141k|						edge.left, edge.top);
  322|   141k|					plsk = VIPS_REGION_LSKIP(out_region);
  ------------------
  |  |  195|   141k|	((size_t) ((R)->bpl))
  ------------------
  323|   141k|				}
  324|      0|				else {
  325|       |					/* No pixels painted ... fetch
  326|       |					 * directly from the input image.
  327|       |					 */
  328|      0|					edge.left -= base->x;
  329|      0|					edge.top -= base->y;
  330|      0|					if (vips_region_prepare(ir, &edge))
  ------------------
  |  Branch (330:10): [True: 0, False: 0]
  ------------------
  331|      0|						return -1;
  332|      0|					p = VIPS_REGION_ADDR(ir,
  ------------------
  |  |  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))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  333|      0|						edge.left, edge.top);
  334|      0|					plsk = VIPS_REGION_LSKIP(ir);
  ------------------
  |  |  195|      0|	((size_t) ((R)->bpl))
  ------------------
  335|      0|				}
  336|       |
  337|   141k|				vips_embed_base_paint_edge(base,
  338|   141k|					out_region, i, &todo, p, plsk);
  339|   141k|			}
  340|   352k|		}
  341|       |
  342|  44.0k|		break;
  343|       |
  344|  44.0k|	default:
  ------------------
  |  Branch (344:2): [True: 0, False: 44.0k]
  ------------------
  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|  44.0k|	}
  347|       |
  348|  44.0k|	return 0;
  349|  44.0k|}
embed.c:vips_embed_base_find_edge:
  122|   141k|{
  123|       |	/* Expand the border by 1 pixel, intersect with the image area, and we
  124|       |	 * get the edge. Usually too much though: eg. we could make the entire
  125|       |	 * right edge.
  126|       |	 */
  127|   141k|	*out = base->border[i];
  128|   141k|	vips_rect_marginadjust(out, 1);
  129|   141k|	vips_rect_intersectrect(out, &base->rsub, out);
  130|       |
  131|       |	/* Usually too much though: eg. we could make the entire
  132|       |	 * right edge. If we're strictly up/down/left/right of the image, we
  133|       |	 * can trim.
  134|       |	 */
  135|   141k|	if (i == 0 ||
  ------------------
  |  Branch (135:6): [True: 22.9k, False: 118k]
  ------------------
  136|   141k|		i == 2) {
  ------------------
  |  Branch (136:3): [True: 29.1k, False: 89.4k]
  ------------------
  137|  52.0k|		VipsRect extend;
  138|       |
  139|       |		/* Above or below.
  140|       |		 */
  141|  52.0k|		extend = *r;
  142|  52.0k|		extend.top = 0;
  143|  52.0k|		extend.height = base->height;
  144|  52.0k|		vips_rect_intersectrect(out, &extend, out);
  145|  52.0k|	}
  146|   141k|	if (i == 1 ||
  ------------------
  |  Branch (146:6): [True: 28.9k, False: 112k]
  ------------------
  147|   141k|		i == 3) {
  ------------------
  |  Branch (147:3): [True: 22.8k, False: 89.7k]
  ------------------
  148|  51.7k|		VipsRect extend;
  149|       |
  150|       |		/* Left or right.
  151|       |		 */
  152|  51.7k|		extend = *r;
  153|  51.7k|		extend.left = 0;
  154|  51.7k|		extend.width = base->width;
  155|  51.7k|		vips_rect_intersectrect(out, &extend, out);
  156|  51.7k|	}
  157|   141k|}
embed.c:vips_embed_base_paint_edge:
  181|   141k|{
  182|   141k|	const int bs = VIPS_IMAGE_SIZEOF_PEL(base->in);
  ------------------
  |  |  384|   141k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|   141k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  183|       |
  184|   141k|	VipsRect todo;
  185|   141k|	VipsPel *q;
  186|   141k|	int y;
  187|       |
  188|   141k|	VIPS_GATE_START("vips_embed_base_paint_edge: work");
  ------------------
  |  |   41|   141k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   141k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   141k|	{ \
  |  |   43|   141k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 141k]
  |  |  ------------------
  |  |   44|   141k|			vips__thread_gate_start(NAME); \
  |  |   45|   141k|	} \
  |  |   46|   141k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   141k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  189|       |
  190|       |	/* Pixels left to paint.
  191|       |	 */
  192|   141k|	todo = *r;
  193|       |
  194|       |	/* Corner pieces ... copy the single pixel to paint the top line of
  195|       |	 * todo, then use the line copier below to paint the rest of it.
  196|       |	 */
  197|   141k|	if (i > 3) {
  ------------------
  |  Branch (197:6): [True: 37.6k, False: 103k]
  ------------------
  198|  37.6k|		q = VIPS_REGION_ADDR(out_region, todo.left, todo.top);
  ------------------
  |  |  227|  37.6k|	((R)->data + \
  |  |  228|  37.6k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  37.6k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  37.6k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  37.6k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  37.6k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  37.6k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  199|  37.6k|		vips_embed_base_copy_pixel(base, q, p, todo.width);
  200|       |
  201|  37.6k|		p = q;
  202|  37.6k|		todo.top += 1;
  203|  37.6k|		todo.height -= 1;
  204|  37.6k|	}
  205|       |
  206|   141k|	if (i == 1 || i == 3) {
  ------------------
  |  Branch (206:6): [True: 28.9k, False: 112k]
  |  Branch (206:16): [True: 22.8k, False: 89.7k]
  ------------------
  207|       |		/* Vertical line of pixels to copy.
  208|       |		 */
  209|  1.51M|		for (y = 0; y < todo.height; y++) {
  ------------------
  |  Branch (209:15): [True: 1.46M, False: 51.7k]
  ------------------
  210|  1.46M|			q = VIPS_REGION_ADDR(out_region, todo.left, todo.top + y);
  ------------------
  |  |  227|  1.46M|	((R)->data + \
  |  |  228|  1.46M|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  1.46M|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  1.46M|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  1.46M|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  1.46M|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  1.46M|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  211|  1.46M|			vips_embed_base_copy_pixel(base, q, p, todo.width);
  212|  1.46M|			p += plsk;
  213|  1.46M|		}
  214|  51.7k|	}
  215|  89.7k|	else {
  216|       |		/* Horizontal line of pixels to copy.
  217|       |		 */
  218|   649k|		for (y = 0; y < todo.height; y++) {
  ------------------
  |  Branch (218:15): [True: 559k, False: 89.7k]
  ------------------
  219|   559k|			q = VIPS_REGION_ADDR(out_region, todo.left, todo.top + y);
  ------------------
  |  |  227|   559k|	((R)->data + \
  |  |  228|   559k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   559k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   559k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   559k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   559k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   559k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  220|   559k|			memcpy(q, p, bs * todo.width);
  221|   559k|		}
  222|  89.7k|	}
  223|       |
  224|   141k|	VIPS_GATE_STOP("vips_embed_base_paint_edge: work");
  ------------------
  |  |   49|   141k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   141k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|   141k|	{ \
  |  |   51|   141k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 141k]
  |  |  ------------------
  |  |   52|   141k|			vips__thread_gate_stop(NAME); \
  |  |   53|   141k|	} \
  |  |   54|   141k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   141k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  225|   141k|}
embed.c:vips_embed_base_copy_pixel:
  164|  1.50M|{
  165|  1.50M|	const int bs = VIPS_IMAGE_SIZEOF_PEL(base->in);
  ------------------
  |  |  384|  1.50M|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|  1.50M|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  166|       |
  167|  1.50M|	int x, b;
  168|       |
  169|  7.64M|	for (x = 0; x < n; x++)
  ------------------
  |  Branch (169:14): [True: 6.13M, False: 1.50M]
  ------------------
  170|  32.9M|		for (b = 0; b < bs; b++)
  ------------------
  |  Branch (170:15): [True: 26.7M, False: 6.13M]
  ------------------
  171|  26.7M|			*q++ = p[b];
  172|  1.50M|}
embed.c:vips_embed_base_init:
  604|   105k|{
  605|   105k|	base->extend = VIPS_EXTEND_BLACK;
  606|   105k|	base->background = vips_array_double_newv(1, 0.0);
  607|   105k|}
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_embed_build:
  625|   105k|{
  626|   105k|	VipsEmbedBase *base = (VipsEmbedBase *) object;
  627|   105k|	VipsEmbed *embed = (VipsEmbed *) object;
  628|       |
  629|       |	/* Just pass the specified x, y down.
  630|       |	 */
  631|   105k|	base->x = embed->x;
  632|   105k|	base->y = embed->y;
  633|       |
  634|   105k|	if (VIPS_OBJECT_CLASS(vips_embed_parent_class)->build(object))
  ------------------
  |  |  435|   105k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|   105k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   105k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (634:6): [True: 0, False: 105k]
  ------------------
  635|      0|		return -1;
  636|       |
  637|   105k|	return 0;
  638|   105k|}
embed.c:vips_embed_init:
  672|   105k|{
  673|   105k|}
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|  10.2k|{
  261|  10.2k|	va_list ap;
  262|  10.2k|	int result;
  263|       |
  264|  10.2k|	va_start(ap, height);
  265|  10.2k|	result = vips_call_split("extract_area", ap, in, out,
  266|  10.2k|		left, top, width, height);
  267|  10.2k|	va_end(ap);
  268|       |
  269|  10.2k|	return result;
  270|  10.2k|}
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|   174k|{
  480|   174k|	va_list ap;
  481|   174k|	int result;
  482|       |
  483|   174k|	va_start(ap, band);
  484|   174k|	result = vips_call_split("extract_band", ap, in, out, band);
  485|   174k|	va_end(ap);
  486|       |
  487|   174k|	return result;
  488|   174k|}
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|  10.2k|{
  139|  10.2k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  10.2k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  10.2k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  10.2k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  140|  10.2k|	VipsConversion *conversion = VIPS_CONVERSION(object);
  ------------------
  |  |   40|  10.2k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  10.2k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  10.2k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  10.2k|		VIPS_TYPE_CONVERSION, VipsConversion))
  ------------------
  141|  10.2k|	VipsExtractArea *extract = (VipsExtractArea *) object;
  142|       |
  143|  10.2k|	if (VIPS_OBJECT_CLASS(vips_extract_area_parent_class)->build(object))
  ------------------
  |  |  435|  10.2k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  10.2k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  10.2k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (143:6): [True: 0, False: 10.2k]
  ------------------
  144|      0|		return -1;
  145|       |
  146|  10.2k|	if (extract->left + extract->width > extract->in->Xsize ||
  ------------------
  |  Branch (146:6): [True: 0, False: 10.2k]
  ------------------
  147|  10.2k|		extract->top + extract->height > extract->in->Ysize ||
  ------------------
  |  Branch (147:3): [True: 0, False: 10.2k]
  ------------------
  148|  10.2k|		extract->left < 0 || extract->top < 0 ||
  ------------------
  |  Branch (148:3): [True: 0, False: 10.2k]
  |  Branch (148:24): [True: 0, False: 10.2k]
  ------------------
  149|  10.2k|		extract->width <= 0 || extract->height <= 0) {
  ------------------
  |  Branch (149:3): [True: 0, False: 10.2k]
  |  Branch (149:26): [True: 0, False: 10.2k]
  ------------------
  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|  10.2k|	if (vips_image_pio_input(extract->in) ||
  ------------------
  |  Branch (154:6): [True: 0, False: 10.2k]
  ------------------
  155|  10.2k|		vips_check_coding_known(class->nickname, extract->in))
  ------------------
  |  Branch (155:3): [True: 0, False: 10.2k]
  ------------------
  156|      0|		return -1;
  157|       |
  158|  10.2k|	if (vips_image_pipelinev(conversion->out,
  ------------------
  |  Branch (158:6): [True: 0, False: 10.2k]
  ------------------
  159|  10.2k|			VIPS_DEMAND_STYLE_THINSTRIP, extract->in, NULL))
  160|      0|		return -1;
  161|       |
  162|  10.2k|	conversion->out->Xsize = extract->width;
  163|  10.2k|	conversion->out->Ysize = extract->height;
  164|  10.2k|	conversion->out->Xoffset = -extract->left;
  165|  10.2k|	conversion->out->Yoffset = -extract->top;
  166|       |
  167|  10.2k|	if (vips_image_generate(conversion->out,
  ------------------
  |  Branch (167:6): [True: 0, False: 10.2k]
  ------------------
  168|  10.2k|			vips_start_one, vips_extract_area_gen, vips_stop_one,
  169|  10.2k|			extract->in, extract))
  170|      0|		return -1;
  171|       |
  172|  10.2k|	return 0;
  173|  10.2k|}
extract.c:vips_extract_area_gen:
  113|  23.1k|{
  114|  23.1k|	VipsRegion *ir = (VipsRegion *) seq;
  115|  23.1k|	VipsExtractArea *extract = (VipsExtractArea *) b;
  116|  23.1k|	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|  23.1k|	iarea = out_region->valid;
  122|  23.1k|	iarea.left += extract->left;
  123|  23.1k|	iarea.top += extract->top;
  124|  23.1k|	if (vips_region_prepare(ir, &iarea))
  ------------------
  |  Branch (124:6): [True: 871, False: 22.2k]
  ------------------
  125|    871|		return -1;
  126|       |
  127|       |	/* Attach or to ir.
  128|       |	 */
  129|  22.2k|	if (vips_region_region(out_region, ir,
  ------------------
  |  Branch (129:6): [True: 0, False: 22.2k]
  ------------------
  130|  22.2k|			&out_region->valid, iarea.left, iarea.top))
  131|      0|		return -1;
  132|       |
  133|  22.2k|	return 0;
  134|  22.2k|}
extract.c:vips_extract_area_init:
  238|  10.2k|{
  239|  10.2k|}
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|   155k|{
  383|   155k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|   155k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|   155k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|   155k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  384|   155k|	VipsBandary *bandary = (VipsBandary *) object;
  385|   155k|	VipsExtractBand *extract = (VipsExtractBand *) object;
  386|       |
  387|   155k|	if (extract->in) {
  ------------------
  |  Branch (387:6): [True: 155k, False: 0]
  ------------------
  388|   155k|		int bands;
  389|       |
  390|   155k|		vips_image_decode_predict(extract->in, &bands, NULL);
  391|       |
  392|   155k|		bandary->n = 1;
  393|   155k|		bandary->in = &extract->in;
  394|   155k|		bandary->out_bands = extract->n;
  395|       |
  396|   155k|		if (extract->band + extract->n > bands) {
  ------------------
  |  Branch (396:7): [True: 0, False: 155k]
  ------------------
  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|   155k|		if (extract->band == 0 &&
  ------------------
  |  Branch (402:7): [True: 58.5k, False: 96.7k]
  ------------------
  403|   155k|			extract->n == bands)
  ------------------
  |  Branch (403:4): [True: 14.4k, False: 44.1k]
  ------------------
  404|  14.4k|			return vips_bandary_copy(bandary);
  405|   155k|	}
  406|       |
  407|   140k|	if (VIPS_OBJECT_CLASS(vips_extract_band_parent_class)->build(object))
  ------------------
  |  |  435|   140k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|   140k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   140k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (407:6): [True: 0, False: 140k]
  ------------------
  408|      0|		return -1;
  409|       |
  410|   140k|	return 0;
  411|   140k|}
extract.c:vips_extract_band_buffer:
  348|  1.53M|{
  349|  1.53M|	VipsBandary *bandary = seq->bandary;
  350|  1.53M|	VipsConversion *conversion = (VipsConversion *) bandary;
  351|  1.53M|	VipsExtractBand *extract = (VipsExtractBand *) bandary;
  352|  1.53M|	VipsImage *im = bandary->ready[0];
  353|  1.53M|	int es = VIPS_IMAGE_SIZEOF_ELEMENT(im);
  ------------------
  |  |  382|  1.53M|	(vips_format_sizeof_unsafe((I)->BandFmt))
  ------------------
  354|  1.53M|	int ips = VIPS_IMAGE_SIZEOF_PEL(im);
  ------------------
  |  |  384|  1.53M|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|  1.53M|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  355|  1.53M|	const int ops = VIPS_IMAGE_SIZEOF_PEL(conversion->out);
  ------------------
  |  |  384|  1.53M|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|  1.53M|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  356|       |
  357|  1.53M|	VipsPel *restrict p;
  358|  1.53M|	VipsPel *restrict q;
  359|  1.53M|	int x, z;
  360|       |
  361|  1.53M|	p = in[0] + extract->band * es;
  362|  1.53M|	q = out;
  363|  1.53M|	if (ops == 1) {
  ------------------
  |  Branch (363:6): [True: 7.93k, False: 1.53M]
  ------------------
  364|   261k|		for (x = 0; x < width; x++) {
  ------------------
  |  Branch (364:15): [True: 253k, False: 7.93k]
  ------------------
  365|   253k|			q[x] = p[0];
  366|   253k|			p += ips;
  367|   253k|		}
  368|  7.93k|	}
  369|  1.53M|	else {
  370|  50.5M|		for (x = 0; x < width; x++) {
  ------------------
  |  Branch (370:15): [True: 49.0M, False: 1.53M]
  ------------------
  371|   267M|			for (z = 0; z < ops; z++)
  ------------------
  |  Branch (371:16): [True: 218M, False: 49.0M]
  ------------------
  372|   218M|				q[z] = p[z];
  373|       |
  374|  49.0M|			p += ips;
  375|  49.0M|			q += ops;
  376|  49.0M|		}
  377|  1.53M|	}
  378|  1.53M|}
extract.c:vips_extract_band_init:
  454|   174k|{
  455|   174k|	extract->n = 1;
  456|   174k|}

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|}

vips_ifthenelse:
  597|  38.1k|{
  598|  38.1k|	va_list ap;
  599|  38.1k|	int result;
  600|       |
  601|  38.1k|	va_start(ap, out);
  602|  38.1k|	result = vips_call_split("ifthenelse", ap, cond, in1, in2, out);
  603|  38.1k|	va_end(ap);
  604|       |
  605|  38.1k|	return result;
  606|  38.1k|}
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|}
ifthenelse.c:vips_ifthenelse_build:
  452|  38.1k|{
  453|  38.1k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  38.1k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  38.1k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  38.1k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  454|  38.1k|	VipsConversion *conversion = VIPS_CONVERSION(object);
  ------------------
  |  |   40|  38.1k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  38.1k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  38.1k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  38.1k|		VIPS_TYPE_CONVERSION, VipsConversion))
  ------------------
  455|  38.1k|	VipsIfthenelse *ifthenelse = (VipsIfthenelse *) object;
  456|  38.1k|	VipsGenerateFn generate_fn = ifthenelse->blend
  ------------------
  |  Branch (456:31): [True: 0, False: 38.1k]
  ------------------
  457|  38.1k|		? vips_blend_gen
  458|  38.1k|		: vips_ifthenelse_gen;
  459|       |
  460|  38.1k|	VipsImage **band = (VipsImage **) vips_object_local_array(object, 3);
  461|  38.1k|	VipsImage **size = (VipsImage **) vips_object_local_array(object, 3);
  462|  38.1k|	VipsImage **format =
  463|  38.1k|		(VipsImage **) vips_object_local_array(object, 3);
  464|       |
  465|  38.1k|	VipsImage *all[3];
  466|       |
  467|  38.1k|	if (VIPS_OBJECT_CLASS(vips_ifthenelse_parent_class)->build(object))
  ------------------
  |  |  435|  38.1k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  38.1k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  38.1k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (467:6): [True: 0, False: 38.1k]
  ------------------
  468|      0|		return -1;
  469|       |
  470|       |	/* We have to have the condition image last since we want the output
  471|       |	 * image to inherit its properties from the then/else parts.
  472|       |	 */
  473|  38.1k|	all[0] = ifthenelse->in1;
  474|  38.1k|	all[1] = ifthenelse->in2;
  475|  38.1k|	all[2] = ifthenelse->cond;
  476|       |
  477|       |	/* No need to check input images, sizealike and friends will do this
  478|       |	 * for us.
  479|       |	 */
  480|       |
  481|       |	/* Cast our input images up to a common bands and size.
  482|       |	 */
  483|  38.1k|	if (vips__bandalike_vec(class->nickname, all, band, 3, 0) ||
  ------------------
  |  Branch (483:6): [True: 0, False: 38.1k]
  ------------------
  484|  38.1k|		vips__sizealike_vec(band, size, 3))
  ------------------
  |  Branch (484:3): [True: 0, False: 38.1k]
  ------------------
  485|      0|		return -1;
  486|       |
  487|       |	/* Condition is cast to uchar, then/else to a common type.
  488|       |	 */
  489|  38.1k|	if (size[2]->BandFmt != VIPS_FORMAT_UCHAR) {
  ------------------
  |  Branch (489:6): [True: 0, False: 38.1k]
  ------------------
  490|      0|		if (vips_cast(size[2], &format[2], VIPS_FORMAT_UCHAR, NULL))
  ------------------
  |  Branch (490:7): [True: 0, False: 0]
  ------------------
  491|      0|			return -1;
  492|      0|	}
  493|  38.1k|	else {
  494|  38.1k|		format[2] = size[2];
  495|  38.1k|		g_object_ref(format[2]);
  496|  38.1k|	}
  497|       |
  498|  38.1k|	if (vips__formatalike_vec(size, format, 2))
  ------------------
  |  Branch (498:6): [True: 0, False: 38.1k]
  ------------------
  499|      0|		return -1;
  500|       |
  501|  38.1k|	if (vips_image_pipeline_array(conversion->out,
  ------------------
  |  Branch (501:6): [True: 0, False: 38.1k]
  ------------------
  502|  38.1k|			VIPS_DEMAND_STYLE_SMALLTILE, format))
  503|      0|		return -1;
  504|       |
  505|  38.1k|	if (vips_image_generate(conversion->out,
  ------------------
  |  Branch (505:6): [True: 0, False: 38.1k]
  ------------------
  506|  38.1k|			vips_start_many, generate_fn, vips_stop_many,
  507|  38.1k|			format, ifthenelse))
  508|      0|		return -1;
  509|       |
  510|  38.1k|	return 0;
  511|  38.1k|}
ifthenelse.c:vips_ifthenelse_gen:
  361|  15.7k|{
  362|  15.7k|	VipsRegion **ir = (VipsRegion **) seq;
  363|  15.7k|	VipsRect *r = &out_region->valid;
  364|  15.7k|	int le = r->left;
  365|  15.7k|	int to = r->top;
  366|  15.7k|	int bo = VIPS_RECT_BOTTOM(r);
  ------------------
  |  |   49|  15.7k|#define VIPS_RECT_BOTTOM(R) ((R)->top + (R)->height)
  ------------------
  367|       |
  368|  15.7k|	VipsImage *c = ir[2]->im;
  369|  15.7k|	VipsImage *a = ir[0]->im;
  370|       |
  371|  15.7k|	int size, width;
  372|  15.7k|	int i, x, y, z;
  373|       |
  374|  15.7k|	int all0, alln0;
  375|       |
  376|  15.7k|	if (c->Bands == 1) {
  ------------------
  |  Branch (376:6): [True: 15.7k, False: 0]
  ------------------
  377|       |		/* Copying PEL-sized units with a one-band conditional.
  378|       |		 */
  379|  15.7k|		size = VIPS_IMAGE_SIZEOF_PEL(a);
  ------------------
  |  |  384|  15.7k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|  15.7k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  380|  15.7k|		width = r->width;
  381|  15.7k|	}
  382|      0|	else {
  383|       |		/* Copying ELEMENT sized-units with an n-band conditional.
  384|       |		 */
  385|      0|		size = VIPS_IMAGE_SIZEOF_ELEMENT(a);
  ------------------
  |  |  382|      0|	(vips_format_sizeof_unsafe((I)->BandFmt))
  ------------------
  386|      0|		width = r->width * a->Bands;
  387|      0|	}
  388|       |
  389|  15.7k|	if (vips_region_prepare(ir[2], r))
  ------------------
  |  Branch (389:6): [True: 0, False: 15.7k]
  ------------------
  390|      0|		return -1;
  391|       |
  392|       |	/* Is the conditional all zero or all non-zero? We can avoid asking
  393|       |	 * for one of the inputs to be calculated.
  394|       |	 */
  395|  15.7k|	all0 = *VIPS_REGION_ADDR(ir[2], le, to) == 0;
  ------------------
  |  |  227|  15.7k|	((R)->data + \
  |  |  228|  15.7k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  15.7k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  15.7k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  15.7k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  15.7k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  15.7k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  396|  15.7k|	alln0 = *VIPS_REGION_ADDR(ir[2], le, to) != 0;
  ------------------
  |  |  227|  15.7k|	((R)->data + \
  |  |  228|  15.7k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  15.7k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  15.7k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  15.7k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  15.7k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  15.7k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  397|   275k|	for (y = to; y < bo; y++) {
  ------------------
  |  Branch (397:15): [True: 267k, False: 7.47k]
  ------------------
  398|   267k|		VipsPel *p = VIPS_REGION_ADDR(ir[2], le, y);
  ------------------
  |  |  227|   267k|	((R)->data + \
  |  |  228|   267k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   267k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   267k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   267k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   267k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   267k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  399|       |
  400|  8.83M|		for (x = 0; x < width; x++) {
  ------------------
  |  Branch (400:15): [True: 8.56M, False: 267k]
  ------------------
  401|  8.56M|			all0 &= p[x] == 0;
  402|  8.56M|			alln0 &= p[x] != 0;
  403|  8.56M|		}
  404|       |
  405|   267k|		if (!all0 && !alln0)
  ------------------
  |  Branch (405:7): [True: 130k, False: 136k]
  |  Branch (405:16): [True: 8.30k, False: 122k]
  ------------------
  406|  8.30k|			break;
  407|   267k|	}
  408|       |
  409|  15.7k|	if (alln0) {
  ------------------
  |  Branch (409:6): [True: 3.54k, False: 12.2k]
  ------------------
  410|       |		/* All non-zero. Point or at the then image.
  411|       |		 */
  412|  3.54k|		if (vips_region_prepare(ir[0], r) ||
  ------------------
  |  Branch (412:7): [True: 0, False: 3.54k]
  ------------------
  413|  3.54k|			vips_region_region(out_region, ir[0], r, r->left, r->top))
  ------------------
  |  Branch (413:4): [True: 0, False: 3.54k]
  ------------------
  414|      0|			return -1;
  415|  3.54k|	}
  416|  12.2k|	else if (all0) {
  ------------------
  |  Branch (416:11): [True: 3.93k, False: 8.30k]
  ------------------
  417|       |		/* All zero. Point or at the else image.
  418|       |		 */
  419|  3.93k|		if (vips_region_prepare(ir[1], r) ||
  ------------------
  |  Branch (419:7): [True: 0, False: 3.93k]
  ------------------
  420|  3.93k|			vips_region_region(out_region, ir[1], r, r->left, r->top))
  ------------------
  |  Branch (420:4): [True: 0, False: 3.93k]
  ------------------
  421|      0|			return -1;
  422|  3.93k|	}
  423|  8.30k|	else {
  424|       |		/* Mix of set and clear ... ask for both then and else parts
  425|       |		 * and interleave.
  426|       |		 */
  427|  8.30k|		if (vips_region_prepare(ir[0], r) ||
  ------------------
  |  Branch (427:7): [True: 0, False: 8.30k]
  ------------------
  428|  8.30k|			vips_region_prepare(ir[1], r))
  ------------------
  |  Branch (428:4): [True: 0, False: 8.30k]
  ------------------
  429|      0|			return -1;
  430|       |
  431|   274k|		for (y = to; y < bo; y++) {
  ------------------
  |  Branch (431:16): [True: 265k, False: 8.30k]
  ------------------
  432|   265k|			VipsPel *ap = VIPS_REGION_ADDR(ir[0], le, y);
  ------------------
  |  |  227|   265k|	((R)->data + \
  |  |  228|   265k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   265k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   265k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   265k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   265k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   265k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  433|   265k|			VipsPel *bp = VIPS_REGION_ADDR(ir[1], le, y);
  ------------------
  |  |  227|   265k|	((R)->data + \
  |  |  228|   265k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   265k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   265k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   265k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   265k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   265k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  434|   265k|			VipsPel *cp = VIPS_REGION_ADDR(ir[2], le, y);
  ------------------
  |  |  227|   265k|	((R)->data + \
  |  |  228|   265k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   265k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   265k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   265k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   265k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   265k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  435|   265k|			VipsPel *q = VIPS_REGION_ADDR(out_region, le, y);
  ------------------
  |  |  227|   265k|	((R)->data + \
  |  |  228|   265k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   265k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   265k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   265k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   265k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   265k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  436|       |
  437|  8.77M|			for (x = 0, i = 0; i < width; i++, x += size)
  ------------------
  |  Branch (437:23): [True: 8.50M, False: 265k]
  ------------------
  438|  8.50M|				if (cp[i])
  ------------------
  |  Branch (438:9): [True: 3.72M, False: 4.77M]
  ------------------
  439|  18.6M|					for (z = x; z < x + size; z++)
  ------------------
  |  Branch (439:18): [True: 14.9M, False: 3.72M]
  ------------------
  440|  14.9M|						q[z] = ap[z];
  441|  4.77M|				else
  442|  23.8M|					for (z = x; z < x + size; z++)
  ------------------
  |  Branch (442:18): [True: 19.1M, False: 4.77M]
  ------------------
  443|  19.1M|						q[z] = bp[z];
  444|   265k|		}
  445|  8.30k|	}
  446|       |
  447|  15.7k|	return 0;
  448|  15.7k|}
ifthenelse.c:vips_ifthenelse_init:
  556|  38.1k|{
  557|  38.1k|}

vips__vector_to_pels:
  248|     17|{
  249|       |	/* Run our pipeline relative to this.
  250|       |	 */
  251|     17|	VipsImage *context = vips_image_new();
  252|       |
  253|     17|	VipsImage **t = (VipsImage **)
  254|     17|		vips_object_local_array(VIPS_OBJECT(context), 8);
  ------------------
  |  |  433|     17|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|     17|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|     17|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  255|       |
  256|     17|	VipsImage *in;
  257|     17|	double *ones;
  258|     17|	VipsPel *result;
  259|     17|	int i;
  260|       |
  261|       |#ifdef VIPS_DEBUG
  262|       |	printf("vips__vector_to_pels: starting\n");
  263|       |#endif /*VIPS_DEBUG*/
  264|       |
  265|     17|	ones = VIPS_ARRAY(context, n, double);
  ------------------
  |  |   72|     17|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|     17|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|     17|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|     17|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|     17|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  266|     34|	for (i = 0; i < n; i++)
  ------------------
  |  Branch (266:14): [True: 17, False: 17]
  ------------------
  267|     17|		ones[i] = 1.0;
  268|       |
  269|       |	/* Make the real and imaginary parts.
  270|       |	 */
  271|     17|	if (vips_black(&t[0], 1, 1, "bands", bands, NULL) ||
  ------------------
  |  Branch (271:6): [True: 0, False: 17]
  ------------------
  272|     17|		vips_linear(t[0], &t[1], ones, real, n, NULL)) {
  ------------------
  |  Branch (272:3): [True: 0, False: 17]
  ------------------
  273|      0|		g_object_unref(context);
  274|      0|		return NULL;
  275|      0|	}
  276|     17|	in = t[1];
  277|       |
  278|     17|	if (imag) {
  ------------------
  |  Branch (278:6): [True: 0, False: 17]
  ------------------
  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|     17|	if (vips_cast(in, &t[5], format, NULL) ||
  ------------------
  |  Branch (290:6): [True: 0, False: 17]
  ------------------
  291|     17|		vips_image_encode(t[5], &t[6], coding)) {
  ------------------
  |  Branch (291:3): [True: 0, False: 17]
  ------------------
  292|      0|		g_object_unref(context);
  293|      0|		return NULL;
  294|      0|	}
  295|     17|	in = t[6];
  296|       |
  297|       |	/* Write to memory, copy to output buffer.
  298|       |	 */
  299|     17|	vips_image_set_int(in, "hide-progress", 1);
  300|     17|	if (!(t[7] = vips_image_new_memory()) ||
  ------------------
  |  Branch (300:6): [True: 0, False: 17]
  ------------------
  301|     17|		vips_image_write(in, t[7])) {
  ------------------
  |  Branch (301:3): [True: 0, False: 17]
  ------------------
  302|      0|		g_object_unref(context);
  303|      0|		return NULL;
  304|      0|	}
  305|     17|	in = t[7];
  306|       |
  307|     17|	if (!(result =
  ------------------
  |  Branch (307:6): [True: 0, False: 17]
  ------------------
  308|     17|				VIPS_ARRAY(NULL, VIPS_IMAGE_SIZEOF_PEL(in), VipsPel))) {
  ------------------
  |  |   72|     17|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|     17|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|     17|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|     17|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|     17|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  309|      0|		g_object_unref(context);
  310|      0|		return NULL;
  311|      0|	}
  312|       |
  313|     17|	memcpy(result, in->data, VIPS_IMAGE_SIZEOF_PEL(in));
  ------------------
  |  |  384|     17|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|     17|	(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|     17|	g_object_unref(context);
  332|       |
  333|     17|	return result;
  334|     17|}
vips__vector_to_ink:
  348|     17|{
  349|     17|	int bands;
  350|     17|	VipsBandFormat format;
  351|     17|	VipsPel *result;
  352|       |
  353|     17|	vips_image_decode_predict(im, &bands, &format);
  354|       |
  355|     17|	if (!(result = vips__vector_to_pels(domain,
  ------------------
  |  Branch (355:6): [True: 0, False: 17]
  ------------------
  356|     17|			  bands, format, im->Coding, real, imag, n)))
  357|      0|		return NULL;
  358|       |
  359|     17|	g_signal_connect(im, "postclose",
  ------------------
  |  |  491|     17|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  360|     17|		G_CALLBACK(vips__vector_to_ink_cb), result);
  361|       |
  362|     17|	return result;
  363|     17|}
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|     17|{
  339|     17|	g_free(buf);
  340|     17|}

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|}

vips_premultiply:
  321|  4.21k|{
  322|  4.21k|	va_list ap;
  323|  4.21k|	int result;
  324|       |
  325|  4.21k|	va_start(ap, out);
  326|  4.21k|	result = vips_call_split("premultiply", ap, in, out);
  327|  4.21k|	va_end(ap);
  328|       |
  329|  4.21k|	return result;
  330|  4.21k|}
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|}
premultiply.c:vips_premultiply_build:
  194|  4.21k|{
  195|  4.21k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  4.21k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  4.21k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  4.21k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  196|  4.21k|	VipsConversion *conversion = VIPS_CONVERSION(object);
  ------------------
  |  |   40|  4.21k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  4.21k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  4.21k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  4.21k|		VIPS_TYPE_CONVERSION, VipsConversion))
  ------------------
  197|  4.21k|	VipsPremultiply *premultiply = (VipsPremultiply *) object;
  198|  4.21k|	VipsImage **t = (VipsImage **) vips_object_local_array(object, 1);
  199|       |
  200|  4.21k|	VipsImage *in;
  201|       |
  202|  4.21k|	if (VIPS_OBJECT_CLASS(vips_premultiply_parent_class)->build(object))
  ------------------
  |  |  435|  4.21k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  4.21k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  4.21k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (202:6): [True: 0, False: 4.21k]
  ------------------
  203|      0|		return -1;
  204|       |
  205|  4.21k|	in = premultiply->in;
  206|       |
  207|  4.21k|	if (vips_image_decode(in, &t[0]))
  ------------------
  |  Branch (207:6): [True: 0, False: 4.21k]
  ------------------
  208|      0|		return -1;
  209|  4.21k|	in = t[0];
  210|       |
  211|       |	/* Trivial case: fall back to copy().
  212|       |	 */
  213|  4.21k|	if (in->Bands == 1)
  ------------------
  |  Branch (213:6): [True: 0, False: 4.21k]
  ------------------
  214|      0|		return vips_image_write(in, conversion->out);
  215|       |
  216|  4.21k|	if (vips_check_noncomplex(class->nickname, in))
  ------------------
  |  Branch (216:6): [True: 0, False: 4.21k]
  ------------------
  217|      0|		return -1;
  218|       |
  219|  4.21k|	if (vips_image_pipelinev(conversion->out,
  ------------------
  |  Branch (219:6): [True: 0, False: 4.21k]
  ------------------
  220|  4.21k|			VIPS_DEMAND_STYLE_THINSTRIP, in, NULL))
  221|      0|		return -1;
  222|       |
  223|       |	/* Is max-alpha unset? Default to the correct value for this
  224|       |	 * interpretation.
  225|       |	 */
  226|  4.21k|	if (!vips_object_argument_isset(object, "max_alpha"))
  ------------------
  |  Branch (226:6): [True: 4.21k, False: 0]
  ------------------
  227|  4.21k|		premultiply->max_alpha = vips_interpretation_max_alpha(in->Type); // FIXME: Invalidates operation cache
  228|       |
  229|  4.21k|	if (in->BandFmt == VIPS_FORMAT_DOUBLE)
  ------------------
  |  Branch (229:6): [True: 0, False: 4.21k]
  ------------------
  230|      0|		conversion->out->BandFmt = VIPS_FORMAT_DOUBLE;
  231|  4.21k|	else
  232|  4.21k|		conversion->out->BandFmt = VIPS_FORMAT_FLOAT;
  233|       |
  234|  4.21k|	if (vips_image_generate(conversion->out,
  ------------------
  |  Branch (234:6): [True: 0, False: 4.21k]
  ------------------
  235|  4.21k|			vips_start_one, vips_premultiply_gen, vips_stop_one,
  236|  4.21k|			in, premultiply))
  237|      0|		return -1;
  238|       |
  239|  4.21k|	return 0;
  240|  4.21k|}
premultiply.c:vips_premultiply_init:
  276|  4.21k|{
  277|  4.21k|	premultiply->max_alpha = 255.0;
  278|  4.21k|}
premultiply.c:vips_premultiply_gen.avx.0:
  131|  4.21k|{
  132|  4.21k|	VipsPremultiply *premultiply = (VipsPremultiply *) b;
  133|  4.21k|	VipsRegion *ir = (VipsRegion *) vseq;
  134|  4.21k|	VipsImage *im = ir->im;
  135|  4.21k|	VipsRect *r = &out_region->valid;
  136|  4.21k|	int width = r->width;
  137|  4.21k|	int bands = im->Bands;
  138|  4.21k|	double max_alpha = premultiply->max_alpha;
  139|       |
  140|  4.21k|	int x, y, i;
  141|       |
  142|  4.21k|	if (vips_region_prepare(ir, r))
  ------------------
  |  Branch (142:6): [True: 2.13k, False: 2.07k]
  ------------------
  143|  2.13k|		return -1;
  144|       |
  145|   130k|	for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (145:14): [True: 128k, False: 2.07k]
  ------------------
  146|   128k|		VipsPel *in = VIPS_REGION_ADDR(ir, r->left, r->top + y);
  ------------------
  |  |  227|   128k|	((R)->data + \
  |  |  228|   128k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   128k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   128k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   128k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   128k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   128k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  147|   128k|		VipsPel *out = VIPS_REGION_ADDR(out_region, r->left, r->top + y);
  ------------------
  |  |  227|   128k|	((R)->data + \
  |  |  228|   128k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   128k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   128k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   128k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   128k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   128k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  148|       |
  149|   128k|		switch (im->BandFmt) {
  150|  76.6k|		case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (150:3): [True: 76.6k, False: 51.4k]
  ------------------
  151|  76.6k|			PRE(unsigned char, float);
  ------------------
  |  |  118|  76.6k|	{ \
  |  |  119|  76.6k|		if (bands == 4) { \
  |  |  ------------------
  |  |  |  Branch (119:7): [True: 73.6k, False: 2.99k]
  |  |  ------------------
  |  |  120|  73.6k|			PRE_RGBA(IN, OUT); \
  |  |  ------------------
  |  |  |  |   98|  73.6k|	{ \
  |  |  |  |   99|  73.6k|		IN *restrict p = (IN *) in; \
  |  |  |  |  100|  73.6k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  101|  73.6k|\
  |  |  |  |  102|  5.25M|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (102:15): [True: 5.17M, False: 73.6k]
  |  |  |  |  ------------------
  |  |  |  |  103|  5.17M|			IN alpha = p[3]; \
  |  |  |  |  104|  5.17M|			IN clip_alpha = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  5.17M|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  10.3M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 5.17M]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 5.17M]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 5.17M]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  105|  5.17M|			OUT nalpha = (OUT) clip_alpha / max_alpha; \
  |  |  |  |  106|  5.17M|\
  |  |  |  |  107|  5.17M|			q[0] = p[0] * nalpha; \
  |  |  |  |  108|  5.17M|			q[1] = p[1] * nalpha; \
  |  |  |  |  109|  5.17M|			q[2] = p[2] * nalpha; \
  |  |  |  |  110|  5.17M|			q[3] = alpha; \
  |  |  |  |  111|  5.17M|\
  |  |  |  |  112|  5.17M|			p += 4; \
  |  |  |  |  113|  5.17M|			q += 4; \
  |  |  |  |  114|  5.17M|		} \
  |  |  |  |  115|  73.6k|	}
  |  |  ------------------
  |  |  121|  73.6k|		} \
  |  |  122|  76.6k|		else { \
  |  |  123|  2.99k|			PRE_MANY(IN, OUT); \
  |  |  ------------------
  |  |  |  |   77|  2.99k|	{ \
  |  |  |  |   78|  2.99k|		IN *restrict p = (IN *) in; \
  |  |  |  |   79|  2.99k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |   80|  2.99k|\
  |  |  |  |   81|   217k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (81:15): [True: 214k, False: 2.99k]
  |  |  |  |  ------------------
  |  |  |  |   82|   214k|			IN alpha = p[bands - 1]; \
  |  |  |  |   83|   214k|			IN clip_alpha = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   214k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   428k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 214k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 214k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 214k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   84|   214k|			OUT nalpha = (OUT) clip_alpha / max_alpha; \
  |  |  |  |   85|   214k|\
  |  |  |  |   86|   497k|			for (i = 0; i < bands - 1; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (86:16): [True: 283k, False: 214k]
  |  |  |  |  ------------------
  |  |  |  |   87|   283k|				q[i] = p[i] * nalpha; \
  |  |  |  |   88|   214k|			q[i] = alpha; \
  |  |  |  |   89|   214k|\
  |  |  |  |   90|   214k|			p += bands; \
  |  |  |  |   91|   214k|			q += bands; \
  |  |  |  |   92|   214k|		} \
  |  |  |  |   93|  2.99k|	}
  |  |  ------------------
  |  |  124|  2.99k|		} \
  |  |  125|  76.6k|	}
  ------------------
  152|  76.6k|			break;
  153|       |
  154|  4.42k|		case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (154:3): [True: 4.42k, False: 123k]
  ------------------
  155|  4.42k|			PRE(signed char, float);
  ------------------
  |  |  118|  4.42k|	{ \
  |  |  119|  4.42k|		if (bands == 4) { \
  |  |  ------------------
  |  |  |  Branch (119:7): [True: 1.29k, False: 3.12k]
  |  |  ------------------
  |  |  120|  1.29k|			PRE_RGBA(IN, OUT); \
  |  |  ------------------
  |  |  |  |   98|  1.29k|	{ \
  |  |  |  |   99|  1.29k|		IN *restrict p = (IN *) in; \
  |  |  |  |  100|  1.29k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  101|  1.29k|\
  |  |  |  |  102|  54.2k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (102:15): [True: 52.9k, False: 1.29k]
  |  |  |  |  ------------------
  |  |  |  |  103|  52.9k|			IN alpha = p[3]; \
  |  |  |  |  104|  52.9k|			IN clip_alpha = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  52.9k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   105k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 2.97k, False: 50.0k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 52.9k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 50.0k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  105|  52.9k|			OUT nalpha = (OUT) clip_alpha / max_alpha; \
  |  |  |  |  106|  52.9k|\
  |  |  |  |  107|  52.9k|			q[0] = p[0] * nalpha; \
  |  |  |  |  108|  52.9k|			q[1] = p[1] * nalpha; \
  |  |  |  |  109|  52.9k|			q[2] = p[2] * nalpha; \
  |  |  |  |  110|  52.9k|			q[3] = alpha; \
  |  |  |  |  111|  52.9k|\
  |  |  |  |  112|  52.9k|			p += 4; \
  |  |  |  |  113|  52.9k|			q += 4; \
  |  |  |  |  114|  52.9k|		} \
  |  |  |  |  115|  1.29k|	}
  |  |  ------------------
  |  |  121|  1.29k|		} \
  |  |  122|  4.42k|		else { \
  |  |  123|  3.12k|			PRE_MANY(IN, OUT); \
  |  |  ------------------
  |  |  |  |   77|  3.12k|	{ \
  |  |  |  |   78|  3.12k|		IN *restrict p = (IN *) in; \
  |  |  |  |   79|  3.12k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |   80|  3.12k|\
  |  |  |  |   81|   141k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (81:15): [True: 138k, False: 3.12k]
  |  |  |  |  ------------------
  |  |  |  |   82|   138k|			IN alpha = p[bands - 1]; \
  |  |  |  |   83|   138k|			IN clip_alpha = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   138k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   277k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 5.91k, False: 132k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 138k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 132k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   84|   138k|			OUT nalpha = (OUT) clip_alpha / max_alpha; \
  |  |  |  |   85|   138k|\
  |  |  |  |   86|   404k|			for (i = 0; i < bands - 1; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (86:16): [True: 266k, False: 138k]
  |  |  |  |  ------------------
  |  |  |  |   87|   266k|				q[i] = p[i] * nalpha; \
  |  |  |  |   88|   138k|			q[i] = alpha; \
  |  |  |  |   89|   138k|\
  |  |  |  |   90|   138k|			p += bands; \
  |  |  |  |   91|   138k|			q += bands; \
  |  |  |  |   92|   138k|		} \
  |  |  |  |   93|  3.12k|	}
  |  |  ------------------
  |  |  124|  3.12k|		} \
  |  |  125|  4.42k|	}
  ------------------
  156|  4.42k|			break;
  157|       |
  158|  4.90k|		case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (158:3): [True: 4.90k, False: 123k]
  ------------------
  159|  4.90k|			PRE(unsigned short, float);
  ------------------
  |  |  118|  4.90k|	{ \
  |  |  119|  4.90k|		if (bands == 4) { \
  |  |  ------------------
  |  |  |  Branch (119:7): [True: 2.25k, False: 2.65k]
  |  |  ------------------
  |  |  120|  2.25k|			PRE_RGBA(IN, OUT); \
  |  |  ------------------
  |  |  |  |   98|  2.25k|	{ \
  |  |  |  |   99|  2.25k|		IN *restrict p = (IN *) in; \
  |  |  |  |  100|  2.25k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  101|  2.25k|\
  |  |  |  |  102|   128k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (102:15): [True: 126k, False: 2.25k]
  |  |  |  |  ------------------
  |  |  |  |  103|   126k|			IN alpha = p[3]; \
  |  |  |  |  104|   126k|			IN clip_alpha = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   126k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   252k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 126k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 126k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 126k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  105|   126k|			OUT nalpha = (OUT) clip_alpha / max_alpha; \
  |  |  |  |  106|   126k|\
  |  |  |  |  107|   126k|			q[0] = p[0] * nalpha; \
  |  |  |  |  108|   126k|			q[1] = p[1] * nalpha; \
  |  |  |  |  109|   126k|			q[2] = p[2] * nalpha; \
  |  |  |  |  110|   126k|			q[3] = alpha; \
  |  |  |  |  111|   126k|\
  |  |  |  |  112|   126k|			p += 4; \
  |  |  |  |  113|   126k|			q += 4; \
  |  |  |  |  114|   126k|		} \
  |  |  |  |  115|  2.25k|	}
  |  |  ------------------
  |  |  121|  2.25k|		} \
  |  |  122|  4.90k|		else { \
  |  |  123|  2.65k|			PRE_MANY(IN, OUT); \
  |  |  ------------------
  |  |  |  |   77|  2.65k|	{ \
  |  |  |  |   78|  2.65k|		IN *restrict p = (IN *) in; \
  |  |  |  |   79|  2.65k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |   80|  2.65k|\
  |  |  |  |   81|   104k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (81:15): [True: 102k, False: 2.65k]
  |  |  |  |  ------------------
  |  |  |  |   82|   102k|			IN alpha = p[bands - 1]; \
  |  |  |  |   83|   102k|			IN clip_alpha = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   102k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   204k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 102k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 102k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 102k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   84|   102k|			OUT nalpha = (OUT) clip_alpha / max_alpha; \
  |  |  |  |   85|   102k|\
  |  |  |  |   86|   219k|			for (i = 0; i < bands - 1; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (86:16): [True: 116k, False: 102k]
  |  |  |  |  ------------------
  |  |  |  |   87|   116k|				q[i] = p[i] * nalpha; \
  |  |  |  |   88|   102k|			q[i] = alpha; \
  |  |  |  |   89|   102k|\
  |  |  |  |   90|   102k|			p += bands; \
  |  |  |  |   91|   102k|			q += bands; \
  |  |  |  |   92|   102k|		} \
  |  |  |  |   93|  2.65k|	}
  |  |  ------------------
  |  |  124|  2.65k|		} \
  |  |  125|  4.90k|	}
  ------------------
  160|  4.90k|			break;
  161|       |
  162|  6.41k|		case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (162:3): [True: 6.41k, False: 121k]
  ------------------
  163|  6.41k|			PRE(signed short, float);
  ------------------
  |  |  118|  6.41k|	{ \
  |  |  119|  6.41k|		if (bands == 4) { \
  |  |  ------------------
  |  |  |  Branch (119:7): [True: 4.82k, False: 1.59k]
  |  |  ------------------
  |  |  120|  4.82k|			PRE_RGBA(IN, OUT); \
  |  |  ------------------
  |  |  |  |   98|  4.82k|	{ \
  |  |  |  |   99|  4.82k|		IN *restrict p = (IN *) in; \
  |  |  |  |  100|  4.82k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  101|  4.82k|\
  |  |  |  |  102|   237k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (102:15): [True: 232k, False: 4.82k]
  |  |  |  |  ------------------
  |  |  |  |  103|   232k|			IN alpha = p[3]; \
  |  |  |  |  104|   232k|			IN clip_alpha = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   232k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   464k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 13.2k, False: 219k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 35.7k, False: 196k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 35.7k, False: 183k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  105|   232k|			OUT nalpha = (OUT) clip_alpha / max_alpha; \
  |  |  |  |  106|   232k|\
  |  |  |  |  107|   232k|			q[0] = p[0] * nalpha; \
  |  |  |  |  108|   232k|			q[1] = p[1] * nalpha; \
  |  |  |  |  109|   232k|			q[2] = p[2] * nalpha; \
  |  |  |  |  110|   232k|			q[3] = alpha; \
  |  |  |  |  111|   232k|\
  |  |  |  |  112|   232k|			p += 4; \
  |  |  |  |  113|   232k|			q += 4; \
  |  |  |  |  114|   232k|		} \
  |  |  |  |  115|  4.82k|	}
  |  |  ------------------
  |  |  121|  4.82k|		} \
  |  |  122|  6.41k|		else { \
  |  |  123|  1.59k|			PRE_MANY(IN, OUT); \
  |  |  ------------------
  |  |  |  |   77|  1.59k|	{ \
  |  |  |  |   78|  1.59k|		IN *restrict p = (IN *) in; \
  |  |  |  |   79|  1.59k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |   80|  1.59k|\
  |  |  |  |   81|  67.4k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (81:15): [True: 65.8k, False: 1.59k]
  |  |  |  |  ------------------
  |  |  |  |   82|  65.8k|			IN alpha = p[bands - 1]; \
  |  |  |  |   83|  65.8k|			IN clip_alpha = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  65.8k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   131k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 7.45k, False: 58.4k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 65.8k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 58.4k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   84|  65.8k|			OUT nalpha = (OUT) clip_alpha / max_alpha; \
  |  |  |  |   85|  65.8k|\
  |  |  |  |   86|   144k|			for (i = 0; i < bands - 1; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (86:16): [True: 78.4k, False: 65.8k]
  |  |  |  |  ------------------
  |  |  |  |   87|  78.4k|				q[i] = p[i] * nalpha; \
  |  |  |  |   88|  65.8k|			q[i] = alpha; \
  |  |  |  |   89|  65.8k|\
  |  |  |  |   90|  65.8k|			p += bands; \
  |  |  |  |   91|  65.8k|			q += bands; \
  |  |  |  |   92|  65.8k|		} \
  |  |  |  |   93|  1.59k|	}
  |  |  ------------------
  |  |  124|  1.59k|		} \
  |  |  125|  6.41k|	}
  ------------------
  164|  6.41k|			break;
  165|       |
  166|  5.61k|		case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (166:3): [True: 5.61k, False: 122k]
  ------------------
  167|  5.61k|			PRE(unsigned int, float);
  ------------------
  |  |  118|  5.61k|	{ \
  |  |  119|  5.61k|		if (bands == 4) { \
  |  |  ------------------
  |  |  |  Branch (119:7): [True: 2.23k, False: 3.37k]
  |  |  ------------------
  |  |  120|  2.23k|			PRE_RGBA(IN, OUT); \
  |  |  ------------------
  |  |  |  |   98|  2.23k|	{ \
  |  |  |  |   99|  2.23k|		IN *restrict p = (IN *) in; \
  |  |  |  |  100|  2.23k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  101|  2.23k|\
  |  |  |  |  102|  78.3k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (102:15): [True: 76.0k, False: 2.23k]
  |  |  |  |  ------------------
  |  |  |  |  103|  76.0k|			IN alpha = p[3]; \
  |  |  |  |  104|  76.0k|			IN clip_alpha = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  76.0k|#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: 0, False: 76.0k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 14.1k, False: 61.9k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 14.1k, False: 61.9k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  105|  76.0k|			OUT nalpha = (OUT) clip_alpha / max_alpha; \
  |  |  |  |  106|  76.0k|\
  |  |  |  |  107|  76.0k|			q[0] = p[0] * nalpha; \
  |  |  |  |  108|  76.0k|			q[1] = p[1] * nalpha; \
  |  |  |  |  109|  76.0k|			q[2] = p[2] * nalpha; \
  |  |  |  |  110|  76.0k|			q[3] = alpha; \
  |  |  |  |  111|  76.0k|\
  |  |  |  |  112|  76.0k|			p += 4; \
  |  |  |  |  113|  76.0k|			q += 4; \
  |  |  |  |  114|  76.0k|		} \
  |  |  |  |  115|  2.23k|	}
  |  |  ------------------
  |  |  121|  2.23k|		} \
  |  |  122|  5.61k|		else { \
  |  |  123|  3.37k|			PRE_MANY(IN, OUT); \
  |  |  ------------------
  |  |  |  |   77|  3.37k|	{ \
  |  |  |  |   78|  3.37k|		IN *restrict p = (IN *) in; \
  |  |  |  |   79|  3.37k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |   80|  3.37k|\
  |  |  |  |   81|   144k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (81:15): [True: 140k, False: 3.37k]
  |  |  |  |  ------------------
  |  |  |  |   82|   140k|			IN alpha = p[bands - 1]; \
  |  |  |  |   83|   140k|			IN clip_alpha = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   140k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   281k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 140k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 25.3k, False: 115k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 25.3k, False: 115k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   84|   140k|			OUT nalpha = (OUT) clip_alpha / max_alpha; \
  |  |  |  |   85|   140k|\
  |  |  |  |   86|   301k|			for (i = 0; i < bands - 1; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (86:16): [True: 160k, False: 140k]
  |  |  |  |  ------------------
  |  |  |  |   87|   160k|				q[i] = p[i] * nalpha; \
  |  |  |  |   88|   140k|			q[i] = alpha; \
  |  |  |  |   89|   140k|\
  |  |  |  |   90|   140k|			p += bands; \
  |  |  |  |   91|   140k|			q += bands; \
  |  |  |  |   92|   140k|		} \
  |  |  |  |   93|  3.37k|	}
  |  |  ------------------
  |  |  124|  3.37k|		} \
  |  |  125|  5.61k|	}
  ------------------
  168|  5.61k|			break;
  169|       |
  170|  7.10k|		case VIPS_FORMAT_INT:
  ------------------
  |  Branch (170:3): [True: 7.10k, False: 121k]
  ------------------
  171|  7.10k|			PRE(signed int, float);
  ------------------
  |  |  118|  7.10k|	{ \
  |  |  119|  7.10k|		if (bands == 4) { \
  |  |  ------------------
  |  |  |  Branch (119:7): [True: 2.93k, False: 4.16k]
  |  |  ------------------
  |  |  120|  2.93k|			PRE_RGBA(IN, OUT); \
  |  |  ------------------
  |  |  |  |   98|  2.93k|	{ \
  |  |  |  |   99|  2.93k|		IN *restrict p = (IN *) in; \
  |  |  |  |  100|  2.93k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  101|  2.93k|\
  |  |  |  |  102|   114k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (102:15): [True: 111k, False: 2.93k]
  |  |  |  |  ------------------
  |  |  |  |  103|   111k|			IN alpha = p[3]; \
  |  |  |  |  104|   111k|			IN clip_alpha = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   111k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   223k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 6.32k, False: 105k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 22.8k, False: 89.1k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 22.8k, False: 82.8k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  105|   111k|			OUT nalpha = (OUT) clip_alpha / max_alpha; \
  |  |  |  |  106|   111k|\
  |  |  |  |  107|   111k|			q[0] = p[0] * nalpha; \
  |  |  |  |  108|   111k|			q[1] = p[1] * nalpha; \
  |  |  |  |  109|   111k|			q[2] = p[2] * nalpha; \
  |  |  |  |  110|   111k|			q[3] = alpha; \
  |  |  |  |  111|   111k|\
  |  |  |  |  112|   111k|			p += 4; \
  |  |  |  |  113|   111k|			q += 4; \
  |  |  |  |  114|   111k|		} \
  |  |  |  |  115|  2.93k|	}
  |  |  ------------------
  |  |  121|  2.93k|		} \
  |  |  122|  7.10k|		else { \
  |  |  123|  4.16k|			PRE_MANY(IN, OUT); \
  |  |  ------------------
  |  |  |  |   77|  4.16k|	{ \
  |  |  |  |   78|  4.16k|		IN *restrict p = (IN *) in; \
  |  |  |  |   79|  4.16k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |   80|  4.16k|\
  |  |  |  |   81|   176k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (81:15): [True: 172k, False: 4.16k]
  |  |  |  |  ------------------
  |  |  |  |   82|   172k|			IN alpha = p[bands - 1]; \
  |  |  |  |   83|   172k|			IN clip_alpha = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   172k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   345k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 8.34k, False: 164k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 33.4k, False: 139k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 33.4k, False: 130k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   84|   172k|			OUT nalpha = (OUT) clip_alpha / max_alpha; \
  |  |  |  |   85|   172k|\
  |  |  |  |   86|   377k|			for (i = 0; i < bands - 1; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (86:16): [True: 204k, False: 172k]
  |  |  |  |  ------------------
  |  |  |  |   87|   204k|				q[i] = p[i] * nalpha; \
  |  |  |  |   88|   172k|			q[i] = alpha; \
  |  |  |  |   89|   172k|\
  |  |  |  |   90|   172k|			p += bands; \
  |  |  |  |   91|   172k|			q += bands; \
  |  |  |  |   92|   172k|		} \
  |  |  |  |   93|  4.16k|	}
  |  |  ------------------
  |  |  124|  4.16k|		} \
  |  |  125|  7.10k|	}
  ------------------
  172|  7.10k|			break;
  173|       |
  174|  23.0k|		case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (174:3): [True: 23.0k, False: 105k]
  ------------------
  175|  23.0k|			PRE(float, float);
  ------------------
  |  |  118|  23.0k|	{ \
  |  |  119|  23.0k|		if (bands == 4) { \
  |  |  ------------------
  |  |  |  Branch (119:7): [True: 16.3k, False: 6.61k]
  |  |  ------------------
  |  |  120|  16.3k|			PRE_RGBA(IN, OUT); \
  |  |  ------------------
  |  |  |  |   98|  16.3k|	{ \
  |  |  |  |   99|  16.3k|		IN *restrict p = (IN *) in; \
  |  |  |  |  100|  16.3k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  101|  16.3k|\
  |  |  |  |  102|   710k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (102:15): [True: 694k, False: 16.3k]
  |  |  |  |  ------------------
  |  |  |  |  103|   694k|			IN alpha = p[3]; \
  |  |  |  |  104|   694k|			IN clip_alpha = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   694k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  1.38M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 20.5k, False: 673k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 15.7k, False: 678k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 15.7k, False: 658k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  105|   694k|			OUT nalpha = (OUT) clip_alpha / max_alpha; \
  |  |  |  |  106|   694k|\
  |  |  |  |  107|   694k|			q[0] = p[0] * nalpha; \
  |  |  |  |  108|   694k|			q[1] = p[1] * nalpha; \
  |  |  |  |  109|   694k|			q[2] = p[2] * nalpha; \
  |  |  |  |  110|   694k|			q[3] = alpha; \
  |  |  |  |  111|   694k|\
  |  |  |  |  112|   694k|			p += 4; \
  |  |  |  |  113|   694k|			q += 4; \
  |  |  |  |  114|   694k|		} \
  |  |  |  |  115|  16.3k|	}
  |  |  ------------------
  |  |  121|  16.3k|		} \
  |  |  122|  23.0k|		else { \
  |  |  123|  6.61k|			PRE_MANY(IN, OUT); \
  |  |  ------------------
  |  |  |  |   77|  6.61k|	{ \
  |  |  |  |   78|  6.61k|		IN *restrict p = (IN *) in; \
  |  |  |  |   79|  6.61k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |   80|  6.61k|\
  |  |  |  |   81|   300k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (81:15): [True: 293k, False: 6.61k]
  |  |  |  |  ------------------
  |  |  |  |   82|   293k|			IN alpha = p[bands - 1]; \
  |  |  |  |   83|   293k|			IN clip_alpha = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   293k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   587k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 21.4k, False: 272k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 14.1k, False: 279k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 14.1k, False: 258k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   84|   293k|			OUT nalpha = (OUT) clip_alpha / max_alpha; \
  |  |  |  |   85|   293k|\
  |  |  |  |   86|   727k|			for (i = 0; i < bands - 1; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (86:16): [True: 433k, False: 293k]
  |  |  |  |  ------------------
  |  |  |  |   87|   433k|				q[i] = p[i] * nalpha; \
  |  |  |  |   88|   293k|			q[i] = alpha; \
  |  |  |  |   89|   293k|\
  |  |  |  |   90|   293k|			p += bands; \
  |  |  |  |   91|   293k|			q += bands; \
  |  |  |  |   92|   293k|		} \
  |  |  |  |   93|  6.61k|	}
  |  |  ------------------
  |  |  124|  6.61k|		} \
  |  |  125|  23.0k|	}
  ------------------
  176|  23.0k|			break;
  177|       |
  178|      0|		case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (178:3): [True: 0, False: 128k]
  ------------------
  179|      0|			PRE(double, double);
  ------------------
  |  |  118|      0|	{ \
  |  |  119|      0|		if (bands == 4) { \
  |  |  ------------------
  |  |  |  Branch (119:7): [True: 0, False: 0]
  |  |  ------------------
  |  |  120|      0|			PRE_RGBA(IN, OUT); \
  |  |  ------------------
  |  |  |  |   98|      0|	{ \
  |  |  |  |   99|      0|		IN *restrict p = (IN *) in; \
  |  |  |  |  100|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  101|      0|\
  |  |  |  |  102|      0|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (102:15): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  103|      0|			IN alpha = p[3]; \
  |  |  |  |  104|      0|			IN clip_alpha = 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]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  105|      0|			OUT nalpha = (OUT) clip_alpha / max_alpha; \
  |  |  |  |  106|      0|\
  |  |  |  |  107|      0|			q[0] = p[0] * nalpha; \
  |  |  |  |  108|      0|			q[1] = p[1] * nalpha; \
  |  |  |  |  109|      0|			q[2] = p[2] * nalpha; \
  |  |  |  |  110|      0|			q[3] = alpha; \
  |  |  |  |  111|      0|\
  |  |  |  |  112|      0|			p += 4; \
  |  |  |  |  113|      0|			q += 4; \
  |  |  |  |  114|      0|		} \
  |  |  |  |  115|      0|	}
  |  |  ------------------
  |  |  121|      0|		} \
  |  |  122|      0|		else { \
  |  |  123|      0|			PRE_MANY(IN, OUT); \
  |  |  ------------------
  |  |  |  |   77|      0|	{ \
  |  |  |  |   78|      0|		IN *restrict p = (IN *) in; \
  |  |  |  |   79|      0|		OUT *restrict q = (OUT *) out; \
  |  |  |  |   80|      0|\
  |  |  |  |   81|      0|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (81:15): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   82|      0|			IN alpha = p[bands - 1]; \
  |  |  |  |   83|      0|			IN clip_alpha = 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]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   84|      0|			OUT nalpha = (OUT) clip_alpha / max_alpha; \
  |  |  |  |   85|      0|\
  |  |  |  |   86|      0|			for (i = 0; i < bands - 1; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (86:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   87|      0|				q[i] = p[i] * nalpha; \
  |  |  |  |   88|      0|			q[i] = alpha; \
  |  |  |  |   89|      0|\
  |  |  |  |   90|      0|			p += bands; \
  |  |  |  |   91|      0|			q += bands; \
  |  |  |  |   92|      0|		} \
  |  |  |  |   93|      0|	}
  |  |  ------------------
  |  |  124|      0|		} \
  |  |  125|      0|	}
  ------------------
  180|      0|			break;
  181|       |
  182|      0|		case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (182:3): [True: 0, False: 128k]
  ------------------
  183|      0|		case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (183:3): [True: 0, False: 128k]
  ------------------
  184|      0|		default:
  ------------------
  |  Branch (184:3): [True: 0, False: 128k]
  ------------------
  185|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  186|   128k|		}
  187|   128k|	}
  188|       |
  189|  2.07k|	return 0;
  190|  2.07k|}

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|}

vips_rot:
  407|  19.0k|{
  408|  19.0k|	va_list ap;
  409|  19.0k|	int result;
  410|       |
  411|  19.0k|	va_start(ap, angle);
  412|  19.0k|	result = vips_rotv(in, out, angle, ap);
  413|  19.0k|	va_end(ap);
  414|       |
  415|  19.0k|	return result;
  416|  19.0k|}
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|}
rot.c:vips_rot_build:
  287|  19.0k|{
  288|  19.0k|	VipsConversion *conversion = VIPS_CONVERSION(object);
  ------------------
  |  |   40|  19.0k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  19.0k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  19.0k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  19.0k|		VIPS_TYPE_CONVERSION, VipsConversion))
  ------------------
  289|  19.0k|	VipsRot *rot = (VipsRot *) object;
  290|       |
  291|  19.0k|	VipsGenerateFn generate_fn;
  292|  19.0k|	VipsDemandStyle hint;
  293|       |
  294|  19.0k|	if (VIPS_OBJECT_CLASS(vips_rot_parent_class)->build(object))
  ------------------
  |  |  435|  19.0k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  19.0k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  19.0k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (294:6): [True: 0, False: 19.0k]
  ------------------
  295|      0|		return -1;
  296|       |
  297|  19.0k|	if (rot->angle == VIPS_ANGLE_D0)
  ------------------
  |  Branch (297:6): [True: 0, False: 19.0k]
  ------------------
  298|      0|		return vips_image_write(rot->in, conversion->out);
  299|       |
  300|  19.0k|	if (vips_image_pio_input(rot->in))
  ------------------
  |  Branch (300:6): [True: 0, False: 19.0k]
  ------------------
  301|      0|		return -1;
  302|       |
  303|  19.0k|	hint = rot->angle == VIPS_ANGLE_D180
  ------------------
  |  Branch (303:9): [True: 0, False: 19.0k]
  ------------------
  304|  19.0k|		? VIPS_DEMAND_STYLE_THINSTRIP
  305|  19.0k|		: VIPS_DEMAND_STYLE_SMALLTILE;
  306|       |
  307|  19.0k|	if (vips_image_pipelinev(conversion->out, hint, rot->in, NULL))
  ------------------
  |  Branch (307:6): [True: 0, False: 19.0k]
  ------------------
  308|      0|		return -1;
  309|       |
  310|  19.0k|	switch (rot->angle) {
  311|  19.0k|	case VIPS_ANGLE_D90:
  ------------------
  |  Branch (311:2): [True: 19.0k, False: 0]
  ------------------
  312|  19.0k|		generate_fn = vips_rot90_gen;
  313|  19.0k|		conversion->out->Xsize = rot->in->Ysize;
  314|  19.0k|		conversion->out->Ysize = rot->in->Xsize;
  315|  19.0k|		conversion->out->Xoffset = rot->in->Ysize;
  316|  19.0k|		conversion->out->Yoffset = 0;
  317|  19.0k|		break;
  318|       |
  319|      0|	case VIPS_ANGLE_D180:
  ------------------
  |  Branch (319:2): [True: 0, False: 19.0k]
  ------------------
  320|      0|		generate_fn = vips_rot180_gen;
  321|      0|		conversion->out->Xoffset = rot->in->Xsize;
  322|      0|		conversion->out->Yoffset = rot->in->Ysize;
  323|      0|		break;
  324|       |
  325|      0|	case VIPS_ANGLE_D270:
  ------------------
  |  Branch (325:2): [True: 0, False: 19.0k]
  ------------------
  326|      0|		generate_fn = vips_rot270_gen;
  327|      0|		conversion->out->Xsize = rot->in->Ysize;
  328|      0|		conversion->out->Ysize = rot->in->Xsize;
  329|      0|		conversion->out->Xoffset = 0;
  330|      0|		conversion->out->Yoffset = rot->in->Xsize;
  331|      0|		break;
  332|       |
  333|      0|	default:
  ------------------
  |  Branch (333:2): [True: 0, False: 19.0k]
  ------------------
  334|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  335|       |
  336|       |		/* Stop compiler warnings.
  337|       |		 */
  338|      0|		generate_fn = NULL;
  339|  19.0k|	}
  340|       |
  341|  19.0k|	if (vips_image_generate(conversion->out,
  ------------------
  |  Branch (341:6): [True: 0, False: 19.0k]
  ------------------
  342|  19.0k|			vips_start_one, generate_fn, vips_stop_one,
  343|  19.0k|			rot->in, rot))
  344|      0|		return -1;
  345|       |
  346|  19.0k|	return 0;
  347|  19.0k|}
rot.c:vips_rot90_gen:
  101|  19.0k|{
  102|  19.0k|	VipsRegion *ir = (VipsRegion *) seq;
  103|  19.0k|	VipsImage *in = (VipsImage *) a;
  104|       |
  105|       |	/* Output area.
  106|       |	 */
  107|  19.0k|	VipsRect *r = &out_region->valid;
  108|  19.0k|	int le = r->left;
  109|  19.0k|	int ri = VIPS_RECT_RIGHT(r);
  ------------------
  |  |   48|  19.0k|#define VIPS_RECT_RIGHT(R) ((R)->left + (R)->width)
  ------------------
  110|  19.0k|	int to = r->top;
  111|  19.0k|	int bo = VIPS_RECT_BOTTOM(r);
  ------------------
  |  |   49|  19.0k|#define VIPS_RECT_BOTTOM(R) ((R)->top + (R)->height)
  ------------------
  112|       |
  113|  19.0k|	int x, y, i;
  114|       |
  115|       |	/* Pixel geometry.
  116|       |	 */
  117|  19.0k|	int ps, ls;
  118|       |
  119|       |	/* Find the area of the input image we need.
  120|       |	 */
  121|  19.0k|	VipsRect need;
  122|       |
  123|  19.0k|	need.left = to;
  124|  19.0k|	need.top = in->Ysize - ri;
  125|  19.0k|	need.width = r->height;
  126|  19.0k|	need.height = r->width;
  127|  19.0k|	if (vips_region_prepare(ir, &need))
  ------------------
  |  Branch (127:6): [True: 0, False: 19.0k]
  ------------------
  128|      0|		return -1;
  129|       |
  130|       |	/* Find PEL size and line skip for ir.
  131|       |	 */
  132|  19.0k|	ps = VIPS_IMAGE_SIZEOF_PEL(in);
  ------------------
  |  |  384|  19.0k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|  19.0k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  133|  19.0k|	ls = VIPS_REGION_LSKIP(ir);
  ------------------
  |  |  195|  19.0k|	((size_t) ((R)->bpl))
  ------------------
  134|       |
  135|       |	/* Rotate the bit we now have.
  136|       |	 */
  137|   223k|	for (y = to; y < bo; y++) {
  ------------------
  |  Branch (137:15): [True: 204k, False: 19.0k]
  ------------------
  138|       |		/* Start of this output line.
  139|       |		 */
  140|   204k|		VipsPel *q = VIPS_REGION_ADDR(out_region, le, y);
  ------------------
  |  |  227|   204k|	((R)->data + \
  |  |  228|   204k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   204k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   204k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   204k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   204k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   204k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  141|       |
  142|       |		/* Corresponding position in ir.
  143|       |		 */
  144|   204k|		VipsPel *p = VIPS_REGION_ADDR(ir,
  ------------------
  |  |  227|   204k|	((R)->data + \
  |  |  228|   204k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   204k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   204k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   204k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   204k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   204k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  145|   204k|			need.left + y - to,
  146|   204k|			need.top + need.height - 1);
  147|       |
  148|   408k|		for (x = le; x < ri; x++) {
  ------------------
  |  Branch (148:16): [True: 204k, False: 204k]
  ------------------
  149|  1.83M|			for (i = 0; i < ps; i++)
  ------------------
  |  Branch (149:16): [True: 1.63M, False: 204k]
  ------------------
  150|  1.63M|				q[i] = p[i];
  151|       |
  152|   204k|			q += ps;
  153|   204k|			p -= ls;
  154|   204k|		}
  155|   204k|	}
  156|       |
  157|  19.0k|	return 0;
  158|  19.0k|}
rot.c:vips_rot_init:
  380|  19.0k|{
  381|  19.0k|}
rot.c:vips_rotv:
  385|  19.0k|{
  386|  19.0k|	return vips_call_split("rot", ap, in, out, angle);
  387|  19.0k|}

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|  15.6k|{
  304|  15.6k|	va_list ap;
  305|  15.6k|	int result;
  306|       |
  307|  15.6k|	va_start(ap, out);
  308|  15.6k|	result = vips_call_split("sequential", ap, in, out);
  309|  15.6k|	va_end(ap);
  310|       |
  311|  15.6k|	return result;
  312|  15.6k|}
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|  15.6k|{
  107|  15.6k|	VipsSequential *sequential = (VipsSequential *) gobject;
  108|       |
  109|  15.6k|	VIPS_FREEF(vips_g_mutex_free, sequential->lock);
  ------------------
  |  |   41|  15.6k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  15.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  15.6k|	{ \
  |  |   43|  15.6k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 15.6k, False: 0]
  |  |  ------------------
  |  |   44|  15.6k|			(void) F((S)); \
  |  |   45|  15.6k|			(S) = 0; \
  |  |   46|  15.6k|		} \
  |  |   47|  15.6k|	} \
  |  |   48|  15.6k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  15.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  110|       |
  111|  15.6k|	G_OBJECT_CLASS(vips_sequential_parent_class)->dispose(gobject);
  ------------------
  |  |   58|  15.6k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  15.6k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  15.6k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  112|  15.6k|}
sequential.c:vips_sequential_build:
  188|  15.6k|{
  189|  15.6k|	VipsConversion *conversion = VIPS_CONVERSION(object);
  ------------------
  |  |   40|  15.6k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  15.6k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  15.6k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  15.6k|		VIPS_TYPE_CONVERSION, VipsConversion))
  ------------------
  190|  15.6k|	VipsSequential *sequential = (VipsSequential *) object;
  191|       |
  192|  15.6k|	VipsImage *t;
  193|       |
  194|  15.6k|	VIPS_DEBUG_MSG("vips_sequential_build\n");
  ------------------
  |  |   47|  15.6k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  15.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  15.6k|	{ \
  |  |   49|  15.6k|		; \
  |  |   50|  15.6k|	} \
  |  |   51|  15.6k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  15.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  195|       |
  196|  15.6k|	if (VIPS_OBJECT_CLASS(vips_sequential_parent_class)->build(object))
  ------------------
  |  |  435|  15.6k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  15.6k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  15.6k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (196:6): [True: 0, False: 15.6k]
  ------------------
  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|  15.6k|	if (vips_linecache(sequential->in, &t,
  ------------------
  |  Branch (207:6): [True: 0, False: 15.6k]
  ------------------
  208|  15.6k|			"tile_height", sequential->tile_height,
  209|  15.6k|			"access", VIPS_ACCESS_SEQUENTIAL,
  210|  15.6k|			NULL))
  211|      0|		return -1;
  212|       |
  213|  15.6k|	vips_object_local(object, t);
  ------------------
  |  |  698|  15.6k|	(g_signal_connect(V, "close", G_CALLBACK(vips_object_local_cb), G))
  |  |  ------------------
  |  |  |  |  491|  15.6k|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  |  |  ------------------
  ------------------
  214|       |
  215|  15.6k|	if (vips_image_pipelinev(conversion->out,
  ------------------
  |  Branch (215:6): [True: 0, False: 15.6k]
  ------------------
  216|  15.6k|			VIPS_DEMAND_STYLE_THINSTRIP, t, NULL))
  217|      0|		return -1;
  218|  15.6k|	if (vips_image_generate(conversion->out,
  ------------------
  |  Branch (218:6): [True: 0, False: 15.6k]
  ------------------
  219|  15.6k|			vips_start_one, vips_sequential_generate, vips_stop_one,
  220|  15.6k|			t, sequential))
  221|      0|		return -1;
  222|       |
  223|  15.6k|	return 0;
  224|  15.6k|}
sequential.c:vips_sequential_generate:
  117|  39.6k|{
  118|  39.6k|	VipsSequential *sequential = (VipsSequential *) b;
  119|  39.6k|	VipsRect *r = &out_region->valid;
  120|  39.6k|	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|  39.6k|	VIPS_GATE_START("vips_sequential_generate: wait");
  ------------------
  |  |   41|  39.6k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  39.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  39.6k|	{ \
  |  |   43|  39.6k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 39.6k]
  |  |  ------------------
  |  |   44|  39.6k|			vips__thread_gate_start(NAME); \
  |  |   45|  39.6k|	} \
  |  |   46|  39.6k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  39.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  128|       |
  129|  39.6k|	vips__worker_lock(sequential->lock);
  130|       |
  131|  39.6k|	VIPS_GATE_STOP("vips_sequential_generate: wait");
  ------------------
  |  |   49|  39.6k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  39.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  39.6k|	{ \
  |  |   51|  39.6k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 39.6k]
  |  |  ------------------
  |  |   52|  39.6k|			vips__thread_gate_stop(NAME); \
  |  |   53|  39.6k|	} \
  |  |   54|  39.6k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  39.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  132|       |
  133|       |	/* If we've seen an error, everything must stop.
  134|       |	 */
  135|  39.6k|	if (sequential->error) {
  ------------------
  |  Branch (135:6): [True: 0, False: 39.6k]
  ------------------
  136|      0|		g_mutex_unlock(sequential->lock);
  137|      0|		return -1;
  138|      0|	}
  139|       |
  140|  39.6k|	if (r->top > sequential->y_pos) {
  ------------------
  |  Branch (140:6): [True: 0, False: 39.6k]
  ------------------
  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|  39.6k|	if (vips_region_prepare(ir, r) ||
  ------------------
  |  Branch (172:6): [True: 9.17k, False: 30.4k]
  ------------------
  173|  39.6k|		vips_region_region(out_region, ir, r, r->left, r->top)) {
  ------------------
  |  Branch (173:3): [True: 0, False: 30.4k]
  ------------------
  174|  9.17k|		sequential->error = -1;
  175|  9.17k|		g_mutex_unlock(sequential->lock);
  176|  9.17k|		return -1;
  177|  9.17k|	}
  178|       |
  179|  30.4k|	sequential->y_pos = VIPS_MAX(sequential->y_pos, VIPS_RECT_BOTTOM(r));
  ------------------
  |  |   54|  30.4k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 30.4k]
  |  |  ------------------
  ------------------
  180|       |
  181|  30.4k|	g_mutex_unlock(sequential->lock);
  182|       |
  183|  30.4k|	return 0;
  184|  39.6k|}
sequential.c:vips_sequential_init:
  272|  15.6k|{
  273|  15.6k|	sequential->lock = vips_g_mutex_new();
  274|  15.6k|	sequential->tile_height = 1;
  275|  15.6k|	sequential->error = 0;
  276|  15.6k|	sequential->trace = FALSE;
  ------------------
  |  |  794|  15.6k|#define	FALSE	(0)
  ------------------
  277|  15.6k|}

vips_smartcrop:
  517|  19.3k|{
  518|  19.3k|	va_list ap;
  519|  19.3k|	int result;
  520|       |
  521|  19.3k|	va_start(ap, height);
  522|  19.3k|	result = vips_call_split("smartcrop", ap, in, out, width, height);
  523|  19.3k|	va_end(ap);
  524|       |
  525|  19.3k|	return result;
  526|  19.3k|}
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|}
smartcrop.c:vips_smartcrop_build:
  322|  19.3k|{
  323|  19.3k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  19.3k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  19.3k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  19.3k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  324|  19.3k|	VipsConversion *conversion = VIPS_CONVERSION(object);
  ------------------
  |  |   40|  19.3k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  19.3k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  19.3k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  19.3k|		VIPS_TYPE_CONVERSION, VipsConversion))
  ------------------
  325|  19.3k|	VipsSmartcrop *smartcrop = (VipsSmartcrop *) object;
  326|  19.3k|	VipsImage **t = (VipsImage **) vips_object_local_array(object, 2);
  327|       |
  328|  19.3k|	VipsImage *in;
  329|  19.3k|	int left;
  330|  19.3k|	int top;
  331|       |
  332|  19.3k|	int attention_x = 0;
  333|  19.3k|	int attention_y = 0;
  334|       |
  335|  19.3k|	if (VIPS_OBJECT_CLASS(vips_smartcrop_parent_class)->build(object))
  ------------------
  |  |  435|  19.3k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  19.3k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  19.3k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (335:6): [True: 0, False: 19.3k]
  ------------------
  336|      0|		return -1;
  337|       |
  338|  19.3k|	if (smartcrop->width > smartcrop->in->Xsize ||
  ------------------
  |  Branch (338:6): [True: 137, False: 19.1k]
  ------------------
  339|  19.3k|		smartcrop->height > smartcrop->in->Ysize ||
  ------------------
  |  Branch (339:3): [True: 84, False: 19.0k]
  ------------------
  340|  19.3k|		smartcrop->width <= 0 || smartcrop->height <= 0) {
  ------------------
  |  Branch (340:3): [True: 0, False: 19.0k]
  |  Branch (340:28): [True: 0, False: 19.0k]
  ------------------
  341|    221|		vips_error(class->nickname, "%s", _("bad extract area"));
  ------------------
  |  |   30|    221|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|    221|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  342|    221|		return -1;
  343|    221|	}
  344|       |
  345|  19.0k|	in = smartcrop->in;
  346|       |
  347|       |	/* If there's an alpha, we have to premultiply before searching for
  348|       |	 * content. There could be stuff in transparent areas which we don't
  349|       |	 * want to consider.
  350|       |	 */
  351|  19.0k|	if (vips_image_hasalpha(in) && !smartcrop->premultiplied) {
  ------------------
  |  Branch (351:6): [True: 4.21k, False: 14.8k]
  |  Branch (351:33): [True: 4.21k, False: 0]
  ------------------
  352|  4.21k|		if (vips_premultiply(in, &t[0], NULL))
  ------------------
  |  Branch (352:7): [True: 0, False: 4.21k]
  ------------------
  353|      0|			return -1;
  354|  4.21k|		in = t[0];
  355|  4.21k|	}
  356|       |
  357|  19.0k|	switch (smartcrop->interesting) {
  358|      0|	case VIPS_INTERESTING_NONE:
  ------------------
  |  Branch (358:2): [True: 0, False: 19.0k]
  ------------------
  359|      0|	case VIPS_INTERESTING_LOW:
  ------------------
  |  Branch (359:2): [True: 0, False: 19.0k]
  ------------------
  360|      0|		left = 0;
  361|      0|		top = 0;
  362|      0|		break;
  363|       |
  364|      0|	case VIPS_INTERESTING_CENTRE:
  ------------------
  |  Branch (364:2): [True: 0, False: 19.0k]
  ------------------
  365|      0|		left = (in->Xsize - smartcrop->width) / 2;
  366|      0|		top = (in->Ysize - smartcrop->height) / 2;
  367|      0|		break;
  368|       |
  369|      0|	case VIPS_INTERESTING_ENTROPY:
  ------------------
  |  Branch (369:2): [True: 0, False: 19.0k]
  ------------------
  370|      0|		if (vips_smartcrop_entropy(smartcrop, in, &left, &top))
  ------------------
  |  Branch (370:7): [True: 0, False: 0]
  ------------------
  371|      0|			return -1;
  372|      0|		break;
  373|       |
  374|  19.0k|	case VIPS_INTERESTING_ATTENTION:
  ------------------
  |  Branch (374:2): [True: 19.0k, False: 0]
  ------------------
  375|  19.0k|		if (vips_smartcrop_attention(smartcrop, in,
  ------------------
  |  Branch (375:7): [True: 11.2k, False: 7.82k]
  ------------------
  376|  19.0k|				&left, &top,
  377|  19.0k|				&attention_x, &attention_y))
  378|  11.2k|			return -1;
  379|  7.82k|		break;
  380|       |
  381|  7.82k|	case VIPS_INTERESTING_HIGH:
  ------------------
  |  Branch (381:2): [True: 0, False: 19.0k]
  ------------------
  382|      0|		left = in->Xsize - smartcrop->width;
  383|      0|		top = in->Ysize - smartcrop->height;
  384|      0|		break;
  385|       |
  386|      0|	case VIPS_INTERESTING_ALL:
  ------------------
  |  Branch (386:2): [True: 0, False: 19.0k]
  ------------------
  387|      0|		left = 0;
  388|      0|		top = 0;
  389|      0|		smartcrop->width = in->Xsize; // FIXME: Invalidates operation cache
  390|      0|		smartcrop->height = in->Ysize; // FIXME: Invalidates operation cache
  391|      0|		break;
  392|       |
  393|      0|	default:
  ------------------
  |  Branch (393:2): [True: 0, False: 19.0k]
  ------------------
  394|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  395|       |
  396|       |		/* Stop a compiler warning.
  397|       |		 */
  398|      0|		left = 0;
  399|      0|		top = 0;
  400|      0|		break;
  401|  19.0k|	}
  402|       |
  403|  7.82k|	g_object_set(smartcrop,
  404|  7.82k|		"attention_x", attention_x,
  405|  7.82k|		"attention_y", attention_y,
  406|  7.82k|		NULL);
  407|       |
  408|  7.82k|	if (vips_extract_area(smartcrop->in, &t[1],
  ------------------
  |  Branch (408:6): [True: 0, False: 7.82k]
  ------------------
  409|  7.82k|			left, top,
  410|  7.82k|			smartcrop->width, smartcrop->height, NULL) ||
  411|  7.82k|		vips_image_write(t[1], conversion->out))
  ------------------
  |  Branch (411:3): [True: 0, False: 7.82k]
  ------------------
  412|      0|		return -1;
  413|       |
  414|  7.82k|	return 0;
  415|  7.82k|}
smartcrop.c:vips_smartcrop_attention:
  205|  19.0k|{
  206|       |	/* From smartcrop.js.
  207|       |	 */
  208|  19.0k|	static double skin_vector[] = { -0.78, -0.57, -0.44 };
  209|  19.0k|	static double ones[] = { 1.0, 1.0, 1.0 };
  210|       |
  211|  19.0k|	VipsImage **t = (VipsImage **)
  212|  19.0k|		vips_object_local_array(VIPS_OBJECT(smartcrop), 24);
  ------------------
  |  |  433|  19.0k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  19.0k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  19.0k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  213|       |
  214|  19.0k|	double hscale;
  215|  19.0k|	double vscale;
  216|  19.0k|	double sigma;
  217|  19.0k|	double max;
  218|  19.0k|	int x_pos;
  219|  19.0k|	int y_pos;
  220|       |
  221|       |	/* The size we shrink to gives the precision with which we can place
  222|       |	 * the crop
  223|       |	 */
  224|  19.0k|	hscale = 32.0 / in->Xsize;
  225|  19.0k|	vscale = 32.0 / in->Ysize;
  226|  19.0k|	sigma = sqrt(pow(smartcrop->width * hscale, 2) +
  227|  19.0k|		pow(smartcrop->height * vscale, 2));
  228|  19.0k|	sigma = VIPS_MAX(sigma / 10, 1.0);
  ------------------
  |  |   54|  19.0k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 19.0k, False: 0]
  |  |  ------------------
  ------------------
  229|       |
  230|  19.0k|	if (vips_resize(in, &t[17], hscale,
  ------------------
  |  Branch (230:6): [True: 0, False: 19.0k]
  ------------------
  231|  19.0k|			"vscale", vscale,
  232|  19.0k|			NULL))
  233|      0|		return -1;
  234|       |
  235|       |	/* Simple edge detect.
  236|       |	 */
  237|  19.0k|	if (!(t[21] = vips_image_new_matrixv(3, 3,
  ------------------
  |  Branch (237:6): [True: 0, False: 19.0k]
  ------------------
  238|  19.0k|			  0.0, -1.0, 0.0,
  239|  19.0k|			  -1.0, 4.0, -1.0,
  240|  19.0k|			  0.0, -1.0, 0.0)))
  241|      0|		return -1;
  242|       |
  243|       |	/* Convert to XYZ and just use the first three bands.
  244|       |	 */
  245|  19.0k|	if (vips_colourspace(t[17], &t[0], VIPS_INTERPRETATION_XYZ, NULL) ||
  ------------------
  |  Branch (245:6): [True: 6, False: 19.0k]
  ------------------
  246|  19.0k|		vips_extract_band(t[0], &t[1], 0, "n", 3, NULL))
  ------------------
  |  Branch (246:3): [True: 0, False: 19.0k]
  ------------------
  247|      6|		return -1;
  248|       |
  249|       |	/* Edge detect on Y.
  250|       |	 */
  251|  19.0k|	if (vips_extract_band(t[1], &t[2], 1, NULL) ||
  ------------------
  |  Branch (251:6): [True: 0, False: 19.0k]
  ------------------
  252|  19.0k|		vips_conv(t[2], &t[3], t[21],
  ------------------
  |  Branch (252:3): [True: 0, False: 19.0k]
  ------------------
  253|  19.0k|			"precision", VIPS_PRECISION_INTEGER,
  254|  19.0k|			NULL) ||
  255|  19.0k|		vips_linear1(t[3], &t[4], 5.0, 0.0, NULL) ||
  ------------------
  |  Branch (255:3): [True: 0, False: 19.0k]
  ------------------
  256|  19.0k|		vips_abs(t[4], &t[14], NULL))
  ------------------
  |  Branch (256:3): [True: 0, False: 19.0k]
  ------------------
  257|      0|		return -1;
  258|       |
  259|       |	/* Look for skin colours. Taken from smartcrop.js.
  260|       |	 */
  261|  19.0k|	if (
  262|       |		/* Normalise to magnitude of colour in XYZ.
  263|       |		 */
  264|  19.0k|		pythagoras(smartcrop, t[1], &t[5]) ||
  ------------------
  |  Branch (264:3): [True: 0, False: 19.0k]
  ------------------
  265|  19.0k|		vips_divide(t[1], t[5], &t[6], NULL) ||
  ------------------
  |  Branch (265:3): [True: 0, False: 19.0k]
  ------------------
  266|       |
  267|       |		/* Distance from skin point.
  268|       |		 */
  269|  19.0k|		vips_linear(t[6], &t[7], ones, skin_vector, 3, NULL) ||
  ------------------
  |  Branch (269:3): [True: 0, False: 19.0k]
  ------------------
  270|  19.0k|		pythagoras(smartcrop, t[7], &t[8]) ||
  ------------------
  |  Branch (270:3): [True: 0, False: 19.0k]
  ------------------
  271|       |
  272|       |		/* Rescale to 100 - 0 score.
  273|       |		 */
  274|  19.0k|		vips_linear1(t[8], &t[9], -100.0, 100.0, NULL) ||
  ------------------
  |  Branch (274:3): [True: 0, False: 19.0k]
  ------------------
  275|       |
  276|       |		/* Ignore dark areas.
  277|       |		 */
  278|  19.0k|		vips_more_const1(t[2], &t[10], 5.0, NULL) ||
  ------------------
  |  Branch (278:3): [True: 0, False: 19.0k]
  ------------------
  279|  19.0k|		!(t[11] = vips_image_new_from_image1(t[10], 0.0)) ||
  ------------------
  |  Branch (279:3): [True: 0, False: 19.0k]
  ------------------
  280|  19.0k|		vips_ifthenelse(t[10], t[9], t[11], &t[15], NULL))
  ------------------
  |  Branch (280:3): [True: 0, False: 19.0k]
  ------------------
  281|      0|		return -1;
  282|       |
  283|       |	/* Look for saturated areas.
  284|       |	 */
  285|  19.0k|	if (vips_colourspace(t[1], &t[12],
  ------------------
  |  Branch (285:6): [True: 0, False: 19.0k]
  ------------------
  286|  19.0k|			VIPS_INTERPRETATION_LAB, NULL) ||
  287|  19.0k|		vips_extract_band(t[12], &t[13], 1, NULL) ||
  ------------------
  |  Branch (287:3): [True: 0, False: 19.0k]
  ------------------
  288|  19.0k|		vips_ifthenelse(t[10], t[13], t[11], &t[16], NULL))
  ------------------
  |  Branch (288:3): [True: 0, False: 19.0k]
  ------------------
  289|      0|		return -1;
  290|       |
  291|       |	/* Sum, blur and find maxpos.
  292|       |	 *
  293|       |	 * The amount of blur is related to the size of the crop
  294|       |	 * area: how large an area we want to consider for the scoring
  295|       |	 * function.
  296|       |	 */
  297|       |
  298|  19.0k|	if (vips_sum(&t[14], &t[18], 3, NULL) ||
  ------------------
  |  Branch (298:6): [True: 0, False: 19.0k]
  ------------------
  299|  19.0k|		vips_gaussblur(t[18], &t[19], sigma, NULL) ||
  ------------------
  |  Branch (299:3): [True: 0, False: 19.0k]
  ------------------
  300|  19.0k|		vips_max(t[19], &max, "x", &x_pos, "y", &y_pos, NULL))
  ------------------
  |  Branch (300:3): [True: 11.2k, False: 7.82k]
  ------------------
  301|  11.2k|		return -1;
  302|       |
  303|       |	/* Transform back into image coordinates.
  304|       |	 */
  305|  7.82k|	*attention_x = x_pos / hscale;
  306|  7.82k|	*attention_y = y_pos / vscale;
  307|       |
  308|       |	/* Centre the crop over the max.
  309|       |	 */
  310|  7.82k|	*left = VIPS_CLIP(0,
  ------------------
  |  |   57|  7.82k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|  15.6k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 4.31k, False: 3.50k]
  |  |  |  |  |  Branch (54:32): [True: 1.37k, False: 6.45k]
  |  |  |  |  |  Branch (54:44): [True: 1.37k, False: 2.13k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  311|  7.82k|		*attention_x - smartcrop->width / 2,
  312|  7.82k|		in->Xsize - smartcrop->width);
  313|  7.82k|	*top = VIPS_CLIP(0,
  ------------------
  |  |   57|  7.82k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|  15.6k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 5.07k, False: 2.75k]
  |  |  |  |  |  Branch (54:32): [True: 957, False: 6.87k]
  |  |  |  |  |  Branch (54:44): [True: 957, False: 1.80k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  314|  7.82k|		*attention_y - smartcrop->height / 2,
  315|  7.82k|		in->Ysize - smartcrop->height);
  316|       |
  317|  7.82k|	return 0;
  318|  19.0k|}
smartcrop.c:pythagoras:
  180|  38.1k|{
  181|  38.1k|	VipsImage **t = (VipsImage **)
  182|  38.1k|		vips_object_local_array(VIPS_OBJECT(smartcrop),
  ------------------
  |  |  433|  38.1k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  38.1k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  38.1k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  183|  38.1k|			2 * in->Bands + 1);
  184|       |
  185|  38.1k|	int i;
  186|       |
  187|   152k|	for (i = 0; i < in->Bands; i++)
  ------------------
  |  Branch (187:14): [True: 114k, False: 38.1k]
  ------------------
  188|   114k|		if (vips_extract_band(in, &t[i], i, NULL))
  ------------------
  |  Branch (188:7): [True: 0, False: 114k]
  ------------------
  189|      0|			return -1;
  190|       |
  191|   152k|	for (i = 0; i < in->Bands; i++)
  ------------------
  |  Branch (191:14): [True: 114k, False: 38.1k]
  ------------------
  192|   114k|		if (vips_multiply(t[i], t[i], &t[i + in->Bands], NULL))
  ------------------
  |  Branch (192:7): [True: 0, False: 114k]
  ------------------
  193|      0|			return -1;
  194|       |
  195|  38.1k|	if (vips_sum(&t[in->Bands], &t[2 * in->Bands], in->Bands, NULL) ||
  ------------------
  |  Branch (195:6): [True: 0, False: 38.1k]
  ------------------
  196|  38.1k|		vips_pow_const1(t[2 * in->Bands], out, 0.5, NULL))
  ------------------
  |  Branch (196:3): [True: 0, False: 38.1k]
  ------------------
  197|      0|		return -1;
  198|       |
  199|  38.1k|	return 0;
  200|  38.1k|}
smartcrop.c:vips_smartcrop_init:
  483|  19.3k|{
  484|  19.3k|	smartcrop->interesting = VIPS_INTERESTING_ATTENTION;
  485|  19.3k|	smartcrop->premultiplied = FALSE;
  ------------------
  |  |  794|  19.3k|#define	FALSE	(0)
  ------------------
  486|  19.3k|}

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|  1.57k|{
  865|  1.57k|	va_list ap;
  866|  1.57k|	int result;
  867|       |
  868|  1.57k|	va_start(ap, out);
  869|  1.57k|	result = vips_call_split("tilecache", ap, in, out);
  870|  1.57k|	va_end(ap);
  871|       |
  872|  1.57k|	return result;
  873|  1.57k|}
vips_linecache:
 1031|  15.6k|{
 1032|  15.6k|	va_list ap;
 1033|  15.6k|	int result;
 1034|       |
 1035|  15.6k|	va_start(ap, out);
 1036|  15.6k|	result = vips_call_split("linecache", ap, in, out);
 1037|  15.6k|	va_end(ap);
 1038|       |
 1039|  15.6k|	return result;
 1040|  15.6k|}
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|  17.1k|{
  158|  17.1k|	VipsBlockCache *cache = (VipsBlockCache *) gobject;
  159|       |
  160|  17.1k|	vips_block_cache_drop_all(cache);
  161|  17.1k|	VIPS_FREEF(vips_g_mutex_free, cache->lock);
  ------------------
  |  |   41|  17.1k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  17.1k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  17.1k|	{ \
  |  |   43|  17.1k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 17.1k, False: 0]
  |  |  ------------------
  |  |   44|  17.1k|			(void) F((S)); \
  |  |   45|  17.1k|			(S) = 0; \
  |  |   46|  17.1k|		} \
  |  |   47|  17.1k|	} \
  |  |   48|  17.1k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  17.1k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  162|  17.1k|	VIPS_FREEF(vips_g_cond_free, cache->new_tile);
  ------------------
  |  |   41|  17.1k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  17.1k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  17.1k|	{ \
  |  |   43|  17.1k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 17.1k, False: 0]
  |  |  ------------------
  |  |   44|  17.1k|			(void) F((S)); \
  |  |   45|  17.1k|			(S) = 0; \
  |  |   46|  17.1k|		} \
  |  |   47|  17.1k|	} \
  |  |   48|  17.1k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  17.1k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  163|       |
  164|  17.1k|	if (cache->tiles)
  ------------------
  |  Branch (164:6): [True: 17.1k, False: 0]
  ------------------
  165|  17.1k|		g_assert(g_hash_table_size(cache->tiles) == 0);
  ------------------
  |  |  166|  17.1k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  17.1k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  17.1k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  166|  17.1k|	VIPS_FREEF(g_hash_table_destroy, cache->tiles);
  ------------------
  |  |   41|  17.1k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  17.1k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  17.1k|	{ \
  |  |   43|  17.1k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 17.1k, False: 0]
  |  |  ------------------
  |  |   44|  17.1k|			(void) F((S)); \
  |  |   45|  17.1k|			(S) = 0; \
  |  |   46|  17.1k|		} \
  |  |   47|  17.1k|	} \
  |  |   48|  17.1k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  17.1k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  167|  17.1k|	VIPS_FREEF(g_queue_free, cache->recycle);
  ------------------
  |  |   41|  17.1k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  17.1k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  17.1k|	{ \
  |  |   43|  17.1k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 17.1k, False: 0]
  |  |  ------------------
  |  |   44|  17.1k|			(void) F((S)); \
  |  |   45|  17.1k|			(S) = 0; \
  |  |   46|  17.1k|		} \
  |  |   47|  17.1k|	} \
  |  |   48|  17.1k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  17.1k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  168|       |
  169|  17.1k|	G_OBJECT_CLASS(vips_block_cache_parent_class)->dispose(gobject);
  ------------------
  |  |   58|  17.1k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  17.1k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  17.1k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  170|  17.1k|}
tilecache.c:vips_block_cache_drop_all:
  147|  17.1k|{
  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|  17.1k|	g_hash_table_remove_all(cache->tiles);
  153|  17.1k|}
tilecache.c:vips_block_cache_build:
  357|  17.1k|{
  358|  17.1k|	VipsConversion *conversion = VIPS_CONVERSION(object);
  ------------------
  |  |   40|  17.1k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  17.1k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  17.1k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  17.1k|		VIPS_TYPE_CONVERSION, VipsConversion))
  ------------------
  359|  17.1k|	VipsBlockCache *cache = (VipsBlockCache *) object;
  360|       |
  361|  17.1k|	VIPS_DEBUG_MSG("vips_block_cache_build:\n");
  ------------------
  |  |   47|  17.1k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  17.1k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  17.1k|	{ \
  |  |   49|  17.1k|		; \
  |  |   50|  17.1k|	} \
  |  |   51|  17.1k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  17.1k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  362|       |
  363|  17.1k|	if (VIPS_OBJECT_CLASS(vips_block_cache_parent_class)->build(object))
  ------------------
  |  |  435|  17.1k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  17.1k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  17.1k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (363:6): [True: 0, False: 17.1k]
  ------------------
  364|      0|		return -1;
  365|       |
  366|  17.1k|	VIPS_DEBUG_MSG("vips_block_cache_build: max size = %g MB\n",
  ------------------
  |  |   47|  17.1k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  17.1k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  17.1k|	{ \
  |  |   49|  17.1k|		; \
  |  |   50|  17.1k|	} \
  |  |   51|  17.1k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  17.1k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  367|  17.1k|		(cache->max_tiles * cache->tile_width * cache->tile_height *
  368|  17.1k|			VIPS_IMAGE_SIZEOF_PEL(cache->in)) /
  369|  17.1k|			(1024 * 1024.0));
  370|       |
  371|  17.1k|	if (!cache->persistent)
  ------------------
  |  Branch (371:6): [True: 17.1k, False: 0]
  ------------------
  372|  17.1k|		g_signal_connect(conversion->out, "minimise",
  ------------------
  |  |  491|  17.1k|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  373|  17.1k|			G_CALLBACK(vips_block_cache_minimise), cache);
  374|       |
  375|  17.1k|	return 0;
  376|  17.1k|}
tilecache.c:vips_block_cache_minimise:
  342|  37.2k|{
  343|  37.2k|	VIPS_DEBUG_MSG("vips_block_cache_minimise:\n");
  ------------------
  |  |   47|  37.2k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  37.2k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  37.2k|	{ \
  |  |   49|  37.2k|		; \
  |  |   50|  37.2k|	} \
  |  |   51|  37.2k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  37.2k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  344|       |
  345|  37.2k|	g_mutex_lock(cache->lock);
  346|       |
  347|       |	/* We can't drop tiles that are in use.
  348|       |	 */
  349|  37.2k|	g_hash_table_foreach_remove(cache->tiles,
  350|  37.2k|		vips_tile_unlocked, NULL);
  351|       |
  352|  37.2k|	g_mutex_unlock(cache->lock);
  353|  37.2k|}
tilecache.c:vips_tile_unlocked:
  334|   209k|{
  335|   209k|	VipsTile *tile = (VipsTile *) value;
  336|       |
  337|   209k|	return !tile->ref_count;
  338|   209k|}
tilecache.c:vips_block_cache_init:
  476|  17.1k|{
  477|  17.1k|	cache->tile_width = 128;
  478|  17.1k|	cache->tile_height = 128;
  479|  17.1k|	cache->max_tiles = 1000;
  480|  17.1k|	cache->access = VIPS_ACCESS_RANDOM;
  481|  17.1k|	cache->threaded = FALSE;
  ------------------
  |  |  794|  17.1k|#define	FALSE	(0)
  ------------------
  482|  17.1k|	cache->persistent = FALSE;
  ------------------
  |  |  794|  17.1k|#define	FALSE	(0)
  ------------------
  483|       |
  484|  17.1k|	cache->lock = vips_g_mutex_new();
  485|  17.1k|	cache->new_tile = vips_g_cond_new();
  486|  17.1k|	cache->tiles = g_hash_table_new_full(
  487|  17.1k|		(GHashFunc) vips_rect_hash,
  488|  17.1k|		(GEqualFunc) vips_rect_equal,
  489|  17.1k|		NULL,
  490|  17.1k|		(GDestroyNotify) vips_tile_destroy);
  491|  17.1k|	cache->recycle = g_queue_new();
  492|  17.1k|}
tilecache.c:vips_rect_hash:
  434|   428k|{
  435|   428k|	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|   428k|	hash = (guint) pos->left ^ ((guint) pos->top << 16);
  443|       |
  444|   428k|	return hash;
  445|   428k|}
tilecache.c:vips_rect_equal:
  449|  8.94k|{
  450|  8.94k|	return a->left == b->left && a->top == b->top;
  ------------------
  |  Branch (450:9): [True: 8.94k, False: 0]
  |  Branch (450:31): [True: 8.94k, False: 0]
  ------------------
  451|  8.94k|}
tilecache.c:vips_tile_destroy:
  455|   209k|{
  456|   209k|	VipsBlockCache *cache = tile->cache;
  457|       |
  458|   209k|	VIPS_DEBUG_MSG_RED("vips_tile_destroy: tile %d, %d (%p)\n",
  ------------------
  |  |   63|   209k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   209k|#define G_STMT_START  do
  |  |  ------------------
  |  |   64|   209k|	{ \
  |  |   65|   209k|		; \
  |  |   66|   209k|	} \
  |  |   67|   209k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   209k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  459|   209k|		tile->pos.left, tile->pos.top, tile);
  460|       |
  461|       |	/* 0 ref tiles should be on the recycle list.
  462|       |	 */
  463|   209k|	g_assert(tile->ref_count == 0);
  ------------------
  |  |  166|   209k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   209k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   209k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  464|   209k|	g_assert(g_queue_find(tile->cache->recycle, tile));
  ------------------
  |  |  166|   209k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   209k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   209k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  465|   209k|	g_queue_remove(cache->recycle, tile);
  466|       |
  467|   209k|	tile->cache = NULL;
  468|       |
  469|   209k|	VIPS_UNREF(tile->region);
  ------------------
  |  |   57|   209k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|   209k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   209k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|   209k|	{ \
  |  |  |  |   43|   209k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 209k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|   209k|			(void) F((S)); \
  |  |  |  |   45|   209k|			(S) = 0; \
  |  |  |  |   46|   209k|		} \
  |  |  |  |   47|   209k|	} \
  |  |  |  |   48|   209k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   209k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  470|       |
  471|   209k|	g_free(tile);
  472|   209k|}
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|  1.57k|{
  760|  1.57k|	VipsConversion *conversion = VIPS_CONVERSION(object);
  ------------------
  |  |   40|  1.57k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  1.57k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.57k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  1.57k|		VIPS_TYPE_CONVERSION, VipsConversion))
  ------------------
  761|  1.57k|	VipsBlockCache *block_cache = (VipsBlockCache *) object;
  762|  1.57k|	VipsTileCache *cache = (VipsTileCache *) object;
  763|       |
  764|  1.57k|	VIPS_DEBUG_MSG("vips_tile_cache_build\n");
  ------------------
  |  |   47|  1.57k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.57k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  1.57k|	{ \
  |  |   49|  1.57k|		; \
  |  |   50|  1.57k|	} \
  |  |   51|  1.57k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.57k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  765|       |
  766|  1.57k|	if (VIPS_OBJECT_CLASS(vips_tile_cache_parent_class)->build(object))
  ------------------
  |  |  435|  1.57k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  1.57k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  1.57k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (766:6): [True: 0, False: 1.57k]
  ------------------
  767|      0|		return -1;
  768|       |
  769|  1.57k|	if (vips_image_pio_input(block_cache->in))
  ------------------
  |  Branch (769:6): [True: 0, False: 1.57k]
  ------------------
  770|      0|		return -1;
  771|       |
  772|  1.57k|	if (vips_image_pipelinev(conversion->out,
  ------------------
  |  Branch (772:6): [True: 0, False: 1.57k]
  ------------------
  773|  1.57k|			VIPS_DEMAND_STYLE_SMALLTILE, block_cache->in, NULL))
  774|      0|		return -1;
  775|       |
  776|  1.57k|	if (vips_image_generate(conversion->out,
  ------------------
  |  Branch (776:6): [True: 0, False: 1.57k]
  ------------------
  777|  1.57k|			vips_start_one, vips_tile_cache_gen, vips_stop_one,
  778|  1.57k|			block_cache->in, cache))
  779|      0|		return -1;
  780|       |
  781|  1.57k|	return 0;
  782|  1.57k|}
tilecache.c:vips_tile_cache_gen:
  604|  42.6k|{
  605|  42.6k|	VipsRegion *in = (VipsRegion *) seq;
  606|  42.6k|	VipsBlockCache *cache = (VipsBlockCache *) b;
  607|  42.6k|	VipsRect *r = &out_region->valid;
  608|       |
  609|  42.6k|	VipsTile *tile;
  610|  42.6k|	GSList *work;
  611|  42.6k|	GSList *p;
  612|  42.6k|	int result;
  613|       |
  614|  42.6k|	result = 0;
  615|       |
  616|  42.6k|	VIPS_GATE_START("vips_tile_cache_gen: wait1");
  ------------------
  |  |   41|  42.6k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  42.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  42.6k|	{ \
  |  |   43|  42.6k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 42.6k]
  |  |  ------------------
  |  |   44|  42.6k|			vips__thread_gate_start(NAME); \
  |  |   45|  42.6k|	} \
  |  |   46|  42.6k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  42.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  617|       |
  618|  42.6k|	vips__worker_lock(cache->lock);
  619|       |
  620|  42.6k|	VIPS_GATE_STOP("vips_tile_cache_gen: wait1");
  ------------------
  |  |   49|  42.6k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  42.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  42.6k|	{ \
  |  |   51|  42.6k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 42.6k]
  |  |  ------------------
  |  |   52|  42.6k|			vips__thread_gate_stop(NAME); \
  |  |   53|  42.6k|	} \
  |  |   54|  42.6k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  42.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  621|       |
  622|  42.6k|	VIPS_DEBUG_MSG_RED(
  ------------------
  |  |   63|  42.6k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  42.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |   64|  42.6k|	{ \
  |  |   65|  42.6k|		; \
  |  |   66|  42.6k|	} \
  |  |   67|  42.6k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  42.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  623|  42.6k|		"vips_tile_cache_gen: "
  624|  42.6k|		"left = %d, top = %d, width = %d, height = %d\n",
  625|  42.6k|		r->left, r->top, r->width, r->height);
  626|       |
  627|       |	/* Ref all the tiles we will need.
  628|       |	 */
  629|  42.6k|	work = vips_tile_cache_ref(cache, r);
  630|       |
  631|   295k|	while (work) {
  ------------------
  |  Branch (631:9): [True: 252k, False: 42.6k]
  ------------------
  632|       |		/* Search for data tiles: easy, we can just paste those in.
  633|       |		 */
  634|   471k|		for (;;) {
  635|  2.22M|			for (p = work; p; p = p->next) {
  ------------------
  |  Branch (635:19): [True: 1.97M, False: 252k]
  ------------------
  636|  1.97M|				tile = (VipsTile *) p->data;
  637|       |
  638|  1.97M|				if (tile->state == VIPS_TILE_STATE_DATA)
  ------------------
  |  Branch (638:9): [True: 218k, False: 1.75M]
  ------------------
  639|   218k|					break;
  640|  1.97M|			}
  641|       |
  642|   471k|			if (!p)
  ------------------
  |  Branch (642:8): [True: 252k, False: 218k]
  ------------------
  643|   252k|				break;
  644|       |
  645|   471k|			VIPS_DEBUG_MSG_RED(
  ------------------
  |  |   63|   218k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   218k|#define G_STMT_START  do
  |  |  ------------------
  |  |   64|   218k|	{ \
  |  |   65|   218k|		; \
  |  |   66|   218k|	} \
  |  |   67|   471k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   471k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  646|   218k|				"vips_tile_cache_gen: pasting %p\n",
  647|   218k|				tile);
  648|       |
  649|   218k|			vips_tile_paste(tile, out_region);
  650|       |
  651|       |			/* We're done with this tile.
  652|       |			 */
  653|   218k|			work = g_slist_remove(work, tile);
  654|   218k|			vips_tile_unref(tile);
  655|   218k|		}
  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|   252k|		for (p = work; p; p = p->next) {
  ------------------
  |  Branch (662:18): [True: 209k, False: 42.6k]
  ------------------
  663|   209k|			tile = (VipsTile *) p->data;
  664|       |
  665|   209k|			if (tile->state == VIPS_TILE_STATE_PEND) {
  ------------------
  |  Branch (665:8): [True: 209k, False: 0]
  ------------------
  666|   209k|				tile->state = VIPS_TILE_STATE_CALC;
  667|       |
  668|   209k|				VIPS_DEBUG_MSG_RED(
  ------------------
  |  |   63|   209k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   209k|#define G_STMT_START  do
  |  |  ------------------
  |  |   64|   209k|	{ \
  |  |   65|   209k|		; \
  |  |   66|   209k|	} \
  |  |   67|   209k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   209k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  669|   209k|					"vips_tile_cache_gen: calc of %p\n",
  670|   209k|					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|   209k|				if (cache->threaded)
  ------------------
  |  Branch (676:9): [True: 40.5k, False: 169k]
  ------------------
  677|  40.5k|					g_mutex_unlock(cache->lock);
  678|       |
  679|       |				/* Don't compute if we've seen an error
  680|       |				 * previously.
  681|       |				 */
  682|   209k|				if (!result)
  ------------------
  |  Branch (682:9): [True: 108k, False: 100k]
  ------------------
  683|   108k|					result = vips_region_prepare_to(in,
  684|   108k|						tile->region,
  685|   108k|						&tile->pos,
  686|   108k|						tile->pos.left, tile->pos.top);
  687|       |
  688|   209k|				if (cache->threaded) {
  ------------------
  |  Branch (688:9): [True: 40.5k, False: 169k]
  ------------------
  689|  40.5k|					VIPS_GATE_START("vips_tile_cache_gen: wait2");
  ------------------
  |  |   41|  40.5k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  40.5k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  40.5k|	{ \
  |  |   43|  40.5k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 40.5k]
  |  |  ------------------
  |  |   44|  40.5k|			vips__thread_gate_start(NAME); \
  |  |   45|  40.5k|	} \
  |  |   46|  40.5k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  40.5k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  690|       |
  691|  40.5k|					g_mutex_lock(cache->lock);
  692|       |
  693|  40.5k|					VIPS_GATE_STOP("vips_tile_cache_gen: wait2");
  ------------------
  |  |   49|  40.5k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  40.5k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  40.5k|	{ \
  |  |   51|  40.5k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 40.5k]
  |  |  ------------------
  |  |   52|  40.5k|			vips__thread_gate_stop(NAME); \
  |  |   53|  40.5k|	} \
  |  |   54|  40.5k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  40.5k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  694|  40.5k|				}
  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|   209k|				if (result) {
  ------------------
  |  Branch (703:9): [True: 110k, False: 99.5k]
  ------------------
  704|   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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  705|   110k|						"vips_tile_cache_gen: error on tile %p\n",
  706|   110k|						tile);
  707|       |
  708|   110k|					g_warning(_("error in tile %d x %d"),
  ------------------
  |  |  338|   110k|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|   110k|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|   110k|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|   110k|                               __VA_ARGS__)
  ------------------
  709|   110k|						tile->pos.left, tile->pos.top);
  710|       |
  711|   110k|					vips_region_black(tile->region);
  712|       |
  713|   110k|					*stop = TRUE;
  ------------------
  |  |  798|   110k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|   110k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  714|   110k|				}
  715|       |
  716|   209k|				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|   209k|				g_cond_broadcast(cache->new_tile);
  722|       |
  723|   209k|				break;
  724|   209k|			}
  725|   209k|		}
  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|   252k|		if (!p &&
  ------------------
  |  Branch (732:7): [True: 42.6k, False: 209k]
  ------------------
  733|   252k|			work) {
  ------------------
  |  Branch (733:4): [True: 0, False: 42.6k]
  ------------------
  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|   252k|	}
  751|       |
  752|  42.6k|	g_mutex_unlock(cache->lock);
  753|       |
  754|  42.6k|	return result;
  755|  42.6k|}
tilecache.c:vips_tile_cache_ref:
  549|  42.6k|{
  550|  42.6k|	const int tw = cache->tile_width;
  551|  42.6k|	const int th = cache->tile_height;
  552|       |
  553|       |	/* Find top left of tiles we need.
  554|       |	 */
  555|  42.6k|	const int xs = (r->left / tw) * tw;
  556|  42.6k|	const int ys = (r->top / th) * th;
  557|       |
  558|  42.6k|	GSList *work;
  559|  42.6k|	VipsTile *tile;
  560|  42.6k|	int x, y;
  561|       |
  562|       |	/* Ref all the tiles we will need.
  563|       |	 */
  564|  42.6k|	work = NULL;
  565|   230k|	for (y = ys; y < VIPS_RECT_BOTTOM(r); y += th)
  ------------------
  |  |   49|   230k|#define VIPS_RECT_BOTTOM(R) ((R)->top + (R)->height)
  ------------------
  |  Branch (565:15): [True: 188k, False: 42.6k]
  ------------------
  566|   406k|		for (x = xs; x < VIPS_RECT_RIGHT(r); x += tw) {
  ------------------
  |  |   48|   406k|#define VIPS_RECT_RIGHT(R) ((R)->left + (R)->width)
  ------------------
  |  Branch (566:16): [True: 218k, False: 188k]
  ------------------
  567|   218k|			if (!(tile = vips_tile_find(cache, x, y))) {
  ------------------
  |  Branch (567:8): [True: 0, False: 218k]
  ------------------
  568|      0|				vips_tile_cache_unref(work);
  569|      0|				return NULL;
  570|      0|			}
  571|       |
  572|   218k|			vips_tile_ref(tile);
  573|       |
  574|       |			/* We must append, since we want to keep tile ordering
  575|       |			 * for sequential sources.
  576|       |			 */
  577|   218k|			work = g_slist_append(work, tile);
  578|       |
  579|   218k|			VIPS_DEBUG_MSG_RED(
  ------------------
  |  |   63|   218k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   218k|#define G_STMT_START  do
  |  |  ------------------
  |  |   64|   218k|	{ \
  |  |   65|   218k|		; \
  |  |   66|   218k|	} \
  |  |   67|   218k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   218k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  580|   218k|				"vips_tile_cache_ref: tile %d, %d (%p)\n",
  581|   218k|				x, y, tile);
  582|   218k|		}
  583|       |
  584|  42.6k|	return work;
  585|  42.6k|}
tilecache.c:vips_tile_find:
  277|   218k|{
  278|   218k|	VipsTile *tile;
  279|       |
  280|       |	/* In cache already?
  281|       |	 */
  282|   218k|	if ((tile = vips_tile_search(cache, x, y))) {
  ------------------
  |  Branch (282:6): [True: 8.94k, False: 209k]
  ------------------
  283|  8.94k|		VIPS_DEBUG_MSG_RED(
  ------------------
  |  |   63|  8.94k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  8.94k|#define G_STMT_START  do
  |  |  ------------------
  |  |   64|  8.94k|	{ \
  |  |   65|  8.94k|		; \
  |  |   66|  8.94k|	} \
  |  |   67|  8.94k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  8.94k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  284|  8.94k|			"vips_tile_find: tile %d x %d in cache\n", x, y);
  285|  8.94k|		return tile;
  286|  8.94k|	}
  287|       |
  288|       |	/* VipsBlockCache not full?
  289|       |	 */
  290|   209k|	if (cache->max_tiles == -1 ||
  ------------------
  |  Branch (290:6): [True: 0, False: 209k]
  ------------------
  291|   209k|		g_hash_table_size(cache->tiles) < cache->max_tiles) {
  ------------------
  |  Branch (291:3): [True: 189k, False: 19.9k]
  ------------------
  292|   189k|		VIPS_DEBUG_MSG_RED(
  ------------------
  |  |   63|   189k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   189k|#define G_STMT_START  do
  |  |  ------------------
  |  |   64|   189k|	{ \
  |  |   65|   189k|		; \
  |  |   66|   189k|	} \
  |  |   67|   189k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   189k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  293|   189k|			"vips_tile_find: making new tile at %d x %d\n", x, y);
  294|   189k|		if (!(tile = vips_tile_new(cache, x, y)))
  ------------------
  |  Branch (294:7): [True: 0, False: 189k]
  ------------------
  295|      0|			return NULL;
  296|       |
  297|   189k|		return tile;
  298|   189k|	}
  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|  19.9k|	if (cache->recycle) {
  ------------------
  |  Branch (303:6): [True: 19.9k, False: 0]
  ------------------
  304|  19.9k|		if (cache->access == VIPS_ACCESS_RANDOM)
  ------------------
  |  Branch (304:7): [True: 19.9k, False: 0]
  ------------------
  305|  19.9k|			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|  19.9k|	}
  312|       |
  313|  19.9k|	if (!tile) {
  ------------------
  |  Branch (313:6): [True: 19.9k, 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|  19.9k|		if (!(tile = vips_tile_new(cache, x, y)))
  ------------------
  |  Branch (317:7): [True: 0, False: 19.9k]
  ------------------
  318|      0|			return NULL;
  319|       |
  320|  19.9k|		return tile;
  321|  19.9k|	}
  322|       |
  323|  19.9k|	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|  19.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  19.9k|#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|   218k|{
  236|   218k|	VipsRect pos;
  237|   218k|	VipsTile *tile;
  238|       |
  239|   218k|	pos.left = x;
  240|   218k|	pos.top = y;
  241|   218k|	pos.width = cache->tile_width;
  242|   218k|	pos.height = cache->tile_height;
  243|   218k|	tile = (VipsTile *) g_hash_table_lookup(cache->tiles, &pos);
  244|       |
  245|   218k|	return tile;
  246|   218k|}
tilecache.c:vips_tile_new:
  199|   209k|{
  200|   209k|	VipsTile *tile;
  201|       |
  202|   209k|	if (!(tile = VIPS_NEW(NULL, VipsTile)))
  ------------------
  |  |   70|   209k|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|   209k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|   209k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|   209k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|   209k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (202:6): [True: 0, False: 209k]
  ------------------
  203|      0|		return NULL;
  204|       |
  205|   209k|	tile->cache = cache;
  206|   209k|	tile->state = VIPS_TILE_STATE_PEND;
  207|   209k|	tile->ref_count = 0;
  208|   209k|	tile->region = NULL;
  209|   209k|	tile->pos.left = x;
  210|   209k|	tile->pos.top = y;
  211|   209k|	tile->pos.width = cache->tile_width;
  212|   209k|	tile->pos.height = cache->tile_height;
  213|   209k|	g_hash_table_insert(cache->tiles, &tile->pos, tile);
  214|   209k|	g_queue_push_tail(tile->cache->recycle, tile);
  215|       |
  216|   209k|	if (!(tile->region = vips_region_new(cache->in))) {
  ------------------
  |  Branch (216:6): [True: 0, False: 209k]
  ------------------
  217|      0|		g_hash_table_remove(cache->tiles, &tile->pos);
  218|      0|		return NULL;
  219|      0|	}
  220|       |
  221|   209k|	vips__region_no_ownership(tile->region);
  222|       |
  223|   209k|	if (vips_region_buffer(tile->region, &tile->pos)) {
  ------------------
  |  Branch (223:6): [True: 0, False: 209k]
  ------------------
  224|      0|		g_hash_table_remove(cache->tiles, &tile->pos);
  225|      0|		return NULL;
  226|      0|	}
  227|       |
  228|   209k|	return tile;
  229|   209k|}
tilecache.c:vips_tile_ref:
  522|   218k|{
  523|   218k|	tile->ref_count += 1;
  524|       |
  525|   218k|	g_assert(tile->ref_count > 0);
  ------------------
  |  |  166|   218k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   218k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   218k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  526|       |
  527|   218k|	if (tile->ref_count == 1) {
  ------------------
  |  Branch (527:6): [True: 218k, False: 0]
  ------------------
  528|   218k|		g_assert(g_queue_find(tile->cache->recycle, tile));
  ------------------
  |  |  166|   218k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   218k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   218k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  529|       |
  530|   218k|		g_queue_remove(tile->cache->recycle, tile);
  531|   218k|	}
  532|   218k|}
tilecache.c:vips_tile_paste:
  589|   218k|{
  590|   218k|	VipsRect hit;
  591|       |
  592|       |	/* The part of the tile that we need.
  593|       |	 */
  594|   218k|	vips_rect_intersectrect(&out_region->valid, &tile->pos, &hit);
  595|   218k|	if (!vips_rect_isempty(&hit))
  ------------------
  |  Branch (595:6): [True: 218k, False: 0]
  ------------------
  596|   218k|		vips_region_copy(tile->region, out_region, &hit, hit.left, hit.top);
  597|   218k|}
tilecache.c:vips_tile_unref:
  505|   218k|{
  506|   218k|	g_assert(tile->ref_count > 0);
  ------------------
  |  |  166|   218k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   218k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   218k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  507|       |
  508|   218k|	tile->ref_count -= 1;
  509|       |
  510|   218k|	if (tile->ref_count == 0) {
  ------------------
  |  Branch (510:6): [True: 218k, 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|   218k|		g_assert(!g_queue_find(tile->cache->recycle, tile));
  ------------------
  |  |  166|   218k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   218k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   218k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  515|       |
  516|   218k|		g_queue_push_tail(tile->cache->recycle, tile);
  517|   218k|	}
  518|   218k|}
tilecache.c:vips_tile_cache_init:
  816|  1.57k|{
  817|  1.57k|}
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|  15.6k|{
  914|  15.6k|	VipsConversion *conversion = VIPS_CONVERSION(object);
  ------------------
  |  |   40|  15.6k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  15.6k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  15.6k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  15.6k|		VIPS_TYPE_CONVERSION, VipsConversion))
  ------------------
  915|  15.6k|	VipsBlockCache *block_cache = (VipsBlockCache *) object;
  916|  15.6k|	VipsLineCache *cache = (VipsLineCache *) object;
  917|       |
  918|  15.6k|	int tile_width;
  919|  15.6k|	int tile_height;
  920|  15.6k|	int n_lines;
  921|       |
  922|  15.6k|	VIPS_DEBUG_MSG("vips_line_cache_build\n");
  ------------------
  |  |   47|  15.6k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  15.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  15.6k|	{ \
  |  |   49|  15.6k|		; \
  |  |   50|  15.6k|	} \
  |  |   51|  15.6k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  15.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  923|       |
  924|  15.6k|	if (!vips_object_argument_isset(object, "access"))
  ------------------
  |  Branch (924:6): [True: 0, False: 15.6k]
  ------------------
  925|      0|		block_cache->access = VIPS_ACCESS_SEQUENTIAL; // FIXME: Invalidates operation cache
  926|       |
  927|  15.6k|	if (VIPS_OBJECT_CLASS(vips_line_cache_parent_class)->build(object))
  ------------------
  |  |  435|  15.6k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  15.6k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  15.6k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (927:6): [True: 0, False: 15.6k]
  ------------------
  928|      0|		return -1;
  929|       |
  930|       |	/* This can go up with request size, see vips_line_cache_gen().
  931|       |	 */
  932|  15.6k|	vips_get_tile_size(block_cache->in,
  933|  15.6k|		&tile_width, &tile_height, &n_lines);
  934|  15.6k|	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|  15.6k|	block_cache->max_tiles = VIPS_MAX(2, // FIXME: Invalidates operation cache
  ------------------
  |  |   54|  15.6k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 15.6k]
  |  |  ------------------
  ------------------
  945|  15.6k|		4 * n_lines / block_cache->tile_height);
  946|       |
  947|  15.6k|	VIPS_DEBUG_MSG("vips_line_cache_build: n_lines = %d\n",
  ------------------
  |  |   47|  15.6k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  15.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  15.6k|	{ \
  |  |   49|  15.6k|		; \
  |  |   50|  15.6k|	} \
  |  |   51|  15.6k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  15.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  948|  15.6k|		n_lines);
  949|  15.6k|	VIPS_DEBUG_MSG("vips_line_cache_build: max_tiles = %d\n",
  ------------------
  |  |   47|  15.6k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  15.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  15.6k|	{ \
  |  |   49|  15.6k|		; \
  |  |   50|  15.6k|	} \
  |  |   51|  15.6k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  15.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  950|  15.6k|		block_cache->max_tiles);
  951|  15.6k|	VIPS_DEBUG_MSG("vips_line_cache_build: tile_height = %d\n",
  ------------------
  |  |   47|  15.6k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  15.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  15.6k|	{ \
  |  |   49|  15.6k|		; \
  |  |   50|  15.6k|	} \
  |  |   51|  15.6k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  15.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  952|  15.6k|		block_cache->tile_height);
  953|  15.6k|	VIPS_DEBUG_MSG("vips_line_cache_build: max size = %g MB\n",
  ------------------
  |  |   47|  15.6k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  15.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  15.6k|	{ \
  |  |   49|  15.6k|		; \
  |  |   50|  15.6k|	} \
  |  |   51|  15.6k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  15.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  954|  15.6k|		(block_cache->max_tiles *
  955|  15.6k|			block_cache->tile_width *
  956|  15.6k|			block_cache->tile_height *
  957|  15.6k|			VIPS_IMAGE_SIZEOF_PEL(block_cache->in)) /
  958|  15.6k|			(1024 * 1024.0));
  959|       |
  960|  15.6k|	if (vips_image_pio_input(block_cache->in))
  ------------------
  |  Branch (960:6): [True: 0, False: 15.6k]
  ------------------
  961|      0|		return -1;
  962|       |
  963|  15.6k|	if (vips_image_pipelinev(conversion->out,
  ------------------
  |  Branch (963:6): [True: 0, False: 15.6k]
  ------------------
  964|  15.6k|			VIPS_DEMAND_STYLE_THINSTRIP, block_cache->in, NULL))
  965|      0|		return -1;
  966|       |
  967|  15.6k|	if (vips_image_generate(conversion->out,
  ------------------
  |  Branch (967:6): [True: 0, False: 15.6k]
  ------------------
  968|  15.6k|			vips_start_one, vips_line_cache_gen, vips_stop_one,
  969|  15.6k|			block_cache->in, cache))
  970|      0|		return -1;
  971|       |
  972|  15.6k|	return 0;
  973|  15.6k|}
tilecache.c:vips_line_cache_gen:
  887|  39.6k|{
  888|  39.6k|	VipsBlockCache *block_cache = (VipsBlockCache *) b;
  889|       |
  890|  39.6k|	VIPS_GATE_START("vips_line_cache_gen: wait");
  ------------------
  |  |   41|  39.6k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  39.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  39.6k|	{ \
  |  |   43|  39.6k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 39.6k]
  |  |  ------------------
  |  |   44|  39.6k|			vips__thread_gate_start(NAME); \
  |  |   45|  39.6k|	} \
  |  |   46|  39.6k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  39.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  891|       |
  892|  39.6k|	vips__worker_lock(block_cache->lock);
  893|       |
  894|  39.6k|	VIPS_GATE_STOP("vips_line_cache_gen: wait");
  ------------------
  |  |   49|  39.6k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  39.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  39.6k|	{ \
  |  |   51|  39.6k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 39.6k]
  |  |  ------------------
  |  |   52|  39.6k|			vips__thread_gate_stop(NAME); \
  |  |   53|  39.6k|	} \
  |  |   54|  39.6k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  39.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  895|       |
  896|       |	/* We size up the cache to the largest request.
  897|       |	 */
  898|  39.6k|	if (out_region->valid.height >
  ------------------
  |  Branch (898:6): [True: 0, False: 39.6k]
  ------------------
  899|  39.6k|		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|  39.6k|	g_mutex_unlock(block_cache->lock);
  907|       |
  908|  39.6k|	return vips_tile_cache_gen(out_region, seq, a, b, stop);
  909|  39.6k|}
tilecache.c:vips_line_cache_init:
  989|  15.6k|{
  990|  15.6k|}

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|    983|{
  394|    983|	va_list ap;
  395|    983|	int result;
  396|       |
  397|    983|	va_start(ap, out);
  398|    983|	result = vips_call_split("unpremultiply", ap, in, out);
  399|    983|	va_end(ap);
  400|       |
  401|    983|	return result;
  402|    983|}
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|    983|{
  252|    983|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|    983|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|    983|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|    983|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  253|    983|	VipsConversion *conversion = VIPS_CONVERSION(object);
  ------------------
  |  |   40|    983|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|    983|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    983|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|    983|		VIPS_TYPE_CONVERSION, VipsConversion))
  ------------------
  254|    983|	VipsUnpremultiply *unpremultiply = (VipsUnpremultiply *) object;
  255|    983|	VipsImage **t = (VipsImage **) vips_object_local_array(object, 1);
  256|       |
  257|    983|	VipsImage *in;
  258|       |
  259|    983|	if (VIPS_OBJECT_CLASS(vips_unpremultiply_parent_class)->build(object))
  ------------------
  |  |  435|    983|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|    983|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    983|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (259:6): [True: 0, False: 983]
  ------------------
  260|      0|		return -1;
  261|       |
  262|    983|	in = unpremultiply->in;
  263|       |
  264|    983|	if (vips_image_decode(in, &t[0]))
  ------------------
  |  Branch (264:6): [True: 0, False: 983]
  ------------------
  265|      0|		return -1;
  266|    983|	in = t[0];
  267|       |
  268|       |	/* Trivial case: fall back to copy().
  269|       |	 */
  270|    983|	if (in->Bands == 1)
  ------------------
  |  Branch (270:6): [True: 15, False: 968]
  ------------------
  271|     15|		return vips_image_write(in, conversion->out);
  272|       |
  273|    968|	if (vips_check_noncomplex(class->nickname, in))
  ------------------
  |  Branch (273:6): [True: 0, False: 968]
  ------------------
  274|      0|		return -1;
  275|       |
  276|    968|	if (vips_image_pipelinev(conversion->out,
  ------------------
  |  Branch (276:6): [True: 0, False: 968]
  ------------------
  277|    968|			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|    968|	if (!vips_object_argument_isset(object, "max_alpha"))
  ------------------
  |  Branch (283:6): [True: 968, False: 0]
  ------------------
  284|    968|		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|    968|	if (!vips_object_argument_isset(object, "alpha_band"))
  ------------------
  |  Branch (288:6): [True: 0, False: 968]
  ------------------
  289|      0|		unpremultiply->alpha_band = in->Bands - 1; // FIXME: Invalidates operation cache
  290|       |
  291|    968|	if (in->BandFmt == VIPS_FORMAT_DOUBLE)
  ------------------
  |  Branch (291:6): [True: 0, False: 968]
  ------------------
  292|      0|		conversion->out->BandFmt = VIPS_FORMAT_DOUBLE;
  293|    968|	else
  294|    968|		conversion->out->BandFmt = VIPS_FORMAT_FLOAT;
  295|       |
  296|    968|	if (vips_image_generate(conversion->out,
  ------------------
  |  Branch (296:6): [True: 0, False: 968]
  ------------------
  297|    968|			vips_start_one, vips_unpremultiply_gen, vips_stop_one,
  298|    968|			in, unpremultiply))
  299|      0|		return -1;
  300|       |
  301|    968|	return 0;
  302|    968|}
unpremultiply.c:vips_unpremultiply_init:
  345|    983|{
  346|    983|	unpremultiply->max_alpha = 255.0;
  347|    983|}
unpremultiply.c:vips_unpremultiply_gen.avx.0:
  187|  3.28k|{
  188|  3.28k|	VipsUnpremultiply *unpremultiply = (VipsUnpremultiply *) b;
  189|  3.28k|	VipsRegion *ir = (VipsRegion *) vseq;
  190|  3.28k|	VipsImage *im = ir->im;
  191|  3.28k|	VipsRect *r = &out_region->valid;
  192|  3.28k|	int width = r->width;
  193|  3.28k|	int bands = im->Bands;
  194|  3.28k|	double max_alpha = unpremultiply->max_alpha;
  195|  3.28k|	int alpha_band = unpremultiply->alpha_band;
  196|       |
  197|  3.28k|	int x, y, i;
  198|       |
  199|  3.28k|	if (vips_region_prepare(ir, r))
  ------------------
  |  Branch (199:6): [True: 73, False: 3.20k]
  ------------------
  200|     73|		return -1;
  201|       |
  202|  52.9k|	for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (202:14): [True: 49.7k, False: 3.20k]
  ------------------
  203|  49.7k|		VipsPel *in = VIPS_REGION_ADDR(ir, r->left, r->top + y);
  ------------------
  |  |  227|  49.7k|	((R)->data + \
  |  |  228|  49.7k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  49.7k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  49.7k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  49.7k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  49.7k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  49.7k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  204|  49.7k|		VipsPel *out = VIPS_REGION_ADDR(out_region, r->left, r->top + y);
  ------------------
  |  |  227|  49.7k|	((R)->data + \
  |  |  228|  49.7k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  49.7k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  49.7k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  49.7k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  49.7k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  49.7k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  205|       |
  206|  49.7k|		switch (im->BandFmt) {
  207|  8.36k|		case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (207:3): [True: 8.36k, False: 41.3k]
  ------------------
  208|  8.36k|			UNPRE(unsigned char, float);
  ------------------
  |  |  122|  8.36k|	{ \
  |  |  123|  8.36k|		if (bands == 4) { \
  |  |  ------------------
  |  |  |  Branch (123:7): [True: 6.58k, False: 1.78k]
  |  |  ------------------
  |  |  124|  6.58k|			UNPRE_RGBA(IN, OUT); \
  |  |  ------------------
  |  |  |  |  103|  6.58k|	{ \
  |  |  |  |  104|  6.58k|		IN *restrict p = (IN *) in; \
  |  |  |  |  105|  6.58k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  106|  6.58k|\
  |  |  |  |  107|   274k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (107:15): [True: 267k, False: 6.58k]
  |  |  |  |  ------------------
  |  |  |  |  108|   267k|			IN alpha = p[3]; \
  |  |  |  |  109|   267k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (109:17): [True: 198k, False: 68.9k]
  |  |  |  |  ------------------
  |  |  |  |  110|   267k|\
  |  |  |  |  111|   267k|			q[0] = factor * p[0]; \
  |  |  |  |  112|   267k|			q[1] = factor * p[1]; \
  |  |  |  |  113|   267k|			q[2] = factor * p[2]; \
  |  |  |  |  114|   267k|			q[3] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   267k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   534k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 267k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 267k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 267k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  115|   267k|\
  |  |  |  |  116|   267k|			p += 4; \
  |  |  |  |  117|   267k|			q += 4; \
  |  |  |  |  118|   267k|		} \
  |  |  |  |  119|  6.58k|	}
  |  |  ------------------
  |  |  125|  6.58k|		} \
  |  |  126|  8.36k|		else { \
  |  |  127|  1.78k|			UNPRE_MANY(IN, OUT); \
  |  |  ------------------
  |  |  |  |   81|  1.78k|	{ \
  |  |  |  |   82|  1.78k|		IN *restrict p = (IN *) in; \
  |  |  |  |   83|  1.78k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |   84|  1.78k|\
  |  |  |  |   85|  80.5k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (85:15): [True: 78.7k, False: 1.78k]
  |  |  |  |  ------------------
  |  |  |  |   86|  78.7k|			IN alpha = p[alpha_band]; \
  |  |  |  |   87|  78.7k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (87:17): [True: 52.6k, False: 26.0k]
  |  |  |  |  ------------------
  |  |  |  |   88|  78.7k|\
  |  |  |  |   89|   181k|			for (i = 0; i < alpha_band; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (89:16): [True: 102k, False: 78.7k]
  |  |  |  |  ------------------
  |  |  |  |   90|   102k|				q[i] = factor * p[i]; \
  |  |  |  |   91|  78.7k|			q[alpha_band] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  78.7k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   157k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 78.7k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 78.7k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 78.7k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   92|   129k|			for (i = alpha_band + 1; i < bands; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (92:29): [True: 51.0k, False: 78.7k]
  |  |  |  |  ------------------
  |  |  |  |   93|  78.7k|				q[i] = p[i]; \
  |  |  |  |   94|  78.7k|\
  |  |  |  |   95|  78.7k|			p += bands; \
  |  |  |  |   96|  78.7k|			q += bands; \
  |  |  |  |   97|  78.7k|		} \
  |  |  |  |   98|  1.78k|	}
  |  |  ------------------
  |  |  128|  1.78k|		} \
  |  |  129|  8.36k|	}
  ------------------
  209|  8.36k|			break;
  210|       |
  211|  7.77k|		case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (211:3): [True: 7.77k, False: 41.9k]
  ------------------
  212|  7.77k|			UNPRE(signed char, float);
  ------------------
  |  |  122|  7.77k|	{ \
  |  |  123|  7.77k|		if (bands == 4) { \
  |  |  ------------------
  |  |  |  Branch (123:7): [True: 2.38k, False: 5.38k]
  |  |  ------------------
  |  |  124|  2.38k|			UNPRE_RGBA(IN, OUT); \
  |  |  ------------------
  |  |  |  |  103|  2.38k|	{ \
  |  |  |  |  104|  2.38k|		IN *restrict p = (IN *) in; \
  |  |  |  |  105|  2.38k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  106|  2.38k|\
  |  |  |  |  107|   102k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (107:15): [True: 100k, False: 2.38k]
  |  |  |  |  ------------------
  |  |  |  |  108|   100k|			IN alpha = p[3]; \
  |  |  |  |  109|   100k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (109:17): [True: 54.7k, False: 45.2k]
  |  |  |  |  ------------------
  |  |  |  |  110|   100k|\
  |  |  |  |  111|   100k|			q[0] = factor * p[0]; \
  |  |  |  |  112|   100k|			q[1] = factor * p[1]; \
  |  |  |  |  113|   100k|			q[2] = factor * p[2]; \
  |  |  |  |  114|   100k|			q[3] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   100k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   200k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 8.61k, False: 91.4k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 100k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 91.4k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  115|   100k|\
  |  |  |  |  116|   100k|			p += 4; \
  |  |  |  |  117|   100k|			q += 4; \
  |  |  |  |  118|   100k|		} \
  |  |  |  |  119|  2.38k|	}
  |  |  ------------------
  |  |  125|  2.38k|		} \
  |  |  126|  7.77k|		else { \
  |  |  127|  5.38k|			UNPRE_MANY(IN, OUT); \
  |  |  ------------------
  |  |  |  |   81|  5.38k|	{ \
  |  |  |  |   82|  5.38k|		IN *restrict p = (IN *) in; \
  |  |  |  |   83|  5.38k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |   84|  5.38k|\
  |  |  |  |   85|   237k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (85:15): [True: 231k, False: 5.38k]
  |  |  |  |  ------------------
  |  |  |  |   86|   231k|			IN alpha = p[alpha_band]; \
  |  |  |  |   87|   231k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (87:17): [True: 176k, False: 55.1k]
  |  |  |  |  ------------------
  |  |  |  |   88|   231k|\
  |  |  |  |   89|   467k|			for (i = 0; i < alpha_band; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (89:16): [True: 235k, False: 231k]
  |  |  |  |  ------------------
  |  |  |  |   90|   235k|				q[i] = factor * p[i]; \
  |  |  |  |   91|   231k|			q[alpha_band] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   231k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   463k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 12.9k, False: 218k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 231k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 218k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   92|   447k|			for (i = alpha_band + 1; i < bands; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (92:29): [True: 215k, False: 231k]
  |  |  |  |  ------------------
  |  |  |  |   93|   231k|				q[i] = p[i]; \
  |  |  |  |   94|   231k|\
  |  |  |  |   95|   231k|			p += bands; \
  |  |  |  |   96|   231k|			q += bands; \
  |  |  |  |   97|   231k|		} \
  |  |  |  |   98|  5.38k|	}
  |  |  ------------------
  |  |  128|  5.38k|		} \
  |  |  129|  7.77k|	}
  ------------------
  213|  7.77k|			break;
  214|       |
  215|  4.23k|		case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (215:3): [True: 4.23k, False: 45.5k]
  ------------------
  216|  4.23k|			UNPRE(unsigned short, float);
  ------------------
  |  |  122|  4.23k|	{ \
  |  |  123|  4.23k|		if (bands == 4) { \
  |  |  ------------------
  |  |  |  Branch (123:7): [True: 1.46k, False: 2.76k]
  |  |  ------------------
  |  |  124|  1.46k|			UNPRE_RGBA(IN, OUT); \
  |  |  ------------------
  |  |  |  |  103|  1.46k|	{ \
  |  |  |  |  104|  1.46k|		IN *restrict p = (IN *) in; \
  |  |  |  |  105|  1.46k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  106|  1.46k|\
  |  |  |  |  107|  70.0k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (107:15): [True: 68.5k, False: 1.46k]
  |  |  |  |  ------------------
  |  |  |  |  108|  68.5k|			IN alpha = p[3]; \
  |  |  |  |  109|  68.5k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (109:17): [True: 52.5k, False: 16.0k]
  |  |  |  |  ------------------
  |  |  |  |  110|  68.5k|\
  |  |  |  |  111|  68.5k|			q[0] = factor * p[0]; \
  |  |  |  |  112|  68.5k|			q[1] = factor * p[1]; \
  |  |  |  |  113|  68.5k|			q[2] = factor * p[2]; \
  |  |  |  |  114|  68.5k|			q[3] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  68.5k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   137k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 68.5k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 12.3k, False: 56.2k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 12.3k, False: 56.2k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  115|  68.5k|\
  |  |  |  |  116|  68.5k|			p += 4; \
  |  |  |  |  117|  68.5k|			q += 4; \
  |  |  |  |  118|  68.5k|		} \
  |  |  |  |  119|  1.46k|	}
  |  |  ------------------
  |  |  125|  1.46k|		} \
  |  |  126|  4.23k|		else { \
  |  |  127|  2.76k|			UNPRE_MANY(IN, OUT); \
  |  |  ------------------
  |  |  |  |   81|  2.76k|	{ \
  |  |  |  |   82|  2.76k|		IN *restrict p = (IN *) in; \
  |  |  |  |   83|  2.76k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |   84|  2.76k|\
  |  |  |  |   85|   108k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (85:15): [True: 105k, False: 2.76k]
  |  |  |  |  ------------------
  |  |  |  |   86|   105k|			IN alpha = p[alpha_band]; \
  |  |  |  |   87|   105k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (87:17): [True: 55.9k, False: 49.7k]
  |  |  |  |  ------------------
  |  |  |  |   88|   105k|\
  |  |  |  |   89|   164k|			for (i = 0; i < alpha_band; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (89:16): [True: 58.3k, False: 105k]
  |  |  |  |  ------------------
  |  |  |  |   90|   105k|				q[i] = factor * p[i]; \
  |  |  |  |   91|   105k|			q[alpha_band] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   105k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   211k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 105k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 25.1k, False: 80.5k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 25.1k, False: 80.5k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   92|   160k|			for (i = alpha_band + 1; i < bands; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (92:29): [True: 54.5k, False: 105k]
  |  |  |  |  ------------------
  |  |  |  |   93|   105k|				q[i] = p[i]; \
  |  |  |  |   94|   105k|\
  |  |  |  |   95|   105k|			p += bands; \
  |  |  |  |   96|   105k|			q += bands; \
  |  |  |  |   97|   105k|		} \
  |  |  |  |   98|  2.76k|	}
  |  |  ------------------
  |  |  128|  2.76k|		} \
  |  |  129|  4.23k|	}
  ------------------
  217|  4.23k|			break;
  218|       |
  219|  4.67k|		case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (219:3): [True: 4.67k, False: 45.0k]
  ------------------
  220|  4.67k|			UNPRE(signed short, float);
  ------------------
  |  |  122|  4.67k|	{ \
  |  |  123|  4.67k|		if (bands == 4) { \
  |  |  ------------------
  |  |  |  Branch (123:7): [True: 1.89k, False: 2.78k]
  |  |  ------------------
  |  |  124|  1.89k|			UNPRE_RGBA(IN, OUT); \
  |  |  ------------------
  |  |  |  |  103|  1.89k|	{ \
  |  |  |  |  104|  1.89k|		IN *restrict p = (IN *) in; \
  |  |  |  |  105|  1.89k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  106|  1.89k|\
  |  |  |  |  107|  96.0k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (107:15): [True: 94.1k, False: 1.89k]
  |  |  |  |  ------------------
  |  |  |  |  108|  94.1k|			IN alpha = p[3]; \
  |  |  |  |  109|  94.1k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (109:17): [True: 55.3k, False: 38.7k]
  |  |  |  |  ------------------
  |  |  |  |  110|  94.1k|\
  |  |  |  |  111|  94.1k|			q[0] = factor * p[0]; \
  |  |  |  |  112|  94.1k|			q[1] = factor * p[1]; \
  |  |  |  |  113|  94.1k|			q[2] = factor * p[2]; \
  |  |  |  |  114|  94.1k|			q[3] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  94.1k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   188k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 9.92k, False: 84.2k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 26.7k, False: 67.3k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 26.7k, False: 57.4k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  115|  94.1k|\
  |  |  |  |  116|  94.1k|			p += 4; \
  |  |  |  |  117|  94.1k|			q += 4; \
  |  |  |  |  118|  94.1k|		} \
  |  |  |  |  119|  1.89k|	}
  |  |  ------------------
  |  |  125|  1.89k|		} \
  |  |  126|  4.67k|		else { \
  |  |  127|  2.78k|			UNPRE_MANY(IN, OUT); \
  |  |  ------------------
  |  |  |  |   81|  2.78k|	{ \
  |  |  |  |   82|  2.78k|		IN *restrict p = (IN *) in; \
  |  |  |  |   83|  2.78k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |   84|  2.78k|\
  |  |  |  |   85|   117k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (85:15): [True: 114k, False: 2.78k]
  |  |  |  |  ------------------
  |  |  |  |   86|   114k|			IN alpha = p[alpha_band]; \
  |  |  |  |   87|   114k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (87:17): [True: 39.4k, False: 75.5k]
  |  |  |  |  ------------------
  |  |  |  |   88|   114k|\
  |  |  |  |   89|   157k|			for (i = 0; i < alpha_band; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (89:16): [True: 42.1k, False: 114k]
  |  |  |  |  ------------------
  |  |  |  |   90|   114k|				q[i] = factor * p[i]; \
  |  |  |  |   91|   114k|			q[alpha_band] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   114k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   229k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 10.5k, False: 104k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 22.9k, False: 91.9k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 22.9k, False: 81.3k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   92|   198k|			for (i = alpha_band + 1; i < bands; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (92:29): [True: 83.5k, False: 114k]
  |  |  |  |  ------------------
  |  |  |  |   93|   114k|				q[i] = p[i]; \
  |  |  |  |   94|   114k|\
  |  |  |  |   95|   114k|			p += bands; \
  |  |  |  |   96|   114k|			q += bands; \
  |  |  |  |   97|   114k|		} \
  |  |  |  |   98|  2.78k|	}
  |  |  ------------------
  |  |  128|  2.78k|		} \
  |  |  129|  4.67k|	}
  ------------------
  221|  4.67k|			break;
  222|       |
  223|  7.48k|		case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (223:3): [True: 7.48k, False: 42.2k]
  ------------------
  224|  7.48k|			UNPRE(unsigned int, float);
  ------------------
  |  |  122|  7.48k|	{ \
  |  |  123|  7.48k|		if (bands == 4) { \
  |  |  ------------------
  |  |  |  Branch (123:7): [True: 4.21k, False: 3.27k]
  |  |  ------------------
  |  |  124|  4.21k|			UNPRE_RGBA(IN, OUT); \
  |  |  ------------------
  |  |  |  |  103|  4.21k|	{ \
  |  |  |  |  104|  4.21k|		IN *restrict p = (IN *) in; \
  |  |  |  |  105|  4.21k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  106|  4.21k|\
  |  |  |  |  107|   144k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (107:15): [True: 140k, False: 4.21k]
  |  |  |  |  ------------------
  |  |  |  |  108|   140k|			IN alpha = p[3]; \
  |  |  |  |  109|   140k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (109:17): [True: 93.5k, False: 47.1k]
  |  |  |  |  ------------------
  |  |  |  |  110|   140k|\
  |  |  |  |  111|   140k|			q[0] = factor * p[0]; \
  |  |  |  |  112|   140k|			q[1] = factor * p[1]; \
  |  |  |  |  113|   140k|			q[2] = factor * p[2]; \
  |  |  |  |  114|   140k|			q[3] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   140k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   281k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 140k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 44.9k, False: 95.7k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 44.9k, False: 95.7k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  115|   140k|\
  |  |  |  |  116|   140k|			p += 4; \
  |  |  |  |  117|   140k|			q += 4; \
  |  |  |  |  118|   140k|		} \
  |  |  |  |  119|  4.21k|	}
  |  |  ------------------
  |  |  125|  4.21k|		} \
  |  |  126|  7.48k|		else { \
  |  |  127|  3.27k|			UNPRE_MANY(IN, OUT); \
  |  |  ------------------
  |  |  |  |   81|  3.27k|	{ \
  |  |  |  |   82|  3.27k|		IN *restrict p = (IN *) in; \
  |  |  |  |   83|  3.27k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |   84|  3.27k|\
  |  |  |  |   85|   140k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (85:15): [True: 136k, False: 3.27k]
  |  |  |  |  ------------------
  |  |  |  |   86|   136k|			IN alpha = p[alpha_band]; \
  |  |  |  |   87|   136k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (87:17): [True: 67.3k, False: 69.3k]
  |  |  |  |  ------------------
  |  |  |  |   88|   136k|\
  |  |  |  |   89|   236k|			for (i = 0; i < alpha_band; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (89:16): [True: 99.4k, False: 136k]
  |  |  |  |  ------------------
  |  |  |  |   90|   136k|				q[i] = factor * p[i]; \
  |  |  |  |   91|   136k|			q[alpha_band] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   136k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   273k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 136k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 66.5k, False: 70.2k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 66.5k, False: 70.2k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   92|   197k|			for (i = alpha_band + 1; i < bands; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (92:29): [True: 60.9k, False: 136k]
  |  |  |  |  ------------------
  |  |  |  |   93|   136k|				q[i] = p[i]; \
  |  |  |  |   94|   136k|\
  |  |  |  |   95|   136k|			p += bands; \
  |  |  |  |   96|   136k|			q += bands; \
  |  |  |  |   97|   136k|		} \
  |  |  |  |   98|  3.27k|	}
  |  |  ------------------
  |  |  128|  3.27k|		} \
  |  |  129|  7.48k|	}
  ------------------
  225|  7.48k|			break;
  226|       |
  227|  8.45k|		case VIPS_FORMAT_INT:
  ------------------
  |  Branch (227:3): [True: 8.45k, False: 41.3k]
  ------------------
  228|  8.45k|			UNPRE(signed int, float);
  ------------------
  |  |  122|  8.45k|	{ \
  |  |  123|  8.45k|		if (bands == 4) { \
  |  |  ------------------
  |  |  |  Branch (123:7): [True: 3.96k, False: 4.48k]
  |  |  ------------------
  |  |  124|  3.96k|			UNPRE_RGBA(IN, OUT); \
  |  |  ------------------
  |  |  |  |  103|  3.96k|	{ \
  |  |  |  |  104|  3.96k|		IN *restrict p = (IN *) in; \
  |  |  |  |  105|  3.96k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  106|  3.96k|\
  |  |  |  |  107|   149k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (107:15): [True: 145k, False: 3.96k]
  |  |  |  |  ------------------
  |  |  |  |  108|   145k|			IN alpha = p[3]; \
  |  |  |  |  109|   145k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (109:17): [True: 94.5k, False: 50.4k]
  |  |  |  |  ------------------
  |  |  |  |  110|   145k|\
  |  |  |  |  111|   145k|			q[0] = factor * p[0]; \
  |  |  |  |  112|   145k|			q[1] = factor * p[1]; \
  |  |  |  |  113|   145k|			q[2] = factor * p[2]; \
  |  |  |  |  114|   145k|			q[3] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   145k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   290k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 15.0k, False: 130k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 34.1k, False: 110k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 34.1k, False: 95.9k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  115|   145k|\
  |  |  |  |  116|   145k|			p += 4; \
  |  |  |  |  117|   145k|			q += 4; \
  |  |  |  |  118|   145k|		} \
  |  |  |  |  119|  3.96k|	}
  |  |  ------------------
  |  |  125|  3.96k|		} \
  |  |  126|  8.45k|		else { \
  |  |  127|  4.48k|			UNPRE_MANY(IN, OUT); \
  |  |  ------------------
  |  |  |  |   81|  4.48k|	{ \
  |  |  |  |   82|  4.48k|		IN *restrict p = (IN *) in; \
  |  |  |  |   83|  4.48k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |   84|  4.48k|\
  |  |  |  |   85|   187k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (85:15): [True: 183k, False: 4.48k]
  |  |  |  |  ------------------
  |  |  |  |   86|   183k|			IN alpha = p[alpha_band]; \
  |  |  |  |   87|   183k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (87:17): [True: 111k, False: 71.2k]
  |  |  |  |  ------------------
  |  |  |  |   88|   183k|\
  |  |  |  |   89|   274k|			for (i = 0; i < alpha_band; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (89:16): [True: 91.4k, False: 183k]
  |  |  |  |  ------------------
  |  |  |  |   90|   183k|				q[i] = factor * p[i]; \
  |  |  |  |   91|   183k|			q[alpha_band] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   183k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   366k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 13.5k, False: 169k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 54.3k, False: 128k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 54.3k, False: 115k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   92|   312k|			for (i = alpha_band + 1; i < bands; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (92:29): [True: 129k, False: 183k]
  |  |  |  |  ------------------
  |  |  |  |   93|   183k|				q[i] = p[i]; \
  |  |  |  |   94|   183k|\
  |  |  |  |   95|   183k|			p += bands; \
  |  |  |  |   96|   183k|			q += bands; \
  |  |  |  |   97|   183k|		} \
  |  |  |  |   98|  4.48k|	}
  |  |  ------------------
  |  |  128|  4.48k|		} \
  |  |  129|  8.45k|	}
  ------------------
  229|  8.45k|			break;
  230|       |
  231|  8.78k|		case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (231:3): [True: 8.78k, False: 40.9k]
  ------------------
  232|  8.78k|			FUNPRE(float, float);
  ------------------
  |  |  174|  8.78k|	{ \
  |  |  175|  8.78k|		if (bands == 4) { \
  |  |  ------------------
  |  |  |  Branch (175:7): [True: 2.36k, False: 6.41k]
  |  |  ------------------
  |  |  176|  2.36k|			FUNPRE_RGBA(IN, OUT); \
  |  |  ------------------
  |  |  |  |  155|  2.36k|	{ \
  |  |  |  |  156|  2.36k|		IN *restrict p = (IN *) in; \
  |  |  |  |  157|  2.36k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  158|  2.36k|\
  |  |  |  |  159|  83.0k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (159:15): [True: 80.6k, False: 2.36k]
  |  |  |  |  ------------------
  |  |  |  |  160|  80.6k|			IN alpha = p[3]; \
  |  |  |  |  161|  80.6k|			OUT factor = VIPS_ABS(alpha) < 0.01 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  |   62|  80.6k|#define VIPS_ABS(X) (((X) >= 0) ? (X) : -(X))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (62:22): [True: 66.6k, False: 13.9k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (161:17): [True: 58.5k, False: 22.0k]
  |  |  |  |  ------------------
  |  |  |  |  162|  80.6k|\
  |  |  |  |  163|  80.6k|			q[0] = factor * p[0]; \
  |  |  |  |  164|  80.6k|			q[1] = factor * p[1]; \
  |  |  |  |  165|  80.6k|			q[2] = factor * p[2]; \
  |  |  |  |  166|  80.6k|			q[3] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  80.6k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   161k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 13.9k, False: 66.6k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 9.66k, False: 70.9k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 9.66k, False: 57.0k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  167|  80.6k|\
  |  |  |  |  168|  80.6k|			p += 4; \
  |  |  |  |  169|  80.6k|			q += 4; \
  |  |  |  |  170|  80.6k|		} \
  |  |  |  |  171|  2.36k|	}
  |  |  ------------------
  |  |  177|  2.36k|		} \
  |  |  178|  8.78k|		else { \
  |  |  179|  6.41k|			FUNPRE_MANY(IN, OUT); \
  |  |  ------------------
  |  |  |  |  135|  6.41k|	{ \
  |  |  |  |  136|  6.41k|		IN *restrict p = (IN *) in; \
  |  |  |  |  137|  6.41k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  138|  6.41k|\
  |  |  |  |  139|   269k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (139:15): [True: 263k, False: 6.41k]
  |  |  |  |  ------------------
  |  |  |  |  140|   263k|			IN alpha = p[alpha_band]; \
  |  |  |  |  141|   263k|			OUT factor = VIPS_ABS(alpha) < 0.01 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  |   62|   263k|#define VIPS_ABS(X) (((X) >= 0) ? (X) : -(X))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (62:22): [True: 245k, False: 17.7k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (141:17): [True: 202k, False: 60.8k]
  |  |  |  |  ------------------
  |  |  |  |  142|   263k|\
  |  |  |  |  143|   453k|			for (i = 0; i < alpha_band; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (143:16): [True: 190k, False: 263k]
  |  |  |  |  ------------------
  |  |  |  |  144|   263k|				q[i] = factor * p[i]; \
  |  |  |  |  145|   263k|			q[alpha_band] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   263k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   526k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 13.0k, False: 250k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 6.68k, False: 256k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 6.68k, False: 243k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  146|   463k|			for (i = alpha_band + 1; i < bands; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (146:29): [True: 200k, False: 263k]
  |  |  |  |  ------------------
  |  |  |  |  147|   263k|				q[i] = p[i]; \
  |  |  |  |  148|   263k|\
  |  |  |  |  149|   263k|			p += bands; \
  |  |  |  |  150|   263k|			q += bands; \
  |  |  |  |  151|   263k|		} \
  |  |  |  |  152|  6.41k|	}
  |  |  ------------------
  |  |  180|  6.41k|		} \
  |  |  181|  8.78k|	}
  ------------------
  233|  8.78k|			break;
  234|       |
  235|      0|		case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (235:3): [True: 0, False: 49.7k]
  ------------------
  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: 49.7k]
  ------------------
  240|      0|		case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (240:3): [True: 0, False: 49.7k]
  ------------------
  241|      0|		default:
  ------------------
  |  Branch (241:3): [True: 0, False: 49.7k]
  ------------------
  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|  49.7k|		}
  244|  49.7k|	}
  245|       |
  246|  3.20k|	return 0;
  247|  3.20k|}

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|}

vips_conv:
  224|  57.2k|{
  225|  57.2k|	va_list ap;
  226|  57.2k|	int result;
  227|       |
  228|  57.2k|	va_start(ap, mask);
  229|  57.2k|	result = vips_call_split("conv", ap, in, out, mask);
  230|  57.2k|	va_end(ap);
  231|       |
  232|  57.2k|	return result;
  233|  57.2k|}
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|}
conv.c:vips_conv_build:
   63|  57.2k|{
   64|  57.2k|	VipsConvolution *convolution = (VipsConvolution *) object;
   65|  57.2k|	VipsConv *conv = (VipsConv *) object;
   66|  57.2k|	VipsImage **t = (VipsImage **) vips_object_local_array(object, 4);
   67|       |
   68|  57.2k|	VipsImage *in;
   69|       |
   70|  57.2k|	if (VIPS_OBJECT_CLASS(vips_conv_parent_class)->build(object))
  ------------------
  |  |  435|  57.2k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  57.2k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  57.2k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (70:6): [True: 0, False: 57.2k]
  ------------------
   71|      0|		return -1;
   72|       |
   73|  57.2k|	g_object_set(conv, "out", vips_image_new(), NULL);
   74|       |
   75|  57.2k|	in = convolution->in;
   76|       |
   77|       |	/*
   78|       |	printf("vips_conv_build: convolving with:\n");
   79|       |	vips_matrixprint(convolution->M, NULL);
   80|       |	 */
   81|       |
   82|       |	/* Unpack for processing.
   83|       |	 */
   84|  57.2k|	if (vips_image_decode(in, &t[0]))
  ------------------
  |  Branch (84:6): [True: 0, False: 57.2k]
  ------------------
   85|      0|		return -1;
   86|  57.2k|	in = t[0];
   87|       |
   88|  57.2k|	switch (conv->precision) {
   89|      0|	case VIPS_PRECISION_FLOAT:
  ------------------
  |  Branch (89:2): [True: 0, False: 57.2k]
  ------------------
   90|      0|		if (vips_convf(in, &t[1], convolution->M, NULL) ||
  ------------------
  |  Branch (90:7): [True: 0, False: 0]
  ------------------
   91|      0|			vips_image_write(t[1], convolution->out))
  ------------------
  |  Branch (91:4): [True: 0, False: 0]
  ------------------
   92|      0|			return -1;
   93|      0|		break;
   94|       |
   95|  57.2k|	case VIPS_PRECISION_INTEGER:
  ------------------
  |  Branch (95:2): [True: 57.2k, False: 0]
  ------------------
   96|  57.2k|		if (vips_convi(in, &t[1], convolution->M, NULL) ||
  ------------------
  |  Branch (96:7): [True: 0, False: 57.2k]
  ------------------
   97|  57.2k|			vips_image_write(t[1], convolution->out))
  ------------------
  |  Branch (97:4): [True: 0, False: 57.2k]
  ------------------
   98|      0|			return -1;
   99|  57.2k|		break;
  100|       |
  101|  57.2k|	case VIPS_PRECISION_APPROXIMATE:
  ------------------
  |  Branch (101:2): [True: 0, False: 57.2k]
  ------------------
  102|      0|		if (vips_conva(in, &t[1], convolution->M,
  ------------------
  |  Branch (102:7): [True: 0, False: 0]
  ------------------
  103|      0|				"layers", conv->layers,
  104|      0|				"cluster", conv->cluster,
  105|      0|				NULL) ||
  106|      0|			vips_image_write(t[1], convolution->out))
  ------------------
  |  Branch (106:4): [True: 0, False: 0]
  ------------------
  107|      0|			return -1;
  108|      0|		break;
  109|       |
  110|      0|	default:
  ------------------
  |  Branch (110:2): [True: 0, False: 57.2k]
  ------------------
  111|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  112|  57.2k|	}
  113|       |
  114|  57.2k|	vips_reorder_margin_hint(convolution->out,
  115|  57.2k|		convolution->M->Xsize * convolution->M->Ysize);
  116|       |
  117|  57.2k|	return 0;
  118|  57.2k|}
conv.c:vips_conv_init:
  157|  57.2k|{
  158|  57.2k|	conv->precision = VIPS_PRECISION_FLOAT;
  159|  57.2k|	conv->layers = 5;
  160|  57.2k|	conv->cluster = 1;
  161|  57.2k|}

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|}

vips__image_intize:
  859|  57.2k|{
  860|  57.2k|	VipsImage *t;
  861|  57.2k|	int x, y;
  862|  57.2k|	double double_result;
  863|  57.2k|	double out_scale;
  864|  57.2k|	double out_offset;
  865|  57.2k|	int int_result;
  866|       |
  867|  57.2k|	if (vips_check_matrix("vips2imask", in, &t))
  ------------------
  |  Branch (867:6): [True: 0, False: 57.2k]
  ------------------
  868|      0|		return -1;
  869|  57.2k|	if (!(*out = vips_image_new_matrix(t->Xsize, t->Ysize))) {
  ------------------
  |  Branch (869:6): [True: 0, False: 57.2k]
  ------------------
  870|      0|		g_object_unref(t);
  871|      0|		return -1;
  872|      0|	}
  873|       |
  874|       |	/* We want to make an intmask which has the same input to output ratio
  875|       |	 * as the double image.
  876|       |	 *
  877|       |	 * Imagine convolving with the double image, what's the ratio of
  878|       |	 * brightness between input and output? We want the same ratio for the
  879|       |	 * int version, if we can.
  880|       |	 *
  881|       |	 * Imagine an input image where every pixel is 1, what will the output
  882|       |	 * be?
  883|       |	 */
  884|  57.2k|	double_result = 0;
  885|   337k|	for (y = 0; y < t->Ysize; y++)
  ------------------
  |  Branch (885:14): [True: 280k, False: 57.2k]
  ------------------
  886|   860k|		for (x = 0; x < t->Xsize; x++)
  ------------------
  |  Branch (886:15): [True: 580k, False: 280k]
  ------------------
  887|   580k|			double_result += *VIPS_MATRIX(t, x, y);
  ------------------
  |  |  432|   637k|	((double *) VIPS_IMAGE_ADDR(I, X, Y))
  |  |  ------------------
  |  |  |  |  418|   580k|	((I)->data + \
  |  |  |  |  419|   580k|		(Y) *VIPS_IMAGE_SIZEOF_LINE(I) + \
  |  |  |  |  ------------------
  |  |  |  |  |  |  386|   580k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  384|   580k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  382|   580k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  420|   580k|		(X) *VIPS_IMAGE_SIZEOF_PEL(I))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   580k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   580k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  888|  57.2k|	double_result /= vips_image_get_scale(t);
  889|       |
  890|   337k|	for (y = 0; y < t->Ysize; y++)
  ------------------
  |  Branch (890:14): [True: 280k, False: 57.2k]
  ------------------
  891|   860k|		for (x = 0; x < t->Xsize; x++)
  ------------------
  |  Branch (891:15): [True: 580k, False: 280k]
  ------------------
  892|   580k|			*VIPS_MATRIX(*out, x, y) =
  ------------------
  |  |  432|   580k|	((double *) VIPS_IMAGE_ADDR(I, X, Y))
  |  |  ------------------
  |  |  |  |  418|   580k|	((I)->data + \
  |  |  |  |  419|   580k|		(Y) *VIPS_IMAGE_SIZEOF_LINE(I) + \
  |  |  |  |  ------------------
  |  |  |  |  |  |  386|   580k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  384|   580k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  382|   580k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  420|   580k|		(X) *VIPS_IMAGE_SIZEOF_PEL(I))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   580k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   580k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  893|   580k|				VIPS_RINT(*VIPS_MATRIX(t, x, y));
  ------------------
  |  |   74|   637k|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  894|       |
  895|  57.2k|	out_scale = VIPS_RINT(vips_image_get_scale(t));
  ------------------
  |  |   74|  57.2k|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  896|  57.2k|	if (out_scale == 0)
  ------------------
  |  Branch (896:6): [True: 0, False: 57.2k]
  ------------------
  897|      0|		out_scale = 1;
  898|  57.2k|	out_offset = VIPS_RINT(vips_image_get_offset(t));
  ------------------
  |  |   74|  57.2k|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  899|       |
  900|       |	/* Now convolve a 1 everywhere image with the int version we've made,
  901|       |	 * what do we get?
  902|       |	 */
  903|  57.2k|	int_result = 0;
  904|   337k|	for (y = 0; y < t->Ysize; y++)
  ------------------
  |  Branch (904:14): [True: 280k, False: 57.2k]
  ------------------
  905|   860k|		for (x = 0; x < t->Xsize; x++)
  ------------------
  |  Branch (905:15): [True: 580k, False: 280k]
  ------------------
  906|   580k|			int_result += *VIPS_MATRIX(*out, x, y);
  ------------------
  |  |  432|   637k|	((double *) VIPS_IMAGE_ADDR(I, X, Y))
  |  |  ------------------
  |  |  |  |  418|   580k|	((I)->data + \
  |  |  |  |  419|   580k|		(Y) *VIPS_IMAGE_SIZEOF_LINE(I) + \
  |  |  |  |  ------------------
  |  |  |  |  |  |  386|   580k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  384|   580k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  382|   580k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  420|   580k|		(X) *VIPS_IMAGE_SIZEOF_PEL(I))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   580k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   580k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  907|  57.2k|	int_result /= out_scale;
  908|       |
  909|       |	/* And adjust the scale to get as close to a match as we can.
  910|       |	 */
  911|  57.2k|	out_scale = VIPS_RINT(out_scale + (int_result - double_result));
  ------------------
  |  |   74|  57.2k|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  912|  57.2k|	if (out_scale == 0)
  ------------------
  |  Branch (912:6): [True: 0, False: 57.2k]
  ------------------
  913|      0|		out_scale = 1;
  914|       |
  915|  57.2k|	vips_image_set_double(*out, "scale", out_scale);
  916|  57.2k|	vips_image_set_double(*out, "offset", out_offset);
  917|       |
  918|  57.2k|	g_object_unref(t);
  919|       |
  920|  57.2k|	return 0;
  921|  57.2k|}
vips_convi:
 1290|  57.2k|{
 1291|  57.2k|	va_list ap;
 1292|  57.2k|	int result;
 1293|       |
 1294|  57.2k|	va_start(ap, mask);
 1295|  57.2k|	result = vips_call_split("convi", ap, in, out, mask);
 1296|  57.2k|	va_end(ap);
 1297|       |
 1298|  57.2k|	return result;
 1299|  57.2k|}
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|}
convi.c:vips_convi_build:
 1121|  57.2k|{
 1122|  57.2k|	VipsConvolution *convolution = (VipsConvolution *) object;
 1123|  57.2k|	VipsConvi *convi = (VipsConvi *) object;
 1124|  57.2k|	VipsImage **t = (VipsImage **) vips_object_local_array(object, 4);
 1125|       |
 1126|  57.2k|	VipsImage *in;
 1127|  57.2k|	VipsImage *M;
 1128|  57.2k|	VipsGenerateFn generate;
 1129|  57.2k|	double *coeff;
 1130|  57.2k|	int i;
 1131|       |
 1132|  57.2k|	if (VIPS_OBJECT_CLASS(vips_convi_parent_class)->build(object))
  ------------------
  |  |  435|  57.2k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  57.2k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  57.2k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1132:6): [True: 0, False: 57.2k]
  ------------------
 1133|      0|		return -1;
 1134|       |
 1135|  57.2k|	in = convolution->in;
 1136|  57.2k|	M = convolution->M;
 1137|  57.2k|	convi->n_point = M->Xsize * M->Ysize;
 1138|       |
 1139|  57.2k|	if (vips_embed(in, &t[0],
  ------------------
  |  Branch (1139:6): [True: 0, False: 57.2k]
  ------------------
 1140|  57.2k|			M->Xsize / 2, M->Ysize / 2,
 1141|  57.2k|			in->Xsize + M->Xsize - 1, in->Ysize + M->Ysize - 1,
 1142|  57.2k|			"extend", VIPS_EXTEND_COPY,
 1143|  57.2k|			NULL))
 1144|      0|		return -1;
 1145|  57.2k|	in = t[0];
 1146|       |
 1147|       |	/* For uchar input, try to make a vector path.
 1148|       |	 */
 1149|  57.2k|#ifdef HAVE_HWY
 1150|  57.2k|	if (in->BandFmt == VIPS_FORMAT_UCHAR &&
  ------------------
  |  Branch (1150:6): [True: 0, False: 57.2k]
  ------------------
 1151|  57.2k|		vips_vector_isenabled() &&
  ------------------
  |  Branch (1151:3): [True: 0, False: 0]
  ------------------
 1152|  57.2k|		!vips_convi_intize(convi, M)) {
  ------------------
  |  Branch (1152:3): [True: 0, False: 0]
  ------------------
 1153|      0|		generate = vips_convi_uchar_vector_gen;
 1154|      0|		g_info("convi: using vector path");
  ------------------
  |  |  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__)
  ------------------
 1155|      0|	}
 1156|  57.2k|	else
 1157|       |#elif defined(HAVE_ORC)
 1158|       |	if (in->BandFmt == VIPS_FORMAT_UCHAR &&
 1159|       |		vips_vector_isenabled() &&
 1160|       |		!vips_convi_intize(convi, M) &&
 1161|       |		!vips_convi_compile(convi, in)) {
 1162|       |		generate = vips_convi_gen_vector;
 1163|       |		g_info("convi: using vector path");
 1164|       |	}
 1165|       |	else
 1166|       |#endif /*HAVE_HWY*/
 1167|       |		/* Default to the C path.
 1168|       |		 */
 1169|  57.2k|		generate = vips_convi_gen;
 1170|       |
 1171|       |	/* Make the data for the C path.
 1172|       |	 */
 1173|  57.2k|	if (generate == vips_convi_gen) {
  ------------------
  |  Branch (1173:6): [True: 57.2k, False: 0]
  ------------------
 1174|  57.2k|		g_info("convi: using C path");
  ------------------
  |  |  341|  57.2k|#define g_info(...)     g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|  57.2k|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  342|  57.2k|                               G_LOG_LEVEL_INFO,     \
  |  |  343|  57.2k|                               __VA_ARGS__)
  ------------------
 1175|       |
 1176|       |		/* Make an int version of our mask.
 1177|       |		 */
 1178|  57.2k|		if (vips__image_intize(M, &t[1]))
  ------------------
  |  Branch (1178:7): [True: 0, False: 57.2k]
  ------------------
 1179|      0|			return -1;
 1180|  57.2k|		M = t[1];
 1181|       |
 1182|  57.2k|		coeff = VIPS_MATRIX(M, 0, 0);
  ------------------
  |  |  432|  57.2k|	((double *) VIPS_IMAGE_ADDR(I, X, Y))
  |  |  ------------------
  |  |  |  |  418|  57.2k|	((I)->data + \
  |  |  |  |  419|  57.2k|		(Y) *VIPS_IMAGE_SIZEOF_LINE(I) + \
  |  |  |  |  ------------------
  |  |  |  |  |  |  386|  57.2k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  384|  57.2k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  382|  57.2k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  420|  57.2k|		(X) *VIPS_IMAGE_SIZEOF_PEL(I))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  57.2k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  57.2k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1183|  57.2k|		if (!(convi->coeff = VIPS_ARRAY(object, convi->n_point, int)) ||
  ------------------
  |  |   72|  57.2k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  57.2k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  57.2k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  57.2k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  57.2k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1183:7): [True: 0, False: 57.2k]
  ------------------
 1184|  57.2k|			!(convi->coeff_pos =
  ------------------
  |  Branch (1184:4): [True: 0, False: 57.2k]
  ------------------
 1185|  57.2k|					VIPS_ARRAY(object, convi->n_point, int)))
  ------------------
  |  |   72|  57.2k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  57.2k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  57.2k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  57.2k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  57.2k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1186|      0|			return -1;
 1187|       |
 1188|       |		/* Squeeze out zero mask elements.
 1189|       |		 */
 1190|  57.2k|		convi->nnz = 0;
 1191|   637k|		for (i = 0; i < convi->n_point; i++)
  ------------------
  |  Branch (1191:15): [True: 580k, False: 57.2k]
  ------------------
 1192|   580k|			if (coeff[i]) {
  ------------------
  |  Branch (1192:8): [True: 503k, False: 76.3k]
  ------------------
 1193|   503k|				convi->coeff[convi->nnz] = coeff[i];
 1194|   503k|				convi->coeff_pos[convi->nnz] = i;
 1195|   503k|				convi->nnz += 1;
 1196|   503k|			}
 1197|       |
 1198|       |		/* Was the whole mask zero? We must have at least 1 element
 1199|       |		 * in there: set it to zero.
 1200|       |		 */
 1201|  57.2k|		if (convi->nnz == 0) {
  ------------------
  |  Branch (1201:7): [True: 0, False: 57.2k]
  ------------------
 1202|      0|			convi->coeff[0] = 0;
 1203|      0|			convi->coeff_pos[0] = 0;
 1204|      0|			convi->nnz = 1;
 1205|      0|		}
 1206|  57.2k|	}
 1207|       |
 1208|  57.2k|	g_object_set(convi, "out", vips_image_new(), NULL);
 1209|  57.2k|	if (vips_image_pipelinev(convolution->out,
  ------------------
  |  Branch (1209:6): [True: 0, False: 57.2k]
  ------------------
 1210|  57.2k|			VIPS_DEMAND_STYLE_SMALLTILE, in, NULL))
 1211|      0|		return -1;
 1212|       |
 1213|  57.2k|	convolution->out->Xoffset = 0;
 1214|  57.2k|	convolution->out->Yoffset = 0;
 1215|       |
 1216|       |	/* Prepare output. Consider a 7x7 mask and a 7x7 image --- the output
 1217|       |	 * would be 1x1.
 1218|       |	 */
 1219|  57.2k|	convolution->out->Xsize -= M->Xsize - 1;
 1220|  57.2k|	convolution->out->Ysize -= M->Ysize - 1;
 1221|       |
 1222|  57.2k|	if (vips_image_generate(convolution->out,
  ------------------
  |  Branch (1222:6): [True: 0, False: 57.2k]
  ------------------
 1223|  57.2k|			vips_convi_start, generate, vips_convi_stop, in, convi))
 1224|      0|		return -1;
 1225|       |
 1226|  57.2k|	convolution->out->Xoffset = -M->Xsize / 2;
 1227|  57.2k|	convolution->out->Yoffset = -M->Ysize / 2;
 1228|       |
 1229|  57.2k|	return 0;
 1230|  57.2k|}
convi.c:vips_convi_gen:
  753|  57.2k|{
  754|  57.2k|	VipsConviSequence *seq = (VipsConviSequence *) vseq;
  755|  57.2k|	VipsConvi *convi = (VipsConvi *) b;
  756|  57.2k|	VipsConvolution *convolution = (VipsConvolution *) convi;
  757|  57.2k|	VipsImage *M = convolution->M;
  758|  57.2k|	int scale = VIPS_RINT(vips_image_get_scale(M));
  ------------------
  |  |   74|  57.2k|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  759|  57.2k|	int rounding = scale / 2;
  760|  57.2k|	int offset = VIPS_RINT(vips_image_get_offset(M));
  ------------------
  |  |   74|  57.2k|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  761|  57.2k|	VipsImage *in = (VipsImage *) a;
  762|  57.2k|	VipsRegion *ir = seq->ir;
  763|  57.2k|	int *restrict t = convi->coeff;
  764|  57.2k|	const int nnz = convi->nnz;
  765|  57.2k|	VipsRect *r = &out_region->valid;
  766|  57.2k|	int le = r->left;
  767|  57.2k|	int to = r->top;
  768|  57.2k|	int bo = VIPS_RECT_BOTTOM(r);
  ------------------
  |  |   49|  57.2k|#define VIPS_RECT_BOTTOM(R) ((R)->top + (R)->height)
  ------------------
  769|  57.2k|	int sz = VIPS_REGION_N_ELEMENTS(out_region) *
  ------------------
  |  |  197|  57.2k|	((size_t) ((R)->valid.width * (R)->im->Bands))
  ------------------
  770|  57.2k|		(vips_band_format_iscomplex(in->BandFmt) ? 2 : 1);
  ------------------
  |  Branch (770:4): [True: 0, False: 57.2k]
  ------------------
  771|       |
  772|  57.2k|	VipsRect s;
  773|  57.2k|	int x, y, z, i;
  774|       |
  775|       |	/* Prepare the section of the input image we need. A little larger
  776|       |	 * than the section of the output image we are producing.
  777|       |	 */
  778|  57.2k|	s = *r;
  779|  57.2k|	s.width += M->Xsize - 1;
  780|  57.2k|	s.height += M->Ysize - 1;
  781|  57.2k|	if (vips_region_prepare(ir, &s))
  ------------------
  |  Branch (781:6): [True: 33.5k, False: 23.6k]
  ------------------
  782|  33.5k|		return -1;
  783|       |
  784|       |	/* Fill offset array. Only do this if the bpl has changed since the
  785|       |	 * previous vips_region_prepare().
  786|       |	 */
  787|  23.6k|	if (seq->last_bpl != VIPS_REGION_LSKIP(ir)) {
  ------------------
  |  |  195|  23.6k|	((size_t) ((R)->bpl))
  ------------------
  |  Branch (787:6): [True: 23.6k, False: 0]
  ------------------
  788|  23.6k|		seq->last_bpl = VIPS_REGION_LSKIP(ir);
  ------------------
  |  |  195|  23.6k|	((size_t) ((R)->bpl))
  ------------------
  789|       |
  790|   209k|		for (i = 0; i < nnz; i++) {
  ------------------
  |  Branch (790:15): [True: 185k, False: 23.6k]
  ------------------
  791|   185k|			z = convi->coeff_pos[i];
  792|   185k|			x = z % M->Xsize;
  793|   185k|			y = z / M->Xsize;
  794|       |
  795|   185k|			seq->offsets[i] =
  796|   185k|				(VIPS_REGION_ADDR(ir, x + le, y + to) -
  ------------------
  |  |  227|   185k|	((R)->data + \
  |  |  228|   185k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   185k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   185k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   185k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   185k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   185k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  797|   185k|					VIPS_REGION_ADDR(ir, le, to)) /
  ------------------
  |  |  227|   185k|	((R)->data + \
  |  |  228|   185k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   185k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   185k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   185k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   185k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   185k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  798|   185k|				VIPS_IMAGE_SIZEOF_ELEMENT(ir->im);
  ------------------
  |  |  382|   185k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  ------------------
  799|   185k|		}
  800|  23.6k|	}
  801|       |
  802|  23.6k|	VIPS_GATE_START("vips_convi_gen: work");
  ------------------
  |  |   41|  23.6k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  23.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  23.6k|	{ \
  |  |   43|  23.6k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 23.6k]
  |  |  ------------------
  |  |   44|  23.6k|			vips__thread_gate_start(NAME); \
  |  |   45|  23.6k|	} \
  |  |   46|  23.6k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  23.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  803|       |
  804|   781k|	for (y = to; y < bo; y++) {
  ------------------
  |  Branch (804:15): [True: 757k, False: 23.6k]
  ------------------
  805|   757k|		switch (in->BandFmt) {
  806|      0|		case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (806:3): [True: 0, False: 757k]
  ------------------
  807|      0|			CONV_INT(unsigned char, CLIP_UCHAR);
  ------------------
  |  |  697|      0|	{ \
  |  |  698|      0|		TYPE *restrict p = (TYPE *) VIPS_REGION_ADDR(ir, le, y); \
  |  |  ------------------
  |  |  |  |  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))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  699|      0|		TYPE *restrict q = (TYPE *) VIPS_REGION_ADDR(out_region, le, y); \
  |  |  ------------------
  |  |  |  |  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))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  700|      0|		int *restrict offsets = seq->offsets; \
  |  |  701|      0|\
  |  |  702|      0|		for (x = 0; x < sz; x++) { \
  |  |  ------------------
  |  |  |  Branch (702:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  703|      0|			int sum; \
  |  |  704|      0|			int i; \
  |  |  705|      0|\
  |  |  706|      0|			sum = 0; \
  |  |  707|      0|			for (i = 0; i < nnz; i++) \
  |  |  ------------------
  |  |  |  Branch (707:16): [True: 0, False: 0]
  |  |  ------------------
  |  |  708|      0|				sum += t[i] * p[offsets[i]]; \
  |  |  709|      0|\
  |  |  710|      0|			sum = CLIP(((sum + rounding) / scale) + offset); \
  |  |  ------------------
  |  |  |  |  807|      0|			CONV_INT(unsigned char, CLIP_UCHAR);
  |  |  |  |  ------------------
  |  |  |  |  |  |  742|      0|#define CLIP_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]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  711|      0|\
  |  |  712|      0|			q[x] = sum; \
  |  |  713|      0|			p += 1; \
  |  |  714|      0|		} \
  |  |  715|      0|	}
  ------------------
  808|      0|			break;
  809|       |
  810|      0|		case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (810:3): [True: 0, False: 757k]
  ------------------
  811|      0|			CONV_INT(signed char, CLIP_CHAR);
  ------------------
  |  |  697|      0|	{ \
  |  |  698|      0|		TYPE *restrict p = (TYPE *) VIPS_REGION_ADDR(ir, le, y); \
  |  |  ------------------
  |  |  |  |  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))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  699|      0|		TYPE *restrict q = (TYPE *) VIPS_REGION_ADDR(out_region, le, y); \
  |  |  ------------------
  |  |  |  |  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))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  700|      0|		int *restrict offsets = seq->offsets; \
  |  |  701|      0|\
  |  |  702|      0|		for (x = 0; x < sz; x++) { \
  |  |  ------------------
  |  |  |  Branch (702:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  703|      0|			int sum; \
  |  |  704|      0|			int i; \
  |  |  705|      0|\
  |  |  706|      0|			sum = 0; \
  |  |  707|      0|			for (i = 0; i < nnz; i++) \
  |  |  ------------------
  |  |  |  Branch (707:16): [True: 0, False: 0]
  |  |  ------------------
  |  |  708|      0|				sum += t[i] * p[offsets[i]]; \
  |  |  709|      0|\
  |  |  710|      0|			sum = CLIP(((sum + rounding) / scale) + offset); \
  |  |  ------------------
  |  |  |  |  811|      0|			CONV_INT(signed char, CLIP_CHAR);
  |  |  |  |  ------------------
  |  |  |  |  |  |  743|      0|#define CLIP_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]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  711|      0|\
  |  |  712|      0|			q[x] = sum; \
  |  |  713|      0|			p += 1; \
  |  |  714|      0|		} \
  |  |  715|      0|	}
  ------------------
  812|      0|			break;
  813|       |
  814|      0|		case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (814:3): [True: 0, False: 757k]
  ------------------
  815|      0|			CONV_INT(unsigned short, CLIP_USHORT);
  ------------------
  |  |  697|      0|	{ \
  |  |  698|      0|		TYPE *restrict p = (TYPE *) VIPS_REGION_ADDR(ir, le, y); \
  |  |  ------------------
  |  |  |  |  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))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  699|      0|		TYPE *restrict q = (TYPE *) VIPS_REGION_ADDR(out_region, le, y); \
  |  |  ------------------
  |  |  |  |  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))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  700|      0|		int *restrict offsets = seq->offsets; \
  |  |  701|      0|\
  |  |  702|      0|		for (x = 0; x < sz; x++) { \
  |  |  ------------------
  |  |  |  Branch (702:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  703|      0|			int sum; \
  |  |  704|      0|			int i; \
  |  |  705|      0|\
  |  |  706|      0|			sum = 0; \
  |  |  707|      0|			for (i = 0; i < nnz; i++) \
  |  |  ------------------
  |  |  |  Branch (707:16): [True: 0, False: 0]
  |  |  ------------------
  |  |  708|      0|				sum += t[i] * p[offsets[i]]; \
  |  |  709|      0|\
  |  |  710|      0|			sum = CLIP(((sum + rounding) / scale) + offset); \
  |  |  ------------------
  |  |  |  |  815|      0|			CONV_INT(unsigned short, CLIP_USHORT);
  |  |  |  |  ------------------
  |  |  |  |  |  |  744|      0|#define CLIP_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]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  711|      0|\
  |  |  712|      0|			q[x] = sum; \
  |  |  713|      0|			p += 1; \
  |  |  714|      0|		} \
  |  |  715|      0|	}
  ------------------
  816|      0|			break;
  817|       |
  818|      0|		case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (818:3): [True: 0, False: 757k]
  ------------------
  819|      0|			CONV_INT(signed short, CLIP_SHORT);
  ------------------
  |  |  697|      0|	{ \
  |  |  698|      0|		TYPE *restrict p = (TYPE *) VIPS_REGION_ADDR(ir, le, y); \
  |  |  ------------------
  |  |  |  |  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))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  699|      0|		TYPE *restrict q = (TYPE *) VIPS_REGION_ADDR(out_region, le, y); \
  |  |  ------------------
  |  |  |  |  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))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  700|      0|		int *restrict offsets = seq->offsets; \
  |  |  701|      0|\
  |  |  702|      0|		for (x = 0; x < sz; x++) { \
  |  |  ------------------
  |  |  |  Branch (702:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  703|      0|			int sum; \
  |  |  704|      0|			int i; \
  |  |  705|      0|\
  |  |  706|      0|			sum = 0; \
  |  |  707|      0|			for (i = 0; i < nnz; i++) \
  |  |  ------------------
  |  |  |  Branch (707:16): [True: 0, False: 0]
  |  |  ------------------
  |  |  708|      0|				sum += t[i] * p[offsets[i]]; \
  |  |  709|      0|\
  |  |  710|      0|			sum = CLIP(((sum + rounding) / scale) + offset); \
  |  |  ------------------
  |  |  |  |  819|      0|			CONV_INT(signed short, CLIP_SHORT);
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|      0|#define CLIP_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]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  711|      0|\
  |  |  712|      0|			q[x] = sum; \
  |  |  713|      0|			p += 1; \
  |  |  714|      0|		} \
  |  |  715|      0|	}
  ------------------
  820|      0|			break;
  821|       |
  822|      0|		case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (822:3): [True: 0, False: 757k]
  ------------------
  823|      0|			CONV_INT(unsigned int, CLIP_NONE);
  ------------------
  |  |  697|      0|	{ \
  |  |  698|      0|		TYPE *restrict p = (TYPE *) VIPS_REGION_ADDR(ir, le, y); \
  |  |  ------------------
  |  |  |  |  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))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  699|      0|		TYPE *restrict q = (TYPE *) VIPS_REGION_ADDR(out_region, le, y); \
  |  |  ------------------
  |  |  |  |  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))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  700|      0|		int *restrict offsets = seq->offsets; \
  |  |  701|      0|\
  |  |  702|      0|		for (x = 0; x < sz; x++) { \
  |  |  ------------------
  |  |  |  Branch (702:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  703|      0|			int sum; \
  |  |  704|      0|			int i; \
  |  |  705|      0|\
  |  |  706|      0|			sum = 0; \
  |  |  707|      0|			for (i = 0; i < nnz; i++) \
  |  |  ------------------
  |  |  |  Branch (707:16): [True: 0, False: 0]
  |  |  ------------------
  |  |  708|      0|				sum += t[i] * p[offsets[i]]; \
  |  |  709|      0|\
  |  |  710|      0|			sum = CLIP(((sum + rounding) / scale) + offset); \
  |  |  ------------------
  |  |  |  |  823|      0|			CONV_INT(unsigned int, CLIP_NONE);
  |  |  |  |  ------------------
  |  |  |  |  |  |  746|      0|#define CLIP_NONE(X) (X)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  711|      0|\
  |  |  712|      0|			q[x] = sum; \
  |  |  713|      0|			p += 1; \
  |  |  714|      0|		} \
  |  |  715|      0|	}
  ------------------
  824|      0|			break;
  825|       |
  826|      0|		case VIPS_FORMAT_INT:
  ------------------
  |  Branch (826:3): [True: 0, False: 757k]
  ------------------
  827|      0|			CONV_INT(signed int, CLIP_NONE);
  ------------------
  |  |  697|      0|	{ \
  |  |  698|      0|		TYPE *restrict p = (TYPE *) VIPS_REGION_ADDR(ir, le, y); \
  |  |  ------------------
  |  |  |  |  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))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  699|      0|		TYPE *restrict q = (TYPE *) VIPS_REGION_ADDR(out_region, le, y); \
  |  |  ------------------
  |  |  |  |  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))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  700|      0|		int *restrict offsets = seq->offsets; \
  |  |  701|      0|\
  |  |  702|      0|		for (x = 0; x < sz; x++) { \
  |  |  ------------------
  |  |  |  Branch (702:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  703|      0|			int sum; \
  |  |  704|      0|			int i; \
  |  |  705|      0|\
  |  |  706|      0|			sum = 0; \
  |  |  707|      0|			for (i = 0; i < nnz; i++) \
  |  |  ------------------
  |  |  |  Branch (707:16): [True: 0, False: 0]
  |  |  ------------------
  |  |  708|      0|				sum += t[i] * p[offsets[i]]; \
  |  |  709|      0|\
  |  |  710|      0|			sum = CLIP(((sum + rounding) / scale) + offset); \
  |  |  ------------------
  |  |  |  |  827|      0|			CONV_INT(signed int, CLIP_NONE);
  |  |  |  |  ------------------
  |  |  |  |  |  |  746|      0|#define CLIP_NONE(X) (X)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  711|      0|\
  |  |  712|      0|			q[x] = sum; \
  |  |  713|      0|			p += 1; \
  |  |  714|      0|		} \
  |  |  715|      0|	}
  ------------------
  828|      0|			break;
  829|       |
  830|   757k|		case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (830:3): [True: 757k, False: 0]
  ------------------
  831|   757k|		case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (831:3): [True: 0, False: 757k]
  ------------------
  832|   757k|			CONV_FLOAT(float);
  ------------------
  |  |  720|   757k|	{ \
  |  |  721|   757k|		TYPE *restrict p = (TYPE *) VIPS_REGION_ADDR(ir, le, y); \
  |  |  ------------------
  |  |  |  |  227|   757k|	((R)->data + \
  |  |  |  |  228|   757k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  |  |  ------------------
  |  |  |  |  |  |  195|   757k|	((size_t) ((R)->bpl))
  |  |  |  |  ------------------
  |  |  |  |  229|   757k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  |  |  ------------------
  |  |  |  |  |  |  201|   757k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  384|   757k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  382|   757k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  722|   757k|		TYPE *restrict q = (TYPE *) VIPS_REGION_ADDR(out_region, le, y); \
  |  |  ------------------
  |  |  |  |  227|   757k|	((R)->data + \
  |  |  |  |  228|   757k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  |  |  ------------------
  |  |  |  |  |  |  195|   757k|	((size_t) ((R)->bpl))
  |  |  |  |  ------------------
  |  |  |  |  229|   757k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  |  |  ------------------
  |  |  |  |  |  |  201|   757k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  384|   757k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  382|   757k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  723|   757k|		int *restrict offsets = seq->offsets; \
  |  |  724|   757k|\
  |  |  725|  25.0M|		for (x = 0; x < sz; x++) { \
  |  |  ------------------
  |  |  |  Branch (725:15): [True: 24.2M, False: 757k]
  |  |  ------------------
  |  |  726|  24.2M|			double sum; \
  |  |  727|  24.2M|			int i; \
  |  |  728|  24.2M|\
  |  |  729|  24.2M|			sum = 0; \
  |  |  730|   214M|			for (i = 0; i < nnz; i++) \
  |  |  ------------------
  |  |  |  Branch (730:16): [True: 190M, False: 24.2M]
  |  |  ------------------
  |  |  731|   190M|				sum += t[i] * p[offsets[i]]; \
  |  |  732|  24.2M|\
  |  |  733|  24.2M|			sum = (sum / scale) + offset; \
  |  |  734|  24.2M|\
  |  |  735|  24.2M|			q[x] = sum; \
  |  |  736|  24.2M|			p += 1; \
  |  |  737|  24.2M|		} \
  |  |  738|   757k|	}
  ------------------
  833|   757k|			break;
  834|       |
  835|      0|		case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (835:3): [True: 0, False: 757k]
  ------------------
  836|      0|		case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (836:3): [True: 0, False: 757k]
  ------------------
  837|      0|			CONV_FLOAT(double);
  ------------------
  |  |  720|      0|	{ \
  |  |  721|      0|		TYPE *restrict p = (TYPE *) VIPS_REGION_ADDR(ir, le, y); \
  |  |  ------------------
  |  |  |  |  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))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  722|      0|		TYPE *restrict q = (TYPE *) VIPS_REGION_ADDR(out_region, le, y); \
  |  |  ------------------
  |  |  |  |  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))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  723|      0|		int *restrict offsets = seq->offsets; \
  |  |  724|      0|\
  |  |  725|      0|		for (x = 0; x < sz; x++) { \
  |  |  ------------------
  |  |  |  Branch (725:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  726|      0|			double sum; \
  |  |  727|      0|			int i; \
  |  |  728|      0|\
  |  |  729|      0|			sum = 0; \
  |  |  730|      0|			for (i = 0; i < nnz; i++) \
  |  |  ------------------
  |  |  |  Branch (730:16): [True: 0, False: 0]
  |  |  ------------------
  |  |  731|      0|				sum += t[i] * p[offsets[i]]; \
  |  |  732|      0|\
  |  |  733|      0|			sum = (sum / scale) + offset; \
  |  |  734|      0|\
  |  |  735|      0|			q[x] = sum; \
  |  |  736|      0|			p += 1; \
  |  |  737|      0|		} \
  |  |  738|      0|	}
  ------------------
  838|      0|			break;
  839|       |
  840|      0|		default:
  ------------------
  |  Branch (840:3): [True: 0, False: 757k]
  ------------------
  841|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  842|   757k|		}
  843|   757k|	}
  844|       |
  845|  23.6k|	VIPS_GATE_STOP("vips_convi_gen: work");
  ------------------
  |  |   49|  23.6k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  23.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  23.6k|	{ \
  |  |   51|  23.6k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 23.6k]
  |  |  ------------------
  |  |   52|  23.6k|			vips__thread_gate_stop(NAME); \
  |  |   53|  23.6k|	} \
  |  |   54|  23.6k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  23.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  846|       |
  847|  23.6k|	VIPS_COUNT_PIXELS(out_region, "vips_convi_gen");
  ------------------
  |  |  189|  23.6k|#define VIPS_COUNT_PIXELS(R, N) vips__region_count_pixels(R, N)
  ------------------
  848|       |
  849|  23.6k|	return 0;
  850|  23.6k|}
convi.c:vips_convi_start:
  259|  57.2k|{
  260|  57.2k|	VipsImage *in = (VipsImage *) a;
  261|  57.2k|	VipsConvi *convi = (VipsConvi *) b;
  262|  57.2k|	VipsConviSequence *seq;
  263|       |
  264|  57.2k|	if (!(seq = VIPS_NEW(out, VipsConviSequence)))
  ------------------
  |  |   70|  57.2k|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  57.2k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  57.2k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  57.2k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  57.2k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (264:6): [True: 0, False: 57.2k]
  ------------------
  265|      0|		return NULL;
  266|       |
  267|  57.2k|	seq->convi = convi;
  268|  57.2k|	seq->ir = NULL;
  269|  57.2k|	seq->last_bpl = -1;
  270|       |#ifdef HAVE_ORC
  271|       |	seq->offsets = NULL;
  272|       |	seq->t1 = NULL;
  273|       |	seq->t2 = NULL;
  274|       |#endif /*HAVE_ORC*/
  275|       |
  276|  57.2k|	seq->ir = vips_region_new(in);
  277|       |
  278|  57.2k|	if (convi->nnz) {
  ------------------
  |  Branch (278:6): [True: 57.2k, False: 0]
  ------------------
  279|  57.2k|		if (!(seq->offsets = VIPS_ARRAY(NULL, convi->nnz, int))) {
  ------------------
  |  |   72|  57.2k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  57.2k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  57.2k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  57.2k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  57.2k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (279:7): [True: 0, False: 57.2k]
  ------------------
  280|      0|			vips_convi_stop(seq, in, convi);
  281|      0|			return NULL;
  282|      0|		}
  283|  57.2k|	}
  284|       |
  285|       |#ifdef HAVE_ORC
  286|       |	/* Vector mode.
  287|       |	 */
  288|       |	if (convi->n_pass) {
  289|       |		seq->t1 = VIPS_ARRAY(NULL, VIPS_IMAGE_N_ELEMENTS(in), short);
  290|       |		seq->t2 = VIPS_ARRAY(NULL, VIPS_IMAGE_N_ELEMENTS(in), short);
  291|       |
  292|       |		if (!seq->t1 ||
  293|       |			!seq->t2) {
  294|       |			vips_convi_stop(seq, in, convi);
  295|       |			return NULL;
  296|       |		}
  297|       |	}
  298|       |#endif /*HAVE_ORC*/
  299|       |
  300|  57.2k|	return (void *) seq;
  301|  57.2k|}
convi.c:vips_convi_stop:
  242|  57.2k|{
  243|  57.2k|	VipsConviSequence *seq = (VipsConviSequence *) vseq;
  244|       |
  245|  57.2k|	VIPS_UNREF(seq->ir);
  ------------------
  |  |   57|  57.2k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  57.2k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  57.2k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  57.2k|	{ \
  |  |  |  |   43|  57.2k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 57.2k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  57.2k|			(void) F((S)); \
  |  |  |  |   45|  57.2k|			(S) = 0; \
  |  |  |  |   46|  57.2k|		} \
  |  |  |  |   47|  57.2k|	} \
  |  |  |  |   48|  57.2k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  57.2k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  246|  57.2k|	VIPS_FREE(seq->offsets);
  ------------------
  |  |   50|  57.2k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  57.2k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  57.2k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  57.2k|	{ \
  |  |  |  |   43|  57.2k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 57.2k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  57.2k|			(void) F((S)); \
  |  |  |  |   45|  57.2k|			(S) = 0; \
  |  |  |  |   46|  57.2k|		} \
  |  |  |  |   47|  57.2k|	} \
  |  |  |  |   48|  57.2k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  57.2k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  247|       |#ifdef HAVE_ORC
  248|       |	VIPS_FREE(seq->t1);
  249|       |	VIPS_FREE(seq->t2);
  250|       |#endif /*HAVE_ORC*/
  251|       |
  252|  57.2k|	return 0;
  253|  57.2k|}
convi.c:vips_convi_init:
 1251|  57.2k|{
 1252|  57.2k|	convi->nnz = 0;
 1253|  57.2k|	convi->coeff = NULL;
 1254|  57.2k|	convi->coeff_pos = NULL;
 1255|  57.2k|#if defined(HAVE_HWY) || defined(HAVE_ORC)
 1256|  57.2k|	convi->mant = NULL;
 1257|  57.2k|#endif /*HAVE_HWY || HAVE_ORC*/
 1258|  57.2k|}

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|}
convolution.c:vips_convolution_build:
   87|   133k|{
   88|   133k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|   133k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|   133k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|   133k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   89|   133k|	VipsConvolution *convolution = VIPS_CONVOLUTION(object);
  ------------------
  |  |   40|   133k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   133k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   133k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|   133k|		VIPS_TYPE_CONVOLUTION, VipsConvolution))
  ------------------
   90|   133k|	VipsImage **t = (VipsImage **) vips_object_local_array(object, 2);
   91|       |
   92|       |#ifdef DEBUG
   93|       |	printf("vips_convolution_build: ");
   94|       |	vips_object_print_name(object);
   95|       |	printf("\n");
   96|       |#endif /*DEBUG*/
   97|       |
   98|   133k|	if (VIPS_OBJECT_CLASS(vips_convolution_parent_class)->build(object))
  ------------------
  |  |  435|   133k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|   133k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   133k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (98:6): [True: 0, False: 133k]
  ------------------
   99|      0|		return -1;
  100|       |
  101|   133k|	if (vips_check_matrix(class->nickname, convolution->mask, &t[0]))
  ------------------
  |  Branch (101:6): [True: 0, False: 133k]
  ------------------
  102|      0|		return -1;
  103|   133k|	convolution->M = t[0];
  104|       |
  105|   133k|	return 0;
  106|   133k|}
convolution.c:vips_convolution_init:
  148|   133k|{
  149|   133k|}

vips_convsep:
  187|  19.0k|{
  188|  19.0k|	va_list ap;
  189|  19.0k|	int result;
  190|       |
  191|  19.0k|	va_start(ap, mask);
  192|  19.0k|	result = vips_call_split("convsep", ap, in, out, mask);
  193|  19.0k|	va_end(ap);
  194|       |
  195|  19.0k|	return result;
  196|  19.0k|}
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|}
convsep.c:vips_convsep_build:
   62|  19.0k|{
   63|  19.0k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  19.0k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  19.0k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  19.0k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   64|  19.0k|	VipsConvolution *convolution = (VipsConvolution *) object;
   65|  19.0k|	VipsConvsep *convsep = (VipsConvsep *) object;
   66|  19.0k|	VipsImage **t = (VipsImage **)
   67|  19.0k|		vips_object_local_array(object, 4);
   68|       |
   69|  19.0k|	VipsImage *in;
   70|       |
   71|  19.0k|	g_object_set(convsep, "out", vips_image_new(), NULL);
   72|       |
   73|  19.0k|	if (VIPS_OBJECT_CLASS(vips_convsep_parent_class)->build(object))
  ------------------
  |  |  435|  19.0k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  19.0k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  19.0k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (73:6): [True: 0, False: 19.0k]
  ------------------
   74|      0|		return -1;
   75|       |
   76|  19.0k|	if (vips_check_separable(class->nickname, convolution->M))
  ------------------
  |  Branch (76:6): [True: 0, False: 19.0k]
  ------------------
   77|      0|		return -1;
   78|       |
   79|  19.0k|	in = convolution->in;
   80|       |
   81|  19.0k|	if (convsep->precision == VIPS_PRECISION_APPROXIMATE) {
  ------------------
  |  Branch (81:6): [True: 0, False: 19.0k]
  ------------------
   82|      0|		if (vips_convasep(in, &t[0], convolution->M,
  ------------------
  |  Branch (82:7): [True: 0, False: 0]
  ------------------
   83|      0|				"layers", convsep->layers,
   84|      0|				NULL))
   85|      0|			return -1;
   86|      0|		in = t[0];
   87|      0|	}
   88|  19.0k|	else {
   89|       |		/* Take a copy, since we must set the offset.
   90|       |		 */
   91|  19.0k|		if (vips_rot(convolution->M, &t[0], VIPS_ANGLE_D90, NULL) ||
  ------------------
  |  Branch (91:7): [True: 0, False: 19.0k]
  ------------------
   92|  19.0k|			vips_copy(t[0], &t[3], NULL))
  ------------------
  |  Branch (92:4): [True: 0, False: 19.0k]
  ------------------
   93|      0|			return -1;
   94|  19.0k|		vips_image_set_double(t[3], "offset", 0);
   95|       |
   96|  19.0k|		if (vips_conv(in, &t[1], convolution->M,
  ------------------
  |  Branch (96:7): [True: 0, False: 19.0k]
  ------------------
   97|  19.0k|				"precision", convsep->precision,
   98|  19.0k|				"layers", convsep->layers,
   99|  19.0k|				"cluster", convsep->cluster,
  100|  19.0k|				NULL) ||
  101|  19.0k|			vips_conv(t[1], &t[2], t[3],
  ------------------
  |  Branch (101:4): [True: 0, False: 19.0k]
  ------------------
  102|  19.0k|				"precision", convsep->precision,
  103|  19.0k|				"layers", convsep->layers,
  104|  19.0k|				"cluster", convsep->cluster,
  105|  19.0k|				NULL))
  106|      0|			return -1;
  107|  19.0k|		in = t[2];
  108|  19.0k|	}
  109|       |
  110|  19.0k|	if (vips_image_write(in, convolution->out))
  ------------------
  |  Branch (110:6): [True: 0, False: 19.0k]
  ------------------
  111|      0|		return -1;
  112|       |
  113|  19.0k|	return 0;
  114|  19.0k|}
convsep.c:vips_convsep_init:
  153|  19.0k|{
  154|  19.0k|	convsep->precision = VIPS_PRECISION_FLOAT;
  155|  19.0k|	convsep->layers = 5;
  156|  19.0k|	convsep->cluster = 1;
  157|  19.0k|}

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|}

vips_gaussblur:
  195|  19.0k|{
  196|  19.0k|	va_list ap;
  197|  19.0k|	int result;
  198|       |
  199|  19.0k|	va_start(ap, sigma);
  200|  19.0k|	result = vips_call_split("gaussblur", ap, in, out, sigma);
  201|  19.0k|	va_end(ap);
  202|       |
  203|  19.0k|	return result;
  204|  19.0k|}
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|}
gaussblur.c:vips_gaussblur_build:
   72|  19.0k|{
   73|  19.0k|	VipsGaussblur *gaussblur = (VipsGaussblur *) object;
   74|  19.0k|	VipsImage **t = (VipsImage **) vips_object_local_array(object, 2);
   75|       |
   76|  19.0k|	if (VIPS_OBJECT_CLASS(vips_gaussblur_parent_class)->build(object))
  ------------------
  |  |  435|  19.0k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  19.0k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  19.0k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (76:6): [True: 0, False: 19.0k]
  ------------------
   77|      0|		return -1;
   78|       |
   79|       |	/* vips_gaussmat() will make a 1x1 pixel mask for anything smaller than
   80|       |	 * this.
   81|       |	 */
   82|  19.0k|	if (gaussblur->sigma < 0.2) {
  ------------------
  |  Branch (82:6): [True: 0, False: 19.0k]
  ------------------
   83|      0|		if (vips_copy(gaussblur->in, &t[1], NULL))
  ------------------
  |  Branch (83:7): [True: 0, False: 0]
  ------------------
   84|      0|			return -1;
   85|      0|	}
   86|  19.0k|	else {
   87|  19.0k|		if (vips_gaussmat(&t[0],
  ------------------
  |  Branch (87:7): [True: 0, False: 19.0k]
  ------------------
   88|  19.0k|				gaussblur->sigma, gaussblur->min_ampl,
   89|  19.0k|				"separable", TRUE,
  ------------------
  |  |  798|  19.0k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  19.0k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
   90|  19.0k|				"precision", gaussblur->precision,
   91|  19.0k|				NULL))
   92|      0|			return -1;
   93|       |
   94|       |#ifdef DEBUG
   95|       |		printf("gaussblur: blurring with:\n");
   96|       |		vips_matrixprint(t[0], NULL);
   97|       |#endif /*DEBUG*/
   98|       |
   99|  19.0k|		g_info("gaussblur mask width %d", t[0]->Xsize);
  ------------------
  |  |  341|  19.0k|#define g_info(...)     g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|  19.0k|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  342|  19.0k|                               G_LOG_LEVEL_INFO,     \
  |  |  343|  19.0k|                               __VA_ARGS__)
  ------------------
  100|       |
  101|  19.0k|		if (vips_convsep(gaussblur->in, &t[1], t[0],
  ------------------
  |  Branch (101:7): [True: 0, False: 19.0k]
  ------------------
  102|  19.0k|				"precision", gaussblur->precision,
  103|  19.0k|				NULL))
  104|      0|			return -1;
  105|  19.0k|	}
  106|       |
  107|  19.0k|	g_object_set(object, "out", vips_image_new(), NULL);
  108|       |
  109|  19.0k|	if (vips_image_write(t[1], gaussblur->out))
  ------------------
  |  Branch (109:6): [True: 0, False: 19.0k]
  ------------------
  110|      0|		return -1;
  111|       |
  112|  19.0k|	return 0;
  113|  19.0k|}
gaussblur.c:vips_gaussblur_init:
  167|  19.0k|{
  168|  19.0k|	gaussblur->sigma = 1.5;
  169|  19.0k|	gaussblur->min_ampl = 0.2;
  170|  19.0k|	gaussblur->precision = VIPS_PRECISION_INTEGER;
  171|  19.0k|}

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|  19.0k|{
  187|  19.0k|	va_list ap;
  188|  19.0k|	int result;
  189|       |
  190|  19.0k|	va_start(ap, height);
  191|  19.0k|	result = vips_call_split("black", ap, out, width, height);
  192|  19.0k|	va_end(ap);
  193|       |
  194|  19.0k|	return result;
  195|  19.0k|}
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|     47|{
  102|     47|	VipsCreate *create = VIPS_CREATE(object);
  ------------------
  |  |   40|     47|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|     47|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|     47|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|     47|		VIPS_TYPE_CREATE, VipsCreate))
  ------------------
  103|     47|	VipsBlack *black = (VipsBlack *) object;
  104|       |
  105|     47|	if (VIPS_OBJECT_CLASS(vips_black_parent_class)->build(object))
  ------------------
  |  |  435|     47|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|     47|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|     47|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (105:6): [True: 0, False: 47]
  ------------------
  106|      0|		return -1;
  107|       |
  108|     47|	vips_image_init_fields(create->out,
  109|     47|		black->width, black->height, black->bands,
  110|     47|		VIPS_FORMAT_UCHAR, VIPS_CODING_NONE,
  111|     47|		VIPS_INTERPRETATION_MULTIBAND,
  112|     47|		1.0, 1.0);
  113|     47|	if (vips_image_pipelinev(create->out,
  ------------------
  |  Branch (113:6): [True: 0, False: 47]
  ------------------
  114|     47|			VIPS_DEMAND_STYLE_ANY, NULL))
  115|      0|		return -1;
  116|       |
  117|     47|	if (vips_image_generate(create->out,
  ------------------
  |  Branch (117:6): [True: 0, False: 47]
  ------------------
  118|     47|			NULL, vips_black_gen, NULL, NULL, NULL))
  119|      0|		return -1;
  120|       |
  121|     47|	return 0;
  122|     47|}
black.c:vips_black_gen:
   85|  6.14k|{
   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|  6.14k|	vips_region_black(out_region);
   95|       |
   96|  6.14k|	return 0;
   97|  6.14k|}
black.c:vips_black_init:
  163|  19.0k|{
  164|  19.0k|	black->bands = 1;
  165|  19.0k|}

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|  15.6k|{
   94|  15.6k|	VipsCreate *create = VIPS_CREATE(object);
  ------------------
  |  |   40|  15.6k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  15.6k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  15.6k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  15.6k|		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|  15.6k|	g_object_set(create, "out", vips_image_new(), NULL);
  103|       |
  104|  15.6k|	if (VIPS_OBJECT_CLASS(vips_create_parent_class)->build(object))
  ------------------
  |  |  435|  15.6k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  15.6k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  15.6k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (104:6): [True: 0, False: 15.6k]
  ------------------
  105|      0|		return -1;
  106|       |
  107|  15.6k|	return 0;
  108|  15.6k|}
create.c:vips_create_init:
  132|  38.1k|{
  133|  38.1k|}

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|}

vips_gaussmat:
  266|  19.0k|{
  267|  19.0k|	va_list ap;
  268|  19.0k|	int result;
  269|       |
  270|  19.0k|	va_start(ap, min_ampl);
  271|  19.0k|	result = vips_call_split("gaussmat", ap, out, sigma, min_ampl);
  272|  19.0k|	va_end(ap);
  273|       |
  274|  19.0k|	return result;
  275|  19.0k|}
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|}
gaussmat.c:vips_gaussmat_build:
   96|  15.6k|{
   97|  15.6k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  15.6k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  15.6k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  15.6k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   98|  15.6k|	VipsCreate *create = VIPS_CREATE(object);
  ------------------
  |  |   40|  15.6k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  15.6k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  15.6k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  15.6k|		VIPS_TYPE_CREATE, VipsCreate))
  ------------------
   99|  15.6k|	VipsGaussmat *gaussmat = (VipsGaussmat *) object;
  100|  15.6k|	double sig2 = 2. * gaussmat->sigma * gaussmat->sigma;
  101|  15.6k|	int max_x = VIPS_CLIP(0, 8 * gaussmat->sigma, MASK_SANITY);
  ------------------
  |  |   57|  15.6k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|  31.3k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 0, False: 15.6k]
  |  |  |  |  |  Branch (54:32): [True: 0, False: 15.6k]
  |  |  |  |  |  Branch (54:44): [True: 0, False: 15.6k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  102|       |
  103|  15.6k|	int x, y;
  104|  15.6k|	int width, height;
  105|  15.6k|	double sum;
  106|       |
  107|  15.6k|	if (VIPS_OBJECT_CLASS(vips_gaussmat_parent_class)->build(object))
  ------------------
  |  |  435|  15.6k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  15.6k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  15.6k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (107:6): [True: 0, False: 15.6k]
  ------------------
  108|      0|		return -1;
  109|       |
  110|       |	/* The old, deprecated @integer property has been deliberately set to
  111|       |	 * FALSE and they've not used the new @precision property ... switch
  112|       |	 * to float to help them out.
  113|       |	 */
  114|  15.6k|	if (vips_object_argument_isset(object, "integer") &&
  ------------------
  |  Branch (114:6): [True: 0, False: 15.6k]
  ------------------
  115|  15.6k|		!vips_object_argument_isset(object, "precision") &&
  ------------------
  |  Branch (115:3): [True: 0, False: 0]
  ------------------
  116|  15.6k|		!gaussmat->integer)
  ------------------
  |  Branch (116:3): [True: 0, False: 0]
  ------------------
  117|      0|		gaussmat->precision = VIPS_PRECISION_FLOAT; // FIXME: Invalidates operation cache
  118|       |
  119|       |	/* Find the size of the mask. Limit the mask size to 10k x 10k for
  120|       |	 * sanity. We allow x == 0, meaning a 1x1 mask.
  121|       |	 */
  122|   101k|	for (x = 0; x < max_x; x++) {
  ------------------
  |  Branch (122:14): [True: 101k, False: 0]
  ------------------
  123|   101k|		double v = exp(-((double) (x * x)) / sig2);
  124|       |
  125|   101k|		if (v < gaussmat->min_ampl)
  ------------------
  |  Branch (125:7): [True: 15.6k, False: 86.2k]
  ------------------
  126|  15.6k|			break;
  127|   101k|	}
  128|  15.6k|	if (x >= MASK_SANITY) {
  ------------------
  |  |   92|  15.6k|#define MASK_SANITY (5000)
  ------------------
  |  Branch (128:6): [True: 0, False: 15.6k]
  ------------------
  129|      0|		vips_error(class->nickname, "%s", _("mask too large"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  130|      0|		return -1;
  131|      0|	}
  132|  15.6k|	width = 2 * VIPS_MAX(x - 1, 0) + 1;
  ------------------
  |  |   54|  15.6k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 15.6k, False: 0]
  |  |  ------------------
  ------------------
  133|  15.6k|	height = gaussmat->separable ? 1 : width;
  ------------------
  |  Branch (133:11): [True: 15.6k, False: 0]
  ------------------
  134|       |
  135|  15.6k|	vips_image_init_fields(create->out,
  136|  15.6k|		width, height, 1,
  137|  15.6k|		VIPS_FORMAT_DOUBLE, VIPS_CODING_NONE,
  138|  15.6k|		VIPS_INTERPRETATION_MULTIBAND,
  139|  15.6k|		1.0, 1.0);
  140|  15.6k|	if (vips_image_pipelinev(create->out, VIPS_DEMAND_STYLE_ANY, NULL) ||
  ------------------
  |  Branch (140:6): [True: 0, False: 15.6k]
  ------------------
  141|  15.6k|		vips_image_write_prepare(create->out))
  ------------------
  |  Branch (141:3): [True: 0, False: 15.6k]
  ------------------
  142|      0|		return -1;
  143|       |
  144|  15.6k|	sum = 0.0;
  145|  31.3k|	for (y = 0; y < height; y++) {
  ------------------
  |  Branch (145:14): [True: 15.6k, False: 15.6k]
  ------------------
  146|   172k|		for (x = 0; x < width; x++) {
  ------------------
  |  Branch (146:15): [True: 156k, False: 15.6k]
  ------------------
  147|   156k|			int xo = x - width / 2;
  148|   156k|			int yo = y - height / 2;
  149|   156k|			double distance = xo * xo + yo * yo;
  150|   156k|			double v = exp(-distance / sig2);
  151|       |
  152|   156k|			if (gaussmat->precision != VIPS_PRECISION_FLOAT)
  ------------------
  |  Branch (152:8): [True: 156k, False: 0]
  ------------------
  153|   156k|				v = VIPS_RINT(20 * v);
  ------------------
  |  |   74|   156k|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  154|       |
  155|   156k|			*VIPS_MATRIX(create->out, x, y) = v;
  ------------------
  |  |  432|   156k|	((double *) VIPS_IMAGE_ADDR(I, X, Y))
  |  |  ------------------
  |  |  |  |  418|   156k|	((I)->data + \
  |  |  |  |  419|   156k|		(Y) *VIPS_IMAGE_SIZEOF_LINE(I) + \
  |  |  |  |  ------------------
  |  |  |  |  |  |  386|   156k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  384|   156k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  382|   156k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  420|   156k|		(X) *VIPS_IMAGE_SIZEOF_PEL(I))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   156k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   156k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  156|   156k|			sum += v;
  157|   156k|		}
  158|  15.6k|	}
  159|       |
  160|       |	/* Make sure we can't make sum == 0: it'd certainly cause /0 later.
  161|       |	 */
  162|  15.6k|	if (sum == 0)
  ------------------
  |  Branch (162:6): [True: 0, False: 15.6k]
  ------------------
  163|      0|		sum = 1;
  164|       |
  165|  15.6k|	vips_image_set_double(create->out, "scale", sum);
  166|  15.6k|	vips_image_set_double(create->out, "offset", 0.0);
  167|       |
  168|  15.6k|	return 0;
  169|  15.6k|}
gaussmat.c:vips_gaussmat_init:
  222|  19.0k|{
  223|  19.0k|	gaussmat->sigma = 1;
  224|  19.0k|	gaussmat->min_ampl = 0.1;
  225|  19.0k|	gaussmat->precision = VIPS_PRECISION_INTEGER;
  226|  19.0k|}

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

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_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_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|  1.46k|{
  523|  1.46k|	const void *data;
  524|  1.46k|	size_t size;
  525|  1.46k|	ExifData *ed;
  526|  1.46k|	VipsExifParams params;
  527|  1.46k|	const char *str;
  528|       |
  529|  1.46k|	if (!vips_image_get_typeof(image, VIPS_META_EXIF_NAME))
  ------------------
  |  |   46|  1.46k|#define VIPS_META_EXIF_NAME "exif-data"
  ------------------
  |  Branch (529:6): [True: 0, False: 1.46k]
  ------------------
  530|      0|		return 0;
  531|  1.46k|	if (vips_image_get_blob(image, VIPS_META_EXIF_NAME, &data, &size))
  ------------------
  |  |   46|  1.46k|#define VIPS_META_EXIF_NAME "exif-data"
  ------------------
  |  Branch (531:6): [True: 0, False: 1.46k]
  ------------------
  532|      0|		return -1;
  533|  1.46k|	if (!(ed = vips_exif_load_data_without_fix(data, size)))
  ------------------
  |  Branch (533:6): [True: 0, False: 1.46k]
  ------------------
  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|  1.46k|	if (vips_image_resolution_from_exif(image, ed) &&
  ------------------
  |  Branch (547:6): [True: 1.38k, False: 78]
  ------------------
  548|  1.46k|		vips_exif_resolution_from_image(ed, image)) {
  ------------------
  |  Branch (548:3): [True: 0, False: 1.38k]
  ------------------
  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|  1.46k|	exif_data_fix(ed);
  557|       |
  558|       |	/* Attach informational fields for what we find.
  559|       |	 */
  560|  1.46k|	params.image = image;
  561|  1.46k|	params.ed = ed;
  562|  1.46k|	exif_data_foreach_content(ed,
  563|  1.46k|		(ExifDataForeachContentFunc) vips_exif_get_content, &params);
  564|       |
  565|  1.46k|	vips_image_set_blob_copy(image,
  566|  1.46k|		"jpeg-thumbnail-data", ed->data, ed->size);
  567|       |
  568|  1.46k|	exif_data_free(ed);
  569|       |
  570|       |	/* Orientation handling. ifd0 has the Orientation tag for the main
  571|       |	 * image.
  572|       |	 */
  573|  1.46k|	if (vips_image_get_typeof(image, "exif-ifd0-Orientation") != 0 &&
  ------------------
  |  Branch (573:6): [True: 188, False: 1.27k]
  ------------------
  574|  1.46k|		!vips_image_get_string(image,
  ------------------
  |  Branch (574:3): [True: 188, False: 0]
  ------------------
  575|    188|			"exif-ifd0-Orientation", &str)) {
  576|    188|		int orientation;
  577|       |
  578|    188|		orientation = atoi(str);
  579|    188|		if (orientation < 1 ||
  ------------------
  |  Branch (579:7): [True: 17, False: 171]
  ------------------
  580|    188|			orientation > 8)
  ------------------
  |  Branch (580:4): [True: 24, False: 147]
  ------------------
  581|     41|			orientation = 1;
  582|    188|		vips_image_set_int(image, VIPS_META_ORIENTATION, orientation);
  ------------------
  |  |  149|    188|#define VIPS_META_ORIENTATION "orientation"
  ------------------
  583|    188|	}
  584|       |
  585|  1.46k|	return 0;
  586|  1.46k|}
exif.c:vips_exif_load_data_without_fix:
  192|  1.46k|{
  193|  1.46k|	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|  1.46k|	if (length < 4) {
  ------------------
  |  Branch (198:6): [True: 0, False: 1.46k]
  ------------------
  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|  1.46k|	if (length > 1 << 23) {
  ------------------
  |  Branch (202:6): [True: 0, False: 1.46k]
  ------------------
  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|  1.46k|	if (!(ed = exif_data_new())) {
  ------------------
  |  Branch (207:6): [True: 0, False: 1.46k]
  ------------------
  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|  1.46k|	exif_data_unset_option(ed, EXIF_DATA_OPTION_FOLLOW_SPECIFICATION);
  213|  1.46k|	if (!vips_isprefix("Exif", (char *) data)) {
  ------------------
  |  Branch (213:6): [True: 0, False: 1.46k]
  ------------------
  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|  1.46k|	else
  224|  1.46k|		exif_data_load_data(ed, data, length);
  225|       |
  226|  1.46k|	return ed;
  227|  1.46k|}
exif.c:vips_image_resolution_from_exif:
  442|  1.46k|{
  443|  1.46k|	double xres, yres;
  444|  1.46k|	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|  1.46k|	if (vips_exif_entry_get_double(ed, 0, EXIF_TAG_X_RESOLUTION, &xres) ||
  ------------------
  |  Branch (452:6): [True: 1.34k, False: 120]
  ------------------
  453|  1.46k|		vips_exif_entry_get_double(ed,
  ------------------
  |  Branch (453:3): [True: 34, False: 86]
  ------------------
  454|    120|			0, EXIF_TAG_Y_RESOLUTION, &yres))
  455|  1.37k|		return -1;
  456|       |
  457|       |	/* resuint is optional and defaults to inch.
  458|       |	 */
  459|     86|	unit = 2;
  460|     86|	(void) vips_exif_entry_get_int(ed,
  461|     86|		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|     86|	switch (unit) {
  470|      5|	case 1:
  ------------------
  |  Branch (470:2): [True: 5, False: 81]
  ------------------
  471|       |		/* No units, instead xres / yres gives the pixel aspect ratio.
  472|       |		 */
  473|      5|		break;
  474|       |
  475|     71|	case 2:
  ------------------
  |  Branch (475:2): [True: 71, False: 15]
  ------------------
  476|       |		/* In inches.
  477|       |		 */
  478|     71|		xres /= 25.4;
  479|     71|		yres /= 25.4;
  480|     71|		vips_image_set_string(image,
  481|     71|			VIPS_META_RESOLUTION_UNIT, "in");
  ------------------
  |  |   93|     71|#define VIPS_META_RESOLUTION_UNIT "resolution-unit"
  ------------------
  482|     71|		break;
  483|       |
  484|      2|	case 3:
  ------------------
  |  Branch (484:2): [True: 2, False: 84]
  ------------------
  485|       |		/* In cm.
  486|       |		 */
  487|      2|		xres /= 10.0;
  488|      2|		yres /= 10.0;
  489|      2|		vips_image_set_string(image,
  490|      2|			VIPS_META_RESOLUTION_UNIT, "cm");
  ------------------
  |  |   93|      2|#define VIPS_META_RESOLUTION_UNIT "resolution-unit"
  ------------------
  491|      2|		break;
  492|       |
  493|      8|	default:
  ------------------
  |  Branch (493:2): [True: 8, False: 78]
  ------------------
  494|      8|		g_warning("%s", _("unknown EXIF resolution unit"));
  ------------------
  |  |  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__)
  ------------------
  495|      8|		return -1;
  496|     86|	}
  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|     78|	image->Xres = VIPS_MAX(0, xres);
  ------------------
  |  |   54|     78|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 78]
  |  |  ------------------
  ------------------
  507|     78|	image->Yres = VIPS_MAX(0, yres);
  ------------------
  |  |   54|     78|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 78]
  |  |  ------------------
  ------------------
  508|       |
  509|     78|	return 0;
  510|     86|}
exif.c:vips_exif_entry_get_double:
  416|  1.58k|{
  417|  1.58k|	ExifEntry *entry;
  418|       |
  419|  1.58k|	if (!(entry = exif_content_get_entry(ed->ifd[ifd], tag)) ||
  ------------------
  |  Branch (419:6): [True: 1.34k, False: 235]
  ------------------
  420|  1.58k|		entry->components != 1)
  ------------------
  |  Branch (420:3): [True: 16, False: 219]
  ------------------
  421|  1.36k|		return -1;
  422|       |
  423|    219|	return vips_exif_get_double(ed, entry, 0, out);
  424|  1.58k|}
exif.c:vips_exif_get_double:
  290|    219|{
  291|    219|	ExifRational rv;
  292|    219|	ExifSRational srv;
  293|    219|	double value;
  294|       |
  295|    219|	if (!vips_exif_get_rational(ed, entry, component, &rv)) {
  ------------------
  |  Branch (295:6): [True: 195, False: 24]
  ------------------
  296|    195|		if (rv.denominator == 0)
  ------------------
  |  Branch (296:7): [True: 15, False: 180]
  ------------------
  297|     15|			value = 0;
  298|    180|		else
  299|    180|			value = (double) rv.numerator / rv.denominator;
  300|    195|	}
  301|     24|	else if (!vips_exif_get_srational(ed, entry, component, &srv)) {
  ------------------
  |  Branch (301:11): [True: 11, False: 13]
  ------------------
  302|     11|		if (srv.denominator == 0)
  ------------------
  |  Branch (302:7): [True: 3, False: 8]
  ------------------
  303|      3|			value = 0;
  304|      8|		else
  305|      8|			value = (double) srv.numerator / srv.denominator;
  306|     11|	}
  307|     13|	else
  308|     13|		return -1;
  309|       |
  310|    206|	*out = value;
  311|       |
  312|    206|	return 0;
  313|    219|}
exif.c:vips_exif_get_rational:
  256|  15.4k|{
  257|  15.4k|	if (entry->format == EXIF_FORMAT_RATIONAL) {
  ------------------
  |  Branch (257:6): [True: 10.2k, False: 5.23k]
  ------------------
  258|  10.2k|		ExifByteOrder bo = exif_data_get_byte_order(ed);
  259|  10.2k|		size_t sizeof_component = entry->size / entry->components;
  260|  10.2k|		size_t offset = component * sizeof_component;
  261|       |
  262|  10.2k|		*out = exif_get_rational(entry->data + offset, bo);
  263|  10.2k|	}
  264|  5.23k|	else
  265|  5.23k|		return -1;
  266|       |
  267|  10.2k|	return 0;
  268|  15.4k|}
exif.c:vips_exif_get_srational:
  273|  5.70k|{
  274|  5.70k|	if (entry->format == EXIF_FORMAT_SRATIONAL) {
  ------------------
  |  Branch (274:6): [True: 912, False: 4.79k]
  ------------------
  275|    912|		ExifByteOrder bo = exif_data_get_byte_order(ed);
  276|    912|		size_t sizeof_component = entry->size / entry->components;
  277|    912|		size_t offset = component * sizeof_component;
  278|       |
  279|    912|		*out = exif_get_srational(entry->data + offset, bo);
  280|    912|	}
  281|  4.79k|	else
  282|  4.79k|		return -1;
  283|       |
  284|    912|	return 0;
  285|  5.70k|}
exif.c:vips_exif_entry_get_int:
  428|     86|{
  429|     86|	ExifEntry *entry;
  430|       |
  431|     86|	if (!(entry = exif_content_get_entry(ed->ifd[ifd], tag)) ||
  ------------------
  |  Branch (431:6): [True: 26, False: 60]
  ------------------
  432|     86|		entry->components != 1)
  ------------------
  |  Branch (432:3): [True: 19, False: 41]
  ------------------
  433|     45|		return -1;
  434|       |
  435|     41|	return vips_exif_get_int(ed, entry, 0, out);
  436|     86|}
exif.c:vips_exif_get_int:
  232|  29.4k|{
  233|  29.4k|	ExifByteOrder bo = exif_data_get_byte_order(ed);
  234|  29.4k|	size_t sizeof_component = entry->size / entry->components;
  235|  29.4k|	size_t offset = component * sizeof_component;
  236|       |
  237|  29.4k|	if (entry->format == EXIF_FORMAT_SHORT)
  ------------------
  |  Branch (237:6): [True: 14.9k, False: 14.5k]
  ------------------
  238|  14.9k|		*out = exif_get_short(entry->data + offset, bo);
  239|  14.5k|	else if (entry->format == EXIF_FORMAT_SSHORT)
  ------------------
  |  Branch (239:11): [True: 2.68k, False: 11.8k]
  ------------------
  240|  2.68k|		*out = exif_get_sshort(entry->data + offset, bo);
  241|  11.8k|	else if (entry->format == EXIF_FORMAT_LONG)
  ------------------
  |  Branch (241:11): [True: 1.52k, False: 10.3k]
  ------------------
  242|       |		/* This won't work for huge values, but who cares.
  243|       |		 */
  244|  1.52k|		*out = (int) exif_get_long(entry->data + offset, bo);
  245|  10.3k|	else if (entry->format == EXIF_FORMAT_SLONG)
  ------------------
  |  Branch (245:11): [True: 664, False: 9.64k]
  ------------------
  246|    664|		*out = exif_get_slong(entry->data + offset, bo);
  247|  9.64k|	else
  248|  9.64k|		return -1;
  249|       |
  250|  19.7k|	return 0;
  251|  29.4k|}
exif.c:vips_exif_get_content:
  409|  7.31k|{
  410|  7.31k|	exif_content_foreach_entry(content,
  411|  7.31k|		(ExifContentForeachEntryFunc) vips_exif_attach_entry, params);
  412|  7.31k|}
exif.c:vips_exif_attach_entry:
  385|  20.6k|{
  386|  20.6k|	const char *tag_name;
  387|  20.6k|	char vips_name_txt[256];
  388|  20.6k|	VipsBuf vips_name = VIPS_BUF_STATIC(vips_name_txt);
  ------------------
  |  |   60|  20.6k|	{ \
  |  |   61|  20.6k|		&TEXT[0], sizeof(TEXT), 0, FALSE, 0, FALSE \
  |  |  ------------------
  |  |  |  |  794|  20.6k|#define	FALSE	(0)
  |  |  ------------------
  |  |               		&TEXT[0], sizeof(TEXT), 0, FALSE, 0, FALSE \
  |  |  ------------------
  |  |  |  |  794|  20.6k|#define	FALSE	(0)
  |  |  ------------------
  |  |   62|  20.6k|	}
  ------------------
  389|  20.6k|	VipsDbuf value = { 0 };
  390|       |
  391|  20.6k|	if (!(tag_name = vips_exif_entry_get_name(entry)))
  ------------------
  |  Branch (391:6): [True: 0, False: 20.6k]
  ------------------
  392|      0|		return;
  393|       |
  394|  20.6k|	vips_buf_appendf(&vips_name, "exif-ifd%d-%s",
  395|  20.6k|		exif_entry_get_ifd(entry), tag_name);
  ------------------
  |  |  182|  20.6k|#define exif_entry_get_ifd(e) ((e)?exif_content_get_ifd((e)->parent):EXIF_IFD_COUNT)
  |  |  ------------------
  |  |  |  Branch (182:32): [True: 20.6k, False: 0]
  |  |  ------------------
  ------------------
  396|  20.6k|	vips_exif_to_s(params->ed, entry, &value);
  397|       |
  398|       |	/* Can't do anything sensible with the error return.
  399|       |	 */
  400|  20.6k|	(void) vips_image_set_string(params->image,
  401|  20.6k|		vips_buf_all(&vips_name),
  402|  20.6k|		(char *) vips_dbuf_string(&value, NULL));
  403|       |
  404|  20.6k|	vips_dbuf_destroy(&value);
  405|  20.6k|}
exif.c:vips_exif_entry_get_name:
  375|  20.6k|{
  376|  20.6k|	if (!entry->parent)
  ------------------
  |  Branch (376:6): [True: 0, False: 20.6k]
  ------------------
  377|      0|		return NULL;
  378|       |
  379|  20.6k|	return exif_tag_get_name_in_ifd(entry->tag,
  380|  20.6k|		exif_entry_get_ifd(entry));
  ------------------
  |  |  182|  20.6k|#define exif_entry_get_ifd(e) ((e)?exif_content_get_ifd((e)->parent):EXIF_IFD_COUNT)
  |  |  ------------------
  |  |  |  Branch (182:32): [True: 20.6k, False: 0]
  |  |  ------------------
  ------------------
  381|  20.6k|}
exif.c:vips_exif_to_s:
  322|  20.6k|{
  323|  20.6k|	char *text = entry_to_s(entry);
  324|       |
  325|  20.6k|	unsigned long i;
  326|  20.6k|	int iv;
  327|  20.6k|	ExifRational rv;
  328|  20.6k|	ExifSRational srv;
  329|       |
  330|  20.6k|	if (entry->components < 10 &&
  ------------------
  |  Branch (330:6): [True: 18.1k, False: 2.49k]
  ------------------
  331|  20.6k|		!vips_exif_get_int(ed, entry, 0, &iv)) {
  ------------------
  |  Branch (331:3): [True: 8.47k, False: 9.64k]
  ------------------
  332|  19.7k|		for (i = 0; i < entry->components; i++) {
  ------------------
  |  Branch (332:15): [True: 11.2k, False: 8.47k]
  ------------------
  333|  11.2k|			vips_exif_get_int(ed, entry, i, &iv);
  334|  11.2k|			vips_dbuf_writef(buf, "%d ", iv);
  335|  11.2k|		}
  336|  8.47k|	}
  337|  12.1k|	else if (entry->components < 10 &&
  ------------------
  |  Branch (337:11): [True: 9.64k, False: 2.49k]
  ------------------
  338|  12.1k|		!vips_exif_get_rational(ed, entry, 0, &rv)) {
  ------------------
  |  Branch (338:3): [True: 4.43k, False: 5.20k]
  ------------------
  339|  10.0k|		for (i = 0; i < entry->components; i++) {
  ------------------
  |  Branch (339:15): [True: 5.61k, False: 4.43k]
  ------------------
  340|  5.61k|			vips_exif_get_rational(ed, entry, i, &rv);
  341|  5.61k|			vips_dbuf_writef(buf, "%u/%u ", rv.numerator, rv.denominator);
  342|  5.61k|		}
  343|  4.43k|	}
  344|  7.69k|	else if (entry->components < 10 &&
  ------------------
  |  Branch (344:11): [True: 5.20k, False: 2.49k]
  ------------------
  345|  7.69k|		!vips_exif_get_srational(ed, entry, 0, &srv)) {
  ------------------
  |  Branch (345:3): [True: 424, False: 4.78k]
  ------------------
  346|    901|		for (i = 0; i < entry->components; i++) {
  ------------------
  |  Branch (346:15): [True: 477, False: 424]
  ------------------
  347|    477|			vips_exif_get_srational(ed, entry, i, &srv);
  348|    477|			vips_dbuf_writef(buf, "%d/%d ", srv.numerator, srv.denominator);
  349|    477|		}
  350|    424|	}
  351|  7.27k|	else
  352|  7.27k|		vips_dbuf_writef(buf, "%s ", text);
  353|       |
  354|  20.6k|	vips_dbuf_writef(buf, "(%s, %s, %lu components, %d bytes)",
  355|  20.6k|		text,
  356|  20.6k|		exif_format_get_name(entry->format),
  357|  20.6k|		entry->components,
  358|  20.6k|		entry->size);
  359|       |
  360|  20.6k|	g_free(text);
  361|  20.6k|}
exif.c:entry_to_s:
   84|  20.6k|{
   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|  20.6k|	int size = VIPS_MIN(entry->size, 10000);
  ------------------
  |  |   55|  20.6k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 20.4k, False: 178]
  |  |  ------------------
  ------------------
   89|  20.6k|	int max_size = size * 3 + 32;
   90|  20.6k|	char *text = VIPS_MALLOC(NULL, max_size + 1);
  ------------------
  |  |   68|  20.6k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  ------------------
  |  |  |  |  433|  20.6k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|  20.6k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|  20.6k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   91|       |
   92|       |	// this renders floats as eg. "12.2345", enums as "Inch", etc.
   93|  20.6k|	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|  20.6k|	if (entry->format == EXIF_FORMAT_ASCII)
  ------------------
  |  Branch (97:6): [True: 1.74k, False: 18.8k]
  ------------------
   98|  1.74k|		text[size] = '\0';
   99|       |
  100|  20.6k|	char *utf8 = g_utf8_make_valid(text, -1);
  101|       |
  102|  20.6k|	g_free(text);
  103|       |
  104|  20.6k|	return utf8;
  105|  20.6k|}
exif.c:vips_exif_resolution_from_image:
 1032|  1.38k|{
 1033|  1.38k|	double xres, yres;
 1034|  1.38k|	const char *p;
 1035|  1.38k|	int unit;
 1036|       |
 1037|  1.38k|	VIPS_DEBUG_MSG("vips_exif_resolution_from_image: vips res of %g, %g\n",
  ------------------
  |  |   47|  1.38k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.38k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  1.38k|	{ \
  |  |   49|  1.38k|		; \
  |  |   50|  1.38k|	} \
  |  |   51|  1.38k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.38k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1038|  1.38k|		image->Xres, image->Yres);
 1039|       |
 1040|       |	/* Default to inches, more progs support it.
 1041|       |	 */
 1042|  1.38k|	unit = 2;
 1043|  1.38k|	if (vips_image_get_typeof(image, VIPS_META_RESOLUTION_UNIT) &&
  ------------------
  |  |   93|  1.38k|#define VIPS_META_RESOLUTION_UNIT "resolution-unit"
  ------------------
  |  Branch (1043:6): [True: 82, False: 1.30k]
  ------------------
 1044|  1.38k|		!vips_image_get_string(image,
  ------------------
  |  Branch (1044:3): [True: 82, False: 0]
  ------------------
 1045|     82|			VIPS_META_RESOLUTION_UNIT, &p)) {
  ------------------
  |  |   93|     82|#define VIPS_META_RESOLUTION_UNIT "resolution-unit"
  ------------------
 1046|     82|		if (vips_isprefix("cm", p))
  ------------------
  |  Branch (1046:7): [True: 5, False: 77]
  ------------------
 1047|      5|			unit = 3;
 1048|     77|		else if (vips_isprefix("none", p))
  ------------------
  |  Branch (1048:12): [True: 0, False: 77]
  ------------------
 1049|      0|			unit = 1;
 1050|     82|	}
 1051|       |
 1052|  1.38k|	switch (unit) {
 1053|      0|	case 1:
  ------------------
  |  Branch (1053:2): [True: 0, False: 1.38k]
  ------------------
 1054|      0|		xres = image->Xres;
 1055|      0|		yres = image->Yres;
 1056|      0|		break;
 1057|       |
 1058|  1.37k|	case 2:
  ------------------
  |  Branch (1058:2): [True: 1.37k, False: 5]
  ------------------
 1059|  1.37k|		xres = image->Xres * 25.4;
 1060|  1.37k|		yres = image->Yres * 25.4;
 1061|  1.37k|		break;
 1062|       |
 1063|      5|	case 3:
  ------------------
  |  Branch (1063:2): [True: 5, False: 1.37k]
  ------------------
 1064|      5|		xres = image->Xres * 10.0;
 1065|      5|		yres = image->Yres * 10.0;
 1066|      5|		break;
 1067|       |
 1068|      0|	default:
  ------------------
  |  Branch (1068:2): [True: 0, False: 1.38k]
  ------------------
 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|  1.38k|	}
 1072|       |
 1073|       |	/* Main image xres/yres/unit are in ifd0. ifd1 has the thumbnail
 1074|       |	 * xres/yres/unit.
 1075|       |	 */
 1076|  1.38k|	vips_exif_set_tag(ed, 0, EXIF_TAG_X_RESOLUTION,
 1077|  1.38k|		vips_exif_set_double, (void *) &xres);
 1078|  1.38k|	vips_exif_set_tag(ed, 0, EXIF_TAG_Y_RESOLUTION,
 1079|  1.38k|		vips_exif_set_double, (void *) &yres);
 1080|  1.38k|	vips_exif_set_tag(ed, 0, EXIF_TAG_RESOLUTION_UNIT,
 1081|  1.38k|		vips_exif_set_int, (void *) &unit);
 1082|       |
 1083|  1.38k|	return 0;
 1084|  1.38k|}
exif.c:vips_exif_set_tag:
  997|  4.15k|{
  998|  4.15k|	ExifEntry *entry;
  999|       |
 1000|  4.15k|	if ((entry = exif_content_get_entry(ed->ifd[ifd], tag))) {
  ------------------
  |  Branch (1000:6): [True: 371, False: 3.78k]
  ------------------
 1001|    371|		fn(ed, entry, 0, data);
 1002|    371|	}
 1003|  3.78k|	else {
 1004|  3.78k|		entry = exif_entry_new();
 1005|       |
 1006|       |		/* tag must be set before calling exif_content_add_entry.
 1007|       |		 */
 1008|  3.78k|		entry->tag = tag;
 1009|  3.78k|		exif_content_add_entry(ed->ifd[ifd], entry);
 1010|  3.78k|		exif_entry_unref(entry);
 1011|       |
 1012|       |		/* libexif makes us have a special path for string-valued
 1013|       |		 * fields :(
 1014|       |		 */
 1015|  3.78k|		if (tag_is_encoding(tag))
  ------------------
  |  Branch (1015:7): [True: 0, False: 3.78k]
  ------------------
 1016|      0|			vips_exif_set_string_encoding(ed, entry, 0, data);
 1017|  3.78k|		else if (tag_is_ascii(tag))
  ------------------
  |  Branch (1017:12): [True: 0, False: 3.78k]
  ------------------
 1018|      0|			vips_exif_set_string_ascii(ed, entry, 0, data);
 1019|  3.78k|		else if (tag_is_utf16(tag))
  ------------------
  |  Branch (1019:12): [True: 0, False: 3.78k]
  ------------------
 1020|      0|			vips_exif_set_string_utf16(ed, entry, 0, data);
 1021|  3.78k|		else {
 1022|  3.78k|			exif_entry_initialize(entry, tag);
 1023|  3.78k|			fn(ed, entry, 0, data);
 1024|  3.78k|		}
 1025|  3.78k|	}
 1026|  4.15k|}
exif.c:tag_is_encoding:
  796|  3.78k|{
  797|  3.78k|	return tag == EXIF_TAG_USER_COMMENT;
  798|  3.78k|}
exif.c:tag_is_ascii:
  802|  3.78k|{
  803|  3.78k|	return tag == EXIF_TAG_MAKE ||
  ------------------
  |  Branch (803:9): [True: 0, False: 3.78k]
  ------------------
  804|  3.78k|		tag == EXIF_TAG_MODEL ||
  ------------------
  |  Branch (804:3): [True: 0, False: 3.78k]
  ------------------
  805|  3.78k|		tag == EXIF_TAG_IMAGE_DESCRIPTION ||
  ------------------
  |  Branch (805:3): [True: 0, False: 3.78k]
  ------------------
  806|  3.78k|		tag == EXIF_TAG_ARTIST ||
  ------------------
  |  Branch (806:3): [True: 0, False: 3.78k]
  ------------------
  807|  3.78k|		tag == EXIF_TAG_SOFTWARE ||
  ------------------
  |  Branch (807:3): [True: 0, False: 3.78k]
  ------------------
  808|  3.78k|		tag == EXIF_TAG_COPYRIGHT ||
  ------------------
  |  Branch (808:3): [True: 0, False: 3.78k]
  ------------------
  809|  3.78k|		tag == EXIF_TAG_DATE_TIME ||
  ------------------
  |  Branch (809:3): [True: 0, False: 3.78k]
  ------------------
  810|  3.78k|		tag == EXIF_TAG_DATE_TIME_ORIGINAL ||
  ------------------
  |  Branch (810:3): [True: 0, False: 3.78k]
  ------------------
  811|  3.78k|		tag == EXIF_TAG_DATE_TIME_DIGITIZED ||
  ------------------
  |  Branch (811:3): [True: 0, False: 3.78k]
  ------------------
  812|  3.78k|		tag == EXIF_TAG_SUB_SEC_TIME ||
  ------------------
  |  Branch (812:3): [True: 0, False: 3.78k]
  ------------------
  813|  3.78k|		tag == EXIF_TAG_SUB_SEC_TIME_ORIGINAL ||
  ------------------
  |  Branch (813:3): [True: 0, False: 3.78k]
  ------------------
  814|  3.78k|		tag == EXIF_TAG_SUB_SEC_TIME_DIGITIZED
  ------------------
  |  Branch (814:3): [True: 0, False: 3.78k]
  ------------------
  815|  3.78k|#ifdef HAVE_EXIF_0_6_22
  816|  3.78k|		|| tag == EXIF_TAG_CAMERA_OWNER_NAME ||
  ------------------
  |  Branch (816:6): [True: 0, False: 3.78k]
  ------------------
  817|  3.78k|		tag == EXIF_TAG_BODY_SERIAL_NUMBER ||
  ------------------
  |  Branch (817:3): [True: 0, False: 3.78k]
  ------------------
  818|  3.78k|		tag == EXIF_TAG_LENS_MAKE ||
  ------------------
  |  Branch (818:3): [True: 0, False: 3.78k]
  ------------------
  819|  3.78k|		tag == EXIF_TAG_LENS_MODEL ||
  ------------------
  |  Branch (819:3): [True: 0, False: 3.78k]
  ------------------
  820|  3.78k|		tag == EXIF_TAG_LENS_SERIAL_NUMBER
  ------------------
  |  Branch (820:3): [True: 0, False: 3.78k]
  ------------------
  821|  3.78k|#endif
  822|  3.78k|#ifdef HAVE_EXIF_0_6_23
  823|  3.78k|		|| tag == EXIF_TAG_OFFSET_TIME ||
  ------------------
  |  Branch (823:6): [True: 0, False: 3.78k]
  ------------------
  824|  3.78k|		tag == EXIF_TAG_OFFSET_TIME_ORIGINAL ||
  ------------------
  |  Branch (824:3): [True: 0, False: 3.78k]
  ------------------
  825|  3.78k|		tag == EXIF_TAG_OFFSET_TIME_DIGITIZED ||
  ------------------
  |  Branch (825:3): [True: 0, False: 3.78k]
  ------------------
  826|  3.78k|		tag == EXIF_TAG_GPS_LATITUDE_REF ||
  ------------------
  |  |  177|  7.56k|#define EXIF_TAG_GPS_LATITUDE_REF      0x0001 /* INTEROPERABILITY_INDEX   */
  ------------------
  |  Branch (826:3): [True: 0, False: 3.78k]
  ------------------
  827|  3.78k|		tag == EXIF_TAG_GPS_LONGITUDE_REF ||
  ------------------
  |  |  179|  7.56k|#define EXIF_TAG_GPS_LONGITUDE_REF     0x0003
  ------------------
  |  Branch (827:3): [True: 0, False: 3.78k]
  ------------------
  828|  3.78k|		tag == EXIF_TAG_GPS_SATELLITES ||
  ------------------
  |  |  184|  7.56k|#define EXIF_TAG_GPS_SATELLITES        0x0008
  ------------------
  |  Branch (828:3): [True: 0, False: 3.78k]
  ------------------
  829|  3.78k|		tag == EXIF_TAG_GPS_STATUS ||
  ------------------
  |  |  185|  7.56k|#define EXIF_TAG_GPS_STATUS            0x0009
  ------------------
  |  Branch (829:3): [True: 0, False: 3.78k]
  ------------------
  830|  3.78k|		tag == EXIF_TAG_GPS_MEASURE_MODE ||
  ------------------
  |  |  186|  7.56k|#define EXIF_TAG_GPS_MEASURE_MODE      0x000a
  ------------------
  |  Branch (830:3): [True: 0, False: 3.78k]
  ------------------
  831|  3.78k|		tag == EXIF_TAG_GPS_SPEED_REF ||
  ------------------
  |  |  188|  7.56k|#define EXIF_TAG_GPS_SPEED_REF         0x000c
  ------------------
  |  Branch (831:3): [True: 0, False: 3.78k]
  ------------------
  832|  3.78k|		tag == EXIF_TAG_GPS_TRACK_REF ||
  ------------------
  |  |  190|  7.56k|#define EXIF_TAG_GPS_TRACK_REF         0x000e
  ------------------
  |  Branch (832:3): [True: 0, False: 3.78k]
  ------------------
  833|  3.78k|		tag == EXIF_TAG_GPS_IMG_DIRECTION_REF ||
  ------------------
  |  |  192|  7.56k|#define EXIF_TAG_GPS_IMG_DIRECTION_REF 0x0010
  ------------------
  |  Branch (833:3): [True: 0, False: 3.78k]
  ------------------
  834|  3.78k|		tag == EXIF_TAG_GPS_MAP_DATUM ||
  ------------------
  |  |  194|  7.56k|#define EXIF_TAG_GPS_MAP_DATUM         0x0012
  ------------------
  |  Branch (834:3): [True: 0, False: 3.78k]
  ------------------
  835|  3.78k|		tag == EXIF_TAG_GPS_DEST_LATITUDE_REF ||
  ------------------
  |  |  195|  7.56k|#define EXIF_TAG_GPS_DEST_LATITUDE_REF 0x0013
  ------------------
  |  Branch (835:3): [True: 0, False: 3.78k]
  ------------------
  836|  3.78k|		tag == EXIF_TAG_GPS_DEST_LONGITUDE_REF ||
  ------------------
  |  |  197|  7.56k|#define EXIF_TAG_GPS_DEST_LONGITUDE_REF 0x0015
  ------------------
  |  Branch (836:3): [True: 0, False: 3.78k]
  ------------------
  837|  3.78k|		tag == EXIF_TAG_GPS_DEST_BEARING_REF ||
  ------------------
  |  |  199|  7.56k|#define EXIF_TAG_GPS_DEST_BEARING_REF   0x0017
  ------------------
  |  Branch (837:3): [True: 0, False: 3.78k]
  ------------------
  838|  3.78k|		tag == EXIF_TAG_GPS_DEST_DISTANCE_REF ||
  ------------------
  |  |  201|  7.56k|#define EXIF_TAG_GPS_DEST_DISTANCE_REF  0x0019
  ------------------
  |  Branch (838:3): [True: 0, False: 3.78k]
  ------------------
  839|  3.78k|		tag == EXIF_TAG_GPS_DATE_STAMP
  ------------------
  |  |  205|  3.78k|#define EXIF_TAG_GPS_DATE_STAMP         0x001d
  ------------------
  |  Branch (839:3): [True: 0, False: 3.78k]
  ------------------
  840|  3.78k|#endif
  841|  3.78k|		;
  842|  3.78k|}
exif.c:tag_is_utf16:
  846|  3.78k|{
  847|  3.78k|	return tag == EXIF_TAG_XP_TITLE ||
  ------------------
  |  Branch (847:9): [True: 0, False: 3.78k]
  ------------------
  848|  3.78k|		tag == EXIF_TAG_XP_COMMENT ||
  ------------------
  |  Branch (848:3): [True: 0, False: 3.78k]
  ------------------
  849|  3.78k|		tag == EXIF_TAG_XP_AUTHOR ||
  ------------------
  |  Branch (849:3): [True: 0, False: 3.78k]
  ------------------
  850|  3.78k|		tag == EXIF_TAG_XP_KEYWORDS ||
  ------------------
  |  Branch (850:3): [True: 0, False: 3.78k]
  ------------------
  851|  3.78k|		tag == EXIF_TAG_XP_SUBJECT;
  ------------------
  |  Branch (851:3): [True: 0, False: 3.78k]
  ------------------
  852|  3.78k|}
exif.c:vips_exif_set_double:
  720|  2.76k|{
  721|  2.76k|	double value = *((double *) data);
  722|       |
  723|  2.76k|	ExifByteOrder bo;
  724|  2.76k|	size_t sizeof_component;
  725|  2.76k|	size_t offset;
  726|  2.76k|	double old_value;
  727|       |
  728|  2.76k|	if (entry->components <= component) {
  ------------------
  |  Branch (728:6): [True: 0, False: 2.76k]
  ------------------
  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|  2.76k|	bo = exif_data_get_byte_order(ed);
  736|  2.76k|	sizeof_component = entry->size / entry->components;
  737|  2.76k|	offset = component * sizeof_component;
  738|       |
  739|  2.76k|	VIPS_DEBUG_MSG("vips_exif_set_double: %s = %g\n",
  ------------------
  |  |   47|  2.76k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.76k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  2.76k|	{ \
  |  |   49|  2.76k|		; \
  |  |   50|  2.76k|	} \
  |  |   51|  2.76k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.76k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  740|  2.76k|		vips_exif_entry_get_name(entry), value);
  741|       |
  742|  2.76k|	if (entry->format == EXIF_FORMAT_RATIONAL) {
  ------------------
  |  Branch (742:6): [True: 2.72k, False: 48]
  ------------------
  743|  2.72k|		ExifRational rv;
  744|       |
  745|  2.72k|		rv = exif_get_rational(entry->data + offset, bo);
  746|  2.72k|		if (rv.denominator == 0)
  ------------------
  |  Branch (746:7): [True: 11, False: 2.70k]
  ------------------
  747|     11|			old_value = 0;
  748|  2.70k|		else
  749|  2.70k|			old_value = (double) rv.numerator / rv.denominator;
  750|       |
  751|  2.72k|		if (VIPS_FABS(old_value - value) > 0.0001) {
  ------------------
  |  |   76|  2.72k|#define VIPS_FABS(V) __builtin_fabs(V)
  ------------------
  |  Branch (751:7): [True: 317, False: 2.40k]
  ------------------
  752|    317|			vips_exif_double_to_rational(value, &rv);
  753|       |
  754|    317|			VIPS_DEBUG_MSG("vips_exif_set_double: %u / %u\n",
  ------------------
  |  |   47|    317|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    317|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|    317|	{ \
  |  |   49|    317|		; \
  |  |   50|    317|	} \
  |  |   51|    317|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    317|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  755|    317|				rv.numerator,
  756|    317|				rv.denominator);
  757|       |
  758|    317|			exif_set_rational(entry->data + offset, bo, rv);
  759|    317|		}
  760|  2.72k|	}
  761|     48|	else if (entry->format == EXIF_FORMAT_SRATIONAL) {
  ------------------
  |  Branch (761:11): [True: 11, False: 37]
  ------------------
  762|     11|		ExifSRational srv;
  763|       |
  764|     11|		srv = exif_get_srational(entry->data + offset, bo);
  765|     11|		if (srv.denominator == 0)
  ------------------
  |  Branch (765:7): [True: 3, False: 8]
  ------------------
  766|      3|			old_value = 0;
  767|      8|		else
  768|      8|			old_value = (double) srv.numerator / srv.denominator;
  769|       |
  770|     11|		if (VIPS_FABS(old_value - value) > 0.0001) {
  ------------------
  |  |   76|     11|#define VIPS_FABS(V) __builtin_fabs(V)
  ------------------
  |  Branch (770:7): [True: 11, False: 0]
  ------------------
  771|     11|			vips_exif_double_to_srational(value, &srv);
  772|       |
  773|     11|			VIPS_DEBUG_MSG("vips_exif_set_double: %d / %d\n",
  ------------------
  |  |   47|     11|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|     11|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|     11|	{ \
  |  |   49|     11|		; \
  |  |   50|     11|	} \
  |  |   51|     11|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|     11|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  774|     11|				srv.numerator, srv.denominator);
  775|       |
  776|     11|			exif_set_srational(entry->data + offset, bo, srv);
  777|     11|		}
  778|     11|	}
  779|  2.76k|}
exif.c:vips_exif_double_to_rational:
  624|    317|{
  625|       |	/* We will usually set factors of 10, so use 1000 as the denominator
  626|       |	 * and it'll probably be OK.
  627|       |	 */
  628|    317|	rv->numerator = value * 1000;
  629|    317|	rv->denominator = 1000;
  630|    317|}
exif.c:vips_exif_double_to_srational:
  634|     11|{
  635|       |	/* We will usually set factors of 10, so use 1000 as the denominator
  636|       |	 * and it'll probably be OK.
  637|       |	 */
  638|     11|	srv->numerator = value * 1000;
  639|     11|	srv->denominator = 1000;
  640|     11|}
exif.c:vips_exif_set_int:
  591|  1.38k|{
  592|  1.38k|	int value = *((int *) data);
  593|       |
  594|  1.38k|	ExifByteOrder bo;
  595|  1.38k|	size_t sizeof_component;
  596|  1.38k|	size_t offset = component;
  597|       |
  598|  1.38k|	if (entry->components <= component) {
  ------------------
  |  Branch (598:6): [True: 0, False: 1.38k]
  ------------------
  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|  1.38k|	bo = exif_data_get_byte_order(ed);
  606|  1.38k|	sizeof_component = entry->size / entry->components;
  607|  1.38k|	offset = component * sizeof_component;
  608|       |
  609|  1.38k|	VIPS_DEBUG_MSG("vips_exif_set_int: %s = %d\n",
  ------------------
  |  |   47|  1.38k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.38k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  1.38k|	{ \
  |  |   49|  1.38k|		; \
  |  |   50|  1.38k|	} \
  |  |   51|  1.38k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.38k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  610|  1.38k|		vips_exif_entry_get_name(entry), value);
  611|       |
  612|  1.38k|	if (entry->format == EXIF_FORMAT_SHORT)
  ------------------
  |  Branch (612:6): [True: 1.28k, False: 96]
  ------------------
  613|  1.28k|		exif_set_short(entry->data + offset, bo, value);
  614|     96|	else if (entry->format == EXIF_FORMAT_SSHORT)
  ------------------
  |  Branch (614:11): [True: 86, False: 10]
  ------------------
  615|     86|		exif_set_sshort(entry->data + offset, bo, value);
  616|     10|	else if (entry->format == EXIF_FORMAT_LONG)
  ------------------
  |  Branch (616:11): [True: 3, False: 7]
  ------------------
  617|      3|		exif_set_long(entry->data + offset, bo, value);
  618|      7|	else if (entry->format == EXIF_FORMAT_SLONG)
  ------------------
  |  Branch (618:11): [True: 3, False: 4]
  ------------------
  619|      3|		exif_set_slong(entry->data + offset, bo, value);
  620|  1.38k|}

vips_foreign_map:
  468|  32.5k|{
  469|  32.5k|	GSList *files;
  470|  32.5k|	void *result;
  471|       |
  472|  32.5k|	files = NULL;
  473|  32.5k|	(void) vips_class_map_all(g_type_from_name(base),
  474|  32.5k|		(VipsClassMapFn) file_add_class, (void *) &files);
  475|       |
  476|  32.5k|	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|  32.5k|	result = vips_slist_map2(files, fn, a, b);
  490|       |
  491|  32.5k|	g_slist_free(files);
  492|       |
  493|  32.5k|	return result;
  494|  32.5k|}
vips_foreign_find_load_buffer:
  700|  32.5k|{
  701|  32.5k|	VipsForeignLoadClass *load_class;
  702|       |
  703|  32.5k|	if (!(load_class = (VipsForeignLoadClass *) vips_foreign_map(
  ------------------
  |  Branch (703:6): [True: 4.94k, False: 27.6k]
  ------------------
  704|  32.5k|			  "VipsForeignLoad",
  705|  32.5k|			  (VipsSListMap2Fn) vips_foreign_find_load_buffer_sub,
  706|  32.5k|			  &data, &size))) {
  707|  4.94k|		vips_error("VipsForeignLoad",
  708|  4.94k|			"%s", _("buffer is not in a known format"));
  ------------------
  |  |   30|  4.94k|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|  4.94k|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  709|  4.94k|		return NULL;
  710|  4.94k|	}
  711|       |
  712|  27.6k|	return G_OBJECT_CLASS_NAME(load_class);
  ------------------
  |  |  124|  27.6k|#define G_OBJECT_CLASS_NAME(class)  (g_type_name (G_OBJECT_CLASS_TYPE (class)))
  |  |  ------------------
  |  |  |  |  114|  27.6k|#define G_OBJECT_CLASS_TYPE(class)  (G_TYPE_FROM_CLASS (class))
  |  |  |  |  ------------------
  |  |  |  |  |  |  613|  27.6k|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  713|  32.5k|}
vips_foreign_load_invalidate:
 1306|  1.48k|{
 1307|  1.48k|	VipsOperation *operation;
 1308|       |
 1309|       |#ifdef DEBUG
 1310|       |	printf("vips_foreign_load_invalidate: %p\n", image);
 1311|       |#endif /*DEBUG*/
 1312|       |
 1313|  1.48k|	if ((operation = g_object_get_qdata(G_OBJECT(image),
  ------------------
  |  |   51|  1.48k|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|  1.48k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.48k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1313:6): [True: 1.48k, False: 0]
  ------------------
 1314|  1.48k|			 vips__foreign_load_operation))) {
 1315|  1.48k|		vips_operation_invalidate(operation);
 1316|  1.48k|	}
 1317|  1.48k|}
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|  27.6k|{
  415|  27.6k|}
foreign.c:file_add_class:
  423|  1.10M|{
  424|  1.10M|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|  1.10M|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|  1.10M|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  1.10M|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|  1.10M|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  425|       |
  426|       |	// don't consider blocked classes ... we don't want eg. sniffers to run
  427|  1.10M|	if (operation_class->flags & VIPS_OPERATION_BLOCKED)
  ------------------
  |  Branch (427:6): [True: 0, False: 1.10M]
  ------------------
  428|      0|		return NULL;
  429|       |
  430|       |	// exclude "rawload" as it has a different API.
  431|  1.10M|	if (vips_isprefix("rawload", VIPS_OBJECT_CLASS(class)->nickname))
  ------------------
  |  |  435|  1.10M|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  1.10M|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  1.10M|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (431:6): [True: 32.5k, False: 1.07M]
  ------------------
  432|  32.5k|		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|  1.07M|	*files = g_slist_append(*files, class);
  438|       |
  439|  1.07M|	return NULL;
  440|  1.10M|}
foreign.c:file_compare:
  444|  3.52M|{
  445|  3.52M|	return b->priority - a->priority;
  446|  3.52M|}
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|  27.6k|{
  504|  27.6k|	VipsForeignLoad *load = VIPS_FOREIGN_LOAD(gobject);
  ------------------
  |  |  133|  27.6k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  27.6k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  27.6k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|  27.6k|		VIPS_TYPE_FOREIGN_LOAD, VipsForeignLoad))
  ------------------
  505|       |
  506|  27.6k|	VIPS_UNREF(load->real);
  ------------------
  |  |   57|  27.6k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  27.6k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  27.6k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  27.6k|	{ \
  |  |  |  |   43|  27.6k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 19.0k, False: 8.57k]
  |  |  |  |  ------------------
  |  |  |  |   44|  19.0k|			(void) F((S)); \
  |  |  |  |   45|  19.0k|			(S) = 0; \
  |  |  |  |   46|  19.0k|		} \
  |  |  |  |   47|  27.6k|	} \
  |  |  |  |   48|  27.6k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  27.6k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  507|       |
  508|  27.6k|	G_OBJECT_CLASS(vips_foreign_load_parent_class)->dispose(gobject);
  ------------------
  |  |   58|  27.6k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  27.6k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  27.6k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  509|  27.6k|}
foreign.c:vips_foreign_load_build:
 1079|  25.9k|{
 1080|  25.9k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  25.9k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  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))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1081|  25.9k|	VipsForeignLoad *load = VIPS_FOREIGN_LOAD(object);
  ------------------
  |  |  133|  25.9k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  25.9k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  25.9k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|  25.9k|		VIPS_TYPE_FOREIGN_LOAD, VipsForeignLoad))
  ------------------
 1082|  25.9k|	VipsForeignLoadClass *fclass = VIPS_FOREIGN_LOAD_GET_CLASS(object);
  ------------------
  |  |  143|  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))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  144|  25.9k|		VIPS_TYPE_FOREIGN_LOAD, VipsForeignLoadClass))
  ------------------
 1083|       |
 1084|  25.9k|	VipsForeignFlags flags;
 1085|       |
 1086|       |#ifdef DEBUG
 1087|       |	printf("vips_foreign_load_build:\n");
 1088|       |#endif /*DEBUG*/
 1089|       |
 1090|  25.9k|	flags = 0;
 1091|  25.9k|	if (fclass->get_flags)
  ------------------
  |  Branch (1091:6): [True: 25.9k, False: 0]
  ------------------
 1092|  25.9k|		flags |= fclass->get_flags(load);
 1093|       |
 1094|  25.9k|	if ((flags & VIPS_FOREIGN_PARTIAL) &&
  ------------------
  |  Branch (1094:6): [True: 2.55k, False: 23.4k]
  ------------------
 1095|  25.9k|		(flags & VIPS_FOREIGN_SEQUENTIAL)) {
  ------------------
  |  Branch (1095:3): [True: 0, False: 2.55k]
  ------------------
 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|  25.9k|	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|  25.9k|	if ((load->flags & VIPS_FOREIGN_SEQUENTIAL) &&
  ------------------
  |  Branch (1108:6): [True: 21.4k, False: 4.50k]
  ------------------
 1109|  25.9k|		load->access != VIPS_ACCESS_RANDOM)
  ------------------
  |  Branch (1109:3): [True: 0, False: 21.4k]
  ------------------
 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|  25.9k|	if (vips_object_argument_isset(object, "fail") &&
  ------------------
  |  Branch (1114:6): [True: 0, False: 25.9k]
  ------------------
 1115|  25.9k|		!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|  25.9k|	if (VIPS_OBJECT_CLASS(vips_foreign_load_parent_class)->build(object))
  ------------------
  |  |  435|  25.9k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  25.9k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  25.9k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1120:6): [True: 0, False: 25.9k]
  ------------------
 1121|      0|		return -1;
 1122|       |
 1123|  25.9k|	if (load->sequential)
  ------------------
  |  Branch (1123:6): [True: 0, False: 25.9k]
  ------------------
 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|  25.9k|			_("ignoring deprecated \"sequential\" mode -- "
 1126|  25.9k|			  "please use \"access\" instead"));
 1127|       |
 1128|  25.9k|	g_object_set(object, "out", vips_image_new(), NULL);
 1129|       |
 1130|  25.9k|	vips_image_set_string(load->out,
 1131|  25.9k|		VIPS_META_LOADER, class->nickname);
  ------------------
  |  |  115|  25.9k|#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|  25.9k|	if (fclass->header &&
  ------------------
  |  Branch (1139:6): [True: 25.9k, False: 0]
  ------------------
 1140|  25.9k|		fclass->header(load))
  ------------------
  |  Branch (1140:3): [True: 5.56k, False: 20.4k]
  ------------------
 1141|  5.56k|		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|  20.4k|	if (fclass->load) {
  ------------------
  |  Branch (1150:6): [True: 20.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|  20.4k|		if (vips_image_pipelinev(load->out, load->out->dhint, NULL))
  ------------------
  |  Branch (1158:7): [True: 0, False: 20.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|  20.4k|		if (vips_image_generate(load->out,
  ------------------
  |  Branch (1164:7): [True: 0, False: 20.4k]
  ------------------
 1165|  20.4k|				vips_foreign_load_start,
 1166|  20.4k|				vips_foreign_load_generate,
 1167|  20.4k|				vips_stop_one,
 1168|  20.4k|				NULL, load))
 1169|      0|			return -1;
 1170|  20.4k|	}
 1171|       |
 1172|       |	/* Tell downstream if seq mode was requested.
 1173|       |	 */
 1174|  20.4k|	if (load->access != VIPS_ACCESS_RANDOM)
  ------------------
  |  Branch (1174:6): [True: 0, False: 20.4k]
  ------------------
 1175|      0|		vips_image_set_int(load->out, VIPS_META_SEQUENTIAL, 1);
  ------------------
  |  |  124|      0|#define VIPS_META_SEQUENTIAL "vips-sequential"
  ------------------
 1176|       |
 1177|  20.4k|	return 0;
 1178|  20.4k|}
foreign.c:vips_foreign_load_start:
  991|  26.9k|{
  992|  26.9k|	VipsForeignLoad *load = VIPS_FOREIGN_LOAD(b);
  ------------------
  |  |  133|  26.9k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  26.9k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  26.9k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|  26.9k|		VIPS_TYPE_FOREIGN_LOAD, VipsForeignLoad))
  ------------------
  993|  26.9k|	VipsForeignLoadClass *class = VIPS_FOREIGN_LOAD_GET_CLASS(load);
  ------------------
  |  |  143|  26.9k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  26.9k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  26.9k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  144|  26.9k|		VIPS_TYPE_FOREIGN_LOAD, VipsForeignLoadClass))
  ------------------
  994|       |
  995|       |	/* If this start has failed before in another thread, we can fail now.
  996|       |	 */
  997|  26.9k|	if (load->error)
  ------------------
  |  Branch (997:6): [True: 0, False: 26.9k]
  ------------------
  998|      0|		return NULL;
  999|       |
 1000|  26.9k|	if (!load->real) {
  ------------------
  |  Branch (1000:6): [True: 19.0k, False: 7.91k]
  ------------------
 1001|  19.0k|		if (!(load->real = vips_foreign_load_temp(load)))
  ------------------
  |  Branch (1001:7): [True: 0, False: 19.0k]
  ------------------
 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|  19.0k|		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|  19.0k|		g_object_set_qdata(G_OBJECT(load->real),
  ------------------
  |  |   51|  19.0k|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|  19.0k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  19.0k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1021|  19.0k|			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|  19.0k|		if (class->load(load) ||
  ------------------
  |  Branch (1034:7): [True: 11.0k, False: 8.03k]
  ------------------
 1035|  19.0k|			vips_image_pio_input(load->real) ||
  ------------------
  |  Branch (1035:4): [True: 0, False: 8.03k]
  ------------------
 1036|  19.0k|			!vips_foreign_load_iscompat(load->real, out)) {
  ------------------
  |  Branch (1036:4): [True: 19, False: 8.01k]
  ------------------
 1037|  11.0k|			vips_operation_invalidate(VIPS_OPERATION(load));
  ------------------
  |  |   57|  11.0k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  11.0k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  11.0k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   58|  11.0k|		VIPS_TYPE_OPERATION, VipsOperation))
  ------------------
 1038|  11.0k|			load->error = TRUE;
  ------------------
  |  |  798|  11.0k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  11.0k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 1039|       |
 1040|  11.0k|			return NULL;
 1041|  11.0k|		}
 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|  8.01k|		if (vips_image_pipelinev(load->out, load->out->dhint,
  ------------------
  |  Branch (1046:7): [True: 0, False: 8.01k]
  ------------------
 1047|  8.01k|				load->real, NULL))
 1048|      0|			return NULL;
 1049|  8.01k|	}
 1050|       |
 1051|  15.9k|	return vips_region_new(load->real);
 1052|  26.9k|}
foreign.c:vips_foreign_load_temp:
  908|  19.0k|{
  909|  19.0k|	const guint64 disc_threshold = vips_get_disc_threshold();
  910|  19.0k|	const guint64 image_size = VIPS_IMAGE_SIZEOF_IMAGE(load->out);
  ------------------
  |  |  388|  19.0k|	(VIPS_IMAGE_SIZEOF_LINE(I) * (I)->Ysize)
  |  |  ------------------
  |  |  |  |  386|  19.0k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  19.0k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  19.0k|	(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|  19.0k|	if (!load->disc)
  ------------------
  |  Branch (915:6): [True: 0, False: 19.0k]
  ------------------
  916|      0|		load->memory = TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  917|       |
  918|  19.0k|	if (load->memory) {
  ------------------
  |  Branch (918:6): [True: 0, False: 19.0k]
  ------------------
  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|  19.0k|	if (load->flags & VIPS_FOREIGN_PARTIAL) {
  ------------------
  |  Branch (928:6): [True: 1.73k, False: 17.3k]
  ------------------
  929|       |#ifdef DEBUG
  930|       |		printf("vips_foreign_load_temp: partial temp\n");
  931|       |#endif /*DEBUG*/
  932|       |
  933|  1.73k|		return vips_image_new();
  934|  1.73k|	}
  935|       |
  936|       |	/* If it can do sequential access and it's been requested, we can open
  937|       |	 * directly.
  938|       |	 */
  939|  17.3k|	if ((load->flags & VIPS_FOREIGN_SEQUENTIAL) &&
  ------------------
  |  Branch (939:6): [True: 15.8k, False: 1.51k]
  ------------------
  940|  17.3k|		load->access != VIPS_ACCESS_RANDOM) {
  ------------------
  |  Branch (940:3): [True: 0, False: 15.8k]
  ------------------
  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|  17.3k|	if (image_size > disc_threshold) {
  ------------------
  |  Branch (951:6): [True: 0, False: 17.3k]
  ------------------
  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|  17.3k|	return vips_image_new_memory();
  966|  17.3k|}
foreign.c:vips_foreign_load_iscompat:
  972|  8.03k|{
  973|  8.03k|	if (a->Xsize != b->Xsize ||
  ------------------
  |  Branch (973:6): [True: 0, False: 8.03k]
  ------------------
  974|  8.03k|		a->Ysize != b->Ysize ||
  ------------------
  |  Branch (974:3): [True: 0, False: 8.03k]
  ------------------
  975|  8.03k|		a->Bands != b->Bands ||
  ------------------
  |  Branch (975:3): [True: 19, False: 8.01k]
  ------------------
  976|  8.03k|		a->Coding != b->Coding ||
  ------------------
  |  Branch (976:3): [True: 0, False: 8.01k]
  ------------------
  977|  8.03k|		a->BandFmt != b->BandFmt) {
  ------------------
  |  Branch (977:3): [True: 0, False: 8.01k]
  ------------------
  978|     19|		vips_error("VipsForeignLoad", "%s",
  979|     19|			_("images do not match between header and load"));
  ------------------
  |  |   30|     19|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|     19|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  980|     19|		return FALSE;
  ------------------
  |  |  794|     19|#define	FALSE	(0)
  ------------------
  981|     19|	}
  982|       |
  983|  8.01k|	return TRUE;
  ------------------
  |  |  798|  8.01k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  8.01k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  984|  8.03k|}
foreign.c:vips_foreign_load_generate:
 1059|  22.2k|{
 1060|  22.2k|	VipsRegion *ir = (VipsRegion *) seq;
 1061|       |
 1062|  22.2k|	VipsRect *r = &out_region->valid;
 1063|       |
 1064|       |	/* Ask for input we need.
 1065|       |	 */
 1066|  22.2k|	if (vips_region_prepare(ir, r))
  ------------------
  |  Branch (1066:6): [True: 118, False: 22.1k]
  ------------------
 1067|    118|		return -1;
 1068|       |
 1069|       |	/* Attach output region to that.
 1070|       |	 */
 1071|  22.1k|	if (vips_region_region(out_region, ir, r, r->left, r->top))
  ------------------
  |  Branch (1071:6): [True: 0, False: 22.1k]
  ------------------
 1072|      0|		return -1;
 1073|       |
 1074|  22.1k|	return 0;
 1075|  22.1k|}
foreign.c:vips_foreign_load_operation_get_flags:
 1182|  48.0k|{
 1183|  48.0k|	VipsForeignLoad *load = VIPS_FOREIGN_LOAD(operation);
  ------------------
  |  |  133|  48.0k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  48.0k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  48.0k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|  48.0k|		VIPS_TYPE_FOREIGN_LOAD, VipsForeignLoad))
  ------------------
 1184|       |
 1185|  48.0k|	VipsOperationFlags flags;
 1186|       |
 1187|  48.0k|	flags = VIPS_OPERATION_CLASS(vips_foreign_load_parent_class)
  ------------------
  |  |   60|  48.0k|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|  48.0k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  48.0k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|  48.0k|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
 1188|  48.0k|				->get_flags(operation);
 1189|  48.0k|	if (load->nocache)
  ------------------
  |  Branch (1189:6): [True: 0, False: 48.0k]
  ------------------
 1190|      0|		flags |= VIPS_OPERATION_NOCACHE;
 1191|  48.0k|	if (load->revalidate)
  ------------------
  |  Branch (1191:6): [True: 0, False: 48.0k]
  ------------------
 1192|      0|		flags |= VIPS_OPERATION_REVALIDATE;
 1193|       |
 1194|  48.0k|	return flags;
 1195|  48.0k|}
foreign.c:vips_foreign_load_init:
 1281|  27.6k|{
 1282|  27.6k|	load->disc = TRUE;
  ------------------
  |  |  798|  27.6k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  27.6k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 1283|  27.6k|	load->access = VIPS_ACCESS_RANDOM;
 1284|  27.6k|	load->fail_on = VIPS_FAIL_ON_NONE;
 1285|  27.6k|}
foreign.c:vips_foreign_find_load_buffer_sub:
  663|   672k|{
  664|   672k|	VipsObjectClass *object_class = VIPS_OBJECT_CLASS(load_class);
  ------------------
  |  |  435|   672k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|   672k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   672k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  665|       |
  666|       |	/* Skip non-buffer loaders.
  667|       |	 */
  668|   672k|	if (!g_str_has_suffix(object_class->nickname, "_buffer"))
  ------------------
  |  Branch (668:6): [True: 501k, False: 171k]
  ------------------
  669|   501k|		return NULL;
  670|       |
  671|   171k|	if (load_class->is_a_buffer) {
  ------------------
  |  Branch (671:6): [True: 171k, False: 0]
  ------------------
  672|   171k|		if (load_class->is_a_buffer(*buf, *len))
  ------------------
  |  Branch (672:7): [True: 27.6k, False: 143k]
  ------------------
  673|  27.6k|			return load_class;
  674|   171k|	}
  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|   171k|			object_class->nickname);
  678|       |
  679|   143k|	return NULL;
  680|   171k|}
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|}

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|  6.94k|{
  243|  6.94k|	if (error->code)
  ------------------
  |  Branch (243:6): [True: 6.94k, False: 0]
  ------------------
  244|  6.94k|		vips_error("heif", "%s (%d.%d)",
  245|  6.94k|			error->message ? error->message : "(null)",
  ------------------
  |  Branch (245:4): [True: 6.94k, False: 0]
  ------------------
  246|  6.94k|			error->code, error->subcode);
  247|  6.94k|}
vips__heif_chroma:
  297|  5.44k|{
  298|  5.44k|	if (bits_per_pixel == 8) {
  ------------------
  |  Branch (298:6): [True: 3.76k, False: 1.68k]
  ------------------
  299|  3.76k|		if (has_alpha)
  ------------------
  |  Branch (299:7): [True: 0, False: 3.76k]
  ------------------
  300|      0|			return heif_chroma_interleaved_RGBA;
  301|  3.76k|		else
  302|  3.76k|			return heif_chroma_interleaved_RGB;
  303|  3.76k|	}
  304|  1.68k|	else {
  305|  1.68k|		if (has_alpha)
  ------------------
  |  Branch (305:7): [True: 0, False: 1.68k]
  ------------------
  306|      0|			return heif_chroma_interleaved_RRGGBBAA_BE;
  307|  1.68k|		else
  308|  1.68k|			return heif_chroma_interleaved_RRGGBB_BE;
  309|  1.68k|	}
  310|  5.44k|}
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|  7.17k|{
  323|  7.17k|	VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) gobject;
  324|       |
  325|  7.17k|	heif->data = NULL;
  326|  7.17k|	VIPS_FREEF(heif_image_release, heif->img);
  ------------------
  |  |   41|  7.17k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  7.17k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  7.17k|	{ \
  |  |   43|  7.17k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 116, False: 7.06k]
  |  |  ------------------
  |  |   44|    116|			(void) F((S)); \
  |  |   45|    116|			(S) = 0; \
  |  |   46|    116|		} \
  |  |   47|  7.17k|	} \
  |  |   48|  7.17k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  7.17k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  327|  7.17k|	VIPS_FREEF(heif_image_handle_release, heif->handle);
  ------------------
  |  |   41|  7.17k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  7.17k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  7.17k|	{ \
  |  |   43|  7.17k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 5.55k, False: 1.61k]
  |  |  ------------------
  |  |   44|  5.55k|			(void) F((S)); \
  |  |   45|  5.55k|			(S) = 0; \
  |  |   46|  5.55k|		} \
  |  |   47|  7.17k|	} \
  |  |   48|  7.17k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  7.17k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  328|  7.17k|	VIPS_FREEF(heif_context_free, heif->ctx);
  ------------------
  |  |   41|  7.17k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  7.17k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  7.17k|	{ \
  |  |   43|  7.17k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 7.17k, False: 0]
  |  |  ------------------
  |  |   44|  7.17k|			(void) F((S)); \
  |  |   45|  7.17k|			(S) = 0; \
  |  |   46|  7.17k|		} \
  |  |   47|  7.17k|	} \
  |  |   48|  7.17k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  7.17k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  329|  7.17k|	VIPS_FREE(heif->id);
  ------------------
  |  |   50|  7.17k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  7.17k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  7.17k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  7.17k|	{ \
  |  |  |  |   43|  7.17k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 5.55k, False: 1.61k]
  |  |  |  |  ------------------
  |  |  |  |   44|  5.55k|			(void) F((S)); \
  |  |  |  |   45|  5.55k|			(S) = 0; \
  |  |  |  |   46|  5.55k|		} \
  |  |  |  |   47|  7.17k|	} \
  |  |  |  |   48|  7.17k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  7.17k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  330|  7.17k|	VIPS_FREE(heif->reader);
  ------------------
  |  |   50|  7.17k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  7.17k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  7.17k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  7.17k|	{ \
  |  |  |  |   43|  7.17k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 7.17k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  7.17k|			(void) F((S)); \
  |  |  |  |   45|  7.17k|			(S) = 0; \
  |  |  |  |   46|  7.17k|		} \
  |  |  |  |   47|  7.17k|	} \
  |  |  |  |   48|  7.17k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  7.17k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  331|  7.17k|	VIPS_UNREF(heif->source);
  ------------------
  |  |   57|  7.17k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  7.17k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  7.17k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  7.17k|	{ \
  |  |  |  |   43|  7.17k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 7.17k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  7.17k|			(void) F((S)); \
  |  |  |  |   45|  7.17k|			(S) = 0; \
  |  |  |  |   46|  7.17k|		} \
  |  |  |  |   47|  7.17k|	} \
  |  |  |  |   48|  7.17k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  7.17k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  332|       |
  333|  7.17k|	G_OBJECT_CLASS(vips_foreign_load_heif_parent_class)->dispose(gobject);
  ------------------
  |  |   58|  7.17k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  7.17k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  7.17k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  334|  7.17k|}
heifload.c:vips_foreign_load_heif_build:
  338|  7.17k|{
  339|  7.17k|	VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) object;
  340|       |
  341|       |#ifdef DEBUG
  342|       |	printf("vips_foreign_load_heif_build:\n");
  343|       |#endif /*DEBUG*/
  344|       |
  345|  7.17k|	if (heif->source &&
  ------------------
  |  Branch (345:6): [True: 7.17k, False: 0]
  ------------------
  346|  7.17k|		vips_source_rewind(heif->source))
  ------------------
  |  Branch (346:3): [True: 0, False: 7.17k]
  ------------------
  347|      0|		return -1;
  348|       |
  349|  7.17k|	if (!heif->ctx) {
  ------------------
  |  Branch (349:6): [True: 7.17k, False: 0]
  ------------------
  350|  7.17k|		struct heif_error error;
  351|       |
  352|  7.17k|		heif->ctx = heif_context_alloc();
  353|  7.17k|#ifdef HAVE_HEIF_SET_MAX_IMAGE_SIZE_LIMIT
  354|  7.17k|		heif_context_set_maximum_image_size_limit(heif->ctx,
  355|  7.17k|			heif->unlimited ? USHRT_MAX : 0x4000);
  ------------------
  |  Branch (355:4): [True: 0, False: 7.17k]
  ------------------
  356|  7.17k|#endif /* HAVE_HEIF_SET_MAX_IMAGE_SIZE_LIMIT */
  357|  7.17k|		error = heif_context_read_from_reader(heif->ctx,
  358|  7.17k|			heif->reader, heif, NULL);
  359|  7.17k|		if (error.code) {
  ------------------
  |  Branch (359:7): [True: 1.61k, False: 5.55k]
  ------------------
  360|  1.61k|			vips__heif_error(&error);
  361|  1.61k|			return -1;
  362|  1.61k|		}
  363|  7.17k|	}
  364|       |
  365|  5.55k|	if (VIPS_OBJECT_CLASS(vips_foreign_load_heif_parent_class)->build(object))
  ------------------
  |  |  435|  5.55k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  5.55k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  5.55k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (365:6): [True: 95, False: 5.46k]
  ------------------
  366|     95|		return -1;
  367|       |
  368|  5.46k|	return 0;
  369|  5.55k|}
heifload.c:vips_foreign_load_heif_get_flags:
  420|  5.55k|{
  421|       |	/* FIXME .. could support random access for grid images.
  422|       |	 */
  423|  5.55k|	return VIPS_FOREIGN_SEQUENTIAL;
  424|  5.55k|}
heifload.c:vips_foreign_load_heif_header:
  780|  5.55k|{
  781|  5.55k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(load);
  ------------------
  |  |  441|  5.55k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  5.55k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  5.55k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  782|  5.55k|	VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) load;
  783|       |
  784|  5.55k|	struct heif_error error;
  785|  5.55k|	heif_item_id primary_id;
  786|  5.55k|	int i;
  787|       |
  788|       |#ifdef DEBUG
  789|       |	printf("vips_foreign_load_heif_header:\n");
  790|       |#endif /*DEBUG*/
  791|       |
  792|  5.55k|	heif->n_top = heif_context_get_number_of_top_level_images(heif->ctx);
  793|  5.55k|	heif->id = VIPS_ARRAY(NULL, heif->n_top, heif_item_id);
  ------------------
  |  |   72|  5.55k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  5.55k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  5.55k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  5.55k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  5.55k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  794|  5.55k|	heif_context_get_list_of_top_level_image_IDs(heif->ctx,
  795|  5.55k|		heif->id, heif->n_top);
  796|       |
  797|       |	/* Note page number of primary image.
  798|       |	 */
  799|  5.55k|	error = heif_context_get_primary_image_ID(heif->ctx, &primary_id);
  800|  5.55k|	if (error.code) {
  ------------------
  |  Branch (800:6): [True: 0, False: 5.55k]
  ------------------
  801|      0|		vips__heif_error(&error);
  802|      0|		return -1;
  803|      0|	}
  804|  11.2k|	for (i = 0; i < heif->n_top; i++)
  ------------------
  |  Branch (804:14): [True: 5.67k, False: 5.55k]
  ------------------
  805|  5.67k|		if (heif->id[i] == primary_id)
  ------------------
  |  Branch (805:7): [True: 5.55k, False: 121]
  ------------------
  806|  5.55k|			heif->primary_page = i;
  807|       |
  808|       |	/* If @n and @page have not been set, @page defaults to the primary
  809|       |	 * page.
  810|       |	 */
  811|  5.55k|	if (!vips_object_argument_isset(VIPS_OBJECT(load), "page") &&
  ------------------
  |  |  433|  5.55k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  5.55k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  5.55k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (811:6): [True: 5.55k, False: 0]
  ------------------
  812|  5.55k|		!vips_object_argument_isset(VIPS_OBJECT(load), "n"))
  ------------------
  |  |  433|  5.55k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  5.55k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  5.55k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (812:3): [True: 5.55k, False: 0]
  ------------------
  813|  5.55k|		heif->page = heif->primary_page; // FIXME: Invalidates operation cache
  814|       |
  815|  5.55k|	if (heif->n == -1)
  ------------------
  |  Branch (815:6): [True: 0, False: 5.55k]
  ------------------
  816|      0|		heif->n = heif->n_top - heif->page; // FIXME: Invalidates operation cache
  817|  5.55k|	if (heif->page < 0 ||
  ------------------
  |  Branch (817:6): [True: 0, False: 5.55k]
  ------------------
  818|  5.55k|		heif->n <= 0 ||
  ------------------
  |  Branch (818:3): [True: 0, False: 5.55k]
  ------------------
  819|  5.55k|		heif->page + heif->n > heif->n_top) {
  ------------------
  |  Branch (819:3): [True: 0, False: 5.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|  5.55k|	if (vips_foreign_load_heif_set_page(heif, heif->page, heif->thumbnail))
  ------------------
  |  Branch (865:6): [True: 0, False: 5.55k]
  ------------------
  866|      0|		return -1;
  867|  5.55k|	heif->page_width = heif_image_handle_get_width(heif->handle);
  868|  5.55k|	heif->page_height = heif_image_handle_get_height(heif->handle);
  869|  5.55k|	heif->bits_per_pixel =
  870|  5.55k|		heif_image_handle_get_luma_bits_per_pixel(heif->handle);
  871|  5.55k|	if (heif->bits_per_pixel < 0) {
  ------------------
  |  Branch (871:6): [True: 88, False: 5.47k]
  ------------------
  872|     88|		vips_error(class->nickname, "%s", _("undefined bits per pixel"));
  ------------------
  |  |   30|     88|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|     88|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  873|     88|		return -1;
  874|     88|	}
  875|       |
  876|  5.47k|	for (i = heif->page + 1; i < heif->page + heif->n; i++) {
  ------------------
  |  Branch (876:27): [True: 0, False: 5.47k]
  ------------------
  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|  5.47k|	if (vips_foreign_load_heif_set_header(heif, load->out))
  ------------------
  |  Branch (919:6): [True: 7, False: 5.46k]
  ------------------
  920|      7|		return -1;
  921|       |
  922|  5.46k|	vips_source_minimise(heif->source);
  923|       |
  924|  5.46k|	return 0;
  925|  5.47k|}
heifload.c:vips_foreign_load_heif_set_page:
  501|  21.9k|{
  502|  21.9k|	if (!heif->handle ||
  ------------------
  |  Branch (502:6): [True: 5.55k, False: 16.3k]
  ------------------
  503|  21.9k|		page_no != heif->page_no ||
  ------------------
  |  Branch (503:3): [True: 0, False: 16.3k]
  ------------------
  504|  21.9k|		thumbnail != heif->thumbnail_set) {
  ------------------
  |  Branch (504:3): [True: 0, False: 16.3k]
  ------------------
  505|  5.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|  5.55k|		VIPS_FREEF(heif_image_handle_release, heif->handle);
  ------------------
  |  |   41|  5.55k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  5.55k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  5.55k|	{ \
  |  |   43|  5.55k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 5.55k]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|  5.55k|	} \
  |  |   48|  5.55k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  5.55k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  513|  5.55k|		VIPS_FREEF(heif_image_release, heif->img);
  ------------------
  |  |   41|  5.55k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  5.55k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  5.55k|	{ \
  |  |   43|  5.55k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 5.55k]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|  5.55k|	} \
  |  |   48|  5.55k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  5.55k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  514|  5.55k|		heif->data = NULL;
  515|  5.55k|		heif->thumbnail_set = FALSE;
  ------------------
  |  |  794|  5.55k|#define	FALSE	(0)
  ------------------
  516|       |
  517|  5.55k|		error = heif_context_get_image_handle(heif->ctx,
  518|  5.55k|			heif->id[page_no], &heif->handle);
  519|  5.55k|		if (error.code) {
  ------------------
  |  Branch (519:7): [True: 0, False: 5.55k]
  ------------------
  520|      0|			vips__heif_error(&error);
  521|      0|			return -1;
  522|      0|		}
  523|       |
  524|  5.55k|		if (thumbnail) {
  ------------------
  |  Branch (524:7): [True: 0, False: 5.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|  5.55k|		heif->page_no = page_no;
  540|  5.55k|	}
  541|       |
  542|  21.9k|	return 0;
  543|  21.9k|}
heifload.c:vips_foreign_load_heif_set_header:
  547|  10.9k|{
  548|  10.9k|	VipsForeignLoad *load = (VipsForeignLoad *) heif;
  549|       |
  550|  10.9k|	int bands;
  551|  10.9k|	int i;
  552|       |	/* Surely, 16 metadata items will be enough for anyone.
  553|       |	 */
  554|  10.9k|	heif_item_id id[16];
  555|  10.9k|	int n_metadata;
  556|  10.9k|	struct heif_error error;
  557|  10.9k|	VipsForeignHeifCompression compression;
  558|  10.9k|	VipsInterpretation interpretation;
  559|  10.9k|	VipsBandFormat format;
  560|       |
  561|       |	/* We take the metadata from the non-thumbnail first page. HEIC
  562|       |	 * thumbnails don't have metadata.
  563|       |	 */
  564|  10.9k|	if (vips_foreign_load_heif_set_page(heif, heif->page, FALSE))
  ------------------
  |  |  794|  10.9k|#define	FALSE	(0)
  ------------------
  |  Branch (564:6): [True: 0, False: 10.9k]
  ------------------
  565|      0|		return -1;
  566|       |
  567|       |	/* Verify dimensions
  568|       |	 */
  569|  10.9k|	if (heif->page_width < 1 ||
  ------------------
  |  Branch (569:6): [True: 7, False: 10.9k]
  ------------------
  570|  10.9k|		heif->page_height < 1) {
  ------------------
  |  Branch (570:3): [True: 0, False: 10.9k]
  ------------------
  571|      7|		vips_error("heifload", "%s", _("bad dimensions"));
  ------------------
  |  |   30|      7|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      7|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  572|      7|		return -1;
  573|      7|	}
  574|       |
  575|  10.9k|	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|  10.9k|	bands = heif->has_alpha ? 4 : 3;
  ------------------
  |  Branch (579:10): [True: 0, False: 10.9k]
  ------------------
  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|  10.9k|	n_metadata = heif_image_handle_get_list_of_metadata_block_IDs(
  589|  10.9k|		heif->handle, NULL, id, VIPS_NUMBER(id));
  ------------------
  |  |   60|  10.9k|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  590|  10.9k|	for (i = 0; i < n_metadata; i++) {
  ------------------
  |  Branch (590:14): [True: 0, False: 10.9k]
  ------------------
  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|  10.9k|	vips_autorot_remove_angle(out);
  652|       |
  653|  10.9k|#ifdef HAVE_HEIF_COLOR_PROFILE
  654|  10.9k|	enum heif_color_profile_type profile_type =
  655|  10.9k|		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|  10.9k|	if (profile_type == heif_color_profile_type_prof ||
  ------------------
  |  Branch (687:6): [True: 2, False: 10.9k]
  ------------------
  688|  10.9k|		profile_type == heif_color_profile_type_rICC) {
  ------------------
  |  Branch (688:3): [True: 0, False: 10.9k]
  ------------------
  689|      2|		size_t length = heif_image_handle_get_raw_color_profile_size(
  690|      2|			heif->handle);
  691|       |
  692|      2|		unsigned char *data;
  693|       |
  694|      2|		if (!(data = VIPS_ARRAY(NULL, length, unsigned char)))
  ------------------
  |  |   72|      2|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|      2|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|      2|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|      2|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|      2|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (694:7): [True: 0, False: 2]
  ------------------
  695|      0|			return -1;
  696|      2|		error = heif_image_handle_get_raw_color_profile(heif->handle, data);
  697|      2|		if (error.code) {
  ------------------
  |  Branch (697:7): [True: 0, False: 2]
  ------------------
  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|      2|		vips_image_set_blob(out, VIPS_META_ICC_NAME,
  ------------------
  |  |   78|      2|#define VIPS_META_ICC_NAME "icc-profile-data"
  ------------------
  708|      2|			(VipsCallbackFn) vips_area_free_cb, data, length);
  709|      2|	}
  710|  10.9k|	else if (profile_type == heif_color_profile_type_nclx) {
  ------------------
  |  Branch (710:11): [True: 1, False: 10.9k]
  ------------------
  711|      1|		g_info("heifload: ignoring nclx profile");
  ------------------
  |  |  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__)
  ------------------
  712|      1|	}
  713|  10.9k|#endif /*HAVE_HEIF_COLOR_PROFILE*/
  714|       |
  715|  10.9k|	vips_image_set_int(out, "heif-primary", heif->primary_page);
  716|  10.9k|	vips_image_set_int(out, VIPS_META_N_PAGES, heif->n_top);
  ------------------
  |  |  165|  10.9k|#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|  10.9k|	if (heif->n > 1)
  ------------------
  |  Branch (721:6): [True: 0, False: 10.9k]
  ------------------
  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|  10.9k|	compression = VIPS_FOREIGN_HEIF_COMPRESSION_HEVC;
  728|       |
  729|  10.9k|#ifdef HAVE_HEIF_AVIF
  730|  10.9k|	{
  731|  10.9k|		const unsigned char *brand_data;
  732|       |
  733|  10.9k|		if ((brand_data = vips_source_sniff(heif->source, 12))) {
  ------------------
  |  Branch (733:7): [True: 10.9k, False: 0]
  ------------------
  734|  10.9k|			enum heif_brand brand;
  735|  10.9k|			brand = heif_main_brand(brand_data, 12);
  736|  10.9k|			if (brand == heif_avif ||
  ------------------
  |  Branch (736:8): [True: 7.70k, False: 3.20k]
  ------------------
  737|  10.9k|				brand == heif_avis)
  ------------------
  |  Branch (737:5): [True: 0, False: 3.20k]
  ------------------
  738|  7.70k|				compression = VIPS_FOREIGN_HEIF_COMPRESSION_AV1;
  739|  10.9k|		}
  740|  10.9k|	}
  741|  10.9k|#endif /*HAVE_HEIF_AVIF*/
  742|       |
  743|  10.9k|	vips_image_set_string(out, "heif-compression",
  744|  10.9k|		vips_enum_nick(VIPS_TYPE_FOREIGN_HEIF_COMPRESSION,
  ------------------
  |  |  129|  10.9k|#define VIPS_TYPE_FOREIGN_HEIF_COMPRESSION (vips_foreign_heif_compression_get_type())
  ------------------
  745|  10.9k|			compression));
  746|       |
  747|  10.9k|	vips_image_set_int(out, VIPS_META_BITS_PER_SAMPLE, heif->bits_per_pixel);
  ------------------
  |  |  100|  10.9k|#define VIPS_META_BITS_PER_SAMPLE "bits-per-sample"
  ------------------
  748|       |
  749|       |	/* Deprecated "heif-bitdepth" use "bits-per-sample" instead.
  750|       |	 */
  751|  10.9k|	vips_image_set_int(out, "heif-bitdepth", heif->bits_per_pixel);
  752|       |
  753|  10.9k|	if (heif->bits_per_pixel > 8) {
  ------------------
  |  Branch (753:6): [True: 3.36k, False: 7.54k]
  ------------------
  754|  3.36k|		interpretation = VIPS_INTERPRETATION_RGB16;
  755|  3.36k|		format = VIPS_FORMAT_USHORT;
  756|  3.36k|	}
  757|  7.54k|	else {
  758|  7.54k|		interpretation = VIPS_INTERPRETATION_sRGB;
  759|  7.54k|		format = VIPS_FORMAT_UCHAR;
  760|  7.54k|	}
  761|       |
  762|       |	/* FIXME .. we always decode to RGB in generate. We should check for
  763|       |	 * all grey images, perhaps.
  764|       |	 */
  765|  10.9k|	if (vips_image_pipelinev(out, VIPS_DEMAND_STYLE_THINSTRIP, NULL))
  ------------------
  |  Branch (765:6): [True: 0, False: 10.9k]
  ------------------
  766|      0|		return -1;
  767|  10.9k|	vips_image_init_fields(out,
  768|  10.9k|		heif->page_width, heif->page_height * heif->n, bands,
  769|  10.9k|		format, VIPS_CODING_NONE, interpretation,
  770|  10.9k|		1.0, 1.0);
  771|       |
  772|  10.9k|	VIPS_SETSTR(load->out->filename,
  ------------------
  |  |   53|  10.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  10.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   54|  10.9k|	{ \
  |  |   55|  10.9k|		const char *sst = (V); \
  |  |   56|  10.9k|		\
  |  |   57|  10.9k|		if ((S) != sst) { \
  |  |  ------------------
  |  |  |  Branch (57:7): [True: 5.46k, False: 5.44k]
  |  |  ------------------
  |  |   58|  5.46k|			if (!(S) || !sst || strcmp((S), sst) != 0) { \
  |  |  ------------------
  |  |  |  Branch (58:8): [True: 0, False: 5.46k]
  |  |  |  Branch (58:16): [True: 5.46k, False: 0]
  |  |  |  Branch (58:24): [True: 0, False: 0]
  |  |  ------------------
  |  |   59|  5.46k|				VIPS_FREE(S); \
  |  |  ------------------
  |  |  |  |   50|  5.46k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  |  |  ------------------
  |  |  |  |  |  |   41|  5.46k|	G_STMT_START \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  854|  5.46k|#define G_STMT_START  do
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   42|  5.46k|	{ \
  |  |  |  |  |  |   43|  5.46k|		if (S) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (43:7): [True: 5.46k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   44|  5.46k|			(void) F((S)); \
  |  |  |  |  |  |   45|  5.46k|			(S) = 0; \
  |  |  |  |  |  |   46|  5.46k|		} \
  |  |  |  |  |  |   47|  5.46k|	} \
  |  |  |  |  |  |   48|  5.46k|	G_STMT_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  862|  5.46k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   60|  5.46k|				if (sst) \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 0, False: 5.46k]
  |  |  ------------------
  |  |   61|  5.46k|					(S) = g_strdup(sst); \
  |  |   62|  5.46k|			} \
  |  |   63|  5.46k|		} \
  |  |   64|  10.9k|	} \
  |  |   65|  10.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  10.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  773|  10.9k|		vips_connection_filename(VIPS_CONNECTION(heif->source)));
  774|       |
  775|  10.9k|	return 0;
  776|  10.9k|}
heifload.c:vips_foreign_load_heif_load:
 1030|  5.44k|{
 1031|  5.44k|	VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) load;
 1032|       |
 1033|  5.44k|	VipsImage **t = (VipsImage **)
 1034|  5.44k|		vips_object_local_array(VIPS_OBJECT(load), 3);
  ------------------
  |  |  433|  5.44k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  5.44k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  5.44k|#  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|  5.44k|	t[0] = vips_image_new();
 1041|  5.44k|	if (vips_foreign_load_heif_set_header(heif, t[0]))
  ------------------
  |  Branch (1041:6): [True: 0, False: 5.44k]
  ------------------
 1042|      0|		return -1;
 1043|       |
 1044|       |	/* Close input immediately at end of read.
 1045|       |	 */
 1046|  5.44k|	g_signal_connect(t[0], "minimise",
  ------------------
  |  |  491|  5.44k|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
 1047|  5.44k|		G_CALLBACK(vips_foreign_load_heif_minimise), heif);
 1048|       |
 1049|  5.44k|	if (vips_image_generate(t[0],
  ------------------
  |  Branch (1049:6): [True: 0, False: 5.44k]
  ------------------
 1050|  5.44k|			NULL, vips_foreign_load_heif_generate, NULL, heif, NULL) ||
 1051|  5.44k|		vips_sequential(t[0], &t[1], NULL) ||
  ------------------
  |  Branch (1051:3): [True: 0, False: 5.44k]
  ------------------
 1052|  5.44k|		vips_image_write(t[1], load->real))
  ------------------
  |  Branch (1052:3): [True: 5.44k, False: 0]
  ------------------
 1053|  5.44k|		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|  10.8k|{
 1025|  10.8k|	vips_source_minimise(heif->source);
 1026|  10.8k|}
heifload.c:vips_foreign_load_heif_generate:
  930|  5.44k|{
  931|  5.44k|	VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) a;
  932|  5.44k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(heif);
  ------------------
  |  |  441|  5.44k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  5.44k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  5.44k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  933|  5.44k|	VipsRect *r = &out_region->valid;
  934|       |
  935|  5.44k|	int page = r->top / heif->page_height + heif->page;
  936|  5.44k|	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|  5.44k|	g_assert(r->height == 1);
  ------------------
  |  |  166|  5.44k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  5.44k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  5.44k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  943|       |
  944|  5.44k|	if (vips_foreign_load_heif_set_page(heif, page, heif->thumbnail))
  ------------------
  |  Branch (944:6): [True: 0, False: 5.44k]
  ------------------
  945|      0|		return -1;
  946|       |
  947|  5.44k|	if (!heif->img) {
  ------------------
  |  Branch (947:6): [True: 5.44k, False: 0]
  ------------------
  948|  5.44k|		enum heif_chroma chroma =
  949|  5.44k|			vips__heif_chroma(heif->bits_per_pixel, heif->has_alpha);
  950|       |
  951|  5.44k|		struct heif_error error;
  952|  5.44k|		struct heif_decoding_options *options;
  953|       |
  954|  5.44k|		options = heif_decoding_options_alloc();
  955|  5.44k|		error = heif_decode_image(heif->handle, &heif->img,
  956|  5.44k|			heif_colorspace_RGB,
  957|  5.44k|			chroma,
  958|  5.44k|			options);
  959|  5.44k|		heif_decoding_options_free(options);
  960|  5.44k|		if (error.code) {
  ------------------
  |  Branch (960:7): [True: 5.33k, False: 116]
  ------------------
  961|  5.33k|			vips__heif_error(&error);
  962|  5.33k|			return -1;
  963|  5.33k|		}
  964|       |
  965|       |#ifdef DEBUG
  966|       |		vips__heif_image_print(heif->img);
  967|       |#endif /*DEBUG*/
  968|  5.44k|	}
  969|       |
  970|    116|	if (!heif->data) {
  ------------------
  |  Branch (970:6): [True: 116, False: 0]
  ------------------
  971|    116|		int image_width = heif_image_get_width(heif->img,
  972|    116|			heif_channel_interleaved);
  973|    116|		int image_height = heif_image_get_height(heif->img,
  974|    116|			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|    116|		if (image_width != heif->page_width ||
  ------------------
  |  Branch (980:7): [True: 116, False: 0]
  ------------------
  981|    116|			image_height != heif->page_height) {
  ------------------
  |  Branch (981:4): [True: 0, False: 0]
  ------------------
  982|    116|			vips_error(class->nickname,
  983|    116|				"%s", _("bad image dimensions on decode"));
  ------------------
  |  |   30|    116|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|    116|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  984|    116|			return -1;
  985|    116|		}
  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|    116|}
heifload.c:vips_foreign_load_heif_init:
 1195|  7.17k|{
 1196|  7.17k|	heif->n = 1;
 1197|       |
 1198|  7.17k|	heif->reader = VIPS_ARRAY(NULL, 1, struct heif_reader);
  ------------------
  |  |   72|  7.17k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  7.17k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  7.17k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  7.17k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  7.17k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1199|       |
 1200|       |	/* The first version to support heif_reader.
 1201|       |	 */
 1202|  7.17k|	heif->reader->reader_api_version = 1;
 1203|  7.17k|	heif->reader->get_position = vips_foreign_load_heif_get_position;
 1204|  7.17k|	heif->reader->read = vips_foreign_load_heif_read;
 1205|  7.17k|	heif->reader->seek = vips_foreign_load_heif_seek;
 1206|  7.17k|	heif->reader->wait_for_file_size =
 1207|  7.17k|		vips_foreign_load_heif_wait_for_file_size;
 1208|  7.17k|}
heifload.c:vips_foreign_load_heif_get_position:
 1122|   258k|{
 1123|   258k|	VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) userdata;
 1124|       |
 1125|   258k|	return vips_source_seek(heif->source, 0L, SEEK_CUR);
 1126|   258k|}
heifload.c:vips_foreign_load_heif_read:
 1135|  1.25M|{
 1136|  1.25M|	VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) userdata;
 1137|       |
 1138|  2.50M|	while (size > 0) {
  ------------------
  |  Branch (1138:9): [True: 1.25M, False: 1.25M]
  ------------------
 1139|  1.25M|		gint64 bytes_read;
 1140|       |
 1141|  1.25M|		bytes_read = vips_source_read(heif->source, data, size);
 1142|  1.25M|		if (bytes_read <= 0)
  ------------------
  |  Branch (1142:7): [True: 0, False: 1.25M]
  ------------------
 1143|      0|			return -1;
 1144|       |
 1145|  1.25M|		size -= bytes_read;
 1146|  1.25M|		data = (char *) data + bytes_read;
 1147|  1.25M|	}
 1148|       |
 1149|  1.25M|	return 0;
 1150|  1.25M|}
heifload.c:vips_foreign_load_heif_seek:
 1154|  50.8k|{
 1155|  50.8k|	VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) userdata;
 1156|       |
 1157|       |	/* Return 0 on success.
 1158|       |	 */
 1159|  50.8k|	return vips_source_seek(heif->source, position, SEEK_SET) == -1;
 1160|  50.8k|}
heifload.c:vips_foreign_load_heif_wait_for_file_size:
 1167|   261k|{
 1168|   261k|	VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) userdata;
 1169|       |
 1170|   261k|	gint64 old_position;
 1171|   261k|	gint64 result;
 1172|   261k|	enum heif_reader_grow_status status;
 1173|       |
 1174|       |	/* We seek the VipsSource to the position and check for errors.
 1175|       |	 */
 1176|   261k|	old_position = vips_source_seek(heif->source, 0L, SEEK_CUR);
 1177|   261k|	result = vips_source_seek(heif->source, target_size, SEEK_SET);
 1178|   261k|	vips_source_seek(heif->source, old_position, SEEK_SET);
 1179|       |
 1180|   261k|	if (result < 0)
  ------------------
  |  Branch (1180:6): [True: 2.02k, False: 259k]
  ------------------
 1181|       |		/* Unable to seek to this point, so it's beyond EOF.
 1182|       |		 */
 1183|  2.02k|		status = heif_reader_grow_status_size_beyond_eof;
 1184|   259k|	else
 1185|       |		/* Successfully read to the requested point, but the requested
 1186|       |		 * point is not necessarily EOF.
 1187|       |		 */
 1188|   259k|		status = heif_reader_grow_status_size_reached;
 1189|       |
 1190|   261k|	return status;
 1191|   261k|}
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|  12.5k|{
  394|  12.5k|	if (len >= 12) {
  ------------------
  |  Branch (394:6): [True: 12.3k, False: 259]
  ------------------
  395|  12.3k|		unsigned char *p = (unsigned char *) buf;
  396|  12.3k|		guint32 chunk_len =
  397|  12.3k|			VIPS_LSHIFT_INT(p[0], 24) |
  ------------------
  |  |   87|  12.3k|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  ------------------
  398|  12.3k|			VIPS_LSHIFT_INT(p[1], 16) |
  ------------------
  |  |   87|  12.3k|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  ------------------
  399|  12.3k|			VIPS_LSHIFT_INT(p[2], 8) |
  ------------------
  |  |   87|  12.3k|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  ------------------
  400|  12.3k|			VIPS_LSHIFT_INT(p[3], 0);
  ------------------
  |  |   87|  12.3k|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  ------------------
  401|       |
  402|  12.3k|		int i;
  403|       |
  404|       |		/* chunk_len can be pretty big for eg. animated AVIF.
  405|       |		 */
  406|  12.3k|		if (chunk_len > 2048 ||
  ------------------
  |  Branch (406:7): [True: 5.08k, False: 7.23k]
  ------------------
  407|  12.3k|			chunk_len % 4 != 0)
  ------------------
  |  Branch (407:4): [True: 2, False: 7.23k]
  ------------------
  408|  5.08k|			return 0;
  409|       |
  410|  52.3k|		for (i = 0; i < VIPS_NUMBER(heif_magic); i++)
  ------------------
  |  |   60|  52.3k|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (410:15): [True: 52.2k, False: 55]
  ------------------
  411|  52.2k|			if (strncmp(buf + 4, heif_magic[i], 8) == 0)
  ------------------
  |  Branch (411:8): [True: 7.17k, False: 45.1k]
  ------------------
  412|  7.17k|				return 1;
  413|  7.23k|	}
  414|       |
  415|    314|	return 0;
  416|  12.5k|}
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|  7.17k|{
 1300|  7.17k|	VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) object;
 1301|  7.17k|	VipsForeignLoadHeifBuffer *buffer =
 1302|  7.17k|		(VipsForeignLoadHeifBuffer *) object;
 1303|       |
 1304|  7.17k|	if (buffer->buf &&
  ------------------
  |  Branch (1304:6): [True: 7.17k, False: 0]
  ------------------
 1305|  7.17k|		!(heif->source = vips_source_new_from_memory(
  ------------------
  |  Branch (1305:3): [True: 0, False: 7.17k]
  ------------------
 1306|  7.17k|			VIPS_AREA(buffer->buf)->data,
  ------------------
  |  |  137|  7.17k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
 1307|  7.17k|			VIPS_AREA(buffer->buf)->length)))
  ------------------
  |  |  137|  7.17k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
 1308|      0|		return -1;
 1309|       |
 1310|  7.17k|	if (VIPS_OBJECT_CLASS(vips_foreign_load_heif_file_parent_class)
  ------------------
  |  |  435|  7.17k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  7.17k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  7.17k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1310:6): [True: 1.71k, False: 5.46k]
  ------------------
 1311|  7.17k|			->build(object))
 1312|  1.71k|		return -1;
 1313|       |
 1314|  5.46k|	return 0;
 1315|  7.17k|}
heifload.c:vips_foreign_load_heif_buffer_is_a:
 1319|  12.5k|{
 1320|  12.5k|	return vips_foreign_load_heif_is_a(buf, len);
 1321|  12.5k|}
heifload.c:vips_foreign_load_heif_buffer_init:
 1349|  7.17k|{
 1350|  7.17k|}
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|  9.84k|{
 1055|  9.84k|	ReadJpeg *jpeg;
 1056|       |
 1057|  9.84k|	if (!(jpeg = readjpeg_new(source, out, shrink, fail_on,
  ------------------
  |  Branch (1057:6): [True: 0, False: 9.84k]
  ------------------
 1058|  9.84k|			  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|  9.84k|	if (setjmp(jpeg->eman.jmp))
 1065|    918|		return -1;
 1066|       |
 1067|  8.92k|	if (readjpeg_open_input(jpeg) ||
  ------------------
  |  Branch (1067:6): [True: 18.4E, False: 9.84k]
  ------------------
 1068|  9.84k|		vips__jpeg_read(jpeg, out, header_only))
  ------------------
  |  Branch (1068:3): [True: 3.43k, False: 6.40k]
  ------------------
 1069|  2.51k|		return -1;
 1070|       |
 1071|  6.40k|	if (header_only)
  ------------------
  |  Branch (1071:6): [True: 4.82k, False: 1.57k]
  ------------------
 1072|  4.82k|		vips_source_minimise(source);
 1073|       |
 1074|  6.40k|	return 0;
 1075|  8.92k|}
vips__isjpeg_source:
 1079|  27.6k|{
 1080|  27.6k|	const unsigned char *p;
 1081|       |
 1082|  27.6k|	if ((p = vips_source_sniff(source, 2)) &&
  ------------------
  |  Branch (1082:6): [True: 27.6k, False: 12]
  ------------------
 1083|  27.6k|		p[0] == 0xff &&
  ------------------
  |  Branch (1083:3): [True: 5.78k, False: 21.8k]
  ------------------
 1084|  27.6k|		p[1] == 0xd8)
  ------------------
  |  Branch (1084:3): [True: 5.74k, False: 42]
  ------------------
 1085|  5.74k|		return 1;
 1086|       |
 1087|  21.9k|	return 0;
 1088|  27.6k|}
jpeg2vips.c:readjpeg_new:
  454|  9.84k|{
  455|  9.84k|	ReadJpeg *jpeg;
  456|       |
  457|  9.84k|	if (!(jpeg = VIPS_NEW(out, ReadJpeg)))
  ------------------
  |  |   70|  9.84k|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  9.84k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  9.84k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  9.84k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  9.84k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (457:6): [True: 0, False: 9.84k]
  ------------------
  458|      0|		return NULL;
  459|       |
  460|  9.84k|	jpeg->out = out;
  461|  9.84k|	jpeg->source = source;
  462|  9.84k|	g_object_ref(source);
  463|  9.84k|	jpeg->shrink = shrink;
  464|  9.84k|	jpeg->fail_on = fail_on;
  465|  9.84k|	jpeg->cinfo.err = jpeg_std_error(&jpeg->eman.pub);
  466|  9.84k|	jpeg->cinfo.err->addon_message_table = vips__jpeg_message_table;
  467|  9.84k|	jpeg->cinfo.err->first_addon_message = 1000;
  468|  9.84k|	jpeg->cinfo.err->last_addon_message = 1001;
  469|  9.84k|	jpeg->eman.pub.error_exit = vips__new_error_exit;
  470|  9.84k|	jpeg->eman.pub.emit_message = readjpeg_emit_message;
  471|  9.84k|	jpeg->eman.pub.output_message = vips__new_output_message;
  472|  9.84k|	jpeg->eman.fp = NULL;
  473|  9.84k|	jpeg->autorotate = autorotate;
  474|  9.84k|	jpeg->unlimited = unlimited;
  475|  9.84k|	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|  9.84k|	if (setjmp(jpeg->eman.jmp))
  481|      0|		return NULL;
  482|       |
  483|  9.84k|	jpeg_create_decompress(&jpeg->cinfo);
  ------------------
  |  |  972|  9.84k|  jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \
  |  |  ------------------
  |  |  |  |    4|  9.84k|#define JPEG_LIB_VERSION  62
  |  |  ------------------
  |  |  973|  9.84k|                        (size_t)sizeof(struct jpeg_decompress_struct))
  ------------------
  484|       |
  485|  9.84k|	g_signal_connect(out, "close",
  ------------------
  |  |  491|  9.84k|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  486|  9.84k|		G_CALLBACK(readjpeg_close_cb), jpeg);
  487|  9.84k|	g_signal_connect(out, "minimise",
  ------------------
  |  |  491|  9.84k|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  488|  9.84k|		G_CALLBACK(readjpeg_minimise_cb), jpeg);
  489|       |
  490|  9.84k|	return jpeg;
  491|  9.84k|}
jpeg2vips.c:readjpeg_emit_message:
  383|   270k|{
  384|   270k|	ReadJpeg *jpeg = (ReadJpeg *) cinfo->client_data;
  385|       |
  386|   270k|	long num_warnings;
  387|       |
  388|   270k|	if (msg_level < 0) {
  ------------------
  |  Branch (388:6): [True: 111k, False: 158k]
  ------------------
  389|       |		/* Always count warnings in num_warnings.
  390|       |		 */
  391|   111k|		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|   111k|		if (num_warnings == 1)
  ------------------
  |  Branch (397:7): [True: 9.68k, False: 101k]
  ------------------
  398|  9.68k|			(*cinfo->err->output_message)(cinfo);
  399|   101k|		else if (!jpeg ||
  ------------------
  |  Branch (399:12): [True: 0, False: 101k]
  ------------------
  400|   101k|			(!jpeg->unlimited && num_warnings >= 100))
  ------------------
  |  Branch (400:5): [True: 101k, False: 0]
  |  Branch (400:25): [True: 323, False: 101k]
  ------------------
  401|    323|			cinfo->err->error_exit(cinfo);
  402|   111k|	}
  403|   158k|	else if (cinfo->err->trace_level >= msg_level)
  ------------------
  |  Branch (403:11): [True: 0, False: 158k]
  ------------------
  404|       |		/* It's a trace message. Show it if trace_level >= msg_level.
  405|       |		 */
  406|      0|		(*cinfo->err->output_message)(cinfo);
  407|   270k|}
jpeg2vips.c:readjpeg_close_cb:
  440|  9.84k|{
  441|  9.84k|	(void) readjpeg_free(jpeg);
  442|  9.84k|}
jpeg2vips.c:readjpeg_free:
  413|  9.84k|{
  414|  9.84k|	if (jpeg->eman.pub.num_warnings != 0) {
  ------------------
  |  Branch (414:6): [True: 9.68k, False: 153]
  ------------------
  415|  9.68k|		g_warning(_("read gave %ld warnings"),
  ------------------
  |  |  338|  9.68k|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|  9.68k|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|  9.68k|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|  9.68k|                               __VA_ARGS__)
  ------------------
  416|  9.68k|			jpeg->eman.pub.num_warnings);
  417|  9.68k|		g_warning("%s", vips_error_buffer());
  ------------------
  |  |  338|  9.68k|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|  9.68k|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|  9.68k|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|  9.68k|                               __VA_ARGS__)
  ------------------
  418|       |
  419|       |		/* Make the message only appear once.
  420|       |		 */
  421|  9.68k|		jpeg->eman.pub.num_warnings = 0;
  422|  9.68k|	}
  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|  9.84k|	jpeg_destroy_decompress(&jpeg->cinfo);
  432|       |
  433|  9.84k|	VIPS_UNREF(jpeg->source);
  ------------------
  |  |   57|  9.84k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  9.84k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  9.84k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  9.84k|	{ \
  |  |  |  |   43|  9.84k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 9.84k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  9.84k|			(void) F((S)); \
  |  |  |  |   45|  9.84k|			(S) = 0; \
  |  |  |  |   46|  9.84k|		} \
  |  |  |  |   47|  9.84k|	} \
  |  |  |  |   48|  9.84k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  9.84k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  434|       |
  435|  9.84k|	return 0;
  436|  9.84k|}
jpeg2vips.c:readjpeg_minimise_cb:
  446|  22.5k|{
  447|  22.5k|	vips_source_minimise(jpeg->source);
  448|  22.5k|}
jpeg2vips.c:readjpeg_open_input:
  328|  9.84k|{
  329|  9.84k|	j_decompress_ptr cinfo = &jpeg->cinfo;
  330|       |
  331|  9.84k|	if (jpeg->source &&
  ------------------
  |  Branch (331:6): [True: 9.84k, False: 0]
  ------------------
  332|  9.84k|		!cinfo->src) {
  ------------------
  |  Branch (332:3): [True: 9.84k, False: 0]
  ------------------
  333|  9.84k|		Source *src;
  334|       |
  335|  9.84k|		if (vips_source_rewind(jpeg->source))
  ------------------
  |  Branch (335:7): [True: 0, False: 9.84k]
  ------------------
  336|      0|			return -1;
  337|       |
  338|  9.84k|		cinfo->src =
  339|  9.84k|			(struct jpeg_source_mgr *) (*cinfo->mem->alloc_small)(
  340|  9.84k|				(j_common_ptr) cinfo,
  341|  9.84k|				JPOOL_PERMANENT,
  ------------------
  |  |  888|  9.84k|#define JPOOL_PERMANENT  0      /* lasts until master record is destroyed */
  ------------------
  342|  9.84k|				sizeof(Source));
  343|       |
  344|  9.84k|		src = (Source *) cinfo->src;
  345|  9.84k|		src->jpeg = jpeg;
  346|  9.84k|		src->source = jpeg->source;
  347|  9.84k|		src->pub.init_source = source_init_source;
  348|       |
  349|       |		/* Use default method.
  350|       |		 */
  351|  9.84k|		src->pub.resync_to_restart = jpeg_resync_to_restart;
  352|       |
  353|  9.84k|		if (vips_source_is_mappable(jpeg->source)) {
  ------------------
  |  Branch (353:7): [True: 9.84k, False: 0]
  ------------------
  354|  9.84k|			size_t src_len;
  355|  9.84k|			const unsigned char *src_data = vips_source_map(
  356|  9.84k|				jpeg->source, &src_len);
  357|       |
  358|  9.84k|			src->pub.fill_input_buffer =
  359|  9.84k|				source_fill_input_buffer_mappable;
  360|  9.84k|			src->pub.skip_input_data = skip_input_data_mappable;
  361|  9.84k|			src->pub.bytes_in_buffer = src_len;
  362|  9.84k|			src->pub.next_input_byte = src_data;
  363|  9.84k|		}
  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|  9.84k|	}
  377|       |
  378|  9.84k|	return 0;
  379|  9.84k|}
jpeg2vips.c:source_init_source:
  228|  9.84k|{
  229|       |	/* No work necessary here.
  230|       |	 */
  231|  9.84k|}
jpeg2vips.c:source_fill_input_buffer_mappable:
  268|  16.6k|{
  269|  16.6k|	Source *src = (Source *) cinfo->src;
  270|       |
  271|  16.6k|	if (src->jpeg->fail_on >= VIPS_FAIL_ON_TRUNCATED) {
  ------------------
  |  Branch (271:6): [True: 0, False: 16.6k]
  ------------------
  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|  16.6k|	else
  278|  16.6k|		WARNMS(cinfo, JWRN_VIPS_IMAGE_EOF);
  ------------------
  |  |  283|  16.6k|  ((cinfo)->err->msg_code = (code), \
  |  |  284|  16.6k|   (*(cinfo)->err->emit_message) ((j_common_ptr)(cinfo), -1))
  ------------------
  279|       |
  280|       |	/* Insert a fake EOI marker.
  281|       |	 */
  282|  16.6k|	src->buf[0] = (JOCTET) 0xFF;
  283|  16.6k|	src->buf[1] = (JOCTET) JPEG_EOI;
  ------------------
  |  | 1167|  16.6k|#define JPEG_EOI        0xD9    /* EOI marker code */
  ------------------
  284|       |
  285|  16.6k|	src->pub.next_input_byte = src->buf;
  286|  16.6k|	src->pub.bytes_in_buffer = 2;
  287|       |
  288|  16.6k|	return TRUE;
  ------------------
  |  |  209|  16.6k|#define TRUE    1
  ------------------
  289|  16.6k|}
jpeg2vips.c:skip_input_data_mappable:
  313|  1.15k|{
  314|  1.15k|	Source *src = (Source *) cinfo->src;
  315|       |
  316|  1.15k|	if (num_bytes > (long) src->pub.bytes_in_buffer) {
  ------------------
  |  Branch (316:6): [True: 188, False: 963]
  ------------------
  317|    188|		src->pub.next_input_byte += src->pub.bytes_in_buffer;
  318|    188|		src->pub.bytes_in_buffer = 0;
  319|    188|	}
  320|    963|	else {
  321|    963|		src->pub.next_input_byte += (size_t) num_bytes;
  322|    963|		src->pub.bytes_in_buffer -= (size_t) num_bytes;
  323|    963|	}
  324|  1.15k|}
jpeg2vips.c:vips__jpeg_read:
 1002|  9.84k|{
 1003|       |	/* Need to read in APP1 (EXIF metadata), APP2 (ICC profile), APP13
 1004|       |	 * (photoshop IPTC) and APP14 (Adobe flags).
 1005|       |	 */
 1006|  9.84k|	jpeg_save_markers(&jpeg->cinfo, JPEG_APP0 + 1, 0xffff);
  ------------------
  |  | 1168|  9.84k|#define JPEG_APP0       0xE0    /* APP0 marker code */
  ------------------
 1007|  9.84k|	jpeg_save_markers(&jpeg->cinfo, JPEG_APP0 + 2, 0xffff);
  ------------------
  |  | 1168|  9.84k|#define JPEG_APP0       0xE0    /* APP0 marker code */
  ------------------
 1008|  9.84k|	jpeg_save_markers(&jpeg->cinfo, JPEG_APP0 + 13, 0xffff);
  ------------------
  |  | 1168|  9.84k|#define JPEG_APP0       0xE0    /* APP0 marker code */
  ------------------
 1009|  9.84k|	jpeg_save_markers(&jpeg->cinfo, JPEG_APP0 + 14, 0xffff);
  ------------------
  |  | 1168|  9.84k|#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|  9.84k|	if (header_only) {
  ------------------
  |  Branch (1024:6): [True: 5.74k, False: 4.09k]
  ------------------
 1025|  5.74k|		if (read_jpeg_header(jpeg, out))
  ------------------
  |  Branch (1025:7): [True: 0, False: 5.74k]
  ------------------
 1026|      0|			return -1;
 1027|       |
 1028|       |		/* Patch in the correct size.
 1029|       |		 */
 1030|  5.74k|		out->Xsize = jpeg->output_width;
 1031|  5.74k|		out->Ysize = jpeg->output_height;
 1032|       |
 1033|       |		/* Swap width and height if we're going to rotate this image.
 1034|       |		 */
 1035|  5.74k|		if (jpeg->autorotate) {
  ------------------
  |  Branch (1035:7): [True: 0, False: 5.74k]
  ------------------
 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|  5.74k|	}
 1042|  4.09k|	else {
 1043|  4.09k|		if (read_jpeg_image(jpeg, out))
  ------------------
  |  Branch (1043:7): [True: 2.51k, False: 1.57k]
  ------------------
 1044|  2.51k|			return -1;
 1045|  4.09k|	}
 1046|       |
 1047|  7.32k|	return 0;
 1048|  9.84k|}
jpeg2vips.c:read_jpeg_header:
  571|  9.84k|{
  572|  9.84k|	struct jpeg_decompress_struct *cinfo = &jpeg->cinfo;
  573|       |
  574|  9.84k|	jpeg_saved_marker_ptr p;
  575|  9.84k|	VipsInterpretation interpretation;
  576|  9.84k|	double xres, yres;
  577|       |
  578|       |	/* Capture app2 sections here for assembly.
  579|       |	 */
  580|  9.84k|	void *app2_data[MAX_APP2_SECTIONS] = { 0 };
  581|  9.84k|	size_t app2_data_length[MAX_APP2_SECTIONS] = { 0 };
  582|  9.84k|	size_t data_length;
  583|  9.84k|	int i;
  584|       |
  585|       |	/* Read JPEG header. libjpeg will set out_color_space sanely for us
  586|       |	 * for YUV YCCK etc.
  587|       |	 */
  588|  9.84k|	jpeg_read_header(cinfo, TRUE);
  ------------------
  |  |  209|  9.84k|#define TRUE    1
  ------------------
  589|  9.84k|	cinfo->scale_denom = jpeg->shrink;
  590|  9.84k|	cinfo->scale_num = 1;
  591|  9.84k|	jpeg_calc_output_dimensions(cinfo);
  592|       |
  593|  9.84k|	jpeg->invert_pels = FALSE;
  ------------------
  |  |  206|  9.84k|#define FALSE   0               /* values of boolean */
  ------------------
  594|  9.84k|	switch (cinfo->out_color_space) {
  595|  3.36k|	case JCS_GRAYSCALE:
  ------------------
  |  Branch (595:2): [True: 3.36k, False: 6.47k]
  ------------------
  596|  3.36k|		interpretation = VIPS_INTERPRETATION_B_W;
  597|  3.36k|		break;
  598|       |
  599|  1.58k|	case JCS_CMYK:
  ------------------
  |  Branch (599:2): [True: 1.58k, False: 8.25k]
  ------------------
  600|  1.58k|		interpretation = VIPS_INTERPRETATION_CMYK;
  601|       |
  602|       |		/* CMYKs are almost always returned inverted, but see below.
  603|       |		 */
  604|  1.58k|		jpeg->invert_pels = TRUE;
  ------------------
  |  |  209|  1.58k|#define TRUE    1
  ------------------
  605|  1.58k|		break;
  606|       |
  607|  3.31k|	case JCS_RGB:
  ------------------
  |  Branch (607:2): [True: 3.31k, False: 6.52k]
  ------------------
  608|  3.97k|	default:
  ------------------
  |  Branch (608:2): [True: 655, False: 9.18k]
  ------------------
  609|  3.97k|		interpretation = VIPS_INTERPRETATION_sRGB;
  610|  3.97k|		break;
  611|  9.84k|	}
  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|  8.92k|	xres = 72.0 / 25.4;
  624|  8.92k|	yres = 72.0 / 25.4;
  625|  8.92k|	if (cinfo->saw_JFIF_marker &&
  ------------------
  |  Branch (625:6): [True: 481, False: 8.44k]
  ------------------
  626|  8.92k|		cinfo->X_density != 1U &&
  ------------------
  |  Branch (626:3): [True: 476, False: 5]
  ------------------
  627|  8.92k|		cinfo->Y_density != 1U) {
  ------------------
  |  Branch (627:3): [True: 473, False: 3]
  ------------------
  628|    473|		switch (cinfo->density_unit) {
  629|     18|		case 0:
  ------------------
  |  Branch (629:3): [True: 18, False: 455]
  ------------------
  630|       |			/* X_density / Y_density gives the pixel aspect ratio.
  631|       |			 * Leave xres, but adjust yres.
  632|       |			 */
  633|     18|			if (cinfo->Y_density > 0)
  ------------------
  |  Branch (633:8): [True: 9, False: 9]
  ------------------
  634|      9|				yres = xres * cinfo->X_density /
  635|      9|					cinfo->Y_density;
  636|     18|			break;
  637|       |
  638|    110|		case 1:
  ------------------
  |  Branch (638:3): [True: 110, False: 363]
  ------------------
  639|       |			/* Pixels per inch.
  640|       |			 */
  641|    110|			xres = cinfo->X_density / 25.4;
  642|    110|			yres = cinfo->Y_density / 25.4;
  643|    110|			vips_image_set_string(out,
  644|    110|				VIPS_META_RESOLUTION_UNIT, "in");
  ------------------
  |  |   93|    110|#define VIPS_META_RESOLUTION_UNIT "resolution-unit"
  ------------------
  645|    110|			break;
  646|       |
  647|    316|		case 2:
  ------------------
  |  Branch (647:3): [True: 316, False: 157]
  ------------------
  648|       |			/* Pixels per cm.
  649|       |			 */
  650|    316|			xres = cinfo->X_density / 10.0;
  651|    316|			yres = cinfo->Y_density / 10.0;
  652|    316|			vips_image_set_string(out,
  653|    316|				VIPS_META_RESOLUTION_UNIT, "cm");
  ------------------
  |  |   93|    316|#define VIPS_META_RESOLUTION_UNIT "resolution-unit"
  ------------------
  654|    316|			break;
  655|       |
  656|     29|		default:
  ------------------
  |  Branch (656:3): [True: 29, False: 444]
  ------------------
  657|     29|			g_warning("%s", _("unknown JFIF resolution unit"));
  ------------------
  |  |  338|     29|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|     29|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|     29|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|     29|                               __VA_ARGS__)
  ------------------
  658|     29|			break;
  659|    473|		}
  660|       |
  661|       |#ifdef DEBUG
  662|       |		printf("read_jpeg_header: seen jfif resolution %g, %g p/mm\n",
  663|       |			xres, yres);
  664|       |#endif /*DEBUG*/
  665|    473|	}
  666|       |
  667|       |	/* Set VIPS header.
  668|       |	 */
  669|  8.92k|	vips_image_init_fields(out,
  670|  8.92k|		cinfo->output_width, cinfo->output_height,
  671|  8.92k|		cinfo->output_components,
  672|  8.92k|		VIPS_FORMAT_UCHAR, VIPS_CODING_NONE,
  673|  8.92k|		interpretation,
  674|  8.92k|		xres, yres);
  675|       |
  676|  8.92k|	VIPS_SETSTR(out->filename,
  ------------------
  |  |   53|  8.92k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  8.92k|#define G_STMT_START  do
  |  |  ------------------
  |  |   54|  8.92k|	{ \
  |  |   55|  8.92k|		const char *sst = (V); \
  |  |   56|  8.92k|		\
  |  |   57|  8.92k|		if ((S) != sst) { \
  |  |  ------------------
  |  |  |  Branch (57:7): [True: 8.92k, False: 0]
  |  |  ------------------
  |  |   58|  8.92k|			if (!(S) || !sst || strcmp((S), sst) != 0) { \
  |  |  ------------------
  |  |  |  Branch (58:8): [True: 0, False: 8.92k]
  |  |  |  Branch (58:16): [True: 8.92k, False: 0]
  |  |  |  Branch (58:24): [True: 0, False: 0]
  |  |  ------------------
  |  |   59|  8.92k|				VIPS_FREE(S); \
  |  |  ------------------
  |  |  |  |   50|  8.92k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  |  |  ------------------
  |  |  |  |  |  |   41|  8.92k|	G_STMT_START \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  854|  8.92k|#define G_STMT_START  do
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   42|  8.92k|	{ \
  |  |  |  |  |  |   43|  8.92k|		if (S) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (43:7): [True: 8.92k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   44|  8.92k|			(void) F((S)); \
  |  |  |  |  |  |   45|  8.92k|			(S) = 0; \
  |  |  |  |  |  |   46|  8.92k|		} \
  |  |  |  |  |  |   47|  8.92k|	} \
  |  |  |  |  |  |   48|  8.92k|	G_STMT_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  862|  8.92k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   60|  8.92k|				if (sst) \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 0, False: 8.92k]
  |  |  ------------------
  |  |   61|  8.92k|					(S) = g_strdup(sst); \
  |  |   62|  8.92k|			} \
  |  |   63|  8.92k|		} \
  |  |   64|  8.92k|	} \
  |  |   65|  8.92k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  8.92k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  677|  8.92k|		vips_connection_filename(VIPS_CONNECTION(jpeg->source)));
  678|       |
  679|  8.92k|	if (vips_image_pipelinev(out, VIPS_DEMAND_STYLE_FATSTRIP, NULL))
  ------------------
  |  Branch (679:6): [True: 0, False: 8.92k]
  ------------------
  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|  8.92k|	jpeg->output_width = cinfo->image_width / jpeg->shrink;
  692|  8.92k|	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|  8.92k|	(void) vips_image_set_int(out, "jpeg-multiscan",
  698|  8.92k|		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|  8.92k|	if (jpeg_has_multiple_scans(cinfo))
  ------------------
  |  Branch (702:6): [True: 7.77k, False: 1.15k]
  ------------------
  703|  7.77k|		vips_image_set_int(out, "interlaced", 1);
  704|       |
  705|  8.92k|	(void) vips_image_set_string(out, "jpeg-chroma-subsample",
  706|  8.92k|		find_chroma_subsample(cinfo));
  707|       |
  708|       |	/* Look for EXIF and ICC profile.
  709|       |	 */
  710|  19.0k|	for (p = cinfo->marker_list; p; p = p->next) {
  ------------------
  |  Branch (710:31): [True: 10.1k, False: 8.92k]
  ------------------
  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|  10.1k|		switch (p->marker) {
  724|  5.16k|		case JPEG_APP0 + 1:
  ------------------
  |  | 1168|  5.16k|#define JPEG_APP0       0xE0    /* APP0 marker code */
  ------------------
  |  Branch (724:3): [True: 5.16k, False: 4.97k]
  ------------------
  725|       |			/* Possible EXIF or XMP data.
  726|       |			 */
  727|  5.16k|			if (p->data_length > 4 &&
  ------------------
  |  Branch (727:8): [True: 4.81k, False: 349]
  ------------------
  728|  5.16k|				vips_isprefix("Exif", (char *) p->data) &&
  ------------------
  |  Branch (728:5): [True: 1.55k, False: 3.25k]
  ------------------
  729|  5.16k|				attach_blob(out, VIPS_META_EXIF_NAME,
  ------------------
  |  |   46|  1.55k|#define VIPS_META_EXIF_NAME "exif-data"
  ------------------
  |  Branch (729:5): [True: 0, False: 1.55k]
  ------------------
  730|  1.55k|					p->data, p->data_length))
  731|      0|				return -1;
  732|       |
  733|  5.16k|			if (p->data_length > 4 &&
  ------------------
  |  Branch (733:8): [True: 4.81k, False: 349]
  ------------------
  734|  5.16k|				vips_isprefix("http", (char *) p->data) &&
  ------------------
  |  Branch (734:5): [True: 2.63k, False: 2.17k]
  ------------------
  735|  5.16k|				attach_xmp_blob(out,
  ------------------
  |  Branch (735:5): [True: 0, False: 2.63k]
  ------------------
  736|  2.63k|					p->data, p->data_length))
  737|      0|				return -1;
  738|       |
  739|  5.16k|			break;
  740|       |
  741|  5.16k|		case JPEG_APP0 + 2:
  ------------------
  |  | 1168|  1.29k|#define JPEG_APP0       0xE0    /* APP0 marker code */
  ------------------
  |  Branch (741:3): [True: 1.29k, False: 8.84k]
  ------------------
  742|       |			/* Possible ICC profile.
  743|       |			 */
  744|  1.29k|			if (p->data_length > 14 &&
  ------------------
  |  Branch (744:8): [True: 1.06k, False: 225]
  ------------------
  745|  1.29k|				vips_isprefix("ICC_PROFILE",
  ------------------
  |  Branch (745:5): [True: 279, False: 788]
  ------------------
  746|  1.06k|					(char *) p->data)) {
  747|       |				/* cur_marker numbers from 1, according to
  748|       |				 * spec.
  749|       |				 */
  750|    279|				int cur_marker = p->data[12] - 1;
  751|       |
  752|    279|				if (cur_marker >= 0 &&
  ------------------
  |  Branch (752:9): [True: 239, False: 40]
  ------------------
  753|    279|					cur_marker < MAX_APP2_SECTIONS) {
  ------------------
  |  |  564|    239|#define MAX_APP2_SECTIONS (100)
  ------------------
  |  Branch (753:6): [True: 173, False: 66]
  ------------------
  754|    173|					app2_data[cur_marker] = p->data + 14;
  755|    173|					app2_data_length[cur_marker] =
  756|    173|						p->data_length - 14;
  757|    173|				}
  758|    279|			}
  759|  1.29k|			break;
  760|       |
  761|    702|		case JPEG_APP0 + 13:
  ------------------
  |  | 1168|    702|#define JPEG_APP0       0xE0    /* APP0 marker code */
  ------------------
  |  Branch (761:3): [True: 702, False: 9.43k]
  ------------------
  762|       |			/* Possible IPTC data block.
  763|       |			 */
  764|    702|			if (p->data_length > 5 &&
  ------------------
  |  Branch (764:8): [True: 65, False: 637]
  ------------------
  765|    702|				vips_isprefix("Photo", (char *) p->data)) {
  ------------------
  |  Branch (765:5): [True: 1, False: 64]
  ------------------
  766|      1|				if (attach_blob(out, VIPS_META_IPTC_NAME,
  ------------------
  |  |   60|      1|#define VIPS_META_IPTC_NAME "iptc-data"
  ------------------
  |  Branch (766:9): [True: 0, False: 1]
  ------------------
  767|      1|						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|      1|				if (attach_blob(out, "ipct-data",
  ------------------
  |  Branch (774:9): [True: 0, False: 1]
  ------------------
  775|      1|						p->data, p->data_length))
  776|      0|					return -1;
  777|      1|			}
  778|    702|			break;
  779|       |
  780|  2.98k|		case JPEG_APP0 + 14:
  ------------------
  |  | 1168|  2.98k|#define JPEG_APP0       0xE0    /* APP0 marker code */
  ------------------
  |  Branch (780:3): [True: 2.98k, False: 7.15k]
  ------------------
  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|  2.98k|			if (p->data_length >= 12 &&
  ------------------
  |  Branch (796:8): [True: 2.88k, False: 94]
  ------------------
  797|  2.98k|				vips_isprefix("Adobe", (char *) p->data)) {
  ------------------
  |  Branch (797:5): [True: 1.18k, False: 1.70k]
  ------------------
  798|  1.18k|				if (p->data[11] == 0) {
  ------------------
  |  Branch (798:9): [True: 88, False: 1.09k]
  ------------------
  799|       |#ifdef DEBUG
  800|       |					printf("complete Adobe block, not YCCK image\n");
  801|       |#endif				/*DEBUG*/
  802|       |					// jpeg->invert_pels = FALSE;
  803|     88|				}
  804|  1.18k|			}
  805|  2.98k|			break;
  806|       |
  807|      0|		default:
  ------------------
  |  Branch (807:3): [True: 0, False: 10.1k]
  ------------------
  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|  10.1k|		}
  815|  10.1k|	}
  816|       |
  817|       |	/* Assemble ICC sections.
  818|       |	 */
  819|  8.92k|	data_length = 0;
  820|  8.93k|	for (i = 0; i < MAX_APP2_SECTIONS && app2_data[i]; i++)
  ------------------
  |  |  564|  17.8k|#define MAX_APP2_SECTIONS (100)
  ------------------
  |  Branch (820:14): [True: 8.93k, False: 0]
  |  Branch (820:39): [True: 9, False: 8.92k]
  ------------------
  821|      9|		data_length += app2_data_length[i];
  822|  8.92k|	if (data_length) {
  ------------------
  |  Branch (822:6): [True: 6, False: 8.91k]
  ------------------
  823|      6|		unsigned char *data;
  824|      6|		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|      6|		if (!(data = vips_malloc(NULL, data_length)))
  ------------------
  |  Branch (831:7): [True: 0, False: 6]
  ------------------
  832|      0|			return -1;
  833|       |
  834|      6|		p = 0;
  835|     15|		for (i = 0; i < MAX_APP2_SECTIONS && app2_data[i]; i++) {
  ------------------
  |  |  564|     30|#define MAX_APP2_SECTIONS (100)
  ------------------
  |  Branch (835:15): [True: 15, False: 0]
  |  Branch (835:40): [True: 9, False: 6]
  ------------------
  836|      9|			memcpy(data + p, app2_data[i], app2_data_length[i]);
  837|      9|			p += app2_data_length[i];
  838|      9|		}
  839|       |
  840|      6|		vips_image_set_blob(out, VIPS_META_ICC_NAME,
  ------------------
  |  |   78|      6|#define VIPS_META_ICC_NAME "icc-profile-data"
  ------------------
  841|      6|			(VipsCallbackFn) vips_area_free_cb, data, data_length);
  842|      6|	}
  843|       |
  844|  8.92k|	return 0;
  845|  8.92k|}
jpeg2vips.c:find_chroma_subsample:
  495|  8.92k|{
  496|       |	/* libjpeg only uses 4:4:4 and 4:2:0, confusingly.
  497|       |	 *
  498|       |	 * http://poynton.ca/PDFs/Chroma_subsampling_notation.pdf
  499|       |	 */
  500|  8.92k|	gboolean has_subsample = cinfo->max_h_samp_factor > 1 ||
  ------------------
  |  Branch (500:27): [True: 5.63k, False: 3.28k]
  ------------------
  501|  8.92k|		cinfo->max_v_samp_factor > 1;
  ------------------
  |  Branch (501:3): [True: 1.92k, False: 1.36k]
  ------------------
  502|  8.92k|	gboolean is_cmyk = cinfo->num_components > 3;
  503|       |
  504|  8.92k|	return is_cmyk
  ------------------
  |  Branch (504:9): [True: 1.58k, False: 7.33k]
  ------------------
  505|  8.92k|		? (has_subsample ? "4:2:0:4" : "4:4:4:4")
  ------------------
  |  Branch (505:6): [True: 1.45k, False: 134]
  ------------------
  506|  8.92k|		: (has_subsample ? "4:2:0" : "4:4:4");
  ------------------
  |  Branch (506:6): [True: 6.10k, False: 1.23k]
  ------------------
  507|  8.92k|}
jpeg2vips.c:attach_blob:
  511|  2.69k|{
  512|       |	/* Only use the first one.
  513|       |	 */
  514|  2.69k|	if (vips_image_get_typeof(im, field)) {
  ------------------
  |  Branch (514:6): [True: 1.15k, False: 1.54k]
  ------------------
  515|       |#ifdef DEBUG
  516|       |		printf("attach_blob: second %s block, ignoring\n", field);
  517|       |#endif /*DEBUG*/
  518|       |
  519|  1.15k|		return 0;
  520|  1.15k|	}
  521|       |
  522|       |#ifdef DEBUG
  523|       |	printf("attach_blob: attaching %zd bytes of %s\n",
  524|       |		data_length, field);
  525|       |#endif /*DEBUG*/
  526|       |
  527|  1.54k|	vips_image_set_blob_copy(im, field, data, data_length);
  528|       |
  529|  1.54k|	return 0;
  530|  2.69k|}
jpeg2vips.c:attach_xmp_blob:
  538|  2.63k|{
  539|  2.63k|	char *p = (char *) data;
  540|  2.63k|	int i;
  541|       |
  542|  2.63k|	if (data_length < 4 ||
  ------------------
  |  Branch (542:6): [True: 0, False: 2.63k]
  ------------------
  543|  2.63k|		!vips_isprefix("http", p))
  ------------------
  |  Branch (543:3): [True: 0, False: 2.63k]
  ------------------
  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|  18.1k|	for (i = 0; i < VIPS_MIN(80, data_length - 2); i++)
  ------------------
  |  |   55|  18.1k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 53, False: 18.0k]
  |  |  ------------------
  ------------------
  |  Branch (551:14): [True: 16.6k, False: 1.51k]
  ------------------
  552|  16.6k|		if (!p[i])
  ------------------
  |  Branch (552:7): [True: 1.12k, False: 15.5k]
  ------------------
  553|  1.12k|			break;
  554|  2.63k|	if (p[i])
  ------------------
  |  Branch (554:6): [True: 1.50k, False: 1.13k]
  ------------------
  555|  1.50k|		return 0;
  556|       |
  557|  1.13k|	return attach_blob(im, VIPS_META_XMP_NAME,
  ------------------
  |  |   53|  1.13k|#define VIPS_META_XMP_NAME "xmp-data"
  ------------------
  558|  1.13k|		p + i + 1, data_length - i - 1);
  559|  2.63k|}
jpeg2vips.c:read_jpeg_image:
  941|  4.09k|{
  942|  4.09k|	struct jpeg_decompress_struct *cinfo = &jpeg->cinfo;
  943|  4.09k|	VipsImage **t = (VipsImage **)
  944|  4.09k|		vips_object_local_array(VIPS_OBJECT(out), 5);
  ------------------
  |  |  433|  4.09k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  4.09k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  4.09k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  945|       |
  946|  4.09k|	VipsImage *im;
  947|       |
  948|       |	/* Here for longjmp() from vips__new_error_exit() during
  949|       |	 * jpeg_read_header() or jpeg_start_decompress().
  950|       |	 */
  951|  4.09k|	if (setjmp(jpeg->eman.jmp))
  952|  1.64k|		return -1;
  953|       |
  954|  2.44k|	t[0] = vips_image_new();
  955|  2.44k|	if (read_jpeg_header(jpeg, t[0]))
  ------------------
  |  Branch (955:6): [True: 0, False: 2.44k]
  ------------------
  956|      0|		return -1;
  957|       |
  958|       |	/* Switch to pixel decode.
  959|       |	 */
  960|  2.44k|	if (vips_source_decode(jpeg->source))
  ------------------
  |  Branch (960:6): [True: 0, False: 2.44k]
  ------------------
  961|      0|		return -1;
  962|       |
  963|  2.44k|	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|  2.44k|	if (vips_image_generate(t[0],
  ------------------
  |  Branch (972:6): [True: 0, False: 2.44k]
  ------------------
  973|  2.44k|			NULL, read_jpeg_generate, NULL,
  974|  2.44k|			jpeg, NULL) ||
  975|  2.44k|		vips_sequential(t[0], &t[1],
  ------------------
  |  Branch (975:3): [True: 0, False: 2.44k]
  ------------------
  976|  2.44k|			"tile_height", 8,
  977|  2.44k|			NULL) ||
  978|  2.44k|		vips_extract_area(t[1], &t[2],
  ------------------
  |  Branch (978:3): [True: 0, False: 2.44k]
  ------------------
  979|  2.44k|			0, 0, jpeg->output_width, jpeg->output_height, NULL))
  980|      0|		return -1;
  981|  2.44k|	im = t[2];
  982|       |
  983|  2.44k|	if (jpeg->autorotate &&
  ------------------
  |  Branch (983:6): [True: 0, False: 2.44k]
  ------------------
  984|  2.44k|		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|  2.44k|	if (vips_image_write(im, out))
  ------------------
  |  Branch (994:6): [True: 871, False: 1.57k]
  ------------------
  995|    871|		return -1;
  996|       |
  997|  1.57k|	return 0;
  998|  2.44k|}
jpeg2vips.c:read_jpeg_generate:
  850|  16.3k|{
  851|  16.3k|	VipsRect *r = &out_region->valid;
  852|  16.3k|	ReadJpeg *jpeg = (ReadJpeg *) a;
  853|  16.3k|	struct jpeg_decompress_struct *cinfo = &jpeg->cinfo;
  854|  16.3k|	int sz = cinfo->output_width * cinfo->output_components;
  855|       |
  856|  16.3k|	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|  16.3k|	VIPS_GATE_START("read_jpeg_generate: work");
  ------------------
  |  |   41|  16.3k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  16.3k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  16.3k|	{ \
  |  |   43|  16.3k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 16.3k]
  |  |  ------------------
  |  |   44|  16.3k|			vips__thread_gate_start(NAME); \
  |  |   45|  16.3k|	} \
  |  |   46|  16.3k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  16.3k|#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|  16.3k|	g_assert(r->left == 0);
  ------------------
  |  |  166|  16.3k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  16.3k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  16.3k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  869|  16.3k|	g_assert(r->width == out_region->im->Xsize);
  ------------------
  |  |  166|  16.3k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  16.3k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  16.3k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  870|  16.3k|	g_assert(VIPS_RECT_BOTTOM(r) <= out_region->im->Ysize);
  ------------------
  |  |  166|  16.3k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  16.3k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  16.3k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  871|       |
  872|       |	/* Tiles should always be on a 8-pixel boundary.
  873|       |	 */
  874|  16.3k|	g_assert(r->top % 8 == 0);
  ------------------
  |  |  166|  16.3k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  16.3k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  16.3k|#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|  16.3k|	g_assert(r->height == VIPS_MIN(8, out_region->im->Ysize - r->top));
  ------------------
  |  |  166|  16.3k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  16.3k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  16.3k|#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|  16.3k|	if (r->top != cinfo->output_scanline) {
  ------------------
  |  Branch (884:6): [True: 0, False: 16.3k]
  ------------------
  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|  16.3k|	if (setjmp(jpeg->eman.jmp)) {
  896|    871|		VIPS_GATE_STOP("read_jpeg_generate: work");
  ------------------
  |  |   49|    871|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    871|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|    871|	{ \
  |  |   51|    871|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 871]
  |  |  ------------------
  |  |   52|    871|			vips__thread_gate_stop(NAME); \
  |  |   53|    871|	} \
  |  |   54|    871|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    871|#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|    871|		return -1;
  903|    871|	}
  904|       |
  905|  15.5k|	if (jpeg->eman.pub.num_warnings > 0 &&
  ------------------
  |  Branch (905:6): [True: 16.3k, False: 18.4E]
  ------------------
  906|  16.3k|		jpeg->fail_on >= VIPS_FAIL_ON_WARNING) {
  ------------------
  |  Branch (906:3): [True: 0, False: 16.3k]
  ------------------
  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|   135k|	for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (916:14): [True: 119k, False: 15.5k]
  ------------------
  917|   119k|		JSAMPROW row_pointer[1];
  918|       |
  919|   119k|		row_pointer[0] = (JSAMPLE *)
  920|   119k|			VIPS_REGION_ADDR(out_region, 0, r->top + y);
  ------------------
  |  |  227|   119k|	((R)->data + \
  |  |  228|   119k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   119k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   119k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   119k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   119k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   119k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  921|       |
  922|   119k|		jpeg_read_scanlines(cinfo, &row_pointer[0], 1);
  923|       |
  924|   119k|		if (jpeg->invert_pels) {
  ------------------
  |  Branch (924:7): [True: 34.5k, False: 85.2k]
  ------------------
  925|  34.5k|			int x;
  926|       |
  927|  13.2M|			for (x = 0; x < sz; x++)
  ------------------
  |  Branch (927:16): [True: 13.2M, False: 34.5k]
  ------------------
  928|  13.2M|				row_pointer[0][x] = 255 - row_pointer[0][x];
  929|  34.5k|		}
  930|   119k|	}
  931|       |
  932|  15.5k|	VIPS_GATE_STOP("read_jpeg_generate: work");
  ------------------
  |  |   49|  15.5k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  15.5k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  15.5k|	{ \
  |  |   51|  15.5k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 15.5k]
  |  |  ------------------
  |  |   52|  15.5k|			vips__thread_gate_stop(NAME); \
  |  |   53|  15.5k|	} \
  |  |   54|  15.5k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  15.5k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  933|       |
  934|  15.5k|	return 0;
  935|  15.5k|}

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|  5.74k|{
   99|  5.74k|	VipsForeignLoadJpeg *jpeg = (VipsForeignLoadJpeg *) gobject;
  100|       |
  101|  5.74k|	VIPS_UNREF(jpeg->source);
  ------------------
  |  |   57|  5.74k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  5.74k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  5.74k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  5.74k|	{ \
  |  |  |  |   43|  5.74k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 5.74k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  5.74k|			(void) F((S)); \
  |  |  |  |   45|  5.74k|			(S) = 0; \
  |  |  |  |   46|  5.74k|		} \
  |  |  |  |   47|  5.74k|	} \
  |  |  |  |   48|  5.74k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  5.74k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  102|       |
  103|  5.74k|	G_OBJECT_CLASS(vips_foreign_load_jpeg_parent_class)->dispose(gobject);
  ------------------
  |  |   58|  5.74k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  5.74k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  5.74k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  104|  5.74k|}
jpegload.c:vips_foreign_load_jpeg_build:
  108|  5.74k|{
  109|  5.74k|	VipsForeignLoadJpeg *jpeg = (VipsForeignLoadJpeg *) object;
  110|       |
  111|  5.74k|	if (jpeg->shrink != 1 &&
  ------------------
  |  Branch (111:6): [True: 0, False: 5.74k]
  ------------------
  112|  5.74k|		jpeg->shrink != 2 &&
  ------------------
  |  Branch (112:3): [True: 0, False: 0]
  ------------------
  113|  5.74k|		jpeg->shrink != 4 &&
  ------------------
  |  Branch (113:3): [True: 0, False: 0]
  ------------------
  114|  5.74k|		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|  5.74k|	if (VIPS_OBJECT_CLASS(vips_foreign_load_jpeg_parent_class)->build(object))
  ------------------
  |  |  435|  5.74k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  5.74k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  5.74k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (120:6): [True: 918, False: 4.82k]
  ------------------
  121|    918|		return -1;
  122|       |
  123|  4.82k|	return 0;
  124|  5.74k|}
jpegload.c:vips_foreign_load_jpeg_get_flags:
  128|  5.74k|{
  129|  5.74k|	return VIPS_FOREIGN_SEQUENTIAL;
  130|  5.74k|}
jpegload.c:vips_foreign_load_jpeg_header:
  140|  5.74k|{
  141|  5.74k|	VipsForeignLoadJpeg *jpeg = (VipsForeignLoadJpeg *) load;
  142|       |
  143|  5.74k|	if (vips__jpeg_read_source(jpeg->source,
  ------------------
  |  Branch (143:6): [True: 918, False: 4.82k]
  ------------------
  144|  5.74k|			load->out, TRUE, jpeg->shrink, load->fail_on,
  ------------------
  |  |  798|  5.74k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  5.74k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  145|  5.74k|			jpeg->autorotate, jpeg->unlimited))
  146|    918|		return -1;
  147|       |
  148|  4.82k|	return 0;
  149|  5.74k|}
jpegload.c:vips_foreign_load_jpeg_load:
  153|  4.09k|{
  154|  4.09k|	VipsForeignLoadJpeg *jpeg = (VipsForeignLoadJpeg *) load;
  155|       |
  156|  4.09k|	if (vips__jpeg_read_source(jpeg->source,
  ------------------
  |  Branch (156:6): [True: 2.51k, False: 1.57k]
  ------------------
  157|  4.09k|			load->real, FALSE, jpeg->shrink, load->fail_on,
  ------------------
  |  |  794|  4.09k|#define	FALSE	(0)
  ------------------
  158|  4.09k|			jpeg->autorotate, jpeg->unlimited))
  159|  2.51k|		return -1;
  160|       |
  161|  1.57k|	return 0;
  162|  4.09k|}
jpegload.c:vips_foreign_load_jpeg_init:
  216|  5.74k|{
  217|  5.74k|	jpeg->shrink = 1;
  218|  5.74k|}
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|  27.6k|{
  254|  27.6k|	return vips__isjpeg_source(source);
  255|  27.6k|}
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|  5.74k|{
  381|  5.74k|	VipsForeignLoadJpeg *jpeg = (VipsForeignLoadJpeg *) object;
  382|  5.74k|	VipsForeignLoadJpegBuffer *buffer =
  383|  5.74k|		(VipsForeignLoadJpegBuffer *) object;
  384|       |
  385|  5.74k|	if (buffer->blob &&
  ------------------
  |  Branch (385:6): [True: 5.74k, False: 0]
  ------------------
  386|  5.74k|		!(jpeg->source = vips_source_new_from_memory(
  ------------------
  |  Branch (386:3): [True: 0, False: 5.74k]
  ------------------
  387|  5.74k|			  VIPS_AREA(buffer->blob)->data,
  ------------------
  |  |  137|  5.74k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  388|  5.74k|			  VIPS_AREA(buffer->blob)->length)))
  ------------------
  |  |  137|  5.74k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  389|      0|		return -1;
  390|       |
  391|  5.74k|	if (VIPS_OBJECT_CLASS(vips_foreign_load_jpeg_buffer_parent_class)
  ------------------
  |  |  435|  5.74k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  5.74k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  5.74k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (391:6): [True: 918, False: 4.82k]
  ------------------
  392|  5.74k|			->build(object))
  393|    918|		return -1;
  394|       |
  395|  4.82k|	return 0;
  396|  5.74k|}
jpegload.c:vips_foreign_load_jpeg_buffer_is_a_buffer:
  400|  27.6k|{
  401|  27.6k|	VipsSource *source;
  402|  27.6k|	gboolean result;
  403|       |
  404|  27.6k|	if (!(source = vips_source_new_from_memory(buf, len)))
  ------------------
  |  Branch (404:6): [True: 0, False: 27.6k]
  ------------------
  405|      0|		return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  406|  27.6k|	result = vips_foreign_load_jpeg_source_is_a_source(source);
  407|  27.6k|	VIPS_UNREF(source);
  ------------------
  |  |   57|  27.6k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  27.6k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  27.6k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  27.6k|	{ \
  |  |  |  |   43|  27.6k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 27.6k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  27.6k|			(void) F((S)); \
  |  |  |  |   45|  27.6k|			(S) = 0; \
  |  |  |  |   46|  27.6k|		} \
  |  |  |  |   47|  27.6k|	} \
  |  |  |  |   48|  27.6k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  27.6k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  408|       |
  409|  27.6k|	return result;
  410|  27.6k|}
jpegload.c:vips_foreign_load_jpeg_buffer_init:
  439|  5.74k|{
  440|  5.74k|}

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|    745|{
 1385|    745|	if (gif == NULL) {
  ------------------
  |  Branch (1385:6): [True: 0, False: 745]
  ------------------
 1386|      0|		return;
 1387|      0|	}
 1388|       |
 1389|       |	/* Release all our memory blocks */
 1390|    745|	if (gif->frame_image) {
  ------------------
  |  Branch (1390:6): [True: 366, False: 379]
  ------------------
 1391|    366|		assert(gif->bitmap.destroy);
 1392|    366|		gif->bitmap.destroy(gif->frame_image);
 1393|    366|		gif->frame_image = NULL;
 1394|    366|	}
 1395|       |
 1396|    745|	free(gif->frames);
 1397|    745|	gif->frames = NULL;
 1398|       |
 1399|    745|	free(gif->prev_frame);
 1400|    745|	gif->prev_frame = NULL;
 1401|       |
 1402|    745|	lzw_context_destroy(gif->lzw_ctx);
 1403|    745|	gif->lzw_ctx = NULL;
 1404|       |
 1405|    745|	free(gif);
 1406|    745|}
nsgif_create:
 1492|    745|{
 1493|    745|	nsgif_t *gif;
 1494|       |
 1495|    745|	gif = calloc(1, sizeof(*gif));
 1496|    745|	if (gif == NULL) {
  ------------------
  |  Branch (1496:6): [True: 0, False: 745]
  ------------------
 1497|      0|		return NSGIF_ERR_OOM;
 1498|      0|	}
 1499|       |
 1500|    745|	gif->bitmap = *bitmap_vt;
 1501|    745|	gif->decoded_frame = NSGIF_FRAME_INVALID;
  ------------------
  |  |  156|    745|#define NSGIF_FRAME_INVALID UINT32_MAX
  ------------------
 1502|    745|	gif->prev_index = NSGIF_FRAME_INVALID;
  ------------------
  |  |  156|    745|#define NSGIF_FRAME_INVALID UINT32_MAX
  ------------------
 1503|       |
 1504|    745|	gif->delay_min = NSGIF_FRAME_DELAY_MIN;
  ------------------
  |  |   21|    745|#define NSGIF_FRAME_DELAY_MIN 2
  ------------------
 1505|    745|	gif->delay_default = NSGIF_FRAME_DELAY_DEFAULT;
  ------------------
  |  |   28|    745|#define NSGIF_FRAME_DELAY_DEFAULT 10
  ------------------
 1506|       |
 1507|    745|	gif->colour_layout = nsgif__bitmap_fmt_to_colour_layout(bitmap_fmt);
 1508|       |
 1509|    745|	*gif_out = gif;
 1510|    745|	return NSGIF_OK;
 1511|    745|}
nsgif_data_scan:
 1612|    745|{
 1613|    745|	const uint8_t *nsgif_data;
 1614|    745|	nsgif_error ret;
 1615|    745|	uint32_t frames;
 1616|       |
 1617|    745|	if (gif->data_complete) {
  ------------------
  |  Branch (1617:6): [True: 0, False: 745]
  ------------------
 1618|      0|		return NSGIF_ERR_DATA_COMPLETE;
 1619|      0|	}
 1620|       |
 1621|       |	/* Initialize values */
 1622|    745|	gif->buf_len = size;
 1623|    745|	gif->buf = data;
 1624|       |
 1625|       |	/* Get our current processing position */
 1626|    745|	nsgif_data = gif->buf + gif->buf_pos;
 1627|       |
 1628|       |	/* See if we should initialise the GIF */
 1629|    745|	if (gif->buf_pos == 0) {
  ------------------
  |  Branch (1629:6): [True: 745, 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|    745|		gif->frame_image = NULL;
 1634|    745|		gif->frames = NULL;
 1635|    745|		gif->frame_holders = 0;
 1636|       |
 1637|       |		/* The caller may have been lazy and not reset any values */
 1638|    745|		gif->info.frame_count = 0;
 1639|    745|		gif->frame_count_partial = 0;
 1640|    745|		gif->decoded_frame = NSGIF_FRAME_INVALID;
  ------------------
  |  |  156|    745|#define NSGIF_FRAME_INVALID UINT32_MAX
  ------------------
 1641|    745|		gif->frame = NSGIF_FRAME_INVALID;
  ------------------
  |  |  156|    745|#define NSGIF_FRAME_INVALID UINT32_MAX
  ------------------
 1642|       |
 1643|    745|		ret = nsgif__parse_header(gif, &nsgif_data, false);
 1644|    745|		if (ret != NSGIF_OK) {
  ------------------
  |  Branch (1644:7): [True: 2, False: 743]
  ------------------
 1645|      2|			return ret;
 1646|      2|		}
 1647|       |
 1648|    743|		ret = nsgif__parse_logical_screen_descriptor(gif, &nsgif_data);
 1649|    743|		if (ret != NSGIF_OK) {
  ------------------
  |  Branch (1649:7): [True: 6, False: 737]
  ------------------
 1650|      6|			return ret;
 1651|      6|		}
 1652|       |
 1653|       |		/* Remember we've done this now */
 1654|    737|		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|    737|		if (((gif->info.width == 640) && (gif->info.height == 480)) ||
  ------------------
  |  Branch (1661:8): [True: 3, False: 734]
  |  Branch (1661:36): [True: 0, False: 3]
  ------------------
 1662|    737|		    ((gif->info.width == 640) && (gif->info.height == 512)) ||
  ------------------
  |  Branch (1662:8): [True: 3, False: 734]
  |  Branch (1662:36): [True: 0, False: 3]
  ------------------
 1663|    737|		    ((gif->info.width == 800) && (gif->info.height == 600)) ||
  ------------------
  |  Branch (1663:8): [True: 2, False: 735]
  |  Branch (1663:36): [True: 0, False: 2]
  ------------------
 1664|    737|		    ((gif->info.width == 1024) && (gif->info.height == 768)) ||
  ------------------
  |  Branch (1664:8): [True: 6, False: 731]
  |  Branch (1664:37): [True: 0, False: 6]
  ------------------
 1665|    737|		    ((gif->info.width == 1280) && (gif->info.height == 1024)) ||
  ------------------
  |  Branch (1665:8): [True: 6, False: 731]
  |  Branch (1665:37): [True: 1, False: 5]
  ------------------
 1666|    737|		    ((gif->info.width == 1600) && (gif->info.height == 1200)) ||
  ------------------
  |  Branch (1666:8): [True: 1, False: 735]
  |  Branch (1666:37): [True: 0, False: 1]
  ------------------
 1667|    737|		    ((gif->info.width == 0) || (gif->info.height == 0)) ||
  ------------------
  |  Branch (1667:8): [True: 39, False: 697]
  |  Branch (1667:34): [True: 150, False: 547]
  ------------------
 1668|    737|		    ((gif->info.width > 2048) || (gif->info.height > 2048))) {
  ------------------
  |  Branch (1668:8): [True: 264, False: 283]
  |  Branch (1668:36): [True: 45, False: 238]
  ------------------
 1669|    499|			gif->info.width = 1;
 1670|    499|			gif->info.height = 1;
 1671|    499|		}
 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|    737|		gif->global_colour_table[0] = NSGIF_PROCESS_COLOURS;
  ------------------
  |  |  153|    737|#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|    737|		if (gif->buf_len == gif->buf_pos + 1) {
  ------------------
  |  Branch (1682:7): [True: 12, False: 725]
  ------------------
 1683|     12|			if (nsgif_data[0] == NSGIF_TRAILER) {
  ------------------
  |  |  168|     12|#define NSGIF_TRAILER 0x3b
  ------------------
  |  Branch (1683:8): [True: 1, False: 11]
  ------------------
 1684|      1|				return NSGIF_OK;
 1685|      1|			}
 1686|     12|		}
 1687|    737|	}
 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|    736|	if (gif->global_colour_table[0] == NSGIF_PROCESS_COLOURS) {
  ------------------
  |  |  153|    736|#define NSGIF_PROCESS_COLOURS 0xaa000000
  ------------------
  |  Branch (1693:6): [True: 736, False: 0]
  ------------------
 1694|       |		/* Check for a global colour map signified by bit 7 */
 1695|    736|		if (gif->info.global_palette) {
  ------------------
  |  Branch (1695:7): [True: 200, False: 536]
  ------------------
 1696|    200|			size_t remaining = gif->buf + gif->buf_len - nsgif_data;
 1697|    200|			size_t used;
 1698|       |
 1699|    200|			ret = nsgif__colour_table_extract(
 1700|    200|					gif->global_colour_table,
 1701|    200|					&gif->colour_layout,
 1702|    200|					gif->colour_table_size,
 1703|    200|					nsgif_data, remaining, &used, true);
 1704|    200|			if (ret != NSGIF_OK) {
  ------------------
  |  Branch (1704:8): [True: 20, False: 180]
  ------------------
 1705|     20|				return ret;
 1706|     20|			}
 1707|       |
 1708|    180|			nsgif_data += used;
 1709|    180|			gif->buf_pos = (nsgif_data - gif->buf);
 1710|    536|		} else {
 1711|       |			/* Create a default colour table with the first two
 1712|       |			 * colours as black and white. */
 1713|    536|			uint8_t *entry = (uint8_t *)gif->global_colour_table;
 1714|       |
 1715|       |			/* Black */
 1716|    536|			entry[gif->colour_layout.r] = 0x00;
 1717|    536|			entry[gif->colour_layout.g] = 0x00;
 1718|    536|			entry[gif->colour_layout.b] = 0x00;
 1719|    536|			entry[gif->colour_layout.a] = 0xFF;
 1720|       |
 1721|    536|			entry += sizeof(uint32_t);
 1722|       |
 1723|       |			/* White */
 1724|    536|			entry[gif->colour_layout.r] = 0xFF;
 1725|    536|			entry[gif->colour_layout.g] = 0xFF;
 1726|    536|			entry[gif->colour_layout.b] = 0xFF;
 1727|    536|			entry[gif->colour_layout.a] = 0xFF;
 1728|       |
 1729|    536|			gif->colour_table_size = 2;
 1730|    536|		}
 1731|       |
 1732|    716|		if (gif->info.global_palette &&
  ------------------
  |  Branch (1732:7): [True: 180, False: 536]
  ------------------
 1733|    716|		    gif->bg_index < gif->colour_table_size) {
  ------------------
  |  Branch (1733:7): [True: 115, False: 65]
  ------------------
 1734|    115|			size_t bg_idx = gif->bg_index;
 1735|    115|			gif->info.background = gif->global_colour_table[bg_idx];
 1736|    601|		} else {
 1737|    601|			gif->info.background = gif->global_colour_table[0];
 1738|    601|		}
 1739|    716|	}
 1740|       |
 1741|    716|	if (gif->lzw_ctx == NULL) {
  ------------------
  |  Branch (1741:6): [True: 716, False: 0]
  ------------------
 1742|    716|		lzw_result res = lzw_context_create(
 1743|    716|				(struct lzw_ctx **)&gif->lzw_ctx);
 1744|    716|		if (res != LZW_OK) {
  ------------------
  |  Branch (1744:7): [True: 0, False: 716]
  ------------------
 1745|      0|			return nsgif__error_from_lzw(res);
 1746|      0|		}
 1747|    716|	}
 1748|       |
 1749|       |	/* Try to initialise all frames. */
 1750|  1.56k|	do {
 1751|  1.56k|		frames = gif->info.frame_count;
 1752|  1.56k|		ret = nsgif__process_frame(gif, frames, false);
 1753|  1.56k|	} while (gif->info.frame_count > frames);
  ------------------
  |  Branch (1753:11): [True: 849, False: 716]
  ------------------
 1754|       |
 1755|    716|	if (ret == NSGIF_ERR_END_OF_DATA && gif->info.frame_count > 0) {
  ------------------
  |  Branch (1755:6): [True: 647, False: 69]
  |  Branch (1755:38): [True: 98, False: 549]
  ------------------
 1756|     98|		ret = NSGIF_OK;
 1757|     98|	}
 1758|       |
 1759|    716|	return ret;
 1760|    716|}
nsgif_data_complete:
 1765|    745|{
 1766|    745|	if (gif->data_complete == false) {
  ------------------
  |  Branch (1766:6): [True: 745, False: 0]
  ------------------
 1767|    745|		uint32_t start = gif->info.frame_count;
 1768|    745|		uint32_t end = gif->frame_count_partial;
 1769|       |
 1770|    782|		for (uint32_t f = start; f < end; f++) {
  ------------------
  |  Branch (1770:28): [True: 329, False: 453]
  ------------------
 1771|    329|			nsgif_frame *frame = &gif->frames[f];
 1772|       |
 1773|    329|			if (frame->lzw_data_length > 0) {
  ------------------
  |  Branch (1773:8): [True: 292, False: 37]
  ------------------
 1774|    292|				frame->info.display = true;
 1775|    292|				gif->info.frame_count = f + 1;
 1776|       |
 1777|    292|				if (f == 0) {
  ------------------
  |  Branch (1777:9): [True: 283, False: 9]
  ------------------
 1778|    283|					frame->info.transparency = true;
 1779|    283|				}
 1780|    292|				break;
 1781|    292|			}
 1782|    329|		}
 1783|    745|	}
 1784|       |
 1785|    745|	gif->data_complete = true;
 1786|    745|}
nsgif_frame_decode:
 1951|    366|{
 1952|    366|	uint32_t start_frame;
 1953|    366|	nsgif_error ret = NSGIF_OK;
 1954|       |
 1955|    366|	if (frame >= gif->info.frame_count) {
  ------------------
  |  Branch (1955:6): [True: 0, False: 366]
  ------------------
 1956|      0|		return NSGIF_ERR_BAD_FRAME;
 1957|      0|	}
 1958|       |
 1959|    366|	if (gif->decoded_frame == frame) {
  ------------------
  |  Branch (1959:6): [True: 0, False: 366]
  ------------------
 1960|      0|		*bitmap = gif->frame_image;
 1961|      0|		return NSGIF_OK;
 1962|       |
 1963|    366|	} else if (gif->decoded_frame >= frame ||
  ------------------
  |  Branch (1963:13): [True: 366, False: 0]
  ------------------
 1964|    366|	           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|    366|		start_frame = 0;
 1967|    366|	} else {
 1968|      0|		start_frame = nsgif__frame_next(
 1969|      0|				gif, false, gif->decoded_frame);
 1970|      0|	}
 1971|       |
 1972|    672|	for (uint32_t f = start_frame; f <= frame; f++) {
  ------------------
  |  Branch (1972:33): [True: 366, False: 306]
  ------------------
 1973|    366|		ret = nsgif__process_frame(gif, f, true);
 1974|    366|		if (ret != NSGIF_OK) {
  ------------------
  |  Branch (1974:7): [True: 60, False: 306]
  ------------------
 1975|     60|			return ret;
 1976|     60|		}
 1977|    366|	}
 1978|       |
 1979|    306|	*bitmap = gif->frame_image;
 1980|    306|	return ret;
 1981|    366|}
nsgif_get_info:
 1985|    745|{
 1986|    745|	return &gif->info;
 1987|    745|}
nsgif_get_frame_info:
 1993|  2.28k|{
 1994|  2.28k|	if (frame >= gif->info.frame_count) {
  ------------------
  |  Branch (1994:6): [True: 0, False: 2.28k]
  ------------------
 1995|      0|		return NULL;
 1996|      0|	}
 1997|       |
 1998|  2.28k|	return &gif->frames[frame].info;
 1999|  2.28k|}
nsgif_global_palette:
 2006|    719|{
 2007|    719|	size_t len = sizeof(*table) * NSGIF_MAX_COLOURS;
  ------------------
  |  |   27|    719|#define NSGIF_MAX_COLOURS 256
  ------------------
 2008|       |
 2009|    719|	memcpy(table, gif->global_colour_table, len);
 2010|    719|	*entries = gif->colour_table_size;
 2011|    719|}
nsgif_local_palette:
 2019|    806|{
 2020|    806|	const nsgif_frame *f;
 2021|       |
 2022|    806|	if (frame >= gif->frame_count_partial) {
  ------------------
  |  Branch (2022:6): [True: 0, False: 806]
  ------------------
 2023|      0|		return false;
 2024|      0|	}
 2025|       |
 2026|    806|	f = &gif->frames[frame];
 2027|    806|	if (f->info.local_palette == false) {
  ------------------
  |  Branch (2027:6): [True: 616, False: 190]
  ------------------
 2028|    616|		return false;
 2029|    616|	}
 2030|       |
 2031|    190|	*entries = 2 << (f->flags & NSGIF_COLOUR_TABLE_SIZE_MASK);
  ------------------
  |  |  166|    190|#define NSGIF_COLOUR_TABLE_SIZE_MASK 0x07
  ------------------
 2032|    190|	nsgif__colour_table_decode(table, &gif->colour_layout,
 2033|    190|			*entries, gif->buf + f->colour_table_offset);
 2034|       |
 2035|    190|	return true;
 2036|    806|}
nsgif_strerror:
 2040|    697|{
 2041|    697|	static const char *const str[] = {
 2042|    697|		[NSGIF_OK]                = "Success",
 2043|    697|		[NSGIF_ERR_OOM]           = "Out of memory",
 2044|    697|		[NSGIF_ERR_DATA]          = "Invalid source data",
 2045|    697|		[NSGIF_ERR_BAD_FRAME]     = "Requested frame does not exist",
 2046|    697|		[NSGIF_ERR_DATA_FRAME]    = "Invalid frame data",
 2047|    697|		[NSGIF_ERR_END_OF_DATA]   = "Unexpected end of GIF source data",
 2048|    697|		[NSGIF_ERR_DATA_COMPLETE] = "Can't add data to completed GIF",
 2049|    697|		[NSGIF_ERR_FRAME_DISPLAY] = "Frame can't be displayed",
 2050|    697|		[NSGIF_ERR_ANIMATION_END] = "Animation complete",
 2051|    697|	};
 2052|       |
 2053|    697|	if (err >= NSGIF_ARRAY_LEN(str) || str[err] == NULL) {
  ------------------
  |  |  139|  1.39k|#define NSGIF_ARRAY_LEN(_a) ((sizeof(_a)) / (sizeof(*_a)))
  ------------------
  |  Branch (2053:6): [True: 0, False: 697]
  |  Branch (2053:37): [True: 0, False: 697]
  ------------------
 2054|      0|		return "Unknown error";
 2055|      0|	}
 2056|       |
 2057|    697|	return str[err];
 2058|    697|}
gif.c:nsgif__bitmap_fmt_to_colour_layout:
 1424|    745|{
 1425|    745|	bool le = nsgif__host_is_little_endian();
 1426|       |
 1427|       |	/* Map endian-dependant formats to byte-wise format for the host. */
 1428|    745|	switch (bitmap_fmt) {
 1429|      0|	case NSGIF_BITMAP_FMT_RGBA8888:
  ------------------
  |  Branch (1429:2): [True: 0, False: 745]
  ------------------
 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: 745]
  ------------------
 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: 745]
  ------------------
 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: 745]
  ------------------
 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|    745|	default:
  ------------------
  |  Branch (1445:2): [True: 745, False: 0]
  ------------------
 1446|    745|		break;
 1447|    745|	}
 1448|       |
 1449|       |	/* Set up colour component order for bitmap format. */
 1450|    745|	switch (bitmap_fmt) {
 1451|      0|	default:
  ------------------
  |  Branch (1451:2): [True: 0, False: 745]
  ------------------
 1452|       |		/* Fall through. */
 1453|    745|	case NSGIF_BITMAP_FMT_R8G8B8A8:
  ------------------
  |  Branch (1453:2): [True: 745, False: 0]
  ------------------
 1454|    745|		return (struct nsgif_colour_layout) {
 1455|    745|			.r = 0,
 1456|    745|			.g = 1,
 1457|    745|			.b = 2,
 1458|    745|			.a = 3,
 1459|    745|		};
 1460|       |
 1461|      0|	case NSGIF_BITMAP_FMT_B8G8R8A8:
  ------------------
  |  Branch (1461:2): [True: 0, False: 745]
  ------------------
 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: 745]
  ------------------
 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: 745]
  ------------------
 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|    745|	}
 1485|    745|}
gif.c:nsgif__host_is_little_endian:
 1416|    745|{
 1417|    745|	const uint16_t test = 1;
 1418|       |
 1419|    745|	return ((const uint8_t *) &test)[0];
 1420|    745|}
gif.c:nsgif__parse_header:
 1540|    745|{
 1541|    745|	const uint8_t *data = *pos;
 1542|    745|	size_t len = gif->buf + gif->buf_len - data;
 1543|       |
 1544|    745|	if (len < 6) {
  ------------------
  |  Branch (1544:6): [True: 2, False: 743]
  ------------------
 1545|      2|		return NSGIF_ERR_END_OF_DATA;
 1546|      2|	}
 1547|       |
 1548|    743|	if (strncmp((const char *) data, "GIF", 3) != 0) {
  ------------------
  |  Branch (1548:6): [True: 0, False: 743]
  ------------------
 1549|      0|		return NSGIF_ERR_DATA;
 1550|      0|	}
 1551|    743|	data += 3;
 1552|       |
 1553|    743|	if (strict == true) {
  ------------------
  |  Branch (1553:6): [True: 0, False: 743]
  ------------------
 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|    743|	data += 3;
 1560|       |
 1561|    743|	*pos = data;
 1562|    743|	return NSGIF_OK;
 1563|    743|}
gif.c:nsgif__parse_logical_screen_descriptor:
 1587|    743|{
 1588|    743|	const uint8_t *data = *pos;
 1589|    743|	size_t len = gif->buf + gif->buf_len - data;
 1590|       |
 1591|    743|	if (len < 7) {
  ------------------
  |  Branch (1591:6): [True: 6, False: 737]
  ------------------
 1592|      6|		return NSGIF_ERR_END_OF_DATA;
 1593|      6|	}
 1594|       |
 1595|    737|	gif->info.width = data[0] | (data[1] << 8);
 1596|    737|	gif->info.height = data[2] | (data[3] << 8);
 1597|    737|	gif->info.global_palette = data[4] & NSGIF_COLOUR_TABLE_MASK;
  ------------------
  |  |  165|    737|#define NSGIF_COLOUR_TABLE_MASK 0x80
  ------------------
 1598|    737|	gif->colour_table_size = 2 << (data[4] & NSGIF_COLOUR_TABLE_SIZE_MASK);
  ------------------
  |  |  166|    737|#define NSGIF_COLOUR_TABLE_SIZE_MASK 0x07
  ------------------
 1599|    737|	gif->bg_index = data[5];
 1600|    737|	gif->aspect_ratio = data[6];
 1601|    737|	gif->info.loop_max = 1;
 1602|       |
 1603|    737|	*pos += 7;
 1604|    737|	return NSGIF_OK;
 1605|    743|}
gif.c:nsgif__colour_table_extract:
 1115|    401|{
 1116|    401|	if (data_len < colour_table_entries * 3) {
  ------------------
  |  Branch (1116:6): [True: 29, False: 372]
  ------------------
 1117|     29|		return NSGIF_ERR_END_OF_DATA;
 1118|     29|	}
 1119|       |
 1120|    372|	if (decode) {
  ------------------
  |  Branch (1120:6): [True: 215, False: 157]
  ------------------
 1121|    215|		nsgif__colour_table_decode(colour_table, layout,
 1122|    215|				colour_table_entries, data);
 1123|    215|	}
 1124|       |
 1125|    372|	*used = colour_table_entries * 3;
 1126|    372|	return NSGIF_OK;
 1127|    401|}
gif.c:nsgif__error_from_lzw:
  177|    270|{
  178|    270|	static const nsgif_error g_res[] = {
  179|    270|		[LZW_OK]        = NSGIF_OK,
  180|    270|		[LZW_NO_MEM]    = NSGIF_ERR_OOM,
  181|    270|		[LZW_OK_EOD]    = NSGIF_ERR_END_OF_DATA,
  182|    270|		[LZW_NO_DATA]   = NSGIF_ERR_END_OF_DATA,
  183|    270|		[LZW_EOI_CODE]  = NSGIF_ERR_DATA_FRAME,
  184|    270|		[LZW_BAD_ICODE] = NSGIF_ERR_DATA_FRAME,
  185|    270|		[LZW_BAD_CODE]  = NSGIF_ERR_DATA_FRAME,
  186|    270|	};
  187|    270|	assert(l_res != LZW_BAD_PARAM);
  188|    270|	assert(l_res != LZW_NO_COLOUR);
  189|    270|	return g_res[l_res];
  190|    270|}
gif.c:nsgif__process_frame:
 1315|  1.93k|{
 1316|  1.93k|	nsgif_error ret;
 1317|  1.93k|	const uint8_t *pos;
 1318|  1.93k|	const uint8_t *end;
 1319|  1.93k|	struct nsgif_frame *frame;
 1320|       |
 1321|  1.93k|	frame = nsgif__get_frame(gif, frame_idx);
 1322|  1.93k|	if (frame == NULL) {
  ------------------
  |  Branch (1322:6): [True: 0, False: 1.93k]
  ------------------
 1323|      0|		return NSGIF_ERR_OOM;
 1324|      0|	}
 1325|       |
 1326|  1.93k|	end = gif->buf + gif->buf_len;
 1327|       |
 1328|  1.93k|	if (decode) {
  ------------------
  |  Branch (1328:6): [True: 366, False: 1.56k]
  ------------------
 1329|    366|		pos = gif->buf + frame->frame_offset;
 1330|       |
 1331|       |		/* Ensure this frame is supposed to be decoded */
 1332|    366|		if (frame->info.display == false) {
  ------------------
  |  Branch (1332:7): [True: 0, False: 366]
  ------------------
 1333|      0|			return NSGIF_OK;
 1334|      0|		}
 1335|       |
 1336|       |		/* Ensure the frame is in range to decode */
 1337|    366|		if (frame_idx > gif->frame_count_partial) {
  ------------------
  |  Branch (1337:7): [True: 0, False: 366]
  ------------------
 1338|      0|			return NSGIF_ERR_END_OF_DATA;
 1339|      0|		}
 1340|       |
 1341|       |		/* Done if frame is already decoded */
 1342|    366|		if (frame_idx == gif->decoded_frame) {
  ------------------
  |  Branch (1342:7): [True: 0, False: 366]
  ------------------
 1343|      0|			return NSGIF_OK;
 1344|      0|		}
 1345|  1.56k|	} else {
 1346|  1.56k|		pos = gif->buf + gif->buf_pos;
 1347|       |
 1348|       |		/* Check if we've finished */
 1349|  1.56k|		if (pos < end && pos[0] == NSGIF_TRAILER) {
  ------------------
  |  |  168|  1.52k|#define NSGIF_TRAILER 0x3b
  ------------------
  |  Branch (1349:7): [True: 1.52k, False: 41]
  |  Branch (1349:20): [True: 6, False: 1.51k]
  ------------------
 1350|      6|			return NSGIF_OK;
 1351|      6|		}
 1352|  1.56k|	}
 1353|       |
 1354|  1.92k|	ret = nsgif__parse_frame_extensions(gif, frame, &pos, !decode);
 1355|  1.92k|	if (ret != NSGIF_OK) {
  ------------------
  |  Branch (1355:6): [True: 156, False: 1.76k]
  ------------------
 1356|    156|		goto cleanup;
 1357|    156|	}
 1358|       |
 1359|  1.76k|	ret = nsgif__parse_image_descriptor(gif, frame, &pos, !decode);
 1360|  1.76k|	if (ret != NSGIF_OK) {
  ------------------
  |  Branch (1360:6): [True: 216, False: 1.55k]
  ------------------
 1361|    216|		goto cleanup;
 1362|    216|	}
 1363|       |
 1364|  1.55k|	ret = nsgif__parse_colour_table(gif, frame, &pos, decode);
 1365|  1.55k|	if (ret != NSGIF_OK) {
  ------------------
  |  Branch (1365:6): [True: 9, False: 1.54k]
  ------------------
 1366|      9|		goto cleanup;
 1367|      9|	}
 1368|       |
 1369|  1.54k|	ret = nsgif__parse_image_data(gif, frame, &pos, decode);
 1370|  1.54k|	if (ret != NSGIF_OK) {
  ------------------
  |  Branch (1370:6): [True: 386, False: 1.15k]
  ------------------
 1371|    386|		goto cleanup;
 1372|    386|	}
 1373|       |
 1374|  1.92k|cleanup:
 1375|  1.92k|	if (!decode) {
  ------------------
  |  Branch (1375:6): [True: 1.55k, False: 366]
  ------------------
 1376|  1.55k|		gif->buf_pos = pos - gif->buf;
 1377|  1.55k|	}
 1378|       |
 1379|  1.92k|	return ret;
 1380|  1.54k|}
gif.c:nsgif__get_frame:
 1268|  1.93k|{
 1269|  1.93k|	struct nsgif_frame *frame;
 1270|       |
 1271|  1.93k|	if (gif->frame_holders > frame_idx) {
  ------------------
  |  Branch (1271:6): [True: 366, False: 1.56k]
  ------------------
 1272|    366|		frame = &gif->frames[frame_idx];
 1273|  1.56k|	} else {
 1274|       |		/* Allocate more memory */
 1275|  1.56k|		size_t count = frame_idx + 1;
 1276|  1.56k|		struct nsgif_frame *temp;
 1277|       |
 1278|  1.56k|		temp = realloc(gif->frames, count * sizeof(*frame));
 1279|  1.56k|		if (temp == NULL) {
  ------------------
  |  Branch (1279:7): [True: 0, False: 1.56k]
  ------------------
 1280|      0|			return NULL;
 1281|      0|		}
 1282|  1.56k|		gif->frames = temp;
 1283|  1.56k|		gif->frame_holders = count;
 1284|       |
 1285|  1.56k|		frame = &gif->frames[frame_idx];
 1286|       |
 1287|  1.56k|		frame->info.local_palette = false;
 1288|  1.56k|		frame->info.transparency = false;
 1289|  1.56k|		frame->info.display = false;
 1290|  1.56k|		frame->info.disposal = 0;
 1291|  1.56k|		frame->info.delay = 10;
 1292|       |
 1293|  1.56k|		frame->transparency_index = NSGIF_NO_TRANSPARENCY;
  ------------------
  |  |  162|  1.56k|#define NSGIF_NO_TRANSPARENCY (0xFFFFFFFFu)
  ------------------
 1294|  1.56k|		frame->frame_offset = gif->buf_pos;
 1295|  1.56k|		frame->redraw_required = false;
 1296|  1.56k|		frame->lzw_data_length = 0;
 1297|  1.56k|		frame->decoded = false;
 1298|  1.56k|	}
 1299|       |
 1300|  1.93k|	return frame;
 1301|  1.93k|}
gif.c:nsgif__parse_frame_extensions:
  893|  1.92k|{
  894|  1.92k|	enum {
  895|  1.92k|		GIF_EXT_INTRODUCER      = 0x21,
  896|  1.92k|		GIF_EXT_GRAPHIC_CONTROL = 0xf9,
  897|  1.92k|		GIF_EXT_COMMENT         = 0xfe,
  898|  1.92k|		GIF_EXT_PLAIN_TEXT      = 0x01,
  899|  1.92k|		GIF_EXT_APPLICATION     = 0xff,
  900|  1.92k|	};
  901|  1.92k|	const uint8_t *nsgif_data = *pos;
  902|  1.92k|	const uint8_t *nsgif_end = gif->buf + gif->buf_len;
  903|  1.92k|	int nsgif_bytes = nsgif_end - nsgif_data;
  904|       |
  905|       |	/* Initialise the extensions */
  906|  8.47k|	while (nsgif_bytes > 0 && nsgif_data[0] == GIF_EXT_INTRODUCER) {
  ------------------
  |  Branch (906:9): [True: 8.40k, False: 74]
  |  Branch (906:28): [True: 6.70k, False: 1.69k]
  ------------------
  907|  6.70k|		bool block_step = true;
  908|  6.70k|		nsgif_error ret;
  909|       |
  910|  6.70k|		nsgif_data++;
  911|  6.70k|		nsgif_bytes--;
  912|       |
  913|  6.70k|		if (nsgif_bytes == 0) {
  ------------------
  |  Branch (913:7): [True: 3, False: 6.70k]
  ------------------
  914|      3|			return NSGIF_ERR_END_OF_DATA;
  915|      3|		}
  916|       |
  917|       |		/* Switch on extension label */
  918|  6.70k|		switch (nsgif_data[0]) {
  919|  2.77k|		case GIF_EXT_GRAPHIC_CONTROL:
  ------------------
  |  Branch (919:3): [True: 2.77k, False: 3.92k]
  ------------------
  920|  2.77k|			if (decode) {
  ------------------
  |  Branch (920:8): [True: 2.63k, False: 142]
  ------------------
  921|  2.63k|				ret = nsgif__parse_extension_graphic_control(
  922|  2.63k|						frame,
  923|  2.63k|						nsgif_data,
  924|  2.63k|						nsgif_bytes);
  925|  2.63k|				if (ret != NSGIF_OK) {
  ------------------
  |  Branch (925:9): [True: 3, False: 2.63k]
  ------------------
  926|      3|					return ret;
  927|      3|				}
  928|  2.63k|			}
  929|  2.77k|			break;
  930|       |
  931|  2.94k|		case GIF_EXT_APPLICATION:
  ------------------
  |  Branch (931:3): [True: 2.94k, False: 3.75k]
  ------------------
  932|  2.94k|			if (decode) {
  ------------------
  |  Branch (932:8): [True: 2.93k, False: 11]
  ------------------
  933|  2.93k|				ret = nsgif__parse_extension_application(
  934|  2.93k|						gif, nsgif_data, nsgif_bytes);
  935|  2.93k|				if (ret != NSGIF_OK) {
  ------------------
  |  Branch (935:9): [True: 16, False: 2.91k]
  ------------------
  936|     16|					return ret;
  937|     16|				}
  938|  2.93k|			}
  939|  2.93k|			break;
  940|       |
  941|  2.93k|		case GIF_EXT_COMMENT:
  ------------------
  |  Branch (941:3): [True: 106, False: 6.59k]
  ------------------
  942|       |			/* Move the pointer to the first data sub-block Skip 1
  943|       |			 * byte for the extension label. */
  944|    106|			++nsgif_data;
  945|    106|			block_step = false;
  946|    106|			break;
  947|       |
  948|    877|		default:
  ------------------
  |  Branch (948:3): [True: 877, False: 5.82k]
  ------------------
  949|    877|			break;
  950|  6.70k|		}
  951|       |
  952|  6.68k|		if (block_step) {
  ------------------
  |  Branch (952:7): [True: 6.58k, False: 106]
  ------------------
  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|  6.58k|			if (nsgif_bytes < 2) {
  ------------------
  |  Branch (957:8): [True: 1, False: 6.57k]
  ------------------
  958|      1|				return NSGIF_ERR_END_OF_DATA;
  959|      1|			}
  960|  6.57k|			nsgif_data += 2 + nsgif_data[1];
  961|  6.57k|		}
  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|  21.7k|		while (nsgif_data < nsgif_end && nsgif_data[0] != NSGIF_BLOCK_TERMINATOR) {
  ------------------
  |  |  167|  21.7k|#define NSGIF_BLOCK_TERMINATOR 0x00
  ------------------
  |  Branch (965:10): [True: 21.7k, False: 25]
  |  Branch (965:36): [True: 15.2k, False: 6.52k]
  ------------------
  966|  15.2k|			nsgif_data += nsgif_data[0] + 1;
  967|  15.2k|			if (nsgif_data >= nsgif_end) {
  ------------------
  |  Branch (967:8): [True: 133, False: 15.0k]
  ------------------
  968|    133|				return NSGIF_ERR_END_OF_DATA;
  969|    133|			}
  970|  15.2k|		}
  971|  6.55k|		nsgif_data++;
  972|  6.55k|		nsgif_bytes = nsgif_end - nsgif_data;
  973|  6.55k|	}
  974|       |
  975|  1.76k|	if (nsgif_data > nsgif_end) {
  ------------------
  |  Branch (975:6): [True: 25, False: 1.74k]
  ------------------
  976|     25|		nsgif_data = nsgif_end;
  977|     25|	}
  978|       |
  979|       |	/* Set buffer position and return */
  980|  1.76k|	*pos = nsgif_data;
  981|  1.76k|	return NSGIF_OK;
  982|  1.92k|}
gif.c:nsgif__parse_extension_graphic_control:
  752|  2.63k|{
  753|  2.63k|	enum {
  754|  2.63k|		GIF_MASK_TRANSPARENCY = 0x01,
  755|  2.63k|		GIF_MASK_DISPOSAL     = 0x1c,
  756|  2.63k|	};
  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|  2.63k|	if (len < 6) {
  ------------------
  |  Branch (770:6): [True: 3, False: 2.63k]
  ------------------
  771|      3|		return NSGIF_ERR_END_OF_DATA;
  772|      3|	}
  773|       |
  774|  2.63k|	frame->info.delay = data[3] | (data[4] << 8);
  775|       |
  776|  2.63k|	if (data[2] & GIF_MASK_TRANSPARENCY) {
  ------------------
  |  Branch (776:6): [True: 1.62k, False: 1.00k]
  ------------------
  777|  1.62k|		frame->info.transparency = true;
  778|  1.62k|		frame->transparency_index = data[5];
  779|  1.62k|	}
  780|       |
  781|  2.63k|	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|  2.63k|	if (frame->info.disposal == NSGIF_DISPOSAL_RESTORE_QUIRK) {
  ------------------
  |  Branch (788:6): [True: 1.35k, False: 1.27k]
  ------------------
  789|  1.35k|		frame->info.disposal = NSGIF_DISPOSAL_RESTORE_PREV;
  790|  1.35k|	}
  791|       |
  792|       |	/* if we are clearing the background then we need to
  793|       |	 * redraw enough to cover the previous frame too. */
  794|  2.63k|	frame->redraw_required =
  795|  2.63k|			frame->info.disposal == NSGIF_DISPOSAL_RESTORE_BG ||
  ------------------
  |  Branch (795:4): [True: 185, False: 2.44k]
  ------------------
  796|  2.63k|			frame->info.disposal == NSGIF_DISPOSAL_RESTORE_PREV;
  ------------------
  |  Branch (796:4): [True: 1.41k, False: 1.03k]
  ------------------
  797|       |
  798|  2.63k|	return NSGIF_OK;
  799|  2.63k|}
gif.c:nsgif__parse_extension_application:
  842|  2.93k|{
  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|  2.93k|	if (len < 17) {
  ------------------
  |  Branch (851:6): [True: 16, False: 2.91k]
  ------------------
  852|     16|		return NSGIF_ERR_END_OF_DATA;
  853|     16|	}
  854|       |
  855|  2.91k|	if (nsgif__app_ext_is_loop_count(data, len)) {
  ------------------
  |  Branch (855:6): [True: 1.22k, False: 1.69k]
  ------------------
  856|  1.22k|		enum {
  857|  1.22k|			EXT_LOOP_COUNT_SUB_BLOCK_SIZE = 0x03,
  858|  1.22k|			EXT_LOOP_COUNT_SUB_BLOCK_ID   = 0x01,
  859|  1.22k|		};
  860|  1.22k|		if ((data[13] == EXT_LOOP_COUNT_SUB_BLOCK_SIZE) &&
  ------------------
  |  Branch (860:7): [True: 887, False: 339]
  ------------------
  861|  1.22k|		    (data[14] == EXT_LOOP_COUNT_SUB_BLOCK_ID)) {
  ------------------
  |  Branch (861:7): [True: 570, False: 317]
  ------------------
  862|    570|			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|    570|			if (gif->info.loop_max > 0) {
  ------------------
  |  Branch (869:8): [True: 504, False: 66]
  ------------------
  870|    504|				gif->info.loop_max++;
  871|    504|			}
  872|    570|		}
  873|  1.22k|	}
  874|       |
  875|  2.91k|	return NSGIF_OK;
  876|  2.93k|}
gif.c:nsgif__app_ext_is_loop_count:
  811|  2.91k|{
  812|  2.91k|	enum {
  813|  2.91k|		EXT_LOOP_COUNT_BLOCK_SIZE = 0x0b,
  814|  2.91k|	};
  815|       |
  816|  2.91k|	assert(len > 13);
  817|  2.91k|	(void)(len);
  818|       |
  819|  2.91k|	if (data[1] == EXT_LOOP_COUNT_BLOCK_SIZE) {
  ------------------
  |  Branch (819:6): [True: 2.69k, False: 229]
  ------------------
  820|  2.69k|		if (strncmp((const char *)data + 2, "NETSCAPE2.0", 11) == 0 ||
  ------------------
  |  Branch (820:7): [True: 471, False: 2.21k]
  ------------------
  821|  2.69k|		    strncmp((const char *)data + 2, "ANIMEXTS1.0", 11) == 0) {
  ------------------
  |  Branch (821:7): [True: 755, False: 1.46k]
  ------------------
  822|  1.22k|			return true;
  823|  1.22k|		}
  824|  2.69k|	}
  825|       |
  826|  1.69k|	return false;
  827|  2.91k|}
gif.c:nsgif__parse_image_descriptor:
 1012|  1.76k|{
 1013|  1.76k|	const uint8_t *data = *pos;
 1014|  1.76k|	size_t len = gif->buf + gif->buf_len - data;
 1015|  1.76k|	enum {
 1016|  1.76k|		NSGIF_IMAGE_DESCRIPTOR_LEN = 10u,
 1017|  1.76k|		NSGIF_IMAGE_SEPARATOR      = 0x2Cu,
 1018|  1.76k|		NSGIF_MASK_INTERLACE       = 0x40u,
 1019|  1.76k|	};
 1020|       |
 1021|  1.76k|	assert(gif != NULL);
 1022|  1.76k|	assert(frame != NULL);
 1023|       |
 1024|  1.76k|	if (len < NSGIF_IMAGE_DESCRIPTOR_LEN) {
  ------------------
  |  Branch (1024:6): [True: 162, False: 1.60k]
  ------------------
 1025|    162|		return NSGIF_ERR_END_OF_DATA;
 1026|    162|	}
 1027|       |
 1028|  1.60k|	if (decode) {
  ------------------
  |  Branch (1028:6): [True: 1.24k, False: 366]
  ------------------
 1029|  1.24k|		uint32_t x, y, w, h;
 1030|       |
 1031|  1.24k|		if (data[0] != NSGIF_IMAGE_SEPARATOR) {
  ------------------
  |  Branch (1031:7): [True: 54, False: 1.18k]
  ------------------
 1032|     54|			return NSGIF_ERR_DATA_FRAME;
 1033|     54|		}
 1034|       |
 1035|  1.18k|		x = data[1] | (data[2] << 8);
 1036|  1.18k|		y = data[3] | (data[4] << 8);
 1037|  1.18k|		w = data[5] | (data[6] << 8);
 1038|  1.18k|		h = data[7] | (data[8] << 8);
 1039|  1.18k|		frame->flags = data[9];
 1040|       |
 1041|  1.18k|		frame->info.rect.x0 = x;
 1042|  1.18k|		frame->info.rect.y0 = y;
 1043|  1.18k|		frame->info.rect.x1 = x + w;
 1044|  1.18k|		frame->info.rect.y1 = y + h;
 1045|       |
 1046|  1.18k|		frame->info.interlaced = frame->flags & NSGIF_MASK_INTERLACE;
 1047|       |
 1048|       |		/* Allow first frame to grow image dimensions. */
 1049|  1.18k|		if (gif->info.frame_count == 0) {
  ------------------
  |  Branch (1049:7): [True: 459, False: 728]
  ------------------
 1050|    459|			if (x + w > gif->info.width) {
  ------------------
  |  Branch (1050:8): [True: 372, False: 87]
  ------------------
 1051|    372|				gif->info.width = x + w;
 1052|    372|			}
 1053|    459|			if (y + h > gif->info.height) {
  ------------------
  |  Branch (1053:8): [True: 366, False: 93]
  ------------------
 1054|    366|				gif->info.height = y + h;
 1055|    366|			}
 1056|    459|		}
 1057|  1.18k|	}
 1058|       |
 1059|  1.55k|	*pos += NSGIF_IMAGE_DESCRIPTOR_LEN;
 1060|  1.55k|	return NSGIF_OK;
 1061|  1.60k|}
gif.c:nsgif__parse_colour_table:
 1145|  1.55k|{
 1146|  1.55k|	nsgif_error ret;
 1147|  1.55k|	const uint8_t *data = *pos;
 1148|  1.55k|	size_t len = gif->buf + gif->buf_len - data;
 1149|  1.55k|	size_t used_bytes;
 1150|       |
 1151|  1.55k|	assert(gif != NULL);
 1152|  1.55k|	assert(frame != NULL);
 1153|       |
 1154|  1.55k|	if ((frame->flags & NSGIF_COLOUR_TABLE_MASK) == 0) {
  ------------------
  |  |  165|  1.55k|#define NSGIF_COLOUR_TABLE_MASK 0x80
  ------------------
  |  Branch (1154:6): [True: 1.35k, False: 201]
  ------------------
 1155|  1.35k|		gif->colour_table = gif->global_colour_table;
 1156|  1.35k|		return NSGIF_OK;
 1157|  1.35k|	}
 1158|       |
 1159|    201|	if (decode == false) {
  ------------------
  |  Branch (1159:6): [True: 166, False: 35]
  ------------------
 1160|    166|		frame->colour_table_offset = *pos - gif->buf;
 1161|    166|	}
 1162|       |
 1163|    201|	ret = nsgif__colour_table_extract(
 1164|    201|			gif->local_colour_table, &gif->colour_layout,
 1165|    201|			2 << (frame->flags & NSGIF_COLOUR_TABLE_SIZE_MASK),
  ------------------
  |  |  166|    201|#define NSGIF_COLOUR_TABLE_SIZE_MASK 0x07
  ------------------
 1166|    201|			data, len, &used_bytes, decode);
 1167|    201|	if (ret != NSGIF_OK) {
  ------------------
  |  Branch (1167:6): [True: 9, False: 192]
  ------------------
 1168|      9|		return ret;
 1169|      9|	}
 1170|    192|	*pos += used_bytes;
 1171|       |
 1172|    192|	if (decode) {
  ------------------
  |  Branch (1172:6): [True: 35, False: 157]
  ------------------
 1173|     35|		gif->colour_table = gif->local_colour_table;
 1174|    157|	} else {
 1175|    157|		frame->info.local_palette = true;
 1176|    157|	}
 1177|       |
 1178|    192|	return NSGIF_OK;
 1179|    201|}
gif.c:nsgif__parse_image_data:
 1197|  1.54k|{
 1198|  1.54k|	const uint8_t *data = *pos;
 1199|  1.54k|	size_t len = gif->buf + gif->buf_len - data;
 1200|  1.54k|	uint32_t frame_idx = frame - gif->frames;
 1201|  1.54k|	uint8_t minimum_code_size;
 1202|  1.54k|	nsgif_error ret;
 1203|       |
 1204|  1.54k|	assert(gif != NULL);
 1205|  1.54k|	assert(frame != NULL);
 1206|       |
 1207|  1.54k|	if (!decode) {
  ------------------
  |  Branch (1207:6): [True: 1.17k, False: 366]
  ------------------
 1208|  1.17k|		gif->frame_count_partial = frame_idx + 1;
 1209|  1.17k|	}
 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|  1.54k|	switch (len) {
 1215|  1.51k|		default: if (data[0] == NSGIF_TRAILER) return NSGIF_OK;
  ------------------
  |  |  168|  1.51k|#define NSGIF_TRAILER 0x3b
  ------------------
  |  Branch (1215:3): [True: 1.51k, False: 30]
  |  Branch (1215:16): [True: 1, False: 1.51k]
  ------------------
 1216|  1.51k|			break;
 1217|  1.51k|		case 2: if (data[1] == NSGIF_TRAILER) return NSGIF_OK;
  ------------------
  |  |  168|      5|#define NSGIF_TRAILER 0x3b
  ------------------
  |  Branch (1217:3): [True: 5, False: 1.53k]
  |  Branch (1217:15): [True: 1, False: 4]
  ------------------
 1218|       |			/* Fall through. */
 1219|     11|		case 1: if (data[0] == NSGIF_TRAILER) return NSGIF_OK;
  ------------------
  |  |  168|     11|#define NSGIF_TRAILER 0x3b
  ------------------
  |  Branch (1219:3): [True: 7, False: 1.53k]
  |  Branch (1219:15): [True: 1, False: 10]
  ------------------
 1220|       |			/* Fall through. */
 1221|     28|		case 0: return NSGIF_ERR_END_OF_DATA;
  ------------------
  |  Branch (1221:3): [True: 18, False: 1.52k]
  ------------------
 1222|  1.54k|	}
 1223|       |
 1224|  1.51k|	minimum_code_size = data[0];
 1225|  1.51k|	if (minimum_code_size >= LZW_CODE_MAX) {
  ------------------
  |  |   21|  1.51k|#define LZW_CODE_MAX 12
  ------------------
  |  Branch (1225:6): [True: 6, False: 1.50k]
  ------------------
 1226|      6|		return NSGIF_ERR_DATA_FRAME;
 1227|      6|	}
 1228|       |
 1229|  1.50k|	if (decode) {
  ------------------
  |  Branch (1229:6): [True: 366, False: 1.14k]
  ------------------
 1230|    366|		ret = nsgif__update_bitmap(gif, frame, data, frame_idx);
 1231|  1.14k|	} else {
 1232|  1.14k|		uint32_t block_size = 0;
 1233|       |
 1234|       |		/* Skip the minimum code size. */
 1235|  1.14k|		data++;
 1236|  1.14k|		len--;
 1237|       |
 1238|  11.8k|		while (block_size != 1) {
  ------------------
  |  Branch (1238:10): [True: 11.0k, False: 849]
  ------------------
 1239|  11.0k|			if (len < 1) {
  ------------------
  |  Branch (1239:8): [True: 66, False: 10.9k]
  ------------------
 1240|     66|				return NSGIF_ERR_END_OF_DATA;
 1241|     66|			}
 1242|  10.9k|			block_size = data[0] + 1;
 1243|       |			/* Check if the frame data runs off the end of the file */
 1244|  10.9k|			if (block_size > len) {
  ------------------
  |  Branch (1244:8): [True: 226, False: 10.7k]
  ------------------
 1245|    226|				frame->lzw_data_length += len;
 1246|    226|				return NSGIF_ERR_END_OF_DATA;
 1247|    226|			}
 1248|       |
 1249|  10.7k|			len -= block_size;
 1250|  10.7k|			data += block_size;
 1251|  10.7k|			frame->lzw_data_length += block_size;
 1252|  10.7k|		}
 1253|       |
 1254|    849|		*pos = data;
 1255|       |
 1256|    849|		gif->info.frame_count = frame_idx + 1;
 1257|    849|		gif->frames[frame_idx].info.display = true;
 1258|       |
 1259|    849|		return NSGIF_OK;
 1260|  1.14k|	}
 1261|       |
 1262|    366|	return ret;
 1263|  1.50k|}
gif.c:nsgif__update_bitmap:
  691|    366|{
  692|    366|	nsgif_error ret;
  693|    366|	uint32_t *bitmap;
  694|       |
  695|    366|	gif->decoded_frame = frame_idx;
  696|       |
  697|    366|	bitmap = nsgif__bitmap_get(gif);
  698|    366|	if (bitmap == NULL) {
  ------------------
  |  Branch (698:6): [True: 0, False: 366]
  ------------------
  699|      0|		return NSGIF_ERR_OOM;
  700|      0|	}
  701|       |
  702|       |	/* Handle any bitmap clearing/restoration required before decoding this
  703|       |	 * frame. */
  704|    366|	if (frame_idx == 0 || gif->decoded_frame == NSGIF_FRAME_INVALID) {
  ------------------
  |  |  156|      0|#define NSGIF_FRAME_INVALID UINT32_MAX
  ------------------
  |  Branch (704:6): [True: 366, False: 0]
  |  Branch (704:24): [True: 0, False: 0]
  ------------------
  705|    366|		nsgif__restore_bg(gif, NULL, bitmap);
  706|       |
  707|    366|	} 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|    366|	if (frame->info.disposal == NSGIF_DISPOSAL_RESTORE_PREV) {
  ------------------
  |  Branch (721:6): [True: 18, False: 348]
  ------------------
  722|       |		/* Store the previous frame for later restoration */
  723|     18|		nsgif__record_frame(gif, bitmap);
  724|     18|	}
  725|       |
  726|    366|	ret = nsgif__decode(gif, frame, data, bitmap);
  727|       |
  728|    366|	nsgif__bitmap_modified(gif);
  729|       |
  730|    366|	if (!frame->decoded) {
  ------------------
  |  Branch (730:6): [True: 366, False: 0]
  ------------------
  731|    366|		frame->opaque = nsgif__bitmap_get_opaque(gif);
  732|    366|		frame->decoded = true;
  733|    366|	}
  734|    366|	nsgif__bitmap_set_opaque(gif, frame);
  735|       |
  736|    366|	return ret;
  737|    366|}
gif.c:nsgif__bitmap_get:
  227|    384|{
  228|    384|	nsgif_error ret;
  229|       |
  230|       |	/* Make sure we have a buffer to decode to. */
  231|    384|	ret = nsgif__initialise_sprite(gif, gif->info.width, gif->info.height);
  232|    384|	if (ret != NSGIF_OK) {
  ------------------
  |  Branch (232:6): [True: 0, False: 384]
  ------------------
  233|      0|		return NULL;
  234|      0|	}
  235|       |
  236|    384|	gif->rowspan = gif->info.width;
  237|    384|	if (gif->bitmap.get_rowspan) {
  ------------------
  |  Branch (237:6): [True: 0, False: 384]
  ------------------
  238|      0|		gif->rowspan = gif->bitmap.get_rowspan(gif->frame_image);
  239|      0|	}
  240|       |
  241|       |	/* Get the frame data */
  242|    384|	assert(gif->bitmap.get_buffer);
  243|    384|	return (void *)gif->bitmap.get_buffer(gif->frame_image);
  244|    384|}
gif.c:nsgif__initialise_sprite:
  204|    384|{
  205|       |	/* Already allocated? */
  206|    384|	if (gif->frame_image) {
  ------------------
  |  Branch (206:6): [True: 18, False: 366]
  ------------------
  207|     18|		return NSGIF_OK;
  208|     18|	}
  209|       |
  210|    366|	assert(gif->bitmap.create);
  211|    366|	gif->frame_image = gif->bitmap.create(width, height);
  212|    366|	if (gif->frame_image == NULL) {
  ------------------
  |  Branch (212:6): [True: 0, False: 366]
  ------------------
  213|      0|		return NSGIF_ERR_OOM;
  214|      0|	}
  215|       |
  216|    366|	return NSGIF_OK;
  217|    366|}
gif.c:nsgif__restore_bg:
  643|    366|{
  644|    366|	size_t pixel_bytes = sizeof(*bitmap);
  645|       |
  646|    366|	if (frame == NULL) {
  ------------------
  |  Branch (646:6): [True: 366, False: 0]
  ------------------
  647|    366|		size_t width  = gif->info.width;
  648|    366|		size_t height = gif->info.height;
  649|       |
  650|    366|		memset(bitmap, NSGIF_TRANSPARENT_COLOUR,
  ------------------
  |  |  159|    366|#define NSGIF_TRANSPARENT_COLOUR 0x00
  ------------------
  651|    366|				width * height * pixel_bytes);
  652|    366|	} 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|    366|}
gif.c:gif__clip:
  409|    561|{
  410|    561|	uint32_t frame_ext = frame_off + frame_dim;
  411|       |
  412|    561|	if (frame_ext <= image_ext) {
  ------------------
  |  Branch (412:6): [True: 561, False: 0]
  ------------------
  413|    561|		return 0;
  414|    561|	}
  415|       |
  416|      0|	return frame_ext - image_ext;
  417|    561|}
gif.c:nsgif__record_frame:
  297|     18|{
  298|     18|	size_t pixel_bytes = sizeof(*bitmap);
  299|     18|	size_t height = gif->info.height;
  300|     18|	size_t width  = gif->info.width;
  301|     18|	uint32_t *prev_frame;
  302|       |
  303|     18|	if (gif->decoded_frame == NSGIF_FRAME_INVALID ||
  ------------------
  |  |  156|     36|#define NSGIF_FRAME_INVALID UINT32_MAX
  ------------------
  |  Branch (303:6): [True: 0, False: 18]
  ------------------
  304|     18|	    gif->decoded_frame == gif->prev_index) {
  ------------------
  |  Branch (304:6): [True: 0, False: 18]
  ------------------
  305|       |		/* No frame to copy, or already have this frame recorded. */
  306|      0|		return;
  307|      0|	}
  308|       |
  309|     18|	bitmap = nsgif__bitmap_get(gif);
  310|     18|	if (bitmap == NULL) {
  ------------------
  |  Branch (310:6): [True: 0, False: 18]
  ------------------
  311|      0|		return;
  312|      0|	}
  313|       |
  314|     18|	if (gif->prev_frame == NULL) {
  ------------------
  |  Branch (314:6): [True: 18, False: 0]
  ------------------
  315|     18|		prev_frame = realloc(gif->prev_frame,
  316|     18|				width * height * pixel_bytes);
  317|     18|		if (prev_frame == NULL) {
  ------------------
  |  Branch (317:7): [True: 0, False: 18]
  ------------------
  318|      0|			return;
  319|      0|		}
  320|     18|	} else {
  321|      0|		prev_frame = gif->prev_frame;
  322|      0|	}
  323|       |
  324|     18|	memcpy(prev_frame, bitmap, width * height * pixel_bytes);
  325|       |
  326|     18|	gif->prev_frame  = prev_frame;
  327|     18|	gif->prev_index  = gif->decoded_frame;
  328|     18|}
gif.c:nsgif__decode:
  602|    366|{
  603|    366|	nsgif_error ret;
  604|    366|	uint32_t width  = frame->info.rect.x1 - frame->info.rect.x0;
  605|    366|	uint32_t height = frame->info.rect.y1 - frame->info.rect.y0;
  606|    366|	uint32_t offset_x = frame->info.rect.x0;
  607|    366|	uint32_t offset_y = frame->info.rect.y0;
  608|    366|	uint32_t transparency_index = frame->transparency_index;
  609|    366|	uint32_t *restrict colour_table = gif->colour_table;
  610|       |
  611|    366|	if (frame->info.interlaced == false && offset_x == 0 &&
  ------------------
  |  Branch (611:6): [True: 325, False: 41]
  |  Branch (611:41): [True: 202, False: 123]
  ------------------
  612|    366|			width == gif->info.width &&
  ------------------
  |  Branch (612:4): [True: 169, False: 33]
  ------------------
  613|    366|			width == gif->rowspan) {
  ------------------
  |  Branch (613:4): [True: 169, False: 0]
  ------------------
  614|    169|		ret = nsgif__decode_simple(gif, height, offset_y,
  615|    169|				data, transparency_index,
  616|    169|				frame_data, colour_table);
  617|    197|	} else {
  618|    197|		ret = nsgif__decode_complex(gif, width, height,
  619|    197|				offset_x, offset_y, frame->info.interlaced,
  620|    197|				data, transparency_index,
  621|    197|				frame_data, colour_table);
  622|    197|	}
  623|       |
  624|    366|	if (gif->data_complete && ret == NSGIF_ERR_END_OF_DATA) {
  ------------------
  |  Branch (624:6): [True: 366, False: 0]
  |  Branch (624:28): [True: 210, False: 156]
  ------------------
  625|       |		/* This is all the data there is, so make do. */
  626|    210|		ret = NSGIF_OK;
  627|    210|	}
  628|       |
  629|    366|	return ret;
  630|    366|}
gif.c:nsgif__decode_simple:
  546|    169|{
  547|    169|	uint32_t pixels;
  548|    169|	uint32_t written = 0;
  549|    169|	nsgif_error ret = NSGIF_OK;
  550|    169|	lzw_result res;
  551|       |
  552|    169|	if (offset_y >= gif->info.height) {
  ------------------
  |  Branch (552:6): [True: 2, False: 167]
  ------------------
  553|      2|		return NSGIF_OK;
  554|      2|	}
  555|       |
  556|    167|	height -= gif__clip(offset_y, height, gif->info.height);
  557|       |
  558|    167|	if (height == 0) {
  ------------------
  |  Branch (558:6): [True: 2, False: 165]
  ------------------
  559|      2|		return NSGIF_OK;
  560|      2|	}
  561|       |
  562|       |	/* Initialise the LZW decoding */
  563|    165|	res = lzw_decode_init_map(gif->lzw_ctx, data[0],
  564|    165|			transparency_index, colour_table,
  565|    165|			gif->buf, gif->buf_len,
  566|    165|			data + 1 - gif->buf);
  567|    165|	if (res != LZW_OK) {
  ------------------
  |  Branch (567:6): [True: 25, False: 140]
  ------------------
  568|     25|		return nsgif__error_from_lzw(res);
  569|     25|	}
  570|       |
  571|    140|	frame_data += (offset_y * gif->info.width);
  572|    140|	pixels = gif->info.width * height;
  573|       |
  574|    148|	while (pixels > 0) {
  ------------------
  |  Branch (574:9): [True: 140, False: 8]
  ------------------
  575|    140|		res = lzw_decode_map(gif->lzw_ctx,
  576|    140|				frame_data, pixels, &written);
  577|    140|		pixels -= written;
  578|    140|		frame_data += written;
  579|    140|		if (res != LZW_OK) {
  ------------------
  |  Branch (579:7): [True: 132, False: 8]
  ------------------
  580|       |			/* Unexpected end of frame, try to recover */
  581|    132|			if (res == LZW_OK_EOD || res == LZW_EOI_CODE) {
  ------------------
  |  Branch (581:8): [True: 17, False: 115]
  |  Branch (581:29): [True: 10, False: 105]
  ------------------
  582|     27|				ret = NSGIF_OK;
  583|    105|			} else {
  584|    105|				ret = nsgif__error_from_lzw(res);
  585|    105|			}
  586|    132|			break;
  587|    132|		}
  588|    140|	}
  589|       |
  590|    140|	if (pixels == 0) {
  ------------------
  |  Branch (590:6): [True: 8, False: 132]
  ------------------
  591|      8|		ret = NSGIF_OK;
  592|      8|	}
  593|       |
  594|    140|	return ret;
  595|    165|}
gif.c:nsgif__decode_complex:
  449|    197|{
  450|    197|	lzw_result res;
  451|    197|	nsgif_error ret = NSGIF_OK;
  452|    197|	uint32_t clip_x = gif__clip(offset_x, width, gif->info.width);
  453|    197|	uint32_t clip_y = gif__clip(offset_y, height, gif->info.height);
  454|    197|	const uint8_t *uncompressed;
  455|    197|	uint32_t available = 0;
  456|    197|	uint8_t step = 24;
  457|    197|	uint32_t skip = 0;
  458|    197|	uint32_t y = 0;
  459|       |
  460|    197|	if (offset_x >= gif->info.width ||
  ------------------
  |  Branch (460:6): [True: 10, False: 187]
  ------------------
  461|    197|	    offset_y >= gif->info.height) {
  ------------------
  |  Branch (461:6): [True: 2, False: 185]
  ------------------
  462|     12|		return NSGIF_OK;
  463|     12|	}
  464|       |
  465|    185|	width -= clip_x;
  466|    185|	height -= clip_y;
  467|       |
  468|    185|	if (width == 0 || height == 0) {
  ------------------
  |  Branch (468:6): [True: 2, False: 183]
  |  Branch (468:20): [True: 2, False: 181]
  ------------------
  469|      4|		return NSGIF_OK;
  470|      4|	}
  471|       |
  472|       |	/* Initialise the LZW decoding */
  473|    181|	res = lzw_decode_init(gif->lzw_ctx, data[0],
  474|    181|			gif->buf, gif->buf_len,
  475|    181|			data + 1 - gif->buf);
  476|    181|	if (res != LZW_OK) {
  ------------------
  |  Branch (476:6): [True: 28, False: 153]
  ------------------
  477|     28|		return nsgif__error_from_lzw(res);
  478|     28|	}
  479|       |
  480|  1.30k|	do {
  481|  1.30k|		uint32_t x;
  482|  1.30k|		uint32_t *frame_scanline;
  483|       |
  484|  1.30k|		frame_scanline = frame_data + offset_x +
  485|  1.30k|				(y + offset_y) * gif->rowspan;
  486|       |
  487|  1.30k|		x = width;
  488|  2.62k|		while (x > 0) {
  ------------------
  |  Branch (488:10): [True: 1.46k, False: 1.16k]
  ------------------
  489|  1.46k|			unsigned row_available;
  490|  1.62k|			while (available == 0) {
  ------------------
  |  Branch (490:11): [True: 310, False: 1.31k]
  ------------------
  491|    310|				if (res != LZW_OK) {
  ------------------
  |  Branch (491:9): [True: 145, False: 165]
  ------------------
  492|       |					/* Unexpected end of frame, try to recover */
  493|    145|					if (res == LZW_OK_EOD ||
  ------------------
  |  Branch (493:10): [True: 19, False: 126]
  ------------------
  494|    145|					    res == LZW_EOI_CODE) {
  ------------------
  |  Branch (494:10): [True: 14, False: 112]
  ------------------
  495|     33|						ret = NSGIF_OK;
  496|    112|					} else {
  497|    112|						ret = nsgif__error_from_lzw(res);
  498|    112|					}
  499|    145|					return ret;
  500|    145|				}
  501|    165|				res = lzw_decode(gif->lzw_ctx,
  502|    165|						&uncompressed, &available);
  503|       |
  504|    165|				if (available == 0) {
  ------------------
  |  Branch (504:9): [True: 0, False: 165]
  ------------------
  505|      0|					return NSGIF_OK;
  506|      0|				}
  507|    165|				gif__jump_data(&skip, &available, &uncompressed);
  508|    165|			}
  509|       |
  510|  1.31k|			row_available = x < available ? x : available;
  ------------------
  |  Branch (510:20): [True: 1.16k, False: 158]
  ------------------
  511|  1.31k|			x -= row_available;
  512|  1.31k|			available -= row_available;
  513|  1.31k|			if (transparency_index > 0xFF) {
  ------------------
  |  Branch (513:8): [True: 585, False: 733]
  ------------------
  514|  26.5k|				while (row_available-- > 0) {
  ------------------
  |  Branch (514:12): [True: 25.9k, False: 585]
  ------------------
  515|  25.9k|					*frame_scanline++ =
  516|  25.9k|						colour_table[*uncompressed++];
  517|  25.9k|				}
  518|    733|			} else {
  519|  50.1k|				while (row_available-- > 0) {
  ------------------
  |  Branch (519:12): [True: 49.4k, False: 733]
  ------------------
  520|  49.4k|					register uint32_t colour;
  521|  49.4k|					colour = *uncompressed++;
  522|  49.4k|					if (colour != transparency_index) {
  ------------------
  |  Branch (522:10): [True: 14.5k, False: 34.8k]
  ------------------
  523|  14.5k|						*frame_scanline =
  524|  14.5k|							colour_table[colour];
  525|  14.5k|					}
  526|  49.4k|					frame_scanline++;
  527|  49.4k|				}
  528|    733|			}
  529|  1.31k|		}
  530|       |
  531|  1.16k|		skip = clip_x;
  532|  1.16k|		gif__jump_data(&skip, &available, &uncompressed);
  533|  1.16k|	} while (nsgif__next_row(interlace, height, &y, &step));
  ------------------
  |  Branch (533:11): [True: 1.15k, False: 8]
  ------------------
  534|       |
  535|      8|	return ret;
  536|    153|}
gif.c:gif__jump_data:
  430|  1.32k|{
  431|  1.32k|	uint32_t jump = (*skip < *available) ? *skip : *available;
  ------------------
  |  Branch (431:18): [True: 1.32k, False: 2]
  ------------------
  432|       |
  433|  1.32k|	*skip -= jump;
  434|  1.32k|	*available -= jump;
  435|  1.32k|	*pos += jump;
  436|  1.32k|}
gif.c:nsgif__next_row:
  388|  1.16k|{
  389|  1.16k|	if (!interlace) {
  ------------------
  |  Branch (389:6): [True: 600, False: 562]
  ------------------
  390|    600|		return (++*y != height);
  391|    600|	} else {
  392|    562|		return nsgif__deinterlace(height, y, step);
  393|    562|	}
  394|  1.16k|}
gif.c:nsgif__deinterlace:
  358|    562|{
  359|    562|	*y += *step & 0xf;
  360|       |
  361|    562|	if (*y < height) return true;
  ------------------
  |  Branch (361:6): [True: 525, False: 37]
  ------------------
  362|       |
  363|     37|	switch (*step) {
  364|     16|	case 24: *y = 4; *step = 8; if (*y < height) return true;
  ------------------
  |  Branch (364:2): [True: 16, False: 21]
  |  Branch (364:34): [True: 14, False: 2]
  ------------------
  365|       |	         /* Fall through. */
  366|     12|	case  8: *y = 2; *step = 4; if (*y < height) return true;
  ------------------
  |  Branch (366:2): [True: 10, False: 27]
  |  Branch (366:34): [True: 11, False: 1]
  ------------------
  367|       |	         /* Fall through. */
  368|     10|	case  4: *y = 1; *step = 2; if (*y < height) return true;
  ------------------
  |  Branch (368:2): [True: 9, False: 28]
  |  Branch (368:34): [True: 9, False: 1]
  ------------------
  369|       |	         /* Fall through. */
  370|      3|	default:
  ------------------
  |  Branch (370:2): [True: 2, False: 35]
  ------------------
  371|      3|		break;
  372|     37|	}
  373|       |
  374|      3|	return false;
  375|     37|}
gif.c:nsgif__bitmap_modified:
  253|    366|{
  254|    366|	if (gif->bitmap.modified) {
  ------------------
  |  Branch (254:6): [True: 0, False: 366]
  ------------------
  255|      0|		gif->bitmap.modified(gif->frame_image);
  256|      0|	}
  257|    366|}
gif.c:nsgif__bitmap_get_opaque:
  285|    366|{
  286|    366|	if (gif->bitmap.test_opaque) {
  ------------------
  |  Branch (286:6): [True: 0, False: 366]
  ------------------
  287|      0|		return gif->bitmap.test_opaque(
  288|      0|				gif->frame_image);
  289|      0|	}
  290|       |
  291|    366|	return false;
  292|    366|}
gif.c:nsgif__bitmap_set_opaque:
  268|    366|{
  269|    366|	if (gif->bitmap.set_opaque) {
  ------------------
  |  Branch (269:6): [True: 0, False: 366]
  ------------------
  270|      0|		gif->bitmap.set_opaque(
  271|      0|				gif->frame_image, frame->opaque);
  272|      0|	}
  273|    366|}
gif.c:nsgif__colour_table_decode:
 1076|    405|{
 1077|    405|	uint8_t *entry = (uint8_t *)colour_table;
 1078|       |
 1079|  6.37k|	while (colour_table_entries--) {
  ------------------
  |  Branch (1079:9): [True: 5.96k, False: 405]
  ------------------
 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|  5.96k|		entry[layout->r] = *data++;
 1087|  5.96k|		entry[layout->g] = *data++;
 1088|  5.96k|		entry[layout->b] = *data++;
 1089|  5.96k|		entry[layout->a] = 0xff;
 1090|       |
 1091|  5.96k|		entry += sizeof(uint32_t);
 1092|  5.96k|	}
 1093|    405|}

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

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|    366|{
  544|    366|	int height = gif->info->height;
  545|       |
  546|    366|	int i;
  547|       |
  548|       |	/* First, check the perfect size.
  549|       |	 */
  550|    366|	if (height % 16 == 0)
  ------------------
  |  Branch (550:6): [True: 82, False: 284]
  ------------------
  551|     82|		return 16;
  552|       |
  553|       |	/* Next, check larger and smaller sizes.
  554|       |	 */
  555|  2.77k|	for (i = 1; i < 16; i++) {
  ------------------
  |  Branch (555:14): [True: 2.77k, False: 0]
  ------------------
  556|  2.77k|		if (height % (16 + i) == 0)
  ------------------
  |  Branch (556:7): [True: 133, False: 2.63k]
  ------------------
  557|    133|			return 16 + i;
  558|  2.63k|		if (height % (16 - i) == 0)
  ------------------
  |  Branch (558:7): [True: 151, False: 2.48k]
  ------------------
  559|    151|			return 16 - i;
  560|  2.63k|	}
  561|       |
  562|      0|	return 1;
  563|    284|}
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|    745|{
  173|    745|	VipsForeignLoadNsgif *gif = (VipsForeignLoadNsgif *) gobject;
  174|       |
  175|    745|	VIPS_DEBUG_MSG("vips_foreign_load_nsgif_dispose:\n");
  ------------------
  |  |   47|    745|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    745|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|    745|	{ \
  |  |   49|    745|		; \
  |  |   50|    745|	} \
  |  |   51|    745|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    745|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  176|       |
  177|    745|	VIPS_FREEF(nsgif_destroy, gif->anim);
  ------------------
  |  |   41|    745|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    745|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|    745|	{ \
  |  |   43|    745|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 745, False: 0]
  |  |  ------------------
  |  |   44|    745|			(void) F((S)); \
  |  |   45|    745|			(S) = 0; \
  |  |   46|    745|		} \
  |  |   47|    745|	} \
  |  |   48|    745|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    745|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  178|    745|	VIPS_UNREF(gif->source);
  ------------------
  |  |   57|    745|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|    745|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|    745|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|    745|	{ \
  |  |  |  |   43|    745|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 745, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|    745|			(void) F((S)); \
  |  |  |  |   45|    745|			(S) = 0; \
  |  |  |  |   46|    745|		} \
  |  |  |  |   47|    745|	} \
  |  |  |  |   48|    745|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|    745|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  179|    745|	VIPS_FREE(gif->delay);
  ------------------
  |  |   50|    745|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|    745|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|    745|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|    745|	{ \
  |  |  |  |   43|    745|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 424, False: 321]
  |  |  |  |  ------------------
  |  |  |  |   44|    424|			(void) F((S)); \
  |  |  |  |   45|    424|			(S) = 0; \
  |  |  |  |   46|    424|		} \
  |  |  |  |   47|    745|	} \
  |  |  |  |   48|    745|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|    745|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  180|       |
  181|    745|	G_OBJECT_CLASS(vips_foreign_load_nsgif_parent_class)->dispose(gobject);
  ------------------
  |  |   58|    745|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|    745|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    745|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  182|    745|}
nsgifload.c:vips_foreign_load_nsgif_get_flags:
  192|    745|{
  193|    745|	return VIPS_FOREIGN_SEQUENTIAL;
  194|    745|}
nsgifload.c:vips_foreign_load_nsgif_header:
  365|    745|{
  366|    745|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(load);
  ------------------
  |  |  441|    745|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|    745|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|    745|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  367|    745|	VipsForeignLoadNsgif *gif = (VipsForeignLoadNsgif *) load;
  368|       |
  369|    745|	const void *data;
  370|    745|	size_t size;
  371|    745|	nsgif_error result;
  372|    745|	int i;
  373|       |
  374|    745|	VIPS_DEBUG_MSG("vips_foreign_load_nsgif_header:\n");
  ------------------
  |  |   47|    745|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    745|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|    745|	{ \
  |  |   49|    745|		; \
  |  |   50|    745|	} \
  |  |   51|    745|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    745|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  375|       |
  376|       |	/* Map the whole source into memory.
  377|       |	 */
  378|    745|	if (!(data = vips_source_map(gif->source, &size)))
  ------------------
  |  Branch (378:6): [True: 0, False: 745]
  ------------------
  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|    745|	result = nsgif_data_scan(gif->anim, size, (void *) data);
  386|    745|	VIPS_DEBUG_MSG("nsgif_data_scan() = %s\n", nsgif_strerror(result));
  ------------------
  |  |   47|    745|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    745|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|    745|	{ \
  |  |   49|    745|		; \
  |  |   50|    745|	} \
  |  |   51|    745|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    745|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  387|    745|	switch (result) {
  388|    577|	case NSGIF_ERR_END_OF_DATA:
  ------------------
  |  Branch (388:2): [True: 577, False: 168]
  ------------------
  389|    577|		if (load->fail_on >= VIPS_FAIL_ON_TRUNCATED) {
  ------------------
  |  Branch (389:7): [True: 0, False: 577]
  ------------------
  390|      0|			vips_foreign_load_nsgif_error(gif, result);
  391|      0|			return -1;
  392|      0|		}
  393|    577|		else
  394|    577|			g_warning("%s", nsgif_strerror(result));
  ------------------
  |  |  338|    577|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|    577|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|    577|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|    577|                               __VA_ARGS__)
  ------------------
  395|    577|		break;
  396|       |
  397|    577|	case NSGIF_OK:
  ------------------
  |  Branch (397:2): [True: 108, False: 637]
  ------------------
  398|    108|		break;
  399|       |
  400|     60|	default:
  ------------------
  |  Branch (400:2): [True: 60, False: 685]
  ------------------
  401|     60|		if (load->fail_on >= VIPS_FAIL_ON_WARNING) {
  ------------------
  |  Branch (401:7): [True: 0, False: 60]
  ------------------
  402|      0|			vips_foreign_load_nsgif_error(gif, result);
  403|      0|			return -1;
  404|      0|		}
  405|     60|		else
  406|     60|			g_warning("%s", nsgif_strerror(result));
  ------------------
  |  |  338|     60|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|     60|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|     60|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|     60|                               __VA_ARGS__)
  ------------------
  407|     60|		break;
  408|    745|	}
  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|    745|	nsgif_data_complete(gif->anim);
  414|       |
  415|    745|	gif->info = nsgif_get_info(gif->anim);
  416|       |#ifdef VERBOSE
  417|       |	print_animation(gif->anim, gif->info);
  418|       |#endif /*VERBOSE*/
  419|    745|	if (!gif->info->frame_count) {
  ------------------
  |  Branch (419:6): [True: 321, False: 424]
  ------------------
  420|    321|		vips_error(class->nickname, "%s", _("no frames in GIF"));
  ------------------
  |  |   30|    321|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|    321|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  421|    321|		return -1;
  422|    321|	}
  423|       |
  424|       |	/* Update our global struct based on the information in the
  425|       |	 * individual frames.
  426|       |	 */
  427|  1.56k|	for (i = 0; i < gif->info->frame_count; i++) {
  ------------------
  |  Branch (427:14): [True: 1.14k, False: 424]
  ------------------
  428|  1.14k|		const nsgif_frame_info_t *frame_info;
  429|       |
  430|  1.14k|		if ((frame_info = nsgif_get_frame_info(gif->anim, i))) {
  ------------------
  |  Branch (430:7): [True: 1.14k, False: 0]
  ------------------
  431|  1.14k|			if (frame_info->transparency)
  ------------------
  |  Branch (431:8): [True: 357, False: 784]
  ------------------
  432|    357|				gif->has_transparency = TRUE;
  ------------------
  |  |  798|    357|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|    357|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  433|  1.14k|			if (frame_info->interlaced)
  ------------------
  |  Branch (433:8): [True: 178, False: 963]
  ------------------
  434|    178|				gif->interlaced = TRUE;
  ------------------
  |  |  798|    178|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|    178|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  435|  1.14k|			if (frame_info->local_palette)
  ------------------
  |  Branch (435:8): [True: 152, False: 989]
  ------------------
  436|    152|				gif->local_palette = TRUE;
  ------------------
  |  |  798|    152|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|    152|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  437|  1.14k|		}
  438|  1.14k|	}
  439|       |
  440|    424|	if (gif->n == -1)
  ------------------
  |  Branch (440:6): [True: 0, False: 424]
  ------------------
  441|      0|		gif->gif_n = gif->info->frame_count - gif->page;
  442|    424|	else
  443|    424|		gif->gif_n = gif->n;
  444|       |
  445|    424|	if (gif->page < 0 ||
  ------------------
  |  Branch (445:6): [True: 0, False: 424]
  ------------------
  446|    424|		gif->gif_n <= 0 ||
  ------------------
  |  Branch (446:3): [True: 0, False: 424]
  ------------------
  447|    424|		gif->page + gif->gif_n > gif->info->frame_count) {
  ------------------
  |  Branch (447:3): [True: 0, False: 424]
  ------------------
  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|    424|	VIPS_FREE(gif->delay);
  ------------------
  |  |   50|    424|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|    424|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|    424|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|    424|	{ \
  |  |  |  |   43|    424|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 0, False: 424]
  |  |  |  |  ------------------
  |  |  |  |   44|      0|			(void) F((S)); \
  |  |  |  |   45|      0|			(S) = 0; \
  |  |  |  |   46|      0|		} \
  |  |  |  |   47|    424|	} \
  |  |  |  |   48|    424|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|    424|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  455|    424|	if (!(gif->delay = VIPS_ARRAY(NULL,
  ------------------
  |  |   72|    424|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|    424|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|    424|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|    424|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|    424|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (455:6): [True: 0, False: 424]
  ------------------
  456|    424|			  gif->info->frame_count, int)))
  457|      0|		return -1;
  458|  1.56k|	for (i = 0; i < gif->info->frame_count; i++) {
  ------------------
  |  Branch (458:14): [True: 1.14k, False: 424]
  ------------------
  459|  1.14k|		const nsgif_frame_info_t *frame_info;
  460|       |
  461|  1.14k|		frame_info = nsgif_get_frame_info(gif->anim, i);
  462|  1.14k|		if (frame_info == NULL) {
  ------------------
  |  Branch (462:7): [True: 0, False: 1.14k]
  ------------------
  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|  1.14k|		gif->delay[i] = 10 * frame_info->delay;
  467|  1.14k|	}
  468|       |
  469|    424|	gif->gif_delay = gif->delay[0] / 10;
  470|       |
  471|    424|	vips_foreign_load_nsgif_set_header(gif, load->out);
  472|       |
  473|    424|	return 0;
  474|    424|}
nsgifload.c:vips_foreign_load_nsgif_error:
  164|     60|{
  165|     60|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(gif);
  ------------------
  |  |  441|     60|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|     60|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|     60|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  166|       |
  167|     60|	vips_error(class->nickname, "%s", nsgif_strerror(result));
  168|     60|}
nsgifload.c:vips_foreign_load_nsgif_set_header:
  260|    790|{
  261|    790|	double array[3];
  262|    790|	const uint8_t *bg;
  263|    790|	size_t entries;
  264|    790|	uint32_t table[NSGIF_MAX_COLOURS];
  265|    790|	int colours;
  266|       |
  267|    790|	VIPS_DEBUG_MSG("vips_foreign_load_nsgif_set_header:\n");
  ------------------
  |  |   47|    790|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    790|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|    790|	{ \
  |  |   49|    790|		; \
  |  |   50|    790|	} \
  |  |   51|    790|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    790|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  268|       |
  269|    790|	vips_image_init_fields(image,
  270|    790|		gif->info->width, gif->info->height * gif->gif_n,
  271|    790|		gif->has_transparency ? 4 : 3,
  ------------------
  |  Branch (271:3): [True: 607, False: 183]
  ------------------
  272|    790|		VIPS_FORMAT_UCHAR, VIPS_CODING_NONE,
  273|    790|		VIPS_INTERPRETATION_sRGB, 1.0, 1.0);
  274|    790|	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|    790|	if (gif->gif_n > 1)
  ------------------
  |  Branch (279:6): [True: 0, False: 790]
  ------------------
  280|      0|		vips_image_set_int(image, VIPS_META_PAGE_HEIGHT, gif->info->height);
  ------------------
  |  |  158|      0|#define VIPS_META_PAGE_HEIGHT "page-height"
  ------------------
  281|    790|	vips_image_set_int(image, VIPS_META_N_PAGES,
  ------------------
  |  |  165|    790|#define VIPS_META_N_PAGES "n-pages"
  ------------------
  282|    790|		gif->info->frame_count);
  283|    790|	vips_image_set_int(image, "loop", gif->info->loop_max);
  284|       |
  285|    790|	vips_image_set_array_int(image, "delay",
  286|    790|		gif->delay, gif->info->frame_count);
  287|       |
  288|    790|	bg = (uint8_t *) &gif->info->background;
  289|    790|	array[0] = bg[0];
  290|    790|	array[1] = bg[1];
  291|    790|	array[2] = bg[2];
  292|       |
  293|    790|	vips_image_set_array_double(image, "background", array, 3);
  294|       |
  295|    790|	VIPS_SETSTR(image->filename,
  ------------------
  |  |   53|    790|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    790|#define G_STMT_START  do
  |  |  ------------------
  |  |   54|    790|	{ \
  |  |   55|    790|		const char *sst = (V); \
  |  |   56|    790|		\
  |  |   57|    790|		if ((S) != sst) { \
  |  |  ------------------
  |  |  |  Branch (57:7): [True: 790, False: 0]
  |  |  ------------------
  |  |   58|    790|			if (!(S) || !sst || strcmp((S), sst) != 0) { \
  |  |  ------------------
  |  |  |  Branch (58:8): [True: 0, False: 790]
  |  |  |  Branch (58:16): [True: 790, False: 0]
  |  |  |  Branch (58:24): [True: 0, False: 0]
  |  |  ------------------
  |  |   59|    790|				VIPS_FREE(S); \
  |  |  ------------------
  |  |  |  |   50|    790|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  |  |  ------------------
  |  |  |  |  |  |   41|    790|	G_STMT_START \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  854|    790|#define G_STMT_START  do
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   42|    790|	{ \
  |  |  |  |  |  |   43|    790|		if (S) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (43:7): [True: 790, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   44|    790|			(void) F((S)); \
  |  |  |  |  |  |   45|    790|			(S) = 0; \
  |  |  |  |  |  |   46|    790|		} \
  |  |  |  |  |  |   47|    790|	} \
  |  |  |  |  |  |   48|    790|	G_STMT_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  862|    790|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   60|    790|				if (sst) \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 0, False: 790]
  |  |  ------------------
  |  |   61|    790|					(S) = g_strdup(sst); \
  |  |   62|    790|			} \
  |  |   63|    790|		} \
  |  |   64|    790|	} \
  |  |   65|    790|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    790|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  296|    790|		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|    790|	vips_image_set_int(image, "gif-loop",
  304|    790|		gif->info->loop_max == 0
  ------------------
  |  Branch (304:3): [True: 12, False: 778]
  ------------------
  305|    790|			? 0
  306|    790|			: gif->info->loop_max - 1);
  307|       |
  308|       |	/* The deprecated gif-delay field is in centiseconds.
  309|       |	 */
  310|    790|	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|    790|	if (!gif->local_palette) {
  ------------------
  |  Branch (315:6): [True: 687, False: 103]
  ------------------
  316|    687|		nsgif_global_palette(gif->anim, table, &entries);
  317|    687|		vips_image_set_array_int(image, "gif-palette",
  318|    687|			(const int *) table, entries);
  319|       |
  320|    687|		colours = entries;
  321|    687|	}
  322|    103|	else {
  323|    103|		int i;
  324|       |
  325|    103|		colours = 0;
  326|       |
  327|    103|		if (gif->info->global_palette) {
  ------------------
  |  Branch (327:7): [True: 32, False: 71]
  ------------------
  328|     32|			nsgif_global_palette(gif->anim, table, &entries);
  329|     32|			colours = entries;
  330|     32|		}
  331|       |
  332|    909|		for (i = 0; i < gif->info->frame_count; i++) {
  ------------------
  |  Branch (332:15): [True: 806, False: 103]
  ------------------
  333|    806|			if (nsgif_local_palette(gif->anim, i, table,
  ------------------
  |  Branch (333:8): [True: 190, False: 616]
  ------------------
  334|    806|					&entries))
  335|    190|				colours = VIPS_MAX(colours, entries);
  ------------------
  |  |   54|    190|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 39, False: 151]
  |  |  ------------------
  ------------------
  336|    806|		}
  337|    103|	}
  338|       |
  339|    790|	vips_image_set_int(image, VIPS_META_BITS_PER_SAMPLE,
  ------------------
  |  |  100|    790|#define VIPS_META_BITS_PER_SAMPLE "bits-per-sample"
  ------------------
  340|    790|		ceil(log2(colours)));
  341|       |
  342|       |	/* Deprecated "palette-bit-depth" use "bits-per-sample" instead.
  343|       |	 */
  344|    790|	vips_image_set_int(image, "palette-bit-depth",
  345|    790|		ceil(log2(colours)));
  346|       |
  347|    790|	vips_image_set_int(image, VIPS_META_PALETTE, 1);
  ------------------
  |  |  107|    790|#define VIPS_META_PALETTE "palette"
  ------------------
  348|       |
  349|       |	/* Let our caller know if the GIF is interlaced.
  350|       |	 */
  351|    790|	if (gif->interlaced)
  ------------------
  |  Branch (351:6): [True: 108, False: 682]
  ------------------
  352|    108|		vips_image_set_int(image, "interlaced", 1);
  353|       |
  354|    790|	return 0;
  355|    790|}
nsgifload.c:vips_foreign_load_nsgif_load:
  567|    366|{
  568|    366|	VipsForeignLoadNsgif *gif = (VipsForeignLoadNsgif *) load;
  569|    366|	VipsImage **t = (VipsImage **)
  570|    366|		vips_object_local_array(VIPS_OBJECT(load), 2);
  ------------------
  |  |  433|    366|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|    366|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    366|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  571|       |
  572|    366|	VIPS_DEBUG_MSG("vips_foreign_load_nsgif_load:\n");
  ------------------
  |  |   47|    366|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    366|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|    366|	{ \
  |  |   49|    366|		; \
  |  |   50|    366|	} \
  |  |   51|    366|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    366|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  573|       |
  574|       |	/* Make the output pipeline.
  575|       |	 */
  576|    366|	t[0] = vips_image_new();
  577|    366|	if (vips_foreign_load_nsgif_set_header(gif, t[0]))
  ------------------
  |  Branch (577:6): [True: 0, False: 366]
  ------------------
  578|      0|		return -1;
  579|       |
  580|       |	/* Strips 8 pixels high to avoid too many tiny regions.
  581|       |	 */
  582|    366|	if (vips_image_generate(t[0],
  ------------------
  |  Branch (582:6): [True: 0, False: 366]
  ------------------
  583|    366|			NULL, vips_foreign_load_nsgif_generate, NULL, gif, NULL) ||
  584|    366|		vips_sequential(t[0], &t[1],
  ------------------
  |  Branch (584:3): [True: 0, False: 366]
  ------------------
  585|    366|			"tile_height",
  586|    366|			vips_foreign_load_nsgif_tile_height(gif),
  587|    366|			NULL) ||
  588|    366|		vips_image_write(t[1], load->real))
  ------------------
  |  Branch (588:3): [True: 60, False: 306]
  ------------------
  589|     60|		return -1;
  590|       |
  591|    306|	return 0;
  592|    366|}
nsgifload.c:vips_foreign_load_nsgif_generate:
  479|  4.67k|{
  480|  4.67k|	VipsRect *r = &out_region->valid;
  481|  4.67k|	VipsForeignLoadNsgif *gif = (VipsForeignLoadNsgif *) a;
  482|       |
  483|  4.67k|	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|  21.9k|	for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (491:14): [True: 17.3k, False: 4.61k]
  ------------------
  492|       |		/* The page for this output line, and the line number in page.
  493|       |		 */
  494|  17.3k|		int page = (r->top + y) / gif->info->height + gif->page;
  495|  17.3k|		int line = (r->top + y) % gif->info->height;
  496|       |
  497|  17.3k|		nsgif_error result;
  498|  17.3k|		VipsPel *p, *q;
  499|       |
  500|  17.3k|		g_assert(line >= 0 && line < gif->info->height);
  ------------------
  |  |  166|  17.3k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  17.3k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  17.3k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  501|  17.3k|		g_assert(page >= 0 && page < gif->info->frame_count);
  ------------------
  |  |  166|  17.3k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  17.3k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  17.3k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  502|       |
  503|  17.3k|		if (gif->frame_number != page) {
  ------------------
  |  Branch (503:7): [True: 366, False: 16.9k]
  ------------------
  504|    366|			result = nsgif_frame_decode(gif->anim,
  505|    366|				page, &gif->bitmap);
  506|    366|			VIPS_DEBUG_MSG("  nsgif_frame_decode(%d) = %d\n",
  ------------------
  |  |   47|    366|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    366|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|    366|	{ \
  |  |   49|    366|		; \
  |  |   50|    366|	} \
  |  |   51|    366|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    366|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  507|    366|				page, result);
  508|    366|			if (result != NSGIF_OK) {
  ------------------
  |  Branch (508:8): [True: 60, False: 306]
  ------------------
  509|     60|				vips_foreign_load_nsgif_error(gif, result);
  510|     60|				return -1;
  511|     60|			}
  512|       |
  513|       |#ifdef VERBOSE
  514|       |			print_frame(nsgif_get_frame_info(gif->anim, page));
  515|       |#endif /*VERBOSE*/
  516|       |
  517|    306|			gif->frame_number = page;
  518|    306|		}
  519|       |
  520|  17.2k|		p = (VipsPel *) gif->bitmap + line * gif->info->width * sizeof(int);
  521|  17.2k|		q = VIPS_REGION_ADDR(out_region, 0, r->top + y);
  ------------------
  |  |  227|  17.2k|	((R)->data + \
  |  |  228|  17.2k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  17.2k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  17.2k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  17.2k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  17.2k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  17.2k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  522|  17.2k|		if (gif->has_transparency)
  ------------------
  |  Branch (522:7): [True: 13.2k, False: 4.02k]
  ------------------
  523|  13.2k|			memcpy(q, p, VIPS_REGION_SIZEOF_LINE(out_region));
  ------------------
  |  |  203|  13.2k|	((size_t) ((R)->valid.width * VIPS_REGION_SIZEOF_PEL(R)))
  |  |  ------------------
  |  |  |  |  201|  13.2k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  13.2k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  13.2k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  524|  4.02k|		else {
  525|  4.02k|			int i;
  526|       |
  527|   275k|			for (i = 0; i < r->width; i++) {
  ------------------
  |  Branch (527:16): [True: 271k, False: 4.02k]
  ------------------
  528|   271k|				q[0] = p[0];
  529|   271k|				q[1] = p[1];
  530|   271k|				q[2] = p[2];
  531|       |
  532|   271k|				q += 3;
  533|   271k|				p += 4;
  534|   271k|			}
  535|  4.02k|		}
  536|  17.2k|	}
  537|       |
  538|  4.61k|	return 0;
  539|  4.67k|}
nsgifload.c:vips_foreign_load_nsgif_init:
  674|    745|{
  675|    745|	nsgif_error result = nsgif_create(
  676|    745|		&vips_foreign_load_nsgif_bitmap_callbacks,
  677|    745|		NSGIF_BITMAP_FMT_R8G8B8A8,
  678|    745|		&gif->anim);
  679|    745|	if (result != NSGIF_OK) {
  ------------------
  |  Branch (679:6): [True: 0, False: 745]
  ------------------
  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|    745|	gif->n = 1;
  688|    745|	gif->gif_n = 1;
  689|    745|	gif->frame_number = -1;
  690|    745|	gif->bitmap = NULL;
  691|    745|}
nsgifload.c:vips_foreign_load_nsgif_bitmap_create:
  636|    366|{
  637|       |	/* GIF has a limit of 64k per axis -- double-check this.
  638|       |	 */
  639|    366|	if (width <= 0 ||
  ------------------
  |  Branch (639:6): [True: 0, False: 366]
  ------------------
  640|    366|		width > 65536 ||
  ------------------
  |  Branch (640:3): [True: 0, False: 366]
  ------------------
  641|    366|		height <= 0 ||
  ------------------
  |  Branch (641:3): [True: 0, False: 366]
  ------------------
  642|    366|		height > 65536) {
  ------------------
  |  Branch (642:3): [True: 0, False: 366]
  ------------------
  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|    366|	return g_malloc0((gsize) width * height * 4);
  649|    366|}
nsgifload.c:vips_foreign_load_nsgif_bitmap_destroy:
  661|    366|{
  662|    366|	g_assert(bitmap);
  ------------------
  |  |  166|    366|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|    366|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    366|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  663|    366|	g_free(bitmap);
  664|    366|}
nsgifload.c:vips_foreign_load_nsgif_bitmap_get_buffer:
  653|    384|{
  654|    384|	g_assert(bitmap);
  ------------------
  |  |  166|    384|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|    384|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    384|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  655|       |
  656|    384|	return bitmap;
  657|    384|}
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|  28.3k|{
  199|  28.3k|	const unsigned char *data;
  200|       |
  201|  28.3k|	if ((data = vips_source_sniff(source, 4)) &&
  ------------------
  |  Branch (201:6): [True: 28.3k, False: 43]
  ------------------
  202|  28.3k|		data[0] == 'G' &&
  ------------------
  |  Branch (202:3): [True: 770, False: 27.5k]
  ------------------
  203|  28.3k|		data[1] == 'I' &&
  ------------------
  |  Branch (203:3): [True: 763, False: 7]
  ------------------
  204|  28.3k|		data[2] == 'F' &&
  ------------------
  |  Branch (204:3): [True: 755, False: 8]
  ------------------
  205|  28.3k|		data[3] == '8')
  ------------------
  |  Branch (205:3): [True: 745, False: 10]
  ------------------
  206|    745|		return TRUE;
  ------------------
  |  |  798|    745|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|    745|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  207|       |
  208|  27.6k|	return FALSE;
  ------------------
  |  |  794|  27.6k|#define	FALSE	(0)
  ------------------
  209|  28.3k|}
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|    745|{
  794|    745|	VipsForeignLoadNsgif *gif = (VipsForeignLoadNsgif *) object;
  795|    745|	VipsForeignLoadNsgifBuffer *buffer =
  796|    745|		(VipsForeignLoadNsgifBuffer *) object;
  797|       |
  798|    745|	if (buffer->blob &&
  ------------------
  |  Branch (798:6): [True: 745, False: 0]
  ------------------
  799|    745|		!(gif->source = vips_source_new_from_memory(
  ------------------
  |  Branch (799:3): [True: 0, False: 745]
  ------------------
  800|    745|			  buffer->blob->data,
  801|    745|			  buffer->blob->length)))
  802|      0|		return -1;
  803|       |
  804|    745|	if (VIPS_OBJECT_CLASS(vips_foreign_load_nsgif_buffer_parent_class)
  ------------------
  |  |  435|    745|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|    745|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    745|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (804:6): [True: 321, False: 424]
  ------------------
  805|    745|			->build(object))
  806|    321|		return -1;
  807|       |
  808|    424|	return 0;
  809|    745|}
nsgifload.c:vips_foreign_load_nsgif_buffer_is_a_buffer:
  813|  28.3k|{
  814|  28.3k|	VipsSource *source;
  815|  28.3k|	gboolean result;
  816|       |
  817|  28.3k|	if (!(source = vips_source_new_from_memory(buf, len)))
  ------------------
  |  Branch (817:6): [True: 0, False: 28.3k]
  ------------------
  818|      0|		return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  819|  28.3k|	result = vips_foreign_load_nsgif_is_a_source(source);
  820|  28.3k|	VIPS_UNREF(source);
  ------------------
  |  |   57|  28.3k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  28.3k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  28.3k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  28.3k|	{ \
  |  |  |  |   43|  28.3k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 28.3k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  28.3k|			(void) F((S)); \
  |  |  |  |   45|  28.3k|			(S) = 0; \
  |  |  |  |   46|  28.3k|		} \
  |  |  |  |   47|  28.3k|	} \
  |  |  |  |   48|  28.3k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  28.3k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  821|       |
  822|  28.3k|	return result;
  823|  28.3k|}
nsgifload.c:vips_foreign_load_nsgif_buffer_init:
  852|    745|{
  853|    745|}
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|  12.6k|{
   57|  12.6k|	const char *str = (const char *) buf;
   58|       |
   59|  12.6k|	if (len < 4)
  ------------------
  |  Branch (59:6): [True: 39, False: 12.6k]
  ------------------
   60|     39|		return FALSE;
  ------------------
  |  |  794|     39|#define	FALSE	(0)
  ------------------
   61|       |
   62|  33.0M|	for (size_t i = 0; i < len - 4; i++)
  ------------------
  |  Branch (62:21): [True: 33.0M, False: 12.5k]
  ------------------
   63|  33.0M|		if (vips_isprefix("%PDF", str + i))
  ------------------
  |  Branch (63:7): [True: 67, False: 33.0M]
  ------------------
   64|     67|			return TRUE;
  ------------------
  |  |  798|  12.6k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|     67|#define	FALSE	(0)
  |  |  ------------------
  ------------------
   65|       |
   66|  12.5k|	return FALSE;
  ------------------
  |  |  794|  12.5k|#define	FALSE	(0)
  ------------------
   67|  12.6k|}

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|     67|{
  215|     67|	VipsForeignLoadPdf *pdf = (VipsForeignLoadPdf *) gobject;
  216|       |
  217|     67|	vips_foreign_load_pdf_close(pdf);
  218|       |
  219|     67|	G_OBJECT_CLASS(vips_foreign_load_pdf_parent_class)->dispose(gobject);
  ------------------
  |  |   58|     67|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|     67|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|     67|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  220|     67|}
pdfiumload.c:vips_foreign_load_pdf_close:
  201|     67|{
  202|     67|	g_mutex_lock(&vips_pdfium_mutex);
  203|       |
  204|     67|	VIPS_FREEF(FPDF_ClosePage, pdf->page);
  ------------------
  |  |   41|     67|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|     67|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|     67|	{ \
  |  |   43|     67|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 20, False: 47]
  |  |  ------------------
  |  |   44|     20|			(void) F((S)); \
  |  |   45|     20|			(S) = 0; \
  |  |   46|     20|		} \
  |  |   47|     67|	} \
  |  |   48|     67|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|     67|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  205|     67|	VIPS_FREEF(FPDFDOC_ExitFormFillEnvironment, pdf->form);
  ------------------
  |  |   41|     67|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|     67|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|     67|	{ \
  |  |   43|     67|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 22, False: 45]
  |  |  ------------------
  |  |   44|     22|			(void) F((S)); \
  |  |   45|     22|			(S) = 0; \
  |  |   46|     22|		} \
  |  |   47|     67|	} \
  |  |   48|     67|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|     67|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  206|     67|	VIPS_FREEF(FPDF_CloseDocument, pdf->doc);
  ------------------
  |  |   41|     67|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|     67|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|     67|	{ \
  |  |   43|     67|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 22, False: 45]
  |  |  ------------------
  |  |   44|     22|			(void) F((S)); \
  |  |   45|     22|			(S) = 0; \
  |  |   46|     22|		} \
  |  |   47|     67|	} \
  |  |   48|     67|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|     67|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  207|     67|	VIPS_UNREF(pdf->source);
  ------------------
  |  |   57|     67|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|     67|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|     67|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|     67|	{ \
  |  |  |  |   43|     67|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 67, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|     67|			(void) F((S)); \
  |  |  |  |   45|     67|			(S) = 0; \
  |  |  |  |   46|     67|		} \
  |  |  |  |   47|     67|	} \
  |  |  |  |   48|     67|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|     67|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  208|       |
  209|     67|	g_mutex_unlock(&vips_pdfium_mutex);
  210|     67|}
pdfiumload.c:vips_foreign_load_pdf_build:
  269|     67|{
  270|     67|	static GOnce once = G_ONCE_INIT;
  ------------------
  |  |  102|     67|#define G_ONCE_INIT { G_ONCE_STATUS_NOTCALLED, NULL }
  ------------------
  271|       |
  272|     67|	VipsForeignLoadPdf *pdf = (VipsForeignLoadPdf *) object;
  273|     67|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(pdf);
  ------------------
  |  |  441|     67|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|     67|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|     67|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  274|       |
  275|     67|	gint64 length;
  276|       |
  277|     67|	VIPS_ONCE(&once, vips_pdfium_init_cb, NULL);
  ------------------
  |  |   93|     67|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|     67|#define G_STMT_START  do
  |  |  ------------------
  |  |   94|     67|	{ \
  |  |   95|     67|		if (G_UNLIKELY((ONCE)->status != G_ONCE_STATUS_READY)) \
  |  |  ------------------
  |  |  |  |  935|     67|#define G_UNLIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 0))
  |  |  |  |  ------------------
  |  |  |  |  |  |  926|     67| G_GNUC_EXTENSION ({                            \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|     67|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  927|     67|   int _g_boolean_var_;                         \
  |  |  |  |  |  |  928|     67|   if (expr)                                    \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (928:8): [True: 1, False: 66]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  929|     67|      _g_boolean_var_ = 1;                      \
  |  |  |  |  |  |  930|     67|   else                                         \
  |  |  |  |  |  |  931|     67|      _g_boolean_var_ = 0;                      \
  |  |  |  |  |  |  932|     67|   _g_boolean_var_;                             \
  |  |  |  |  |  |  933|     67|})
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (935:26): [True: 1, False: 66]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   96|     67|			(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|     67|	} \
  |  |   98|     67|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|     67|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  278|       |
  279|     67|	if (!vips_object_argument_isset(object, "scale"))
  ------------------
  |  Branch (279:6): [True: 67, False: 0]
  ------------------
  280|     67|		pdf->scale = pdf->dpi / 72.0; // FIXME: Invalidates operation cache
  281|       |
  282|     67|	pdf->form_callbacks.version = 2;
  283|       |
  284|       |	/* pdfium must know the file length, unfortunately.
  285|       |	 */
  286|     67|	if (pdf->source) {
  ------------------
  |  Branch (286:6): [True: 67, False: 0]
  ------------------
  287|     67|		if ((length = vips_source_length(pdf->source)) <= 0)
  ------------------
  |  Branch (287:7): [True: 0, False: 67]
  ------------------
  288|      0|			return -1;
  289|     67|		if (length > 1 << 30) {
  ------------------
  |  Branch (289:7): [True: 0, False: 67]
  ------------------
  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|     67|		pdf->file_access.m_FileLen = length;
  297|     67|		pdf->file_access.m_GetBlock = vips_pdfium_GetBlock;
  298|     67|		pdf->file_access.m_Param = pdf;
  299|       |
  300|     67|		g_mutex_lock(&vips_pdfium_mutex);
  301|       |
  302|     67|		if (!(pdf->doc = FPDF_LoadCustomDocument(&pdf->file_access,
  ------------------
  |  Branch (302:7): [True: 45, False: 22]
  ------------------
  303|     67|				  pdf->password))) {
  304|     45|			g_mutex_unlock(&vips_pdfium_mutex);
  305|     45|			vips_pdfium_error();
  306|     45|			vips_error("pdfload",
  307|     45|				_("%s: unable to load"),
  ------------------
  |  |   30|     45|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|     45|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  308|     45|				vips_connection_nick(
  309|     45|					VIPS_CONNECTION(pdf->source)));
  ------------------
  |  |   48|     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)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   49|     45|		VIPS_TYPE_CONNECTION, VipsConnection))
  ------------------
  310|     45|			return -1;
  311|     45|		}
  312|       |
  313|     22|		if (!(pdf->form = FPDFDOC_InitFormFillEnvironment(pdf->doc,
  ------------------
  |  Branch (313:7): [True: 0, False: 22]
  ------------------
  314|     22|				  &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|     22|		g_mutex_unlock(&vips_pdfium_mutex);
  325|     22|	}
  326|       |
  327|     22|	if (VIPS_OBJECT_CLASS(vips_foreign_load_pdf_parent_class)->build(object))
  ------------------
  |  |  435|     22|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|     22|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|     22|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (327:6): [True: 5, False: 17]
  ------------------
  328|      5|		return -1;
  329|       |
  330|     17|	return 0;
  331|     22|}
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|  4.93k|{
  243|  4.93k|	VipsForeignLoadPdf *pdf = (VipsForeignLoadPdf *) param;
  244|       |
  245|       |	/* PDFium guarantees these.
  246|       |	 */
  247|  4.93k|	g_assert(size > 0);
  ------------------
  |  |  166|  4.93k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  4.93k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  4.93k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  248|  4.93k|	g_assert(position >= 0);
  ------------------
  |  |  166|  4.93k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  4.93k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  4.93k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  249|  4.93k|	g_assert(position + size <= pdf->file_access.m_FileLen);
  ------------------
  |  |  166|  4.93k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  4.93k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  4.93k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  250|       |
  251|  4.93k|	if (vips_source_seek(pdf->source, position, SEEK_SET) < 0)
  ------------------
  |  Branch (251:6): [True: 0, False: 4.93k]
  ------------------
  252|      0|		return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  253|       |
  254|  9.87k|	while (size > 0) {
  ------------------
  |  Branch (254:9): [True: 4.93k, False: 4.93k]
  ------------------
  255|  4.93k|		gint64 bytes_read;
  256|       |
  257|  4.93k|		if ((bytes_read =
  ------------------
  |  Branch (257:7): [True: 0, False: 4.93k]
  ------------------
  258|  4.93k|					vips_source_read(pdf->source, pBuf, size)) < 0)
  259|      0|			return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  260|  4.93k|		pBuf += bytes_read;
  261|  4.93k|		size -= bytes_read;
  262|  4.93k|	}
  263|       |
  264|  4.93k|	return TRUE;
  ------------------
  |  |  798|  4.93k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  4.93k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  265|  4.93k|}
pdfiumload.c:vips_pdfium_error:
  189|     46|{
  190|     46|	int err = FPDF_GetLastError();
  191|       |
  192|     46|	if (err >= 0 &&
  ------------------
  |  Branch (192:6): [True: 46, False: 0]
  ------------------
  193|     46|		err < VIPS_NUMBER(vips_pdfium_errors))
  ------------------
  |  |   60|     46|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (193:3): [True: 46, False: 0]
  ------------------
  194|     46|		vips_error("pdfload", "%s", _(vips_pdfium_errors[err]));
  ------------------
  |  |   30|     46|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|     46|#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|     46|}
pdfiumload.c:vips_foreign_load_pdf_get_flags:
  343|     22|{
  344|     22|	return VIPS_FOREIGN_PARTIAL;
  345|     22|}
pdfiumload.c:vips_foreign_load_pdf_header:
  455|     22|{
  456|     22|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(load);
  ------------------
  |  |  441|     22|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|     22|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|     22|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  457|     22|	VipsForeignLoadPdf *pdf = (VipsForeignLoadPdf *) load;
  458|       |
  459|     22|	int top;
  460|     22|	int i;
  461|       |
  462|       |#ifdef DEBUG
  463|       |	printf("vips_foreign_load_pdf_header: %p\n", pdf);
  464|       |#endif /*DEBUG*/
  465|       |
  466|     22|	g_mutex_lock(&vips_pdfium_mutex);
  467|     22|	pdf->n_pages = FPDF_GetPageCount(pdf->doc);
  468|     22|	g_mutex_unlock(&vips_pdfium_mutex);
  469|       |
  470|       |	/* @n == -1 means until the end of the doc.
  471|       |	 */
  472|     22|	if (pdf->n == -1)
  ------------------
  |  Branch (472:6): [True: 0, False: 22]
  ------------------
  473|      0|		pdf->n = pdf->n_pages - pdf->page_no; // FIXME: Invalidates operation cache
  474|       |
  475|     22|	if (pdf->page_no + pdf->n > pdf->n_pages ||
  ------------------
  |  Branch (475:6): [True: 1, False: 21]
  ------------------
  476|     22|		pdf->page_no < 0 ||
  ------------------
  |  Branch (476:3): [True: 0, False: 21]
  ------------------
  477|     22|		pdf->n <= 0) {
  ------------------
  |  Branch (477:3): [True: 0, False: 21]
  ------------------
  478|      1|		vips_error(class->nickname, "%s", _("pages out of range"));
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  479|      1|		return -1;
  480|      1|	}
  481|       |
  482|       |	/* Lay out the pages in our output image.
  483|       |	 */
  484|     21|	if (!(pdf->pages = VIPS_ARRAY(pdf, pdf->n, VipsRect)))
  ------------------
  |  |   72|     21|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|     21|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|     21|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|     21|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|     21|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (484:6): [True: 0, False: 21]
  ------------------
  485|      0|		return -1;
  486|       |
  487|     21|	top = 0;
  488|     21|	pdf->image.left = 0;
  489|     21|	pdf->image.top = 0;
  490|     21|	pdf->image.width = 0;
  491|     21|	pdf->image.height = 0;
  492|     38|	for (i = 0; i < pdf->n; i++) {
  ------------------
  |  Branch (492:14): [True: 21, False: 17]
  ------------------
  493|     21|		if (vips_foreign_load_pdf_get_page(pdf, pdf->page_no + i))
  ------------------
  |  Branch (493:7): [True: 1, False: 20]
  ------------------
  494|      1|			return -1;
  495|     20|		pdf->pages[i].left = 0;
  496|     20|		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|     20|		pdf->pages[i].width = VIPS_RINT(
  ------------------
  |  |   74|     20|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  502|     20|			FPDF_GetPageWidth(pdf->page) * pdf->scale);
  503|     20|		pdf->pages[i].height = VIPS_RINT(
  ------------------
  |  |   74|     20|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  504|     20|			FPDF_GetPageHeight(pdf->page) * pdf->scale);
  505|       |
  506|       |		/* PDFium allows page width or height to be less than 1 (!!).
  507|       |		 */
  508|     20|		if (pdf->pages[i].width < 1 ||
  ------------------
  |  Branch (508:7): [True: 1, False: 19]
  ------------------
  509|     20|			pdf->pages[i].height < 1 ||
  ------------------
  |  Branch (509:4): [True: 1, False: 18]
  ------------------
  510|     20|			pdf->pages[i].width > VIPS_MAX_COORD ||
  ------------------
  |  |   69|     38|#define VIPS_MAX_COORD (vips_max_coord_get())
  ------------------
  |  Branch (510:4): [True: 0, False: 18]
  ------------------
  511|     20|			pdf->pages[i].height > VIPS_MAX_COORD) {
  ------------------
  |  |   69|     18|#define VIPS_MAX_COORD (vips_max_coord_get())
  ------------------
  |  Branch (511:4): [True: 1, False: 17]
  ------------------
  512|      3|			vips_error(class->nickname,
  513|      3|				"%s", _("page size out of range"));
  ------------------
  |  |   30|      3|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      3|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  514|      3|			return -1;
  515|      3|		}
  516|       |
  517|     17|		if (pdf->pages[i].width > pdf->image.width)
  ------------------
  |  Branch (517:7): [True: 17, False: 0]
  ------------------
  518|     17|			pdf->image.width = pdf->pages[i].width;
  519|     17|		pdf->image.height += pdf->pages[i].height;
  520|       |
  521|     17|		top += pdf->pages[i].height;
  522|     17|	}
  523|       |
  524|       |	/* If all pages are the same height, we can tag this as a toilet roll
  525|       |	 * image.
  526|       |	 */
  527|     17|	for (i = 1; i < pdf->n; i++)
  ------------------
  |  Branch (527:14): [True: 0, False: 17]
  ------------------
  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|     17|	if (pdf->n > 1)
  ------------------
  |  Branch (534:6): [True: 0, False: 17]
  ------------------
  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|     17|	vips_foreign_load_pdf_set_image(pdf, load->out);
  539|       |
  540|       |	/* Convert the background to the image format.
  541|       |	 */
  542|     17|	if (!(pdf->ink = vips__vector_to_ink(class->nickname,
  ------------------
  |  Branch (542:6): [True: 0, False: 17]
  ------------------
  543|     17|			  load->out,
  544|     17|			  VIPS_AREA(pdf->background)->data, NULL,
  ------------------
  |  |  137|     17|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  545|     17|			  VIPS_AREA(pdf->background)->n)))
  ------------------
  |  |  137|     17|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  546|      0|		return -1;
  547|     17|	vips__bgra2rgba((guint32 *) pdf->ink, 1);
  548|       |
  549|     17|	return 0;
  550|     17|}
pdfiumload.c:vips_foreign_load_pdf_get_page:
  349|     27|{
  350|     27|	if (pdf->current_page != page_no) {
  ------------------
  |  Branch (350:6): [True: 21, False: 6]
  ------------------
  351|     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))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  352|       |
  353|     21|		g_mutex_lock(&vips_pdfium_mutex);
  354|       |
  355|     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: 0, False: 21]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|     21|	} \
  |  |   48|     21|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|     21|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  356|     21|		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|     21|		if (!(pdf->page = FPDF_LoadPage(pdf->doc, page_no))) {
  ------------------
  |  Branch (362:7): [True: 1, False: 20]
  ------------------
  363|      1|			g_mutex_unlock(&vips_pdfium_mutex);
  364|      1|			vips_pdfium_error();
  365|      1|			vips_error(class->nickname,
  366|      1|				_("unable to load page %d"), page_no);
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  367|      1|			return -1;
  368|      1|		}
  369|     20|		pdf->current_page = page_no;
  370|       |
  371|     20|		g_mutex_unlock(&vips_pdfium_mutex);
  372|     20|	}
  373|       |
  374|     26|	return 0;
  375|     27|}
pdfiumload.c:vips_foreign_load_pdf_set_image:
  397|     20|{
  398|     20|	int i;
  399|     20|	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|     20|	if (vips_image_pipelinev(out, VIPS_DEMAND_STYLE_SMALLTILE, NULL))
  ------------------
  |  Branch (407:6): [True: 0, False: 20]
  ------------------
  408|      0|		return -1;
  409|       |
  410|       |	/* Extract and attach metadata. Set the old name too for compat.
  411|       |	 */
  412|     20|	vips_image_set_int(out, "pdf-n_pages", pdf->n_pages);
  413|     20|	vips_image_set_int(out, VIPS_META_N_PAGES, pdf->n_pages);
  ------------------
  |  |  165|     20|#define VIPS_META_N_PAGES "n-pages"
  ------------------
  414|       |
  415|     20|	g_mutex_lock(&vips_pdfium_mutex);
  416|       |
  417|    140|	for (i = 0; i < n_metadata; i++) {
  ------------------
  |  Branch (417:14): [True: 120, False: 20]
  ------------------
  418|    120|		VipsForeignLoadPdfMetadata *metadata =
  419|    120|			&vips_foreign_load_pdf_metadata[i];
  420|       |
  421|    120|		char text[1024];
  422|    120|		int len;
  423|       |
  424|    120|		len = FPDF_GetMetaText(pdf->doc, metadata->tag, text, 1024);
  425|    120|		if (len > 0) {
  ------------------
  |  Branch (425:7): [True: 36, False: 84]
  ------------------
  426|     36|			char *str;
  427|       |
  428|       |			/* Silently ignore coding errors.
  429|       |			 */
  430|     36|			if ((str = g_utf16_to_utf8((gunichar2 *) text, len,
  ------------------
  |  Branch (430:8): [True: 36, False: 0]
  ------------------
  431|     36|					 NULL, NULL, NULL))) {
  432|     36|				vips_image_set_string(out,
  433|     36|					metadata->field, str);
  434|     36|				g_free(str);
  435|     36|			}
  436|     36|		}
  437|    120|	}
  438|       |
  439|     20|	g_mutex_unlock(&vips_pdfium_mutex);
  440|       |
  441|       |	/* We need pixels/mm for vips.
  442|       |	 */
  443|     20|	res = pdf->dpi / 25.4;
  444|       |
  445|     20|	vips_image_init_fields(out,
  446|     20|		pdf->image.width, pdf->image.height,
  447|     20|		4, VIPS_FORMAT_UCHAR,
  448|     20|		VIPS_CODING_NONE, VIPS_INTERPRETATION_sRGB, res, res);
  449|       |
  450|     20|	return 0;
  451|     20|}
pdfiumload.c:vips_foreign_load_pdf_load:
  640|      3|{
  641|      3|	VipsForeignLoadPdf *pdf = (VipsForeignLoadPdf *) load;
  642|      3|	VipsImage **t = (VipsImage **)
  643|      3|		vips_object_local_array((VipsObject *) load, 2);
  644|       |
  645|       |#ifdef DEBUG
  646|       |	printf("vips_foreign_load_pdf_load: %p\n", pdf);
  647|       |#endif /*DEBUG*/
  648|       |
  649|       |	/* Read to this image, then cache to out, see below.
  650|       |	 */
  651|      3|	t[0] = vips_image_new();
  652|       |
  653|       |	/* Close input immediately at end of read.
  654|       |	 */
  655|      3|	g_signal_connect(t[0], "minimise",
  ------------------
  |  |  491|      3|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  656|      3|		G_CALLBACK(vips_foreign_load_pdf_minimise), pdf);
  657|       |
  658|      3|	vips_foreign_load_pdf_set_image(pdf, t[0]);
  659|       |
  660|      3|	if (vips_image_generate(t[0],
  ------------------
  |  Branch (660:6): [True: 0, False: 3]
  ------------------
  661|      3|			NULL, vips_foreign_load_pdf_generate, NULL, pdf, NULL) ||
  662|      3|		vips_tilecache(t[0], &t[1],
  ------------------
  |  Branch (662:3): [True: 0, False: 3]
  ------------------
  663|      3|			"tile_width", TILE_SIZE,
  ------------------
  |  |  114|      3|#define TILE_SIZE (4000)
  ------------------
  664|      3|			"tile_height", TILE_SIZE,
  ------------------
  |  |  114|      3|#define TILE_SIZE (4000)
  ------------------
  665|      3|			"max_tiles", 2 * (1 + t[0]->Xsize / TILE_SIZE),
  ------------------
  |  |  114|      3|#define TILE_SIZE (4000)
  ------------------
  666|      3|			NULL) ||
  667|      3|		vips_image_write(t[1], load->real))
  ------------------
  |  Branch (667:3): [True: 0, False: 3]
  ------------------
  668|      0|		return -1;
  669|       |
  670|      3|	return 0;
  671|      3|}
pdfiumload.c:vips_foreign_load_pdf_minimise:
  554|     12|{
  555|     12|	vips_source_minimise(pdf->source);
  556|     12|}
pdfiumload.c:vips_foreign_load_pdf_generate:
  561|      6|{
  562|      6|	VipsForeignLoadPdf *pdf = (VipsForeignLoadPdf *) a;
  563|      6|	VipsRect *r = &out_region->valid;
  564|       |
  565|      6|	int top;
  566|      6|	int i;
  567|       |
  568|       |	/*
  569|       |	printf("vips_foreign_load_pdf_generate: "
  570|       |		   "left = %d, top = %d, width = %d, height = %d\n",
  571|       |		r->left, r->top, r->width, r->height);
  572|       |	 */
  573|       |
  574|       |	/* Search through the pages we are drawing for the first containing
  575|       |	 * this rect. This could be quicker, perhaps a binary search, but who
  576|       |	 * cares.
  577|       |	 */
  578|      6|	for (i = 0; i < pdf->n; i++)
  ------------------
  |  Branch (578:14): [True: 6, False: 0]
  ------------------
  579|      6|		if (VIPS_RECT_BOTTOM(&pdf->pages[i]) > r->top)
  ------------------
  |  |   49|      6|#define VIPS_RECT_BOTTOM(R) ((R)->top + (R)->height)
  ------------------
  |  Branch (579:7): [True: 6, False: 0]
  ------------------
  580|      6|			break;
  581|       |
  582|       |	/* Reset out region. Otherwise there might be parts of previous pages
  583|       |	 * left.
  584|       |	 */
  585|      6|	vips_region_black(out_region);
  586|       |
  587|      6|	top = r->top;
  588|     12|	while (top < VIPS_RECT_BOTTOM(r)) {
  ------------------
  |  |   49|     12|#define VIPS_RECT_BOTTOM(R) ((R)->top + (R)->height)
  ------------------
  |  Branch (588:9): [True: 6, False: 6]
  ------------------
  589|      6|		VipsRect rect;
  590|      6|		FPDF_BITMAP bitmap;
  591|       |
  592|      6|		vips_rect_intersectrect(r, &pdf->pages[i], &rect);
  593|       |
  594|      6|		if (vips_foreign_load_pdf_get_page(pdf, pdf->page_no + i))
  ------------------
  |  Branch (594:7): [True: 0, False: 6]
  ------------------
  595|      0|			return -1;
  596|       |
  597|      6|		vips__worker_lock(&vips_pdfium_mutex);
  598|       |
  599|       |		/* 4 means RGBA.
  600|       |		 */
  601|      6|		bitmap = FPDFBitmap_CreateEx(rect.width, rect.height, 4,
  602|      6|			VIPS_REGION_ADDR(out_region, rect.left, rect.top),
  ------------------
  |  |  227|      6|	((R)->data + \
  |  |  228|      6|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|      6|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|      6|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|      6|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|      6|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|      6|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  603|      6|			VIPS_REGION_LSKIP(out_region));
  ------------------
  |  |  195|      6|	((size_t) ((R)->bpl))
  ------------------
  604|       |
  605|       |		/* Only paint the background if there's no transparency.
  606|       |		 */
  607|      6|		if (!FPDFPage_HasTransparency(pdf->page)) {
  ------------------
  |  Branch (607:7): [True: 4, False: 2]
  ------------------
  608|      4|			FPDF_DWORD ink = *((guint32 *) pdf->ink);
  609|       |
  610|      4|			FPDFBitmap_FillRect(bitmap,
  611|      4|				0, 0, rect.width, rect.height, ink);
  612|      4|		}
  613|       |
  614|       |		// pdfium writes bgra by default, we need rgba
  615|      6|		FPDF_RenderPageBitmap(bitmap, pdf->page,
  616|      6|			pdf->pages[i].left - rect.left,
  617|      6|			pdf->pages[i].top - rect.top,
  618|      6|			pdf->pages[i].width, pdf->pages[i].height,
  619|      6|			0, FPDF_ANNOT | FPDF_REVERSE_BYTE_ORDER);
  ------------------
  |  |  784|      6|#define FPDF_ANNOT 0x01
  ------------------
              			0, FPDF_ANNOT | FPDF_REVERSE_BYTE_ORDER);
  ------------------
  |  |  811|      6|#define FPDF_REVERSE_BYTE_ORDER 0x10
  ------------------
  620|       |
  621|      6|		FPDF_FFLDraw(pdf->form, bitmap, pdf->page,
  622|      6|			pdf->pages[i].left - rect.left,
  623|      6|			pdf->pages[i].top - rect.top,
  624|      6|			pdf->pages[i].width, pdf->pages[i].height,
  625|      6|			0, FPDF_ANNOT | FPDF_REVERSE_BYTE_ORDER);
  ------------------
  |  |  784|      6|#define FPDF_ANNOT 0x01
  ------------------
              			0, FPDF_ANNOT | FPDF_REVERSE_BYTE_ORDER);
  ------------------
  |  |  811|      6|#define FPDF_REVERSE_BYTE_ORDER 0x10
  ------------------
  626|       |
  627|      6|		FPDFBitmap_Destroy(bitmap);
  628|       |
  629|      6|		g_mutex_unlock(&vips_pdfium_mutex);
  630|       |
  631|      6|		top += rect.height;
  632|      6|		i += 1;
  633|      6|	}
  634|       |
  635|      6|	return 0;
  636|      6|}
pdfiumload.c:vips_foreign_load_pdf_init:
  739|     67|{
  740|     67|	pdf->dpi = 72.0;
  741|     67|	pdf->scale = 1.0;
  742|     67|	pdf->n = 1;
  743|     67|	pdf->current_page = -1;
  744|     67|	pdf->background = vips_array_double_newv(1, 255.0);
  745|     67|}
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|     67|{
  841|     67|	VipsForeignLoadPdf *pdf = (VipsForeignLoadPdf *) object;
  842|     67|	VipsForeignLoadPdfBuffer *buffer = (VipsForeignLoadPdfBuffer *) pdf;
  843|       |
  844|     67|	if (buffer->buf &&
  ------------------
  |  Branch (844:6): [True: 67, False: 0]
  ------------------
  845|     67|		!(pdf->source = vips_source_new_from_memory(
  ------------------
  |  Branch (845:3): [True: 0, False: 67]
  ------------------
  846|     67|			  VIPS_AREA(buffer->buf)->data,
  ------------------
  |  |  137|     67|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  847|     67|			  VIPS_AREA(buffer->buf)->length)))
  ------------------
  |  |  137|     67|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  848|      0|		return -1;
  849|       |
  850|     67|	return VIPS_OBJECT_CLASS(vips_foreign_load_pdf_buffer_parent_class)
  ------------------
  |  |  435|     67|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|     67|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|     67|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  851|     67|		->build(object);
  852|     67|}
pdfiumload.c:vips_foreign_load_pdf_buffer_init:
  881|     67|{
  882|     67|}
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__rad_israd:
  568|  5.40k|{
  569|  5.40k|	VipsSbuf *sbuf;
  570|  5.40k|	const char *line;
  571|  5.40k|	int result;
  572|       |
  573|       |	/* Just test that the first line is the magic string.
  574|       |	 */
  575|  5.40k|	sbuf = vips_sbuf_new_from_source(source);
  576|  5.40k|	result = (line = vips_sbuf_get_line(sbuf)) &&
  ------------------
  |  Branch (576:11): [True: 5.40k, False: 0]
  ------------------
  577|  5.40k|		strcmp(line, "#?RADIANCE") == 0;
  ------------------
  |  Branch (577:3): [True: 461, False: 4.94k]
  ------------------
  578|  5.40k|	VIPS_UNREF(sbuf);
  ------------------
  |  |   57|  5.40k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  5.40k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  5.40k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  5.40k|	{ \
  |  |  |  |   43|  5.40k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 5.40k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  5.40k|			(void) F((S)); \
  |  |  |  |   45|  5.40k|			(S) = 0; \
  |  |  |  |   46|  5.40k|		} \
  |  |  |  |   47|  5.40k|	} \
  |  |  |  |   48|  5.40k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  5.40k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  579|       |
  580|  5.40k|	return result;
  581|  5.40k|}
vips__rad_header:
  740|    461|{
  741|    461|	Read *read;
  742|       |
  743|    461|	if (!(read = read_new(source, out)))
  ------------------
  |  Branch (743:6): [True: 0, False: 461]
  ------------------
  744|      0|		return -1;
  745|    461|	if (rad2vips_get_header(read, read->out))
  ------------------
  |  Branch (745:6): [True: 243, False: 218]
  ------------------
  746|    243|		return -1;
  747|    218|	vips_source_minimise(source);
  748|       |
  749|    218|	return 0;
  750|    461|}
vips__rad_load:
  787|    190|{
  788|    190|	VipsImage **t = (VipsImage **)
  789|    190|		vips_object_local_array(VIPS_OBJECT(out), 3);
  ------------------
  |  |  433|    190|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|    190|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    190|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  790|       |
  791|    190|	Read *read;
  792|       |
  793|       |#ifdef DEBUG
  794|       |	printf("rad2vips: reading \"%s\"\n",
  795|       |		vips_connection_nick(VIPS_CONNECTION(source)));
  796|       |#endif /*DEBUG*/
  797|       |
  798|    190|	if (!(read = read_new(source, out)))
  ------------------
  |  Branch (798:6): [True: 0, False: 190]
  ------------------
  799|      0|		return -1;
  800|       |
  801|    190|	t[0] = vips_image_new();
  802|    190|	if (rad2vips_get_header(read, t[0]))
  ------------------
  |  Branch (802:6): [True: 0, False: 190]
  ------------------
  803|      0|		return -1;
  804|       |
  805|    190|	if (vips_image_generate(t[0],
  ------------------
  |  Branch (805:6): [True: 0, False: 190]
  ------------------
  806|    190|			NULL, rad2vips_generate, NULL, read, NULL) ||
  807|    190|		vips_sequential(t[0], &t[1],
  ------------------
  |  Branch (807:3): [True: 0, False: 190]
  ------------------
  808|    190|			"tile_height", VIPS__FATSTRIP_HEIGHT,
  ------------------
  |  |  161|    190|#define VIPS__FATSTRIP_HEIGHT (16)
  ------------------
  809|    190|			NULL) ||
  810|    190|		vips_image_write(t[1], out))
  ------------------
  |  Branch (810:3): [True: 166, False: 24]
  ------------------
  811|    166|		return -1;
  812|       |
  813|     24|	if (vips_source_decode(source))
  ------------------
  |  Branch (813:6): [True: 0, False: 24]
  ------------------
  814|      0|		return -1;
  815|       |
  816|     24|	return 0;
  817|     24|}
radiance.c:read_new:
  598|    651|{
  599|    651|	Read *read;
  600|    651|	int i;
  601|       |
  602|    651|	if (vips_source_rewind(source))
  ------------------
  |  Branch (602:6): [True: 0, False: 651]
  ------------------
  603|      0|		return NULL;
  604|       |
  605|    651|	if (!(read = VIPS_NEW(out, Read)))
  ------------------
  |  |   70|    651|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|    651|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|    651|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|    651|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|    651|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (605:6): [True: 0, False: 651]
  ------------------
  606|      0|		return NULL;
  607|       |
  608|    651|	read->sbuf = vips_sbuf_new_from_source(source);
  609|    651|	read->out = out;
  610|    651|	strcpy(read->format, COLRFMT);
  ------------------
  |  |  202|    651|#define COLRFMT "32-bit_rle_rgbe"
  ------------------
  611|    651|	read->expos = 1.0;
  612|  2.60k|	for (i = 0; i < 3; i++)
  ------------------
  |  Branch (612:14): [True: 1.95k, False: 651]
  ------------------
  613|  1.95k|		read->colcor[i] = 1.0;
  614|    651|	read->aspect = 1.0;
  615|    651|	read->prims[0][0] = CIE_x_r;
  ------------------
  |  |  192|    651|#define CIE_x_r 0.640 /* nominal CRT primaries */
  ------------------
  616|    651|	read->prims[0][1] = CIE_y_r;
  ------------------
  |  |  193|    651|#define CIE_y_r 0.330
  ------------------
  617|    651|	read->prims[1][0] = CIE_x_g;
  ------------------
  |  |  194|    651|#define CIE_x_g 0.290
  ------------------
  618|    651|	read->prims[1][1] = CIE_y_g;
  ------------------
  |  |  195|    651|#define CIE_y_g 0.600
  ------------------
  619|    651|	read->prims[2][0] = CIE_x_b;
  ------------------
  |  |  196|    651|#define CIE_x_b 0.150
  ------------------
  620|    651|	read->prims[2][1] = CIE_y_b;
  ------------------
  |  |  197|    651|#define CIE_y_b 0.060
  ------------------
  621|    651|	read->prims[3][0] = CIE_x_w;
  ------------------
  |  |  198|    651|#define CIE_x_w (1. / 3.) /* use EE white */
  ------------------
  622|    651|	read->prims[3][1] = CIE_y_w;
  ------------------
  |  |  199|    651|#define CIE_y_w (1. / 3.)
  ------------------
  623|       |
  624|    651|	g_signal_connect(out, "close",
  ------------------
  |  |  491|    651|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  625|    651|		G_CALLBACK(read_destroy), read);
  626|    651|	g_signal_connect(out, "minimise",
  ------------------
  |  |  491|    651|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  627|    651|		G_CALLBACK(read_minimise_cb), read);
  628|       |
  629|    651|	return read;
  630|    651|}
radiance.c:read_destroy:
  585|    651|{
  586|    651|	VIPS_UNREF(read->sbuf);
  ------------------
  |  |   57|    651|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|    651|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|    651|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|    651|	{ \
  |  |  |  |   43|    651|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 651, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|    651|			(void) F((S)); \
  |  |  |  |   45|    651|			(S) = 0; \
  |  |  |  |   46|    651|		} \
  |  |  |  |   47|    651|	} \
  |  |  |  |   48|    651|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|    651|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  587|    651|}
radiance.c:read_minimise_cb:
  591|    848|{
  592|    848|	if (read->sbuf)
  ------------------
  |  Branch (592:6): [True: 848, False: 0]
  ------------------
  593|    848|		vips_source_minimise(read->sbuf->source);
  594|    848|}
radiance.c:rad2vips_get_header:
  675|    651|{
  676|    651|	VipsInterpretation interpretation;
  677|    651|	const char *line;
  678|    651|	int width;
  679|    651|	int height;
  680|    651|	int i, j;
  681|       |
  682|    651|	if (getheader(read->sbuf,
  ------------------
  |  Branch (682:6): [True: 164, False: 487]
  ------------------
  683|    651|			(gethfunc *) rad2vips_process_line, read) ||
  684|    651|		!(line = vips_sbuf_get_line(read->sbuf)) ||
  ------------------
  |  Branch (684:3): [True: 4, False: 483]
  ------------------
  685|    651|		!str2resolu(&read->rs, (char *) line)) {
  ------------------
  |  Branch (685:3): [True: 55, False: 428]
  ------------------
  686|    223|		vips_error("rad2vips", "%s",
  687|    223|			_("error reading radiance header"));
  ------------------
  |  |   30|    223|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|    223|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  688|    223|		return -1;
  689|    223|	}
  690|       |
  691|    428|	if (strcmp(read->format, COLRFMT) == 0)
  ------------------
  |  |  202|    428|#define COLRFMT "32-bit_rle_rgbe"
  ------------------
  |  Branch (691:6): [True: 428, False: 0]
  ------------------
  692|    428|		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|    428|	width = scanlen(&read->rs);
  ------------------
  |  |  251|    428|#define scanlen(rs) ((rs)->rt & YMAJOR ? (rs)->xr : (rs)->yr)
  |  |  ------------------
  |  |  |  |  242|    428|#define YMAJOR 4
  |  |  ------------------
  |  |  |  Branch (251:22): [True: 187, False: 241]
  |  |  ------------------
  ------------------
  699|    428|	height = numscans(&read->rs);
  ------------------
  |  |  252|    428|#define numscans(rs) ((rs)->rt & YMAJOR ? (rs)->yr : (rs)->xr)
  |  |  ------------------
  |  |  |  |  242|    428|#define YMAJOR 4
  |  |  ------------------
  |  |  |  Branch (252:23): [True: 187, False: 241]
  |  |  ------------------
  ------------------
  700|    428|	if (width <= 0 ||
  ------------------
  |  Branch (700:6): [True: 0, False: 428]
  ------------------
  701|    428|		width >= VIPS_MAX_COORD ||
  ------------------
  |  |   69|    856|#define VIPS_MAX_COORD (vips_max_coord_get())
  ------------------
  |  Branch (701:3): [True: 8, False: 420]
  ------------------
  702|    428|		height <= 0 ||
  ------------------
  |  Branch (702:3): [True: 0, False: 420]
  ------------------
  703|    428|		height >= VIPS_MAX_COORD) {
  ------------------
  |  |   69|    420|#define VIPS_MAX_COORD (vips_max_coord_get())
  ------------------
  |  Branch (703:3): [True: 12, False: 408]
  ------------------
  704|     20|		vips_error("rad2vips", "%s", _("image size out of bounds"));
  ------------------
  |  |   30|     20|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|     20|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  705|     20|		return -1;
  706|     20|	}
  707|       |
  708|    408|	vips_image_init_fields(out, width, height, 4,
  709|    408|		VIPS_FORMAT_UCHAR, VIPS_CODING_RAD,
  710|    408|		interpretation,
  711|    408|		1, read->aspect);
  712|       |
  713|    408|	VIPS_SETSTR(out->filename,
  ------------------
  |  |   53|    408|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    408|#define G_STMT_START  do
  |  |  ------------------
  |  |   54|    408|	{ \
  |  |   55|    408|		const char *sst = (V); \
  |  |   56|    408|		\
  |  |   57|    408|		if ((S) != sst) { \
  |  |  ------------------
  |  |  |  Branch (57:7): [True: 408, False: 0]
  |  |  ------------------
  |  |   58|    408|			if (!(S) || !sst || strcmp((S), sst) != 0) { \
  |  |  ------------------
  |  |  |  Branch (58:8): [True: 0, False: 408]
  |  |  |  Branch (58:16): [True: 408, False: 0]
  |  |  |  Branch (58:24): [True: 0, False: 0]
  |  |  ------------------
  |  |   59|    408|				VIPS_FREE(S); \
  |  |  ------------------
  |  |  |  |   50|    408|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  |  |  ------------------
  |  |  |  |  |  |   41|    408|	G_STMT_START \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  854|    408|#define G_STMT_START  do
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   42|    408|	{ \
  |  |  |  |  |  |   43|    408|		if (S) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (43:7): [True: 408, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   44|    408|			(void) F((S)); \
  |  |  |  |  |  |   45|    408|			(S) = 0; \
  |  |  |  |  |  |   46|    408|		} \
  |  |  |  |  |  |   47|    408|	} \
  |  |  |  |  |  |   48|    408|	G_STMT_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  862|    408|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   60|    408|				if (sst) \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 0, False: 408]
  |  |  ------------------
  |  |   61|    408|					(S) = g_strdup(sst); \
  |  |   62|    408|			} \
  |  |   63|    408|		} \
  |  |   64|    408|	} \
  |  |   65|    408|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    408|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  714|    408|		vips_connection_filename(
  715|    408|			VIPS_CONNECTION(read->sbuf->source)));
  716|       |
  717|    408|	if (vips_image_pipelinev(out, VIPS_DEMAND_STYLE_THINSTRIP, NULL))
  ------------------
  |  Branch (717:6): [True: 0, False: 408]
  ------------------
  718|      0|		return -1;
  719|       |
  720|    408|	vips_image_set_string(out, "rad-format", read->format);
  721|       |
  722|    408|	vips_image_set_double(out, "rad-expos", read->expos);
  723|       |
  724|  1.63k|	for (i = 0; i < 3; i++)
  ------------------
  |  Branch (724:14): [True: 1.22k, False: 408]
  ------------------
  725|  1.22k|		vips_image_set_double(out,
  726|  1.22k|			colcor_name[i], read->colcor[i]);
  727|       |
  728|    408|	vips_image_set_double(out, "rad-aspect", read->aspect);
  729|       |
  730|  2.04k|	for (i = 0; i < 4; i++)
  ------------------
  |  Branch (730:14): [True: 1.63k, False: 408]
  ------------------
  731|  4.89k|		for (j = 0; j < 2; j++)
  ------------------
  |  Branch (731:15): [True: 3.26k, False: 1.63k]
  ------------------
  732|  3.26k|			vips_image_set_double(out,
  733|  3.26k|				prims_name[i][j], read->prims[i][j]);
  734|       |
  735|    408|	return 0;
  736|    408|}
radiance.c:getheader:
  343|    651|{
  344|  6.70k|	for (;;) {
  345|  6.70k|		const char *line;
  346|       |
  347|  6.70k|		if (!(line = vips_sbuf_get_line(sbuf)))
  ------------------
  |  Branch (347:7): [True: 164, False: 6.54k]
  ------------------
  348|    164|			return -1;
  349|  6.54k|		if (strcmp(line, "") == 0)
  ------------------
  |  Branch (349:7): [True: 487, False: 6.05k]
  ------------------
  350|       |			/* Blank line. We've parsed the header successfully.
  351|       |			 */
  352|    487|			break;
  353|       |
  354|  6.05k|		if (f != NULL &&
  ------------------
  |  Branch (354:7): [True: 6.05k, False: 0]
  ------------------
  355|  6.05k|			(*f)((char *) line, p) < 0)
  ------------------
  |  Branch (355:4): [True: 0, False: 6.05k]
  ------------------
  356|      0|			return -1;
  357|  6.05k|	}
  358|       |
  359|    487|	return 0;
  360|    651|}
radiance.c:rad2vips_process_line:
  634|  6.05k|{
  635|  6.05k|	if (isformat(line)) {
  ------------------
  |  |  259|  6.05k|#define isformat(s) formatval(NULL, s)
  |  |  ------------------
  |  |  |  Branch (259:21): [True: 234, False: 5.82k]
  |  |  ------------------
  ------------------
  636|    234|		if (formatval(line, read->format))
  ------------------
  |  Branch (636:7): [True: 0, False: 234]
  ------------------
  637|      0|			return -1;
  638|    234|	}
  639|  5.82k|	else if (isexpos(line)) {
  ------------------
  |  |  208|  5.82k|#define isexpos(hl) (!strncmp(hl, EXPOSSTR, LEXPOSSTR))
  |  |  ------------------
  |  |  |  |  206|  5.82k|#define EXPOSSTR "EXPOSURE="
  |  |  ------------------
  |  |               #define isexpos(hl) (!strncmp(hl, EXPOSSTR, LEXPOSSTR))
  |  |  ------------------
  |  |  |  |  207|  5.82k|#define LEXPOSSTR 9
  |  |  ------------------
  |  |  |  Branch (208:21): [True: 267, False: 5.55k]
  |  |  ------------------
  ------------------
  640|    267|		read->expos *= exposval(line);
  ------------------
  |  |  209|    267|#define exposval(hl) atof((hl) + LEXPOSSTR)
  |  |  ------------------
  |  |  |  |  207|    267|#define LEXPOSSTR 9
  |  |  ------------------
  ------------------
  641|    267|	}
  642|  5.55k|	else if (iscolcor(line)) {
  ------------------
  |  |  231|  5.55k|#define iscolcor(hl) (!strncmp(hl, COLCORSTR, LCOLCORSTR))
  |  |  ------------------
  |  |  |  |  229|  5.55k|#define COLCORSTR "COLORCORR="
  |  |  ------------------
  |  |               #define iscolcor(hl) (!strncmp(hl, COLCORSTR, LCOLCORSTR))
  |  |  ------------------
  |  |  |  |  230|  5.55k|#define LCOLCORSTR 10
  |  |  ------------------
  |  |  |  Branch (231:22): [True: 384, False: 5.17k]
  |  |  ------------------
  ------------------
  643|    384|		COLOR cc;
  644|    384|		int i;
  645|       |
  646|    384|		(void) colcorval(cc, line);
  ------------------
  |  |  232|    384|#define colcorval(cc, hl) sscanf((hl) + LCOLCORSTR, "%f %f %f", \
  |  |  ------------------
  |  |  |  |  230|    384|#define LCOLCORSTR 10
  |  |  ------------------
  |  |  233|    384|	&(cc)[RED], &(cc)[GRN], &(cc)[BLU])
  |  |  ------------------
  |  |  |  |  174|    384|#define RED 0
  |  |  ------------------
  |  |               	&(cc)[RED], &(cc)[GRN], &(cc)[BLU])
  |  |  ------------------
  |  |  |  |  175|    384|#define GRN 1
  |  |  ------------------
  |  |               	&(cc)[RED], &(cc)[GRN], &(cc)[BLU])
  |  |  ------------------
  |  |  |  |  176|    384|#define BLU 2
  |  |  ------------------
  ------------------
  647|  1.53k|		for (i = 0; i < 3; i++)
  ------------------
  |  Branch (647:15): [True: 1.15k, False: 384]
  ------------------
  648|  1.15k|			read->colcor[i] *= cc[i];
  649|    384|	}
  650|  5.17k|	else if (isaspect(line)) {
  ------------------
  |  |  214|  5.17k|#define isaspect(hl) (!strncmp(hl, ASPECTSTR, LASPECTSTR))
  |  |  ------------------
  |  |  |  |  212|  5.17k|#define ASPECTSTR "PIXASPECT="
  |  |  ------------------
  |  |               #define isaspect(hl) (!strncmp(hl, ASPECTSTR, LASPECTSTR))
  |  |  ------------------
  |  |  |  |  213|  5.17k|#define LASPECTSTR 10
  |  |  ------------------
  |  |  |  Branch (214:22): [True: 72, False: 5.09k]
  |  |  ------------------
  ------------------
  651|     72|		read->aspect *= aspectval(line);
  ------------------
  |  |  215|     72|#define aspectval(hl) atof((hl) + LASPECTSTR)
  |  |  ------------------
  |  |  |  |  213|     72|#define LASPECTSTR 10
  |  |  ------------------
  ------------------
  652|     72|	}
  653|  5.09k|	else if (isprims(line)) {
  ------------------
  |  |  220|  5.09k|#define isprims(hl) (!strncmp(hl, PRIMARYSTR, LPRIMARYSTR))
  |  |  ------------------
  |  |  |  |  218|  5.09k|#define PRIMARYSTR "PRIMARIES="
  |  |  ------------------
  |  |               #define isprims(hl) (!strncmp(hl, PRIMARYSTR, LPRIMARYSTR))
  |  |  ------------------
  |  |  |  |  219|  5.09k|#define LPRIMARYSTR 10
  |  |  ------------------
  |  |  |  Branch (220:21): [True: 220, False: 4.87k]
  |  |  ------------------
  ------------------
  654|    220|		(void) primsval(read->prims, line);
  ------------------
  |  |  221|    220|#define primsval(p, hl) (sscanf((hl) + LPRIMARYSTR, \
  |  |  ------------------
  |  |  |  |  219|    220|#define LPRIMARYSTR 10
  |  |  ------------------
  |  |  222|    220|							 "%f %f %f %f %f %f %f %f", \
  |  |  223|    220|							 &(p)[RED][CIEX], &(p)[RED][CIEY], \
  |  |  ------------------
  |  |  |  |  174|    220|#define RED 0
  |  |  ------------------
  |  |               							 &(p)[RED][CIEX], &(p)[RED][CIEY], \
  |  |  ------------------
  |  |  |  |  177|    220|#define CIEX 0 /* or, if input is XYZ... */
  |  |  ------------------
  |  |               							 &(p)[RED][CIEX], &(p)[RED][CIEY], \
  |  |  ------------------
  |  |  |  |  174|    220|#define RED 0
  |  |  ------------------
  |  |               							 &(p)[RED][CIEX], &(p)[RED][CIEY], \
  |  |  ------------------
  |  |  |  |  178|    220|#define CIEY 1
  |  |  ------------------
  |  |  224|    220|							 &(p)[GRN][CIEX], &(p)[GRN][CIEY], \
  |  |  ------------------
  |  |  |  |  175|    220|#define GRN 1
  |  |  ------------------
  |  |               							 &(p)[GRN][CIEX], &(p)[GRN][CIEY], \
  |  |  ------------------
  |  |  |  |  177|    220|#define CIEX 0 /* or, if input is XYZ... */
  |  |  ------------------
  |  |               							 &(p)[GRN][CIEX], &(p)[GRN][CIEY], \
  |  |  ------------------
  |  |  |  |  175|    220|#define GRN 1
  |  |  ------------------
  |  |               							 &(p)[GRN][CIEX], &(p)[GRN][CIEY], \
  |  |  ------------------
  |  |  |  |  178|    220|#define CIEY 1
  |  |  ------------------
  |  |  225|    220|							 &(p)[BLU][CIEX], &(p)[BLU][CIEY], \
  |  |  ------------------
  |  |  |  |  176|    220|#define BLU 2
  |  |  ------------------
  |  |               							 &(p)[BLU][CIEX], &(p)[BLU][CIEY], \
  |  |  ------------------
  |  |  |  |  177|    220|#define CIEX 0 /* or, if input is XYZ... */
  |  |  ------------------
  |  |               							 &(p)[BLU][CIEX], &(p)[BLU][CIEY], \
  |  |  ------------------
  |  |  |  |  176|    220|#define BLU 2
  |  |  ------------------
  |  |               							 &(p)[BLU][CIEX], &(p)[BLU][CIEY], \
  |  |  ------------------
  |  |  |  |  178|    220|#define CIEY 1
  |  |  ------------------
  |  |  226|    220|							 &(p)[WHT][CIEX], &(p)[WHT][CIEY]) == 8)
  |  |  ------------------
  |  |  |  |  181|    220|#define WHT 3	  /* used for RGBPRIMS type */
  |  |  ------------------
  |  |               							 &(p)[WHT][CIEX], &(p)[WHT][CIEY]) == 8)
  |  |  ------------------
  |  |  |  |  177|    220|#define CIEX 0 /* or, if input is XYZ... */
  |  |  ------------------
  |  |               							 &(p)[WHT][CIEX], &(p)[WHT][CIEY]) == 8)
  |  |  ------------------
  |  |  |  |  181|    220|#define WHT 3	  /* used for RGBPRIMS type */
  |  |  ------------------
  |  |               							 &(p)[WHT][CIEX], &(p)[WHT][CIEY]) == 8)
  |  |  ------------------
  |  |  |  |  178|    220|#define CIEY 1
  |  |  ------------------
  ------------------
  655|    220|	}
  656|       |
  657|  6.05k|	return 0;
  658|  6.05k|}
radiance.c:formatval:
  315|  6.28k|{
  316|  6.28k|	const char *cp = FMTSTR;
  317|  6.28k|	char *r = fmt;
  318|       |	/* check against format string */
  319|  13.1k|	while (*cp)
  ------------------
  |  Branch (319:9): [True: 12.3k, False: 836]
  ------------------
  320|  12.3k|		if (*cp++ != *s++)
  ------------------
  |  Branch (320:7): [True: 5.45k, False: 6.87k]
  ------------------
  321|  5.45k|			return 0;
  322|  1.60k|	while (g_ascii_isspace(*s))
  ------------------
  |  |   81|  1.60k|  ((g_ascii_table[(guchar) (c)] & G_ASCII_SPACE) != 0)
  |  |  ------------------
  |  |  |  Branch (81:3): [True: 765, False: 836]
  |  |  ------------------
  ------------------
  323|    765|		s++;
  324|    836|	if (!*s)
  ------------------
  |  Branch (324:6): [True: 602, False: 234]
  ------------------
  325|    602|		return 0;
  326|    234|	if (r == NULL) /* just checking if format? */
  ------------------
  |  Branch (326:6): [True: 234, False: 0]
  ------------------
  327|    234|		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|    234|}
radiance.c:str2resolu:
  281|    483|{
  282|    483|	register char *xndx, *yndx;
  283|    483|	register char *cp;
  284|       |
  285|    483|	if (buf == NULL)
  ------------------
  |  Branch (285:6): [True: 0, False: 483]
  ------------------
  286|      0|		return 0;
  287|    483|	xndx = yndx = NULL;
  288|  8.78k|	for (cp = buf; *cp; cp++)
  ------------------
  |  Branch (288:17): [True: 8.30k, False: 483]
  ------------------
  289|  8.30k|		if (*cp == 'X')
  ------------------
  |  Branch (289:7): [True: 697, False: 7.60k]
  ------------------
  290|    697|			xndx = cp;
  291|  7.60k|		else if (*cp == 'Y')
  ------------------
  |  Branch (291:12): [True: 675, False: 6.93k]
  ------------------
  292|    675|			yndx = cp;
  293|    483|	if (xndx == NULL || yndx == NULL)
  ------------------
  |  Branch (293:6): [True: 17, False: 466]
  |  Branch (293:22): [True: 9, False: 457]
  ------------------
  294|     26|		return 0;
  295|    457|	rp->rt = 0;
  296|    457|	if (xndx > yndx)
  ------------------
  |  Branch (296:6): [True: 200, False: 257]
  ------------------
  297|    200|		rp->rt |= YMAJOR;
  ------------------
  |  |  242|    200|#define YMAJOR 4
  ------------------
  298|    457|	if (xndx[-1] == '-')
  ------------------
  |  Branch (298:6): [True: 30, False: 427]
  ------------------
  299|     30|		rp->rt |= XDECR;
  ------------------
  |  |  240|     30|#define XDECR 1
  ------------------
  300|    457|	if (yndx[-1] == '-')
  ------------------
  |  Branch (300:6): [True: 11, False: 446]
  ------------------
  301|     11|		rp->rt |= YDECR;
  ------------------
  |  |  241|     11|#define YDECR 2
  ------------------
  302|    457|	if ((rp->xr = atoi(xndx + 1)) <= 0)
  ------------------
  |  Branch (302:6): [True: 15, False: 442]
  ------------------
  303|     15|		return 0;
  304|    442|	if ((rp->yr = atoi(yndx + 1)) <= 0)
  ------------------
  |  Branch (304:6): [True: 14, False: 428]
  ------------------
  305|     14|		return 0;
  306|    428|	return 1;
  307|    442|}
radiance.c:rad2vips_generate:
  755|    309|{
  756|    309|	VipsRect *r = &out_region->valid;
  757|    309|	Read *read = (Read *) a;
  758|       |
  759|    309|	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|    309|	VIPS_GATE_START("rad2vips_generate: work");
  ------------------
  |  |   41|    309|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    309|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|    309|	{ \
  |  |   43|    309|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 309]
  |  |  ------------------
  |  |   44|    309|			vips__thread_gate_start(NAME); \
  |  |   45|    309|	} \
  |  |   46|    309|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    309|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  767|       |
  768|  2.64k|	for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (768:14): [True: 2.49k, False: 143]
  ------------------
  769|  2.49k|		COLR *buf = (COLR *)
  770|  2.49k|			VIPS_REGION_ADDR(out_region, 0, r->top + y);
  ------------------
  |  |  227|  2.49k|	((R)->data + \
  |  |  228|  2.49k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  2.49k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  2.49k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  2.49k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  2.49k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  2.49k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  771|       |
  772|  2.49k|		if (scanline_read(read->sbuf, buf, out_region->im->Xsize)) {
  ------------------
  |  Branch (772:7): [True: 166, False: 2.33k]
  ------------------
  773|    166|			vips_error("rad2vips",
  774|    166|				_("read error line %d"), r->top + y);
  ------------------
  |  |   30|    166|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|    166|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  775|    166|			VIPS_GATE_STOP("rad2vips_generate: work");
  ------------------
  |  |   49|    166|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    166|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|    166|	{ \
  |  |   51|    166|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 166]
  |  |  ------------------
  |  |   52|    166|			vips__thread_gate_stop(NAME); \
  |  |   53|    166|	} \
  |  |   54|    166|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    166|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  776|    166|			return -1;
  777|    166|		}
  778|  2.49k|	}
  779|       |
  780|    309|	VIPS_GATE_STOP("rad2vips_generate: work");
  ------------------
  |  |   49|    143|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    143|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|    143|	{ \
  |  |   51|    143|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 143]
  |  |  ------------------
  |  |   52|    143|			vips__thread_gate_stop(NAME); \
  |  |   53|    143|	} \
  |  |   54|    309|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    309|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  781|       |
  782|    143|	return 0;
  783|    309|}
radiance.c:scanline_read:
  413|  2.49k|{
  414|  2.49k|	int i, j;
  415|       |
  416|       |	/* Detect old-style scanlines.
  417|       |	 */
  418|  2.49k|	if (width < MINELEN ||
  ------------------
  |  |  235|  4.99k|#define MINELEN 8	   /* minimum scanline length for encoding */
  ------------------
  |  Branch (418:6): [True: 0, False: 2.49k]
  ------------------
  419|  2.49k|		width > MAXELEN)
  ------------------
  |  |  236|  2.49k|#define MAXELEN 0x7fff /* maximum scanline length for encoding */
  ------------------
  |  Branch (419:3): [True: 0, False: 2.49k]
  ------------------
  420|      0|		return scanline_read_old(sbuf, scanline, width);
  421|       |
  422|  2.49k|	if (VIPS_SBUF_REQUIRE(sbuf, 4))
  ------------------
  |  |  123|  2.49k|#define VIPS_SBUF_REQUIRE(S, R) ( \
  |  |  ------------------
  |  |  |  Branch (123:33): [True: 29, False: 2.46k]
  |  |  ------------------
  |  |  124|  2.49k|	(S)->read_point + (R) <= (S)->chars_in_buffer \
  |  |  ------------------
  |  |  |  Branch (124:2): [True: 2.46k, False: 32]
  |  |  ------------------
  |  |  125|  2.49k|		? 0 \
  |  |  126|  2.49k|		: vips_sbuf_require((S), (R)))
  ------------------
  423|     29|		return -1;
  424|       |
  425|  2.46k|	if (VIPS_SBUF_PEEK(sbuf)[0] != 2)
  ------------------
  |  |  127|  2.46k|#define VIPS_SBUF_PEEK(S) ((S)->input_buffer + (S)->read_point)
  ------------------
  |  Branch (425:6): [True: 2.14k, False: 329]
  ------------------
  426|  2.14k|		return scanline_read_old(sbuf, scanline, width);
  427|       |
  428|    329|	scanline[0][RED] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  174|    329|#define RED 0
  ------------------
              	scanline[0][RED] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  128|    329|#define VIPS_SBUF_FETCH(S) ((S)->input_buffer[(S)->read_point++])
  ------------------
  429|    329|	scanline[0][GRN] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  175|    329|#define GRN 1
  ------------------
              	scanline[0][GRN] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  128|    329|#define VIPS_SBUF_FETCH(S) ((S)->input_buffer[(S)->read_point++])
  ------------------
  430|    329|	scanline[0][BLU] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  176|    329|#define BLU 2
  ------------------
              	scanline[0][BLU] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  128|    329|#define VIPS_SBUF_FETCH(S) ((S)->input_buffer[(S)->read_point++])
  ------------------
  431|    329|	scanline[0][EXP] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  179|    329|#define EXP 3	  /* exponent same for either format */
  ------------------
              	scanline[0][EXP] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  128|    329|#define VIPS_SBUF_FETCH(S) ((S)->input_buffer[(S)->read_point++])
  ------------------
  432|    329|	if (scanline[0][GRN] != 2 ||
  ------------------
  |  |  175|    329|#define GRN 1
  ------------------
  |  Branch (432:6): [True: 39, False: 290]
  ------------------
  433|    329|		scanline[0][BLU] & 128)
  ------------------
  |  |  176|    290|#define BLU 2
  ------------------
  |  Branch (433:3): [True: 231, False: 59]
  ------------------
  434|    270|		return scanline_read_old(sbuf,
  435|    270|			scanline + 1, width - 1);
  436|       |
  437|     59|	if (((scanline[0][BLU] << 8) | scanline[0][EXP]) != width) {
  ------------------
  |  |  176|     59|#define BLU 2
  ------------------
              	if (((scanline[0][BLU] << 8) | scanline[0][EXP]) != width) {
  ------------------
  |  |  179|     59|#define EXP 3	  /* exponent same for either format */
  ------------------
  |  Branch (437:6): [True: 7, False: 52]
  ------------------
  438|      7|		vips_error("rad2vips", "%s", _("scanline length mismatch"));
  ------------------
  |  |   30|      7|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      7|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  439|      7|		return -1;
  440|      7|	}
  441|       |
  442|     70|	for (i = 0; i < 4; i++)
  ------------------
  |  Branch (442:14): [True: 68, False: 2]
  ------------------
  443|   218k|		for (j = 0; j < width;) {
  ------------------
  |  Branch (443:15): [True: 218k, False: 18]
  ------------------
  444|   218k|			int code, len;
  445|   218k|			gboolean run;
  446|       |
  447|   218k|			if (VIPS_SBUF_REQUIRE(sbuf, 2))
  ------------------
  |  |  123|   218k|#define VIPS_SBUF_REQUIRE(S, R) ( \
  |  |  ------------------
  |  |  |  Branch (123:33): [True: 27, False: 218k]
  |  |  ------------------
  |  |  124|   218k|	(S)->read_point + (R) <= (S)->chars_in_buffer \
  |  |  ------------------
  |  |  |  Branch (124:2): [True: 218k, False: 76]
  |  |  ------------------
  |  |  125|   218k|		? 0 \
  |  |  126|   218k|		: vips_sbuf_require((S), (R)))
  ------------------
  448|     27|				return -1;
  449|       |
  450|   218k|			code = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  128|   218k|#define VIPS_SBUF_FETCH(S) ((S)->input_buffer[(S)->read_point++])
  ------------------
  451|   218k|			run = code > 128;
  452|   218k|			len = run ? code & 127 : code;
  ------------------
  |  Branch (452:10): [True: 128, False: 218k]
  ------------------
  453|       |
  454|   218k|			if (j + len > width) {
  ------------------
  |  Branch (454:8): [True: 19, False: 218k]
  ------------------
  455|     19|				vips_error("rad2vips", "%s", _("overrun"));
  ------------------
  |  |   30|     19|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|     19|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  456|     19|				return -1;
  457|     19|			}
  458|       |
  459|   218k|			if (run) {
  ------------------
  |  Branch (459:8): [True: 118, False: 218k]
  ------------------
  460|    118|				int val;
  461|       |
  462|    118|				val = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  128|    118|#define VIPS_SBUF_FETCH(S) ((S)->input_buffer[(S)->read_point++])
  ------------------
  463|    545|				while (len--)
  ------------------
  |  Branch (463:12): [True: 427, False: 118]
  ------------------
  464|    427|					scanline[j++][i] = val;
  465|    118|			}
  466|   218k|			else {
  467|   218k|				if (VIPS_SBUF_REQUIRE(sbuf, len))
  ------------------
  |  |  123|   218k|#define VIPS_SBUF_REQUIRE(S, R) ( \
  |  |  ------------------
  |  |  |  Branch (123:33): [True: 4, False: 218k]
  |  |  ------------------
  |  |  124|   218k|	(S)->read_point + (R) <= (S)->chars_in_buffer \
  |  |  ------------------
  |  |  |  Branch (124:2): [True: 218k, False: 5]
  |  |  ------------------
  |  |  125|   218k|		? 0 \
  |  |  126|   218k|		: vips_sbuf_require((S), (R)))
  ------------------
  468|      4|					return -1;
  469|   219k|				while (len--)
  ------------------
  |  Branch (469:12): [True: 976, False: 218k]
  ------------------
  470|    976|					scanline[j++][i] =
  471|    976|						VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  128|   219k|#define VIPS_SBUF_FETCH(S) ((S)->input_buffer[(S)->read_point++])
  ------------------
  472|   218k|			}
  473|   218k|		}
  474|       |
  475|      2|	return 0;
  476|     52|}
radiance.c:scanline_read_old:
  366|  2.41k|{
  367|  2.41k|	int rshift;
  368|       |
  369|  2.41k|	rshift = 0;
  370|       |
  371|  67.0k|	while (width > 0) {
  ------------------
  |  Branch (371:9): [True: 64.7k, False: 2.33k]
  ------------------
  372|  64.7k|		if (VIPS_SBUF_REQUIRE(sbuf, 4))
  ------------------
  |  |  123|  64.7k|#define VIPS_SBUF_REQUIRE(S, R) ( \
  |  |  ------------------
  |  |  |  Branch (123:33): [True: 80, False: 64.6k]
  |  |  ------------------
  |  |  124|  64.7k|	(S)->read_point + (R) <= (S)->chars_in_buffer \
  |  |  ------------------
  |  |  |  Branch (124:2): [True: 64.6k, False: 130]
  |  |  ------------------
  |  |  125|  64.7k|		? 0 \
  |  |  126|  64.7k|		: vips_sbuf_require((S), (R)))
  ------------------
  373|     80|			return -1;
  374|       |
  375|  64.6k|		scanline[0][RED] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  174|  64.6k|#define RED 0
  ------------------
              		scanline[0][RED] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  128|  64.6k|#define VIPS_SBUF_FETCH(S) ((S)->input_buffer[(S)->read_point++])
  ------------------
  376|  64.6k|		scanline[0][GRN] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  175|  64.6k|#define GRN 1
  ------------------
              		scanline[0][GRN] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  128|  64.6k|#define VIPS_SBUF_FETCH(S) ((S)->input_buffer[(S)->read_point++])
  ------------------
  377|  64.6k|		scanline[0][BLU] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  176|  64.6k|#define BLU 2
  ------------------
              		scanline[0][BLU] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  128|  64.6k|#define VIPS_SBUF_FETCH(S) ((S)->input_buffer[(S)->read_point++])
  ------------------
  378|  64.6k|		scanline[0][EXP] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  179|  64.6k|#define EXP 3	  /* exponent same for either format */
  ------------------
              		scanline[0][EXP] = VIPS_SBUF_FETCH(sbuf);
  ------------------
  |  |  128|  64.6k|#define VIPS_SBUF_FETCH(S) ((S)->input_buffer[(S)->read_point++])
  ------------------
  379|       |
  380|  64.6k|		if (scanline[0][RED] == 1 &&
  ------------------
  |  |  174|  64.6k|#define RED 0
  ------------------
  |  Branch (380:7): [True: 9.37k, False: 55.3k]
  ------------------
  381|  64.6k|			scanline[0][GRN] == 1 &&
  ------------------
  |  |  175|  9.37k|#define GRN 1
  ------------------
  |  Branch (381:4): [True: 6.86k, False: 2.50k]
  ------------------
  382|  64.6k|			scanline[0][BLU] == 1) {
  ------------------
  |  |  176|  6.86k|#define BLU 2
  ------------------
  |  Branch (382:4): [True: 5.54k, False: 1.32k]
  ------------------
  383|  5.54k|			guint i;
  384|       |
  385|  5.54k|			for (i = ((guint32) scanline[0][EXP] << rshift);
  ------------------
  |  |  179|  5.54k|#define EXP 3	  /* exponent same for either format */
  ------------------
  386|  84.4k|				 i > 0 && width > 0; i--) {
  ------------------
  |  Branch (386:6): [True: 80.6k, False: 3.83k]
  |  Branch (386:15): [True: 78.9k, False: 1.71k]
  ------------------
  387|  78.9k|				copycolr(scanline[0], scanline[-1]);
  ------------------
  |  |  189|  78.9k|#define copycolr(c1, c2) (c1[0] = c2[0], c1[1] = c2[1], \
  |  |  190|  78.9k|	c1[2] = c2[2], c1[3] = c2[3])
  ------------------
  388|  78.9k|				scanline += 1;
  389|  78.9k|				width -= 1;
  390|  78.9k|			}
  391|       |
  392|  5.54k|			rshift += 8;
  393|       |
  394|       |			/* This can happen with badly-formed input files.
  395|       |			 */
  396|  5.54k|			if (rshift > 24)
  ------------------
  |  Branch (396:8): [True: 0, False: 5.54k]
  ------------------
  397|      0|				return -1;
  398|  5.54k|		}
  399|  59.1k|		else {
  400|  59.1k|			scanline += 1;
  401|  59.1k|			width -= 1;
  402|  59.1k|			rshift = 0;
  403|  59.1k|		}
  404|  64.6k|	}
  405|       |
  406|  2.33k|	return 0;
  407|  2.41k|}

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|    461|{
   72|    461|	VipsForeignLoadRad *rad = (VipsForeignLoadRad *) gobject;
   73|       |
   74|    461|	VIPS_UNREF(rad->source);
  ------------------
  |  |   57|    461|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|    461|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|    461|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|    461|	{ \
  |  |  |  |   43|    461|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 461, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|    461|			(void) F((S)); \
  |  |  |  |   45|    461|			(S) = 0; \
  |  |  |  |   46|    461|		} \
  |  |  |  |   47|    461|	} \
  |  |  |  |   48|    461|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|    461|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   75|       |
   76|    461|	G_OBJECT_CLASS(vips_foreign_load_rad_parent_class)->dispose(gobject);
  ------------------
  |  |   58|    461|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|    461|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    461|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   77|    461|}
radload.c:vips_foreign_load_rad_get_flags:
   81|    461|{
   82|    461|	return VIPS_FOREIGN_SEQUENTIAL;
   83|    461|}
radload.c:vips_foreign_load_rad_header:
   93|    461|{
   94|    461|	VipsForeignLoadRad *rad = (VipsForeignLoadRad *) load;
   95|       |
   96|    461|	if (vips__rad_header(rad->source, load->out))
  ------------------
  |  Branch (96:6): [True: 243, False: 218]
  ------------------
   97|    243|		return -1;
   98|       |
   99|    218|	return 0;
  100|    461|}
radload.c:vips_foreign_load_rad_load:
  104|    190|{
  105|    190|	VipsForeignLoadRad *rad = (VipsForeignLoadRad *) load;
  106|       |
  107|    190|	if (vips__rad_load(rad->source, load->real))
  ------------------
  |  Branch (107:6): [True: 166, False: 24]
  ------------------
  108|    166|		return -1;
  109|       |
  110|     24|	return 0;
  111|    190|}
radload.c:vips_foreign_load_rad_init:
  144|    461|{
  145|    461|}
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|  5.40k|{
  182|  5.40k|	return vips__rad_israd(source);
  183|  5.40k|}
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|    461|{
  310|    461|	VipsForeignLoadRad *rad = (VipsForeignLoadRad *) object;
  311|    461|	VipsForeignLoadRadBuffer *buffer = (VipsForeignLoadRadBuffer *) object;
  312|       |
  313|    461|	if (buffer->blob &&
  ------------------
  |  Branch (313:6): [True: 461, False: 0]
  ------------------
  314|    461|		!(rad->source = vips_source_new_from_memory(
  ------------------
  |  Branch (314:3): [True: 0, False: 461]
  ------------------
  315|    461|			  VIPS_AREA(buffer->blob)->data,
  ------------------
  |  |  137|    461|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  316|    461|			  VIPS_AREA(buffer->blob)->length)))
  ------------------
  |  |  137|    461|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  317|      0|		return -1;
  318|       |
  319|    461|	if (VIPS_OBJECT_CLASS(vips_foreign_load_rad_file_parent_class)->build(object))
  ------------------
  |  |  435|    461|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|    461|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    461|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (319:6): [True: 243, False: 218]
  ------------------
  320|    243|		return -1;
  321|       |
  322|    218|	return 0;
  323|    461|}
radload.c:vips_foreign_load_rad_buffer_is_a_buffer:
  327|  5.40k|{
  328|  5.40k|	VipsSource *source;
  329|  5.40k|	gboolean result;
  330|       |
  331|  5.40k|	if (!(source = vips_source_new_from_memory(buf, len)))
  ------------------
  |  Branch (331:6): [True: 0, False: 5.40k]
  ------------------
  332|      0|		return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  333|  5.40k|	result = vips_foreign_load_rad_source_is_a_source(source);
  334|  5.40k|	VIPS_UNREF(source);
  ------------------
  |  |   57|  5.40k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  5.40k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  5.40k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  5.40k|	{ \
  |  |  |  |   43|  5.40k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 5.40k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  5.40k|			(void) F((S)); \
  |  |  |  |   45|  5.40k|			(S) = 0; \
  |  |  |  |   46|  5.40k|		} \
  |  |  |  |   47|  5.40k|	} \
  |  |  |  |   48|  5.40k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  5.40k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  335|       |
  336|  5.40k|	return result;
  337|  5.40k|}
radload.c:vips_foreign_load_rad_buffer_init:
  365|    461|{
  366|    461|}

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|  2.41k|{
   91|  2.41k|	VipsForeignLoadPng *png = (VipsForeignLoadPng *) gobject;
   92|       |
   93|  2.41k|	VIPS_FREEF(spng_ctx_free, png->ctx);
  ------------------
  |  |   41|  2.41k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.41k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  2.41k|	{ \
  |  |   43|  2.41k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 2.41k, False: 0]
  |  |  ------------------
  |  |   44|  2.41k|			(void) F((S)); \
  |  |   45|  2.41k|			(S) = 0; \
  |  |   46|  2.41k|		} \
  |  |   47|  2.41k|	} \
  |  |   48|  2.41k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.41k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   94|  2.41k|	VIPS_UNREF(png->source);
  ------------------
  |  |   57|  2.41k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  2.41k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  2.41k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  2.41k|	{ \
  |  |  |  |   43|  2.41k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 2.41k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  2.41k|			(void) F((S)); \
  |  |  |  |   45|  2.41k|			(S) = 0; \
  |  |  |  |   46|  2.41k|		} \
  |  |  |  |   47|  2.41k|	} \
  |  |  |  |   48|  2.41k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  2.41k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   95|       |
   96|  2.41k|	G_OBJECT_CLASS(vips_foreign_load_png_parent_class)->dispose(gobject);
  ------------------
  |  |   58|  2.41k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  2.41k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  2.41k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   97|  2.41k|}
spngload.c:vips_foreign_load_png_get_flags_source:
  123|  2.41k|{
  124|  2.41k|	spng_ctx *ctx;
  125|  2.41k|	struct spng_ihdr ihdr;
  126|  2.41k|	VipsForeignFlags flags;
  127|       |
  128|  2.41k|	ctx = spng_ctx_new(SPNG_CTX_IGNORE_ADLER32);
  129|  2.41k|	spng_set_crc_action(ctx, SPNG_CRC_USE, SPNG_CRC_USE);
  130|  2.41k|	if (vips_source_rewind(source))
  ------------------
  |  Branch (130:6): [True: 0, False: 2.41k]
  ------------------
  131|      0|		return 0;
  132|  2.41k|	spng_set_png_stream(ctx,
  133|  2.41k|		vips_foreign_load_png_stream, source);
  134|  2.41k|	if (spng_get_ihdr(ctx, &ihdr)) {
  ------------------
  |  Branch (134:6): [True: 160, False: 2.25k]
  ------------------
  135|    160|		spng_ctx_free(ctx);
  136|    160|		return 0;
  137|    160|	}
  138|  2.25k|	spng_ctx_free(ctx);
  139|       |
  140|  2.25k|	flags = 0;
  141|  2.25k|	if (ihdr.interlace_method != SPNG_INTERLACE_NONE)
  ------------------
  |  Branch (141:6): [True: 417, False: 1.83k]
  ------------------
  142|    417|		flags |= VIPS_FOREIGN_PARTIAL;
  143|  1.83k|	else
  144|  1.83k|		flags |= VIPS_FOREIGN_SEQUENTIAL;
  145|       |
  146|  2.25k|	return flags;
  147|  2.41k|}
spngload.c:vips_foreign_load_png_stream:
  102|   107k|{
  103|   107k|	VipsSource *source = VIPS_SOURCE(user);
  ------------------
  |  |  106|   107k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  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)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  107|   107k|		VIPS_TYPE_SOURCE, VipsSource))
  ------------------
  104|       |
  105|   206k|	while (length > 0) {
  ------------------
  |  Branch (105:9): [True: 108k, False: 98.2k]
  ------------------
  106|   108k|		gint64 bytes_read;
  107|       |
  108|   108k|		bytes_read = vips_source_read(source, dest, length);
  109|   108k|		if (bytes_read < 0)
  ------------------
  |  Branch (109:7): [True: 0, False: 108k]
  ------------------
  110|      0|			return SPNG_IO_ERROR;
  111|   108k|		if (bytes_read == 0)
  ------------------
  |  Branch (111:7): [True: 9.28k, False: 99.3k]
  ------------------
  112|  9.28k|			return SPNG_IO_EOF;
  113|       |
  114|  99.3k|		dest = (char *) dest + bytes_read;
  115|  99.3k|		length -= bytes_read;
  116|  99.3k|	}
  117|       |
  118|  98.2k|	return 0;
  119|   107k|}
spngload.c:vips_foreign_load_png_get_flags:
  151|  2.41k|{
  152|  2.41k|	VipsForeignLoadPng *png = (VipsForeignLoadPng *) load;
  153|       |
  154|  2.41k|	return vips_foreign_load_png_get_flags_source(png->source);
  155|  2.41k|}
spngload.c:vips_foreign_load_png_header:
  332|  2.41k|{
  333|  2.41k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(load);
  ------------------
  |  |  441|  2.41k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  2.41k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  2.41k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  334|  2.41k|	VipsForeignLoadPng *png = (VipsForeignLoadPng *) load;
  335|       |
  336|  2.41k|	int flags;
  337|  2.41k|	int error;
  338|  2.41k|	struct spng_trns trns;
  339|       |
  340|       |	/* In non-fail mode, ignore CRC errors.
  341|       |	 */
  342|  2.41k|	flags = 0;
  343|  2.41k|	if (load->fail_on < VIPS_FAIL_ON_ERROR)
  ------------------
  |  Branch (343:6): [True: 2.41k, False: 0]
  ------------------
  344|  2.41k|		flags |= SPNG_CTX_IGNORE_ADLER32;
  345|  2.41k|	png->ctx = spng_ctx_new(flags);
  346|  2.41k|	if (load->fail_on < VIPS_FAIL_ON_ERROR)
  ------------------
  |  Branch (346:6): [True: 2.41k, False: 0]
  ------------------
  347|       |		/* Ignore and don't calculate checksums.
  348|       |		 */
  349|  2.41k|		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|  2.41k|	if (!png->unlimited) {
  ------------------
  |  Branch (357:6): [True: 2.41k, False: 0]
  ------------------
  358|  2.41k|		spng_set_image_limits(png->ctx,
  359|  2.41k|			VIPS_MAX_COORD, VIPS_MAX_COORD);
  ------------------
  |  |   69|  2.41k|#define VIPS_MAX_COORD (vips_max_coord_get())
  ------------------
              			VIPS_MAX_COORD, VIPS_MAX_COORD);
  ------------------
  |  |   69|  2.41k|#define VIPS_MAX_COORD (vips_max_coord_get())
  ------------------
  360|  2.41k|		spng_set_chunk_limits(png->ctx,
  361|  2.41k|			60 * 1024 * 1024, 60 * 1024 * 1024);
  362|  2.41k|	}
  363|       |
  364|  2.41k|	if (vips_source_rewind(png->source))
  ------------------
  |  Branch (364:6): [True: 0, False: 2.41k]
  ------------------
  365|      0|		return -1;
  366|  2.41k|	spng_set_png_stream(png->ctx,
  367|  2.41k|		vips_foreign_load_png_stream, png->source);
  368|  2.41k|	if ((error = spng_get_ihdr(png->ctx, &png->ihdr))) {
  ------------------
  |  Branch (368:6): [True: 186, False: 2.22k]
  ------------------
  369|    186|		vips_error(class->nickname, "%s", spng_strerror(error));
  370|    186|		return -1;
  371|    186|	}
  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|  2.22k|	png->fmt = SPNG_FMT_PNG;
  386|       |
  387|  2.22k|	switch (png->ihdr.color_type) {
  388|    651|	case SPNG_COLOR_TYPE_INDEXED:
  ------------------
  |  Branch (388:2): [True: 651, False: 1.57k]
  ------------------
  389|    651|		png->bands = 3;
  390|    651|		break;
  391|       |
  392|     83|	case SPNG_COLOR_TYPE_GRAYSCALE_ALPHA:
  ------------------
  |  Branch (392:2): [True: 83, False: 2.14k]
  ------------------
  393|    708|	case SPNG_COLOR_TYPE_GRAYSCALE:
  ------------------
  |  Branch (393:2): [True: 625, False: 1.60k]
  ------------------
  394|    708|		png->bands = 1;
  395|    708|		break;
  396|       |
  397|    398|	case SPNG_COLOR_TYPE_TRUECOLOR:
  ------------------
  |  Branch (397:2): [True: 398, False: 1.82k]
  ------------------
  398|    868|	case SPNG_COLOR_TYPE_TRUECOLOR_ALPHA:
  ------------------
  |  Branch (398:2): [True: 470, False: 1.75k]
  ------------------
  399|    868|		png->bands = 3;
  400|    868|		break;
  401|       |
  402|      0|	default:
  ------------------
  |  Branch (402:2): [True: 0, False: 2.22k]
  ------------------
  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|  2.22k|	}
  406|       |
  407|       |	/* Set libvips format and interpretation.
  408|       |	 */
  409|  2.22k|	if (png->ihdr.bit_depth > 8) {
  ------------------
  |  Branch (409:6): [True: 546, False: 1.68k]
  ------------------
  410|    546|		if (png->bands < 3)
  ------------------
  |  Branch (410:7): [True: 294, False: 252]
  ------------------
  411|    294|			png->interpretation = VIPS_INTERPRETATION_GREY16;
  412|    252|		else
  413|    252|			png->interpretation = VIPS_INTERPRETATION_RGB16;
  414|       |
  415|    546|		png->format = VIPS_FORMAT_USHORT;
  416|    546|	}
  417|  1.68k|	else {
  418|  1.68k|		if (png->bands < 3)
  ------------------
  |  Branch (418:7): [True: 414, False: 1.26k]
  ------------------
  419|    414|			png->interpretation = VIPS_INTERPRETATION_B_W;
  420|  1.26k|		else
  421|  1.26k|			png->interpretation = VIPS_INTERPRETATION_sRGB;
  422|       |
  423|  1.68k|		png->format = VIPS_FORMAT_UCHAR;
  424|  1.68k|	}
  425|       |
  426|       |	/* Expand palette images.
  427|       |	 */
  428|  2.22k|	if (png->ihdr.color_type == SPNG_COLOR_TYPE_INDEXED)
  ------------------
  |  Branch (428:6): [True: 651, False: 1.57k]
  ------------------
  429|    651|		png->fmt = SPNG_FMT_RGB8;
  430|       |
  431|       |	/* Expand <8 bit images to full bytes.
  432|       |	 */
  433|  2.22k|	if (png->ihdr.color_type == SPNG_COLOR_TYPE_GRAYSCALE &&
  ------------------
  |  Branch (433:6): [True: 625, False: 1.60k]
  ------------------
  434|  2.22k|		png->ihdr.bit_depth < 8)
  ------------------
  |  Branch (434:3): [True: 328, False: 297]
  ------------------
  435|    328|		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|  2.22k|	error = spng_get_trns(png->ctx, &trns);
  442|  2.22k|	if (error &&
  ------------------
  |  Branch (442:6): [True: 2.14k, False: 83]
  ------------------
  443|  2.22k|		error != SPNG_ECHUNKAVAIL) {
  ------------------
  |  Branch (443:3): [True: 1.64k, False: 500]
  ------------------
  444|  1.64k|		vips_error(class->nickname, "%s", spng_strerror(error));
  445|  1.64k|		return -1;
  446|  1.64k|	}
  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|    583|	if (png->ihdr.color_type == SPNG_COLOR_TYPE_GRAYSCALE_ALPHA ||
  ------------------
  |  Branch (457:6): [True: 18, False: 565]
  ------------------
  458|    583|		png->ihdr.color_type == SPNG_COLOR_TYPE_TRUECOLOR_ALPHA)
  ------------------
  |  Branch (458:3): [True: 183, False: 382]
  ------------------
  459|    201|		png->bands += 1;
  460|    382|	else if (!spng_get_trns(png->ctx, &trns)) {
  ------------------
  |  Branch (460:11): [True: 83, False: 299]
  ------------------
  461|     83|		png->bands += 1;
  462|       |
  463|     83|		if (png->ihdr.color_type == SPNG_COLOR_TYPE_TRUECOLOR) {
  ------------------
  |  Branch (463:7): [True: 47, False: 36]
  ------------------
  464|     47|			if (png->ihdr.bit_depth == 16)
  ------------------
  |  Branch (464:8): [True: 29, False: 18]
  ------------------
  465|     29|				png->fmt = SPNG_FMT_RGBA16;
  466|     18|			else
  467|     18|				png->fmt = SPNG_FMT_RGBA8;
  468|     47|		}
  469|     36|		else if (png->ihdr.color_type == SPNG_COLOR_TYPE_INDEXED)
  ------------------
  |  Branch (469:12): [True: 14, False: 22]
  ------------------
  470|     14|			png->fmt = SPNG_FMT_RGBA8;
  471|     22|		else if (png->ihdr.color_type == SPNG_COLOR_TYPE_GRAYSCALE) {
  ------------------
  |  Branch (471:12): [True: 22, False: 0]
  ------------------
  472|     22|			if (png->ihdr.bit_depth == 16)
  ------------------
  |  Branch (472:8): [True: 20, False: 2]
  ------------------
  473|     20|				png->fmt = SPNG_FMT_GA16;
  474|      2|			else
  475|      2|				png->fmt = SPNG_FMT_GA8;
  476|     22|		}
  477|     83|	}
  478|       |
  479|    583|	vips_source_minimise(png->source);
  480|       |
  481|    583|	if (vips_foreign_load_png_set_header(png, load->out))
  ------------------
  |  Branch (481:6): [True: 0, False: 583]
  ------------------
  482|      0|		return -1;
  483|       |
  484|    583|	return 0;
  485|    583|}
spngload.c:vips_foreign_load_png_set_header:
  207|  1.14k|{
  208|  1.14k|	double xres, yres;
  209|  1.14k|	struct spng_iccp iccp;
  210|  1.14k|	struct spng_exif exif;
  211|  1.14k|	struct spng_phys phys;
  212|  1.14k|	struct spng_bkgd bkgd;
  213|  1.14k|	guint32 n_text;
  214|       |
  215|       |	/* Get resolution. Default to 72 pixels per inch.
  216|       |	 */
  217|  1.14k|	xres = 72.0 / 25.4;
  218|  1.14k|	yres = 72.0 / 25.4;
  219|  1.14k|	if (!spng_get_phys(png->ctx, &phys)) {
  ------------------
  |  Branch (219:6): [True: 132, False: 1.01k]
  ------------------
  220|       |		/* unit 1 means pixels per metre, otherwise unspecified.
  221|       |		 */
  222|    132|		xres = phys.unit_specifier == 1
  ------------------
  |  Branch (222:10): [True: 121, False: 11]
  ------------------
  223|    132|			? phys.ppu_x / 1000.0
  224|    132|			: phys.ppu_x;
  225|    132|		yres = phys.unit_specifier == 1
  ------------------
  |  Branch (225:10): [True: 121, False: 11]
  ------------------
  226|    132|			? phys.ppu_y / 1000.0
  227|    132|			: phys.ppu_y;
  228|    132|	}
  229|       |
  230|  1.14k|	vips_image_init_fields(image,
  231|  1.14k|		png->ihdr.width, png->ihdr.height, png->bands,
  232|  1.14k|		png->format, VIPS_CODING_NONE, png->interpretation,
  233|  1.14k|		xres, yres);
  234|       |
  235|  1.14k|	VIPS_SETSTR(image->filename,
  ------------------
  |  |   53|  1.14k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.14k|#define G_STMT_START  do
  |  |  ------------------
  |  |   54|  1.14k|	{ \
  |  |   55|  1.14k|		const char *sst = (V); \
  |  |   56|  1.14k|		\
  |  |   57|  1.14k|		if ((S) != sst) { \
  |  |  ------------------
  |  |  |  Branch (57:7): [True: 1.14k, False: 0]
  |  |  ------------------
  |  |   58|  1.14k|			if (!(S) || !sst || strcmp((S), sst) != 0) { \
  |  |  ------------------
  |  |  |  Branch (58:8): [True: 0, False: 1.14k]
  |  |  |  Branch (58:16): [True: 1.14k, False: 0]
  |  |  |  Branch (58:24): [True: 0, False: 0]
  |  |  ------------------
  |  |   59|  1.14k|				VIPS_FREE(S); \
  |  |  ------------------
  |  |  |  |   50|  1.14k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  |  |  ------------------
  |  |  |  |  |  |   41|  1.14k|	G_STMT_START \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  854|  1.14k|#define G_STMT_START  do
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   42|  1.14k|	{ \
  |  |  |  |  |  |   43|  1.14k|		if (S) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (43:7): [True: 1.14k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   44|  1.14k|			(void) F((S)); \
  |  |  |  |  |  |   45|  1.14k|			(S) = 0; \
  |  |  |  |  |  |   46|  1.14k|		} \
  |  |  |  |  |  |   47|  1.14k|	} \
  |  |  |  |  |  |   48|  1.14k|	G_STMT_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  862|  1.14k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   60|  1.14k|				if (sst) \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 0, False: 1.14k]
  |  |  ------------------
  |  |   61|  1.14k|					(S) = g_strdup(sst); \
  |  |   62|  1.14k|			} \
  |  |   63|  1.14k|		} \
  |  |   64|  1.14k|	} \
  |  |   65|  1.14k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.14k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  236|  1.14k|		vips_connection_filename(VIPS_CONNECTION(png->source)));
  237|       |
  238|  1.14k|	if (vips_image_pipelinev(image, VIPS_DEMAND_STYLE_THINSTRIP, NULL))
  ------------------
  |  Branch (238:6): [True: 0, False: 1.14k]
  ------------------
  239|      0|		return -1;
  240|       |
  241|  1.14k|	if (!spng_get_iccp(png->ctx, &iccp))
  ------------------
  |  Branch (241:6): [True: 7, False: 1.13k]
  ------------------
  242|      7|		vips_image_set_blob_copy(image,
  243|      7|			VIPS_META_ICC_NAME, iccp.profile, iccp.profile_len);
  ------------------
  |  |   78|      7|#define VIPS_META_ICC_NAME "icc-profile-data"
  ------------------
  244|       |
  245|  1.14k|	if (!spng_get_text(png->ctx, NULL, &n_text)) {
  ------------------
  |  Branch (245:6): [True: 12, False: 1.13k]
  ------------------
  246|     12|		struct spng_text *text;
  247|       |
  248|       |		/* Very large numbers of text chunks are used in DoS
  249|       |		 * attacks.
  250|       |		 */
  251|     12|		if (!png->unlimited && n_text > MAX_PNG_TEXT_CHUNKS) {
  ------------------
  |  |   40|     12|#define MAX_PNG_TEXT_CHUNKS 50
  ------------------
  |  Branch (251:7): [True: 12, False: 0]
  |  Branch (251:26): [True: 0, False: 12]
  ------------------
  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|     12|		text = VIPS_ARRAY(VIPS_OBJECT(png),
  ------------------
  |  |   72|     12|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|     12|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|     12|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|     12|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|     12|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  258|     12|			n_text, struct spng_text);
  259|     12|		if (!spng_get_text(png->ctx, text, &n_text)) {
  ------------------
  |  Branch (259:7): [True: 12, False: 0]
  ------------------
  260|     12|			guint32 i;
  261|       |
  262|     50|			for (i = 0; i < n_text; i++)
  ------------------
  |  Branch (262:16): [True: 38, False: 12]
  ------------------
  263|       |				/* .text is always a null-terminated C string.
  264|       |				 */
  265|     38|				vips_foreign_load_png_set_text(image,
  266|     38|					i, text[i].keyword, text[i].text);
  267|     12|		}
  268|     12|	}
  269|       |
  270|  1.14k|	if (!spng_get_exif(png->ctx, &exif))
  ------------------
  |  Branch (270:6): [True: 0, False: 1.14k]
  ------------------
  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|  1.14k|	vips_image_set_int(image, VIPS_META_BITS_PER_SAMPLE,
  ------------------
  |  |  100|  1.14k|#define VIPS_META_BITS_PER_SAMPLE "bits-per-sample"
  ------------------
  275|  1.14k|		png->ihdr.bit_depth);
  276|       |
  277|  1.14k|	if (png->ihdr.color_type == SPNG_COLOR_TYPE_INDEXED) {
  ------------------
  |  Branch (277:6): [True: 137, False: 1.00k]
  ------------------
  278|       |		/* Deprecated "palette-bit-depth" use "bits-per-sample" instead.
  279|       |		 */
  280|    137|		vips_image_set_int(image,
  281|    137|			"palette-bit-depth", png->ihdr.bit_depth);
  282|       |
  283|    137|		vips_image_set_int(image, VIPS_META_PALETTE, 1);
  ------------------
  |  |  107|    137|#define VIPS_META_PALETTE "palette"
  ------------------
  284|    137|	}
  285|       |
  286|       |	/* Let our caller know. These are very expensive to decode.
  287|       |	 */
  288|  1.14k|	if (png->ihdr.interlace_method != SPNG_INTERLACE_NONE)
  ------------------
  |  Branch (288:6): [True: 320, False: 823]
  ------------------
  289|    320|		vips_image_set_int(image, "interlaced", 1);
  290|       |
  291|  1.14k|	if (!spng_get_bkgd(png->ctx, &bkgd)) {
  ------------------
  |  Branch (291:6): [True: 133, False: 1.01k]
  ------------------
  292|    133|		const int scale =
  293|    133|			image->BandFmt == VIPS_FORMAT_UCHAR ? 1 : 256;
  ------------------
  |  Branch (293:4): [True: 132, False: 1]
  ------------------
  294|       |
  295|    133|		double array[3];
  296|    133|		int n;
  297|       |
  298|    133|		switch (png->ihdr.color_type) {
  299|      3|		case SPNG_COLOR_TYPE_GRAYSCALE:
  ------------------
  |  Branch (299:3): [True: 3, False: 130]
  ------------------
  300|      3|		case SPNG_COLOR_TYPE_GRAYSCALE_ALPHA:
  ------------------
  |  Branch (300:3): [True: 0, False: 133]
  ------------------
  301|      3|			array[0] = bkgd.gray / scale;
  302|      3|			n = 1;
  303|      3|			break;
  304|       |
  305|     31|		case SPNG_COLOR_TYPE_TRUECOLOR:
  ------------------
  |  Branch (305:3): [True: 31, False: 102]
  ------------------
  306|     36|		case SPNG_COLOR_TYPE_TRUECOLOR_ALPHA:
  ------------------
  |  Branch (306:3): [True: 5, False: 128]
  ------------------
  307|     36|			array[0] = bkgd.red / scale;
  308|     36|			array[1] = bkgd.green / scale;
  309|     36|			array[2] = bkgd.blue / scale;
  310|     36|			n = 3;
  311|     36|			break;
  312|       |
  313|     94|		case SPNG_COLOR_TYPE_INDEXED:
  ------------------
  |  Branch (313:3): [True: 94, False: 39]
  ------------------
  314|     94|		default:
  ------------------
  |  Branch (314:3): [True: 0, False: 133]
  ------------------
  315|       |			/* Not sure what to do here. I suppose we should read
  316|       |			 * the palette.
  317|       |			 */
  318|     94|			n = 0;
  319|     94|			break;
  320|    133|		}
  321|       |
  322|    133|		if (n > 0)
  ------------------
  |  Branch (322:7): [True: 39, False: 94]
  ------------------
  323|     39|			vips_image_set_array_double(image, "background",
  324|     39|				array, n);
  325|    133|	}
  326|       |
  327|  1.14k|	return 0;
  328|  1.14k|}
spngload.c:vips_foreign_load_png_set_text:
  177|     38|{
  178|       |#ifdef DEBUG
  179|       |	printf("vips_foreign_load_png_set_text: key %s, value %s\n",
  180|       |		key, value);
  181|       |#endif /*DEBUG*/
  182|       |
  183|     38|	if (strcmp(key, "XML:com.adobe.xmp") == 0) {
  ------------------
  |  Branch (183:6): [True: 0, False: 38]
  ------------------
  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|     38|	else {
  194|     38|		char name[256];
  195|       |
  196|       |		/* Save as a string comment. Some PNGs have EXIF data as
  197|       |		 * text segments, unfortunately.
  198|       |		 */
  199|     38|		g_snprintf(name, 256, "png-comment-%d-%s", i, key);
  200|       |
  201|     38|		vips_image_set_string(out, name, value);
  202|     38|	}
  203|     38|}
spngload.c:vips_foreign_load_png_load:
  575|    560|{
  576|    560|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(load);
  ------------------
  |  |  441|    560|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|    560|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|    560|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  577|    560|	VipsForeignLoadPng *png = (VipsForeignLoadPng *) load;
  578|    560|	VipsImage **t = (VipsImage **)
  579|    560|		vips_object_local_array(VIPS_OBJECT(load), 3);
  ------------------
  |  |  433|    560|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|    560|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    560|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  580|       |
  581|    560|	enum spng_decode_flags flags;
  582|    560|	int error;
  583|       |
  584|    560|	if (vips_source_decode(png->source))
  ------------------
  |  Branch (584:6): [True: 0, False: 560]
  ------------------
  585|      0|		return -1;
  586|       |
  587|       |	/* Decode transparency, if available.
  588|       |	 */
  589|    560|	flags = SPNG_DECODE_TRNS;
  590|       |
  591|    560|	if (png->ihdr.interlace_method != SPNG_INTERLACE_NONE) {
  ------------------
  |  Branch (591:6): [True: 154, False: 406]
  ------------------
  592|       |		/* Arg awful interlaced image. We have to load to a huge mem
  593|       |		 * buffer, then copy to out.
  594|       |		 */
  595|    154|		t[0] = vips_image_new_memory();
  596|    154|		if (vips_foreign_load_png_set_header(png, t[0]) ||
  ------------------
  |  Branch (596:7): [True: 0, False: 154]
  ------------------
  597|    154|			vips_image_write_prepare(t[0]))
  ------------------
  |  Branch (597:4): [True: 0, False: 154]
  ------------------
  598|      0|			return -1;
  599|       |
  600|    154|		if ((error = spng_decode_image(png->ctx,
  ------------------
  |  Branch (600:7): [True: 145, False: 9]
  ------------------
  601|    154|				 VIPS_IMAGE_ADDR(t[0], 0, 0),
  ------------------
  |  |  418|    154|	((I)->data + \
  |  |  419|    154|		(Y) *VIPS_IMAGE_SIZEOF_LINE(I) + \
  |  |  ------------------
  |  |  |  |  386|    154|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|    154|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|    154|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  420|    154|		(X) *VIPS_IMAGE_SIZEOF_PEL(I))
  |  |  ------------------
  |  |  |  |  384|    154|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  ------------------
  |  |  |  |  |  |  382|    154|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  602|    154|				 VIPS_IMAGE_SIZEOF_IMAGE(t[0]),
  ------------------
  |  |  388|    154|	(VIPS_IMAGE_SIZEOF_LINE(I) * (I)->Ysize)
  |  |  ------------------
  |  |  |  |  386|    154|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|    154|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|    154|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  603|    154|				 png->fmt, flags))) {
  604|    145|			vips_error(class->nickname,
  605|    145|				"%s", spng_strerror(error));
  606|    145|			return -1;
  607|    145|		}
  608|       |
  609|       |		/* We've now finished reading the file.
  610|       |		 */
  611|      9|		vips_source_minimise(png->source);
  612|       |
  613|      9|		if (vips_image_write(t[0], load->real))
  ------------------
  |  Branch (613:7): [True: 0, False: 9]
  ------------------
  614|      0|			return -1;
  615|      9|	}
  616|    406|	else {
  617|    406|		t[0] = vips_image_new();
  618|       |
  619|    406|		if (vips_foreign_load_png_set_header(png, t[0]))
  ------------------
  |  Branch (619:7): [True: 0, False: 406]
  ------------------
  620|      0|			return -1;
  621|       |
  622|       |		/* We can decode these progressively.
  623|       |		 */
  624|    406|		flags |= SPNG_DECODE_PROGRESSIVE;
  625|       |
  626|    406|		if ((error = spng_decode_image(png->ctx, NULL, 0,
  ------------------
  |  Branch (626:7): [True: 81, False: 325]
  ------------------
  627|    406|				 png->fmt, flags))) {
  628|     81|			vips_error(class->nickname,
  629|     81|				"%s", spng_strerror(error));
  630|     81|			return -1;
  631|     81|		}
  632|       |
  633|       |		/* Close input immediately at end of read.
  634|       |		 */
  635|    325|		g_signal_connect(t[0], "minimise",
  ------------------
  |  |  491|    325|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  636|    325|			G_CALLBACK(vips_foreign_load_png_minimise), png);
  637|       |
  638|    325|		if (vips_image_generate(t[0],
  ------------------
  |  Branch (638:7): [True: 0, False: 325]
  ------------------
  639|    325|				NULL, vips_foreign_load_png_generate, NULL,
  640|    325|				png, NULL) ||
  641|    325|			vips_sequential(t[0], &t[1],
  ------------------
  |  Branch (641:4): [True: 0, False: 325]
  ------------------
  642|    325|				"tile_height", VIPS__FATSTRIP_HEIGHT,
  ------------------
  |  |  161|    325|#define VIPS__FATSTRIP_HEIGHT (16)
  ------------------
  643|    325|				NULL) ||
  644|    325|			vips_image_write(t[1], load->real))
  ------------------
  |  Branch (644:4): [True: 0, False: 325]
  ------------------
  645|      0|			return -1;
  646|    325|	}
  647|       |
  648|    334|	return 0;
  649|    560|}
spngload.c:vips_foreign_load_png_minimise:
  489|    650|{
  490|    650|	vips_source_minimise(png->source);
  491|    650|}
spngload.c:vips_foreign_load_png_generate:
  496|  1.88k|{
  497|  1.88k|	VipsRect *r = &out_region->valid;
  498|  1.88k|	VipsForeignLoad *load = VIPS_FOREIGN_LOAD(a);
  ------------------
  |  |  133|  1.88k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  1.88k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.88k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|  1.88k|		VIPS_TYPE_FOREIGN_LOAD, VipsForeignLoad))
  ------------------
  499|  1.88k|	VipsForeignLoadPng *png = (VipsForeignLoadPng *) load;
  500|  1.88k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(png);
  ------------------
  |  |  441|  1.88k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  1.88k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  1.88k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  501|       |
  502|  1.88k|	int y;
  503|  1.88k|	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|  1.88k|	g_assert(r->left == 0);
  ------------------
  |  |  166|  1.88k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  1.88k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.88k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  515|  1.88k|	g_assert(r->width == out_region->im->Xsize);
  ------------------
  |  |  166|  1.88k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  1.88k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.88k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  516|  1.88k|	g_assert(VIPS_RECT_BOTTOM(r) <= out_region->im->Ysize);
  ------------------
  |  |  166|  1.88k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  1.88k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.88k|#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|  1.88k|	g_assert(r->height ==
  ------------------
  |  |  166|  1.88k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  1.88k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.88k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  522|  1.88k|		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|  1.88k|	if (r->top != png->y_pos) {
  ------------------
  |  Branch (527:6): [True: 0, False: 1.88k]
  ------------------
  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|  28.9k|	for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (533:14): [True: 27.0k, False: 1.88k]
  ------------------
  534|       |		/* libspng returns EOI when successfully reading the
  535|       |		 * final line of input.
  536|       |		 */
  537|  27.0k|		error = spng_decode_row(png->ctx,
  538|  27.0k|			VIPS_REGION_ADDR(out_region, 0, r->top + y),
  ------------------
  |  |  227|  27.0k|	((R)->data + \
  |  |  228|  27.0k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  27.0k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  27.0k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  27.0k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  27.0k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  27.0k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  539|  27.0k|			VIPS_REGION_SIZEOF_LINE(out_region));
  ------------------
  |  |  203|  27.0k|	((size_t) ((R)->valid.width * VIPS_REGION_SIZEOF_PEL(R)))
  |  |  ------------------
  |  |  |  |  201|  27.0k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  27.0k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  27.0k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  540|  27.0k|		if (error != 0 &&
  ------------------
  |  Branch (540:7): [True: 9.83k, False: 17.2k]
  ------------------
  541|  27.0k|			error != SPNG_EOI) {
  ------------------
  |  Branch (541:4): [True: 9.81k, False: 25]
  ------------------
  542|       |			/* We've failed to read some pixels. Knock this
  543|       |			 * operation out of cache.
  544|       |			 */
  545|  9.81k|			vips_operation_invalidate(VIPS_OPERATION(png));
  ------------------
  |  |   57|  9.81k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  9.81k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  9.81k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   58|  9.81k|		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|  9.81k|			g_warning("%s: %s",
  ------------------
  |  |  338|  9.81k|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|  9.81k|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|  9.81k|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|  9.81k|                               __VA_ARGS__)
  ------------------
  556|  9.81k|				class->nickname, spng_strerror(error));
  557|       |
  558|       |			/* And bail if trunc is on.
  559|       |			 */
  560|  9.81k|			if (load->fail_on >= VIPS_FAIL_ON_TRUNCATED) {
  ------------------
  |  Branch (560:8): [True: 0, False: 9.81k]
  ------------------
  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|  9.81k|		}
  566|       |
  567|  27.0k|		png->y_pos += 1;
  568|  27.0k|	}
  569|       |
  570|  1.88k|	return 0;
  571|  1.88k|}
spngload.c:vips_foreign_load_png_init:
  688|  2.41k|{
  689|  2.41k|}
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|  32.5k|{
  726|  32.5k|	static unsigned char signature[8] = { 137, 80, 78, 71, 13, 10, 26, 10 };
  727|       |
  728|  32.5k|	const unsigned char *p;
  729|       |
  730|  32.5k|	if ((p = vips_source_sniff(source, 8)) &&
  ------------------
  |  Branch (730:6): [True: 32.3k, False: 272]
  ------------------
  731|  32.5k|		memcmp(p, signature, 8) == 0)
  ------------------
  |  Branch (731:3): [True: 2.41k, False: 29.9k]
  ------------------
  732|  2.41k|		return TRUE;
  ------------------
  |  |  798|  2.41k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  2.41k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  733|       |
  734|  30.1k|	return FALSE;
  ------------------
  |  |  794|  30.1k|#define	FALSE	(0)
  ------------------
  735|  32.5k|}
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|  2.41k|{
  864|  2.41k|	VipsForeignLoadPng *png = (VipsForeignLoadPng *) object;
  865|  2.41k|	VipsForeignLoadPngBuffer *buffer = (VipsForeignLoadPngBuffer *) object;
  866|       |
  867|  2.41k|	if (buffer->blob &&
  ------------------
  |  Branch (867:6): [True: 2.41k, False: 0]
  ------------------
  868|  2.41k|		!(png->source = vips_source_new_from_memory(
  ------------------
  |  Branch (868:3): [True: 0, False: 2.41k]
  ------------------
  869|  2.41k|			  VIPS_AREA(buffer->blob)->data,
  ------------------
  |  |  137|  2.41k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  870|  2.41k|			  VIPS_AREA(buffer->blob)->length)))
  ------------------
  |  |  137|  2.41k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  871|      0|		return -1;
  872|       |
  873|  2.41k|	if (VIPS_OBJECT_CLASS(vips_foreign_load_png_buffer_parent_class)
  ------------------
  |  |  435|  2.41k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  2.41k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  2.41k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (873:6): [True: 1.83k, False: 583]
  ------------------
  874|  2.41k|			->build(object))
  875|  1.83k|		return -1;
  876|       |
  877|    583|	return 0;
  878|  2.41k|}
spngload.c:vips_foreign_load_png_buffer_is_a_buffer:
  882|  32.5k|{
  883|  32.5k|	VipsSource *source;
  884|  32.5k|	gboolean result;
  885|       |
  886|  32.5k|	if (!(source = vips_source_new_from_memory(buf, len)))
  ------------------
  |  Branch (886:6): [True: 0, False: 32.5k]
  ------------------
  887|      0|		return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  888|  32.5k|	result = vips_foreign_load_png_source_is_a_source(source);
  889|  32.5k|	VIPS_UNREF(source);
  ------------------
  |  |   57|  32.5k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  32.5k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  32.5k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  32.5k|	{ \
  |  |  |  |   43|  32.5k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 32.5k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  32.5k|			(void) F((S)); \
  |  |  |  |   45|  32.5k|			(S) = 0; \
  |  |  |  |   46|  32.5k|		} \
  |  |  |  |   47|  32.5k|	} \
  |  |  |  |   48|  32.5k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  32.5k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  890|       |
  891|  32.5k|	return result;
  892|  32.5k|}
spngload.c:vips_foreign_load_png_buffer_init:
  920|  2.41k|{
  921|  2.41k|}

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|  47.3k|vips__tiff_init(void) {}
vips__tiff_openin_source:
  168|  47.3k|{
  169|  47.3k|	TIFF *tiff;
  170|       |
  171|       |#ifdef DEBUG
  172|       |	printf("vips__tiff_openin_source:\n");
  173|       |#endif /*DEBUG*/
  174|       |
  175|  47.3k|	if (vips_source_rewind(source))
  ------------------
  |  Branch (175:6): [True: 0, False: 47.3k]
  ------------------
  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|  47.3k|#ifdef HAVE_TIFF_OPEN_OPTIONS
  187|  47.3k|	TIFFOpenOptions *opts = TIFFOpenOptionsAlloc();
  188|  47.3k|	TIFFOpenOptionsSetErrorHandlerExtR(opts, error_fn, user_data);
  189|  47.3k|	TIFFOpenOptionsSetWarningHandlerExtR(opts, warning_fn, user_data);
  190|  47.3k|#ifdef HAVE_TIFF_OPEN_OPTIONS_SET_MAX_CUMULATED_MEM_ALLOC
  191|  47.3k|	if (!unlimited) {
  ------------------
  |  Branch (191:6): [True: 47.3k, False: 0]
  ------------------
  192|  47.3k|		TIFFOpenOptionsSetMaxCumulatedMemAlloc(opts, 20 * 1024 * 1024);
  193|  47.3k|	}
  194|  47.3k|#endif /*HAVE_TIFF_OPEN_OPTIONS_SET_MAX_CUMULATED_MEM_ALLOC*/
  195|  47.3k|	if (!(tiff = TIFFClientOpenExt("source input", "rmC",
  ------------------
  |  Branch (195:6): [True: 12.6k, False: 34.6k]
  ------------------
  196|  47.3k|			  (thandle_t) source,
  197|  47.3k|			  openin_source_read,
  198|  47.3k|			  openin_source_write,
  199|  47.3k|			  openin_source_seek,
  200|  47.3k|			  openin_source_close,
  201|  47.3k|			  openin_source_length,
  202|  47.3k|			  openin_source_map,
  203|  47.3k|			  openin_source_unmap,
  204|  47.3k|			  opts))) {
  205|  12.6k|	    TIFFOpenOptionsFree(opts);
  206|  12.6k|		vips_error("vips__tiff_openin_source", "%s",
  207|  12.6k|			_("unable to open source for input"));
  ------------------
  |  |   30|  12.6k|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|  12.6k|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  208|  12.6k|		return NULL;
  209|  12.6k|	}
  210|  34.6k|	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|  34.6k|	g_object_ref(source);
  230|       |
  231|  34.6k|	return tiff;
  232|  47.3k|}
tiff.c:openin_source_read:
  104|   679k|{
  105|   679k|	VipsSource *source = VIPS_SOURCE(st);
  ------------------
  |  |  106|   679k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   679k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   679k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  107|   679k|		VIPS_TYPE_SOURCE, VipsSource))
  ------------------
  106|       |
  107|   679k|	return vips_source_read(source, data, size);
  108|   679k|}
tiff.c:openin_source_seek:
  120|   595k|{
  121|   595k|	VipsSource *source = VIPS_SOURCE(st);
  ------------------
  |  |  106|   595k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   595k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   595k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  107|   595k|		VIPS_TYPE_SOURCE, VipsSource))
  ------------------
  122|       |
  123|   595k|	return (toff_t) vips_source_seek(source, offset, whence);
  124|   595k|}
tiff.c:openin_source_close:
  128|  34.6k|{
  129|  34.6k|	VipsSource *source = VIPS_SOURCE(st);
  ------------------
  |  |  106|  34.6k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  34.6k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  34.6k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  107|  34.6k|		VIPS_TYPE_SOURCE, VipsSource))
  ------------------
  130|       |
  131|  34.6k|	VIPS_UNREF(source);
  ------------------
  |  |   57|  34.6k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  34.6k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  34.6k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  34.6k|	{ \
  |  |  |  |   43|  34.6k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 34.6k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  34.6k|			(void) F((S)); \
  |  |  |  |   45|  34.6k|			(S) = 0; \
  |  |  |  |   46|  34.6k|		} \
  |  |  |  |   47|  34.6k|	} \
  |  |  |  |   48|  34.6k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  34.6k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  132|       |
  133|  34.6k|	return 0;
  134|  34.6k|}
tiff.c:openin_source_length:
  138|  51.0k|{
  139|  51.0k|	VipsSource *source = VIPS_SOURCE(st);
  ------------------
  |  |  106|  51.0k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  51.0k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  51.0k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  107|  51.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|  51.0k|	return (toff_t) vips_source_length(source);
  147|  51.0k|}

vips__istiff_source:
 3453|  21.9k|{
 3454|  21.9k|	return vips__testtiff_source(source, NULL);
 3455|  21.9k|}
vips__istifftiled_source:
 3459|  9.25k|{
 3460|  9.25k|	return vips__testtiff_source(source, TIFFIsTiled);
 3461|  9.25k|}
vips__tiff_read_header_source:
 3467|  9.25k|{
 3468|  9.25k|	Rtiff *rtiff;
 3469|       |
 3470|  9.25k|	vips__tiff_init();
 3471|       |
 3472|  9.25k|	if (!(rtiff = rtiff_new(source, out,
  ------------------
  |  Branch (3472:6): [True: 0, False: 9.25k]
  ------------------
 3473|  9.25k|			  page, n, autorotate, subifd, fail_on, unlimited)) ||
 3474|  9.25k|		rtiff_header_read_all(rtiff))
  ------------------
  |  Branch (3474:3): [True: 1.79k, False: 7.45k]
  ------------------
 3475|  1.79k|		return -1;
 3476|       |
 3477|  7.45k|	if (rtiff_set_header(rtiff, out))
  ------------------
  |  Branch (3477:6): [True: 111, False: 7.34k]
  ------------------
 3478|    111|		return -1;
 3479|       |
 3480|  7.34k|	if (rtiff->autorotate &&
  ------------------
  |  Branch (3480:6): [True: 0, False: 7.34k]
  ------------------
 3481|  7.34k|		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|  7.34k|	vips_source_minimise(source);
 3490|       |
 3491|  7.34k|	return 0;
 3492|  7.45k|}
vips__tiff_read_source:
 3498|  6.91k|{
 3499|  6.91k|	Rtiff *rtiff;
 3500|       |
 3501|       |#ifdef DEBUG
 3502|       |	printf("tiff2vips: libtiff version is \"%s\"\n", TIFFGetVersion());
 3503|       |#endif /*DEBUG*/
 3504|       |
 3505|  6.91k|	vips__tiff_init();
 3506|       |
 3507|  6.91k|	if (!(rtiff = rtiff_new(source, out,
  ------------------
  |  Branch (3507:6): [True: 0, False: 6.91k]
  ------------------
 3508|  6.91k|			  page, n, autorotate, subifd, fail_on, unlimited)) ||
 3509|  6.91k|		rtiff_header_read_all(rtiff))
  ------------------
  |  Branch (3509:3): [True: 0, False: 6.91k]
  ------------------
 3510|      0|		return -1;
 3511|       |
 3512|  6.91k|	if (rtiff->header.tiled) {
  ------------------
  |  Branch (3512:6): [True: 1.58k, False: 5.33k]
  ------------------
 3513|  1.58k|		if (rtiff_read_tilewise(rtiff, out))
  ------------------
  |  Branch (3513:7): [True: 7, False: 1.57k]
  ------------------
 3514|      7|			return -1;
 3515|  1.58k|	}
 3516|  5.33k|	else {
 3517|  5.33k|		if (rtiff_read_stripwise(rtiff, out))
  ------------------
  |  Branch (3517:7): [True: 1.44k, False: 3.88k]
  ------------------
 3518|  1.44k|			return -1;
 3519|  5.33k|	}
 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|  5.45k|	vips_source_minimise(source);
 3525|       |
 3526|  5.45k|	return 0;
 3527|  6.91k|}
tiff2vips.c:vips__testtiff_source:
 3432|  31.1k|{
 3433|  31.1k|	TIFF *tif;
 3434|  31.1k|	gboolean property;
 3435|       |
 3436|  31.1k|	vips__tiff_init();
 3437|       |
 3438|  31.1k|	if (!(tif = vips__tiff_openin_source(source, rtiff_handler_error,
  ------------------
  |  Branch (3438:6): [True: 12.6k, False: 18.5k]
  ------------------
 3439|  31.1k|		rtiff_handler_warning, NULL, FALSE))) {
  ------------------
  |  |  206|  31.1k|#define FALSE   0               /* values of boolean */
  ------------------
 3440|  12.6k|		vips_error_clear();
 3441|  12.6k|		return FALSE;
  ------------------
  |  |  206|  12.6k|#define FALSE   0               /* values of boolean */
  ------------------
 3442|  12.6k|	}
 3443|       |
 3444|  18.5k|	property = fn ? fn(tif) : TRUE;
  ------------------
  |  |  209|  27.7k|#define TRUE    1
  ------------------
  |  Branch (3444:13): [True: 9.25k, False: 9.25k]
  ------------------
 3445|       |
 3446|  18.5k|	TIFFClose(tif);
 3447|       |
 3448|  18.5k|	return property;
 3449|  31.1k|}
tiff2vips.c:rtiff_handler_error:
  624|  2.19M|{
  625|  2.19M|	vips_verror("tiff2vips", fmt, ap);
  626|  2.19M|	return 1;
  627|  2.19M|}
tiff2vips.c:rtiff_handler_warning:
  632|   768k|{
  633|   768k|	if (user_data) {
  ------------------
  |  Branch (633:6): [True: 585k, False: 182k]
  ------------------
  634|   585k|		Rtiff *rtiff = (Rtiff*) user_data;
  635|   585k|		if (rtiff->fail_on >= VIPS_FAIL_ON_WARNING) {
  ------------------
  |  Branch (635:7): [True: 0, False: 585k]
  ------------------
  636|      0|			rtiff->failed = TRUE;
  ------------------
  |  |  209|      0|#define TRUE    1
  ------------------
  637|      0|		}
  638|   585k|	}
  639|   768k|	g_logv("tiff2vips", G_LOG_LEVEL_WARNING, fmt, ap);
  640|   768k|	return 1;
  641|   768k|}
tiff2vips.c:rtiff_new:
  647|  16.1k|{
  648|  16.1k|	Rtiff *rtiff;
  649|       |
  650|  16.1k|	if (!(rtiff = VIPS_NEW(out, Rtiff)))
  ------------------
  |  |   70|  16.1k|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  16.1k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  16.1k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  16.1k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  16.1k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (650:6): [True: 0, False: 16.1k]
  ------------------
  651|      0|		return NULL;
  652|       |
  653|  16.1k|	g_object_ref(source);
  654|  16.1k|	rtiff->source = source;
  655|  16.1k|	rtiff->out = out;
  656|  16.1k|	rtiff->page = page;
  657|  16.1k|	rtiff->n = n;
  658|  16.1k|	rtiff->autorotate = autorotate;
  659|  16.1k|	rtiff->subifd = subifd;
  660|  16.1k|	rtiff->fail_on = fail_on;
  661|  16.1k|	g_rec_mutex_init(&rtiff->lock);
  662|  16.1k|	rtiff->tiff = NULL;
  663|  16.1k|	rtiff->n_pages = 0;
  664|  16.1k|	rtiff->current_page = -1;
  665|  16.1k|	rtiff->sfn = NULL;
  666|  16.1k|	rtiff->client = NULL;
  667|  16.1k|	rtiff->memcpy = FALSE;
  ------------------
  |  |  206|  16.1k|#define FALSE   0               /* values of boolean */
  ------------------
  668|  16.1k|	rtiff->plane_buf = NULL;
  669|  16.1k|	rtiff->contig_buf = NULL;
  670|  16.1k|	rtiff->y_pos = 0;
  671|  16.1k|	rtiff->failed = FALSE;
  ------------------
  |  |  206|  16.1k|#define FALSE   0               /* values of boolean */
  ------------------
  672|       |
  673|  16.1k|	g_signal_connect(out, "close",
  ------------------
  |  |  491|  16.1k|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  674|  16.1k|		G_CALLBACK(rtiff_close_cb), rtiff);
  675|  16.1k|	g_signal_connect(out, "minimise",
  ------------------
  |  |  491|  16.1k|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  676|  16.1k|		G_CALLBACK(rtiff_minimise_cb), rtiff);
  677|       |
  678|  16.1k|	if (rtiff->page < 0 ||
  ------------------
  |  Branch (678:6): [True: 0, False: 16.1k]
  ------------------
  679|  16.1k|		rtiff->page > 1000000) {
  ------------------
  |  Branch (679:3): [True: 0, False: 16.1k]
  ------------------
  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|  16.1k|	if (rtiff->n != -1 &&
  ------------------
  |  Branch (688:6): [True: 16.1k, False: 0]
  ------------------
  689|  16.1k|		(rtiff->n < 1 || rtiff->n > 1000000)) {
  ------------------
  |  Branch (689:4): [True: 0, False: 16.1k]
  |  Branch (689:20): [True: 0, False: 16.1k]
  ------------------
  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|  16.1k|	if (!(rtiff->tiff = vips__tiff_openin_source(source,
  ------------------
  |  Branch (695:6): [True: 0, False: 16.1k]
  ------------------
  696|  16.1k|		rtiff_handler_error, rtiff_handler_warning, rtiff, unlimited)))
  697|      0|		return NULL;
  698|       |
  699|  16.1k|	return rtiff;
  700|  16.1k|}
tiff2vips.c:rtiff_close_cb:
  606|  16.1k|{
  607|  16.1k|	rtiff_free(rtiff);
  608|  16.1k|}
tiff2vips.c:rtiff_free:
  598|  16.1k|{
  599|  16.1k|	VIPS_FREEF(TIFFClose, rtiff->tiff);
  ------------------
  |  |   41|  16.1k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  16.1k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  16.1k|	{ \
  |  |   43|  16.1k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 16.1k, False: 0]
  |  |  ------------------
  |  |   44|  16.1k|			(void) F((S)); \
  |  |   45|  16.1k|			(S) = 0; \
  |  |   46|  16.1k|		} \
  |  |   47|  16.1k|	} \
  |  |   48|  16.1k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  16.1k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  600|  16.1k|	g_rec_mutex_clear(&rtiff->lock);
  601|  16.1k|	VIPS_UNREF(rtiff->source);
  ------------------
  |  |   57|  16.1k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  16.1k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  16.1k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  16.1k|	{ \
  |  |  |  |   43|  16.1k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 16.1k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  16.1k|			(void) F((S)); \
  |  |  |  |   45|  16.1k|			(S) = 0; \
  |  |  |  |   46|  16.1k|		} \
  |  |  |  |   47|  16.1k|	} \
  |  |  |  |   48|  16.1k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  16.1k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  602|  16.1k|}
tiff2vips.c:rtiff_minimise_cb:
  612|  56.4k|{
  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|  56.4k|	if (!rtiff->header.tiled &&
  ------------------
  |  Branch (616:6): [True: 44.3k, False: 12.1k]
  ------------------
  617|  56.4k|		rtiff->source)
  ------------------
  |  Branch (617:3): [True: 44.3k, False: 0]
  ------------------
  618|  44.3k|		vips_source_minimise(rtiff->source);
  619|  56.4k|}
tiff2vips.c:rtiff_header_read_all:
 3375|  16.1k|{
 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|  16.1k|	rtiff->n_pages = rtiff_n_pages(rtiff);
 3389|       |
 3390|  16.1k|	if (rtiff_set_page(rtiff, rtiff->page) ||
  ------------------
  |  Branch (3390:6): [True: 0, False: 16.1k]
  ------------------
 3391|  16.1k|		rtiff_header_read(rtiff, &rtiff->header))
  ------------------
  |  Branch (3391:3): [True: 1.79k, False: 14.3k]
  ------------------
 3392|  1.79k|		return -1;
 3393|       |
 3394|       |	/* If we're to read many pages, verify that they are all identical.
 3395|       |	 */
 3396|  14.3k|	if (rtiff->n == -1)
  ------------------
  |  Branch (3396:6): [True: 0, False: 14.3k]
  ------------------
 3397|      0|		rtiff->n = rtiff->n_pages - rtiff->page;
 3398|  14.3k|	if (rtiff->n > 1) {
  ------------------
  |  Branch (3398:6): [True: 0, False: 14.3k]
  ------------------
 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|  14.3k|	return 0;
 3426|  14.3k|}
tiff2vips.c:rtiff_n_pages:
  844|  16.1k|{
  845|  16.1k|	int n;
  846|       |
  847|  16.1k|	(void) TIFFSetDirectory(rtiff->tiff, 0);
  848|       |
  849|  18.1k|	for (n = 1; TIFFReadDirectory(rtiff->tiff); n++)
  ------------------
  |  Branch (849:14): [True: 1.93k, False: 16.1k]
  ------------------
  850|  1.93k|		;
  851|       |
  852|       |	/* Make sure the nest set_page() will set the directory.
  853|       |	 */
  854|  16.1k|	rtiff->current_page = -1;
  855|       |
  856|       |#ifdef DEBUG
  857|       |	printf("rtiff_n_pages: found %d pages\n", n);
  858|       |#endif /*DEBUG*/
  859|       |
  860|  16.1k|	return n;
  861|  16.1k|}
tiff2vips.c:rtiff_set_page:
  794|   148k|{
  795|   148k|	if (rtiff->current_page != page) {
  ------------------
  |  Branch (795:6): [True: 16.1k, False: 132k]
  ------------------
  796|       |#ifdef DEBUG
  797|       |		printf("rtiff_set_page: selecting page %d, subifd %d\n",
  798|       |			page, rtiff->subifd);
  799|       |#endif /*DEBUG*/
  800|       |
  801|  16.1k|		if (!TIFFSetDirectory(rtiff->tiff, page)) {
  ------------------
  |  Branch (801:7): [True: 0, False: 16.1k]
  ------------------
  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|  16.1k|		if (rtiff->subifd >= 0) {
  ------------------
  |  Branch (806:7): [True: 0, False: 16.1k]
  ------------------
  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|  16.1k|		rtiff->current_page = page;
  832|       |
  833|       |		/* These can get unset when we change directories. Make sure
  834|       |		 * they are set again.
  835|       |		 */
  836|  16.1k|		rtiff_set_decode_format(rtiff);
  837|  16.1k|	}
  838|       |
  839|   148k|	return 0;
  840|   148k|}
tiff2vips.c:rtiff_set_decode_format:
  778|  45.5k|{
  779|       |	/* Ask for YCbCr->RGB for jpg data.
  780|       |	 */
  781|  45.5k|	if (rtiff->header.compression == COMPRESSION_JPEG ||
  ------------------
  |  |  190|  91.0k|#define COMPRESSION_JPEG 7            /* %JPEG DCT compression */
  ------------------
  |  Branch (781:6): [True: 2.46k, False: 43.0k]
  ------------------
  782|  45.5k|		rtiff->header.compression == COMPRESSION_OJPEG)
  ------------------
  |  |  189|  43.0k|#define COMPRESSION_OJPEG 6           /* !6.0 JPEG */
  ------------------
  |  Branch (782:3): [True: 6.75k, False: 36.2k]
  ------------------
  783|  9.22k|		TIFFSetField(rtiff->tiff, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB);
  ------------------
  |  |  706|  9.22k|#define TIFFTAG_JPEGCOLORMODE 65538  /* Auto RGB<=>YCbCr convert? */
  ------------------
              		TIFFSetField(rtiff->tiff, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB);
  ------------------
  |  |  708|  9.22k|#define JPEGCOLORMODE_RGB 0x0001     /* do auto conversion */
  ------------------
  784|       |
  785|       |	/* Ask for SGI LOGLUV as 3xfloat.
  786|       |	 */
  787|  45.5k|	if (rtiff->header.photometric_interpretation ==
  ------------------
  |  Branch (787:6): [True: 1.13k, False: 44.3k]
  ------------------
  788|  45.5k|		PHOTOMETRIC_LOGLUV)
  ------------------
  |  |  233|  45.5k|#define PHOTOMETRIC_LOGLUV 32845           /* CIE Log2(L) (u',v') */
  ------------------
  789|  1.13k|		TIFFSetField(rtiff->tiff, TIFFTAG_SGILOGDATAFMT, SGILOGDATAFMT_FLOAT);
  ------------------
  |  |  743|  1.13k|#define TIFFTAG_SGILOGDATAFMT 65560    /* SGILog user data format */
  ------------------
              		TIFFSetField(rtiff->tiff, TIFFTAG_SGILOGDATAFMT, SGILOGDATAFMT_FLOAT);
  ------------------
  |  |  744|  1.13k|#define SGILOGDATAFMT_FLOAT 0          /* IEEE float samples */
  ------------------
  790|  45.5k|}
tiff2vips.c:rtiff_header_read:
 2989|  16.1k|{
 2990|  16.1k|	int i;
 2991|  16.1k|	guint16 extra_samples_count;
 2992|  16.1k|	guint16 *extra_samples_types;
 2993|  16.1k|	guint16 subifd_count;
 2994|  16.1k|	toff_t *subifd_offsets;
 2995|  16.1k|	char *image_description;
 2996|  16.1k|	guint32 max_tile_dimension;
 2997|  16.1k|	gboolean can_read_as_rgba;
 2998|       |
 2999|  16.1k|	if (!tfget32(rtiff->tiff, TIFFTAG_IMAGEWIDTH,
  ------------------
  |  |  178|  16.1k|#define TIFFTAG_IMAGEWIDTH 256        /* image width in pixels */
  ------------------
  |  Branch (2999:6): [True: 0, False: 16.1k]
  ------------------
 3000|  16.1k|			&header->width) ||
 3001|  16.1k|		!tfget32(rtiff->tiff, TIFFTAG_IMAGELENGTH,
  ------------------
  |  |  179|  16.1k|#define TIFFTAG_IMAGELENGTH 257       /* image height in pixels */
  ------------------
  |  Branch (3001:3): [True: 0, False: 16.1k]
  ------------------
 3002|  16.1k|			&header->height) ||
 3003|  16.1k|		!tfget16(rtiff->tiff, TIFFTAG_SAMPLESPERPIXEL,
  ------------------
  |  |  257|  16.1k|#define TIFFTAG_SAMPLESPERPIXEL 277        /* samples per pixel */
  ------------------
  |  Branch (3003:3): [True: 0, False: 16.1k]
  ------------------
 3004|  16.1k|			&header->samples_per_pixel) ||
 3005|  16.1k|		!tfget16(rtiff->tiff, TIFFTAG_BITSPERSAMPLE,
  ------------------
  |  |  180|  16.1k|#define TIFFTAG_BITSPERSAMPLE 258     /* bits per channel (sample) */
  ------------------
  |  Branch (3005:3): [True: 0, False: 16.1k]
  ------------------
 3006|  16.1k|			&header->bits_per_sample) ||
 3007|  16.1k|		!tfget16(rtiff->tiff, TIFFTAG_PHOTOMETRIC,
  ------------------
  |  |  220|  16.1k|#define TIFFTAG_PHOTOMETRIC 262            /* photometric interpretation */
  ------------------
  |  Branch (3007:3): [True: 1.17k, False: 14.9k]
  ------------------
 3008|  16.1k|			&header->photometric_interpretation) ||
 3009|  16.1k|		!tfget16(rtiff->tiff, TIFFTAG_INKSET,
  ------------------
  |  |  322|  14.9k|#define TIFFTAG_INKSET 332                 /* !inks in separated image */
  ------------------
  |  Branch (3009:3): [True: 0, False: 14.9k]
  ------------------
 3010|  14.9k|			&header->inkset))
 3011|  1.17k|		return -1;
 3012|       |
 3013|  14.9k|	header->read_as_rgba = FALSE;
  ------------------
  |  |  206|  14.9k|#define FALSE   0               /* values of boolean */
  ------------------
 3014|       |
 3015|       |	/* TIFF images which can be read by TIFFRGBAImage or TIFFReadRGBATile.
 3016|       |	 */
 3017|  14.9k|	can_read_as_rgba =
 3018|  14.9k|		(header->samples_per_pixel == 1 ||
  ------------------
  |  Branch (3018:4): [True: 6.56k, False: 8.43k]
  ------------------
 3019|  14.9k|			header->samples_per_pixel == 3 ||
  ------------------
  |  Branch (3019:4): [True: 5.88k, False: 2.54k]
  ------------------
 3020|  14.9k|			header->samples_per_pixel == 4) &&
  ------------------
  |  Branch (3020:4): [True: 1.50k, False: 1.04k]
  ------------------
 3021|  14.9k|		(header->bits_per_sample == 1 ||
  ------------------
  |  Branch (3021:4): [True: 4.52k, False: 9.42k]
  ------------------
 3022|  13.9k|			header->bits_per_sample == 2 ||
  ------------------
  |  Branch (3022:4): [True: 538, False: 8.88k]
  ------------------
 3023|  13.9k|			header->bits_per_sample == 4 ||
  ------------------
  |  Branch (3023:4): [True: 282, False: 8.60k]
  ------------------
 3024|  13.9k|			header->bits_per_sample == 8 ||
  ------------------
  |  Branch (3024:4): [True: 6.14k, False: 2.45k]
  ------------------
 3025|  13.9k|			header->bits_per_sample == 16);
  ------------------
  |  Branch (3025:4): [True: 1.03k, False: 1.42k]
  ------------------
 3026|       |
 3027|  14.9k|	TIFFGetFieldDefaulted(rtiff->tiff,
 3028|  14.9k|		TIFFTAG_COMPRESSION, &header->compression);
  ------------------
  |  |  181|  14.9k|#define TIFFTAG_COMPRESSION 259       /* data compression technique */
  ------------------
 3029|       |
 3030|       |	/* We'll decode old-style JPEG using the libtiff RGBA path.
 3031|       |	 */
 3032|  14.9k|	if (header->compression == COMPRESSION_OJPEG) {
  ------------------
  |  |  189|  14.9k|#define COMPRESSION_OJPEG 6           /* !6.0 JPEG */
  ------------------
  |  Branch (3032:6): [True: 3.44k, False: 11.5k]
  ------------------
 3033|  3.44k|		if (!can_read_as_rgba) {
  ------------------
  |  Branch (3033:7): [True: 19, False: 3.42k]
  ------------------
 3034|     19|			vips_error("tiff2vips", "%s", _("unsupported tiff image type"));
  ------------------
  |  |   30|     19|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|     19|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 3035|     19|			return -1;
 3036|     19|		}
 3037|       |
 3038|  3.42k|		header->read_as_rgba = TRUE;
  ------------------
  |  |  209|  3.42k|#define TRUE    1
  ------------------
 3039|  3.42k|	}
 3040|       |
 3041|       |	/* One of the types we decompress?
 3042|       |	 */
 3043|  69.1k|	for (i = 0; i < VIPS_NUMBER(rtiff_we_decompress); i++)
  ------------------
  |  |   60|  69.1k|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (3043:14): [True: 55.6k, False: 13.5k]
  ------------------
 3044|  55.6k|		if (header->compression == rtiff_we_decompress[i]) {
  ------------------
  |  Branch (3044:7): [True: 1.42k, False: 54.2k]
  ------------------
 3045|       |#ifdef DEBUG
 3046|       |			printf("rtiff_header_read: compression %d handled by us\n",
 3047|       |				header->compression);
 3048|       |#endif /*DEBUG*/
 3049|  1.42k|			header->we_decompress = TRUE;
  ------------------
  |  |  209|  1.42k|#define TRUE    1
  ------------------
 3050|  1.42k|			break;
 3051|  1.42k|		}
 3052|       |
 3053|       |	/* We must set this here since it'll change the value of scanline_size.
 3054|       |	 */
 3055|  14.9k|	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|  14.9k|	if (!header->read_as_rgba &&
  ------------------
  |  Branch (3060:6): [True: 11.5k, False: 3.42k]
  ------------------
 3061|  14.9k|		header->compression != COMPRESSION_JPEG &&
  ------------------
  |  |  190|  26.5k|#define COMPRESSION_JPEG 7            /* %JPEG DCT compression */
  ------------------
  |  Branch (3061:3): [True: 10.1k, False: 1.42k]
  ------------------
 3062|  14.9k|		header->photometric_interpretation == PHOTOMETRIC_YCBCR) {
  ------------------
  |  |  227|  10.1k|#define PHOTOMETRIC_YCBCR 6                /* !CCIR 601 */
  ------------------
  |  Branch (3062:3): [True: 972, False: 9.15k]
  ------------------
 3063|    972|		guint16 hsub, vsub;
 3064|       |
 3065|    972|		TIFFGetFieldDefaulted(rtiff->tiff,
 3066|    972|			TIFFTAG_YCBCRSUBSAMPLING, &hsub, &vsub);
  ------------------
  |  |  388|    972|#define TIFFTAG_YCBCRSUBSAMPLING 530       /* !YCbCr subsampling factors */
  ------------------
 3067|    972|		if (hsub != 1 || vsub != 1) {
  ------------------
  |  Branch (3067:7): [True: 911, False: 61]
  |  Branch (3067:20): [True: 61, False: 0]
  ------------------
 3068|    972|			if (!can_read_as_rgba) {
  ------------------
  |  Branch (3068:8): [True: 5, False: 967]
  ------------------
 3069|      5|				vips_error("tiff2vips",
 3070|      5|					"%s", _("subsampled images not supported"));
  ------------------
  |  |   30|      5|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      5|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 3071|      5|				return -1;
 3072|      5|			}
 3073|       |
 3074|    967|			header->read_as_rgba = TRUE;
  ------------------
  |  |  209|    967|#define TRUE    1
  ------------------
 3075|    967|		}
 3076|    972|	}
 3077|       |
 3078|  14.9k|	if (header->photometric_interpretation == PHOTOMETRIC_LOGLUV) {
  ------------------
  |  |  233|  14.9k|#define PHOTOMETRIC_LOGLUV 32845           /* CIE Log2(L) (u',v') */
  ------------------
  |  Branch (3078:6): [True: 585, False: 14.3k]
  ------------------
 3079|    585|		if (header->compression != COMPRESSION_SGILOG &&
  ------------------
  |  |  210|  1.17k|#define COMPRESSION_SGILOG 34676   /* SGI Log Luminance RLE */
  ------------------
  |  Branch (3079:7): [True: 333, False: 252]
  ------------------
 3080|    585|			header->compression != COMPRESSION_SGILOG24) {
  ------------------
  |  |  211|    333|#define COMPRESSION_SGILOG24 34677 /* SGI Log 24-bit packed */
  ------------------
  |  Branch (3080:4): [True: 22, False: 311]
  ------------------
 3081|     22|			vips_error("tiff2vips",
 3082|     22|				"%s", _("not SGI-compressed LOGLUV"));
  ------------------
  |  |   30|     22|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|     22|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 3083|     22|			return -1;
 3084|     22|		}
 3085|    585|	}
 3086|       |
 3087|       |	/* For logluv, the calibration factor to get to absolute luminance.
 3088|       |	 */
 3089|  14.9k|	if (!TIFFGetField(rtiff->tiff, TIFFTAG_STONITS, &header->stonits))
  ------------------
  |  |  490|  14.9k|#define TIFFTAG_STONITS 37439 /* Sample value to Nits */
  ------------------
  |  Branch (3089:6): [True: 14.9k, False: 34]
  ------------------
 3090|  14.9k|		header->stonits = 1.0;
 3091|       |
 3092|       |	/* Arbitrary sanity-checking limits.
 3093|       |	 */
 3094|  14.9k|	if (header->width <= 0 ||
  ------------------
  |  Branch (3094:6): [True: 0, False: 14.9k]
  ------------------
 3095|  14.9k|		header->width >= VIPS_MAX_COORD ||
  ------------------
  |  |   69|  29.9k|#define VIPS_MAX_COORD (vips_max_coord_get())
  ------------------
  |  Branch (3095:3): [True: 14, False: 14.9k]
  ------------------
 3096|  14.9k|		header->height <= 0 ||
  ------------------
  |  Branch (3096:3): [True: 0, False: 14.9k]
  ------------------
 3097|  14.9k|		header->height >= VIPS_MAX_COORD) {
  ------------------
  |  |   69|  14.9k|#define VIPS_MAX_COORD (vips_max_coord_get())
  ------------------
  |  Branch (3097:3): [True: 37, False: 14.9k]
  ------------------
 3098|     51|		vips_error("tiff2vips",
 3099|     51|			"%s", _("width/height out of range"));
  ------------------
  |  |   30|     51|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|     51|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 3100|     51|		return -1;
 3101|     51|	}
 3102|       |
 3103|  14.9k|	if (header->samples_per_pixel <= 0 ||
  ------------------
  |  Branch (3103:6): [True: 0, False: 14.9k]
  ------------------
 3104|  14.9k|		header->samples_per_pixel > 10000 ||
  ------------------
  |  Branch (3104:3): [True: 19, False: 14.8k]
  ------------------
 3105|  14.9k|		header->bits_per_sample <= 0 ||
  ------------------
  |  Branch (3105:3): [True: 0, False: 14.8k]
  ------------------
 3106|  14.9k|		header->bits_per_sample > 32) {
  ------------------
  |  Branch (3106:3): [True: 57, False: 14.8k]
  ------------------
 3107|     76|		vips_error("tiff2vips",
 3108|     76|			"%s", _("samples out of range"));
  ------------------
  |  |   30|     76|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|     76|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 3109|     76|		return -1;
 3110|     76|	}
 3111|       |
 3112|  14.8k|	header->sample_format = get_sample_format(rtiff->tiff);
 3113|  14.8k|	header->orientation = get_orientation(rtiff->tiff);
 3114|       |
 3115|  14.8k|	header->separate = FALSE;
  ------------------
  |  |  206|  14.8k|#define FALSE   0               /* values of boolean */
  ------------------
 3116|  14.8k|	if (tfexists(rtiff->tiff, TIFFTAG_PLANARCONFIG)) {
  ------------------
  |  |  264|  14.8k|#define TIFFTAG_PLANARCONFIG 284           /* storage organization */
  ------------------
  |  Branch (3116:6): [True: 14.8k, False: 0]
  ------------------
 3117|  14.8k|		int v;
 3118|       |
 3119|  14.8k|		if (!tfget16(rtiff->tiff, TIFFTAG_PLANARCONFIG, &v))
  ------------------
  |  |  264|  14.8k|#define TIFFTAG_PLANARCONFIG 284           /* storage organization */
  ------------------
  |  Branch (3119:7): [True: 0, False: 14.8k]
  ------------------
 3120|      0|			return -1;
 3121|  14.8k|		if (v == PLANARCONFIG_SEPARATE)
  ------------------
  |  |  266|  14.8k|#define PLANARCONFIG_SEPARATE 2            /* separate planes of data */
  ------------------
  |  Branch (3121:7): [True: 778, False: 14.0k]
  ------------------
 3122|    778|			header->separate = TRUE;
  ------------------
  |  |  209|    778|#define TRUE    1
  ------------------
 3123|  14.8k|	}
 3124|       |
 3125|       |	/* TIFFGetField needs a guint16 to write count to.
 3126|       |	 */
 3127|  14.8k|	if (TIFFGetField(rtiff->tiff, TIFFTAG_SUBIFD,
  ------------------
  |  |  321|  14.8k|#define TIFFTAG_SUBIFD 330                 /* subimage descriptors */
  ------------------
  |  Branch (3127:6): [True: 23, False: 14.8k]
  ------------------
 3128|  14.8k|			&subifd_count, &subifd_offsets))
 3129|     23|		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|  14.8k|	if (TIFFGetField(rtiff->tiff, TIFFTAG_IMAGEDESCRIPTION, &image_description))
  ------------------
  |  |  244|  14.8k|#define TIFFTAG_IMAGEDESCRIPTION 270       /* info about image */
  ------------------
  |  Branch (3135:6): [True: 44, False: 14.7k]
  ------------------
 3136|     44|		header->image_description =
 3137|     44|			vips_strdup(VIPS_OBJECT(rtiff->out), image_description);
  ------------------
  |  |  433|     44|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|     44|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|     44|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3138|       |
 3139|       |	/* Tiles and strip images have slightly different fields.
 3140|       |	 */
 3141|  14.8k|	header->tiled = TIFFIsTiled(rtiff->tiff);
 3142|       |
 3143|  14.8k|	if (header->read_as_rgba) {
  ------------------
  |  Branch (3143:6): [True: 4.36k, False: 10.4k]
  ------------------
 3144|  4.36k|		header->we_decompress = FALSE;
  ------------------
  |  |  206|  4.36k|#define FALSE   0               /* values of boolean */
  ------------------
 3145|  4.36k|		header->photometric_interpretation = PHOTOMETRIC_RGB;
  ------------------
  |  |  223|  4.36k|#define PHOTOMETRIC_RGB 2                  /* RGB color model */
  ------------------
 3146|  4.36k|		header->samples_per_pixel = 4;
 3147|  4.36k|		header->bits_per_sample = 8;
 3148|  4.36k|		header->sample_format = SAMPLEFORMAT_UINT;
  ------------------
  |  |  334|  4.36k|#define SAMPLEFORMAT_UINT 1                /* !unsigned integer data */
  ------------------
 3149|  4.36k|		header->separate = FALSE;
  ------------------
  |  |  206|  4.36k|#define FALSE   0               /* values of boolean */
  ------------------
 3150|  4.36k|	}
 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|  14.8k|	if (header->tiled) {
  ------------------
  |  Branch (3171:6): [True: 3.64k, False: 11.1k]
  ------------------
 3172|  3.64k|		if (!tfget32(rtiff->tiff, TIFFTAG_TILEWIDTH, &header->tile_width) ||
  ------------------
  |  |  311|  3.64k|#define TIFFTAG_TILEWIDTH 322              /* !tile width in pixels */
  ------------------
  |  Branch (3172:7): [True: 0, False: 3.64k]
  ------------------
 3173|  3.64k|			!tfget32(rtiff->tiff, TIFFTAG_TILELENGTH, &header->tile_height))
  ------------------
  |  |  312|  3.64k|#define TIFFTAG_TILELENGTH 323             /* !tile height in pixels */
  ------------------
  |  Branch (3173:4): [True: 0, False: 3.64k]
  ------------------
 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|  3.64k|		max_tile_dimension = VIPS_MIN(8192,
  ------------------
  |  |   55|  14.5k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 396, False: 3.24k]
  |  |  |  Branch (55:32): [True: 1.79k, False: 1.85k]
  |  |  |  Branch (55:32): [True: 1.79k, False: 1.85k]
  |  |  |  Branch (55:44): [True: 1.39k, False: 1.84k]
  |  |  |  Branch (55:44): [True: 1.39k, False: 1.84k]
  |  |  ------------------
  ------------------
 3186|  3.64k|			VIPS_ROUND_UP(2 * VIPS_MAX(header->width, header->height), 256));
 3187|  3.64k|		if (header->tile_width <= 0 ||
  ------------------
  |  Branch (3187:7): [True: 0, False: 3.64k]
  ------------------
 3188|  3.64k|			header->tile_width > max_tile_dimension ||
  ------------------
  |  Branch (3188:4): [True: 32, False: 3.60k]
  ------------------
 3189|  3.64k|			header->tile_width % 16 != 0 ||
  ------------------
  |  Branch (3189:4): [True: 405, False: 3.20k]
  ------------------
 3190|  3.64k|			header->tile_height <= 0 ||
  ------------------
  |  Branch (3190:4): [True: 0, False: 3.20k]
  ------------------
 3191|  3.64k|			header->tile_height > max_tile_dimension ||
  ------------------
  |  Branch (3191:4): [True: 11, False: 3.19k]
  ------------------
 3192|  3.64k|			header->tile_height % 16 != 0) {
  ------------------
  |  Branch (3192:4): [True: 6, False: 3.18k]
  ------------------
 3193|    454|			vips_error("tiff2vips",
 3194|    454|				"%s", _("tile size out of range"));
  ------------------
  |  |   30|    454|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|    454|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 3195|    454|			return -1;
 3196|    454|		}
 3197|       |
 3198|  3.18k|		if (header->read_as_rgba) {
  ------------------
  |  Branch (3198:7): [True: 680, False: 2.50k]
  ------------------
 3199|    680|			header->tile_row_size = header->tile_width * 4;
 3200|    680|			header->tile_size = header->tile_row_size * header->tile_height;
 3201|    680|		}
 3202|  2.50k|		else {
 3203|  2.50k|			header->tile_size = TIFFTileSize(rtiff->tiff);
 3204|  2.50k|			header->tile_row_size = TIFFTileRowSize(rtiff->tiff);
 3205|  2.50k|		}
 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|  3.18k|		if (header->tile_size <= 0 ||
  ------------------
  |  Branch (3217:7): [True: 0, False: 3.18k]
  ------------------
 3218|  3.18k|			header->tile_size > 100 * 1000 * 1000 ||
  ------------------
  |  Branch (3218:4): [True: 1, False: 3.18k]
  ------------------
 3219|  3.18k|			header->tile_row_size <= 0 ||
  ------------------
  |  Branch (3219:4): [True: 0, False: 3.18k]
  ------------------
 3220|  3.18k|			header->tile_row_size > 100 * 1000 * 1000) {
  ------------------
  |  Branch (3220:4): [True: 0, False: 3.18k]
  ------------------
 3221|      1|			vips_error("tiff2vips",
 3222|      1|				"%s", _("tile size out of range"));
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 3223|      1|			return -1;
 3224|      1|		}
 3225|       |
 3226|       |		/* Stop some compiler warnings.
 3227|       |		 */
 3228|  3.18k|		header->rows_per_strip = 0;
 3229|  3.18k|		header->strip_size = 0;
 3230|  3.18k|		header->number_of_strips = 0;
 3231|  3.18k|		header->read_height = 0;
 3232|  3.18k|		header->read_size = 0;
 3233|  3.18k|	}
 3234|  11.1k|	else {
 3235|  11.1k|		if (!tfget32(rtiff->tiff,
  ------------------
  |  Branch (3235:7): [True: 0, False: 11.1k]
  ------------------
 3236|  11.1k|				TIFFTAG_ROWSPERSTRIP, &header->rows_per_strip))
  ------------------
  |  |  258|  11.1k|#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|  11.1k|		header->rows_per_strip = VIPS_CLIP(1,
  ------------------
  |  |   57|  11.1k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|  22.3k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 0, False: 11.1k]
  |  |  |  |  |  Branch (54:32): [True: 3.95k, False: 7.22k]
  |  |  |  |  |  Branch (54:44): [True: 3.95k, False: 7.22k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3246|  11.1k|			header->rows_per_strip, header->height);
 3247|       |
 3248|  11.1k|		header->number_of_strips = TIFFNumberOfStrips(rtiff->tiff);
 3249|       |
 3250|  11.1k|		if (header->read_as_rgba) {
  ------------------
  |  Branch (3250:7): [True: 3.61k, False: 7.57k]
  ------------------
 3251|  3.61k|			header->scanline_size = header->width * 4;
 3252|  3.61k|			header->strip_size = header->scanline_size * header->rows_per_strip;
 3253|  3.61k|		}
 3254|  7.57k|		else {
 3255|  7.57k|			header->scanline_size = TIFFScanlineSize(rtiff->tiff);
 3256|  7.57k|			header->strip_size = TIFFStripSize(rtiff->tiff);
 3257|  7.57k|		}
 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|  11.1k|		if (header->rows_per_strip > 128 &&
  ------------------
  |  Branch (3288:7): [True: 148, False: 11.0k]
  ------------------
 3289|  11.1k|			!header->separate &&
  ------------------
  |  Branch (3289:4): [True: 145, False: 3]
  ------------------
 3290|  11.1k|			header->photometric_interpretation != PHOTOMETRIC_YCBCR &&
  ------------------
  |  |  227|  11.3k|#define PHOTOMETRIC_YCBCR 6                /* !CCIR 601 */
  ------------------
  |  Branch (3290:4): [True: 122, False: 23]
  ------------------
 3291|  11.1k|			!header->read_as_rgba) {
  ------------------
  |  Branch (3291:4): [True: 45, False: 77]
  ------------------
 3292|     45|			header->read_scanlinewise = TRUE;
  ------------------
  |  |  209|     45|#define TRUE    1
  ------------------
 3293|     45|			header->read_height = 1;
 3294|     45|			header->read_size = rtiff->header.scanline_size;
 3295|     45|		}
 3296|  11.1k|		else {
 3297|  11.1k|			header->read_scanlinewise = FALSE;
  ------------------
  |  |  206|  11.1k|#define FALSE   0               /* values of boolean */
  ------------------
 3298|  11.1k|			header->read_height = header->rows_per_strip;
 3299|  11.1k|			header->read_size = header->strip_size;
 3300|  11.1k|		}
 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|  11.1k|		header->tile_width = 0;
 3314|  11.1k|		header->tile_height = 0;
 3315|  11.1k|		header->tile_size = 0;
 3316|  11.1k|		header->tile_row_size = 0;
 3317|  11.1k|	}
 3318|       |
 3319|  14.3k|	TIFFGetFieldDefaulted(rtiff->tiff, TIFFTAG_EXTRASAMPLES,
  ------------------
  |  |  329|  14.3k|#define TIFFTAG_EXTRASAMPLES 338           /* !info about extra samples */
  ------------------
 3320|  14.3k|		&extra_samples_count, &extra_samples_types);
 3321|       |
 3322|  14.3k|	header->alpha_band = -1;
 3323|  14.3k|	if (extra_samples_count > 0) {
  ------------------
  |  Branch (3323:6): [True: 3.39k, False: 10.9k]
  ------------------
 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|  3.39k|		int i;
 3329|       |
 3330|  55.4k|		for (i = 0; i < extra_samples_count; i++)
  ------------------
  |  Branch (3330:15): [True: 52.0k, False: 3.39k]
  ------------------
 3331|  52.0k|			if (extra_samples_types[i] == EXTRASAMPLE_ASSOCALPHA) {
  ------------------
  |  |  331|  52.0k|#define EXTRASAMPLE_ASSOCALPHA 1           /* !associated alpha data */
  ------------------
  |  Branch (3331:8): [True: 2.32k, False: 49.6k]
  ------------------
 3332|  2.32k|				if (header->alpha_band != -1)
  ------------------
  |  Branch (3332:9): [True: 331, False: 1.99k]
  ------------------
 3333|    331|					g_warning("%s", _("more than one alpha -- ignoring"));
  ------------------
  |  |  338|    331|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|    331|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|    331|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|    331|                               __VA_ARGS__)
  ------------------
 3334|       |
 3335|  2.32k|				header->alpha_band = header->samples_per_pixel -
 3336|  2.32k|					extra_samples_count + i;
 3337|  2.32k|			}
 3338|  3.39k|	}
 3339|       |
 3340|  14.3k|	return 0;
 3341|  14.8k|}
tiff2vips.c:tfget32:
  475|  50.7k|{
  476|  50.7k|	guint32 fld;
  477|       |
  478|  50.7k|	if (!TIFFGetFieldDefaulted(tif, tag, &fld)) {
  ------------------
  |  Branch (478:6): [True: 0, False: 50.7k]
  ------------------
  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|  50.7k|	*out = fld;
  485|       |
  486|  50.7k|	return 1;
  487|  50.7k|}
tiff2vips.c:tfget16:
  493|  79.4k|{
  494|  79.4k|	guint16 fld;
  495|       |
  496|  79.4k|	if (!TIFFGetFieldDefaulted(tif, tag, &fld)) {
  ------------------
  |  Branch (496:6): [True: 1.17k, False: 78.2k]
  ------------------
  497|  1.17k|		vips_error("tiff2vips",
  498|  1.17k|			_("required field %d missing"), tag);
  ------------------
  |  |   30|  1.17k|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|  1.17k|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  499|  1.17k|		return 0;
  500|  1.17k|	}
  501|       |
  502|  78.2k|	*out = fld;
  503|       |
  504|  78.2k|	return 1;
  505|  79.4k|}
tiff2vips.c:get_sample_format:
  560|  14.8k|{
  561|  14.8k|	int sample_format;
  562|  14.8k|	guint16 v;
  563|       |
  564|  14.8k|	sample_format = SAMPLEFORMAT_INT;
  ------------------
  |  |  335|  14.8k|#define SAMPLEFORMAT_INT 2                 /* !signed integer data */
  ------------------
  565|       |
  566|  14.8k|	if (TIFFGetFieldDefaulted(tiff, TIFFTAG_SAMPLEFORMAT, &v)) {
  ------------------
  |  |  333|  14.8k|#define TIFFTAG_SAMPLEFORMAT 339           /* !data sample format */
  ------------------
  |  Branch (566:6): [True: 14.8k, False: 0]
  ------------------
  567|       |		/* Some images have this set to void, bizarre.
  568|       |		 */
  569|  14.8k|		if (v == SAMPLEFORMAT_VOID)
  ------------------
  |  |  337|  14.8k|#define SAMPLEFORMAT_VOID 4                /* !untyped data */
  ------------------
  |  Branch (569:7): [True: 21, False: 14.8k]
  ------------------
  570|     21|			v = SAMPLEFORMAT_UINT;
  ------------------
  |  |  334|     21|#define SAMPLEFORMAT_UINT 1                /* !unsigned integer data */
  ------------------
  571|       |
  572|  14.8k|		sample_format = v;
  573|  14.8k|	}
  574|       |
  575|  14.8k|	return sample_format;
  576|  14.8k|}
tiff2vips.c:get_orientation:
  580|  14.8k|{
  581|  14.8k|	int orientation;
  582|  14.8k|	guint16 v;
  583|       |
  584|  14.8k|	orientation = ORIENTATION_TOPLEFT;
  ------------------
  |  |  249|  14.8k|#define ORIENTATION_TOPLEFT 1              /* row 0 top, col 0 lhs */
  ------------------
  585|       |
  586|  14.8k|	if (TIFFGetFieldDefaulted(tiff, TIFFTAG_ORIENTATION, &v))
  ------------------
  |  |  248|  14.8k|#define TIFFTAG_ORIENTATION 274            /* +image orientation */
  ------------------
  |  Branch (586:6): [True: 14.8k, False: 0]
  ------------------
  587|       |		/* Can have mad values.
  588|       |		 */
  589|  14.8k|		orientation = VIPS_CLIP(1, v, 8);
  ------------------
  |  |   57|  14.8k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|  29.6k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 0, False: 14.8k]
  |  |  |  |  |  Branch (54:32): [True: 0, False: 14.8k]
  |  |  |  |  |  Branch (54:44): [True: 0, False: 14.8k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  590|       |
  591|  14.8k|	return orientation;
  592|  14.8k|}
tiff2vips.c:tfexists:
  462|  14.8k|{
  463|  14.8k|	guint32 a, b;
  464|       |
  465|  14.8k|	if (TIFFGetField(tif, tag, &a, &b))
  ------------------
  |  Branch (465:6): [True: 14.8k, False: 0]
  ------------------
  466|  14.8k|		return 1;
  467|      0|	else
  468|      0|		return 0;
  469|  14.8k|}
tiff2vips.c:rtiff_set_header:
 1852|  14.3k|{
 1853|  14.3k|	guint32 data_len;
 1854|  14.3k|	void *data;
 1855|       |
 1856|  14.3k|	rtiff_set_decode_format(rtiff);
 1857|       |
 1858|  14.3k|	if (rtiff->header.photometric_interpretation == PHOTOMETRIC_LOGLUV)
  ------------------
  |  |  233|  14.3k|#define PHOTOMETRIC_LOGLUV 32845           /* CIE Log2(L) (u',v') */
  ------------------
  |  Branch (1858:6): [True: 548, False: 13.8k]
  ------------------
 1859|    548|		vips_image_set_double(out, "stonits", rtiff->header.stonits);
 1860|       |
 1861|  14.3k|	out->Xsize = rtiff->header.width;
 1862|  14.3k|	out->Ysize = rtiff->header.height * rtiff->n;
 1863|       |
 1864|  14.3k|	VIPS_SETSTR(out->filename,
  ------------------
  |  |   53|  14.3k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  14.3k|#define G_STMT_START  do
  |  |  ------------------
  |  |   54|  14.3k|	{ \
  |  |   55|  14.3k|		const char *sst = (V); \
  |  |   56|  14.3k|		\
  |  |   57|  14.3k|		if ((S) != sst) { \
  |  |  ------------------
  |  |  |  Branch (57:7): [True: 14.3k, False: 0]
  |  |  ------------------
  |  |   58|  14.3k|			if (!(S) || !sst || strcmp((S), sst) != 0) { \
  |  |  ------------------
  |  |  |  Branch (58:8): [True: 0, False: 14.3k]
  |  |  |  Branch (58:16): [True: 14.3k, False: 0]
  |  |  |  Branch (58:24): [True: 0, False: 0]
  |  |  ------------------
  |  |   59|  14.3k|				VIPS_FREE(S); \
  |  |  ------------------
  |  |  |  |   50|  14.3k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  |  |  ------------------
  |  |  |  |  |  |   41|  14.3k|	G_STMT_START \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  854|  14.3k|#define G_STMT_START  do
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   42|  14.3k|	{ \
  |  |  |  |  |  |   43|  14.3k|		if (S) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (43:7): [True: 14.3k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   44|  14.3k|			(void) F((S)); \
  |  |  |  |  |  |   45|  14.3k|			(S) = 0; \
  |  |  |  |  |  |   46|  14.3k|		} \
  |  |  |  |  |  |   47|  14.3k|	} \
  |  |  |  |  |  |   48|  14.3k|	G_STMT_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  862|  14.3k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   60|  14.3k|				if (sst) \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 0, False: 14.3k]
  |  |  ------------------
  |  |   61|  14.3k|					(S) = g_strdup(sst); \
  |  |   62|  14.3k|			} \
  |  |   63|  14.3k|		} \
  |  |   64|  14.3k|	} \
  |  |   65|  14.3k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  14.3k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1865|  14.3k|		vips_connection_filename(VIPS_CONNECTION(rtiff->source)));
 1866|       |
 1867|  14.3k|	if (rtiff->n > 1)
  ------------------
  |  Branch (1867:6): [True: 0, False: 14.3k]
  ------------------
 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|  14.3k|	if (rtiff->header.subifd_count > 0)
  ------------------
  |  Branch (1870:6): [True: 20, False: 14.3k]
  ------------------
 1871|     20|		vips_image_set_int(out,
 1872|     20|			VIPS_META_N_SUBIFDS, rtiff->header.subifd_count);
  ------------------
  |  |  172|     20|#define VIPS_META_N_SUBIFDS "n-subifds"
  ------------------
 1873|       |
 1874|  14.3k|	vips_image_set_int(out, VIPS_META_N_PAGES, rtiff->n_pages);
  ------------------
  |  |  165|  14.3k|#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|  14.3k|	if (rtiff_pick_reader(rtiff)(rtiff, out))
  ------------------
  |  Branch (1879:6): [True: 111, False: 14.2k]
  ------------------
 1880|    111|		return -1;
 1881|       |
 1882|       |	/* Read any ICC profile.
 1883|       |	 */
 1884|  14.2k|	if (TIFFGetField(rtiff->tiff, TIFFTAG_ICCPROFILE, &data_len, &data))
  ------------------
  |  |  479|  14.2k|#define TIFFTAG_ICCPROFILE 34675 /* ICC profile data */
  ------------------
  |  Branch (1884:6): [True: 4, False: 14.2k]
  ------------------
 1885|      4|		vips_image_set_blob_copy(out, VIPS_META_ICC_NAME, data, data_len);
  ------------------
  |  |   78|      4|#define VIPS_META_ICC_NAME "icc-profile-data"
  ------------------
 1886|       |
 1887|       |	/* Read any XMP metadata.
 1888|       |	 */
 1889|  14.2k|	if (TIFFGetField(rtiff->tiff, TIFFTAG_XMLPACKET, &data_len, &data))
  ------------------
  |  |  394|  14.2k|#define TIFFTAG_XMLPACKET 700              /* %XML packet [Adobe XMP Specification, January 2004 */
  ------------------
  |  Branch (1889:6): [True: 70, False: 14.1k]
  ------------------
 1890|     70|		vips_image_set_blob_copy(out, VIPS_META_XMP_NAME, data, data_len);
  ------------------
  |  |   53|     70|#define VIPS_META_XMP_NAME "xmp-data"
  ------------------
 1891|       |
 1892|       |	/* Read any IPTC metadata.
 1893|       |	 */
 1894|  14.2k|	if (TIFFGetField(rtiff->tiff, TIFFTAG_RICHTIFFIPTC, &data_len, &data)) {
  ------------------
  |  |  448|  14.2k|#define TIFFTAG_RICHTIFFIPTC 33723
  ------------------
  |  Branch (1894:6): [True: 18, False: 14.2k]
  ------------------
 1895|     18|		vips_image_set_blob_copy(out, VIPS_META_IPTC_NAME, data, data_len);
  ------------------
  |  |   60|     18|#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|     18|		vips_image_set_blob_copy(out, "ipct-data", data, data_len);
 1901|     18|	}
 1902|       |
 1903|       |	/* Read any photoshop metadata.
 1904|       |	 */
 1905|  14.2k|	if (TIFFGetField(rtiff->tiff, TIFFTAG_PHOTOSHOP, &data_len, &data))
  ------------------
  |  |  475|  14.2k|#define TIFFTAG_PHOTOSHOP 34377
  ------------------
  |  Branch (1905:6): [True: 36, False: 14.2k]
  ------------------
 1906|     36|		vips_image_set_blob_copy(out, VIPS_META_PHOTOSHOP_NAME, data, data_len);
  ------------------
  |  |   68|     36|#define VIPS_META_PHOTOSHOP_NAME "photoshop-data"
  ------------------
 1907|       |
 1908|  14.2k|	if (rtiff->header.image_description)
  ------------------
  |  Branch (1908:6): [True: 40, False: 14.2k]
  ------------------
 1909|     40|		vips_image_set_string(out, VIPS_META_IMAGEDESCRIPTION,
  ------------------
  |  |   85|     40|#define VIPS_META_IMAGEDESCRIPTION "image-description"
  ------------------
 1910|     40|			rtiff->header.image_description);
 1911|       |
 1912|  14.2k|	if (get_resolution(rtiff->tiff, out))
  ------------------
  |  Branch (1912:6): [True: 0, False: 14.2k]
  ------------------
 1913|      0|		return -1;
 1914|       |
 1915|  14.2k|	vips_image_set_int(out, VIPS_META_BITS_PER_SAMPLE,
  ------------------
  |  |  100|  14.2k|#define VIPS_META_BITS_PER_SAMPLE "bits-per-sample"
  ------------------
 1916|  14.2k|		rtiff->header.bits_per_sample);
 1917|       |
 1918|       |	/* Set the "orientation" tag. This is picked up later by autorot, if
 1919|       |	 * requested.
 1920|       |	 */
 1921|  14.2k|	vips_image_set_int(out, VIPS_META_ORIENTATION, rtiff->header.orientation);
  ------------------
  |  |  149|  14.2k|#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|  14.2k|	vips_image_pipelinev(out,
 1927|  14.2k|		rtiff->header.tiled
  ------------------
  |  Branch (1927:3): [True: 3.16k, False: 11.0k]
  ------------------
 1928|  14.2k|			? VIPS_DEMAND_STYLE_SMALLTILE
 1929|  14.2k|			: VIPS_DEMAND_STYLE_THINSTRIP,
 1930|  14.2k|		NULL);
 1931|       |
 1932|  14.2k|	return 0;
 1933|  14.2k|}
tiff2vips.c:rtiff_pick_reader:
 1804|  14.3k|{
 1805|  14.3k|	int bits_per_sample = rtiff->header.bits_per_sample;
 1806|  14.3k|	int photometric_interpretation =
 1807|  14.3k|		rtiff->header.photometric_interpretation;
 1808|  14.3k|	int samples_per_pixel = rtiff->header.samples_per_pixel;
 1809|  14.3k|	int read_as_rgba = rtiff->header.read_as_rgba;
 1810|       |
 1811|  14.3k|	if (read_as_rgba)
  ------------------
  |  Branch (1811:6): [True: 4.29k, False: 10.0k]
  ------------------
 1812|  4.29k|		return rtiff_parse_rgba;
 1813|       |
 1814|  10.0k|	if (photometric_interpretation == PHOTOMETRIC_CIELAB) {
  ------------------
  |  |  228|  10.0k|#define PHOTOMETRIC_CIELAB 8               /* !1976 CIE L*a*b* */
  ------------------
  |  Branch (1814:6): [True: 353, False: 9.71k]
  ------------------
 1815|    353|		if (bits_per_sample == 8) {
  ------------------
  |  Branch (1815:7): [True: 321, False: 32]
  ------------------
 1816|    321|			if (samples_per_pixel > 3)
  ------------------
  |  Branch (1816:8): [True: 226, False: 95]
  ------------------
 1817|    226|				return rtiff_parse_lab_with_alpha;
 1818|     95|			else
 1819|     95|				return rtiff_parse_labpack;
 1820|    321|		}
 1821|     32|		if (bits_per_sample == 16)
  ------------------
  |  Branch (1821:7): [True: 18, False: 14]
  ------------------
 1822|     18|			return rtiff_parse_labs;
 1823|     32|	}
 1824|       |
 1825|  9.73k|	if (photometric_interpretation == PHOTOMETRIC_LOGLUV)
  ------------------
  |  |  233|  9.73k|#define PHOTOMETRIC_LOGLUV 32845           /* CIE Log2(L) (u',v') */
  ------------------
  |  Branch (1825:6): [True: 548, False: 9.18k]
  ------------------
 1826|    548|		return rtiff_parse_logluv;
 1827|       |
 1828|  9.18k|	if (photometric_interpretation == PHOTOMETRIC_MINISWHITE ||
  ------------------
  |  |  221|  18.3k|#define PHOTOMETRIC_MINISWHITE 0           /* min value is white */
  ------------------
  |  Branch (1828:6): [True: 3.49k, False: 5.68k]
  ------------------
 1829|  9.18k|		photometric_interpretation == PHOTOMETRIC_MINISBLACK) {
  ------------------
  |  |  222|  5.68k|#define PHOTOMETRIC_MINISBLACK 1           /* min value is black */
  ------------------
  |  Branch (1829:3): [True: 2.32k, False: 3.36k]
  ------------------
 1830|       |
 1831|  5.82k|		if (bits_per_sample == 1)
  ------------------
  |  Branch (1831:7): [True: 3.59k, False: 2.23k]
  ------------------
 1832|  3.59k|			return rtiff_parse_onebit;
 1833|  2.23k|		else if (bits_per_sample == 2)
  ------------------
  |  Branch (1833:12): [True: 224, False: 2.00k]
  ------------------
 1834|    224|			return rtiff_parse_twobit;
 1835|  2.00k|		else if (bits_per_sample == 4)
  ------------------
  |  Branch (1835:12): [True: 257, False: 1.75k]
  ------------------
 1836|    257|			return rtiff_parse_fourbit;
 1837|  1.75k|		else
 1838|  1.75k|			return rtiff_parse_greyscale;
 1839|  5.82k|	}
 1840|       |
 1841|  3.36k|	if (photometric_interpretation == PHOTOMETRIC_PALETTE)
  ------------------
  |  |  224|  3.36k|#define PHOTOMETRIC_PALETTE 3              /* color map indexed */
  ------------------
  |  Branch (1841:6): [True: 200, False: 3.16k]
  ------------------
 1842|    200|		return rtiff_parse_palette;
 1843|       |
 1844|  3.16k|	return rtiff_parse_copy;
 1845|  3.36k|}
tiff2vips.c:rtiff_parse_rgba:
 1781|  4.29k|{
 1782|  4.29k|	out->Bands = 4;
 1783|  4.29k|	out->Type = VIPS_INTERPRETATION_sRGB;
 1784|  4.29k|	out->BandFmt = VIPS_FORMAT_UCHAR;
 1785|  4.29k|	out->Coding = VIPS_CODING_NONE;
 1786|       |
 1787|  4.29k|	rtiff->client = out;
 1788|       |
 1789|       |	/* We'll have RGBA areas of exact size as we need, so we can just copy it
 1790|       |	 */
 1791|  4.29k|	rtiff->sfn = rtiff_memcpy_line;
 1792|  4.29k|	rtiff->memcpy = TRUE;
  ------------------
  |  |  209|  4.29k|#define TRUE    1
  ------------------
 1793|       |
 1794|  4.29k|	return 0;
 1795|  4.29k|}
tiff2vips.c:rtiff_memcpy_line:
 1686|  54.4k|{
 1687|  54.4k|	VipsImage *im = (VipsImage *) client;
 1688|  54.4k|	size_t len = n * VIPS_IMAGE_SIZEOF_PEL(im);
  ------------------
  |  |  384|  54.4k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|  54.4k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
 1689|       |
 1690|  54.4k|	memcpy(q, p, len);
 1691|  54.4k|}
tiff2vips.c:rtiff_parse_lab_with_alpha:
 1074|    226|{
 1075|    226|	if (rtiff_check_min_samples(rtiff, 4) ||
  ------------------
  |  Branch (1075:6): [True: 0, False: 226]
  ------------------
 1076|    226|		rtiff_check_bits(rtiff, 8) ||
  ------------------
  |  Branch (1076:3): [True: 0, False: 226]
  ------------------
 1077|    226|		rtiff_check_interpretation(rtiff, PHOTOMETRIC_CIELAB))
  ------------------
  |  |  228|    226|#define PHOTOMETRIC_CIELAB 8               /* !1976 CIE L*a*b* */
  ------------------
  |  Branch (1077:3): [True: 0, False: 226]
  ------------------
 1078|      0|		return -1;
 1079|       |
 1080|    226|	out->Bands = rtiff->header.samples_per_pixel;
 1081|    226|	out->BandFmt = VIPS_FORMAT_SHORT;
 1082|    226|	out->Coding = VIPS_CODING_NONE;
 1083|    226|	out->Type = VIPS_INTERPRETATION_LABS;
 1084|       |
 1085|    226|	rtiff->sfn = rtiff_lab_with_alpha_line;
 1086|       |
 1087|    226|	return 0;
 1088|    226|}
tiff2vips.c:rtiff_check_min_samples:
  878|  2.83k|{
  879|  2.83k|	if (rtiff->header.samples_per_pixel < samples_per_pixel) {
  ------------------
  |  Branch (879:6): [True: 10, False: 2.82k]
  ------------------
  880|     10|		vips_error("tiff2vips", _("not at least %d samples per pixel"),
  ------------------
  |  |   30|     10|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|     10|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  881|     10|			samples_per_pixel);
  882|     10|		return -1;
  883|     10|	}
  884|       |
  885|  2.82k|	return 0;
  886|  2.83k|}
tiff2vips.c:rtiff_check_bits:
  918|  4.40k|{
  919|  4.40k|	if (rtiff->header.bits_per_sample != bits_per_sample) {
  ------------------
  |  Branch (919:6): [True: 0, False: 4.40k]
  ------------------
  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|  4.40k|	return 0;
  925|  4.40k|}
tiff2vips.c:rtiff_check_interpretation:
  905|    877|{
  906|    877|	if (rtiff->header.photometric_interpretation !=
  ------------------
  |  Branch (906:6): [True: 0, False: 877]
  ------------------
  907|    877|		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|    877|	return 0;
  914|    877|}
tiff2vips.c:rtiff_lab_with_alpha_line:
 1046|  4.72k|{
 1047|  4.72k|	int samples_per_pixel = rtiff->header.samples_per_pixel;
 1048|       |
 1049|  4.72k|	unsigned char *p1;
 1050|  4.72k|	short *q1;
 1051|  4.72k|	int x;
 1052|       |
 1053|  4.72k|	p1 = (unsigned char *) p;
 1054|  4.72k|	q1 = (short *) q;
 1055|   228k|	for (x = 0; x < n; x++) {
  ------------------
  |  Branch (1055:14): [True: 224k, False: 4.72k]
  ------------------
 1056|   224k|		int i;
 1057|       |
 1058|   224k|		q1[0] = ((unsigned int) p1[0]) * 32767 / 255;
 1059|   224k|		q1[1] = ((short) p1[1]) << 8;
 1060|   224k|		q1[2] = ((short) p1[2]) << 8;
 1061|       |
 1062|   448k|		for (i = 3; i < samples_per_pixel; i++)
  ------------------
  |  Branch (1062:15): [True: 224k, False: 224k]
  ------------------
 1063|   224k|			q1[i] = (p1[i] << 8) + p1[i];
 1064|       |
 1065|   224k|		q1 += samples_per_pixel;
 1066|   224k|		p1 += samples_per_pixel;
 1067|   224k|	}
 1068|  4.72k|}
tiff2vips.c:rtiff_parse_labpack:
 1024|     95|{
 1025|     95|	if (rtiff_check_min_samples(rtiff, 3) ||
  ------------------
  |  Branch (1025:6): [True: 3, False: 92]
  ------------------
 1026|     95|		rtiff_check_bits(rtiff, 8) ||
  ------------------
  |  Branch (1026:3): [True: 0, False: 92]
  ------------------
 1027|     95|		rtiff_check_interpretation(rtiff, PHOTOMETRIC_CIELAB))
  ------------------
  |  |  228|     92|#define PHOTOMETRIC_CIELAB 8               /* !1976 CIE L*a*b* */
  ------------------
  |  Branch (1027:3): [True: 0, False: 92]
  ------------------
 1028|      3|		return -1;
 1029|       |
 1030|     92|	out->Bands = 4;
 1031|     92|	out->BandFmt = VIPS_FORMAT_UCHAR;
 1032|     92|	out->Coding = VIPS_CODING_LABQ;
 1033|     92|	out->Type = VIPS_INTERPRETATION_LAB;
 1034|       |
 1035|     92|	rtiff->sfn = rtiff_labpack_line;
 1036|       |
 1037|     92|	return 0;
 1038|     95|}
tiff2vips.c:rtiff_labpack_line:
 1004|  2.14k|{
 1005|  2.14k|	int samples_per_pixel = rtiff->header.samples_per_pixel;
 1006|       |
 1007|  2.14k|	int x;
 1008|       |
 1009|  99.6k|	for (x = 0; x < n; x++) {
  ------------------
  |  Branch (1009:14): [True: 97.4k, False: 2.14k]
  ------------------
 1010|  97.4k|		q[0] = p[0];
 1011|  97.4k|		q[1] = p[1];
 1012|  97.4k|		q[2] = p[2];
 1013|  97.4k|		q[3] = 0;
 1014|       |
 1015|  97.4k|		q += 4;
 1016|  97.4k|		p += samples_per_pixel;
 1017|  97.4k|	}
 1018|  2.14k|}
tiff2vips.c:rtiff_parse_labs:
 1121|     18|{
 1122|     18|	if (rtiff_check_min_samples(rtiff, 3) ||
  ------------------
  |  Branch (1122:6): [True: 1, False: 17]
  ------------------
 1123|     18|		rtiff_check_bits(rtiff, 16) ||
  ------------------
  |  Branch (1123:3): [True: 0, False: 17]
  ------------------
 1124|     18|		rtiff_check_interpretation(rtiff, PHOTOMETRIC_CIELAB))
  ------------------
  |  |  228|     17|#define PHOTOMETRIC_CIELAB 8               /* !1976 CIE L*a*b* */
  ------------------
  |  Branch (1124:3): [True: 0, False: 17]
  ------------------
 1125|      1|		return -1;
 1126|       |
 1127|     17|	out->Bands = rtiff->header.samples_per_pixel;
 1128|     17|	out->BandFmt = VIPS_FORMAT_SHORT;
 1129|     17|	out->Coding = VIPS_CODING_NONE;
 1130|     17|	out->Type = VIPS_INTERPRETATION_LABS;
 1131|       |
 1132|     17|	rtiff->sfn = rtiff_labs_line;
 1133|       |
 1134|     17|	return 0;
 1135|     18|}
tiff2vips.c:rtiff_labs_line:
 1094|    709|{
 1095|    709|	int samples_per_pixel = rtiff->header.samples_per_pixel;
 1096|       |
 1097|    709|	unsigned short *p1;
 1098|    709|	short *q1;
 1099|    709|	int x;
 1100|    709|	int i;
 1101|       |
 1102|    709|	p1 = (unsigned short *) p;
 1103|    709|	q1 = (short *) q;
 1104|  20.1k|	for (x = 0; x < n; x++) {
  ------------------
  |  Branch (1104:14): [True: 19.4k, False: 709]
  ------------------
 1105|       |		/* We use signed int16 for L.
 1106|       |		 */
 1107|  19.4k|		q1[0] = p1[0] >> 1;
 1108|       |
 1109|  62.5k|		for (i = 1; i < samples_per_pixel; i++)
  ------------------
  |  Branch (1109:15): [True: 43.1k, False: 19.4k]
  ------------------
 1110|  43.1k|			q1[i] = p1[i];
 1111|       |
 1112|  19.4k|		q1 += samples_per_pixel;
 1113|  19.4k|		p1 += samples_per_pixel;
 1114|  19.4k|	}
 1115|    709|}
tiff2vips.c:rtiff_parse_logluv:
 1168|    548|{
 1169|    548|	if (rtiff_check_min_samples(rtiff, 3) ||
  ------------------
  |  Branch (1169:6): [True: 6, False: 542]
  ------------------
 1170|    548|		rtiff_check_interpretation(rtiff, PHOTOMETRIC_LOGLUV))
  ------------------
  |  |  233|    542|#define PHOTOMETRIC_LOGLUV 32845           /* CIE Log2(L) (u',v') */
  ------------------
  |  Branch (1170:3): [True: 0, False: 542]
  ------------------
 1171|      6|		return -1;
 1172|       |
 1173|    542|	out->Bands = rtiff->header.samples_per_pixel;
 1174|    542|	out->BandFmt = VIPS_FORMAT_FLOAT;
 1175|    542|	out->Coding = VIPS_CODING_NONE;
 1176|    542|	out->Type = VIPS_INTERPRETATION_XYZ;
 1177|       |
 1178|    542|	rtiff->sfn = rtiff_logluv_line;
 1179|       |
 1180|    542|	return 0;
 1181|    548|}
tiff2vips.c:rtiff_logluv_line:
 1141|  19.2k|{
 1142|  19.2k|	int samples_per_pixel = rtiff->header.samples_per_pixel;
 1143|       |
 1144|  19.2k|	float *p1;
 1145|  19.2k|	float *q1;
 1146|  19.2k|	int x;
 1147|  19.2k|	int i;
 1148|       |
 1149|  19.2k|	p1 = (float *) p;
 1150|  19.2k|	q1 = (float *) q;
 1151|   799k|	for (x = 0; x < n; x++) {
  ------------------
  |  Branch (1151:14): [True: 780k, False: 19.2k]
  ------------------
 1152|   780k|		q1[0] = VIPS_D65_X0 * p1[0];
  ------------------
  |  |   58|   780k|#define VIPS_D65_X0 (95.0470)
  ------------------
 1153|   780k|		q1[1] = VIPS_D65_Y0 * p1[1];
  ------------------
  |  |   59|   780k|#define VIPS_D65_Y0 (100.0)
  ------------------
 1154|   780k|		q1[2] = VIPS_D65_Z0 * p1[2];
  ------------------
  |  |   60|   780k|#define VIPS_D65_Z0 (108.8827)
  ------------------
 1155|       |
 1156|  1.27M|		for (i = 3; i < samples_per_pixel; i++)
  ------------------
  |  Branch (1156:15): [True: 490k, False: 780k]
  ------------------
 1157|   490k|			q1[i] = p1[i];
 1158|       |
 1159|   780k|		q1 += samples_per_pixel;
 1160|   780k|		p1 += samples_per_pixel;
 1161|   780k|	}
 1162|  19.2k|}
tiff2vips.c:rtiff_parse_onebit:
 1252|  3.59k|{
 1253|  3.59k|	if (rtiff_check_samples(rtiff, 1) ||
  ------------------
  |  Branch (1253:6): [True: 3, False: 3.58k]
  ------------------
 1254|  3.59k|		rtiff_check_bits(rtiff, 1))
  ------------------
  |  Branch (1254:3): [True: 0, False: 3.58k]
  ------------------
 1255|      3|		return -1;
 1256|       |
 1257|  3.58k|	out->Bands = 1;
 1258|  3.58k|	out->BandFmt = VIPS_FORMAT_UCHAR;
 1259|  3.58k|	out->Coding = VIPS_CODING_NONE;
 1260|  3.58k|	out->Type = VIPS_INTERPRETATION_B_W;
 1261|       |
 1262|  3.58k|	rtiff->sfn = rtiff_1bit_line;
 1263|       |
 1264|  3.58k|	return 0;
 1265|  3.59k|}
tiff2vips.c:rtiff_check_samples:
  865|  4.07k|{
  866|  4.07k|	if (rtiff->header.samples_per_pixel != samples_per_pixel) {
  ------------------
  |  Branch (866:6): [True: 5, False: 4.06k]
  ------------------
  867|      5|		vips_error("tiff2vips", _("not %d bands"), samples_per_pixel);
  ------------------
  |  |   30|      5|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      5|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  868|      5|		return -1;
  869|      5|	}
  870|       |
  871|  4.06k|	return 0;
  872|  4.07k|}
tiff2vips.c:rtiff_1bit_line:
 1190|   587k|	{ \
 1191|   587k|		int photometric = rtiff->header.photometric_interpretation; \
 1192|   587k|		int mask = photometric == PHOTOMETRIC_MINISBLACK ? 0 : 0xff; \
  ------------------
  |  |  222|   587k|#define PHOTOMETRIC_MINISBLACK 1           /* min value is black */
  ------------------
  |  Branch (1192:14): [True: 144k, False: 442k]
  ------------------
 1193|   587k|		int bps = rtiff->header.bits_per_sample; \
 1194|   587k|		int load = 8 / bps - 1; \
 1195|   587k|\
 1196|   587k|		int x; \
 1197|   587k|		VipsPel bits; \
 1198|   587k|\
 1199|   587k|		/* Stop a compiler warning. \
 1200|   587k|		 */ \
 1201|   587k|		bits = 0; \
 1202|   587k|\
 1203|  15.1M|		for (x = 0; x < n; x++) { \
  ------------------
  |  Branch (1203:15): [True: 14.6M, False: 587k]
  ------------------
 1204|  14.6M|			if ((x & load) == 0) \
  ------------------
  |  Branch (1204:8): [True: 1.92M, False: 12.6M]
  ------------------
 1205|  14.6M|				/* Flip the bits for miniswhite. \
 1206|  14.6M|				 */ \
 1207|  14.6M|				bits = *p++ ^ mask; \
 1208|  14.6M|\
 1209|  14.6M|			EXPAND(q[x], bits); \
  ------------------
  |  | 1244|  14.6M|NBIT_LINE(1, EXPAND1)
  |  |  ------------------
  |  |  |  | 1218|  14.6M|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  14.6M|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  | 1219|  14.6M|	{ \
  |  |  |  | 1220|  14.6M|		(Q) = (((signed char) (BITS & 128)) >> 7); \
  |  |  |  | 1221|  14.6M|	} \
  |  |  |  | 1222|  14.6M|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  14.6M|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1210|  14.6M|\
 1211|  14.6M|			bits <<= bps; \
 1212|  14.6M|		} \
 1213|   587k|	}
tiff2vips.c:rtiff_parse_twobit:
 1271|    224|{
 1272|    224|	if (rtiff_check_samples(rtiff, 1) ||
  ------------------
  |  Branch (1272:6): [True: 1, False: 223]
  ------------------
 1273|    224|		rtiff_check_bits(rtiff, 2))
  ------------------
  |  Branch (1273:3): [True: 0, False: 223]
  ------------------
 1274|      1|		return -1;
 1275|       |
 1276|    223|	out->Bands = 1;
 1277|    223|	out->BandFmt = VIPS_FORMAT_UCHAR;
 1278|    223|	out->Coding = VIPS_CODING_NONE;
 1279|    223|	out->Type = VIPS_INTERPRETATION_B_W;
 1280|       |
 1281|    223|	rtiff->sfn = rtiff_2bit_line;
 1282|       |
 1283|    223|	return 0;
 1284|    224|}
tiff2vips.c:rtiff_2bit_line:
 1190|  11.5k|	{ \
 1191|  11.5k|		int photometric = rtiff->header.photometric_interpretation; \
 1192|  11.5k|		int mask = photometric == PHOTOMETRIC_MINISBLACK ? 0 : 0xff; \
  ------------------
  |  |  222|  11.5k|#define PHOTOMETRIC_MINISBLACK 1           /* min value is black */
  ------------------
  |  Branch (1192:14): [True: 6.13k, False: 5.36k]
  ------------------
 1193|  11.5k|		int bps = rtiff->header.bits_per_sample; \
 1194|  11.5k|		int load = 8 / bps - 1; \
 1195|  11.5k|\
 1196|  11.5k|		int x; \
 1197|  11.5k|		VipsPel bits; \
 1198|  11.5k|\
 1199|  11.5k|		/* Stop a compiler warning. \
 1200|  11.5k|		 */ \
 1201|  11.5k|		bits = 0; \
 1202|  11.5k|\
 1203|   469k|		for (x = 0; x < n; x++) { \
  ------------------
  |  Branch (1203:15): [True: 457k, False: 11.5k]
  ------------------
 1204|   457k|			if ((x & load) == 0) \
  ------------------
  |  Branch (1204:8): [True: 117k, False: 340k]
  ------------------
 1205|   457k|				/* Flip the bits for miniswhite. \
 1206|   457k|				 */ \
 1207|   457k|				bits = *p++ ^ mask; \
 1208|   457k|\
 1209|   457k|			EXPAND(q[x], bits); \
  ------------------
  |  | 1245|   457k|NBIT_LINE(2, EXPAND2)
  |  |  ------------------
  |  |  |  | 1227|   457k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   457k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  | 1228|   457k|	{ \
  |  |  |  | 1229|   457k|		VipsPel twobits = BITS >> 6; \
  |  |  |  | 1230|   457k|		VipsPel fourbits = twobits | (twobits << 2); \
  |  |  |  | 1231|   457k|		Q = fourbits | (fourbits << 4); \
  |  |  |  | 1232|   457k|	} \
  |  |  |  | 1233|   457k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   457k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1210|   457k|\
 1211|   457k|			bits <<= bps; \
 1212|   457k|		} \
 1213|  11.5k|	}
tiff2vips.c:rtiff_parse_fourbit:
 1290|    257|{
 1291|    257|	if (rtiff_check_samples(rtiff, 1) ||
  ------------------
  |  Branch (1291:6): [True: 1, False: 256]
  ------------------
 1292|    257|		rtiff_check_bits(rtiff, 4))
  ------------------
  |  Branch (1292:3): [True: 0, False: 256]
  ------------------
 1293|      1|		return -1;
 1294|       |
 1295|    256|	out->Bands = 1;
 1296|    256|	out->BandFmt = VIPS_FORMAT_UCHAR;
 1297|    256|	out->Coding = VIPS_CODING_NONE;
 1298|    256|	out->Type = VIPS_INTERPRETATION_B_W;
 1299|       |
 1300|    256|	rtiff->sfn = rtiff_4bit_line;
 1301|       |
 1302|    256|	return 0;
 1303|    257|}
tiff2vips.c:rtiff_4bit_line:
 1190|  13.5k|	{ \
 1191|  13.5k|		int photometric = rtiff->header.photometric_interpretation; \
 1192|  13.5k|		int mask = photometric == PHOTOMETRIC_MINISBLACK ? 0 : 0xff; \
  ------------------
  |  |  222|  13.5k|#define PHOTOMETRIC_MINISBLACK 1           /* min value is black */
  ------------------
  |  Branch (1192:14): [True: 0, False: 13.5k]
  ------------------
 1193|  13.5k|		int bps = rtiff->header.bits_per_sample; \
 1194|  13.5k|		int load = 8 / bps - 1; \
 1195|  13.5k|\
 1196|  13.5k|		int x; \
 1197|  13.5k|		VipsPel bits; \
 1198|  13.5k|\
 1199|  13.5k|		/* Stop a compiler warning. \
 1200|  13.5k|		 */ \
 1201|  13.5k|		bits = 0; \
 1202|  13.5k|\
 1203|   514k|		for (x = 0; x < n; x++) { \
  ------------------
  |  Branch (1203:15): [True: 501k, False: 13.5k]
  ------------------
 1204|   501k|			if ((x & load) == 0) \
  ------------------
  |  Branch (1204:8): [True: 256k, False: 244k]
  ------------------
 1205|   501k|				/* Flip the bits for miniswhite. \
 1206|   501k|				 */ \
 1207|   501k|				bits = *p++ ^ mask; \
 1208|   501k|\
 1209|   501k|			EXPAND(q[x], bits); \
  ------------------
  |  | 1246|   501k|NBIT_LINE(4, EXPAND4)
  |  |  ------------------
  |  |  |  | 1238|   501k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   501k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  | 1239|   501k|	{ \
  |  |  |  | 1240|   501k|		Q = (BITS & 0xf0) | (BITS >> 4); \
  |  |  |  | 1241|   501k|	} \
  |  |  |  | 1242|   501k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   501k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1210|   501k|\
 1211|   501k|			bits <<= bps; \
 1212|   501k|		} \
 1213|  13.5k|	}
tiff2vips.c:rtiff_parse_greyscale:
 1419|  1.75k|{
 1420|  1.75k|	if (rtiff_check_min_samples(rtiff, 1) ||
  ------------------
  |  Branch (1420:6): [True: 0, False: 1.75k]
  ------------------
 1421|  1.75k|		rtiff_non_fractional(rtiff))
  ------------------
  |  Branch (1421:3): [True: 2, False: 1.74k]
  ------------------
 1422|      2|		return -1;
 1423|       |
 1424|  1.74k|	out->Bands = rtiff->header.samples_per_pixel;
 1425|  1.74k|	out->BandFmt = rtiff_guess_format(rtiff);
 1426|  1.74k|	if (out->BandFmt == VIPS_FORMAT_NOTSET)
  ------------------
  |  Branch (1426:6): [True: 3, False: 1.74k]
  ------------------
 1427|      3|		return -1;
 1428|  1.74k|	out->Coding = VIPS_CODING_NONE;
 1429|       |
 1430|  1.74k|	if (rtiff->header.bits_per_sample == 16)
  ------------------
  |  Branch (1430:6): [True: 570, False: 1.17k]
  ------------------
 1431|    570|		out->Type = VIPS_INTERPRETATION_GREY16;
 1432|  1.17k|	else
 1433|  1.17k|		out->Type = VIPS_INTERPRETATION_B_W;
 1434|       |
 1435|       |	/* rtiff_greyscale_line() doesn't do complex.
 1436|       |	 */
 1437|  1.74k|	if (vips_check_noncomplex("tiff2vips", out))
  ------------------
  |  Branch (1437:6): [True: 0, False: 1.74k]
  ------------------
 1438|      0|		return -1;
 1439|       |
 1440|  1.74k|	rtiff->sfn = rtiff_greyscale_line;
 1441|       |
 1442|  1.74k|	return 0;
 1443|  1.74k|}
tiff2vips.c:rtiff_non_fractional:
  892|  4.91k|{
  893|  4.91k|	if (rtiff->header.bits_per_sample % 8 != 0 ||
  ------------------
  |  Branch (893:6): [True: 89, False: 4.82k]
  ------------------
  894|  4.91k|		rtiff->header.bits_per_sample == 0) {
  ------------------
  |  Branch (894:3): [True: 0, False: 4.82k]
  ------------------
  895|     89|		vips_error("tiff2vips", "%s", _("samples_per_pixel "
  ------------------
  |  |   30|     89|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|     89|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  896|     89|										"not a whole number of bytes"));
  897|     89|		return -1;
  898|     89|	}
  899|       |
  900|  4.82k|	return 0;
  901|  4.91k|}
tiff2vips.c:rtiff_guess_format:
  946|  61.2k|{
  947|  61.2k|	int bits_per_sample = rtiff->header.bits_per_sample;
  948|  61.2k|	int sample_format = rtiff->header.sample_format;
  949|       |
  950|  61.2k|	switch (bits_per_sample) {
  951|      0|	case 1:
  ------------------
  |  Branch (951:2): [True: 0, False: 61.2k]
  ------------------
  952|      0|	case 2:
  ------------------
  |  Branch (952:2): [True: 0, False: 61.2k]
  ------------------
  953|      0|	case 4:
  ------------------
  |  Branch (953:2): [True: 0, False: 61.2k]
  ------------------
  954|  15.8k|	case 8:
  ------------------
  |  Branch (954:2): [True: 15.8k, False: 45.4k]
  ------------------
  955|  15.8k|		if (sample_format == SAMPLEFORMAT_INT)
  ------------------
  |  |  335|  15.8k|#define SAMPLEFORMAT_INT 2                 /* !signed integer data */
  ------------------
  |  Branch (955:7): [True: 7.52k, False: 8.27k]
  ------------------
  956|  7.52k|			return VIPS_FORMAT_CHAR;
  957|  8.27k|		if (sample_format == SAMPLEFORMAT_UINT)
  ------------------
  |  |  334|  8.27k|#define SAMPLEFORMAT_UINT 1                /* !unsigned integer data */
  ------------------
  |  Branch (957:7): [True: 8.27k, False: 3]
  ------------------
  958|  8.27k|			return VIPS_FORMAT_UCHAR;
  959|      3|		break;
  960|       |
  961|  16.2k|	case 16:
  ------------------
  |  Branch (961:2): [True: 16.2k, False: 45.0k]
  ------------------
  962|  16.2k|		if (sample_format == SAMPLEFORMAT_INT)
  ------------------
  |  |  335|  16.2k|#define SAMPLEFORMAT_INT 2                 /* !signed integer data */
  ------------------
  |  Branch (962:7): [True: 3.78k, False: 12.4k]
  ------------------
  963|  3.78k|			return VIPS_FORMAT_SHORT;
  964|  12.4k|		if (sample_format == SAMPLEFORMAT_UINT)
  ------------------
  |  |  334|  12.4k|#define SAMPLEFORMAT_UINT 1                /* !unsigned integer data */
  ------------------
  |  Branch (964:7): [True: 6.48k, False: 5.95k]
  ------------------
  965|  6.48k|			return VIPS_FORMAT_USHORT;
  966|  5.95k|		if (sample_format == SAMPLEFORMAT_IEEEFP)
  ------------------
  |  |  336|  5.95k|#define SAMPLEFORMAT_IEEEFP 3              /* !IEEE floating point data */
  ------------------
  |  Branch (966:7): [True: 5.95k, False: 1]
  ------------------
  967|  5.95k|			return VIPS_FORMAT_FLOAT;
  968|      1|		break;
  969|       |
  970|  29.2k|	case 32:
  ------------------
  |  Branch (970:2): [True: 29.2k, False: 32.0k]
  ------------------
  971|  29.2k|		if (sample_format == SAMPLEFORMAT_INT)
  ------------------
  |  |  335|  29.2k|#define SAMPLEFORMAT_INT 2                 /* !signed integer data */
  ------------------
  |  Branch (971:7): [True: 12.9k, False: 16.3k]
  ------------------
  972|  12.9k|			return VIPS_FORMAT_INT;
  973|  16.3k|		if (sample_format == SAMPLEFORMAT_UINT)
  ------------------
  |  |  334|  16.3k|#define SAMPLEFORMAT_UINT 1                /* !unsigned integer data */
  ------------------
  |  Branch (973:7): [True: 13.4k, False: 2.89k]
  ------------------
  974|  13.4k|			return VIPS_FORMAT_UINT;
  975|  2.89k|		if (sample_format == SAMPLEFORMAT_IEEEFP)
  ------------------
  |  |  336|  2.89k|#define SAMPLEFORMAT_IEEEFP 3              /* !IEEE floating point data */
  ------------------
  |  Branch (975:7): [True: 2.89k, False: 1]
  ------------------
  976|  2.89k|			return VIPS_FORMAT_FLOAT;
  977|      1|		break;
  978|       |
  979|      1|	case 64:
  ------------------
  |  Branch (979:2): [True: 0, False: 61.2k]
  ------------------
  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: 61.2k]
  ------------------
  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|      2|	default:
  ------------------
  |  Branch (991:2): [True: 2, False: 61.2k]
  ------------------
  992|      2|		break;
  993|  61.2k|	}
  994|       |
  995|      7|	vips_error("tiff2vips", "%s", _("unsupported tiff image type\n"));
  ------------------
  |  |   30|      7|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      7|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  996|       |
  997|      7|	return VIPS_FORMAT_NOTSET;
  998|  61.2k|}
tiff2vips.c:rtiff_greyscale_line:
 1356|  56.4k|{
 1357|  56.4k|	int samples_per_pixel = rtiff->header.samples_per_pixel;
 1358|  56.4k|	int bits_per_sample = rtiff->header.bits_per_sample;
 1359|  56.4k|	int photometric_interpretation =
 1360|  56.4k|		rtiff->header.photometric_interpretation;
 1361|  56.4k|	VipsBandFormat format = rtiff_guess_format(rtiff);
 1362|       |
 1363|       |	/* Swapping black and white doesn't make sense for the signed formats.
 1364|       |	 */
 1365|  56.4k|	gboolean invert =
 1366|  56.4k|		photometric_interpretation == PHOTOMETRIC_MINISWHITE &&
  ------------------
  |  |  221|   112k|#define PHOTOMETRIC_MINISWHITE 0           /* min value is white */
  ------------------
  |  Branch (1366:3): [True: 35.7k, False: 20.7k]
  ------------------
 1367|  56.4k|		vips_band_format_isuint(format);
  ------------------
  |  Branch (1367:3): [True: 14.6k, False: 21.0k]
  ------------------
 1368|       |
 1369|  56.4k|	int x, i;
 1370|       |
 1371|  56.4k|	switch (format) {
 1372|  7.09k|	case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (1372:2): [True: 7.09k, False: 49.3k]
  ------------------
 1373|  7.09k|		GREY_LOOP(gchar, 0);
  ------------------
  |  | 1308|  7.09k|	{ \
  |  | 1309|  7.09k|		TYPE *p1; \
  |  | 1310|  7.09k|		TYPE *q1; \
  |  | 1311|  7.09k|\
  |  | 1312|  7.09k|		p1 = (TYPE *) p; \
  |  | 1313|  7.09k|		q1 = (TYPE *) q; \
  |  | 1314|   247k|		for (x = 0; x < n; x++) { \
  |  |  ------------------
  |  |  |  Branch (1314:15): [True: 240k, False: 7.09k]
  |  |  ------------------
  |  | 1315|   240k|			if (invert) \
  |  |  ------------------
  |  |  |  Branch (1315:8): [True: 0, False: 240k]
  |  |  ------------------
  |  | 1316|   240k|				q1[0] = MAX - p1[0]; \
  |  | 1317|   240k|			else \
  |  | 1318|   240k|				q1[0] = p1[0]; \
  |  | 1319|   240k|\
  |  | 1320|   680k|			for (i = 1; i < samples_per_pixel; i++) \
  |  |  ------------------
  |  |  |  Branch (1320:16): [True: 440k, False: 240k]
  |  |  ------------------
  |  | 1321|   440k|				q1[i] = p1[i]; \
  |  | 1322|   240k|\
  |  | 1323|   240k|			q1 += samples_per_pixel; \
  |  | 1324|   240k|			p1 += samples_per_pixel; \
  |  | 1325|   240k|		} \
  |  | 1326|  7.09k|	}
  ------------------
 1374|  7.09k|		break;
 1375|       |
 1376|  7.02k|	case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (1376:2): [True: 7.02k, False: 49.4k]
  ------------------
 1377|  7.02k|		GREY_LOOP(guchar, UCHAR_MAX);
  ------------------
  |  | 1308|  7.02k|	{ \
  |  | 1309|  7.02k|		TYPE *p1; \
  |  | 1310|  7.02k|		TYPE *q1; \
  |  | 1311|  7.02k|\
  |  | 1312|  7.02k|		p1 = (TYPE *) p; \
  |  | 1313|  7.02k|		q1 = (TYPE *) q; \
  |  | 1314|   233k|		for (x = 0; x < n; x++) { \
  |  |  ------------------
  |  |  |  Branch (1314:15): [True: 226k, False: 7.02k]
  |  |  ------------------
  |  | 1315|   226k|			if (invert) \
  |  |  ------------------
  |  |  |  Branch (1315:8): [True: 117k, False: 109k]
  |  |  ------------------
  |  | 1316|   226k|				q1[0] = MAX - p1[0]; \
  |  | 1317|   226k|			else \
  |  | 1318|   226k|				q1[0] = p1[0]; \
  |  | 1319|   226k|\
  |  | 1320|   507k|			for (i = 1; i < samples_per_pixel; i++) \
  |  |  ------------------
  |  |  |  Branch (1320:16): [True: 280k, False: 226k]
  |  |  ------------------
  |  | 1321|   280k|				q1[i] = p1[i]; \
  |  | 1322|   226k|\
  |  | 1323|   226k|			q1 += samples_per_pixel; \
  |  | 1324|   226k|			p1 += samples_per_pixel; \
  |  | 1325|   226k|		} \
  |  | 1326|  7.02k|	}
  ------------------
 1378|  7.02k|		break;
 1379|       |
 1380|  3.48k|	case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (1380:2): [True: 3.48k, False: 52.9k]
  ------------------
 1381|  3.48k|		GREY_LOOP(gshort, 0);
  ------------------
  |  | 1308|  3.48k|	{ \
  |  | 1309|  3.48k|		TYPE *p1; \
  |  | 1310|  3.48k|		TYPE *q1; \
  |  | 1311|  3.48k|\
  |  | 1312|  3.48k|		p1 = (TYPE *) p; \
  |  | 1313|  3.48k|		q1 = (TYPE *) q; \
  |  | 1314|   151k|		for (x = 0; x < n; x++) { \
  |  |  ------------------
  |  |  |  Branch (1314:15): [True: 147k, False: 3.48k]
  |  |  ------------------
  |  | 1315|   147k|			if (invert) \
  |  |  ------------------
  |  |  |  Branch (1315:8): [True: 0, False: 147k]
  |  |  ------------------
  |  | 1316|   147k|				q1[0] = MAX - p1[0]; \
  |  | 1317|   147k|			else \
  |  | 1318|   147k|				q1[0] = p1[0]; \
  |  | 1319|   147k|\
  |  | 1320|   246k|			for (i = 1; i < samples_per_pixel; i++) \
  |  |  ------------------
  |  |  |  Branch (1320:16): [True: 98.9k, False: 147k]
  |  |  ------------------
  |  | 1321|   147k|				q1[i] = p1[i]; \
  |  | 1322|   147k|\
  |  | 1323|   147k|			q1 += samples_per_pixel; \
  |  | 1324|   147k|			p1 += samples_per_pixel; \
  |  | 1325|   147k|		} \
  |  | 1326|  3.48k|	}
  ------------------
 1382|  3.48k|		break;
 1383|       |
 1384|  5.80k|	case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (1384:2): [True: 5.80k, False: 50.6k]
  ------------------
 1385|  5.80k|		GREY_LOOP(gushort, USHRT_MAX);
  ------------------
  |  | 1308|  5.80k|	{ \
  |  | 1309|  5.80k|		TYPE *p1; \
  |  | 1310|  5.80k|		TYPE *q1; \
  |  | 1311|  5.80k|\
  |  | 1312|  5.80k|		p1 = (TYPE *) p; \
  |  | 1313|  5.80k|		q1 = (TYPE *) q; \
  |  | 1314|   235k|		for (x = 0; x < n; x++) { \
  |  |  ------------------
  |  |  |  Branch (1314:15): [True: 229k, False: 5.80k]
  |  |  ------------------
  |  | 1315|   229k|			if (invert) \
  |  |  ------------------
  |  |  |  Branch (1315:8): [True: 110k, False: 119k]
  |  |  ------------------
  |  | 1316|   229k|				q1[0] = MAX - p1[0]; \
  |  | 1317|   229k|			else \
  |  | 1318|   229k|				q1[0] = p1[0]; \
  |  | 1319|   229k|\
  |  | 1320|   448k|			for (i = 1; i < samples_per_pixel; i++) \
  |  |  ------------------
  |  |  |  Branch (1320:16): [True: 218k, False: 229k]
  |  |  ------------------
  |  | 1321|   229k|				q1[i] = p1[i]; \
  |  | 1322|   229k|\
  |  | 1323|   229k|			q1 += samples_per_pixel; \
  |  | 1324|   229k|			p1 += samples_per_pixel; \
  |  | 1325|   229k|		} \
  |  | 1326|  5.80k|	}
  ------------------
 1386|  5.80k|		break;
 1387|       |
 1388|  12.4k|	case VIPS_FORMAT_INT:
  ------------------
  |  Branch (1388:2): [True: 12.4k, False: 44.0k]
  ------------------
 1389|  12.4k|		GREY_LOOP(gint, 0);
  ------------------
  |  | 1308|  12.4k|	{ \
  |  | 1309|  12.4k|		TYPE *p1; \
  |  | 1310|  12.4k|		TYPE *q1; \
  |  | 1311|  12.4k|\
  |  | 1312|  12.4k|		p1 = (TYPE *) p; \
  |  | 1313|  12.4k|		q1 = (TYPE *) q; \
  |  | 1314|   423k|		for (x = 0; x < n; x++) { \
  |  |  ------------------
  |  |  |  Branch (1314:15): [True: 410k, False: 12.4k]
  |  |  ------------------
  |  | 1315|   410k|			if (invert) \
  |  |  ------------------
  |  |  |  Branch (1315:8): [True: 0, False: 410k]
  |  |  ------------------
  |  | 1316|   410k|				q1[0] = MAX - p1[0]; \
  |  | 1317|   410k|			else \
  |  | 1318|   410k|				q1[0] = p1[0]; \
  |  | 1319|   410k|\
  |  | 1320|   965k|			for (i = 1; i < samples_per_pixel; i++) \
  |  |  ------------------
  |  |  |  Branch (1320:16): [True: 554k, False: 410k]
  |  |  ------------------
  |  | 1321|   554k|				q1[i] = p1[i]; \
  |  | 1322|   410k|\
  |  | 1323|   410k|			q1 += samples_per_pixel; \
  |  | 1324|   410k|			p1 += samples_per_pixel; \
  |  | 1325|   410k|		} \
  |  | 1326|  12.4k|	}
  ------------------
 1390|  12.4k|		break;
 1391|       |
 1392|  12.3k|	case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (1392:2): [True: 12.3k, False: 44.1k]
  ------------------
 1393|  12.3k|		GREY_LOOP(guint, UINT_MAX);
  ------------------
  |  | 1308|  12.3k|	{ \
  |  | 1309|  12.3k|		TYPE *p1; \
  |  | 1310|  12.3k|		TYPE *q1; \
  |  | 1311|  12.3k|\
  |  | 1312|  12.3k|		p1 = (TYPE *) p; \
  |  | 1313|  12.3k|		q1 = (TYPE *) q; \
  |  | 1314|   420k|		for (x = 0; x < n; x++) { \
  |  |  ------------------
  |  |  |  Branch (1314:15): [True: 408k, False: 12.3k]
  |  |  ------------------
  |  | 1315|   408k|			if (invert) \
  |  |  ------------------
  |  |  |  Branch (1315:8): [True: 245k, False: 162k]
  |  |  ------------------
  |  | 1316|   408k|				q1[0] = MAX - p1[0]; \
  |  | 1317|   408k|			else \
  |  | 1318|   408k|				q1[0] = p1[0]; \
  |  | 1319|   408k|\
  |  | 1320|   797k|			for (i = 1; i < samples_per_pixel; i++) \
  |  |  ------------------
  |  |  |  Branch (1320:16): [True: 389k, False: 408k]
  |  |  ------------------
  |  | 1321|   408k|				q1[i] = p1[i]; \
  |  | 1322|   408k|\
  |  | 1323|   408k|			q1 += samples_per_pixel; \
  |  | 1324|   408k|			p1 += samples_per_pixel; \
  |  | 1325|   408k|		} \
  |  | 1326|  12.3k|	}
  ------------------
 1394|  12.3k|		break;
 1395|       |
 1396|  8.24k|	case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (1396:2): [True: 8.24k, False: 48.2k]
  ------------------
 1397|  8.24k|		if (bits_per_sample == 16) {
  ------------------
  |  Branch (1397:7): [True: 5.51k, False: 2.73k]
  ------------------
 1398|  5.51k|			GREY_LOOP_F16;
  ------------------
  |  | 1331|  5.51k|	{ \
  |  | 1332|  5.51k|		gushort *p1; \
  |  | 1333|  5.51k|		float *q1; \
  |  | 1334|  5.51k|\
  |  | 1335|  5.51k|		p1 = (gushort *) p; \
  |  | 1336|  5.51k|		q1 = (float *) q; \
  |  | 1337|   199k|		for (x = 0; x < n; x++) { \
  |  |  ------------------
  |  |  |  Branch (1337:15): [True: 193k, False: 5.51k]
  |  |  ------------------
  |  | 1338|   193k|			if (invert) \
  |  |  ------------------
  |  |  |  Branch (1338:8): [True: 0, False: 193k]
  |  |  ------------------
  |  | 1339|   193k|				q1[0] = 1.0 - half_2_float(p1[0]); \
  |  | 1340|   193k|			else \
  |  | 1341|   193k|				q1[0] = half_2_float(p1[0]); \
  |  | 1342|   193k|\
  |  | 1343|   420k|			for (i = 1; i < samples_per_pixel; i++) \
  |  |  ------------------
  |  |  |  Branch (1343:16): [True: 227k, False: 193k]
  |  |  ------------------
  |  | 1344|   227k|				q1[i] = half_2_float(p1[i]); \
  |  | 1345|   193k|\
  |  | 1346|   193k|			q1 += samples_per_pixel; \
  |  | 1347|   193k|			p1 += samples_per_pixel; \
  |  | 1348|   193k|		} \
  |  | 1349|  5.51k|	}
  ------------------
 1399|  5.51k|		}
 1400|  2.73k|		else {
 1401|  2.73k|			GREY_LOOP(float, 1.0);
  ------------------
  |  | 1308|  2.73k|	{ \
  |  | 1309|  2.73k|		TYPE *p1; \
  |  | 1310|  2.73k|		TYPE *q1; \
  |  | 1311|  2.73k|\
  |  | 1312|  2.73k|		p1 = (TYPE *) p; \
  |  | 1313|  2.73k|		q1 = (TYPE *) q; \
  |  | 1314|   100k|		for (x = 0; x < n; x++) { \
  |  |  ------------------
  |  |  |  Branch (1314:15): [True: 97.3k, False: 2.73k]
  |  |  ------------------
  |  | 1315|  97.3k|			if (invert) \
  |  |  ------------------
  |  |  |  Branch (1315:8): [True: 0, False: 97.3k]
  |  |  ------------------
  |  | 1316|  97.3k|				q1[0] = MAX - p1[0]; \
  |  | 1317|  97.3k|			else \
  |  | 1318|  97.3k|				q1[0] = p1[0]; \
  |  | 1319|  97.3k|\
  |  | 1320|   183k|			for (i = 1; i < samples_per_pixel; i++) \
  |  |  ------------------
  |  |  |  Branch (1320:16): [True: 85.9k, False: 97.3k]
  |  |  ------------------
  |  | 1321|  97.3k|				q1[i] = p1[i]; \
  |  | 1322|  97.3k|\
  |  | 1323|  97.3k|			q1 += samples_per_pixel; \
  |  | 1324|  97.3k|			p1 += samples_per_pixel; \
  |  | 1325|  97.3k|		} \
  |  | 1326|  2.73k|	}
  ------------------
 1402|  2.73k|		}
 1403|  8.24k|		break;
 1404|       |
 1405|      0|	case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (1405:2): [True: 0, False: 56.4k]
  ------------------
 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: 56.4k]
  ------------------
 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|  56.4k|	}
 1412|  56.4k|}
tiff2vips.c:half_2_float:
  441|  1.31M|{
  442|  1.31M|	const float sign = (h >> 15) * -2 + 1;
  443|  1.31M|	const int exp = ((h & 0x7C00) >> 10) - 15;
  444|  1.31M|	const float prec = (h & 0x03FF);
  445|       |
  446|  1.31M|	switch (exp) {
  447|  56.2k|	case 16:
  ------------------
  |  Branch (447:2): [True: 56.2k, False: 1.25M]
  ------------------
  448|  56.2k|		return INFINITY * sign;
  449|   900k|	case -15:
  ------------------
  |  Branch (449:2): [True: 900k, False: 413k]
  ------------------
  450|   900k|		return sign / (float) (1 << 14) * (prec / 1024.0);
  451|   357k|	default:
  ------------------
  |  Branch (451:2): [True: 357k, False: 956k]
  ------------------
  452|   357k|		return exp > 0
  ------------------
  |  Branch (452:10): [True: 183k, False: 173k]
  ------------------
  453|   357k|			? sign * (float) (1 << exp) * (1.0 + prec / 1024.0)
  454|   357k|			: sign / (float) (1 << -exp) * (1.0 + prec / 1024.0);
  455|  1.31M|	}
  456|  1.31M|}
tiff2vips.c:rtiff_parse_palette:
 1579|    200|{
 1580|    200|	int samples_per_pixel = rtiff->header.samples_per_pixel;
 1581|    200|	int bits_per_sample = rtiff->header.bits_per_sample;
 1582|       |
 1583|    200|	int len;
 1584|    200|	PaletteRead *read;
 1585|    200|	int i;
 1586|       |
 1587|    200|	if (rtiff_check_bits_palette(rtiff) ||
  ------------------
  |  Branch (1587:6): [True: 0, False: 200]
  ------------------
 1588|    200|		rtiff_check_min_samples(rtiff, 1))
  ------------------
  |  Branch (1588:3): [True: 0, False: 200]
  ------------------
 1589|      0|		return -1;
 1590|    200|	len = 1 << bits_per_sample;
 1591|       |
 1592|    200|	if (!(read = VIPS_NEW(out, PaletteRead)) ||
  ------------------
  |  |   70|    200|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|    200|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|    200|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|    200|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|    200|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1592:6): [True: 0, False: 200]
  ------------------
 1593|    200|		!(read->red8 = VIPS_ARRAY(out, len, VipsPel)) ||
  ------------------
  |  |   72|    200|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|    200|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|    200|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|    200|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|    200|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1593:3): [True: 0, False: 200]
  ------------------
 1594|    200|		!(read->green8 = VIPS_ARRAY(out, len, VipsPel)) ||
  ------------------
  |  |   72|    200|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|    200|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|    200|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|    200|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|    200|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1594:3): [True: 0, False: 200]
  ------------------
 1595|    200|		!(read->blue8 = VIPS_ARRAY(out, len, VipsPel)))
  ------------------
  |  |   72|    200|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|    200|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|    200|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|    200|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|    200|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1595:3): [True: 0, False: 200]
  ------------------
 1596|      0|		return -1;
 1597|       |
 1598|       |	/* Get maps, convert to 8-bit data.
 1599|       |	 */
 1600|    200|	if (!TIFFGetField(rtiff->tiff,
  ------------------
  |  Branch (1600:6): [True: 0, False: 200]
  ------------------
 1601|    200|			TIFFTAG_COLORMAP,
  ------------------
  |  |  309|    200|#define TIFFTAG_COLORMAP 320               /* RGB map for palette image */
  ------------------
 1602|    200|			&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|    465|	for (i = 0; i < len; i++)
  ------------------
  |  Branch (1612:14): [True: 452, False: 13]
  ------------------
 1613|    452|		if ((read->red16[i] >> 8) |
  ------------------
  |  Branch (1613:7): [True: 187, False: 265]
  ------------------
 1614|    452|			(read->green16[i] >> 8) |
 1615|    452|			(read->blue16[i] >> 8))
 1616|    187|			break;
 1617|    200|	if (i < len)
  ------------------
  |  Branch (1617:6): [True: 187, False: 13]
  ------------------
 1618|  7.73k|		for (i = 0; i < len; i++) {
  ------------------
  |  Branch (1618:15): [True: 7.55k, False: 187]
  ------------------
 1619|  7.55k|			read->red8[i] = read->red16[i] >> 8;
 1620|  7.55k|			read->green8[i] = read->green16[i] >> 8;
 1621|  7.55k|			read->blue8[i] = read->blue16[i] >> 8;
 1622|  7.55k|		}
 1623|     13|	else {
 1624|     13|		g_warning("%s", _("assuming 8-bit palette"));
  ------------------
  |  |  338|     13|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|     13|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|     13|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|     13|                               __VA_ARGS__)
  ------------------
 1625|       |
 1626|     65|		for (i = 0; i < len; i++) {
  ------------------
  |  Branch (1626:15): [True: 52, False: 13]
  ------------------
 1627|     52|			read->red8[i] = read->red16[i] & 0xff;
 1628|     52|			read->green8[i] = read->green16[i] & 0xff;
 1629|     52|			read->blue8[i] = read->blue16[i] & 0xff;
 1630|     52|		}
 1631|     13|	}
 1632|       |
 1633|       |	/* Are all the maps equal? We have a mono image.
 1634|       |	 */
 1635|    200|	read->mono = TRUE;
  ------------------
  |  |  209|    200|#define TRUE    1
  ------------------
 1636|    426|	for (i = 0; i < len; i++)
  ------------------
  |  Branch (1636:14): [True: 419, False: 7]
  ------------------
 1637|    419|		if (read->red16[i] != read->green16[i] ||
  ------------------
  |  Branch (1637:7): [True: 174, False: 245]
  ------------------
 1638|    419|			read->green16[i] != read->blue16[i]) {
  ------------------
  |  Branch (1638:4): [True: 19, False: 226]
  ------------------
 1639|    193|			read->mono = FALSE;
  ------------------
  |  |  206|    193|#define FALSE   0               /* values of boolean */
  ------------------
 1640|    193|			break;
 1641|    193|		}
 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|    200|	if (bits_per_sample <= 8)
  ------------------
  |  Branch (1648:6): [True: 200, False: 0]
  ------------------
 1649|    200|		out->BandFmt = VIPS_FORMAT_UCHAR;
 1650|      0|	else
 1651|      0|		out->BandFmt = VIPS_FORMAT_USHORT;
 1652|    200|	out->Coding = VIPS_CODING_NONE;
 1653|       |
 1654|    200|	if (read->mono) {
  ------------------
  |  Branch (1654:6): [True: 7, False: 193]
  ------------------
 1655|      7|		out->Bands = samples_per_pixel;
 1656|      7|		if (bits_per_sample <= 8)
  ------------------
  |  Branch (1656:7): [True: 7, False: 0]
  ------------------
 1657|      7|			out->Type = VIPS_INTERPRETATION_B_W;
 1658|      0|		else
 1659|      0|			out->Type = VIPS_INTERPRETATION_GREY16;
 1660|      7|	}
 1661|    193|	else {
 1662|    193|		out->Bands = samples_per_pixel + 2;
 1663|    193|		if (bits_per_sample <= 8)
  ------------------
  |  Branch (1663:7): [True: 193, False: 0]
  ------------------
 1664|    193|			out->Type = VIPS_INTERPRETATION_sRGB;
 1665|      0|		else
 1666|      0|			out->Type = VIPS_INTERPRETATION_RGB16;
 1667|    193|	}
 1668|       |
 1669|    200|	rtiff->client = read;
 1670|    200|	if (bits_per_sample < 8)
  ------------------
  |  Branch (1670:6): [True: 173, False: 27]
  ------------------
 1671|    173|		rtiff->sfn = rtiff_palette_line_bit;
 1672|     27|	else if (bits_per_sample == 8)
  ------------------
  |  Branch (1672:11): [True: 27, False: 0]
  ------------------
 1673|     27|		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|    200|	return 0;
 1680|    200|}
tiff2vips.c:rtiff_check_bits_palette:
  929|    200|{
  930|    200|	if (rtiff->header.bits_per_sample != 16 &&
  ------------------
  |  Branch (930:6): [True: 200, False: 0]
  ------------------
  931|    200|		rtiff->header.bits_per_sample != 8 &&
  ------------------
  |  Branch (931:3): [True: 173, False: 27]
  ------------------
  932|    200|		rtiff->header.bits_per_sample != 4 &&
  ------------------
  |  Branch (932:3): [True: 173, False: 0]
  ------------------
  933|    200|		rtiff->header.bits_per_sample != 2 &&
  ------------------
  |  Branch (933:3): [True: 0, False: 173]
  ------------------
  934|    200|		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|    200|	return 0;
  942|    200|}
tiff2vips.c:rtiff_palette_line_bit:
 1466|  2.46k|{
 1467|  2.46k|	PaletteRead *read = (PaletteRead *) client;
 1468|  2.46k|	int samples_per_pixel = rtiff->header.samples_per_pixel;
 1469|  2.46k|	int bits_per_sample = rtiff->header.bits_per_sample;
 1470|       |
 1471|  2.46k|	int bit;
 1472|  2.46k|	VipsPel data;
 1473|  2.46k|	int x;
 1474|       |
 1475|  2.46k|	bit = 0;
 1476|  2.46k|	data = 0;
 1477|  83.1k|	for (x = 0; x < n * samples_per_pixel; x++) {
  ------------------
  |  Branch (1477:14): [True: 80.7k, False: 2.46k]
  ------------------
 1478|  80.7k|		int i;
 1479|       |
 1480|  80.7k|		if (bit <= 0) {
  ------------------
  |  Branch (1480:7): [True: 20.2k, False: 60.4k]
  ------------------
 1481|  20.2k|			data = *p++;
 1482|  20.2k|			bit = 8;
 1483|  20.2k|		}
 1484|       |
 1485|  80.7k|		i = data >> (8 - bits_per_sample);
 1486|  80.7k|		data <<= bits_per_sample;
 1487|  80.7k|		bit -= bits_per_sample;
 1488|       |
 1489|       |		/* The first band goes through the LUT, subsequent bands are
 1490|       |		 * left-justified and copied.
 1491|       |		 */
 1492|  80.7k|		if (x % samples_per_pixel == 0) {
  ------------------
  |  Branch (1492:7): [True: 80.7k, False: 0]
  ------------------
 1493|  80.7k|			if (read->mono)
  ------------------
  |  Branch (1493:8): [True: 3.26k, False: 77.4k]
  ------------------
 1494|  3.26k|				*q++ = read->red8[i];
 1495|  77.4k|			else {
 1496|  77.4k|				q[0] = read->red8[i];
 1497|  77.4k|				q[1] = read->green8[i];
 1498|  77.4k|				q[2] = read->blue8[i];
 1499|  77.4k|				q += 3;
 1500|  77.4k|			}
 1501|  80.7k|		}
 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|  80.7k|	}
 1505|  2.46k|}
tiff2vips.c:rtiff_palette_line8:
 1512|    537|{
 1513|    537|	PaletteRead *read = (PaletteRead *) client;
 1514|    537|	int samples_per_pixel = rtiff->header.samples_per_pixel;
 1515|       |
 1516|    537|	int x;
 1517|    537|	int s;
 1518|       |
 1519|  27.9k|	for (x = 0; x < n; x++) {
  ------------------
  |  Branch (1519:14): [True: 27.4k, False: 537]
  ------------------
 1520|  27.4k|		int i = p[0];
 1521|       |
 1522|  27.4k|		if (read->mono)
  ------------------
  |  Branch (1522:7): [True: 0, False: 27.4k]
  ------------------
 1523|      0|			q[0] = read->red8[i];
 1524|  27.4k|		else {
 1525|  27.4k|			q[0] = read->red8[i];
 1526|  27.4k|			q[1] = read->green8[i];
 1527|  27.4k|			q[2] = read->blue8[i];
 1528|  27.4k|			q += 2;
 1529|  27.4k|		}
 1530|       |
 1531|  33.5k|		for (s = 1; s < samples_per_pixel; s++)
  ------------------
  |  Branch (1531:15): [True: 6.13k, False: 27.4k]
  ------------------
 1532|  6.13k|			q[s] = p[s];
 1533|       |
 1534|  27.4k|		q += samples_per_pixel;
 1535|  27.4k|		p += samples_per_pixel;
 1536|  27.4k|	}
 1537|    537|}
tiff2vips.c:rtiff_parse_copy:
 1719|  3.16k|{
 1720|  3.16k|	int samples_per_pixel = rtiff->header.samples_per_pixel;
 1721|  3.16k|	int photometric_interpretation =
 1722|  3.16k|		rtiff->header.photometric_interpretation;
 1723|  3.16k|	int bits_per_sample = rtiff->header.bits_per_sample;
 1724|  3.16k|	int sample_format = rtiff->header.sample_format;
 1725|  3.16k|	int inkset = rtiff->header.inkset;
 1726|       |
 1727|  3.16k|	if (rtiff_non_fractional(rtiff))
  ------------------
  |  Branch (1727:6): [True: 87, False: 3.07k]
  ------------------
 1728|     87|		return -1;
 1729|       |
 1730|  3.07k|	out->Bands = samples_per_pixel;
 1731|  3.07k|	out->BandFmt = rtiff_guess_format(rtiff);
 1732|  3.07k|	if (out->BandFmt == VIPS_FORMAT_NOTSET)
  ------------------
  |  Branch (1732:6): [True: 4, False: 3.07k]
  ------------------
 1733|      4|		return -1;
 1734|  3.07k|	out->Coding = VIPS_CODING_NONE;
 1735|       |
 1736|  3.07k|	if (samples_per_pixel >= 3 &&
  ------------------
  |  Branch (1736:6): [True: 2.08k, False: 990]
  ------------------
 1737|  3.07k|		(photometric_interpretation == PHOTOMETRIC_RGB ||
  ------------------
  |  |  223|  4.16k|#define PHOTOMETRIC_RGB 2                  /* RGB color model */
  ------------------
  |  Branch (1737:4): [True: 695, False: 1.38k]
  ------------------
 1738|  2.08k|		photometric_interpretation == PHOTOMETRIC_YCBCR)) {
  ------------------
  |  |  227|  1.38k|#define PHOTOMETRIC_YCBCR 6                /* !CCIR 601 */
  ------------------
  |  Branch (1738:3): [True: 836, False: 549]
  ------------------
 1739|  1.53k|		if (out->BandFmt == VIPS_FORMAT_USHORT)
  ------------------
  |  Branch (1739:7): [True: 142, False: 1.38k]
  ------------------
 1740|    142|			out->Type = VIPS_INTERPRETATION_RGB16;
 1741|  1.38k|		else if (!vips_band_format_isint(out->BandFmt))
  ------------------
  |  Branch (1741:12): [True: 187, False: 1.20k]
  ------------------
 1742|       |			/* Most float images use 0 - 1 for black - white.
 1743|       |			 * Photoshop uses 0 - 1 and no gamma.
 1744|       |			 */
 1745|    187|			out->Type = VIPS_INTERPRETATION_scRGB;
 1746|  1.20k|		else
 1747|  1.20k|			out->Type = VIPS_INTERPRETATION_sRGB;
 1748|  1.53k|	}
 1749|  1.53k|	else if (samples_per_pixel >= 3 &&
  ------------------
  |  Branch (1749:11): [True: 549, False: 990]
  ------------------
 1750|  1.53k|		photometric_interpretation == PHOTOMETRIC_CIELAB)
  ------------------
  |  |  228|    549|#define PHOTOMETRIC_CIELAB 8               /* !1976 CIE L*a*b* */
  ------------------
  |  Branch (1750:3): [True: 5, False: 544]
  ------------------
 1751|      5|		out->Type = VIPS_INTERPRETATION_LAB;
 1752|  1.53k|	else if (photometric_interpretation == PHOTOMETRIC_SEPARATED &&
  ------------------
  |  |  226|  3.06k|#define PHOTOMETRIC_SEPARATED 5            /* !color separations */
  ------------------
  |  Branch (1752:11): [True: 128, False: 1.40k]
  ------------------
 1753|  1.53k|		samples_per_pixel >= 4 &&
  ------------------
  |  Branch (1753:3): [True: 115, False: 13]
  ------------------
 1754|  1.53k|		inkset == INKSET_CMYK)
  ------------------
  |  |  323|    115|#define INKSET_CMYK 1                      /* !cyan-magenta-yellow-black color */
  ------------------
  |  Branch (1754:3): [True: 115, False: 0]
  ------------------
 1755|    115|		out->Type = VIPS_INTERPRETATION_CMYK;
 1756|  1.41k|	else
 1757|  1.41k|		out->Type = VIPS_INTERPRETATION_MULTIBAND;
 1758|       |
 1759|  3.07k|	rtiff->client = out;
 1760|       |
 1761|  3.07k|	if (bits_per_sample == 16 && sample_format == SAMPLEFORMAT_IEEEFP) {
  ------------------
  |  |  336|    848|#define SAMPLEFORMAT_IEEEFP 3              /* !IEEE floating point data */
  ------------------
  |  Branch (1761:6): [True: 848, False: 2.22k]
  |  Branch (1761:31): [True: 262, False: 586]
  ------------------
 1762|    262|		rtiff->sfn = rtiff_memcpy_f16_line;
 1763|    262|	}
 1764|  2.80k|	else {
 1765|  2.80k|		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|  2.80k|		rtiff->memcpy = photometric_interpretation != PHOTOMETRIC_YCBCR;
  ------------------
  |  |  227|  2.80k|#define PHOTOMETRIC_YCBCR 6                /* !CCIR 601 */
  ------------------
 1772|  2.80k|	}
 1773|       |
 1774|  3.07k|	return 0;
 1775|  3.07k|}
tiff2vips.c:rtiff_memcpy_f16_line:
 1697|  7.59k|{
 1698|  7.59k|	VipsImage *im = (VipsImage *) client;
 1699|  7.59k|	size_t len = n * im->Bands;
 1700|       |
 1701|  7.59k|	if (im->BandFmt == VIPS_FORMAT_COMPLEX ||
  ------------------
  |  Branch (1701:6): [True: 0, False: 7.59k]
  ------------------
 1702|  7.59k|		im->BandFmt == VIPS_FORMAT_DPCOMPLEX)
  ------------------
  |  Branch (1702:3): [True: 0, False: 7.59k]
  ------------------
 1703|      0|		len *= 2;
 1704|       |
 1705|  7.59k|	int i;
 1706|       |
 1707|  7.59k|	gushort *restrict hp = (gushort *) p;
 1708|  7.59k|	float *restrict fq = (float *) q;
 1709|       |
 1710|   900k|	for (i = 0; i < len; i++)
  ------------------
  |  Branch (1710:14): [True: 893k, False: 7.59k]
  ------------------
 1711|   893k|		fq[i] = half_2_float(hp[i]);
 1712|  7.59k|}
tiff2vips.c:get_resolution:
  509|  14.2k|{
  510|  14.2k|	float x, y;
  511|  14.2k|	int ru;
  512|       |
  513|  14.2k|	if (TIFFGetFieldDefaulted(tiff, TIFFTAG_XRESOLUTION, &x) &&
  ------------------
  |  |  262|  14.2k|#define TIFFTAG_XRESOLUTION 282            /* pixels/resolution in x */
  ------------------
  |  Branch (513:6): [True: 1.08k, False: 13.1k]
  ------------------
  514|  14.2k|		TIFFGetFieldDefaulted(tiff, TIFFTAG_YRESOLUTION, &y) &&
  ------------------
  |  |  263|  1.08k|#define TIFFTAG_YRESOLUTION 283            /* pixels/resolution in y */
  ------------------
  |  Branch (514:3): [True: 1.08k, False: 0]
  ------------------
  515|  14.2k|		tfget16(tiff, TIFFTAG_RESOLUTIONUNIT, &ru)) {
  ------------------
  |  |  287|  1.08k|#define TIFFTAG_RESOLUTIONUNIT 296         /* units of resolutions */
  ------------------
  |  Branch (515:3): [True: 1.08k, False: 0]
  ------------------
  516|  1.08k|		switch (ru) {
  517|    306|		case RESUNIT_NONE:
  ------------------
  |  |  288|    306|#define RESUNIT_NONE 1                     /* no meaningful units */
  ------------------
  |  Branch (517:3): [True: 306, False: 776]
  ------------------
  518|    306|			break;
  519|       |
  520|    771|		case RESUNIT_INCH:
  ------------------
  |  |  289|    771|#define RESUNIT_INCH 2                     /* english */
  ------------------
  |  Branch (520:3): [True: 771, False: 311]
  ------------------
  521|       |			/* In pixels-per-inch ... convert to mm.
  522|       |			 */
  523|    771|			x /= 10.0 * 2.54;
  524|    771|			y /= 10.0 * 2.54;
  525|    771|			vips_image_set_string(out,
  526|    771|				VIPS_META_RESOLUTION_UNIT, "in");
  ------------------
  |  |   93|    771|#define VIPS_META_RESOLUTION_UNIT "resolution-unit"
  ------------------
  527|    771|			break;
  528|       |
  529|      5|		case RESUNIT_CENTIMETER:
  ------------------
  |  |  290|      5|#define RESUNIT_CENTIMETER 3               /* metric */
  ------------------
  |  Branch (529:3): [True: 5, False: 1.07k]
  ------------------
  530|       |			/* In pixels-per-centimetre ... convert to mm.
  531|       |			 */
  532|      5|			x /= 10.0;
  533|      5|			y /= 10.0;
  534|      5|			vips_image_set_string(out,
  535|      5|				VIPS_META_RESOLUTION_UNIT, "cm");
  ------------------
  |  |   93|      5|#define VIPS_META_RESOLUTION_UNIT "resolution-unit"
  ------------------
  536|      5|			break;
  537|       |
  538|      0|		default:
  ------------------
  |  Branch (538:3): [True: 0, False: 1.08k]
  ------------------
  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.08k|		}
  543|  1.08k|	}
  544|  13.1k|	else {
  545|       |		/* We used to warn about missing res data, but it happens so
  546|       |		 * often and is so harmless, why bother.
  547|       |		 */
  548|  13.1k|		x = 1.0;
  549|  13.1k|		y = 1.0;
  550|  13.1k|	}
  551|       |
  552|  14.2k|	out->Xres = x;
  553|  14.2k|	out->Yres = y;
  554|       |
  555|  14.2k|	return 0;
  556|  14.2k|}
tiff2vips.c:rtiff_read_tilewise:
 2594|  1.58k|{
 2595|  1.58k|	int tile_width = rtiff->header.tile_width;
 2596|  1.58k|	int tile_height = rtiff->header.tile_height;
 2597|  1.58k|	VipsImage **t = (VipsImage **) vips_object_local_array(VIPS_OBJECT(out), 4);
  ------------------
  |  |  433|  1.58k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  1.58k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.58k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2598|       |
 2599|  1.58k|	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|  1.58k|	if (rtiff->header.separate) {
  ------------------
  |  Branch (2607:6): [True: 7, False: 1.57k]
  ------------------
 2608|      7|		vips_error("tiff2vips", "%s", _("tiled separate planes not supported"));
  ------------------
  |  |   30|      7|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      7|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 2609|      7|		return -1;
 2610|      7|	}
 2611|       |
 2612|       |	/* Read to this image, then cache to out, see below.
 2613|       |	 */
 2614|  1.57k|	t[0] = vips_image_new();
 2615|       |
 2616|  1.57k|	if (rtiff_set_header(rtiff, t[0]))
  ------------------
  |  Branch (2616:6): [True: 0, False: 1.57k]
  ------------------
 2617|      0|		return -1;
 2618|       |
 2619|       |	/* Double check: in memcpy mode, the vips tilesize should exactly
 2620|       |	 * match the tifftile size.
 2621|       |	 */
 2622|  1.57k|	if (rtiff->memcpy) {
  ------------------
  |  Branch (2622:6): [True: 380, False: 1.19k]
  ------------------
 2623|    380|		size_t vips_tile_size = VIPS_IMAGE_SIZEOF_PEL(t[0]) *
  ------------------
  |  |  384|    380|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|    380|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
 2624|    380|			tile_width * tile_height;
 2625|       |
 2626|    380|		if (rtiff->header.tile_size != vips_tile_size) {
  ------------------
  |  Branch (2626:7): [True: 0, False: 380]
  ------------------
 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|    380|	}
 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|  1.57k|	if (
 2637|  1.57k|		vips_image_generate(t[0],
  ------------------
  |  Branch (2637:3): [True: 0, False: 1.57k]
  ------------------
 2638|  1.57k|			rtiff_seq_start, rtiff_fill_region, rtiff_seq_stop,
 2639|  1.57k|			rtiff, NULL) ||
 2640|  1.57k|		vips_tilecache(t[0], &t[1],
  ------------------
  |  Branch (2640:3): [True: 0, False: 1.57k]
  ------------------
 2641|  1.57k|			"tile_width", tile_width,
 2642|  1.57k|			"tile_height", tile_height,
 2643|  1.57k|			"max_tiles", 2 * (1 + t[0]->Xsize / tile_width),
 2644|  1.57k|			"threaded", TRUE,
  ------------------
  |  |  209|  1.57k|#define TRUE    1
  ------------------
 2645|  1.57k|			NULL) ||
 2646|  1.57k|		rtiff_unpremultiply(rtiff, t[1], &t[2]))
  ------------------
  |  Branch (2646:3): [True: 0, False: 1.57k]
  ------------------
 2647|      0|		return -1;
 2648|  1.57k|	in = t[2];
 2649|       |
 2650|       |	/* Only do this if we have to.
 2651|       |	 */
 2652|  1.57k|	if (rtiff->autorotate &&
  ------------------
  |  Branch (2652:6): [True: 0, False: 1.57k]
  ------------------
 2653|  1.57k|		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|  1.57k|	if (vips_image_write(in, out))
  ------------------
  |  Branch (2659:6): [True: 0, False: 1.57k]
  ------------------
 2660|      0|		return -1;
 2661|       |
 2662|  1.57k|	return 0;
 2663|  1.57k|}
tiff2vips.c:rtiff_seq_start:
 1957|  3.02k|{
 1958|  3.02k|	Rtiff *rtiff = (Rtiff *) a;
 1959|  3.02k|	RtiffSeq *seq;
 1960|       |
 1961|  3.02k|	if (!(seq = VIPS_NEW(out, RtiffSeq)))
  ------------------
  |  |   70|  3.02k|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  3.02k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  3.02k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  3.02k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  3.02k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1961:6): [True: 0, False: 3.02k]
  ------------------
 1962|      0|		return NULL;
 1963|  3.02k|	seq->rtiff = rtiff;
 1964|  3.02k|	if (!(seq->buf = vips_malloc(NULL, rtiff->header.tile_size)))
  ------------------
  |  Branch (1964:6): [True: 0, False: 3.02k]
  ------------------
 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|  3.02k|	if (rtiff->header.we_decompress) {
  ------------------
  |  Branch (1974:6): [True: 118, False: 2.91k]
  ------------------
 1975|    118|		seq->compressed_buf_length = 2 * rtiff->header.tile_size;
 1976|    118|		if (!(seq->compressed_buf = VIPS_MALLOC(NULL,
  ------------------
  |  |   68|    118|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  ------------------
  |  |  |  |  433|    118|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|    118|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|    118|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1976:7): [True: 0, False: 118]
  ------------------
 1977|    118|				  seq->compressed_buf_length)))
 1978|      0|			return NULL;
 1979|    118|	}
 1980|       |
 1981|  3.02k|	return (void *) seq;
 1982|  3.02k|}
tiff2vips.c:rtiff_fill_region:
 2503|  40.0k|{
 2504|  40.0k|	Rtiff *rtiff = (Rtiff *) a;
 2505|  40.0k|	int tile_width = rtiff->header.tile_width;
 2506|  40.0k|	int tile_height = rtiff->header.tile_height;
 2507|  40.0k|	int page_width = rtiff->header.width;
 2508|  40.0k|	int page_height = rtiff->header.height;
 2509|  40.0k|	VipsRect *r = &out->valid;
 2510|  40.0k|	int page_no = r->top / page_height;
 2511|  40.0k|	int page_y = r->top % page_height;
 2512|       |
 2513|  40.0k|	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|  40.0k|	if ((page_no == 0 || page_height % tile_height == 0) &&
  ------------------
  |  Branch (2527:7): [True: 40.0k, False: 0]
  |  Branch (2527:23): [True: 0, False: 0]
  ------------------
 2528|  40.0k|		r->left % tile_width == 0 &&
  ------------------
  |  Branch (2528:3): [True: 40.0k, False: 0]
  ------------------
 2529|  40.0k|		r->top % tile_height == 0 &&
  ------------------
  |  Branch (2529:3): [True: 40.0k, False: 0]
  ------------------
 2530|  40.0k|		r->width == tile_width &&
  ------------------
  |  Branch (2530:3): [True: 32.4k, False: 7.60k]
  ------------------
 2531|  40.0k|		r->height == tile_height &&
  ------------------
  |  Branch (2531:3): [True: 26.6k, False: 5.83k]
  ------------------
 2532|  40.0k|		r->left + tile_width <= page_width &&
  ------------------
  |  Branch (2532:3): [True: 26.6k, False: 0]
  ------------------
 2533|  40.0k|		page_y + tile_height <= page_height &&
  ------------------
  |  Branch (2533:3): [True: 26.6k, False: 0]
  ------------------
 2534|  40.0k|		VIPS_REGION_LSKIP(out) == VIPS_REGION_SIZEOF_LINE(out) &&
  ------------------
  |  |  195|  26.6k|	((size_t) ((R)->bpl))
  ------------------
              		VIPS_REGION_LSKIP(out) == VIPS_REGION_SIZEOF_LINE(out) &&
  ------------------
  |  |  203|  66.6k|	((size_t) ((R)->valid.width * VIPS_REGION_SIZEOF_PEL(R)))
  |  |  ------------------
  |  |  |  |  201|  26.6k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  26.6k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  26.6k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2534:3): [True: 26.6k, False: 0]
  ------------------
 2535|  40.0k|		rtiff->memcpy)
  ------------------
  |  Branch (2535:3): [True: 5.27k, False: 21.3k]
  ------------------
 2536|  5.27k|		generate = rtiff_fill_region_aligned;
 2537|  34.7k|	else
 2538|  34.7k|		generate = rtiff_fill_region_unaligned;
 2539|       |
 2540|  40.0k|	VIPS_GATE_START("rtiff_fill_region: work");
  ------------------
  |  |   41|  40.0k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  40.0k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  40.0k|	{ \
  |  |   43|  40.0k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 40.0k]
  |  |  ------------------
  |  |   44|  40.0k|			vips__thread_gate_start(NAME); \
  |  |   45|  40.0k|	} \
  |  |   46|  40.0k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  40.0k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2541|       |
 2542|  40.0k|	if (generate(out, vseq, a, b, stop)) {
  ------------------
  |  Branch (2542:6): [True: 118, False: 39.9k]
  ------------------
 2543|    118|		VIPS_GATE_STOP("rtiff_fill_region: work");
  ------------------
  |  |   49|    118|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    118|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|    118|	{ \
  |  |   51|    118|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 118]
  |  |  ------------------
  |  |   52|    118|			vips__thread_gate_stop(NAME); \
  |  |   53|    118|	} \
  |  |   54|    118|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    118|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2544|    118|		return -1;
 2545|    118|	}
 2546|       |
 2547|  40.0k|	VIPS_GATE_STOP("rtiff_fill_region: work");
  ------------------
  |  |   49|  39.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  39.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  39.9k|	{ \
  |  |   51|  39.9k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 39.9k]
  |  |  ------------------
  |  |   52|  39.9k|			vips__thread_gate_stop(NAME); \
  |  |   53|  39.9k|	} \
  |  |   54|  40.0k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  40.0k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2548|       |
 2549|  39.9k|	return 0;
 2550|  40.0k|}
tiff2vips.c:rtiff_fill_region_aligned:
 2367|  5.27k|{
 2368|  5.27k|	RtiffSeq *seq = (RtiffSeq *) vseq;
 2369|  5.27k|	Rtiff *rtiff = (Rtiff *) a;
 2370|  5.27k|	VipsRect *r = &out->valid;
 2371|  5.27k|	int page_height = rtiff->header.height;
 2372|  5.27k|	int page_no = r->top / page_height;
 2373|  5.27k|	int page_y = r->top % page_height;
 2374|       |
 2375|  5.27k|	g_assert((r->left % rtiff->header.tile_width) == 0);
  ------------------
  |  |  166|  5.27k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  5.27k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  5.27k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2376|  5.27k|	g_assert((r->top % rtiff->header.tile_height) == 0);
  ------------------
  |  |  166|  5.27k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  5.27k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  5.27k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2377|  5.27k|	g_assert(r->width == rtiff->header.tile_width);
  ------------------
  |  |  166|  5.27k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  5.27k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  5.27k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2378|  5.27k|	g_assert(r->height == rtiff->header.tile_height);
  ------------------
  |  |  166|  5.27k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  5.27k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  5.27k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2379|  5.27k|	g_assert(VIPS_REGION_LSKIP(out) == VIPS_REGION_SIZEOF_LINE(out));
  ------------------
  |  |  166|  5.27k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  5.27k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  5.27k|#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|  5.27k|	if (rtiff_read_tile(seq,
  ------------------
  |  Branch (2387:6): [True: 6, False: 5.27k]
  ------------------
 2388|  5.27k|			(tdata_t *) VIPS_REGION_ADDR(out, r->left, r->top),
  ------------------
  |  |  227|  5.27k|	((R)->data + \
  |  |  228|  5.27k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  5.27k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  5.27k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  5.27k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  5.27k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  5.27k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2389|  5.27k|			rtiff->page + page_no, r->left, page_y))
 2390|      6|		return -1;
 2391|       |
 2392|  5.27k|	return 0;
 2393|  5.27k|}
tiff2vips.c:rtiff_read_tile:
 2292|  40.0k|{
 2293|  40.0k|	Rtiff *rtiff = seq->rtiff;
 2294|       |
 2295|  40.0k|	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|  40.0k|	if (rtiff->header.we_decompress) {
  ------------------
  |  Branch (2305:6): [True: 118, False: 39.9k]
  ------------------
 2306|    118|		ttile_t tile_no;
 2307|       |
 2308|    118|		g_rec_mutex_lock(&rtiff->lock);
 2309|       |
 2310|    118|		if (rtiff_set_page(rtiff, page)) {
  ------------------
  |  Branch (2310:7): [True: 0, False: 118]
  ------------------
 2311|      0|			g_rec_mutex_unlock(&rtiff->lock);
 2312|      0|			return -1;
 2313|      0|		}
 2314|       |
 2315|    118|		tile_no = TIFFComputeTile(rtiff->tiff, x, y, 0, 0);
 2316|       |
 2317|    118|		size = TIFFReadRawTile(rtiff->tiff, tile_no,
 2318|    118|			seq->compressed_buf, seq->compressed_buf_length);
 2319|    118|		if (size <= 0) {
  ------------------
  |  Branch (2319:7): [True: 40, False: 78]
  ------------------
 2320|     40|			vips_foreign_load_invalidate(rtiff->out);
 2321|     40|			g_rec_mutex_unlock(&rtiff->lock);
 2322|     40|			return -1;
 2323|     40|		}
 2324|       |
 2325|     78|		g_rec_mutex_unlock(&rtiff->lock);
 2326|       |
 2327|       |		/* Decompress outside the lock, so we get parallelism.
 2328|       |		 */
 2329|     78|		if (rtiff_decompress_tile(rtiff, seq->compressed_buf, size, buf)) {
  ------------------
  |  Branch (2329:7): [True: 78, False: 0]
  ------------------
 2330|     78|			vips_error("tiff2vips", _("decompress error tile %d x %d"), x, y);
  ------------------
  |  |   30|     78|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|     78|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 2331|     78|			return -1;
 2332|     78|		}
 2333|     78|	}
 2334|  39.9k|	else {
 2335|  39.9k|		g_rec_mutex_lock(&rtiff->lock);
 2336|       |
 2337|  39.9k|		if (rtiff_set_page(rtiff, page)) {
  ------------------
  |  Branch (2337:7): [True: 0, False: 39.9k]
  ------------------
 2338|      0|			g_rec_mutex_unlock(&rtiff->lock);
 2339|      0|			return -1;
 2340|      0|		}
 2341|       |
 2342|  39.9k|		int result;
 2343|  39.9k|		if (rtiff->header.read_as_rgba)
  ------------------
  |  Branch (2343:7): [True: 7.60k, False: 32.3k]
  ------------------
 2344|  7.60k|			result = rtiff_read_rgba_tile(rtiff, x, y, buf);
 2345|  32.3k|		else
 2346|  32.3k|			result = TIFFReadTile(rtiff->tiff, buf, x, y, 0, 0) < 0;
 2347|  39.9k|		if (result && rtiff->fail_on >= VIPS_FAIL_ON_WARNING) {
  ------------------
  |  Branch (2347:7): [True: 18.9k, False: 21.0k]
  |  Branch (2347:17): [True: 0, False: 18.9k]
  ------------------
 2348|      0|			vips_foreign_load_invalidate(rtiff->out);
 2349|      0|			g_rec_mutex_unlock(&rtiff->lock);
 2350|      0|			return -1;
 2351|      0|		}
 2352|       |
 2353|  39.9k|		g_rec_mutex_unlock(&rtiff->lock);
 2354|  39.9k|	}
 2355|       |
 2356|  39.9k|	return 0;
 2357|  40.0k|}
tiff2vips.c:rtiff_decompress_tile:
 2226|     78|{
 2227|     78|	g_assert(rtiff->header.we_decompress);
  ------------------
  |  |  166|     78|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|     78|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|     78|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2228|       |
 2229|     78|	switch (rtiff->header.compression) {
 2230|      0|	case JP2K_YCC:
  ------------------
  |  |  277|      0|#define JP2K_YCC 33003
  ------------------
  |  Branch (2230:2): [True: 0, False: 78]
  ------------------
 2231|      0|	case JP2K_RGB:
  ------------------
  |  |  278|      0|#define JP2K_RGB 33005
  ------------------
  |  Branch (2231:2): [True: 0, False: 78]
  ------------------
 2232|      0|	case JP2K_LOSSY:
  ------------------
  |  |  282|      0|#define JP2K_LOSSY 33004
  ------------------
  |  Branch (2232:2): [True: 0, False: 78]
  ------------------
 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|     78|	case COMPRESSION_JPEG:
  ------------------
  |  |  190|     78|#define COMPRESSION_JPEG 7            /* %JPEG DCT compression */
  ------------------
  |  Branch (2244:2): [True: 78, False: 0]
  ------------------
 2245|     78|		if (rtiff_decompress_jpeg(rtiff, in, size, out))
  ------------------
  |  Branch (2245:7): [True: 78, False: 0]
  ------------------
 2246|     78|			return -1;
 2247|      0|		break;
 2248|      0|#endif /*HAVE_JPEG*/
 2249|       |
 2250|      0|	default:
  ------------------
  |  Branch (2250:2): [True: 0, False: 78]
  ------------------
 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|     78|	}
 2254|       |
 2255|      0|	return 0;
 2256|     78|}
tiff2vips.c:rtiff_decompress_jpeg:
 2187|     78|{
 2188|     78|	struct jpeg_decompress_struct cinfo = { 0 };
 2189|     78|	ErrorManager eman;
 2190|       |
 2191|     78|	if (setjmp(eman.jmp) == 0) {
  ------------------
  |  Branch (2191:6): [True: 78, False: 0]
  ------------------
 2192|     78|		cinfo.err = jpeg_std_error(&eman.pub);
 2193|     78|		cinfo.err->addon_message_table = vips__jpeg_message_table;
 2194|     78|		cinfo.err->first_addon_message = 1000;
 2195|     78|		cinfo.err->last_addon_message = 1001;
 2196|     78|		eman.pub.error_exit = vips__new_error_exit;
 2197|     78|		eman.pub.emit_message = rtiff_decompress_jpeg_emit_message;
 2198|     78|		eman.pub.output_message = vips__new_output_message;
 2199|     78|		eman.fp = NULL;
 2200|       |
 2201|     78|		jpeg_create_decompress(&cinfo);
  ------------------
  |  |  972|     78|  jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \
  |  |  ------------------
  |  |  |  |    4|     78|#define JPEG_LIB_VERSION  62
  |  |  ------------------
  |  |  973|     78|                        (size_t)sizeof(struct jpeg_decompress_struct))
  ------------------
 2202|       |
 2203|     78|		if (rtiff_decompress_jpeg_run(rtiff, &cinfo,
  ------------------
  |  Branch (2203:7): [True: 3, False: 75]
  ------------------
 2204|     78|				data, data_len, out)) {
 2205|      3|			jpeg_destroy_decompress(&cinfo);
 2206|      3|			return -1;
 2207|      3|		}
 2208|     78|	}
 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|     75|	jpeg_destroy_decompress(&cinfo);
 2219|       |
 2220|     75|	return 0;
 2221|     78|}
tiff2vips.c:rtiff_decompress_jpeg_emit_message:
 2162|   232k|{
 2163|   232k|	if (msg_level < 0) {
  ------------------
  |  Branch (2163:6): [True: 228k, False: 3.47k]
  ------------------
 2164|   228k|		long num_warnings;
 2165|       |
 2166|       |		/* Always count warnings in num_warnings.
 2167|       |		 */
 2168|   228k|		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|   228k|		if (num_warnings == 1)
  ------------------
  |  Branch (2174:7): [True: 67, False: 228k]
  ------------------
 2175|     67|			(*cinfo->err->output_message)(cinfo);
 2176|   228k|	}
 2177|  3.47k|	else if (cinfo->err->trace_level >= msg_level)
  ------------------
  |  Branch (2177:11): [True: 0, False: 3.47k]
  ------------------
 2178|       |		/* It's a trace message. Show it if trace_level >= msg_level.
 2179|       |		 */
 2180|      0|		(*cinfo->err->output_message)(cinfo);
 2181|   232k|}
tiff2vips.c:rtiff_decompress_jpeg_run:
 2071|     78|{
 2072|     78|	void *tables;
 2073|     78|	uint32_t tables_len;
 2074|     78|	int bytes_per_pixel;
 2075|     78|	size_t bytes_per_scanline;
 2076|     78|	VipsPel *q;
 2077|     78|	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|     78|	tables = NULL;
 2087|     78|	tables_len = 0;
 2088|     78|	(void) TIFFGetField(rtiff->tiff,
 2089|     78|		TIFFTAG_JPEGTABLES, &tables_len, &tables);
  ------------------
  |  |  346|     78|#define TIFFTAG_JPEGTABLES 347             /* %JPEG table stream */
  ------------------
 2090|       |
 2091|     78|	if (tables) {
  ------------------
  |  Branch (2091:6): [True: 0, False: 78]
  ------------------
 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|     78|	rtiff_decompress_jpeg_set_memory(cinfo, data, data_len);
 2099|       |
 2100|     78|	if (jpeg_read_header(cinfo, TRUE) != JPEG_HEADER_OK)
  ------------------
  |  |  209|     78|#define TRUE    1
  ------------------
              	if (jpeg_read_header(cinfo, TRUE) != JPEG_HEADER_OK)
  ------------------
  |  | 1066|     78|#define JPEG_HEADER_OK           1 /* Found valid image datastream */
  ------------------
  |  Branch (2100:6): [True: 0, False: 78]
  ------------------
 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|     78|	switch (rtiff->header.photometric_interpretation) {
 2107|      0|	case PHOTOMETRIC_SEPARATED:
  ------------------
  |  |  226|      0|#define PHOTOMETRIC_SEPARATED 5            /* !color separations */
  ------------------
  |  Branch (2107:2): [True: 0, False: 78]
  ------------------
 2108|      0|		cinfo->jpeg_color_space = JCS_CMYK;
 2109|      0|		bytes_per_pixel = 4;
 2110|      0|		break;
 2111|       |
 2112|      6|	case PHOTOMETRIC_YCBCR:
  ------------------
  |  |  227|      6|#define PHOTOMETRIC_YCBCR 6                /* !CCIR 601 */
  ------------------
  |  Branch (2112:2): [True: 6, False: 72]
  ------------------
 2113|      6|		cinfo->jpeg_color_space = JCS_YCbCr;
 2114|      6|		bytes_per_pixel = 3;
 2115|      6|		break;
 2116|       |
 2117|      0|	case PHOTOMETRIC_RGB:
  ------------------
  |  |  223|      0|#define PHOTOMETRIC_RGB 2                  /* RGB color model */
  ------------------
  |  Branch (2117:2): [True: 0, False: 78]
  ------------------
 2118|      0|	case PHOTOMETRIC_CIELAB:
  ------------------
  |  |  228|      0|#define PHOTOMETRIC_CIELAB 8               /* !1976 CIE L*a*b* */
  ------------------
  |  Branch (2118:2): [True: 0, False: 78]
  ------------------
 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: 78]
  ------------------
 2125|      0|	case PHOTOMETRIC_MINISBLACK:
  ------------------
  |  |  222|      0|#define PHOTOMETRIC_MINISBLACK 1           /* min value is black */
  ------------------
  |  Branch (2125:2): [True: 0, False: 78]
  ------------------
 2126|      0|		cinfo->jpeg_color_space = JCS_GRAYSCALE;
 2127|      0|		bytes_per_pixel = 1;
 2128|      0|		break;
 2129|       |
 2130|      1|	default:
  ------------------
  |  Branch (2130:2): [True: 1, False: 77]
  ------------------
 2131|      1|		cinfo->jpeg_color_space = JCS_UNKNOWN;
 2132|      1|		bytes_per_pixel = 1;
 2133|      1|		break;
 2134|     78|	}
 2135|       |
 2136|      7|	jpeg_calc_output_dimensions(cinfo);
 2137|      7|	bytes_per_scanline = cinfo->output_width * bytes_per_pixel;
 2138|       |
 2139|       |	/* Double-check tile dimensions.
 2140|       |	 */
 2141|      7|	if (cinfo->output_width > rtiff->header.tile_width ||
  ------------------
  |  Branch (2141:6): [True: 1, False: 6]
  ------------------
 2142|      7|		cinfo->output_height > rtiff->header.tile_height ||
  ------------------
  |  Branch (2142:3): [True: 1, False: 5]
  ------------------
 2143|      7|		bytes_per_scanline > rtiff->header.tile_row_size)
  ------------------
  |  Branch (2143:3): [True: 1, False: 4]
  ------------------
 2144|      3|		return -1;
 2145|       |
 2146|      4|	jpeg_start_decompress(cinfo);
 2147|       |
 2148|      4|	q = (VipsPel *) out;
 2149|      5|	for (y = 0; y < cinfo->output_height; y++) {
  ------------------
  |  Branch (2149:14): [True: 1, False: 4]
  ------------------
 2150|      1|		JSAMPROW row_pointer[1];
 2151|       |
 2152|      1|		row_pointer[0] = (JSAMPLE *) q;
 2153|      1|		jpeg_read_scanlines(cinfo, &row_pointer[0], 1);
 2154|      1|		q += bytes_per_scanline;
 2155|      1|	}
 2156|       |
 2157|      4|	return 0;
 2158|      7|}
tiff2vips.c:rtiff_decompress_jpeg_set_memory:
 2050|     78|{
 2051|     78|	if (!cinfo->src)
  ------------------
  |  Branch (2051:6): [True: 78, False: 0]
  ------------------
 2052|     78|		cinfo->src =
 2053|     78|			(struct jpeg_source_mgr *) (*cinfo->mem->alloc_small)(
 2054|     78|				(j_common_ptr) cinfo,
 2055|     78|				JPOOL_PERMANENT,
  ------------------
  |  |  888|     78|#define JPOOL_PERMANENT  0      /* lasts until master record is destroyed */
  ------------------
 2056|     78|				sizeof(struct jpeg_source_mgr));
 2057|       |
 2058|       |	/* Present the whole of data as one chunk.
 2059|       |	 */
 2060|     78|	cinfo->src->bytes_in_buffer = data_len;
 2061|     78|	cinfo->src->next_input_byte = (JOCTET *) data;
 2062|     78|	cinfo->src->init_source = rtiff_decompress_jpeg_init_source;
 2063|     78|	cinfo->src->fill_input_buffer = rtiff_decompress_jpeg_fill_input_buffer;
 2064|     78|	cinfo->src->skip_input_data = rtiff_decompress_jpeg_skip_input_data;
 2065|     78|	cinfo->src->resync_to_restart = jpeg_resync_to_restart;
 2066|     78|}
tiff2vips.c:rtiff_decompress_jpeg_init_source:
 1987|     78|{
 1988|       |	/* Nothing.
 1989|       |	 */
 1990|     78|}
tiff2vips.c:rtiff_decompress_jpeg_fill_input_buffer:
 1994|   226k|{
 1995|   226k|	static const JOCTET mybuffer[4] = {
 1996|   226k|		(JOCTET) 0xFF, (JOCTET) JPEG_EOI, 0, 0
  ------------------
  |  | 1167|   226k|#define JPEG_EOI        0xD9    /* EOI marker code */
  ------------------
 1997|   226k|	};
 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|   226k|	WARNMS(cinfo, JWRN_VIPS_IMAGE_EOF);
  ------------------
  |  |  283|   226k|  ((cinfo)->err->msg_code = (code), \
  |  |  284|   226k|   (*(cinfo)->err->emit_message) ((j_common_ptr)(cinfo), -1))
  ------------------
 2004|       |
 2005|       |	/* Insert a fake EOI marker
 2006|       |	 */
 2007|   226k|	cinfo->src->next_input_byte = mybuffer;
 2008|   226k|	cinfo->src->bytes_in_buffer = 2;
 2009|       |
 2010|   226k|	return TRUE;
  ------------------
  |  |  209|   226k|#define TRUE    1
  ------------------
 2011|   226k|}
tiff2vips.c:rtiff_decompress_jpeg_skip_input_data:
 2026|  2.80k|{
 2027|  2.80k|	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|  2.80k|	if (num_bytes > 0) {
  ------------------
  |  Branch (2033:6): [True: 2.80k, False: 0]
  ------------------
 2034|   229k|		while (num_bytes > (long) src->bytes_in_buffer) {
  ------------------
  |  Branch (2034:10): [True: 226k, False: 2.80k]
  ------------------
 2035|   226k|			num_bytes -= (long) src->bytes_in_buffer;
 2036|   226k|			(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|   226k|		}
 2041|       |
 2042|  2.80k|		src->next_input_byte += (size_t) num_bytes;
 2043|  2.80k|		src->bytes_in_buffer -= (size_t) num_bytes;
 2044|  2.80k|	}
 2045|  2.80k|}
tiff2vips.c:rtiff_read_rgba_tile:
 2262|  7.60k|{
 2263|  7.60k|	guint32 *u32_buf = (guint32 *) buf;
 2264|       |
 2265|  7.60k|	if (!TIFFReadRGBATile(rtiff->tiff, x, y, u32_buf))
  ------------------
  |  Branch (2265:6): [True: 6.62k, False: 976]
  ------------------
 2266|  6.62k|		return -1;
 2267|       |
 2268|       |	/* For some reason TIFFReadRGBATile decodes tiles upside down,
 2269|       |	 * so we need to flip them.
 2270|       |	 */
 2271|    976|	guint32 tile_width = rtiff->header.tile_width;
 2272|    976|	guint32 tile_height = rtiff->header.tile_height;
 2273|       |
 2274|    976|	guint32 *up = u32_buf;
 2275|    976|	guint32 *down = u32_buf + (tile_height - 1) * tile_width;
 2276|  11.9k|	for (int yy = 0; yy < tile_height / 2; yy++) {
  ------------------
  |  Branch (2276:19): [True: 11.0k, False: 976]
  ------------------
 2277|   255k|		for (int xx = 0; xx < tile_width; xx++)
  ------------------
  |  Branch (2277:20): [True: 244k, False: 11.0k]
  ------------------
 2278|   244k|			VIPS_SWAP(guint32, up[xx], down[xx]);
  ------------------
  |  |  114|   244k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   244k|#define G_STMT_START  do
  |  |  ------------------
  |  |  115|   244k|	{ \
  |  |  116|   244k|		TYPE t = (A); \
  |  |  117|   244k|		(A) = (B); \
  |  |  118|   244k|		(B) = t; \
  |  |  119|   244k|	} \
  |  |  120|   244k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   244k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2279|       |
 2280|  11.0k|		up += tile_width;
 2281|  11.0k|		down -= tile_width;
 2282|  11.0k|	}
 2283|       |
 2284|    976|	return 0;
 2285|  7.60k|}
tiff2vips.c:rtiff_fill_region_unaligned:
 2400|  34.7k|{
 2401|  34.7k|	RtiffSeq *seq = (RtiffSeq *) vseq;
 2402|  34.7k|	Rtiff *rtiff = (Rtiff *) a;
 2403|  34.7k|	int tile_width = rtiff->header.tile_width;
 2404|  34.7k|	int tile_height = rtiff->header.tile_height;
 2405|  34.7k|	int page_height = rtiff->header.height;
 2406|  34.7k|	int tile_row_size = rtiff->header.tile_row_size;
 2407|  34.7k|	VipsRect *r = &out->valid;
 2408|       |
 2409|  34.7k|	int x, y, z;
 2410|       |
 2411|       |#ifdef DEBUG_VERBOSE
 2412|       |	printf("rtiff_fill_region_unaligned:\n");
 2413|       |#endif /*DEBUG_VERBOSE*/
 2414|       |
 2415|  34.7k|	y = 0;
 2416|  69.4k|	while (y < r->height) {
  ------------------
  |  Branch (2416:9): [True: 34.7k, False: 34.6k]
  ------------------
 2417|  34.7k|		VipsRect tile, page, hit;
 2418|       |
 2419|       |		/* Not necessary, but it stops static analyzers complaining
 2420|       |		 * about a used-before-set.
 2421|       |		 */
 2422|  34.7k|		hit.height = 0;
 2423|       |
 2424|  34.7k|		x = 0;
 2425|  69.4k|		while (x < r->width) {
  ------------------
  |  Branch (2425:10): [True: 34.7k, False: 34.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|  34.7k|			int page_no = (r->top + y) / page_height;
 2431|  34.7k|			int page_y = (r->top + y) % page_height;
 2432|       |
 2433|       |			/* Coordinate of the tile on this page that xy falls in.
 2434|       |			 */
 2435|  34.7k|			int xs = ((r->left + x) / tile_width) * tile_width;
 2436|  34.7k|			int ys = (page_y / tile_height) * tile_height;
 2437|       |
 2438|  34.7k|			if (rtiff_read_tile(seq,
  ------------------
  |  Branch (2438:8): [True: 112, False: 34.6k]
  ------------------
 2439|  34.7k|					seq->buf, rtiff->page + page_no, xs, ys))
 2440|    112|				return -1;
 2441|       |
 2442|       |			/* Position of tile on the page.
 2443|       |			 */
 2444|  34.6k|			tile.left = xs;
 2445|  34.6k|			tile.top = ys;
 2446|  34.6k|			tile.width = tile_width;
 2447|  34.6k|			tile.height = tile_height;
 2448|       |
 2449|       |			/* It'll be clipped by this page.
 2450|       |			 */
 2451|  34.6k|			page.left = 0;
 2452|  34.6k|			page.top = 0;
 2453|  34.6k|			page.width = rtiff->header.width;
 2454|  34.6k|			page.height = rtiff->header.height;
 2455|  34.6k|			vips_rect_intersectrect(&tile, &page, &tile);
 2456|       |
 2457|       |			/* To image coordinates.
 2458|       |			 */
 2459|  34.6k|			tile.top += page_no * page_height;
 2460|       |
 2461|       |			/* And clip again by this region.
 2462|       |			 */
 2463|  34.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|  34.6k|			g_assert(hit.left == tile.left);
  ------------------
  |  |  166|  34.6k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  34.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  34.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|   622k|			for (z = 0; z < hit.height; z++) {
  ------------------
  |  Branch (2475:16): [True: 588k, False: 34.6k]
  ------------------
 2476|   588k|				VipsPel *p = (VipsPel *) seq->buf +
 2477|   588k|					(hit.top - tile.top + z) *
 2478|   588k|						tile_row_size;
 2479|   588k|				VipsPel *q = VIPS_REGION_ADDR(out,
  ------------------
  |  |  227|   588k|	((R)->data + \
  |  |  228|   588k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   588k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   588k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   588k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   588k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   588k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2480|   588k|					hit.left, hit.top + z);
 2481|       |
 2482|   588k|				rtiff->sfn(rtiff,
 2483|   588k|					q, p, hit.width, rtiff->client);
 2484|   588k|			}
 2485|       |
 2486|  34.6k|			x += hit.width;
 2487|  34.6k|		}
 2488|       |
 2489|       |		/* This will be the same for all tiles in the row we've just
 2490|       |		 * done.
 2491|       |		 */
 2492|  34.6k|		y += hit.height;
 2493|  34.6k|	}
 2494|       |
 2495|  34.6k|	return 0;
 2496|  34.7k|}
tiff2vips.c:rtiff_seq_stop:
 2554|  3.02k|{
 2555|  3.02k|	RtiffSeq *seq = (RtiffSeq *) vseq;
 2556|       |
 2557|  3.02k|	VIPS_FREE(seq->buf);
  ------------------
  |  |   50|  3.02k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  3.02k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  3.02k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  3.02k|	{ \
  |  |  |  |   43|  3.02k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 3.02k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  3.02k|			(void) F((S)); \
  |  |  |  |   45|  3.02k|			(S) = 0; \
  |  |  |  |   46|  3.02k|		} \
  |  |  |  |   47|  3.02k|	} \
  |  |  |  |   48|  3.02k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  3.02k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2558|  3.02k|	VIPS_FREE(seq->compressed_buf);
  ------------------
  |  |   50|  3.02k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  3.02k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  3.02k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  3.02k|	{ \
  |  |  |  |   43|  3.02k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 118, False: 2.91k]
  |  |  |  |  ------------------
  |  |  |  |   44|    118|			(void) F((S)); \
  |  |  |  |   45|    118|			(S) = 0; \
  |  |  |  |   46|    118|		} \
  |  |  |  |   47|  3.02k|	} \
  |  |  |  |   48|  3.02k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  3.02k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2559|       |
 2560|  3.02k|	return 0;
 2561|  3.02k|}
tiff2vips.c:rtiff_unpremultiply:
 2567|  6.90k|{
 2568|  6.90k|	if (rtiff->header.alpha_band != -1) {
  ------------------
  |  Branch (2568:6): [True: 983, False: 5.92k]
  ------------------
 2569|    983|		VipsImage *x;
 2570|       |
 2571|    983|		if (
 2572|    983|			vips_unpremultiply(in, &x,
  ------------------
  |  Branch (2572:4): [True: 0, False: 983]
  ------------------
 2573|    983|				"alpha_band", rtiff->header.alpha_band,
 2574|    983|				NULL) ||
 2575|    983|			vips_cast(x, out, in->BandFmt, NULL)) {
  ------------------
  |  Branch (2575:4): [True: 0, False: 983]
  ------------------
 2576|      0|			g_object_unref(x);
 2577|      0|			return -1;
 2578|      0|		}
 2579|    983|		g_object_unref(x);
 2580|    983|	}
 2581|  5.92k|	else {
 2582|  5.92k|		*out = in;
 2583|  5.92k|		g_object_ref(in);
 2584|  5.92k|	}
 2585|       |
 2586|  6.90k|	return 0;
 2587|  6.90k|}
tiff2vips.c:rtiff_read_stripwise:
 2876|  5.33k|{
 2877|  5.33k|	VipsImage **t = (VipsImage **)
 2878|  5.33k|		vips_object_local_array(VIPS_OBJECT(out), 4);
  ------------------
  |  |  433|  5.33k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  5.33k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  5.33k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2879|       |
 2880|  5.33k|	VipsImage *in;
 2881|  5.33k|	int tile_height;
 2882|       |
 2883|       |#ifdef DEBUG
 2884|       |	printf("tiff2vips: rtiff_read_stripwise\n");
 2885|       |#endif /*DEBUG*/
 2886|       |
 2887|  5.33k|	t[0] = vips_image_new();
 2888|  5.33k|	if (rtiff_set_header(rtiff, t[0]))
  ------------------
  |  Branch (2888:6): [True: 0, False: 5.33k]
  ------------------
 2889|      0|		return -1;
 2890|       |
 2891|       |	/* Double check: in memcpy mode, the vips linesize should exactly
 2892|       |	 * match the tiff line size.
 2893|       |	 */
 2894|  5.33k|	if (rtiff->memcpy) {
  ------------------
  |  Branch (2894:6): [True: 2.60k, False: 2.72k]
  ------------------
 2895|  2.60k|		size_t vips_line_size;
 2896|       |
 2897|       |		/* Lines are smaller in plane-separated mode.
 2898|       |		 */
 2899|  2.60k|		if (rtiff->header.separate)
  ------------------
  |  Branch (2899:7): [True: 13, False: 2.58k]
  ------------------
 2900|     13|			vips_line_size = VIPS_IMAGE_SIZEOF_ELEMENT(t[0]) *
  ------------------
  |  |  382|     13|	(vips_format_sizeof_unsafe((I)->BandFmt))
  ------------------
 2901|     13|				t[0]->Xsize;
 2902|  2.58k|		else
 2903|  2.58k|			vips_line_size = VIPS_IMAGE_SIZEOF_LINE(t[0]);
  ------------------
  |  |  386|  2.58k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  ------------------
  |  |  |  |  384|  2.58k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  ------------------
  |  |  |  |  |  |  382|  2.58k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2904|       |
 2905|  2.60k|		if (rtiff->header.bits_per_sample == 16 &&
  ------------------
  |  Branch (2905:7): [True: 256, False: 2.34k]
  ------------------
 2906|  2.60k|			rtiff->header.sample_format == SAMPLEFORMAT_IEEEFP)
  ------------------
  |  |  336|    256|#define SAMPLEFORMAT_IEEEFP 3              /* !IEEE floating point data */
  ------------------
  |  Branch (2906:4): [True: 0, False: 256]
  ------------------
 2907|      0|			vips_line_size /= 2;
 2908|       |
 2909|  2.60k|		if (vips_line_size != rtiff->header.scanline_size) {
  ------------------
  |  Branch (2909:7): [True: 0, False: 2.60k]
  ------------------
 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|  2.60k|	}
 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|  5.33k|	if (rtiff->header.separate) {
  ------------------
  |  Branch (2921:6): [True: 85, False: 5.24k]
  ------------------
 2922|     85|		if (!(rtiff->plane_buf = VIPS_MALLOC(out,
  ------------------
  |  |   68|     85|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  ------------------
  |  |  |  |  433|     85|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|     85|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|     85|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2922:7): [True: 0, False: 85]
  ------------------
 2923|     85|				  rtiff->header.read_size)))
 2924|      0|			return -1;
 2925|     85|	}
 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|  5.33k|	if (!rtiff->memcpy ||
  ------------------
  |  Branch (2936:6): [True: 2.72k, False: 2.60k]
  ------------------
 2937|  5.33k|		rtiff->n > 1) {
  ------------------
  |  Branch (2937:3): [True: 0, False: 2.60k]
  ------------------
 2938|  2.72k|		tsize_t size;
 2939|       |
 2940|  2.72k|		size = rtiff->header.read_size;
 2941|  2.72k|		if (rtiff->header.separate)
  ------------------
  |  Branch (2941:7): [True: 72, False: 2.65k]
  ------------------
 2942|     72|			size *= rtiff->header.samples_per_pixel;
 2943|       |
 2944|  2.72k|		if (!(rtiff->contig_buf = VIPS_MALLOC(out, size)))
  ------------------
  |  |   68|  2.72k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  ------------------
  |  |  |  |  433|  2.72k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|  2.72k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|  2.72k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2944:7): [True: 0, False: 2.72k]
  ------------------
 2945|      0|			return -1;
 2946|  2.72k|	}
 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|  5.33k|	tile_height = VIPS_MAX(
  ------------------
  |  |   54|  5.33k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 2.08k, False: 3.24k]
  |  |  ------------------
  ------------------
 2956|  5.33k|		VIPS_ROUND_DOWN(16, rtiff->header.read_height),
 2957|  5.33k|		rtiff->header.read_height);
 2958|       |
 2959|  5.33k|	if (
 2960|  5.33k|		vips_image_generate(t[0],
  ------------------
  |  Branch (2960:3): [True: 0, False: 5.33k]
  ------------------
 2961|  5.33k|			NULL, rtiff_stripwise_generate, NULL,
 2962|  5.33k|			rtiff, NULL) ||
 2963|  5.33k|		vips_sequential(t[0], &t[1],
  ------------------
  |  Branch (2963:3): [True: 0, False: 5.33k]
  ------------------
 2964|  5.33k|			"tile_height", tile_height,
 2965|  5.33k|			NULL) ||
 2966|  5.33k|		rtiff_unpremultiply(rtiff, t[1], &t[2]))
  ------------------
  |  Branch (2966:3): [True: 0, False: 5.33k]
  ------------------
 2967|      0|		return -1;
 2968|  5.33k|	in = t[2];
 2969|       |
 2970|       |	/* Only do this if we have to.
 2971|       |	 */
 2972|  5.33k|	if (rtiff->autorotate &&
  ------------------
  |  Branch (2972:6): [True: 0, False: 5.33k]
  ------------------
 2973|  5.33k|		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|  5.33k|	if (vips_image_write(in, out))
  ------------------
  |  Branch (2979:6): [True: 1.44k, False: 3.88k]
  ------------------
 2980|  1.44k|		return -1;
 2981|       |
 2982|  3.88k|	return 0;
 2983|  5.33k|}
tiff2vips.c:rtiff_stripwise_generate:
 2729|  10.8k|{
 2730|  10.8k|	VipsImage *out = out_region->im;
 2731|  10.8k|	Rtiff *rtiff = (Rtiff *) a;
 2732|  10.8k|	int read_height = rtiff->header.read_height;
 2733|  10.8k|	int page_height = rtiff->header.height;
 2734|  10.8k|	tsize_t scanline_size = rtiff->header.scanline_size;
 2735|  10.8k|	VipsRect *r = &out_region->valid;
 2736|       |
 2737|  10.8k|	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|  10.8k|	g_assert(r->left == 0);
  ------------------
  |  |  166|  10.8k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  10.8k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  10.8k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2749|  10.8k|	g_assert(r->width == out_region->im->Xsize);
  ------------------
  |  |  166|  10.8k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  10.8k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  10.8k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2750|  10.8k|	g_assert(VIPS_RECT_BOTTOM(r) <= out_region->im->Ysize);
  ------------------
  |  |  166|  10.8k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  10.8k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  10.8k|#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|  10.8k|	if (r->top != rtiff->y_pos) {
  ------------------
  |  Branch (2759:6): [True: 0, False: 10.8k]
  ------------------
 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|  10.8k|	VIPS_GATE_START("rtiff_stripwise_generate: work");
  ------------------
  |  |   41|  10.8k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  10.8k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  10.8k|	{ \
  |  |   43|  10.8k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 10.8k]
  |  |  ------------------
  |  |   44|  10.8k|			vips__thread_gate_start(NAME); \
  |  |   45|  10.8k|	} \
  |  |   46|  10.8k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  10.8k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2767|       |
 2768|  10.8k|	y = 0;
 2769|   101k|	while (y < r->height) {
  ------------------
  |  Branch (2769:9): [True: 92.0k, False: 9.44k]
  ------------------
 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|  92.0k|		int page_no = (r->top + y) / page_height;
 2775|  92.0k|		int y_page = (r->top + y) % page_height;
 2776|       |
 2777|       |		/* Strip number.
 2778|       |		 */
 2779|  92.0k|		tstrip_t strip_no = y_page / read_height;
 2780|       |
 2781|  92.0k|		VipsRect image, page, strip, hit;
 2782|       |
 2783|       |		/* Our four (including the output region) rects, all in
 2784|       |		 * output image coordinates.
 2785|       |		 */
 2786|  92.0k|		image.left = 0;
 2787|  92.0k|		image.top = 0;
 2788|  92.0k|		image.width = out->Xsize;
 2789|  92.0k|		image.height = out->Ysize;
 2790|       |
 2791|  92.0k|		page.left = 0;
 2792|  92.0k|		page.top = page_height * ((r->top + y) / page_height);
 2793|  92.0k|		page.width = out->Xsize;
 2794|  92.0k|		page.height = page_height;
 2795|       |
 2796|  92.0k|		strip.left = 0;
 2797|  92.0k|		strip.top = page.top + strip_no * read_height;
 2798|  92.0k|		strip.width = out->Xsize;
 2799|  92.0k|		strip.height = read_height;
 2800|       |
 2801|       |		/* Clip strip against page and image ... the final strip will
 2802|       |		 * be smaller.
 2803|       |		 */
 2804|  92.0k|		vips_rect_intersectrect(&strip, &image, &strip);
 2805|  92.0k|		vips_rect_intersectrect(&strip, &page, &strip);
 2806|       |
 2807|       |		/* Now the bit that overlaps with the region we are filling.
 2808|       |		 */
 2809|  92.0k|		vips_rect_intersectrect(&strip, r, &hit);
 2810|       |
 2811|  92.0k|		g_assert(hit.height > 0);
  ------------------
  |  |  166|  92.0k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  92.0k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  92.0k|#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|  92.0k|		if (rtiff->memcpy &&
  ------------------
  |  Branch (2819:7): [True: 32.7k, False: 59.2k]
  ------------------
 2820|  92.0k|			hit.top == strip.top &&
  ------------------
  |  Branch (2820:4): [True: 32.7k, False: 0]
  ------------------
 2821|  92.0k|			hit.height == strip.height) {
  ------------------
  |  Branch (2821:4): [True: 32.7k, False: 0]
  ------------------
 2822|  32.7k|			if (rtiff_strip_read_interleaved(rtiff,
  ------------------
  |  Branch (2822:8): [True: 1.44k, False: 31.2k]
  ------------------
 2823|  32.7k|					rtiff->page + page_no, strip_no,
 2824|  32.7k|					VIPS_REGION_ADDR(out_region, 0, r->top + y))) {
  ------------------
  |  |  227|  32.7k|	((R)->data + \
  |  |  228|  32.7k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  32.7k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  32.7k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  32.7k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  32.7k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  32.7k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2825|  1.44k|				VIPS_GATE_STOP(
  ------------------
  |  |   49|  1.44k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.44k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  1.44k|	{ \
  |  |   51|  1.44k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 1.44k]
  |  |  ------------------
  |  |   52|  1.44k|			vips__thread_gate_stop(NAME); \
  |  |   53|  1.44k|	} \
  |  |   54|  1.44k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.44k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2826|  1.44k|					"rtiff_stripwise_generate: work");
 2827|  1.44k|				return -1;
 2828|  1.44k|			}
 2829|  32.7k|		}
 2830|  59.2k|		else {
 2831|  59.2k|			VipsPel *p;
 2832|  59.2k|			VipsPel *q;
 2833|  59.2k|			int z;
 2834|       |
 2835|       |			/* Read and interleave the entire strip.
 2836|       |			 */
 2837|  59.2k|			if (rtiff_strip_read_interleaved(rtiff,
  ------------------
  |  Branch (2837:8): [True: 0, False: 59.2k]
  ------------------
 2838|  59.2k|					rtiff->page + page_no, strip_no,
 2839|  59.2k|					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|  59.2k|			p = (VipsPel *) rtiff->contig_buf +
 2848|  59.2k|				(hit.top - strip.top) * scanline_size;
 2849|  59.2k|			q = VIPS_REGION_ADDR(out_region, 0, r->top + y);
  ------------------
  |  |  227|  59.2k|	((R)->data + \
  |  |  228|  59.2k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  59.2k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  59.2k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  59.2k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  59.2k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  59.2k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2850|   231k|			for (z = 0; z < hit.height; z++) {
  ------------------
  |  Branch (2850:16): [True: 172k, False: 59.2k]
  ------------------
 2851|   172k|				rtiff->sfn(rtiff,
 2852|   172k|					q, p, out_region->im->Xsize, rtiff->client);
 2853|       |
 2854|   172k|				p += scanline_size;
 2855|   172k|				q += VIPS_REGION_LSKIP(out_region);
  ------------------
  |  |  195|   172k|	((size_t) ((R)->bpl))
  ------------------
 2856|   172k|			}
 2857|  59.2k|		}
 2858|       |
 2859|  90.5k|		y += hit.height;
 2860|  90.5k|		rtiff->y_pos += hit.height;
 2861|  90.5k|	}
 2862|       |
 2863|  10.8k|	VIPS_GATE_STOP("rtiff_stripwise_generate: work");
  ------------------
  |  |   49|  9.44k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  9.44k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  9.44k|	{ \
  |  |   51|  9.44k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 9.44k]
  |  |  ------------------
  |  |   52|  9.44k|			vips__thread_gate_stop(NAME); \
  |  |   53|  9.44k|	} \
  |  |   54|  10.8k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  10.8k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2864|       |
 2865|  9.44k|	return 0;
 2866|  10.8k|}
tiff2vips.c:rtiff_strip_read_interleaved:
 2673|  92.0k|{
 2674|  92.0k|	int samples_per_pixel = rtiff->header.samples_per_pixel;
 2675|  92.0k|	int read_height = rtiff->header.read_height;
 2676|  92.0k|	int bits_per_sample = rtiff->header.bits_per_sample;
 2677|  92.0k|	int read_as_rgba = rtiff->header.read_as_rgba;
 2678|  92.0k|	int strip_y = strip * read_height;
 2679|       |
 2680|  92.0k|	if (rtiff_set_page(rtiff, page))
  ------------------
  |  Branch (2680:6): [True: 0, False: 92.0k]
  ------------------
 2681|      0|		return -1;
 2682|       |
 2683|  92.0k|	if (read_as_rgba) {
  ------------------
  |  Branch (2683:6): [True: 7.01k, False: 84.9k]
  ------------------
 2684|  7.01k|		if (rtiff_rgba_strip_read(rtiff, strip, buf))
  ------------------
  |  Branch (2684:7): [True: 1.44k, False: 5.57k]
  ------------------
 2685|  1.44k|			return -1;
 2686|  7.01k|	}
 2687|  84.9k|	else if (rtiff->header.separate) {
  ------------------
  |  Branch (2687:11): [True: 2.34k, False: 82.6k]
  ------------------
 2688|  2.34k|		int page_width = rtiff->header.width;
 2689|  2.34k|		int page_height = rtiff->header.height;
 2690|  2.34k|		int strips_per_plane = 1 + (page_height - 1) / read_height;
 2691|  2.34k|		int strip_height = VIPS_MIN(read_height,
  ------------------
  |  |   55|  2.34k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 2.26k, False: 85]
  |  |  ------------------
  ------------------
 2692|  2.34k|			page_height - strip_y);
 2693|  2.34k|		int pels_per_strip = page_width * strip_height;
 2694|  2.34k|		int bytes_per_sample = bits_per_sample >> 3;
 2695|       |
 2696|  2.34k|		int i, j, k;
 2697|       |
 2698|  8.40k|		for (i = 0; i < samples_per_pixel; i++) {
  ------------------
  |  Branch (2698:15): [True: 6.05k, False: 2.34k]
  ------------------
 2699|  6.05k|			VipsPel *p;
 2700|  6.05k|			VipsPel *q;
 2701|       |
 2702|  6.05k|			if (rtiff_strip_read(rtiff,
  ------------------
  |  Branch (2702:8): [True: 0, False: 6.05k]
  ------------------
 2703|  6.05k|					strips_per_plane * i + strip,
 2704|  6.05k|					rtiff->plane_buf))
 2705|      0|				return -1;
 2706|       |
 2707|  6.05k|			p = (VipsPel *) rtiff->plane_buf;
 2708|  6.05k|			q = i * bytes_per_sample + (VipsPel *) buf;
 2709|   437k|			for (j = 0; j < pels_per_strip; j++) {
  ------------------
  |  Branch (2709:16): [True: 431k, False: 6.05k]
  ------------------
 2710|   983k|				for (k = 0; k < bytes_per_sample; k++)
  ------------------
  |  Branch (2710:17): [True: 551k, False: 431k]
  ------------------
 2711|   551k|					q[k] = p[k];
 2712|       |
 2713|   431k|				p += bytes_per_sample;
 2714|   431k|				q += bytes_per_sample * samples_per_pixel;
 2715|   431k|			}
 2716|  6.05k|		}
 2717|  2.34k|	}
 2718|  82.6k|	else {
 2719|  82.6k|		if (rtiff_strip_read(rtiff, strip, buf))
  ------------------
  |  Branch (2719:7): [True: 0, False: 82.6k]
  ------------------
 2720|      0|			return -1;
 2721|  82.6k|	}
 2722|       |
 2723|  90.5k|	return 0;
 2724|  92.0k|}
tiff2vips.c:rtiff_rgba_strip_read:
  732|  7.01k|{
  733|  7.01k|	RtiffHeader *header = &rtiff->header;
  734|       |
  735|  7.01k|	TIFFRGBAImage img;
  736|  7.01k|	guint32 rows_to_read;
  737|  7.01k|	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|  7.01k|	if (!TIFFRGBAImageOK(rtiff->tiff, err) ||
  ------------------
  |  Branch (743:6): [True: 43, False: 6.97k]
  ------------------
  744|  7.01k|		!TIFFRGBAImageBegin(&img, rtiff->tiff, 0, err)) {
  ------------------
  |  Branch (744:3): [True: 49, False: 6.92k]
  ------------------
  745|     92|		vips_foreign_load_invalidate(rtiff->out);
  746|     92|		vips_error("tiff2vips", "%s", err);
  747|     92|		return -1;
  748|     92|	}
  749|       |
  750|  6.92k|	img.req_orientation = header->orientation;
  751|  6.92k|	img.row_offset = strip * header->rows_per_strip;
  752|  6.92k|	img.col_offset = 0;
  753|       |
  754|  6.92k|	rows_to_read =
  755|  6.92k|		VIPS_MIN(header->rows_per_strip, header->height - img.row_offset);
  ------------------
  |  |   55|  6.92k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 5.81k, False: 1.10k]
  |  |  ------------------
  ------------------
  756|       |
  757|  6.92k|	if (!TIFFRGBAImageGet(&img, buf, header->width, rows_to_read)) {
  ------------------
  |  Branch (757:6): [True: 1.35k, False: 5.57k]
  ------------------
  758|  1.35k|		TIFFRGBAImageEnd(&img);
  759|  1.35k|		vips_foreign_load_invalidate(rtiff->out);
  760|  1.35k|		vips_error("tiff2vips", "%s", _("read error"));
  ------------------
  |  |   30|  1.35k|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|  1.35k|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  761|  1.35k|		return -1;
  762|  1.35k|	}
  763|       |
  764|  5.57k|	TIFFRGBAImageEnd(&img);
  765|       |
  766|  5.57k|	if (rtiff->failed) {
  ------------------
  |  Branch (766:6): [True: 0, False: 5.57k]
  ------------------
  767|      0|		vips_foreign_load_invalidate(rtiff->out);
  768|      0|		return -1;
  769|      0|	}
  770|       |
  771|  5.57k|	return 0;
  772|  5.57k|}
tiff2vips.c:rtiff_strip_read:
  704|  88.6k|{
  705|  88.6k|	tsize_t length;
  706|       |
  707|       |#ifdef DEBUG_VERBOSE
  708|       |	printf("rtiff_strip_read: reading strip %d\n", strip);
  709|       |#endif /*DEBUG_VERBOSE*/
  710|       |
  711|  88.6k|	if (rtiff->header.read_scanlinewise)
  ------------------
  |  Branch (711:6): [True: 0, False: 88.6k]
  ------------------
  712|      0|		length = TIFFReadScanline(rtiff->tiff, buf, strip, (tsample_t) 0);
  713|  88.6k|	else
  714|  88.6k|		length = TIFFReadEncodedStrip(rtiff->tiff, strip, buf, (tsize_t) -1);
  715|       |
  716|  88.6k|	if (length == -1 && rtiff->fail_on >= VIPS_FAIL_ON_WARNING) {
  ------------------
  |  Branch (716:6): [True: 38.3k, False: 50.3k]
  |  Branch (716:22): [True: 0, False: 38.3k]
  ------------------
  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|  88.6k|	if (rtiff->failed) {
  ------------------
  |  Branch (722:6): [True: 0, False: 88.6k]
  ------------------
  723|      0|		vips_foreign_load_invalidate(rtiff->out);
  724|      0|		return -1;
  725|      0|	}
  726|       |
  727|  88.6k|	return 0;
  728|  88.6k|}

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|  9.24k|{
   94|  9.24k|	VipsForeignLoadTiff *tiff = (VipsForeignLoadTiff *) gobject;
   95|       |
   96|  9.24k|	VIPS_UNREF(tiff->source);
  ------------------
  |  |   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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   97|       |
   98|  9.24k|	G_OBJECT_CLASS(vips_foreign_load_tiff_parent_class)->dispose(gobject);
  ------------------
  |  |   58|  9.24k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  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)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   99|  9.24k|}
tiffload.c:vips_foreign_load_tiff_get_flags_source:
  103|  9.25k|{
  104|  9.25k|	VipsForeignFlags flags;
  105|       |
  106|  9.25k|	flags = 0;
  107|  9.25k|	if (vips__istifftiled_source(source))
  ------------------
  |  Branch (107:6): [True: 2.11k, False: 7.14k]
  ------------------
  108|  2.11k|		flags |= VIPS_FOREIGN_PARTIAL;
  109|  7.14k|	else
  110|  7.14k|		flags |= VIPS_FOREIGN_SEQUENTIAL;
  111|       |
  112|  9.25k|	return flags;
  113|  9.25k|}
tiffload.c:vips_foreign_load_tiff_get_flags:
  131|  9.25k|{
  132|  9.25k|	VipsForeignLoadTiff *tiff = (VipsForeignLoadTiff *) load;
  133|       |
  134|  9.25k|	return vips_foreign_load_tiff_get_flags_source(tiff->source);
  135|  9.25k|}
tiffload.c:vips_foreign_load_tiff_header:
  139|  9.25k|{
  140|  9.25k|	VipsForeignLoadTiff *tiff = (VipsForeignLoadTiff *) load;
  141|       |
  142|  9.25k|	if (vips__tiff_read_header_source(tiff->source, load->out,
  ------------------
  |  Branch (142:6): [True: 1.90k, False: 7.34k]
  ------------------
  143|  9.25k|			tiff->page, tiff->n, tiff->autorotate, tiff->subifd,
  144|  9.25k|			load->fail_on, tiff->unlimited))
  145|  1.90k|		return -1;
  146|       |
  147|  7.34k|	return 0;
  148|  9.25k|}
tiffload.c:vips_foreign_load_tiff_load:
  152|  6.91k|{
  153|  6.91k|	VipsForeignLoadTiff *tiff = (VipsForeignLoadTiff *) load;
  154|       |
  155|  6.91k|	if (vips__tiff_read_source(tiff->source, load->real,
  ------------------
  |  Branch (155:6): [True: 1.45k, False: 5.45k]
  ------------------
  156|  6.91k|			tiff->page, tiff->n, tiff->autorotate, tiff->subifd,
  157|  6.91k|			load->fail_on, tiff->unlimited))
  158|  1.45k|		return -1;
  159|       |
  160|  5.45k|	return 0;
  161|  6.91k|}
tiffload.c:vips_foreign_load_tiff_init:
  235|  9.25k|{
  236|  9.25k|	tiff->page = 0;
  237|  9.25k|	tiff->n = 1;
  238|  9.25k|	tiff->subifd = -1;
  239|  9.25k|	tiff->unlimited = FALSE;
  ------------------
  |  |  794|  9.25k|#define	FALSE	(0)
  ------------------
  240|  9.25k|}
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|  21.9k|{
  278|  21.9k|	return vips__istiff_source(source);
  279|  21.9k|}
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|  9.25k|{
  411|  9.25k|	VipsForeignLoadTiff *tiff = (VipsForeignLoadTiff *) object;
  412|  9.25k|	VipsForeignLoadTiffBuffer *buffer =
  413|  9.25k|		(VipsForeignLoadTiffBuffer *) object;
  414|       |
  415|  9.25k|	if (buffer->blob &&
  ------------------
  |  Branch (415:6): [True: 9.25k, False: 0]
  ------------------
  416|  9.25k|		!(tiff->source = vips_source_new_from_memory(
  ------------------
  |  Branch (416:3): [True: 0, False: 9.25k]
  ------------------
  417|  9.25k|			  VIPS_AREA(buffer->blob)->data,
  ------------------
  |  |  137|  9.25k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  418|  9.25k|			  VIPS_AREA(buffer->blob)->length)))
  ------------------
  |  |  137|  9.25k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  419|      0|		return -1;
  420|       |
  421|  9.25k|	if (VIPS_OBJECT_CLASS(vips_foreign_load_tiff_buffer_parent_class)
  ------------------
  |  |  435|  9.25k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  9.25k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  9.25k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (421:6): [True: 1.90k, False: 7.34k]
  ------------------
  422|  9.25k|			->build(object))
  423|  1.90k|		return -1;
  424|       |
  425|  7.34k|	return 0;
  426|  9.25k|}
tiffload.c:vips_foreign_load_tiff_buffer_is_a_buffer:
  430|  21.9k|{
  431|  21.9k|	VipsSource *source;
  432|  21.9k|	gboolean result;
  433|       |
  434|  21.9k|	if (!(source = vips_source_new_from_memory(buf, len)))
  ------------------
  |  Branch (434:6): [True: 0, False: 21.9k]
  ------------------
  435|      0|		return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  436|  21.9k|	result = vips_foreign_load_tiff_source_is_a_source(source);
  437|  21.9k|	VIPS_UNREF(source);
  ------------------
  |  |   57|  21.9k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  21.9k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  21.9k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  21.9k|	{ \
  |  |  |  |   43|  21.9k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 21.9k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  21.9k|			(void) F((S)); \
  |  |  |  |   45|  21.9k|			(S) = 0; \
  |  |  |  |   46|  21.9k|		} \
  |  |  |  |   47|  21.9k|	} \
  |  |  |  |   48|  21.9k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  21.9k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  438|       |
  439|  21.9k|	return result;
  440|  21.9k|}
tiffload.c:vips_foreign_load_tiff_buffer_init:
  469|  9.25k|{
  470|  9.25k|}

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|  13.2k|{
  173|  13.2k|	char buffer[JMSG_LENGTH_MAX];
  174|       |
  175|  13.2k|	(*cinfo->err->format_message)(cinfo, buffer);
  176|  13.2k|	vips_error("VipsJpeg", _("%s"), buffer);
  ------------------
  |  |   30|  13.2k|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|  13.2k|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  177|       |
  178|       |#ifdef DEBUG
  179|       |	printf("vips__new_output_message: \"%s\"\n", buffer);
  180|       |#endif /*DEBUG*/
  181|  13.2k|}
vips__new_error_exit:
  187|  3.51k|{
  188|  3.51k|	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|  3.51k|	if (eman->fp) {
  ------------------
  |  Branch (196:6): [True: 0, False: 3.51k]
  ------------------
  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|  3.51k|	(*cinfo->err->output_message)(cinfo);
  204|       |
  205|       |	/* Jump back.
  206|       |	 */
  207|  3.51k|	longjmp(eman->jmp, 1);
  208|  3.51k|}

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|  30.1k|{
  319|  30.1k|	const unsigned char *p;
  320|       |
  321|       |	/* WebP is "RIFF xxxx WEBP" at the start, so we need 12 bytes.
  322|       |	 */
  323|  30.1k|	if ((p = vips_source_sniff(source, 12)) &&
  ------------------
  |  Branch (323:6): [True: 29.6k, False: 567]
  ------------------
  324|  30.1k|		vips_isprefix("RIFF", (char *) p) &&
  ------------------
  |  Branch (324:3): [True: 1.80k, False: 27.8k]
  ------------------
  325|  30.1k|		vips_isprefix("WEBP", (char *) p + 8))
  ------------------
  |  Branch (325:3): [True: 1.79k, False: 8]
  ------------------
  326|  1.79k|		return 1;
  327|       |
  328|  28.3k|	return 0;
  329|  30.1k|}
vips__webp_read_header_source:
  808|  1.79k|{
  809|  1.79k|	Read *read;
  810|       |
  811|  1.79k|	if (!(read = read_new(out, source, page, n, scale)) ||
  ------------------
  |  Branch (811:6): [True: 0, False: 1.79k]
  ------------------
  812|  1.79k|		read_header(read, out))
  ------------------
  |  Branch (812:3): [True: 240, False: 1.55k]
  ------------------
  813|    240|		return -1;
  814|       |
  815|  1.55k|	return 0;
  816|  1.79k|}
vips__webp_read_source:
  821|  1.51k|{
  822|  1.51k|	Read *read;
  823|       |
  824|  1.51k|	if (!(read = read_new(out, source, page, n, scale)) ||
  ------------------
  |  Branch (824:6): [True: 0, False: 1.51k]
  ------------------
  825|  1.51k|		read_image(read, out))
  ------------------
  |  Branch (825:3): [True: 1.18k, False: 329]
  ------------------
  826|  1.18k|		return -1;
  827|       |
  828|    329|	return 0;
  829|  1.51k|}
webp2vips.c:read_new:
  354|  3.30k|{
  355|  3.30k|	Read *read;
  356|       |
  357|  3.30k|	if (!(read = VIPS_NEW(NULL, Read)))
  ------------------
  |  |   70|  3.30k|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  3.30k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  3.30k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  3.30k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  3.30k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (357:6): [True: 0, False: 3.30k]
  ------------------
  358|      0|		return NULL;
  359|       |
  360|  3.30k|	read->out = out;
  361|  3.30k|	read->source = source;
  362|  3.30k|	g_object_ref(source);
  363|  3.30k|	read->page = page;
  364|  3.30k|	read->n = n;
  365|  3.30k|	read->scale = scale;
  366|  3.30k|	read->delays = NULL;
  367|  3.30k|	read->demux = NULL;
  368|  3.30k|	read->frame = NULL;
  369|  3.30k|	read->dispose_method = WEBP_MUX_DISPOSE_NONE;
  370|  3.30k|	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|  3.30k|	g_signal_connect(out, "close",
  ------------------
  |  |  491|  3.30k|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  376|  3.30k|		G_CALLBACK(read_close_cb), read);
  377|       |
  378|  3.30k|	WebPInitDecoderConfig(&read->config);
  379|  3.30k|	read->config.options.use_threads = 1;
  380|  3.30k|	read->config.output.is_external_memory = 1;
  381|       |
  382|       |	/* Map the whole source into memory.
  383|       |	 */
  384|  3.30k|	if (!(read->data.bytes =
  ------------------
  |  Branch (384:6): [True: 0, False: 3.30k]
  ------------------
  385|  3.30k|				vips_source_map(source, &read->data.size)))
  386|      0|		return NULL;
  387|       |
  388|  3.30k|	return read;
  389|  3.30k|}
webp2vips.c:read_close_cb:
  348|  3.30k|{
  349|  3.30k|	read_free(read);
  350|  3.30k|}
webp2vips.c:read_free:
  333|  3.30k|{
  334|  3.30k|	WebPDemuxReleaseIterator(&read->iter);
  335|  3.30k|	VIPS_UNREF(read->frame);
  ------------------
  |  |   57|  3.30k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  3.30k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  3.30k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  3.30k|	{ \
  |  |  |  |   43|  3.30k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 3.06k, False: 240]
  |  |  |  |  ------------------
  |  |  |  |   44|  3.06k|			(void) F((S)); \
  |  |  |  |   45|  3.06k|			(S) = 0; \
  |  |  |  |   46|  3.06k|		} \
  |  |  |  |   47|  3.30k|	} \
  |  |  |  |   48|  3.30k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  3.30k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  336|  3.30k|	VIPS_FREEF(WebPDemuxDelete, read->demux);
  ------------------
  |  |   41|  3.30k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  3.30k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  3.30k|	{ \
  |  |   43|  3.30k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 3.06k, False: 238]
  |  |  ------------------
  |  |   44|  3.06k|			(void) F((S)); \
  |  |   45|  3.06k|			(S) = 0; \
  |  |   46|  3.06k|		} \
  |  |   47|  3.30k|	} \
  |  |   48|  3.30k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  3.30k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  337|  3.30k|	WebPFreeDecBuffer(&read->config.output);
  338|       |
  339|  3.30k|	VIPS_UNREF(read->source);
  ------------------
  |  |   57|  3.30k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  3.30k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  3.30k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  3.30k|	{ \
  |  |  |  |   43|  3.30k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 3.30k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  3.30k|			(void) F((S)); \
  |  |  |  |   45|  3.30k|			(S) = 0; \
  |  |  |  |   46|  3.30k|		} \
  |  |  |  |   47|  3.30k|	} \
  |  |  |  |   48|  3.30k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  3.30k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  340|  3.30k|	VIPS_FREE(read->delays);
  ------------------
  |  |   50|  3.30k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  3.30k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  3.30k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  3.30k|	{ \
  |  |  |  |   43|  3.30k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 0, False: 3.30k]
  |  |  |  |  ------------------
  |  |  |  |   44|      0|			(void) F((S)); \
  |  |  |  |   45|      0|			(S) = 0; \
  |  |  |  |   46|      0|		} \
  |  |  |  |   47|  3.30k|	} \
  |  |  |  |   48|  3.30k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  3.30k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  341|  3.30k|	VIPS_FREE(read);
  ------------------
  |  |   50|  3.30k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  3.30k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  3.30k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  3.30k|	{ \
  |  |  |  |   43|  3.30k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 3.30k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  3.30k|			(void) F((S)); \
  |  |  |  |   45|  3.30k|			(S) = 0; \
  |  |  |  |   46|  3.30k|		} \
  |  |  |  |   47|  3.30k|	} \
  |  |  |  |   48|  3.30k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  3.30k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  342|       |
  343|  3.30k|	return 0;
  344|  3.30k|}
webp2vips.c:read_header:
  402|  3.30k|{
  403|  3.30k|	int flags;
  404|  3.30k|	int i;
  405|       |
  406|  3.30k|	if (!(read->demux = WebPDemux(&read->data))) {
  ------------------
  |  Branch (406:6): [True: 238, False: 3.06k]
  ------------------
  407|    238|		vips_error("webp", "%s", _("unable to parse image"));
  ------------------
  |  |   30|    238|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|    238|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  408|    238|		return -1;
  409|    238|	}
  410|       |
  411|  3.06k|	flags = WebPDemuxGetI(read->demux, WEBP_FF_FORMAT_FLAGS);
  412|       |
  413|  3.06k|	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|  3.06k|	read->config.output.colorspace = MODE_RGBA;
  419|       |
  420|  3.06k|	read->canvas_width =
  421|  3.06k|		WebPDemuxGetI(read->demux, WEBP_FF_CANVAS_WIDTH);
  422|  3.06k|	read->canvas_height =
  423|  3.06k|		WebPDemuxGetI(read->demux, WEBP_FF_CANVAS_HEIGHT);
  424|       |
  425|  3.06k|	if (flags & ANIMATION_FLAG) {
  ------------------
  |  Branch (425:6): [True: 0, False: 3.06k]
  ------------------
  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|  3.06k|	read->frame_width = VIPS_RINT(read->canvas_width * read->scale);
  ------------------
  |  |   74|  3.06k|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  514|  3.06k|	read->frame_height = VIPS_RINT(read->canvas_height * read->scale);
  ------------------
  |  |   74|  3.06k|#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|  3.06k|	if (flags & ANIMATION_FLAG) {
  ------------------
  |  Branch (523:6): [True: 0, False: 3.06k]
  ------------------
  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|  3.06k|	else {
  535|  3.06k|		read->width = read->frame_width;
  536|  3.06k|		read->height = read->frame_height;
  537|  3.06k|		read->frame_count = 1;
  538|  3.06k|	}
  539|       |
  540|       |	/* height can be huge if this is an animated webp image.
  541|       |	 */
  542|  3.06k|	if (read->width <= 0 ||
  ------------------
  |  Branch (542:6): [True: 0, False: 3.06k]
  ------------------
  543|  3.06k|		read->height <= 0 ||
  ------------------
  |  Branch (543:3): [True: 0, False: 3.06k]
  ------------------
  544|  3.06k|		read->width > 0x3FFF ||
  ------------------
  |  Branch (544:3): [True: 1, False: 3.06k]
  ------------------
  545|  3.06k|		read->height >= VIPS_MAX_COORD ||
  ------------------
  |  |   69|  6.13k|#define VIPS_MAX_COORD (vips_max_coord_get())
  ------------------
  |  Branch (545:3): [True: 0, False: 3.06k]
  ------------------
  546|  3.06k|		read->frame_width <= 0 ||
  ------------------
  |  Branch (546:3): [True: 0, False: 3.06k]
  ------------------
  547|  3.06k|		read->frame_height <= 0 ||
  ------------------
  |  Branch (547:3): [True: 0, False: 3.06k]
  ------------------
  548|  3.06k|		read->frame_width > 0x3FFF ||
  ------------------
  |  Branch (548:3): [True: 0, False: 3.06k]
  ------------------
  549|  3.06k|		read->frame_height > 0x3FFF) {
  ------------------
  |  Branch (549:3): [True: 1, False: 3.06k]
  ------------------
  550|      2|		vips_error("webp", "%s", _("bad image dimensions"));
  ------------------
  |  |   30|      2|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      2|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  551|      2|		return -1;
  552|      2|	}
  553|       |
  554|  12.2k|	for (i = 0; i < vips__n_webp_names; i++) {
  ------------------
  |  Branch (554:14): [True: 9.19k, False: 3.06k]
  ------------------
  555|  9.19k|		const char *vips = vips__webp_names[i].vips;
  556|  9.19k|		const char *webp = vips__webp_names[i].webp;
  557|       |
  558|  9.19k|		if (flags & vips__webp_names[i].flags) {
  ------------------
  |  Branch (558:7): [True: 10, False: 9.18k]
  ------------------
  559|     10|			WebPChunkIterator iter;
  560|       |
  561|     10|			WebPDemuxGetChunk(read->demux, webp, 1, &iter);
  562|     10|			vips_image_set_blob_copy(out,
  563|     10|				vips, iter.chunk.bytes, iter.chunk.size);
  564|     10|			WebPDemuxReleaseChunkIterator(&iter);
  565|     10|		}
  566|  9.19k|	}
  567|       |
  568|       |	/* The canvas is always RGBA, we drop alpha to RGB on output if we
  569|       |	 * can.
  570|       |	 */
  571|  3.06k|	read->frame = vips_image_new_memory();
  572|  3.06k|	vips_image_init_fields(read->frame,
  573|  3.06k|		read->frame_width, read->frame_height, 4,
  574|  3.06k|		VIPS_FORMAT_UCHAR, VIPS_CODING_NONE,
  575|  3.06k|		VIPS_INTERPRETATION_sRGB,
  576|  3.06k|		1.0, 1.0);
  577|  3.06k|	if (vips_image_pipelinev(read->frame,
  ------------------
  |  Branch (577:6): [True: 0, False: 3.06k]
  ------------------
  578|  3.06k|			VIPS_DEMAND_STYLE_THINSTRIP, NULL) ||
  579|  3.06k|		vips_image_write_prepare(read->frame))
  ------------------
  |  Branch (579:3): [True: 0, False: 3.06k]
  ------------------
  580|      0|		return -1;
  581|       |
  582|  3.06k|	vips_image_init_fields(out,
  583|  3.06k|		read->width, read->height,
  584|  3.06k|		read->alpha ? 4 : 3,
  ------------------
  |  Branch (584:3): [True: 906, False: 2.15k]
  ------------------
  585|  3.06k|		VIPS_FORMAT_UCHAR, VIPS_CODING_NONE,
  586|  3.06k|		VIPS_INTERPRETATION_sRGB,
  587|  3.06k|		1.0, 1.0);
  588|  3.06k|	if (vips_image_pipelinev(out, VIPS_DEMAND_STYLE_THINSTRIP, NULL))
  ------------------
  |  Branch (588:6): [True: 0, False: 3.06k]
  ------------------
  589|      0|		return -1;
  590|  3.06k|	VIPS_SETSTR(out->filename,
  ------------------
  |  |   53|  3.06k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  3.06k|#define G_STMT_START  do
  |  |  ------------------
  |  |   54|  3.06k|	{ \
  |  |   55|  3.06k|		const char *sst = (V); \
  |  |   56|  3.06k|		\
  |  |   57|  3.06k|		if ((S) != sst) { \
  |  |  ------------------
  |  |  |  Branch (57:7): [True: 3.06k, False: 0]
  |  |  ------------------
  |  |   58|  3.06k|			if (!(S) || !sst || strcmp((S), sst) != 0) { \
  |  |  ------------------
  |  |  |  Branch (58:8): [True: 0, False: 3.06k]
  |  |  |  Branch (58:16): [True: 3.06k, False: 0]
  |  |  |  Branch (58:24): [True: 0, False: 0]
  |  |  ------------------
  |  |   59|  3.06k|				VIPS_FREE(S); \
  |  |  ------------------
  |  |  |  |   50|  3.06k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  |  |  ------------------
  |  |  |  |  |  |   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]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   60|  3.06k|				if (sst) \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 0, False: 3.06k]
  |  |  ------------------
  |  |   61|  3.06k|					(S) = g_strdup(sst); \
  |  |   62|  3.06k|			} \
  |  |   63|  3.06k|		} \
  |  |   64|  3.06k|	} \
  |  |   65|  3.06k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  3.06k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  591|  3.06k|		vips_connection_filename(VIPS_CONNECTION(read->source)));
  592|       |
  593|  3.06k|	if (!WebPDemuxGetFrame(read->demux, 1, &read->iter)) {
  ------------------
  |  Branch (593:6): [True: 0, False: 3.06k]
  ------------------
  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|  3.06k|	return 0;
  600|  3.06k|}
webp2vips.c:read_image:
  786|  1.51k|{
  787|  1.51k|	VipsImage **t = (VipsImage **)
  788|  1.51k|		vips_object_local_array(VIPS_OBJECT(out), 2);
  ------------------
  |  |  433|  1.51k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  1.51k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.51k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  789|       |
  790|       |	/* Make the output pipeline.
  791|       |	 */
  792|  1.51k|	t[0] = vips_image_new();
  793|  1.51k|	if (read_header(read, t[0]))
  ------------------
  |  Branch (793:6): [True: 0, False: 1.51k]
  ------------------
  794|      0|		return -1;
  795|       |
  796|  1.51k|	if (vips_image_generate(t[0],
  ------------------
  |  Branch (796:6): [True: 0, False: 1.51k]
  ------------------
  797|  1.51k|			NULL, read_webp_generate, NULL, read, NULL) ||
  798|  1.51k|		vips_sequential(t[0], &t[1], NULL) ||
  ------------------
  |  Branch (798:3): [True: 0, False: 1.51k]
  ------------------
  799|  1.51k|		vips_image_write(t[1], out))
  ------------------
  |  Branch (799:3): [True: 1.18k, False: 329]
  ------------------
  800|  1.18k|		return -1;
  801|       |
  802|    329|	return 0;
  803|  1.51k|}
webp2vips.c:read_webp_generate:
  735|  29.1k|{
  736|  29.1k|	VipsRect *r = &out_region->valid;
  737|  29.1k|	Read *read = (Read *) a;
  738|       |
  739|       |	/* iter.frame_num numbers from 1.
  740|       |	 */
  741|  29.1k|	int frame = 1 + r->top / read->frame_height + read->page;
  742|  29.1k|	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|  29.1k|	g_assert(r->height == 1);
  ------------------
  |  |  166|  29.1k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  29.1k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  29.1k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  749|       |
  750|  29.4k|	while (read->frame_no < frame) {
  ------------------
  |  Branch (750:9): [True: 1.51k, False: 27.9k]
  ------------------
  751|  1.51k|		if (read_next_frame(read))
  ------------------
  |  Branch (751:7): [True: 1.18k, False: 329]
  ------------------
  752|  1.18k|			return -1;
  753|       |
  754|    329|		read->frame_no += 1;
  755|    329|	}
  756|       |
  757|  27.9k|	if (out_region->im->Bands == 4)
  ------------------
  |  Branch (757:6): [True: 10.3k, False: 17.6k]
  ------------------
  758|  10.3k|		memcpy(VIPS_REGION_ADDR(out_region, 0, r->top),
  ------------------
  |  |  227|  10.3k|	((R)->data + \
  |  |  228|  10.3k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  10.3k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  10.3k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  10.3k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  10.3k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  10.3k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  759|  10.3k|			VIPS_IMAGE_ADDR(read->frame, 0, line),
  ------------------
  |  |  418|  10.3k|	((I)->data + \
  |  |  419|  10.3k|		(Y) *VIPS_IMAGE_SIZEOF_LINE(I) + \
  |  |  ------------------
  |  |  |  |  386|  10.3k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  10.3k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  10.3k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  420|  10.3k|		(X) *VIPS_IMAGE_SIZEOF_PEL(I))
  |  |  ------------------
  |  |  |  |  384|  10.3k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  ------------------
  |  |  |  |  |  |  382|  10.3k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  760|  10.3k|			VIPS_IMAGE_SIZEOF_LINE(read->frame));
  ------------------
  |  |  386|  10.3k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  ------------------
  |  |  |  |  384|  10.3k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  ------------------
  |  |  |  |  |  |  382|  10.3k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  761|  17.6k|	else {
  762|  17.6k|		int x;
  763|  17.6k|		VipsPel *p;
  764|  17.6k|		VipsPel *q;
  765|       |
  766|       |		/* We know that alpha is solid, so we can just drop the 4th
  767|       |		 * band.
  768|       |		 */
  769|  17.6k|		p = VIPS_IMAGE_ADDR(read->frame, 0, line);
  ------------------
  |  |  418|  17.6k|	((I)->data + \
  |  |  419|  17.6k|		(Y) *VIPS_IMAGE_SIZEOF_LINE(I) + \
  |  |  ------------------
  |  |  |  |  386|  17.6k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  17.6k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  17.6k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  420|  17.6k|		(X) *VIPS_IMAGE_SIZEOF_PEL(I))
  |  |  ------------------
  |  |  |  |  384|  17.6k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  ------------------
  |  |  |  |  |  |  382|  17.6k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  770|  17.6k|		q = VIPS_REGION_ADDR(out_region, 0, r->top);
  ------------------
  |  |  227|  17.6k|	((R)->data + \
  |  |  228|  17.6k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  17.6k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  17.6k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  17.6k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  17.6k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  17.6k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  771|  1.45M|		for (x = 0; x < r->width; x++) {
  ------------------
  |  Branch (771:15): [True: 1.43M, False: 17.6k]
  ------------------
  772|  1.43M|			q[0] = p[0];
  773|  1.43M|			q[1] = p[1];
  774|  1.43M|			q[2] = p[2];
  775|       |
  776|  1.43M|			q += 3;
  777|  1.43M|			p += 4;
  778|  1.43M|		}
  779|  17.6k|	}
  780|       |
  781|  27.9k|	return 0;
  782|  29.1k|}
webp2vips.c:read_next_frame:
  647|  1.51k|{
  648|  1.51k|	VipsImage *frame;
  649|  1.51k|	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|  1.51k|	area.left = VIPS_RINT(read->iter.x_offset * read->scale);
  ------------------
  |  |   74|  1.51k|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  660|  1.51k|	area.top = VIPS_RINT(read->iter.y_offset * read->scale);
  ------------------
  |  |   74|  1.51k|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  661|  1.51k|	area.width = VIPS_RINT(read->iter.width * read->scale);
  ------------------
  |  |   74|  1.51k|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  662|  1.51k|	area.height = VIPS_RINT(read->iter.height * read->scale);
  ------------------
  |  |   74|  1.51k|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  663|       |
  664|       |	/* Dispose from the previous frame.
  665|       |	 */
  666|  1.51k|	if (read->dispose_method == WEBP_MUX_DISPOSE_BACKGROUND) {
  ------------------
  |  Branch (666:6): [True: 0, False: 1.51k]
  ------------------
  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|  1.51k|	read->dispose_method = read->iter.dispose_method;
  683|  1.51k|	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|  1.51k|	if (!(frame = read_frame(read,
  ------------------
  |  Branch (705:6): [True: 1.18k, False: 329]
  ------------------
  706|  1.51k|			  area.width, area.height,
  707|  1.51k|			  read->iter.fragment.bytes, read->iter.fragment.size)))
  708|  1.18k|		return -1;
  709|       |
  710|       |	/* Now blend or copy the new pixels into our accumulator.
  711|       |	 */
  712|    329|	vips_image_paint_image(read->frame, frame,
  713|    329|		area.left, area.top,
  714|    329|		read->iter.frame_num > 1 &&
  ------------------
  |  Branch (714:3): [True: 0, False: 329]
  ------------------
  715|    329|			read->iter.blend_method == WEBP_MUX_BLEND);
  ------------------
  |  Branch (715:4): [True: 0, False: 0]
  ------------------
  716|       |
  717|    329|	g_object_unref(frame);
  718|       |
  719|       |	/* If there's another frame, move on.
  720|       |	 */
  721|    329|	if (read->iter.frame_num < read->frame_count) {
  ------------------
  |  Branch (721:6): [True: 0, False: 329]
  ------------------
  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|    329|	return 0;
  730|    329|}
webp2vips.c:read_frame:
  608|  1.51k|{
  609|  1.51k|	VipsImage *frame;
  610|       |
  611|       |#ifdef DEBUG
  612|       |	printf("read_frame:\n");
  613|       |#endif /*DEBUG*/
  614|       |
  615|  1.51k|	frame = vips_image_new_memory();
  616|  1.51k|	vips_image_init_fields(frame,
  617|  1.51k|		width, height, 4,
  618|  1.51k|		VIPS_FORMAT_UCHAR, VIPS_CODING_NONE,
  619|  1.51k|		VIPS_INTERPRETATION_sRGB,
  620|  1.51k|		1.0, 1.0);
  621|  1.51k|	if (vips_image_pipelinev(frame, VIPS_DEMAND_STYLE_THINSTRIP, NULL) ||
  ------------------
  |  Branch (621:6): [True: 0, False: 1.51k]
  ------------------
  622|  1.51k|		vips_image_write_prepare(frame)) {
  ------------------
  |  Branch (622:3): [True: 0, False: 1.51k]
  ------------------
  623|      0|		g_object_unref(frame);
  624|      0|		return NULL;
  625|      0|	}
  626|       |
  627|  1.51k|	read->config.output.u.RGBA.rgba = VIPS_IMAGE_ADDR(frame, 0, 0);
  ------------------
  |  |  418|  1.51k|	((I)->data + \
  |  |  419|  1.51k|		(Y) *VIPS_IMAGE_SIZEOF_LINE(I) + \
  |  |  ------------------
  |  |  |  |  386|  1.51k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  1.51k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  1.51k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  420|  1.51k|		(X) *VIPS_IMAGE_SIZEOF_PEL(I))
  |  |  ------------------
  |  |  |  |  384|  1.51k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  ------------------
  |  |  |  |  |  |  382|  1.51k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  628|  1.51k|	read->config.output.u.RGBA.stride = VIPS_IMAGE_SIZEOF_LINE(frame);
  ------------------
  |  |  386|  1.51k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  ------------------
  |  |  |  |  384|  1.51k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  ------------------
  |  |  |  |  |  |  382|  1.51k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  629|  1.51k|	read->config.output.u.RGBA.size = VIPS_IMAGE_SIZEOF_IMAGE(frame);
  ------------------
  |  |  388|  1.51k|	(VIPS_IMAGE_SIZEOF_LINE(I) * (I)->Ysize)
  |  |  ------------------
  |  |  |  |  386|  1.51k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  1.51k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  1.51k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  630|  1.51k|	if (read->scale != 1.0) {
  ------------------
  |  Branch (630:6): [True: 0, False: 1.51k]
  ------------------
  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|  1.51k|	if (WebPDecode(data, length, &read->config) != VP8_STATUS_OK) {
  ------------------
  |  Branch (636:6): [True: 1.18k, False: 329]
  ------------------
  637|  1.18k|		g_object_unref(frame);
  638|  1.18k|		vips_error("webp2vips", "%s", _("unable to read pixels"));
  ------------------
  |  |   30|  1.18k|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|  1.18k|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  639|  1.18k|		return NULL;
  640|  1.18k|	}
  641|       |
  642|    329|	return frame;
  643|  1.51k|}
webp2vips.c:vips_image_paint_image:
  281|    329|{
  282|    329|	VipsRect frame_rect = { 0, 0, frame->Xsize, frame->Ysize };
  283|    329|	VipsRect sub_rect = { left, top, sub->Xsize, sub->Ysize };
  284|    329|	int ps = VIPS_IMAGE_SIZEOF_PEL(frame);
  ------------------
  |  |  384|    329|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|    329|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  285|       |
  286|    329|	VipsRect ovl;
  287|       |
  288|    329|	g_assert(VIPS_IMAGE_SIZEOF_PEL(sub) == ps);
  ------------------
  |  |  166|    329|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|    329|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    329|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  289|       |
  290|    329|	vips_rect_intersectrect(&frame_rect, &sub_rect, &ovl);
  291|    329|	if (!vips_rect_isempty(&ovl)) {
  ------------------
  |  Branch (291:6): [True: 329, False: 0]
  ------------------
  292|    329|		VipsPel *p, *q;
  293|    329|		int x, y;
  294|       |
  295|    329|		p = VIPS_IMAGE_ADDR(sub, ovl.left - left, ovl.top - top);
  ------------------
  |  |  418|    329|	((I)->data + \
  |  |  419|    329|		(Y) *VIPS_IMAGE_SIZEOF_LINE(I) + \
  |  |  ------------------
  |  |  |  |  386|    329|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|    329|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|    329|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  420|    329|		(X) *VIPS_IMAGE_SIZEOF_PEL(I))
  |  |  ------------------
  |  |  |  |  384|    329|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  ------------------
  |  |  |  |  |  |  382|    329|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  296|    329|		q = VIPS_IMAGE_ADDR(frame, ovl.left, ovl.top);
  ------------------
  |  |  418|    329|	((I)->data + \
  |  |  419|    329|		(Y) *VIPS_IMAGE_SIZEOF_LINE(I) + \
  |  |  ------------------
  |  |  |  |  386|    329|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|    329|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|    329|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  420|    329|		(X) *VIPS_IMAGE_SIZEOF_PEL(I))
  |  |  ------------------
  |  |  |  |  384|    329|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  ------------------
  |  |  |  |  |  |  382|    329|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  297|       |
  298|  28.2k|		for (y = 0; y < ovl.height; y++) {
  ------------------
  |  Branch (298:15): [True: 27.9k, False: 329]
  ------------------
  299|  27.9k|			if (blend) {
  ------------------
  |  Branch (299:8): [True: 0, False: 27.9k]
  ------------------
  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|  27.9k|			else
  307|  27.9k|				memcpy((char *) q, (char *) p,
  308|  27.9k|					ovl.width * ps);
  309|       |
  310|  27.9k|			p += VIPS_IMAGE_SIZEOF_LINE(sub);
  ------------------
  |  |  386|  27.9k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  ------------------
  |  |  |  |  384|  27.9k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  ------------------
  |  |  |  |  |  |  382|  27.9k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  311|  27.9k|			q += VIPS_IMAGE_SIZEOF_LINE(frame);
  ------------------
  |  |  386|  27.9k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  ------------------
  |  |  |  |  384|  27.9k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  ------------------
  |  |  |  |  |  |  382|  27.9k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  312|  27.9k|		}
  313|    329|	}
  314|    329|}

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|  1.79k|{
   90|  1.79k|	VipsForeignLoadWebp *webp = (VipsForeignLoadWebp *) gobject;
   91|       |
   92|  1.79k|	VIPS_UNREF(webp->source);
  ------------------
  |  |   57|  1.79k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  1.79k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  1.79k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  1.79k|	{ \
  |  |  |  |   43|  1.79k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 1.79k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  1.79k|			(void) F((S)); \
  |  |  |  |   45|  1.79k|			(S) = 0; \
  |  |  |  |   46|  1.79k|		} \
  |  |  |  |   47|  1.79k|	} \
  |  |  |  |   48|  1.79k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  1.79k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   93|       |
   94|  1.79k|	G_OBJECT_CLASS(vips_foreign_load_webp_parent_class)->dispose(gobject);
  ------------------
  |  |   58|  1.79k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  1.79k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  1.79k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   95|  1.79k|}
webpload.c:vips_foreign_load_webp_build:
   99|  1.79k|{
  100|  1.79k|	VipsForeignLoadWebp *webp = (VipsForeignLoadWebp *) object;
  101|       |
  102|       |	/* BC for the old API.
  103|       |	 */
  104|  1.79k|	if (!vips_object_argument_isset(VIPS_OBJECT(webp), "scale") &&
  ------------------
  |  |  433|  1.79k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  1.79k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.79k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (104:6): [True: 1.79k, False: 0]
  ------------------
  105|  1.79k|		vips_object_argument_isset(VIPS_OBJECT(webp), "shrink") &&
  ------------------
  |  |  433|  1.79k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  1.79k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.79k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (105:3): [True: 0, False: 1.79k]
  ------------------
  106|  1.79k|		webp->shrink != 0)
  ------------------
  |  Branch (106:3): [True: 0, False: 0]
  ------------------
  107|      0|		webp->scale = 1.0 / webp->shrink; // FIXME: Invalidates operation cache
  108|       |
  109|  1.79k|	if (VIPS_OBJECT_CLASS(vips_foreign_load_webp_parent_class)->build(object))
  ------------------
  |  |  435|  1.79k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  1.79k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  1.79k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (109:6): [True: 240, False: 1.55k]
  ------------------
  110|    240|		return -1;
  111|       |
  112|  1.55k|	return 0;
  113|  1.79k|}
webpload.c:vips_foreign_load_webp_get_flags:
  117|  1.79k|{
  118|  1.79k|	return 0;
  119|  1.79k|}
webpload.c:vips_foreign_load_webp_header:
  129|  1.79k|{
  130|  1.79k|	VipsForeignLoadWebp *webp = (VipsForeignLoadWebp *) load;
  131|       |
  132|  1.79k|	if (vips__webp_read_header_source(webp->source, load->out,
  ------------------
  |  Branch (132:6): [True: 240, False: 1.55k]
  ------------------
  133|  1.79k|			webp->page, webp->n, webp->scale))
  134|    240|		return -1;
  135|       |
  136|  1.55k|	return 0;
  137|  1.79k|}
webpload.c:vips_foreign_load_webp_load:
  141|  1.51k|{
  142|  1.51k|	VipsForeignLoadWebp *webp = (VipsForeignLoadWebp *) load;
  143|       |
  144|  1.51k|	if (vips__webp_read_source(webp->source, load->real,
  ------------------
  |  Branch (144:6): [True: 1.18k, False: 329]
  ------------------
  145|  1.51k|			webp->page, webp->n, webp->scale))
  146|  1.18k|		return -1;
  147|       |
  148|    329|	return 0;
  149|  1.51k|}
webpload.c:vips_foreign_load_webp_init:
  208|  1.79k|{
  209|  1.79k|	webp->n = 1;
  210|  1.79k|	webp->shrink = 1;
  211|  1.79k|	webp->scale = 1.0;
  212|  1.79k|}
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|  1.79k|{
  375|  1.79k|	VipsForeignLoadWebp *webp = (VipsForeignLoadWebp *) object;
  376|  1.79k|	VipsForeignLoadWebpBuffer *buffer =
  377|  1.79k|		(VipsForeignLoadWebpBuffer *) object;
  378|       |
  379|  1.79k|	if (buffer->blob &&
  ------------------
  |  Branch (379:6): [True: 1.79k, False: 0]
  ------------------
  380|  1.79k|		!(webp->source = vips_source_new_from_memory(
  ------------------
  |  Branch (380:3): [True: 0, False: 1.79k]
  ------------------
  381|  1.79k|			  VIPS_AREA(buffer->blob)->data,
  ------------------
  |  |  137|  1.79k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  382|  1.79k|			  VIPS_AREA(buffer->blob)->length)))
  ------------------
  |  |  137|  1.79k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  383|      0|		return -1;
  384|       |
  385|  1.79k|	if (VIPS_OBJECT_CLASS(vips_foreign_load_webp_buffer_parent_class)
  ------------------
  |  |  435|  1.79k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  1.79k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  1.79k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (385:6): [True: 240, False: 1.55k]
  ------------------
  386|  1.79k|			->build(object))
  387|    240|		return -1;
  388|       |
  389|  1.55k|	return 0;
  390|  1.79k|}
webpload.c:vips_foreign_load_webp_buffer_is_a_buffer:
  394|  30.1k|{
  395|  30.1k|	VipsSource *source;
  396|  30.1k|	gboolean result;
  397|       |
  398|  30.1k|	if (!(source = vips_source_new_from_memory(buf, len)))
  ------------------
  |  Branch (398:6): [True: 0, False: 30.1k]
  ------------------
  399|      0|		return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  400|  30.1k|	result = vips__iswebp_source(source);
  401|  30.1k|	VIPS_UNREF(source);
  ------------------
  |  |   57|  30.1k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  30.1k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  30.1k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  30.1k|	{ \
  |  |  |  |   43|  30.1k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 30.1k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  30.1k|			(void) F((S)); \
  |  |  |  |   45|  30.1k|			(S) = 0; \
  |  |  |  |   46|  30.1k|		} \
  |  |  |  |   47|  30.1k|	} \
  |  |  |  |   48|  30.1k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  30.1k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  402|       |
  403|  30.1k|	return result;
  404|  30.1k|}
webpload.c:vips_foreign_load_webp_buffer_init:
  433|  1.79k|{
  434|  1.79k|}

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|  12.6k|{
   97|  12.6k|	buf->i = 0;
   98|  12.6k|	buf->lasti = 0;
   99|  12.6k|	buf->full = FALSE;
  ------------------
  |  |  794|  12.6k|#define	FALSE	(0)
  ------------------
  100|       |
  101|  12.6k|	if (buf->base)
  ------------------
  |  Branch (101:6): [True: 12.6k, False: 0]
  ------------------
  102|  12.6k|		buf->base[0] = '\0';
  103|  12.6k|}
vips_buf_appendns:
  257|  2.35M|{
  258|  2.35M|	int len;
  259|  2.35M|	int n;
  260|  2.35M|	int avail;
  261|  2.35M|	int cpy;
  262|       |
  263|  2.35M|	if (buf->full)
  ------------------
  |  Branch (263:6): [True: 2.08M, False: 269k]
  ------------------
  264|  2.08M|		return FALSE;
  ------------------
  |  |  794|  2.08M|#define	FALSE	(0)
  ------------------
  265|   269k|	if (!str)
  ------------------
  |  Branch (265:6): [True: 0, False: 269k]
  ------------------
  266|      0|		return TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  267|       |
  268|       |	/* Amount we want to copy.
  269|       |	 */
  270|   269k|	len = strlen(str);
  271|   269k|	if (sz >= 0)
  ------------------
  |  Branch (271:6): [True: 0, False: 269k]
  ------------------
  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|   269k|	else
  274|   269k|		n = len;
  275|       |
  276|       |	/* Space available.
  277|       |	 */
  278|   269k|	avail = buf->mx - buf->i - 4;
  279|       |
  280|   269k|	cpy = VIPS_MIN(n, avail);
  ------------------
  |  |   55|   269k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 268k, False: 1.37k]
  |  |  ------------------
  ------------------
  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|   269k|	strncpy(buf->base + buf->i, str, cpy);
  288|   269k|	buf->i += cpy;
  289|       |
  290|   269k|	if (buf->i >= buf->mx - 4) {
  ------------------
  |  Branch (290:6): [True: 1.37k, False: 268k]
  ------------------
  291|  1.37k|		buf->full = TRUE;
  ------------------
  |  |  798|  1.37k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  1.37k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  292|  1.37k|		strcpy(buf->base + buf->mx - 4, "...");
  293|  1.37k|		buf->i = buf->mx - 1;
  294|  1.37k|		return FALSE;
  ------------------
  |  |  794|  1.37k|#define	FALSE	(0)
  ------------------
  295|  1.37k|	}
  296|       |
  297|   268k|	return TRUE;
  ------------------
  |  |  798|   268k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|   268k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  298|   269k|}
vips_buf_appends:
  311|  2.35M|{
  312|  2.35M|	return vips_buf_appendns(buf, str, -1);
  313|  2.35M|}
vips_buf_vappendf:
  413|  4.73M|{
  414|  4.73M|	int avail;
  415|  4.73M|	char *p;
  416|       |
  417|  4.73M|	if (buf->full)
  ------------------
  |  Branch (417:6): [True: 4.17M, False: 559k]
  ------------------
  418|  4.17M|		return FALSE;
  ------------------
  |  |  794|  4.17M|#define	FALSE	(0)
  ------------------
  419|       |
  420|   559k|	avail = buf->mx - buf->i - 4;
  421|   559k|	p = buf->base + buf->i;
  422|   559k|	(void) g_vsnprintf(p, avail, fmt, ap);
  423|   559k|	buf->i += strlen(p);
  424|       |
  425|   559k|	if (buf->i >= buf->mx - 4) {
  ------------------
  |  Branch (425:6): [True: 0, False: 559k]
  ------------------
  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|   559k|	return TRUE;
  ------------------
  |  |  798|   559k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|   559k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  433|   559k|}
vips_buf_appendf:
  447|  2.37M|{
  448|  2.37M|	va_list ap;
  449|  2.37M|	gboolean result;
  450|       |
  451|  2.37M|	va_start(ap, fmt);
  452|  2.37M|	result = vips_buf_vappendf(buf, fmt, ap);
  453|  2.37M|	va_end(ap);
  454|       |
  455|  2.37M|	return result;
  456|  2.37M|}
vips_buf_all:
  724|  30.2k|{
  725|  30.2k|	buf->base[buf->i] = '\0';
  726|       |
  727|  30.2k|	return buf->base;
  728|  30.2k|}

vips_buffer_done:
  368|   360k|{
  369|   360k|	VipsImage *im = buffer->im;
  370|   360k|	VipsBufferCache *cache;
  371|       |
  372|   360k|	if (!buffer->done &&
  ------------------
  |  Branch (372:6): [True: 360k, False: 0]
  ------------------
  373|   360k|		(cache = buffer_cache_get(im))) {
  ------------------
  |  Branch (373:3): [True: 360k, False: 0]
  ------------------
  374|   360k|		g_assert(!g_slist_find(cache->buffers, buffer));
  ------------------
  |  |  166|   360k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   360k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   360k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  375|   360k|		g_assert(!buffer->cache);
  ------------------
  |  |  166|   360k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   360k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   360k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  376|       |
  377|   360k|		buffer->done = TRUE;
  ------------------
  |  |  798|   360k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|   360k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  378|   360k|		buffer->cache = cache;
  379|       |
  380|   360k|		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|   360k|	}
  388|   360k|}
vips_buffer_undone:
  394|  3.54M|{
  395|  3.54M|	if (buffer->done) {
  ------------------
  |  Branch (395:6): [True: 360k, False: 3.18M]
  ------------------
  396|   360k|		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|   360k|		g_assert(cache->thread == g_thread_self());
  ------------------
  |  |  166|   360k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   360k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   360k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  405|   360k|		g_assert(cache->buffer_thread->thread == cache->thread);
  ------------------
  |  |  166|   360k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   360k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   360k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  406|   360k|		g_assert(g_slist_find(cache->buffers, buffer));
  ------------------
  |  |  166|   360k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   360k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   360k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  407|   360k|		g_assert(buffer_thread_get());
  ------------------
  |  |  166|   360k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   360k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   360k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  408|   360k|		g_assert(cache->buffer_thread == buffer_thread_get());
  ------------------
  |  |  166|   360k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   360k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   360k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  409|       |
  410|   360k|		cache->buffers = g_slist_remove(cache->buffers, buffer);
  411|   360k|		buffer->done = FALSE;
  ------------------
  |  |  794|   360k|#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|   360k|	}
  418|       |
  419|  3.54M|	buffer->cache = NULL;
  420|  3.54M|	buffer->area.width = 0;
  421|  3.54M|	buffer->area.height = 0;
  422|  3.54M|}
vips_buffer_unref:
  426|  1.87M|{
  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|  1.87M|	g_assert(buffer->ref_count > 0);
  ------------------
  |  |  166|  1.87M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  1.87M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.87M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  436|       |
  437|  1.87M|	buffer->ref_count -= 1;
  438|       |
  439|  1.87M|	if (buffer->ref_count == 0) {
  ------------------
  |  Branch (439:6): [True: 1.75M, False: 120k]
  ------------------
  440|  1.75M|		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|  1.75M|		vips_buffer_undone(buffer);
  448|       |
  449|       |		/* Place on this thread's reserve list for reuse.
  450|       |		 */
  451|  1.75M|		if ((cache = buffer_cache_get(buffer->im)) &&
  ------------------
  |  Branch (451:7): [True: 1.71M, False: 40.5k]
  ------------------
  452|  1.75M|			cache->n_reserve < buffer_cache_max_reserve) {
  ------------------
  |  Branch (452:4): [True: 1.57M, False: 141k]
  ------------------
  453|  1.57M|			g_assert(!buffer->cache);
  ------------------
  |  |  166|  1.57M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  1.57M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.57M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  454|       |
  455|  1.57M|			cache->reserve =
  456|  1.57M|				g_slist_prepend(cache->reserve, buffer);
  457|  1.57M|			cache->n_reserve += 1;
  458|       |
  459|  1.57M|			buffer->cache = cache;
  460|  1.57M|			buffer->area.width = 0;
  461|  1.57M|			buffer->area.height = 0;
  462|  1.57M|		}
  463|   181k|		else
  464|   181k|			vips_buffer_free(buffer);
  465|  1.75M|	}
  466|  1.87M|}
vips_buffer_new:
  512|  1.75M|{
  513|  1.75M|	VipsBufferCache *cache;
  514|  1.75M|	VipsBuffer *buffer;
  515|       |
  516|  1.75M|	if ((cache = buffer_cache_get(im)) &&
  ------------------
  |  Branch (516:6): [True: 1.75M, False: 0]
  ------------------
  517|  1.75M|		cache->reserve) {
  ------------------
  |  Branch (517:3): [True: 124k, False: 1.63M]
  ------------------
  518|   124k|		buffer = (VipsBuffer *) cache->reserve->data;
  519|   124k|		cache->reserve = g_slist_remove(cache->reserve, buffer);
  520|   124k|		cache->n_reserve -= 1;
  521|       |
  522|   124k|		g_assert(buffer->im == im);
  ------------------
  |  |  166|   124k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   124k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   124k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  523|   124k|		g_assert(buffer->done == FALSE);
  ------------------
  |  |  166|   124k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   124k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   124k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  524|   124k|		g_assert(buffer->cache);
  ------------------
  |  |  166|   124k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   124k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   124k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  525|       |
  526|   124k|		buffer->ref_count = 1;
  527|   124k|		buffer->done = FALSE;
  ------------------
  |  |  794|   124k|#define	FALSE	(0)
  ------------------
  528|   124k|		buffer->cache = NULL;
  529|   124k|	}
  530|  1.63M|	else {
  531|  1.63M|		buffer = g_new0(VipsBuffer, 1);
  ------------------
  |  |  299|  1.63M|#define g_new0(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc0)
  |  |  ------------------
  |  |  |  |  227|  1.63M|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|  1.63M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|  1.63M|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|  1.63M|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|  1.63M|	  gpointer __p;						\
  |  |  |  |  231|  1.63M|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 1.63M]
  |  |  |  |  ------------------
  |  |  |  |  232|  1.63M|	    __p = g_##func (__n);				\
  |  |  |  |  233|  1.63M|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 1.63M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|  1.63M|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 1.63M]
  |  |  |  |  |  Branch (234:26): [True: 1.63M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|  1.63M|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|  1.63M|	  else							\
  |  |  |  |  237|  1.63M|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|  1.63M|	  __p;							\
  |  |  |  |  239|  1.63M|	}))
  |  |  ------------------
  ------------------
  532|  1.63M|		buffer->ref_count = 1;
  533|  1.63M|		buffer->im = im;
  534|  1.63M|		buffer->done = FALSE;
  ------------------
  |  |  794|  1.63M|#define	FALSE	(0)
  ------------------
  535|  1.63M|		buffer->cache = NULL;
  536|  1.63M|		buffer->buf = NULL;
  537|  1.63M|		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|  1.63M|	}
  546|       |
  547|  1.75M|	if (buffer_move(buffer, area)) {
  ------------------
  |  Branch (547:6): [True: 0, False: 1.75M]
  ------------------
  548|      0|		vips_buffer_free(buffer);
  549|      0|		return NULL;
  550|      0|	}
  551|       |
  552|  1.75M|	return buffer;
  553|  1.75M|}
vips_buffer_unref_ref:
  621|  1.90M|{
  622|  1.90M|	VipsBuffer *buffer;
  623|       |
  624|  1.90M|	g_assert(!old_buffer ||
  ------------------
  |  |  166|  1.90M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  1.90M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.90M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  625|  1.90M|		old_buffer->im == im);
  626|       |
  627|       |	/* Is the current buffer OK?
  628|       |	 */
  629|  1.90M|	if (old_buffer &&
  ------------------
  |  Branch (629:6): [True: 28.1k, False: 1.87M]
  ------------------
  630|  1.90M|		vips_rect_includesrect(&old_buffer->area, area))
  ------------------
  |  Branch (630:3): [True: 0, False: 28.1k]
  ------------------
  631|      0|		return old_buffer;
  632|       |
  633|       |	/* Does the new area already have a buffer?
  634|       |	 */
  635|  1.90M|	if ((buffer = buffer_find(im, area))) {
  ------------------
  |  Branch (635:6): [True: 120k, False: 1.78M]
  ------------------
  636|   120k|		VIPS_FREEF(vips_buffer_unref, old_buffer);
  ------------------
  |  |   41|   120k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   120k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   120k|	{ \
  |  |   43|   120k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 120k]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|   120k|	} \
  |  |   48|   120k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   120k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  637|   120k|		return buffer;
  638|   120k|	}
  639|       |
  640|       |	/* Is the current buffer unshared? We can just move it.
  641|       |	 */
  642|  1.78M|	if (old_buffer &&
  ------------------
  |  Branch (642:6): [True: 28.1k, False: 1.75M]
  ------------------
  643|  1.78M|		old_buffer->ref_count == 1) {
  ------------------
  |  Branch (643:3): [True: 28.1k, False: 0]
  ------------------
  644|  28.1k|		if (buffer_move(old_buffer, area)) {
  ------------------
  |  Branch (644:7): [True: 0, False: 28.1k]
  ------------------
  645|      0|			vips_buffer_unref(old_buffer);
  646|      0|			return NULL;
  647|      0|		}
  648|       |
  649|  28.1k|		return old_buffer;
  650|  28.1k|	}
  651|       |
  652|       |	/* Fallback ... unref the old one, make a new one.
  653|       |	 */
  654|  1.78M|	VIPS_FREEF(vips_buffer_unref, old_buffer);
  ------------------
  |  |   41|  1.75M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.75M|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  1.75M|	{ \
  |  |   43|  1.75M|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 1.75M]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|  1.75M|	} \
  |  |   48|  1.78M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.78M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  655|  1.75M|	if (!(buffer = vips_buffer_new(im, area)))
  ------------------
  |  Branch (655:6): [True: 0, False: 1.75M]
  ------------------
  656|      0|		return NULL;
  657|       |
  658|  1.75M|	return buffer;
  659|  1.75M|}
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|   233k|{
  693|   233k|	VipsBufferThread *buffer_thread;
  694|       |
  695|   233k|	if ((buffer_thread = g_private_get(&buffer_thread_key))) {
  ------------------
  |  Branch (695:6): [True: 233k, False: 0]
  ------------------
  696|   233k|		buffer_thread_free(buffer_thread);
  697|   233k|		g_private_set(&buffer_thread_key, NULL);
  698|   233k|	}
  699|   233k|}
buffer.c:buffer_cache_get:
  345|  5.78M|{
  346|  5.78M|	VipsBufferThread *buffer_thread;
  347|  5.78M|	VipsBufferCache *cache;
  348|       |
  349|  5.78M|	if ((buffer_thread = buffer_thread_get())) {
  ------------------
  |  Branch (349:6): [True: 5.74M, False: 40.5k]
  ------------------
  350|  5.74M|		if (!(cache = (VipsBufferCache *)
  ------------------
  |  Branch (350:7): [True: 1.45M, False: 4.28M]
  ------------------
  351|  5.74M|					g_hash_table_lookup(buffer_thread->hash, im))) {
  352|  1.45M|			cache = buffer_cache_new(buffer_thread, im);
  353|  1.45M|			g_hash_table_insert(buffer_thread->hash, im, cache);
  354|  1.45M|		}
  355|       |
  356|  5.74M|		g_assert(cache->thread == g_thread_self());
  ------------------
  |  |  166|  5.74M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  5.74M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  5.74M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  357|  5.74M|	}
  358|  40.5k|	else
  359|  40.5k|		cache = NULL;
  360|       |
  361|  5.78M|	return cache;
  362|  5.78M|}
buffer.c:buffer_thread_get:
  318|  5.78M|{
  319|  5.78M|	VipsBufferThread *buffer_thread;
  320|       |
  321|  5.78M|	if (vips_thread_isvips()) {
  ------------------
  |  Branch (321:6): [True: 5.74M, False: 40.5k]
  ------------------
  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|  5.74M|		if (!(buffer_thread = g_private_get(&buffer_thread_key))) {
  ------------------
  |  Branch (326:7): [True: 233k, False: 5.51M]
  ------------------
  327|   233k|			buffer_thread = buffer_thread_new();
  328|   233k|			g_private_set(&buffer_thread_key, buffer_thread);
  329|   233k|		}
  330|       |
  331|  5.74M|		g_assert(buffer_thread->thread == g_thread_self());
  ------------------
  |  |  166|  5.74M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  5.74M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  5.74M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  332|  5.74M|	}
  333|  40.5k|	else
  334|       |		/* Non-vips threads don't have one.
  335|       |		 */
  336|  40.5k|		buffer_thread = NULL;
  337|       |
  338|  5.78M|	return buffer_thread;
  339|  5.78M|}
buffer.c:buffer_thread_new:
  302|   233k|{
  303|   233k|	VipsBufferThread *buffer_thread;
  304|       |
  305|   233k|	buffer_thread = g_new(VipsBufferThread, 1);
  ------------------
  |  |  282|   233k|#define g_new(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc)
  |  |  ------------------
  |  |  |  |  227|   233k|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|   233k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|   233k|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|   233k|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|   233k|	  gpointer __p;						\
  |  |  |  |  231|   233k|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 233k]
  |  |  |  |  ------------------
  |  |  |  |  232|   233k|	    __p = g_##func (__n);				\
  |  |  |  |  233|   233k|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 233k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|   233k|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 233k]
  |  |  |  |  |  Branch (234:26): [True: 233k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|   233k|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|   233k|	  else							\
  |  |  |  |  237|   233k|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|   233k|	  __p;							\
  |  |  |  |  239|   233k|	}))
  |  |  ------------------
  ------------------
  306|   233k|	buffer_thread->hash = g_hash_table_new_full(
  307|   233k|		g_direct_hash, g_direct_equal,
  308|   233k|		NULL, (GDestroyNotify) buffer_cache_free);
  309|   233k|	buffer_thread->thread = g_thread_self();
  310|       |
  311|   233k|	return buffer_thread;
  312|   233k|}
buffer.c:buffer_cache_free:
  233|  1.45M|{
  234|  1.45M|	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|  1.45M|	for (p = cache->buffers; p; p = p->next) {
  ------------------
  |  Branch (251:27): [True: 0, False: 1.45M]
  ------------------
  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|  1.45M|	VIPS_FREEF(g_slist_free, cache->buffers);
  ------------------
  |  |   41|  1.45M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.45M|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  1.45M|	{ \
  |  |   43|  1.45M|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 1.45M]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|  1.45M|	} \
  |  |   48|  1.45M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.45M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  261|       |
  262|  2.91M|	for (p = cache->reserve; p; p = p->next) {
  ------------------
  |  Branch (262:27): [True: 1.45M, False: 1.45M]
  ------------------
  263|  1.45M|		VipsBuffer *buffer = (VipsBuffer *) p->data;
  264|       |
  265|  1.45M|		vips_buffer_free(buffer);
  266|  1.45M|	}
  267|  1.45M|	VIPS_FREEF(g_slist_free, cache->reserve);
  ------------------
  |  |   41|  1.45M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.45M|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  1.45M|	{ \
  |  |   43|  1.45M|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 1.44M, False: 18.6k]
  |  |  ------------------
  |  |   44|  1.44M|			(void) F((S)); \
  |  |   45|  1.44M|			(S) = 0; \
  |  |   46|  1.44M|		} \
  |  |   47|  1.45M|	} \
  |  |   48|  1.45M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.45M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  268|       |
  269|  1.45M|	g_free(cache);
  270|  1.45M|}
buffer.c:buffer_cache_new:
  274|  1.45M|{
  275|  1.45M|	VipsBufferCache *cache;
  276|       |
  277|  1.45M|	cache = g_new(VipsBufferCache, 1);
  ------------------
  |  |  282|  1.45M|#define g_new(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc)
  |  |  ------------------
  |  |  |  |  227|  1.45M|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|  1.45M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|  1.45M|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|  1.45M|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|  1.45M|	  gpointer __p;						\
  |  |  |  |  231|  1.45M|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 1.45M]
  |  |  |  |  ------------------
  |  |  |  |  232|  1.45M|	    __p = g_##func (__n);				\
  |  |  |  |  233|  1.45M|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 1.45M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|  1.45M|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 1.45M]
  |  |  |  |  |  Branch (234:26): [True: 1.45M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|  1.45M|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|  1.45M|	  else							\
  |  |  |  |  237|  1.45M|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|  1.45M|	  __p;							\
  |  |  |  |  239|  1.45M|	}))
  |  |  ------------------
  ------------------
  278|  1.45M|	cache->buffers = NULL;
  279|  1.45M|	cache->thread = g_thread_self();
  280|  1.45M|	cache->im = im;
  281|  1.45M|	cache->buffer_thread = buffer_thread;
  282|  1.45M|	cache->reserve = NULL;
  283|  1.45M|	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|  1.45M|	return cache;
  298|  1.45M|}
buffer.c:vips_buffer_free:
  203|  1.63M|{
  204|  1.63M|	VIPS_FREEF(vips_tracked_aligned_free, buffer->buf);
  ------------------
  |  |   41|  1.63M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.63M|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  1.63M|	{ \
  |  |   43|  1.63M|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 1.63M, False: 0]
  |  |  ------------------
  |  |   44|  1.63M|			(void) F((S)); \
  |  |   45|  1.63M|			(S) = 0; \
  |  |   46|  1.63M|		} \
  |  |   47|  1.63M|	} \
  |  |   48|  1.63M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.63M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  205|  1.63M|	buffer->bsize = 0;
  206|  1.63M|	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|  1.63M|}
buffer.c:buffer_move:
  470|  1.78M|{
  471|  1.78M|	VipsImage *im = buffer->im;
  472|  1.78M|	size_t new_bsize;
  473|  1.78M|	size_t align;
  474|       |
  475|  1.78M|	g_assert(buffer->ref_count == 1);
  ------------------
  |  |  166|  1.78M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  1.78M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.78M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  476|       |
  477|  1.78M|	vips_buffer_undone(buffer);
  478|  1.78M|	g_assert(!buffer->done);
  ------------------
  |  |  166|  1.78M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  1.78M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.78M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  479|       |
  480|  1.78M|	buffer->area = *area;
  481|       |
  482|  1.78M|	new_bsize = (size_t) VIPS_IMAGE_SIZEOF_PEL(im) *
  ------------------
  |  |  384|  1.78M|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|  1.78M|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  483|  1.78M|		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|  1.78M|#ifdef HAVE_HWY
  489|  1.78M|	if (im->BandFmt == VIPS_FORMAT_UCHAR) {
  ------------------
  |  Branch (489:6): [True: 464k, False: 1.32M]
  ------------------
  490|   464k|		new_bsize += /*HWY_ALIGNMENT*/ 64 - 1;
  491|   464k|		align = /*HWY_ALIGNMENT*/ 64;
  492|   464k|	}
  493|  1.32M|	else
  494|  1.32M|#endif /*HAVE_HWY*/
  495|  1.32M|		align = 16;
  496|       |
  497|  1.78M|	if (buffer->bsize < new_bsize ||
  ------------------
  |  Branch (497:6): [True: 1.63M, False: 152k]
  ------------------
  498|  1.78M|		!buffer->buf) {
  ------------------
  |  Branch (498:3): [True: 0, False: 152k]
  ------------------
  499|  1.63M|		buffer->bsize = new_bsize;
  500|  1.63M|		VIPS_FREEF(vips_tracked_aligned_free, buffer->buf);
  ------------------
  |  |   41|  1.63M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.63M|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  1.63M|	{ \
  |  |   43|  1.63M|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 1.63M]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|  1.63M|	} \
  |  |   48|  1.63M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.63M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  501|  1.63M|		if (!(buffer->buf = vips_tracked_aligned_alloc(buffer->bsize, align)))
  ------------------
  |  Branch (501:7): [True: 0, False: 1.63M]
  ------------------
  502|      0|			return -1;
  503|  1.63M|	}
  504|       |
  505|  1.78M|	return 0;
  506|  1.78M|}
buffer.c:buffer_find:
  560|  1.90M|{
  561|  1.90M|	VipsBufferCache *cache;
  562|  1.90M|	VipsBuffer *buffer;
  563|  1.90M|	GSList *p;
  564|  1.90M|	VipsRect *area;
  565|       |
  566|  1.90M|	if (!(cache = buffer_cache_get(im)))
  ------------------
  |  Branch (566:6): [True: 0, False: 1.90M]
  ------------------
  567|      0|		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|  1.93M|	for (p = cache->buffers; p; p = p->next) {
  ------------------
  |  Branch (576:27): [True: 148k, False: 1.78M]
  ------------------
  577|   148k|		buffer = (VipsBuffer *) p->data;
  578|   148k|		area = &buffer->area;
  579|       |
  580|   148k|		if (area->left <= r->left &&
  ------------------
  |  Branch (580:7): [True: 148k, False: 0]
  ------------------
  581|   148k|			area->top <= r->top &&
  ------------------
  |  Branch (581:4): [True: 148k, False: 0]
  ------------------
  582|   148k|			area->left + area->width >= r->left + r->width &&
  ------------------
  |  Branch (582:4): [True: 148k, False: 0]
  ------------------
  583|   148k|			area->top + area->height >= r->top + r->height) {
  ------------------
  |  Branch (583:4): [True: 120k, False: 28.1k]
  ------------------
  584|   120k|			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|   120k|			return buffer;
  596|   120k|		}
  597|   148k|	}
  598|       |
  599|  1.78M|	return NULL;
  600|  1.90M|}
buffer.c:buffer_thread_free:
  224|   233k|{
  225|   233k|	VIPS_FREEF(g_hash_table_destroy, buffer_thread->hash);
  ------------------
  |  |   41|   233k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   233k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   233k|	{ \
  |  |   43|   233k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 233k, False: 0]
  |  |  ------------------
  |  |   44|   233k|			(void) F((S)); \
  |  |   45|   233k|			(S) = 0; \
  |  |   46|   233k|		} \
  |  |   47|   233k|	} \
  |  |   48|   233k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   233k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  226|   233k|	VIPS_FREE(buffer_thread);
  ------------------
  |  |   50|   233k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|   233k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   233k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|   233k|	{ \
  |  |  |  |   43|   233k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 233k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|   233k|			(void) F((S)); \
  |  |  |  |   45|   233k|			(S) = 0; \
  |  |  |  |   46|   233k|		} \
  |  |  |  |   47|   233k|	} \
  |  |  |  |   48|   233k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   233k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  227|   233k|}

vips_operation_hash:
  342|  33.6M|{
  343|  33.6M|	guint hash;
  344|       |
  345|  33.6M|	if (operation->found_hash)
  ------------------
  |  Branch (345:6): [True: 28.6M, False: 4.97M]
  ------------------
  346|  28.6M|		hash = operation->hash;
  347|  4.97M|	else {
  348|       |		/* Include the operation type in the hash.
  349|       |		 */
  350|  4.97M|		hash = (guint) G_OBJECT_TYPE(operation);
  ------------------
  |  |   95|  4.97M|#define G_OBJECT_TYPE(object)       (G_TYPE_FROM_INSTANCE (object))
  |  |  ------------------
  |  |  |  |  602|  4.97M|#define G_TYPE_FROM_INSTANCE(instance)                          (G_TYPE_FROM_CLASS (((GTypeInstance*) (instance))->g_class))
  |  |  |  |  ------------------
  |  |  |  |  |  |  613|  4.97M|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  351|  4.97M|		(void) vips_argument_map(VIPS_OBJECT(operation),
  ------------------
  |  |  433|  4.97M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  4.97M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  4.97M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  352|  4.97M|			vips_object_hash_arg, &hash, NULL);
  353|       |
  354|       |		/* Make sure we can't have a zero hash value.
  355|       |		 */
  356|  4.97M|		hash |= 1;
  357|       |
  358|       |		/* The hash can change up to the moment of construction. After that,
  359|       |		 * it should be fixed.
  360|       |		 */
  361|  4.97M|		if (VIPS_OBJECT(operation)->constructed) {
  ------------------
  |  |  433|  4.97M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  4.97M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  4.97M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (361:7): [True: 2.38M, False: 2.58M]
  ------------------
  362|  2.38M|			operation->hash = hash;
  363|  2.38M|			operation->found_hash = TRUE;
  ------------------
  |  |  798|  2.38M|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  2.38M|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  364|  2.38M|		}
  365|  4.97M|	}
  366|       |
  367|  33.6M|	return hash;
  368|  33.6M|}
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|  2.48M|{
  885|       |	/* Any flags for this new operation we are building.
  886|       |	 */
  887|  2.48M|	VipsOperationFlags flags = vips_operation_get_flags(*operation);
  888|       |
  889|  2.48M|	VipsOperationCacheEntry *hit;
  890|       |
  891|  2.48M|	g_assert(VIPS_IS_OPERATION(*operation));
  ------------------
  |  |  166|  2.48M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.48M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.48M|#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|  2.48M|	g_mutex_lock(&vips_cache_lock);
  901|       |
  902|  2.48M|	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|  2.48M|	if (hit) {
  ------------------
  |  Branch (908:6): [True: 60.7k, False: 2.41M]
  ------------------
  909|  60.7k|		if (hit->invalid ||
  ------------------
  |  Branch (909:7): [True: 0, False: 60.7k]
  ------------------
  910|  60.7k|			(flags & VIPS_OPERATION_BLOCKED) ||
  ------------------
  |  Branch (910:4): [True: 0, False: 60.7k]
  ------------------
  911|  60.7k|			(flags & VIPS_OPERATION_REVALIDATE)) {
  ------------------
  |  Branch (911:4): [True: 0, False: 60.7k]
  ------------------
  912|      0|			vips_cache_remove(hit->operation);
  913|      0|			hit = NULL;
  914|      0|		}
  915|  60.7k|	}
  916|       |
  917|       |	/* If we still have a hit, return that and junk the operation we were
  918|       |	 * passed.
  919|       |	 */
  920|  2.48M|	if (hit) {
  ------------------
  |  Branch (920:6): [True: 60.7k, False: 2.41M]
  ------------------
  921|  60.7k|		vips_cache_ref(hit->operation);
  922|  60.7k|		g_object_unref(*operation);
  923|  60.7k|		*operation = hit->operation;
  924|       |
  925|  60.7k|		if (vips__cache_trace) {
  ------------------
  |  Branch (925:7): [True: 0, False: 60.7k]
  ------------------
  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|  60.7k|	}
  930|       |
  931|  2.48M|	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|  2.48M|	if (!hit) {
  ------------------
  |  Branch (936:6): [True: 2.41M, False: 60.7k]
  ------------------
  937|  2.41M|		unsigned int hash_before = 0;
  938|  2.41M|		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|  2.41M|		if (vips__leak) {
  ------------------
  |  Branch (943:7): [True: 0, False: 2.41M]
  ------------------
  944|      0|			hash_before = vips_operation_hash(*operation);
  945|      0|			operation_before = vips_operation_copy(*operation);
  946|      0|		}
  947|       |
  948|  2.41M|		if (vips_object_build(VIPS_OBJECT(*operation)))
  ------------------
  |  |  433|  2.41M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  2.41M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  2.41M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (948:7): [True: 29.9k, False: 2.38M]
  ------------------
  949|  29.9k|			return -1;
  950|       |
  951|  2.38M|		if (vips__leak &&
  ------------------
  |  Branch (951:7): [True: 0, False: 2.38M]
  ------------------
  952|  2.38M|			!(flags & VIPS_OPERATION_NOCACHE) &&
  ------------------
  |  Branch (952:4): [True: 0, False: 0]
  ------------------
  953|  2.38M|			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|  2.38M|		VIPS_UNREF(operation_before);
  ------------------
  |  |   57|  2.38M|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  2.38M|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  2.38M|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  2.38M|	{ \
  |  |  |  |   43|  2.38M|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 0, False: 2.38M]
  |  |  |  |  ------------------
  |  |  |  |   44|      0|			(void) F((S)); \
  |  |  |  |   45|      0|			(S) = 0; \
  |  |  |  |   46|      0|		} \
  |  |  |  |   47|  2.38M|	} \
  |  |  |  |   48|  2.38M|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  2.38M|#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|  2.38M|		flags = vips_operation_get_flags(*operation);
  981|       |
  982|  2.38M|		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|  2.38M|		if (!vips_cache_operation_get(*operation)) {
  ------------------
  |  Branch (988:7): [True: 2.38M, False: 0]
  ------------------
  989|       |			/* Has to be after _build() so we can see output args.
  990|       |			 */
  991|  2.38M|			if (vips__cache_trace) {
  ------------------
  |  Branch (991:8): [True: 0, False: 2.38M]
  ------------------
  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|  2.38M|			if (!(flags & VIPS_OPERATION_NOCACHE))
  ------------------
  |  Branch (999:8): [True: 1.34M, False: 1.04M]
  ------------------
 1000|  1.34M|				vips_cache_insert(*operation);
 1001|  2.38M|		}
 1002|       |
 1003|  2.38M|		g_mutex_unlock(&vips_cache_lock);
 1004|  2.38M|	}
 1005|       |
 1006|  2.45M|	vips_cache_trim();
 1007|       |
 1008|  2.45M|	return 0;
 1009|  2.48M|}
cache.c:vips_object_hash_arg:
  318|  50.3M|{
  319|  50.3M|	unsigned int *hash = (unsigned int *) a;
  320|       |
  321|  50.3M|	if ((argument_class->flags & VIPS_ARGUMENT_CONSTRUCT) &&
  ------------------
  |  Branch (321:6): [True: 40.4M, False: 9.94M]
  ------------------
  322|  50.3M|		(argument_class->flags & VIPS_ARGUMENT_INPUT) &&
  ------------------
  |  Branch (322:3): [True: 35.1M, False: 5.28M]
  ------------------
  323|  50.3M|		!(argument_class->flags & VIPS_ARGUMENT_NON_HASHABLE) &&
  ------------------
  |  Branch (323:3): [True: 35.1M, False: 48.0k]
  ------------------
  324|  50.3M|		argument_instance->assigned) {
  ------------------
  |  Branch (324:3): [True: 9.51M, False: 25.5M]
  ------------------
  325|  9.51M|		const char *name = g_param_spec_get_name(pspec);
  326|  9.51M|		GType type = G_PARAM_SPEC_VALUE_TYPE(pspec);
  ------------------
  |  |  103|  9.51M|#define	G_PARAM_SPEC_VALUE_TYPE(pspec)	(G_PARAM_SPEC (pspec)->value_type)
  |  |  ------------------
  |  |  |  |   45|  9.51M|#define G_PARAM_SPEC(pspec)		(G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM, GParamSpec))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|  9.51M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|  9.51M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  327|  9.51M|		GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|  9.51M|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
  328|       |
  329|  9.51M|		g_value_init(&value, type);
  330|  9.51M|		g_object_get_property(G_OBJECT(object), name, &value);
  ------------------
  |  |   51|  9.51M|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|  9.51M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  9.51M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  331|  9.51M|		*hash = (*hash << 1) ^ vips_value_hash(pspec, &value);
  332|  9.51M|		g_value_unset(&value);
  333|  9.51M|	}
  334|       |
  335|  50.3M|	return NULL;
  336|  50.3M|}
cache.c:vips_value_hash:
  135|  9.51M|{
  136|  9.51M|	GType generic = G_PARAM_SPEC_TYPE(pspec);
  ------------------
  |  |   89|  9.51M|#define G_PARAM_SPEC_TYPE(pspec)	(G_TYPE_FROM_INSTANCE (pspec))
  |  |  ------------------
  |  |  |  |  602|  9.51M|#define G_TYPE_FROM_INSTANCE(instance)                          (G_TYPE_FROM_CLASS (((GTypeInstance*) (instance))->g_class))
  |  |  |  |  ------------------
  |  |  |  |  |  |  613|  9.51M|#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|  9.51M|	if (generic == G_TYPE_PARAM_BOOLEAN)
  ------------------
  |  |   85|  9.51M|#define	G_TYPE_PARAM_BOOLEAN		   (g_param_spec_types[2])
  ------------------
  |  Branch (142:6): [True: 44.8k, False: 9.47M]
  ------------------
  143|  44.8k|		return (unsigned int) g_value_get_boolean(value);
  144|  9.47M|	else if (generic == G_TYPE_PARAM_CHAR)
  ------------------
  |  |   39|  9.47M|#define	G_TYPE_PARAM_CHAR		   (g_param_spec_types[0])
  ------------------
  |  Branch (144:11): [True: 0, False: 9.47M]
  ------------------
  145|      0|		return (unsigned int) g_value_get_schar(value);
  146|  9.47M|	else if (generic == G_TYPE_PARAM_UCHAR)
  ------------------
  |  |   62|  9.47M|#define	G_TYPE_PARAM_UCHAR		   (g_param_spec_types[1])
  ------------------
  |  Branch (146:11): [True: 0, False: 9.47M]
  ------------------
  147|      0|		return (unsigned int) g_value_get_uchar(value);
  148|  9.47M|	else if (generic == G_TYPE_PARAM_INT)
  ------------------
  |  |  108|  9.47M|#define	G_TYPE_PARAM_INT		   (g_param_spec_types[3])
  ------------------
  |  Branch (148:11): [True: 1.77M, False: 7.69M]
  ------------------
  149|  1.77M|		return (unsigned int) g_value_get_int(value);
  150|  7.69M|	else if (generic == G_TYPE_PARAM_UINT)
  ------------------
  |  |  131|  7.69M|#define	G_TYPE_PARAM_UINT		   (g_param_spec_types[4])
  ------------------
  |  Branch (150:11): [True: 0, False: 7.69M]
  ------------------
  151|      0|		return (unsigned int) g_value_get_uint(value);
  152|  7.69M|	else if (generic == G_TYPE_PARAM_LONG)
  ------------------
  |  |  154|  7.69M|#define	G_TYPE_PARAM_LONG		   (g_param_spec_types[5])
  ------------------
  |  Branch (152:11): [True: 0, False: 7.69M]
  ------------------
  153|      0|		return (unsigned int) g_value_get_long(value);
  154|  7.69M|	else if (generic == G_TYPE_PARAM_ULONG)
  ------------------
  |  |  177|  7.69M|#define	G_TYPE_PARAM_ULONG		   (g_param_spec_types[6])
  ------------------
  |  Branch (154:11): [True: 0, False: 7.69M]
  ------------------
  155|      0|		return (unsigned int) g_value_get_ulong(value);
  156|  7.69M|	else if (generic == G_TYPE_PARAM_ENUM)
  ------------------
  |  |  269|  7.69M|#define	G_TYPE_PARAM_ENUM		   (g_param_spec_types[10])
  ------------------
  |  Branch (156:11): [True: 1.30M, False: 6.38M]
  ------------------
  157|  1.30M|		return (unsigned int) g_value_get_enum(value);
  158|  6.38M|	else if (generic == G_TYPE_PARAM_FLAGS)
  ------------------
  |  |  292|  6.38M|#define	G_TYPE_PARAM_FLAGS		   (g_param_spec_types[11])
  ------------------
  |  Branch (158:11): [True: 0, False: 6.38M]
  ------------------
  159|      0|		return (unsigned int) g_value_get_flags(value);
  160|  6.38M|	else if (generic == G_TYPE_PARAM_UINT64) {
  ------------------
  |  |  223|  6.38M|#define	G_TYPE_PARAM_UINT64		   (g_param_spec_types[8])
  ------------------
  |  Branch (160:11): [True: 0, False: 6.38M]
  ------------------
  161|      0|		guint64 i = g_value_get_uint64(value);
  162|       |
  163|      0|		return g_int64_hash((gint64 *) &i);
  164|      0|	}
  165|  6.38M|	else if (generic == G_TYPE_PARAM_INT64) {
  ------------------
  |  |  200|  6.38M|#define	G_TYPE_PARAM_INT64		   (g_param_spec_types[7])
  ------------------
  |  Branch (165:11): [True: 0, False: 6.38M]
  ------------------
  166|      0|		gint64 i = g_value_get_int64(value);
  167|       |
  168|      0|		return g_int64_hash(&i);
  169|      0|	}
  170|  6.38M|	else if (generic == G_TYPE_PARAM_FLOAT) {
  ------------------
  |  |  315|  6.38M|#define	G_TYPE_PARAM_FLOAT		   (g_param_spec_types[12])
  ------------------
  |  Branch (170:11): [True: 0, False: 6.38M]
  ------------------
  171|      0|		float f = g_value_get_float(value);
  172|       |
  173|      0|		return g_direct_hash((void *) &f);
  174|      0|	}
  175|  6.38M|	else if (generic == G_TYPE_PARAM_DOUBLE) {
  ------------------
  |  |  338|  6.38M|#define	G_TYPE_PARAM_DOUBLE		   (g_param_spec_types[13])
  ------------------
  |  Branch (175:11): [True: 386k, False: 6.00M]
  ------------------
  176|   386k|		double d = g_value_get_double(value);
  177|       |
  178|   386k|		return g_double_hash(&d);
  179|   386k|	}
  180|  6.00M|	else if (generic == G_TYPE_PARAM_STRING) {
  ------------------
  |  |  361|  6.00M|#define	G_TYPE_PARAM_STRING		   (g_param_spec_types[14])
  ------------------
  |  Branch (180:11): [True: 3.36k, False: 5.99M]
  ------------------
  181|  3.36k|		const char *s = g_value_get_string(value);
  182|       |
  183|  3.36k|		return s ? g_str_hash(s) : 0;
  ------------------
  |  Branch (183:10): [True: 3.36k, False: 0]
  ------------------
  184|  3.36k|	}
  185|  5.99M|	else if (generic == G_TYPE_PARAM_BOXED) {
  ------------------
  |  |  407|  5.99M|#define	G_TYPE_PARAM_BOXED		   (g_param_spec_types[16])
  ------------------
  |  Branch (185:11): [True: 633k, False: 5.36M]
  ------------------
  186|   633k|		void *p = g_value_get_boxed(value);
  187|       |
  188|   633k|		return p ? g_direct_hash(p) : 0;
  ------------------
  |  Branch (188:10): [True: 633k, False: 0]
  ------------------
  189|   633k|	}
  190|  5.36M|	else if (generic == G_TYPE_PARAM_POINTER) {
  ------------------
  |  |  430|  5.36M|#define	G_TYPE_PARAM_POINTER		   (g_param_spec_types[17])
  ------------------
  |  Branch (190:11): [True: 0, False: 5.36M]
  ------------------
  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|  5.36M|	else if (generic == G_TYPE_PARAM_OBJECT) {
  ------------------
  |  |  482|  5.36M|#define	G_TYPE_PARAM_OBJECT		   (g_param_spec_types[19])
  ------------------
  |  Branch (195:11): [True: 5.36M, False: 0]
  ------------------
  196|  5.36M|		void *p = g_value_get_object(value);
  197|       |
  198|  5.36M|		return p ? g_direct_hash(p) : 0;
  ------------------
  |  Branch (198:10): [True: 5.36M, False: 0]
  ------------------
  199|  5.36M|	}
  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|  9.51M|}
cache.c:vips_operation_equal:
  422|  26.4M|{
  423|  26.4M|	if (a == b)
  ------------------
  |  Branch (423:6): [True: 25.4M, False: 983k]
  ------------------
  424|  25.4M|		return TRUE;
  ------------------
  |  |  798|  25.4M|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  25.4M|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  425|       |
  426|   983k|	if (G_OBJECT_TYPE(a) == G_OBJECT_TYPE(b) &&
  ------------------
  |  |   95|   983k|#define G_OBJECT_TYPE(object)       (G_TYPE_FROM_INSTANCE (object))
  |  |  ------------------
  |  |  |  |  602|   983k|#define G_TYPE_FROM_INSTANCE(instance)                          (G_TYPE_FROM_CLASS (((GTypeInstance*) (instance))->g_class))
  |  |  |  |  ------------------
  |  |  |  |  |  |  613|   983k|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
              	if (G_OBJECT_TYPE(a) == G_OBJECT_TYPE(b) &&
  ------------------
  |  |   95|  1.96M|#define G_OBJECT_TYPE(object)       (G_TYPE_FROM_INSTANCE (object))
  |  |  ------------------
  |  |  |  |  602|   983k|#define G_TYPE_FROM_INSTANCE(instance)                          (G_TYPE_FROM_CLASS (((GTypeInstance*) (instance))->g_class))
  |  |  |  |  ------------------
  |  |  |  |  |  |  613|   983k|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (426:6): [True: 980k, False: 3.15k]
  ------------------
  427|   983k|		vips_operation_hash(a) == vips_operation_hash(b) &&
  ------------------
  |  Branch (427:3): [True: 980k, False: 0]
  ------------------
  428|   983k|		!vips_argument_map(VIPS_OBJECT(a), vips_object_equal_arg, b, NULL))
  ------------------
  |  |  433|   980k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|   980k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   980k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (428:3): [True: 60.7k, False: 919k]
  ------------------
  429|  60.7k|		return TRUE;
  ------------------
  |  |  798|  60.7k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  60.7k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  430|       |
  431|   922k|	return FALSE;
  ------------------
  |  |  794|   922k|#define	FALSE	(0)
  ------------------
  432|   983k|}
cache.c:vips_cache_remove:
  585|  1.34M|{
  586|  1.34M|	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|  1.34M|	g_assert(entry);
  ------------------
  |  |  166|  1.34M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  1.34M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.34M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  594|       |
  595|  1.34M|	if (entry->invalidate_id) {
  ------------------
  |  Branch (595:6): [True: 1.34M, False: 0]
  ------------------
  596|  1.34M|		g_signal_handler_disconnect(operation, entry->invalidate_id);
  597|  1.34M|		entry->invalidate_id = 0;
  598|  1.34M|	}
  599|       |
  600|  1.34M|	g_hash_table_remove(vips_cache_table, operation);
  601|  1.34M|	vips_cache_unref(operation);
  602|       |
  603|  1.34M|	g_free(entry);
  604|  1.34M|}
cache.c:vips_cache_unref:
  564|  1.34M|{
  565|       |#ifdef DEBUG
  566|       |	printf("vips_cache_unref: ");
  567|       |	vips_object_print_summary(VIPS_OBJECT(operation));
  568|       |#endif /*DEBUG*/
  569|       |
  570|  1.34M|	(void) vips_argument_map(VIPS_OBJECT(operation),
  ------------------
  |  |  433|  1.34M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  1.34M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.34M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  571|  1.34M|		vips_object_unref_arg, operation, NULL);
  572|  1.34M|	g_object_unref(operation);
  573|  1.34M|}
cache.c:vips_object_unref_arg:
  535|  8.85M|{
  536|  8.85M|	if ((argument_class->flags & VIPS_ARGUMENT_CONSTRUCT) &&
  ------------------
  |  Branch (536:6): [True: 6.16M, False: 2.68M]
  ------------------
  537|  8.85M|		(argument_class->flags & VIPS_ARGUMENT_OUTPUT) &&
  ------------------
  |  Branch (537:3): [True: 1.45M, False: 4.71M]
  ------------------
  538|  8.85M|		argument_instance->assigned &&
  ------------------
  |  Branch (538:3): [True: 1.45M, False: 0]
  ------------------
  539|  8.85M|		G_IS_PARAM_SPEC_OBJECT(pspec)) {
  ------------------
  |  |  491|  1.45M|#define G_IS_PARAM_SPEC_OBJECT(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OBJECT))
  |  |  ------------------
  |  |  |  |  497|  1.45M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  1.45M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  1.45M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  1.45M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  1.45M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 1.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  1.45M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  1.45M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 1.45M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 1.32M, False: 130k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  1.45M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  1.32M|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  1.32M|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  1.45M|  else \
  |  |  |  |  |  | 2321|  1.45M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  1.45M|  __r; \
  |  |  |  |  |  | 2323|  1.45M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (491:44): [True: 1.32M, False: 130k]
  |  |  ------------------
  ------------------
  540|  1.32M|		GObject *value;
  541|       |
  542|       |		/* This will up the ref count for us.
  543|       |		 */
  544|  1.32M|		g_object_get(G_OBJECT(object),
  ------------------
  |  |   51|  1.32M|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|  1.32M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.32M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  545|  1.32M|			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|  1.32M|		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|  1.32M|		g_object_unref(value);
  556|  1.32M|		g_object_unref(value);
  557|  1.32M|	}
  558|       |
  559|  8.85M|	return NULL;
  560|  8.85M|}
cache.c:vips_cache_operation_get:
  577|  29.0M|{
  578|  29.0M|	return g_hash_table_lookup(vips_cache_table, operation);
  579|  29.0M|}
cache.c:vips_cache_ref:
  703|  1.40M|{
  704|       |#ifdef DEBUG
  705|       |	printf("vips_cache_ref: ");
  706|       |	vips_object_print_summary(VIPS_OBJECT(operation));
  707|       |#endif /*DEBUG*/
  708|       |
  709|  1.40M|	g_object_ref(operation);
  710|  1.40M|	(void) vips_argument_map(VIPS_OBJECT(operation),
  ------------------
  |  |  433|  1.40M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  1.40M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.40M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  711|  1.40M|		vips_object_ref_arg, operation, NULL);
  712|       |
  713|  1.40M|	vips_operation_touch(operation);
  714|  1.40M|}
cache.c:vips_object_ref_arg:
  612|  9.23M|{
  613|  9.23M|	VipsOperation *operation = VIPS_OPERATION(a);
  ------------------
  |  |   57|  9.23M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  9.23M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  9.23M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   58|  9.23M|		VIPS_TYPE_OPERATION, VipsOperation))
  ------------------
  614|       |
  615|  9.23M|	if ((argument_class->flags & VIPS_ARGUMENT_CONSTRUCT) &&
  ------------------
  |  Branch (615:6): [True: 6.41M, False: 2.81M]
  ------------------
  616|  9.23M|		(argument_class->flags & VIPS_ARGUMENT_OUTPUT) &&
  ------------------
  |  Branch (616:3): [True: 1.52M, False: 4.89M]
  ------------------
  617|  9.23M|		argument_instance->assigned &&
  ------------------
  |  Branch (617:3): [True: 1.52M, False: 0]
  ------------------
  618|  9.23M|		G_IS_PARAM_SPEC_OBJECT(pspec)) {
  ------------------
  |  |  491|  1.52M|#define G_IS_PARAM_SPEC_OBJECT(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OBJECT))
  |  |  ------------------
  |  |  |  |  497|  1.52M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  1.52M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  1.52M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  1.52M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  1.52M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 1.52M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  1.52M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  1.52M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 1.52M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 1.38M, False: 130k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  1.52M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  1.38M|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  1.38M|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  1.52M|  else \
  |  |  |  |  |  | 2321|  1.52M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  1.52M|  __r; \
  |  |  |  |  |  | 2323|  1.52M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (491:44): [True: 1.38M, False: 130k]
  |  |  ------------------
  ------------------
  619|  1.38M|		GObject *value;
  620|       |
  621|       |		/* This will up the ref count for us.
  622|       |		 */
  623|  1.38M|		g_object_get(G_OBJECT(object),
  ------------------
  |  |   51|  1.38M|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|  1.38M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.38M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  624|  1.38M|			g_param_spec_get_name(pspec), &value, NULL);
  625|       |
  626|       |		/* This object has been made by this operation.
  627|       |		 */
  628|  1.38M|		g_object_set_data(value, "libvips-operation", operation);
  629|  1.38M|	}
  630|       |
  631|  9.23M|	return NULL;
  632|  9.23M|}
cache.c:vips_operation_touch:
  685|  1.40M|{
  686|  1.40M|	vips_cache_time += 1;
  687|       |
  688|       |	/* Touch the operations on the upstream trees on all input images.
  689|       |	 */
  690|  1.40M|	(void) vips_argument_map(VIPS_OBJECT(operation),
  ------------------
  |  |  433|  1.40M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  1.40M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.40M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  691|  1.40M|		vips_object_touch_arg, NULL, NULL);
  692|       |
  693|       |	/* And this operation.
  694|       |	 */
  695|  1.40M|	vips_operation_touch_operation(operation);
  696|  1.40M|}
cache.c:vips_object_touch_arg:
  664|  9.23M|{
  665|  9.23M|	if ((argument_class->flags & VIPS_ARGUMENT_CONSTRUCT) &&
  ------------------
  |  Branch (665:6): [True: 6.41M, False: 2.81M]
  ------------------
  666|  9.23M|		(argument_class->flags & VIPS_ARGUMENT_INPUT) &&
  ------------------
  |  Branch (666:3): [True: 4.89M, False: 1.52M]
  ------------------
  667|  9.23M|		argument_instance->assigned &&
  ------------------
  |  Branch (667:3): [True: 3.54M, False: 1.34M]
  ------------------
  668|  9.23M|		g_type_is_a(G_PARAM_SPEC_VALUE_TYPE(pspec), VIPS_TYPE_IMAGE)) {
  ------------------
  |  |  103|  3.54M|#define	G_PARAM_SPEC_VALUE_TYPE(pspec)	(G_PARAM_SPEC (pspec)->value_type)
  |  |  ------------------
  |  |  |  |   45|  3.54M|#define G_PARAM_SPEC(pspec)		(G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM, GParamSpec))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|  3.54M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|  3.54M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
              		g_type_is_a(G_PARAM_SPEC_VALUE_TYPE(pspec), VIPS_TYPE_IMAGE)) {
  ------------------
  |  |  169|  3.54M|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  ------------------
  |  Branch (668:3): [True: 1.60M, False: 1.94M]
  ------------------
  669|  1.60M|		VipsImage *image;
  670|       |
  671|  1.60M|		g_object_get(G_OBJECT(object),
  ------------------
  |  |   51|  1.60M|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|  1.60M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.60M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  672|  1.60M|			g_param_spec_get_name(pspec), &image, NULL);
  673|       |
  674|  1.60M|		(void) vips__link_map(image, TRUE,
  ------------------
  |  |  798|  1.60M|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  1.60M|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  675|  1.60M|			(VipsSListMap2Fn) vips_image_touch_cb, NULL, NULL);
  676|       |
  677|  1.60M|		VIPS_UNREF(image);
  ------------------
  |  |   57|  1.60M|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  1.60M|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  1.60M|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  1.60M|	{ \
  |  |  |  |   43|  1.60M|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 1.60M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  1.60M|			(void) F((S)); \
  |  |  |  |   45|  1.60M|			(S) = 0; \
  |  |  |  |   46|  1.60M|		} \
  |  |  |  |   47|  1.60M|	} \
  |  |  |  |   48|  1.60M|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  1.60M|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  678|  1.60M|	}
  679|       |
  680|  9.23M|	return NULL;
  681|  9.23M|}
cache.c:vips_image_touch_cb:
  648|  41.8M|{
  649|  41.8M|	VipsOperation *operation =
  650|  41.8M|		VIPS_OPERATION(g_object_get_data(G_OBJECT(image), "libvips-operation"));
  ------------------
  |  |   57|  41.8M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  41.8M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  41.8M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   58|  41.8M|		VIPS_TYPE_OPERATION, VipsOperation))
  ------------------
  651|       |
  652|  41.8M|	if (operation)
  ------------------
  |  Branch (652:6): [True: 21.3M, False: 20.4M]
  ------------------
  653|  21.3M|		vips_operation_touch_operation(operation);
  654|       |
  655|  41.8M|	return NULL;
  656|  41.8M|}
cache.c:vips_operation_touch_operation:
  636|  22.7M|{
  637|  22.7M|	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|  22.7M|	if (!entry->invalid)
  ------------------
  |  Branch (642:6): [True: 22.7M, False: 1.20k]
  ------------------
  643|  22.7M|		entry->time = vips_cache_time;
  644|  22.7M|}
cache.c:vips_object_equal_arg:
  376|  4.95M|{
  377|  4.95M|	VipsObject *other = (VipsObject *) a;
  378|       |
  379|  4.95M|	const char *name = g_param_spec_get_name(pspec);
  380|  4.95M|	GType type = G_PARAM_SPEC_VALUE_TYPE(pspec);
  ------------------
  |  |  103|  4.95M|#define	G_PARAM_SPEC_VALUE_TYPE(pspec)	(G_PARAM_SPEC (pspec)->value_type)
  |  |  ------------------
  |  |  |  |   45|  4.95M|#define G_PARAM_SPEC(pspec)		(G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM, GParamSpec))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|  4.95M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|  4.95M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  381|  4.95M|	GValue v1 = G_VALUE_INIT;
  ------------------
  |  |  191|  4.95M|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
  382|  4.95M|	GValue v2 = G_VALUE_INIT;
  ------------------
  |  |  191|  4.95M|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
  383|       |
  384|  4.95M|	gboolean equal;
  385|       |
  386|       |	/* Only test assigned input constructor args. Avoid the nohash args as
  387|       |	 * well.
  388|       |	 */
  389|  4.95M|	if (!(argument_class->flags & VIPS_ARGUMENT_CONSTRUCT) ||
  ------------------
  |  Branch (389:6): [True: 1.95M, False: 3.00M]
  ------------------
  390|  4.95M|		!(argument_class->flags & VIPS_ARGUMENT_INPUT) ||
  ------------------
  |  Branch (390:3): [True: 980k, False: 2.02M]
  ------------------
  391|  4.95M|		(argument_class->flags & VIPS_ARGUMENT_NON_HASHABLE) ||
  ------------------
  |  Branch (391:3): [True: 0, False: 2.02M]
  ------------------
  392|  4.95M|		!argument_instance->assigned)
  ------------------
  |  Branch (392:3): [True: 60.6k, False: 1.96M]
  ------------------
  393|  2.99M|		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|  1.96M|	if (!(argument_class->flags & VIPS_ARGUMENT_REQUIRED) &&
  ------------------
  |  Branch (398:6): [True: 6.86k, False: 1.95M]
  ------------------
  399|  1.96M|		!vips_object_argument_isset(other, name))
  ------------------
  |  Branch (399:3): [True: 0, False: 6.86k]
  ------------------
  400|       |		/* Optional and was not set on other ... we've found a
  401|       |		 * difference!
  402|       |		 */
  403|      0|		return (void *) name;
  404|       |
  405|  1.96M|	g_value_init(&v1, type);
  406|  1.96M|	g_value_init(&v2, type);
  407|  1.96M|	g_object_get_property(G_OBJECT(object), name, &v1);
  ------------------
  |  |   51|  1.96M|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|  1.96M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.96M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  408|  1.96M|	g_object_get_property(G_OBJECT(other), name, &v2);
  ------------------
  |  |   51|  1.96M|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|  1.96M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.96M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  409|  1.96M|	equal = vips_value_equal(pspec, &v1, &v2);
  410|  1.96M|	g_value_unset(&v1);
  411|  1.96M|	g_value_unset(&v2);
  412|       |
  413|       |	/* Stop (return non-NULL) if we've found a difference.
  414|       |	 */
  415|  1.96M|	return !equal ? (void *) name : NULL;
  ------------------
  |  Branch (415:9): [True: 919k, False: 1.04M]
  ------------------
  416|  1.96M|}
cache.c:vips_value_equal:
  231|  1.96M|{
  232|  1.96M|	GType generic = G_PARAM_SPEC_TYPE(pspec);
  ------------------
  |  |   89|  1.96M|#define G_PARAM_SPEC_TYPE(pspec)	(G_TYPE_FROM_INSTANCE (pspec))
  |  |  ------------------
  |  |  |  |  602|  1.96M|#define G_TYPE_FROM_INSTANCE(instance)                          (G_TYPE_FROM_CLASS (((GTypeInstance*) (instance))->g_class))
  |  |  |  |  ------------------
  |  |  |  |  |  |  613|  1.96M|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  233|  1.96M|	GType t1 = G_VALUE_TYPE(v1);
  ------------------
  |  |   59|  1.96M|#define	G_VALUE_TYPE(value)		(((GValue*) (value))->g_type)
  ------------------
  234|  1.96M|	GType t2 = G_VALUE_TYPE(v2);
  ------------------
  |  |   59|  1.96M|#define	G_VALUE_TYPE(value)		(((GValue*) (value))->g_type)
  ------------------
  235|       |
  236|  1.96M|	if (t1 != t2)
  ------------------
  |  Branch (236:6): [True: 0, False: 1.96M]
  ------------------
  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|  1.96M|	if (generic == G_TYPE_PARAM_BOOLEAN)
  ------------------
  |  |   85|  1.96M|#define	G_TYPE_PARAM_BOOLEAN		   (g_param_spec_types[2])
  ------------------
  |  Branch (243:6): [True: 3.43k, False: 1.95M]
  ------------------
  244|  3.43k|		return g_value_get_boolean(v1) == g_value_get_boolean(v2);
  245|  1.95M|	else if (generic == G_TYPE_PARAM_CHAR)
  ------------------
  |  |   39|  1.95M|#define	G_TYPE_PARAM_CHAR		   (g_param_spec_types[0])
  ------------------
  |  Branch (245:11): [True: 0, False: 1.95M]
  ------------------
  246|      0|		return g_value_get_schar(v1) == g_value_get_schar(v2);
  247|  1.95M|	if (generic == G_TYPE_PARAM_UCHAR)
  ------------------
  |  |   62|  1.95M|#define	G_TYPE_PARAM_UCHAR		   (g_param_spec_types[1])
  ------------------
  |  Branch (247:6): [True: 0, False: 1.95M]
  ------------------
  248|      0|		return g_value_get_uchar(v1) == g_value_get_uchar(v2);
  249|  1.95M|	if (generic == G_TYPE_PARAM_INT)
  ------------------
  |  |  108|  1.95M|#define	G_TYPE_PARAM_INT		   (g_param_spec_types[3])
  ------------------
  |  Branch (249:6): [True: 969k, False: 987k]
  ------------------
  250|   969k|		return g_value_get_int(v1) == g_value_get_int(v2);
  251|   987k|	if (generic == G_TYPE_PARAM_UINT)
  ------------------
  |  |  131|   987k|#define	G_TYPE_PARAM_UINT		   (g_param_spec_types[4])
  ------------------
  |  Branch (251:6): [True: 0, False: 987k]
  ------------------
  252|      0|		return g_value_get_uint(v1) == g_value_get_uint(v2);
  253|   987k|	if (generic == G_TYPE_PARAM_LONG)
  ------------------
  |  |  154|   987k|#define	G_TYPE_PARAM_LONG		   (g_param_spec_types[5])
  ------------------
  |  Branch (253:6): [True: 0, False: 987k]
  ------------------
  254|      0|		return g_value_get_long(v1) == g_value_get_long(v2);
  255|   987k|	if (generic == G_TYPE_PARAM_ULONG)
  ------------------
  |  |  177|   987k|#define	G_TYPE_PARAM_ULONG		   (g_param_spec_types[6])
  ------------------
  |  Branch (255:6): [True: 0, False: 987k]
  ------------------
  256|      0|		return g_value_get_ulong(v1) == g_value_get_ulong(v2);
  257|   987k|	if (generic == G_TYPE_PARAM_ENUM)
  ------------------
  |  |  269|   987k|#define	G_TYPE_PARAM_ENUM		   (g_param_spec_types[10])
  ------------------
  |  Branch (257:6): [True: 22.5k, False: 964k]
  ------------------
  258|  22.5k|		return g_value_get_enum(v1) == g_value_get_enum(v2);
  259|   964k|	if (generic == G_TYPE_PARAM_FLAGS)
  ------------------
  |  |  292|   964k|#define	G_TYPE_PARAM_FLAGS		   (g_param_spec_types[11])
  ------------------
  |  Branch (259:6): [True: 0, False: 964k]
  ------------------
  260|      0|		return g_value_get_flags(v1) == g_value_get_flags(v2);
  261|   964k|	if (generic == G_TYPE_PARAM_UINT64)
  ------------------
  |  |  223|   964k|#define	G_TYPE_PARAM_UINT64		   (g_param_spec_types[8])
  ------------------
  |  Branch (261:6): [True: 0, False: 964k]
  ------------------
  262|      0|		return g_value_get_uint64(v1) == g_value_get_uint64(v2);
  263|   964k|	if (generic == G_TYPE_PARAM_INT64)
  ------------------
  |  |  200|   964k|#define	G_TYPE_PARAM_INT64		   (g_param_spec_types[7])
  ------------------
  |  Branch (263:6): [True: 0, False: 964k]
  ------------------
  264|      0|		return g_value_get_int64(v1) == g_value_get_int64(v2);
  265|   964k|	if (generic == G_TYPE_PARAM_FLOAT)
  ------------------
  |  |  315|   964k|#define	G_TYPE_PARAM_FLOAT		   (g_param_spec_types[12])
  ------------------
  |  Branch (265:6): [True: 0, False: 964k]
  ------------------
  266|      0|		return g_value_get_float(v1) == g_value_get_float(v2);
  267|   964k|	if (generic == G_TYPE_PARAM_DOUBLE)
  ------------------
  |  |  338|   964k|#define	G_TYPE_PARAM_DOUBLE		   (g_param_spec_types[13])
  ------------------
  |  Branch (267:6): [True: 13.7k, False: 950k]
  ------------------
  268|  13.7k|		return g_value_get_double(v1) == g_value_get_double(v2);
  269|   950k|	if (generic == G_TYPE_PARAM_STRING) {
  ------------------
  |  |  361|   950k|#define	G_TYPE_PARAM_STRING		   (g_param_spec_types[14])
  ------------------
  |  Branch (269:6): [True: 116, False: 950k]
  ------------------
  270|    116|		const char *s1 = g_value_get_string(v1);
  271|    116|		const char *s2 = g_value_get_string(v2);
  272|       |
  273|    116|		if (s1 == s2)
  ------------------
  |  Branch (273:7): [True: 0, False: 116]
  ------------------
  274|      0|			return TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  275|    116|		else
  276|    116|			return s1 && s2 && strcmp(s1, s2) == 0;
  ------------------
  |  Branch (276:11): [True: 116, False: 0]
  |  Branch (276:17): [True: 116, False: 0]
  |  Branch (276:23): [True: 116, False: 0]
  ------------------
  277|    116|	}
  278|   950k|	if (generic == G_TYPE_PARAM_BOXED)
  ------------------
  |  |  407|   950k|#define	G_TYPE_PARAM_BOXED		   (g_param_spec_types[16])
  ------------------
  |  Branch (278:6): [True: 0, False: 950k]
  ------------------
  279|      0|		return g_value_get_boxed(v1) == g_value_get_boxed(v2);
  280|   950k|	if (generic == G_TYPE_PARAM_POINTER)
  ------------------
  |  |  430|   950k|#define	G_TYPE_PARAM_POINTER		   (g_param_spec_types[17])
  ------------------
  |  Branch (280:6): [True: 0, False: 950k]
  ------------------
  281|      0|		return g_value_get_pointer(v1) == g_value_get_pointer(v2);
  282|   950k|	if (generic == G_TYPE_PARAM_OBJECT)
  ------------------
  |  |  482|   950k|#define	G_TYPE_PARAM_OBJECT		   (g_param_spec_types[19])
  ------------------
  |  Branch (282:6): [True: 950k, False: 0]
  ------------------
  283|   950k|		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|   950k|}
cache.c:vips_cache_insert:
  730|  1.34M|{
  731|  1.34M|	VipsOperationCacheEntry *entry = g_new(VipsOperationCacheEntry, 1);
  ------------------
  |  |  282|  1.34M|#define g_new(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc)
  |  |  ------------------
  |  |  |  |  227|  1.34M|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|  1.34M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|  1.34M|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|  1.34M|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|  1.34M|	  gpointer __p;						\
  |  |  |  |  231|  1.34M|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 1.34M]
  |  |  |  |  ------------------
  |  |  |  |  232|  1.34M|	    __p = g_##func (__n);				\
  |  |  |  |  233|  1.34M|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 1.34M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|  1.34M|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 1.34M]
  |  |  |  |  |  Branch (234:26): [True: 1.34M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|  1.34M|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|  1.34M|	  else							\
  |  |  |  |  237|  1.34M|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|  1.34M|	  __p;							\
  |  |  |  |  239|  1.34M|	}))
  |  |  ------------------
  ------------------
  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|  1.34M|	entry->operation = operation;
  739|  1.34M|	entry->time = 0;
  740|  1.34M|	entry->invalidate_id = 0;
  741|  1.34M|	entry->invalid = FALSE;
  ------------------
  |  |  794|  1.34M|#define	FALSE	(0)
  ------------------
  742|       |
  743|  1.34M|	g_hash_table_insert(vips_cache_table, operation, entry);
  744|  1.34M|	vips_cache_ref(operation);
  745|       |
  746|       |	/* If the operation signals "invalidate", we must tag this cache entry
  747|       |	 * for removal.
  748|       |	 */
  749|  1.34M|	entry->invalidate_id = g_signal_connect(operation, "invalidate",
  ------------------
  |  |  491|  1.34M|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  750|  1.34M|		G_CALLBACK(vips_cache_invalidate_cb), entry);
  751|  1.34M|}
cache.c:vips_cache_invalidate_cb:
  719|  22.3k|{
  720|       |#ifdef DEBUG
  721|       |	printf("vips_cache_invalidate_cb: ");
  722|       |	vips_object_print_summary(VIPS_OBJECT(operation));
  723|       |#endif /*DEBUG*/
  724|       |
  725|  22.3k|	entry->invalid = TRUE;
  ------------------
  |  |  798|  22.3k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  22.3k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  726|  22.3k|}
cache.c:vips_cache_trim:
  840|  2.45M|{
  841|  2.45M|	VipsOperation *operation;
  842|       |
  843|  2.45M|	g_mutex_lock(&vips_cache_lock);
  844|       |
  845|  3.79M|	while (vips_cache_table &&
  ------------------
  |  Branch (845:9): [True: 3.79M, False: 0]
  ------------------
  846|  3.79M|		(g_hash_table_size(vips_cache_table) > vips_cache_max ||
  ------------------
  |  Branch (846:4): [True: 1.34M, False: 2.45M]
  ------------------
  847|  3.79M|			vips_tracked_get_files() > vips_cache_max_files ||
  ------------------
  |  Branch (847:4): [True: 0, False: 2.45M]
  ------------------
  848|  3.79M|			vips_tracked_get_mem() > vips_cache_max_mem) &&
  ------------------
  |  Branch (848:4): [True: 2.93k, False: 2.45M]
  ------------------
  849|  3.79M|		(operation = vips_cache_get_lru())) {
  ------------------
  |  Branch (849:3): [True: 1.34M, False: 33]
  ------------------
  850|       |#ifdef DEBUG
  851|       |		printf("vips_cache_trim: trimming ");
  852|       |		vips_object_print_summary(VIPS_OBJECT(operation));
  853|       |#endif /*DEBUG*/
  854|       |
  855|  1.34M|		vips_cache_remove(operation);
  856|  1.34M|	}
  857|       |
  858|  2.45M|	g_mutex_unlock(&vips_cache_lock);
  859|  2.45M|}
cache.c:vips_cache_get_lru:
  823|  1.34M|{
  824|  1.34M|	VipsOperationCacheEntry *entry;
  825|       |
  826|  1.34M|	entry = NULL;
  827|  1.34M|	g_hash_table_foreach(vips_cache_table,
  828|  1.34M|		(GHFunc) vips_cache_get_lru_cb, &entry);
  829|       |
  830|  1.34M|	if (entry)
  ------------------
  |  Branch (830:6): [True: 1.34M, False: 33]
  ------------------
  831|  1.34M|		return entry->operation;
  832|       |
  833|     33|	return NULL;
  834|  1.34M|}
cache.c:vips_cache_get_lru_cb:
  811|   135M|{
  812|   135M|	if (!*best ||
  ------------------
  |  Branch (812:6): [True: 1.34M, False: 134M]
  ------------------
  813|   135M|		(*best)->time > value->time)
  ------------------
  |  Branch (813:3): [True: 3.95M, False: 130M]
  ------------------
  814|  5.29M|		*best = value;
  815|   135M|}

vips_connection_filename:
  156|  39.5k|{
  157|  39.5k|	return connection->filename;
  158|  39.5k|}
vips_connection_nick:
  169|  2.56M|{
  170|  2.56M|	return connection->filename ? connection->filename
  ------------------
  |  Branch (170:9): [True: 0, False: 2.56M]
  ------------------
  171|  2.56M|								: VIPS_OBJECT(connection)->nickname;
  ------------------
  |  |  433|  2.56M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  2.56M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  2.56M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  172|  2.56M|}
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|   173k|{
   89|   173k|	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|   173k|	if (connection->tracked_descriptor >= 0) {
  ------------------
  |  Branch (97:6): [True: 0, False: 173k]
  ------------------
   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|   173k|	if (connection->close_descriptor >= 0) {
  ------------------
  |  Branch (104:6): [True: 0, False: 173k]
  ------------------
  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|   173k|	VIPS_FREE(connection->filename);
  ------------------
  |  |   50|   173k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|   173k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   173k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|   173k|	{ \
  |  |  |  |   43|   173k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 0, False: 173k]
  |  |  |  |  ------------------
  |  |  |  |   44|      0|			(void) F((S)); \
  |  |  |  |   45|      0|			(S) = 0; \
  |  |  |  |   46|      0|		} \
  |  |  |  |   47|   173k|	} \
  |  |  |  |   48|   173k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   173k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  112|       |
  113|   173k|	G_OBJECT_CLASS(vips_connection_parent_class)->finalize(gobject);
  ------------------
  |  |   58|   173k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|   173k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   173k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  114|   173k|}
connection.c:vips_connection_init:
  142|   173k|{
  143|   173k|	connection->descriptor = -1;
  144|   173k|	connection->tracked_descriptor = -1;
  145|   173k|	connection->close_descriptor = -1;
  146|   173k|}

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

vips_error_buffer:
  179|  9.68k|{
  180|  9.68k|	const char *msg;
  181|       |
  182|  9.68k|	g_mutex_lock(&vips__global_lock);
  183|  9.68k|	msg = vips_buf_all(&vips_error_buf);
  184|  9.68k|	g_mutex_unlock(&vips__global_lock);
  185|       |
  186|  9.68k|	return msg;
  187|  9.68k|}
vips_verror:
  230|  2.35M|{
  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|  2.35M|	g_mutex_lock(&vips__global_lock);
  246|  2.35M|	g_assert(vips_error_freeze_count >= 0);
  ------------------
  |  |  166|  2.35M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.35M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.35M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  247|  2.35M|	if (!vips_error_freeze_count) {
  ------------------
  |  Branch (247:6): [True: 2.35M, False: 0]
  ------------------
  248|  2.35M|		if (domain)
  ------------------
  |  Branch (248:7): [True: 2.35M, False: 0]
  ------------------
  249|  2.35M|			vips_buf_appendf(&vips_error_buf, "%s: ", domain);
  250|  2.35M|		vips_buf_vappendf(&vips_error_buf, fmt, ap);
  251|  2.35M|		vips_buf_appends(&vips_error_buf, "\n");
  252|  2.35M|	}
  253|  2.35M|	g_mutex_unlock(&vips__global_lock);
  254|       |
  255|  2.35M|	if (vips__fatal)
  ------------------
  |  Branch (255:6): [True: 0, False: 2.35M]
  ------------------
  256|      0|		vips_error_exit("vips__fatal");
  257|  2.35M|}
vips_error:
  271|   165k|{
  272|   165k|	va_list ap;
  273|       |
  274|   165k|	va_start(ap, fmt);
  275|   165k|	vips_verror(domain, fmt, ap);
  276|   165k|	va_end(ap);
  277|   165k|}
vips_error_clear:
  381|  12.6k|{
  382|  12.6k|	g_mutex_lock(&vips__global_lock);
  383|  12.6k|	vips_buf_rewind(&vips_error_buf);
  384|  12.6k|	g_mutex_unlock(&vips__global_lock);
  385|  12.6k|}
vips_check_coding_known:
  493|  10.2k|{
  494|       |	/* These all have codings that extract/ifthenelse/etc can ignore.
  495|       |	 */
  496|  10.2k|	if (im->Coding != VIPS_CODING_NONE &&
  ------------------
  |  Branch (496:6): [True: 35, False: 10.2k]
  ------------------
  497|  10.2k|		im->Coding != VIPS_CODING_LABQ &&
  ------------------
  |  Branch (497:3): [True: 10, False: 25]
  ------------------
  498|  10.2k|		im->Coding != VIPS_CODING_RAD) {
  ------------------
  |  Branch (498:3): [True: 0, False: 10]
  ------------------
  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|  10.2k|	return 0;
  504|  10.2k|}
vips_check_coding:
  522|  1.24k|{
  523|  1.24k|	if (im->Coding != coding) {
  ------------------
  |  Branch (523:6): [True: 0, False: 1.24k]
  ------------------
  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|  1.24k|	return 0;
  530|  1.24k|}
vips_check_bands_atleast:
  622|  55.5k|{
  623|  55.5k|	if (im->Bands < bands) {
  ------------------
  |  Branch (623:6): [True: 0, False: 55.5k]
  ------------------
  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|  55.5k|	return 0;
  630|  55.5k|}
vips_check_noncomplex:
  702|  45.0k|{
  703|  45.0k|	if (vips_band_format_iscomplex(im->BandFmt)) {
  ------------------
  |  Branch (703:6): [True: 0, False: 45.0k]
  ------------------
  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|  45.0k|	return 0;
  709|  45.0k|}
vips_check_vector:
 1142|   209k|{
 1143|       |	/* Here it's clearer to list the cases that are OK.
 1144|       |	 */
 1145|   209k|	if (n == im->Bands)
  ------------------
  |  Branch (1145:6): [True: 209k, False: 34]
  ------------------
 1146|   209k|		return 0;
 1147|     34|	if (n == 1)
  ------------------
  |  Branch (1147:6): [True: 34, False: 0]
  ------------------
 1148|     34|		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_check_matrix:
 1217|   190k|{
 1218|   190k|	VipsImage *t;
 1219|       |
 1220|   190k|	*out = NULL;
 1221|       |
 1222|   190k|	if (im->Xsize > 100000 ||
  ------------------
  |  Branch (1222:6): [True: 0, False: 190k]
  ------------------
 1223|   190k|		im->Ysize > 100000) {
  ------------------
  |  Branch (1223:3): [True: 0, False: 190k]
  ------------------
 1224|      0|		vips_error(domain, "%s", _("matrix image too large"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1225|      0|		return -1;
 1226|      0|	}
 1227|   190k|	if (im->Bands != 1) {
  ------------------
  |  Branch (1227:6): [True: 0, False: 190k]
  ------------------
 1228|      0|		vips_error(domain,
 1229|      0|			"%s", _("matrix image must have one band"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1230|      0|		return -1;
 1231|      0|	}
 1232|       |
 1233|   190k|	if (vips_cast(im, &t, VIPS_FORMAT_DOUBLE, NULL))
  ------------------
  |  Branch (1233:6): [True: 0, False: 190k]
  ------------------
 1234|      0|		return -1;
 1235|   190k|	if (!(*out = vips_image_copy_memory(t))) {
  ------------------
  |  Branch (1235:6): [True: 0, False: 190k]
  ------------------
 1236|      0|		VIPS_UNREF(t);
  ------------------
  |  |   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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1237|      0|		return -1;
 1238|      0|	}
 1239|   190k|	VIPS_UNREF(t);
  ------------------
  |  |   57|   190k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|   190k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   190k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|   190k|	{ \
  |  |  |  |   43|   190k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 190k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|   190k|			(void) F((S)); \
  |  |  |  |   45|   190k|			(S) = 0; \
  |  |  |  |   46|   190k|		} \
  |  |  |  |   47|   190k|	} \
  |  |  |  |   48|   190k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   190k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1240|       |
 1241|   190k|	return 0;
 1242|   190k|}
vips_check_separable:
 1259|  19.0k|{
 1260|  19.0k|	if (im->Xsize != 1 &&
  ------------------
  |  Branch (1260:6): [True: 19.0k, False: 0]
  ------------------
 1261|  19.0k|		im->Ysize != 1) {
  ------------------
  |  Branch (1261:3): [True: 0, False: 19.0k]
  ------------------
 1262|      0|		vips_error(domain,
 1263|      0|			"%s", _("separable matrix images must have width or height 1"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1264|      0|		return -1;
 1265|      0|	}
 1266|       |
 1267|  19.0k|	return 0;
 1268|  19.0k|}

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|   233k|{
  260|   233k|	VipsThreadProfile *profile;
  261|       |
  262|   233k|	VIPS_DEBUG_MSG("vips__thread_profile_detach:\n");
  ------------------
  |  |   47|   233k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   233k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   233k|	{ \
  |  |   49|   233k|		; \
  |  |   50|   233k|	} \
  |  |   51|   233k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   233k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  263|       |
  264|   233k|	if ((profile = vips_thread_profile_get())) {
  ------------------
  |  Branch (264:6): [True: 0, False: 233k]
  ------------------
  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|   233k|}
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|   233k|{
  249|   233k|	return g_private_get(&vips_thread_profile_key);
  250|   233k|}

vips__link_break_all:
  183|  2.95M|{
  184|  2.95M|	g_mutex_lock(&vips__global_lock);
  185|       |
  186|  2.95M|	vips_slist_map2(image->upstream,
  187|  2.95M|		(VipsSListMap2Fn) vips__link_break, image, NULL);
  188|  2.95M|	vips_slist_map2(image->downstream,
  189|  2.95M|		(VipsSListMap2Fn) vips__link_break_rev, image, NULL);
  190|       |
  191|  2.95M|	g_assert(!image->upstream);
  ------------------
  |  |  166|  2.95M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.95M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.95M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  192|  2.95M|	g_assert(!image->downstream);
  ------------------
  |  |  166|  2.95M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.95M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.95M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  193|       |
  194|  2.95M|	g_mutex_unlock(&vips__global_lock);
  195|  2.95M|}
vips__link_map:
  239|  2.07M|{
  240|  2.07M|	static int serial = 0;
  241|       |
  242|  2.07M|	LinkMap map;
  243|  2.07M|	GSList *images;
  244|  2.07M|	GSList *p;
  245|  2.07M|	void *result;
  246|       |
  247|  2.07M|	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|  2.07M|	map.upstream = upstream;
  256|  2.07M|	map.fn = (VipsSListMap2Fn) vips__link_map_cb;
  257|  2.07M|	map.a = (void *) &images;
  258|  2.07M|	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|  2.07M|	g_mutex_lock(&vips__global_lock);
  265|       |
  266|  2.07M|	serial += 1;
  267|  2.07M|	map.serial = serial;
  268|       |
  269|  2.07M|	vips__link_mapp(image, &map, NULL);
  270|       |
  271|  49.5M|	for (p = images; p; p = p->next)
  ------------------
  |  Branch (271:19): [True: 47.5M, False: 2.07M]
  ------------------
  272|  47.5M|		g_object_ref(p->data);
  273|       |
  274|  2.07M|	g_mutex_unlock(&vips__global_lock);
  275|       |
  276|  2.07M|	result = vips_slist_map2(images, fn, a, b);
  277|       |
  278|  49.5M|	for (p = images; p; p = p->next)
  ------------------
  |  Branch (278:19): [True: 47.5M, False: 2.07M]
  ------------------
  279|  47.5M|		g_object_unref(p->data);
  280|  2.07M|	g_slist_free(images);
  281|       |
  282|  2.07M|	return result;
  283|  2.07M|}
vips__demand_hint_array:
  291|  2.67M|{
  292|  2.67M|	VipsDemandStyle hint = (VipsDemandStyle) int_hint;
  293|       |
  294|  2.67M|	int i, len, nany;
  295|  2.67M|	VipsDemandStyle set_hint;
  296|       |
  297|       |	/* How many input images are there? And how many are ANY?
  298|       |	 */
  299|  5.64M|	for (i = 0, len = 0, nany = 0; in[i]; i++, len++)
  ------------------
  |  Branch (299:33): [True: 2.96M, False: 2.67M]
  ------------------
  300|  2.96M|		if (in[i]->dhint == VIPS_DEMAND_STYLE_ANY)
  ------------------
  |  Branch (300:7): [True: 57.2k, False: 2.91M]
  ------------------
  301|  57.2k|			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|  2.67M|	set_hint = hint;
  312|  5.64M|	for (i = 0; i < len; i++)
  ------------------
  |  Branch (312:14): [True: 2.96M, False: 2.67M]
  ------------------
  313|  2.96M|		set_hint = (VipsDemandStyle) VIPS_MIN(
  ------------------
  |  |   55|  2.96M|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 214k, False: 2.75M]
  |  |  ------------------
  ------------------
  314|  2.67M|			(int) set_hint, (int) in[i]->dhint);
  315|       |
  316|  2.67M|	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|  2.67M|	g_mutex_lock(&vips__global_lock);
  334|  5.64M|	for (i = 0; i < len; i++)
  ------------------
  |  Branch (334:14): [True: 2.96M, False: 2.67M]
  ------------------
  335|  2.96M|		vips__link_make(in[i], image);
  336|  2.67M|	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|  2.67M|	image->hint_set = TRUE;
  ------------------
  |  |  798|  2.67M|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  2.67M|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  342|  2.67M|}
vips_image_pipeline_array:
  379|  2.67M|{
  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|  2.67M|	vips__demand_hint_array(image, hint, in);
  389|       |
  390|  2.67M|	if (in[0] &&
  ------------------
  |  Branch (390:6): [True: 2.59M, False: 80.2k]
  ------------------
  391|  2.67M|		vips__image_copy_fields_array(image, in))
  ------------------
  |  Branch (391:3): [True: 0, False: 2.59M]
  ------------------
  392|      0|		return -1;
  393|       |
  394|  2.67M|	if (vips__reorder_set_input(image, in))
  ------------------
  |  Branch (394:6): [True: 0, False: 2.67M]
  ------------------
  395|      0|		return -1;
  396|       |
  397|  2.67M|	return 0;
  398|  2.67M|}
vips_image_pipelinev:
  412|  2.10M|{
  413|  2.10M|	va_list ap;
  414|  2.10M|	int i;
  415|  2.10M|	VipsImage *ar[MAX_IMAGES];
  416|       |
  417|  2.10M|	va_start(ap, hint);
  418|  4.12M|	for (i = 0; i < MAX_IMAGES &&
  ------------------
  |  |  128|  8.25M|#define MAX_IMAGES (1000)
  ------------------
  |  Branch (418:14): [True: 4.12M, False: 0]
  ------------------
  419|  4.12M|		 (ar[i] = va_arg(ap, VipsImage *));
  ------------------
  |  Branch (419:4): [True: 2.02M, False: 2.10M]
  ------------------
  420|  2.10M|		 i++)
  421|  2.02M|		;
  422|  2.10M|	va_end(ap);
  423|  2.10M|	if (i == MAX_IMAGES) {
  ------------------
  |  |  128|  2.10M|#define MAX_IMAGES (1000)
  ------------------
  |  Branch (423:6): [True: 0, False: 2.10M]
  ------------------
  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|  2.10M|	return vips_image_pipeline_array(image, hint, ar);
  432|  2.10M|}
vips_start_one:
  446|  1.43M|{
  447|  1.43M|	VipsImage *in = (VipsImage *) a;
  448|       |
  449|  1.43M|	return vips_region_new(in);
  450|  1.43M|}
vips_stop_one:
  464|  1.44M|{
  465|  1.44M|	VipsRegion *reg = (VipsRegion *) seq;
  466|       |
  467|  1.44M|	g_object_unref(reg);
  468|       |
  469|  1.44M|	return 0;
  470|  1.44M|}
vips_stop_many:
  485|  23.1k|{
  486|  23.1k|	VipsRegion **ar = (VipsRegion **) seq;
  487|       |
  488|  23.1k|	if (ar) {
  ------------------
  |  Branch (488:6): [True: 23.1k, False: 0]
  ------------------
  489|  23.1k|		int i;
  490|       |
  491|  77.8k|		for (i = 0; ar[i]; i++)
  ------------------
  |  Branch (491:15): [True: 54.6k, False: 23.1k]
  ------------------
  492|  54.6k|			g_object_unref(ar[i]);
  493|  23.1k|		g_free((char *) ar);
  494|  23.1k|	}
  495|       |
  496|  23.1k|	return 0;
  497|  23.1k|}
vips_start_many:
  512|  23.1k|{
  513|  23.1k|	VipsImage **in = (VipsImage **) a;
  514|       |
  515|  23.1k|	int i, n;
  516|  23.1k|	VipsRegion **ar;
  517|       |
  518|       |	/* How many images?
  519|       |	 */
  520|  77.8k|	for (n = 0; in[n]; n++)
  ------------------
  |  Branch (520:14): [True: 54.6k, False: 23.1k]
  ------------------
  521|  54.6k|		;
  522|       |
  523|       |	/* Allocate space for region array.
  524|       |	 */
  525|  23.1k|	if (!(ar = VIPS_ARRAY(NULL, n + 1, VipsRegion *)))
  ------------------
  |  |   72|  23.1k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  23.1k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  23.1k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  23.1k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  23.1k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (525:6): [True: 0, False: 23.1k]
  ------------------
  526|      0|		return NULL;
  527|       |
  528|       |	/* Create a set of regions.
  529|       |	 */
  530|  77.8k|	for (i = 0; i < n; i++)
  ------------------
  |  Branch (530:14): [True: 54.6k, False: 23.1k]
  ------------------
  531|  54.6k|		if (!(ar[i] = vips_region_new(in[i]))) {
  ------------------
  |  Branch (531:7): [True: 0, False: 54.6k]
  ------------------
  532|      0|			vips_stop_many(ar, NULL, NULL);
  533|      0|			return NULL;
  534|      0|		}
  535|  23.1k|	ar[n] = NULL;
  536|       |
  537|  23.1k|	return ar;
  538|  23.1k|}
vips_image_generate:
  686|  2.62M|{
  687|  2.62M|	int res;
  688|       |
  689|  2.62M|	VIPS_DEBUG_MSG("vips_image_generate: %p\n", image);
  ------------------
  |  |   47|  2.62M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.62M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  2.62M|	{ \
  |  |   49|  2.62M|		; \
  |  |   50|  2.62M|	} \
  |  |   51|  2.62M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.62M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  690|       |
  691|  2.62M|	g_assert(generate_fn);
  ------------------
  |  |  166|  2.62M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.62M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.62M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  692|  2.62M|	g_assert(vips_object_sanity(VIPS_OBJECT(image)));
  ------------------
  |  |  166|  2.62M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.62M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.62M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  693|       |
  694|  2.62M|	if (!image->hint_set) {
  ------------------
  |  Branch (694:6): [True: 0, False: 2.62M]
  ------------------
  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|  2.62M|	image->Bbits = vips_format_sizeof(image->BandFmt) << 3;
  704|       |
  705|       |	/* Look at output type to decide our action.
  706|       |	 */
  707|  2.62M|	switch (image->dtype) {
  708|  2.41M|	case VIPS_IMAGE_PARTIAL:
  ------------------
  |  Branch (708:2): [True: 2.41M, False: 206k]
  ------------------
  709|       |		/* Output to partial image. Just attach functions and return.
  710|       |		 */
  711|  2.41M|		if (image->generate_fn ||
  ------------------
  |  Branch (711:7): [True: 0, False: 2.41M]
  ------------------
  712|  2.41M|			image->start_fn ||
  ------------------
  |  Branch (712:4): [True: 0, False: 2.41M]
  ------------------
  713|  2.41M|			image->stop_fn) {
  ------------------
  |  Branch (713:4): [True: 0, False: 2.41M]
  ------------------
  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|  2.41M|		image->start_fn = start_fn;
  720|  2.41M|		image->generate_fn = generate_fn;
  721|  2.41M|		image->stop_fn = stop_fn;
  722|  2.41M|		image->client1 = a;
  723|  2.41M|		image->client2 = b;
  724|       |
  725|  2.41M|		VIPS_DEBUG_MSG("vips_image_generate: "
  ------------------
  |  |   47|  2.41M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.41M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  2.41M|	{ \
  |  |   49|  2.41M|		; \
  |  |   50|  2.41M|	} \
  |  |   51|  2.41M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.41M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  726|  2.41M|					   "attaching partial callbacks\n");
  727|       |
  728|  2.41M|		if (vips_image_written(image))
  ------------------
  |  Branch (728:7): [True: 0, False: 2.41M]
  ------------------
  729|      0|			return -1;
  730|       |
  731|  2.41M|		break;
  732|       |
  733|  2.41M|	case VIPS_IMAGE_SETBUF:
  ------------------
  |  Branch (733:2): [True: 206k, False: 2.41M]
  ------------------
  734|   206k|	case VIPS_IMAGE_SETBUF_FOREIGN:
  ------------------
  |  Branch (734:2): [True: 0, False: 2.62M]
  ------------------
  735|   206k|	case VIPS_IMAGE_MMAPINRW:
  ------------------
  |  Branch (735:2): [True: 0, False: 2.62M]
  ------------------
  736|   206k|	case VIPS_IMAGE_OPENOUT:
  ------------------
  |  Branch (736:2): [True: 0, False: 2.62M]
  ------------------
  737|       |		/* Eval now .. sanity check.
  738|       |		 */
  739|   206k|		if (image->generate_fn ||
  ------------------
  |  Branch (739:7): [True: 0, False: 206k]
  ------------------
  740|   206k|			image->start_fn ||
  ------------------
  |  Branch (740:4): [True: 0, False: 206k]
  ------------------
  741|   206k|			image->stop_fn) {
  ------------------
  |  Branch (741:4): [True: 0, False: 206k]
  ------------------
  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|   206k|		image->start_fn = start_fn;
  750|   206k|		image->generate_fn = generate_fn;
  751|   206k|		image->stop_fn = stop_fn;
  752|   206k|		image->client1 = a;
  753|   206k|		image->client2 = b;
  754|       |
  755|   206k|		if (vips_image_write_prepare(image))
  ------------------
  |  Branch (755:7): [True: 0, False: 206k]
  ------------------
  756|      0|			return -1;
  757|       |
  758|   206k|		if (image->dtype == VIPS_IMAGE_OPENOUT)
  ------------------
  |  Branch (758:7): [True: 0, False: 206k]
  ------------------
  759|      0|			res = vips_sink_disc(image, write_vips, NULL);
  760|   206k|		else
  761|   206k|			res = vips_sink_memory(image);
  762|       |
  763|       |		/* Error?
  764|       |		 */
  765|   206k|		if (res)
  ------------------
  |  Branch (765:7): [True: 9.17k, False: 197k]
  ------------------
  766|  9.17k|			return -1;
  767|       |
  768|       |		/* Must come before we rewind.
  769|       |		 */
  770|   197k|		if (vips_image_written(image))
  ------------------
  |  Branch (770:7): [True: 0, False: 197k]
  ------------------
  771|      0|			return -1;
  772|       |
  773|       |		/* We've written to image ... rewind it ready for reading.
  774|       |		 */
  775|   197k|		if (vips_image_pio_input(image))
  ------------------
  |  Branch (775:7): [True: 0, False: 197k]
  ------------------
  776|      0|			return -1;
  777|       |
  778|   197k|		break;
  779|       |
  780|   197k|	default:
  ------------------
  |  Branch (780:2): [True: 0, False: 2.62M]
  ------------------
  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|  2.62M|	}
  789|       |
  790|  2.61M|	return 0;
  791|  2.62M|}
generate.c:vips__link_break:
  152|  2.96M|{
  153|  2.96M|	g_assert(image_up);
  ------------------
  |  |  166|  2.96M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.96M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.96M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  154|  2.96M|	g_assert(image_down);
  ------------------
  |  |  166|  2.96M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.96M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.96M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  155|       |
  156|  2.96M|	g_assert(g_slist_find(image_up->downstream, image_down));
  ------------------
  |  |  166|  2.96M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.96M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.96M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  157|  2.96M|	g_assert(g_slist_find(image_down->upstream, image_up));
  ------------------
  |  |  166|  2.96M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.96M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.96M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  158|       |
  159|  2.96M|	image_up->downstream =
  160|  2.96M|		g_slist_remove(image_up->downstream, image_down);
  161|  2.96M|	image_down->upstream =
  162|  2.96M|		g_slist_remove(image_down->upstream, image_up);
  163|       |
  164|       |	/* Unlink the progress chain.
  165|       |	 */
  166|  2.96M|	if (image_down->progress_signal &&
  ------------------
  |  Branch (166:6): [True: 56.5k, False: 2.91M]
  ------------------
  167|  2.96M|		image_down->progress_signal == image_up->progress_signal)
  ------------------
  |  Branch (167:3): [True: 33.2k, False: 23.2k]
  ------------------
  168|  33.2k|		image_down->progress_signal = NULL;
  169|       |
  170|  2.96M|	return NULL;
  171|  2.96M|}
generate.c:vips__link_break_rev:
  175|  1.91M|{
  176|  1.91M|	return vips__link_break(image_up, image_down, b);
  177|  1.91M|}
generate.c:vips__link_map_cb:
  227|  47.5M|{
  228|  47.5M|	*images = g_slist_prepend(*images, image);
  229|       |
  230|  47.5M|	return NULL;
  231|  47.5M|}
generate.c:vips__link_mapp:
  207|  54.1M|{
  208|  54.1M|	void *res;
  209|       |
  210|       |	/* Loop?
  211|       |	 */
  212|  54.1M|	if (image->serial == map->serial)
  ------------------
  |  Branch (212:6): [True: 6.65M, False: 47.5M]
  ------------------
  213|  6.65M|		return NULL;
  214|  47.5M|	image->serial = map->serial;
  215|       |
  216|  47.5M|	if ((res = map->fn(image, map->a, map->b)))
  ------------------
  |  Branch (216:6): [True: 0, False: 47.5M]
  ------------------
  217|      0|		return res;
  218|       |
  219|  47.5M|	return vips_slist_map2(map->upstream
  ------------------
  |  Branch (219:25): [True: 47.5M, False: 0]
  ------------------
  220|  47.5M|			? image->upstream
  221|  47.5M|			: image->downstream,
  222|  47.5M|		(VipsSListMap2Fn) vips__link_mapp, map, NULL);
  223|  47.5M|}
generate.c:vips__link_make:
  134|  2.96M|{
  135|  2.96M|	g_assert(image_up);
  ------------------
  |  |  166|  2.96M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.96M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.96M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  136|  2.96M|	g_assert(image_down);
  ------------------
  |  |  166|  2.96M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.96M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.96M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  137|       |
  138|  2.96M|	image_up->downstream =
  139|  2.96M|		g_slist_prepend(image_up->downstream, image_down);
  140|  2.96M|	image_down->upstream =
  141|  2.96M|		g_slist_prepend(image_down->upstream, image_up);
  142|       |
  143|       |	/* Propagate the progress indicator.
  144|       |	 */
  145|  2.96M|	if (image_up->progress_signal &&
  ------------------
  |  Branch (145:6): [True: 39.3k, False: 2.92M]
  ------------------
  146|  2.96M|		!image_down->progress_signal)
  ------------------
  |  Branch (146:3): [True: 39.3k, False: 0]
  ------------------
  147|  39.3k|		image_down->progress_signal = image_up->progress_signal;
  148|  2.96M|}

vips_format_sizeof:
  212|  2.95M|{
  213|  2.95M|	format = VIPS_CLIP(0, format, VIPS_FORMAT_DPCOMPLEX);
  ------------------
  |  |   57|  2.95M|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|  5.90M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 0, False: 2.95M]
  |  |  |  |  |  Branch (54:32): [True: 0, False: 2.95M]
  |  |  |  |  |  Branch (54:44): [True: 0, False: 2.95M]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  214|       |
  215|  2.95M|	return vips__image_sizeof_bandformat[format];
  216|  2.95M|}
vips_format_sizeof_unsafe:
  229|  38.4M|{
  230|  38.4M|	g_assert(0 <= format && format <= VIPS_FORMAT_DPCOMPLEX);
  ------------------
  |  |  166|  38.4M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  38.4M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  38.4M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  231|       |
  232|  38.4M|	return vips__image_sizeof_bandformat[format];
  233|  38.4M|}
vips_interpretation_max_alpha:
  243|  5.17k|{
  244|  5.17k|	switch (interpretation) {
  245|    295|	case VIPS_INTERPRETATION_GREY16:
  ------------------
  |  Branch (245:2): [True: 295, False: 4.88k]
  ------------------
  246|    342|	case VIPS_INTERPRETATION_RGB16:
  ------------------
  |  Branch (246:2): [True: 47, False: 5.13k]
  ------------------
  247|    342|		return 65535.0;
  248|    311|	case VIPS_INTERPRETATION_scRGB:
  ------------------
  |  Branch (248:2): [True: 311, False: 4.86k]
  ------------------
  249|    311|		return 1.0;
  250|  4.52k|	default:
  ------------------
  |  Branch (250:2): [True: 4.52k, False: 653]
  ------------------
  251|  4.52k|		return 255.0;
  252|  5.17k|	}
  253|  5.17k|}
vips__meta_destroy:
  375|  2.76M|{
  376|  2.76M|	VIPS_FREEF(g_hash_table_destroy, image->meta);
  ------------------
  |  |   41|  2.76M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.76M|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  2.76M|	{ \
  |  |   43|  2.76M|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 2.42M, False: 330k]
  |  |  ------------------
  |  |   44|  2.42M|			(void) F((S)); \
  |  |   45|  2.42M|			(S) = 0; \
  |  |   46|  2.42M|		} \
  |  |   47|  2.76M|	} \
  |  |   48|  2.76M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.76M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  377|  2.76M|	g_assert(!image->meta_traverse);
  ------------------
  |  |  166|  2.76M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.76M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.76M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  378|  2.76M|}
vips_image_get_bands:
  422|  2.71M|{
  423|  2.71M|	return image->Bands;
  424|  2.71M|}
vips_image_get_format:
  434|  4.63M|{
  435|  4.63M|	return image->BandFmt;
  436|  4.63M|}
vips_image_get_interpretation:
  587|  37.1k|{
  588|  37.1k|	return image->Type;
  589|  37.1k|}
vips_image_guess_interpretation:
  674|  38.1k|{
  675|  38.1k|	gboolean sane;
  676|       |
  677|  38.1k|	sane = TRUE;
  ------------------
  |  |  798|  38.1k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  38.1k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  678|       |
  679|       |	/* Coding overrides interpretation.
  680|       |	 */
  681|  38.1k|	switch (image->Coding) {
  682|      0|	case VIPS_CODING_ERROR:
  ------------------
  |  Branch (682:2): [True: 0, False: 38.1k]
  ------------------
  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: 38.1k]
  ------------------
  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: 38.1k]
  ------------------
  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|  38.1k|	default:
  ------------------
  |  Branch (696:2): [True: 38.1k, False: 0]
  ------------------
  697|  38.1k|		break;
  698|  38.1k|	}
  699|       |
  700|  38.1k|	switch (image->Type) {
  701|      0|	case VIPS_INTERPRETATION_ERROR:
  ------------------
  |  Branch (701:2): [True: 0, False: 38.1k]
  ------------------
  702|      0|		sane = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  703|      0|		break;
  704|       |
  705|    704|	case VIPS_INTERPRETATION_MULTIBAND:
  ------------------
  |  Branch (705:2): [True: 704, False: 37.4k]
  ------------------
  706|       |		/* This is a pretty useless generic tag. Always reset it.
  707|       |		 */
  708|    704|		sane = FALSE;
  ------------------
  |  |  794|    704|#define	FALSE	(0)
  ------------------
  709|    704|		break;
  710|       |
  711|  4.06k|	case VIPS_INTERPRETATION_B_W:
  ------------------
  |  Branch (711:2): [True: 4.06k, False: 34.1k]
  ------------------
  712|       |		/* Don't test bands, we allow bands after the first to be
  713|       |		 * unused extras, like alpha.
  714|       |		 */
  715|  4.06k|		break;
  716|       |
  717|      0|	case VIPS_INTERPRETATION_HISTOGRAM:
  ------------------
  |  Branch (717:2): [True: 0, False: 38.1k]
  ------------------
  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: 38.1k]
  ------------------
  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|  19.3k|	case VIPS_INTERPRETATION_XYZ:
  ------------------
  |  Branch (727:2): [True: 19.3k, False: 18.8k]
  ------------------
  728|  19.3k|	case VIPS_INTERPRETATION_LAB:
  ------------------
  |  Branch (728:2): [True: 47, False: 38.1k]
  ------------------
  729|  19.3k|	case VIPS_INTERPRETATION_RGB:
  ------------------
  |  Branch (729:2): [True: 0, False: 38.1k]
  ------------------
  730|  19.3k|	case VIPS_INTERPRETATION_CMC:
  ------------------
  |  Branch (730:2): [True: 0, False: 38.1k]
  ------------------
  731|  19.3k|	case VIPS_INTERPRETATION_LCH:
  ------------------
  |  Branch (731:2): [True: 0, False: 38.1k]
  ------------------
  732|  29.9k|	case VIPS_INTERPRETATION_sRGB:
  ------------------
  |  Branch (732:2): [True: 10.6k, False: 27.5k]
  ------------------
  733|  29.9k|	case VIPS_INTERPRETATION_HSV:
  ------------------
  |  Branch (733:2): [True: 0, False: 38.1k]
  ------------------
  734|  29.9k|		if (image->Bands < 3)
  ------------------
  |  Branch (734:7): [True: 323, False: 29.6k]
  ------------------
  735|    323|			sane = FALSE;
  ------------------
  |  |  794|    323|#define	FALSE	(0)
  ------------------
  736|  29.9k|		break;
  737|       |
  738|    283|	case VIPS_INTERPRETATION_scRGB:
  ------------------
  |  Branch (738:2): [True: 283, False: 37.8k]
  ------------------
  739|    283|	case VIPS_INTERPRETATION_YXY:
  ------------------
  |  Branch (739:2): [True: 0, False: 38.1k]
  ------------------
  740|       |		/* Need float values in 0 - 1.
  741|       |		 */
  742|    283|		if (!vips_band_format_isfloat(image->BandFmt) ||
  ------------------
  |  Branch (742:7): [True: 0, False: 283]
  ------------------
  743|    283|			image->Bands < 3)
  ------------------
  |  Branch (743:4): [True: 0, False: 283]
  ------------------
  744|      0|			sane = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  745|    283|		break;
  746|       |
  747|    840|	case VIPS_INTERPRETATION_CMYK:
  ------------------
  |  Branch (747:2): [True: 840, False: 37.3k]
  ------------------
  748|    840|		if (image->Bands < 4)
  ------------------
  |  Branch (748:7): [True: 0, False: 840]
  ------------------
  749|      0|			sane = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  750|    840|		break;
  751|       |
  752|      0|	case VIPS_INTERPRETATION_LABQ:
  ------------------
  |  Branch (752:2): [True: 0, False: 38.1k]
  ------------------
  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|    119|	case VIPS_INTERPRETATION_LABS:
  ------------------
  |  Branch (757:2): [True: 119, False: 38.0k]
  ------------------
  758|       |		/* Needs to be able to express +/- 32767
  759|       |		 */
  760|    119|		if (vips_band_format_isuint(image->BandFmt) ||
  ------------------
  |  Branch (760:7): [True: 0, False: 119]
  ------------------
  761|    119|			vips_band_format_is8bit(image->BandFmt) ||
  ------------------
  |  Branch (761:4): [True: 0, False: 119]
  ------------------
  762|    119|			image->Bands < 3)
  ------------------
  |  Branch (762:4): [True: 0, False: 119]
  ------------------
  763|      0|			sane = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  764|    119|		break;
  765|       |
  766|  1.84k|	case VIPS_INTERPRETATION_RGB16:
  ------------------
  |  Branch (766:2): [True: 1.84k, False: 36.3k]
  ------------------
  767|  1.84k|		if (vips_band_format_is8bit(image->BandFmt) ||
  ------------------
  |  Branch (767:7): [True: 0, False: 1.84k]
  ------------------
  768|  1.84k|			image->Bands < 3)
  ------------------
  |  Branch (768:4): [True: 0, False: 1.84k]
  ------------------
  769|      0|			sane = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  770|  1.84k|		break;
  771|       |
  772|    324|	case VIPS_INTERPRETATION_GREY16:
  ------------------
  |  Branch (772:2): [True: 324, False: 37.8k]
  ------------------
  773|    324|		if (vips_band_format_is8bit(image->BandFmt))
  ------------------
  |  Branch (773:7): [True: 0, False: 324]
  ------------------
  774|      0|			sane = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  775|    324|		break;
  776|       |
  777|      0|	case VIPS_INTERPRETATION_MATRIX:
  ------------------
  |  Branch (777:2): [True: 0, False: 38.1k]
  ------------------
  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: 38.1k]
  ------------------
  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|  38.1k|	}
  785|       |
  786|  38.1k|	if (sane)
  ------------------
  |  Branch (786:6): [True: 37.1k, False: 1.02k]
  ------------------
  787|  37.1k|		return vips_image_get_interpretation(image);
  788|  1.02k|	else
  789|  1.02k|		return vips_image_default_interpretation(image);
  790|  38.1k|}
vips_image_get_scale:
  879|   171k|{
  880|   171k|	double scale;
  881|       |
  882|   171k|	scale = 1.0;
  883|   171k|	if (vips_image_get_typeof(image, "scale"))
  ------------------
  |  Branch (883:6): [True: 114k, False: 57.2k]
  ------------------
  884|   114k|		vips_image_get_double(image, "scale", &scale);
  885|       |
  886|   171k|	return scale;
  887|   171k|}
vips_image_get_offset:
  900|   114k|{
  901|   114k|	double offset;
  902|       |
  903|   114k|	offset = 0.0;
  904|   114k|	if (vips_image_get_typeof(image, "offset"))
  ------------------
  |  Branch (904:6): [True: 76.3k, False: 38.1k]
  ------------------
  905|  76.3k|		vips_image_get_double(image, "offset", &offset);
  906|       |
  907|   114k|	return offset;
  908|   114k|}
vips_image_get_concurrency:
  972|   466k|{
  973|   466k|	int concurrency;
  974|       |
  975|   466k|	if (vips_image_get_typeof(image, VIPS_META_CONCURRENCY) &&
  ------------------
  |  |  179|   466k|#define VIPS_META_CONCURRENCY "concurrency"
  ------------------
  |  Branch (975:6): [True: 0, False: 466k]
  ------------------
  976|   466k|		!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|   466k|		concurrency >= 1 &&
  ------------------
  |  Branch (978:3): [True: 0, False: 0]
  ------------------
  979|   466k|		concurrency < 100)
  ------------------
  |  Branch (979:3): [True: 0, False: 0]
  ------------------
  980|      0|		return concurrency;
  981|       |
  982|   466k|	return default_concurrency;
  983|   466k|}
vips_image_init_fields:
 1100|  45.5k|{
 1101|  45.5k|	g_object_set(image,
 1102|  45.5k|		"width", xsize,
 1103|  45.5k|		"height", ysize,
 1104|  45.5k|		"bands", bands,
 1105|  45.5k|		"format", format,
 1106|  45.5k|		NULL);
 1107|       |
 1108|  45.5k|	image->Coding = coding;
 1109|  45.5k|	image->Type = interpretation;
 1110|  45.5k|	image->Xres = VIPS_MAX(0, xres);
  ------------------
  |  |   54|  45.5k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 45.5k]
  |  |  ------------------
  ------------------
 1111|  45.5k|	image->Yres = VIPS_MAX(0, yres);
  ------------------
  |  |   54|  45.5k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 45.5k]
  |  |  ------------------
  ------------------
 1112|  45.5k|}
vips__image_meta_copy:
 1141|  2.96M|{
 1142|  2.96M|	if (src->meta) {
  ------------------
  |  Branch (1142:6): [True: 2.65M, False: 310k]
  ------------------
 1143|       |		/* We lock with vips_image_set() to stop races in highly-
 1144|       |		 * threaded applications.
 1145|       |		 */
 1146|  2.65M|		g_mutex_lock(&vips__meta_lock);
 1147|  2.65M|		meta_init(dst);
 1148|  2.65M|		vips_slist_map2(src->meta_traverse,
 1149|  2.65M|			(VipsSListMap2Fn) meta_cp_field, dst, NULL);
 1150|  2.65M|		g_mutex_unlock(&vips__meta_lock);
 1151|  2.65M|	}
 1152|       |
 1153|  2.96M|	return 0;
 1154|  2.96M|}
vips__image_copy_fields_array:
 1161|  2.59M|{
 1162|  2.59M|	int i;
 1163|  2.59M|	int ni;
 1164|       |
 1165|  2.59M|	g_assert(in[0]);
  ------------------
  |  |  166|  2.59M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.59M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.59M|#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|  2.59M|	out->magic = in[0]->magic;
 1170|       |
 1171|  2.59M|	out->Xsize = in[0]->Xsize;
 1172|  2.59M|	out->Ysize = in[0]->Ysize;
 1173|  2.59M|	out->Bands = in[0]->Bands;
 1174|  2.59M|	out->Bbits = in[0]->Bbits;
 1175|  2.59M|	out->BandFmt = in[0]->BandFmt;
 1176|  2.59M|	out->Type = in[0]->Type;
 1177|  2.59M|	out->Coding = in[0]->Coding;
 1178|  2.59M|	out->Xres = in[0]->Xres;
 1179|  2.59M|	out->Yres = in[0]->Yres;
 1180|  2.59M|	out->Xoffset = in[0]->Xoffset;
 1181|  2.59M|	out->Yoffset = in[0]->Yoffset;
 1182|       |
 1183|       |	/* Count number of images.
 1184|       |	 */
 1185|  5.56M|	for (ni = 0; in[ni]; ni++)
  ------------------
  |  Branch (1185:15): [True: 2.96M, False: 2.59M]
  ------------------
 1186|  2.96M|		;
 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|  5.56M|	for (i = ni - 1; i >= 0; i--)
  ------------------
  |  Branch (1195:19): [True: 2.96M, False: 2.59M]
  ------------------
 1196|  2.96M|		if (vips__image_meta_copy(out, in[i]))
  ------------------
  |  Branch (1196:7): [True: 0, False: 2.96M]
  ------------------
 1197|      0|			return -1;
 1198|       |
 1199|       |	/* Merge hists first to last.
 1200|       |	 */
 1201|  5.56M|	for (i = 0; in[i]; i++)
  ------------------
  |  Branch (1201:14): [True: 2.96M, False: 2.59M]
  ------------------
 1202|  2.96M|		out->history_list = vips__gslist_gvalue_merge(
 1203|  2.96M|			out->history_list, in[i]->history_list);
 1204|       |
 1205|  2.59M|	return 0;
 1206|  2.59M|}
vips_image_set:
 1234|   354k|{
 1235|   354k|	g_assert(name);
  ------------------
  |  |  166|   354k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   354k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   354k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1236|   354k|	g_assert(value);
  ------------------
  |  |  166|   354k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   354k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   354k|#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|   354k|	g_mutex_lock(&vips__meta_lock);
 1246|   354k|	meta_init(image);
 1247|   354k|	(void) meta_new(image, name, value);
 1248|   354k|	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|   354k|	if (strcmp(name, VIPS_META_EXIF_NAME) == 0)
  ------------------
  |  |   46|   354k|#define VIPS_META_EXIF_NAME "exif-data"
  ------------------
  |  Branch (1256:6): [True: 1.46k, False: 353k]
  ------------------
 1257|  1.46k|		if (vips__exif_parse(image))
  ------------------
  |  Branch (1257:7): [True: 0, False: 1.46k]
  ------------------
 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|   354k|}
vips_image_get:
 1337|   312k|{
 1338|   312k|	int i;
 1339|   312k|	VipsMeta *meta;
 1340|       |
 1341|   312k|	g_assert(name);
  ------------------
  |  |  166|   312k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   312k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   312k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1342|   312k|	g_assert(value_copy);
  ------------------
  |  |  166|   312k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   312k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   312k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1343|       |
 1344|  3.03M|	for (i = 0; i < VIPS_NUMBER(vips_header_fields); i++) {
  ------------------
  |  |   60|  3.03M|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (1344:14): [True: 2.83M, False: 192k]
  ------------------
 1345|  2.83M|		HeaderField *field = &vips_header_fields[i];
 1346|       |
 1347|  2.83M|		if (strcmp(field->name, name) == 0) {
  ------------------
  |  Branch (1347:7): [True: 119k, False: 2.71M]
  ------------------
 1348|   119k|			GType gtype = g_type_from_name(field->type);
 1349|       |
 1350|   119k|			g_value_init(value_copy, gtype);
 1351|   119k|			vips_set_value_from_pointer(value_copy,
 1352|   119k|				G_STRUCT_MEMBER_P(image, field->offset));
  ------------------
  |  |  840|   119k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  ------------------
 1353|       |
 1354|   119k|			return 0;
 1355|   119k|		}
 1356|  2.83M|	}
 1357|       |
 1358|  2.31M|	for (i = 0; i < VIPS_NUMBER(vips_header_fields_old); i++) {
  ------------------
  |  |   60|  2.31M|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (1358:14): [True: 2.11M, False: 192k]
  ------------------
 1359|  2.11M|		HeaderField *field = &vips_header_fields_old[i];
 1360|       |
 1361|  2.11M|		if (strcmp(field->name, name) == 0) {
  ------------------
  |  Branch (1361:7): [True: 0, False: 2.11M]
  ------------------
 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|  2.11M|	}
 1371|       |
 1372|   192k|	if (image->meta &&
  ------------------
  |  Branch (1372:6): [True: 192k, False: 0]
  ------------------
 1373|   192k|		(meta = g_hash_table_lookup(image->meta, name))) {
  ------------------
  |  Branch (1373:3): [True: 192k, False: 0]
  ------------------
 1374|   192k|		g_value_init(value_copy, G_VALUE_TYPE(&meta->value));
  ------------------
  |  |   59|   192k|#define	G_VALUE_TYPE(value)		(((GValue*) (value))->g_type)
  ------------------
 1375|   192k|		g_value_copy(&meta->value, value_copy);
 1376|       |
 1377|   192k|		return 0;
 1378|   192k|	}
 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|   192k|}
vips_image_get_typeof:
 1400|  1.06M|{
 1401|  1.06M|	int i;
 1402|  1.06M|	VipsMeta *meta;
 1403|       |
 1404|  1.06M|	g_assert(name);
  ------------------
  |  |  166|  1.06M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  1.06M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.06M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1405|       |
 1406|  12.8M|	for (i = 0; i < VIPS_NUMBER(vips_header_fields); i++) {
  ------------------
  |  |   60|  12.8M|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (1406:14): [True: 11.7M, False: 1.06M]
  ------------------
 1407|  11.7M|		HeaderField *field = &vips_header_fields[i];
 1408|       |
 1409|  11.7M|		if (strcmp(field->name, name) == 0)
  ------------------
  |  Branch (1409:7): [True: 0, False: 11.7M]
  ------------------
 1410|      0|			return g_type_from_name(field->type);
 1411|  11.7M|	}
 1412|       |
 1413|  12.8M|	for (i = 0; i < VIPS_NUMBER(vips_header_fields_old); i++) {
  ------------------
  |  |   60|  12.8M|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (1413:14): [True: 11.7M, False: 1.06M]
  ------------------
 1414|  11.7M|		HeaderField *field = &vips_header_fields_old[i];
 1415|       |
 1416|  11.7M|		if (strcmp(field->name, name) == 0)
  ------------------
  |  Branch (1416:7): [True: 0, False: 11.7M]
  ------------------
 1417|      0|			return g_type_from_name(field->type);
 1418|  11.7M|	}
 1419|       |
 1420|  1.06M|	if (image->meta &&
  ------------------
  |  Branch (1420:6): [True: 792k, False: 276k]
  ------------------
 1421|  1.06M|		(meta = g_hash_table_lookup(image->meta, name)))
  ------------------
  |  Branch (1421:3): [True: 193k, False: 598k]
  ------------------
 1422|   193k|		return G_VALUE_TYPE(&meta->value);
  ------------------
  |  |   59|   193k|#define	G_VALUE_TYPE(value)		(((GValue*) (value))->g_type)
  ------------------
 1423|       |
 1424|  1.06M|	VIPS_DEBUG_MSG("vips_image_get_typeof: unknown field %s\n", name);
  ------------------
  |  |   47|   874k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   874k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   874k|	{ \
  |  |   49|   874k|		; \
  |  |   50|   874k|	} \
  |  |   51|  1.06M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.06M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1425|       |
 1426|   874k|	return 0;
 1427|  1.06M|}
vips_image_remove:
 1443|  28.4k|{
 1444|  28.4k|	gboolean result;
 1445|       |
 1446|  28.4k|	result = FALSE;
  ------------------
  |  |  794|  28.4k|#define	FALSE	(0)
  ------------------
 1447|       |
 1448|  28.4k|	if (image->meta) {
  ------------------
  |  Branch (1448:6): [True: 22.9k, False: 5.44k]
  ------------------
 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|  22.9k|		g_mutex_lock(&vips__meta_lock);
 1457|  22.9k|		result = g_hash_table_remove(image->meta, name);
 1458|  22.9k|		g_mutex_unlock(&vips__meta_lock);
 1459|  22.9k|	}
 1460|       |
 1461|  28.4k|	return result;
 1462|  28.4k|}
vips_image_map:
 1506|  10.9k|{
 1507|  10.9k|	int i;
 1508|  10.9k|	GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|  10.9k|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 1509|  10.9k|	void *result;
 1510|       |
 1511|   130k|	for (i = 0; i < VIPS_NUMBER(vips_header_fields); i++) {
  ------------------
  |  |   60|   130k|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (1511:14): [True: 119k, False: 10.9k]
  ------------------
 1512|   119k|		HeaderField *field = &vips_header_fields[i];
 1513|       |
 1514|   119k|		(void) vips_image_get(image, field->name, &value);
 1515|   119k|		result = fn(image, field->name, &value, a);
 1516|   119k|		g_value_unset(&value);
 1517|       |
 1518|   119k|		if (result)
  ------------------
  |  Branch (1518:7): [True: 0, False: 119k]
  ------------------
 1519|      0|			return result;
 1520|   119k|	}
 1521|       |
 1522|  10.9k|	if (image->meta_traverse &&
  ------------------
  |  Branch (1522:6): [True: 5.46k, False: 5.44k]
  ------------------
 1523|  10.9k|		(result = vips_slist_map2(image->meta_traverse,
  ------------------
  |  Branch (1523:3): [True: 0, False: 5.46k]
  ------------------
 1524|  5.46k|			 (VipsSListMap2Fn) vips_image_map_fn, fn, a)))
 1525|      0|		return result;
 1526|       |
 1527|  10.9k|	return NULL;
 1528|  10.9k|}
vips_image_set_blob:
 1673|  2.68k|{
 1674|  2.68k|	GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|  2.68k|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 1675|       |
 1676|  2.68k|	g_value_init(&value, VIPS_TYPE_BLOB);
  ------------------
  |  |  177|  2.68k|#define VIPS_TYPE_BLOB (vips_blob_get_type())
  ------------------
 1677|  2.68k|	vips_value_set_blob(&value, free_fn, data, size);
 1678|  2.68k|	vips_image_set(image, name, &value);
 1679|  2.68k|	g_value_unset(&value);
 1680|  2.68k|}
vips_image_set_blob_copy:
 1697|  3.16k|{
 1698|  3.16k|	void *data_copy;
 1699|       |
 1700|       |	/* Cap at 100mb for sanity.
 1701|       |	 */
 1702|  3.16k|	if (!data ||
  ------------------
  |  Branch (1702:6): [True: 1.33k, False: 1.83k]
  ------------------
 1703|  3.16k|		length == 0 ||
  ------------------
  |  Branch (1703:3): [True: 0, False: 1.83k]
  ------------------
 1704|  3.16k|		length > 100 * 1024 * 1024)
  ------------------
  |  Branch (1704:3): [True: 0, False: 1.83k]
  ------------------
 1705|  1.33k|		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.83k|	if (!(data_copy = vips_malloc(NULL, length + 1)))
  ------------------
  |  Branch (1711:6): [True: 0, False: 1.83k]
  ------------------
 1712|      0|		return;
 1713|  1.83k|	memcpy(data_copy, data, length);
 1714|  1.83k|	((unsigned char *) data_copy)[length] = '\0';
 1715|       |
 1716|  1.83k|	vips_image_set_blob(image,
 1717|  1.83k|		name, (VipsCallbackFn) vips_area_free_cb, data_copy, length);
 1718|  1.83k|}
vips_image_get_blob:
 1738|  1.46k|{
 1739|  1.46k|	GValue value_copy = G_VALUE_INIT;
  ------------------
  |  |  191|  1.46k|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 1740|       |
 1741|  1.46k|	if (!meta_get_value(image, name, VIPS_TYPE_BLOB, &value_copy)) {
  ------------------
  |  |  177|  1.46k|#define VIPS_TYPE_BLOB (vips_blob_get_type())
  ------------------
  |  Branch (1741:6): [True: 1.46k, False: 0]
  ------------------
 1742|  1.46k|		*data = vips_value_get_blob(&value_copy, length);
 1743|  1.46k|		g_value_unset(&value_copy);
 1744|  1.46k|		return 0;
 1745|  1.46k|	}
 1746|       |
 1747|      0|	return -1;
 1748|  1.46k|}
vips_image_set_int:
 1791|   110k|{
 1792|   110k|	GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|   110k|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 1793|       |
 1794|   110k|	g_value_init(&value, G_TYPE_INT);
  ------------------
  |  |   94|   110k|#define G_TYPE_INT			G_TYPE_MAKE_FUNDAMENTAL (6)
  |  |  ------------------
  |  |  |  |  221|   110k|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|   110k|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1795|   110k|	g_value_set_int(&value, i);
 1796|   110k|	vips_image_set(image, name, &value);
 1797|   110k|	g_value_unset(&value);
 1798|   110k|}
vips_image_get_double:
 1816|   190k|{
 1817|   190k|	GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|   190k|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 1818|       |
 1819|   190k|	if (meta_get_value(image, name, G_TYPE_DOUBLE, &value))
  ------------------
  |  |  148|   190k|#define G_TYPE_DOUBLE			G_TYPE_MAKE_FUNDAMENTAL (15)
  |  |  ------------------
  |  |  |  |  221|   190k|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|   190k|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1819:6): [True: 0, False: 190k]
  ------------------
 1820|      0|		return -1;
 1821|   190k|	*out = g_value_get_double(&value);
 1822|   190k|	g_value_unset(&value);
 1823|       |
 1824|   190k|	return 0;
 1825|   190k|}
vips_image_set_double:
 1841|   170k|{
 1842|   170k|	GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|   170k|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 1843|       |
 1844|   170k|	g_value_init(&value, G_TYPE_DOUBLE);
  ------------------
  |  |  148|   170k|#define G_TYPE_DOUBLE			G_TYPE_MAKE_FUNDAMENTAL (15)
  |  |  ------------------
  |  |  |  |  221|   170k|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|   170k|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1845|   170k|	g_value_set_double(&value, d);
 1846|   170k|	vips_image_set(image, name, &value);
 1847|   170k|	g_value_unset(&value);
 1848|   170k|}
vips_image_get_string:
 1871|    270|{
 1872|    270|	GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|    270|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 1873|       |
 1874|    270|	if (vips_image_get(image, name, &value))
  ------------------
  |  Branch (1874:6): [True: 0, False: 270]
  ------------------
 1875|      0|		return -1;
 1876|       |
 1877|    270|	if (G_VALUE_TYPE(&value) == VIPS_TYPE_REF_STRING) {
  ------------------
  |  |   59|    270|#define	G_VALUE_TYPE(value)		(((GValue*) (value))->g_type)
  ------------------
              	if (G_VALUE_TYPE(&value) == VIPS_TYPE_REF_STRING) {
  ------------------
  |  |  159|    270|#define VIPS_TYPE_REF_STRING (vips_ref_string_get_type())
  ------------------
  |  Branch (1877:6): [True: 270, False: 0]
  ------------------
 1878|    270|		VipsArea *area;
 1879|       |
 1880|    270|		area = g_value_get_boxed(&value);
 1881|    270|		*out = area->data;
 1882|    270|	}
 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|    270|	g_value_unset(&value);
 1897|       |
 1898|    270|	return 0;
 1899|    270|}
vips_image_set_string:
 1915|  68.2k|{
 1916|  68.2k|	GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|  68.2k|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 1917|       |
 1918|  68.2k|	g_value_init(&value, VIPS_TYPE_REF_STRING);
  ------------------
  |  |  159|  68.2k|#define VIPS_TYPE_REF_STRING (vips_ref_string_get_type())
  ------------------
 1919|  68.2k|	vips_value_set_ref_string(&value, str);
 1920|  68.2k|	vips_image_set(image, name, &value);
 1921|  68.2k|	g_value_unset(&value);
 1922|  68.2k|}
vips_image_set_array_int:
 2096|  1.47k|{
 2097|  1.47k|	GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|  1.47k|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 2098|       |
 2099|  1.47k|	g_value_init(&value, VIPS_TYPE_ARRAY_INT);
  ------------------
  |  |  221|  1.47k|#define VIPS_TYPE_ARRAY_INT (vips_array_int_get_type())
  ------------------
 2100|  1.47k|	vips_value_set_array_int(&value, array, n);
 2101|  1.47k|	vips_image_set(image, name, &value);
 2102|  1.47k|	g_value_unset(&value);
 2103|  1.47k|}
vips_image_set_array_double:
 2154|    829|{
 2155|    829|	GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|    829|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 2156|       |
 2157|    829|	g_value_init(&value, VIPS_TYPE_ARRAY_DOUBLE);
  ------------------
  |  |  201|    829|#define VIPS_TYPE_ARRAY_DOUBLE (vips_array_double_get_type())
  ------------------
 2158|    829|	vips_value_set_array_double(&value, array, n);
 2159|    829|	vips_image_set(image, name, &value);
 2160|    829|	g_value_unset(&value);
 2161|    829|}
header.c:vips_image_default_interpretation:
  595|  1.02k|{
  596|  1.02k|	switch (image->Coding) {
  597|      0|	case VIPS_CODING_LABQ:
  ------------------
  |  Branch (597:2): [True: 0, False: 1.02k]
  ------------------
  598|      0|		return VIPS_INTERPRETATION_LABQ;
  599|      0|	case VIPS_CODING_RAD:
  ------------------
  |  Branch (599:2): [True: 0, False: 1.02k]
  ------------------
  600|      0|		return VIPS_INTERPRETATION_sRGB;
  601|  1.02k|	default:
  ------------------
  |  Branch (601:2): [True: 1.02k, False: 0]
  ------------------
  602|  1.02k|		break;
  603|  1.02k|	}
  604|       |
  605|  1.02k|	switch (image->BandFmt) {
  606|    456|	case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (606:2): [True: 456, False: 571]
  ------------------
  607|    530|	case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (607:2): [True: 74, False: 953]
  ------------------
  608|    737|	case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (608:2): [True: 207, False: 820]
  ------------------
  609|    809|	case VIPS_FORMAT_INT:
  ------------------
  |  Branch (609:2): [True: 72, False: 955]
  ------------------
  610|    879|	case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (610:2): [True: 70, False: 957]
  ------------------
  611|    879|	case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (611:2): [True: 0, False: 1.02k]
  ------------------
  612|    879|		switch (image->Bands) {
  613|    273|		case 1:
  ------------------
  |  Branch (613:3): [True: 273, False: 606]
  ------------------
  614|    742|		case 2:
  ------------------
  |  Branch (614:3): [True: 469, False: 410]
  ------------------
  615|    742|			return VIPS_INTERPRETATION_B_W;
  616|       |
  617|     39|		case 3:
  ------------------
  |  Branch (617:3): [True: 39, False: 840]
  ------------------
  618|    137|		case 4:
  ------------------
  |  Branch (618:3): [True: 98, False: 781]
  ------------------
  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|    137|			return VIPS_INTERPRETATION_sRGB;
  626|       |
  627|      0|		default:
  ------------------
  |  Branch (627:3): [True: 0, False: 879]
  ------------------
  628|      0|			return VIPS_INTERPRETATION_MULTIBAND;
  629|    879|		}
  630|       |
  631|      6|	case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (631:2): [True: 6, False: 1.02k]
  ------------------
  632|      6|		switch (image->Bands) {
  633|      3|		case 1:
  ------------------
  |  Branch (633:3): [True: 3, False: 3]
  ------------------
  634|      3|			return VIPS_INTERPRETATION_MATRIX;
  635|       |
  636|      3|		default:
  ------------------
  |  Branch (636:3): [True: 3, False: 3]
  ------------------
  637|      3|			return VIPS_INTERPRETATION_MULTIBAND;
  638|      6|		}
  639|       |
  640|    142|	case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (640:2): [True: 142, False: 885]
  ------------------
  641|    142|		switch (image->Bands) {
  642|     24|		case 1:
  ------------------
  |  Branch (642:3): [True: 24, False: 118]
  ------------------
  643|     71|		case 2:
  ------------------
  |  Branch (643:3): [True: 47, False: 95]
  ------------------
  644|     71|			return VIPS_INTERPRETATION_GREY16;
  645|       |
  646|     33|		case 3:
  ------------------
  |  Branch (646:3): [True: 33, False: 109]
  ------------------
  647|     71|		case 4:
  ------------------
  |  Branch (647:3): [True: 38, False: 104]
  ------------------
  648|     71|			return VIPS_INTERPRETATION_RGB16;
  649|       |
  650|      0|		default:
  ------------------
  |  Branch (650:3): [True: 0, False: 142]
  ------------------
  651|      0|			return VIPS_INTERPRETATION_MULTIBAND;
  652|    142|		}
  653|       |
  654|      0|	case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (654:2): [True: 0, False: 1.02k]
  ------------------
  655|      0|	case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (655:2): [True: 0, False: 1.02k]
  ------------------
  656|      0|		return VIPS_INTERPRETATION_FOURIER;
  657|       |
  658|      0|	default:
  ------------------
  |  Branch (658:2): [True: 0, False: 1.02k]
  ------------------
  659|      0|		return VIPS_INTERPRETATION_MULTIBAND;
  660|  1.02k|	}
  661|  1.02k|}
header.c:meta_init:
  382|  3.01M|{
  383|  3.01M|	if (!im->meta) {
  ------------------
  |  Branch (383:6): [True: 2.42M, False: 582k]
  ------------------
  384|  2.42M|		g_assert(!im->meta_traverse);
  ------------------
  |  |  166|  2.42M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.42M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.42M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  385|  2.42M|		im->meta = g_hash_table_new_full(g_str_hash, g_str_equal,
  386|  2.42M|			NULL, (GDestroyNotify) meta_free);
  387|  2.42M|	}
  388|  3.01M|}
header.c:meta_free:
  307|  12.5M|{
  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|  12.5M|	if (meta->im)
  ------------------
  |  Branch (319:6): [True: 12.5M, False: 0]
  ------------------
  320|  12.5M|		meta->im->meta_traverse =
  321|  12.5M|			g_slist_remove(meta->im->meta_traverse, meta);
  322|       |
  323|  12.5M|	g_value_unset(&meta->value);
  324|  12.5M|	g_free(meta->name);
  325|  12.5M|	g_free(meta);
  326|  12.5M|}
header.c:meta_cp_field:
 1116|  12.1M|{
 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|  12.1M|	(void) meta_new(dst, meta->name, &meta->value);
 1129|       |
 1130|       |#ifdef DEBUG
 1131|       |	meta_sanity(dst);
 1132|       |#endif /*DEBUG*/
 1133|       |
 1134|  12.1M|	return NULL;
 1135|  12.1M|}
header.c:meta_new:
  330|  12.5M|{
  331|  12.5M|	VipsMeta *meta;
  332|       |
  333|  12.5M|	meta = g_new(VipsMeta, 1);
  ------------------
  |  |  282|  12.5M|#define g_new(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc)
  |  |  ------------------
  |  |  |  |  227|  12.5M|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|  12.5M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|  12.5M|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|  12.5M|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|  12.5M|	  gpointer __p;						\
  |  |  |  |  231|  12.5M|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 12.5M]
  |  |  |  |  ------------------
  |  |  |  |  232|  12.5M|	    __p = g_##func (__n);				\
  |  |  |  |  233|  12.5M|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 12.5M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|  12.5M|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 12.5M]
  |  |  |  |  |  Branch (234:26): [True: 12.5M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|  12.5M|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|  12.5M|	  else							\
  |  |  |  |  237|  12.5M|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|  12.5M|	  __p;							\
  |  |  |  |  239|  12.5M|	}))
  |  |  ------------------
  ------------------
  334|  12.5M|	meta->im = image;
  335|  12.5M|	meta->name = NULL;
  336|  12.5M|	memset(&meta->value, 0, sizeof(GValue));
  337|  12.5M|	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|  12.5M|	if (G_VALUE_TYPE(value) == G_TYPE_STRING)
  ------------------
  |  |   59|  12.5M|#define	G_VALUE_TYPE(value)		(((GValue*) (value))->g_type)
  ------------------
              	if (G_VALUE_TYPE(value) == G_TYPE_STRING)
  ------------------
  |  |  154|  12.5M|#define G_TYPE_STRING			G_TYPE_MAKE_FUNDAMENTAL (16)
  |  |  ------------------
  |  |  |  |  221|  12.5M|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|  12.5M|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (346:6): [True: 0, False: 12.5M]
  ------------------
  347|      0|		g_value_init(&meta->value, VIPS_TYPE_REF_STRING);
  ------------------
  |  |  159|      0|#define VIPS_TYPE_REF_STRING (vips_ref_string_get_type())
  ------------------
  348|  12.5M|	else
  349|  12.5M|		g_value_init(&meta->value, G_VALUE_TYPE(value));
  ------------------
  |  |   59|  12.5M|#define	G_VALUE_TYPE(value)		(((GValue*) (value))->g_type)
  ------------------
  350|       |
  351|       |	/* We don't do any conversions that can fail.
  352|       |	 */
  353|  12.5M|	(void) g_value_transform(value, &meta->value);
  354|       |
  355|  12.5M|	image->meta_traverse = g_slist_append(image->meta_traverse, meta);
  356|  12.5M|	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|  12.5M|	return meta;
  369|  12.5M|}
header.c:vips_set_value_from_pointer:
 1270|   119k|{
 1271|   119k|	GType type = G_VALUE_TYPE(value);
  ------------------
  |  |   59|   119k|#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|   119k|	GType fundamental = G_TYPE_FUNDAMENTAL(type);
  ------------------
  |  |   38|   119k|#define G_TYPE_FUNDAMENTAL(type)	(g_type_fundamental (type))
  ------------------
 1277|       |
 1278|   119k|	if (fundamental == G_TYPE_INT)
  ------------------
  |  |   94|   119k|#define G_TYPE_INT			G_TYPE_MAKE_FUNDAMENTAL (6)
  |  |  ------------------
  |  |  |  |  221|   119k|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|   119k|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1278:6): [True: 54.5k, False: 65.4k]
  ------------------
 1279|  54.5k|		g_value_set_int(value, *((int *) data));
 1280|  65.4k|	else if (fundamental == G_TYPE_DOUBLE)
  ------------------
  |  |  148|  65.4k|#define G_TYPE_DOUBLE			G_TYPE_MAKE_FUNDAMENTAL (15)
  |  |  ------------------
  |  |  |  |  221|  65.4k|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|  65.4k|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1280:11): [True: 21.8k, False: 43.6k]
  ------------------
 1281|  21.8k|		g_value_set_double(value, *((double *) data));
 1282|  43.6k|	else if (fundamental == G_TYPE_ENUM)
  ------------------
  |  |  130|  43.6k|#define G_TYPE_ENUM			G_TYPE_MAKE_FUNDAMENTAL (12)
  |  |  ------------------
  |  |  |  |  221|  43.6k|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|  43.6k|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1282:11): [True: 32.7k, False: 10.9k]
  ------------------
 1283|  32.7k|		g_value_set_enum(value, *((int *) data));
 1284|  10.9k|	else if (fundamental == G_TYPE_STRING)
  ------------------
  |  |  154|  10.9k|#define G_TYPE_STRING			G_TYPE_MAKE_FUNDAMENTAL (16)
  |  |  ------------------
  |  |  |  |  221|  10.9k|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|  10.9k|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1284:11): [True: 10.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|  10.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|   119k|			G_STRLOC,
 1292|   119k|			g_type_name(type));
 1293|   119k|}
header.c:vips_image_map_fn:
 1476|  5.46k|{
 1477|  5.46k|	int i;
 1478|       |
 1479|       |	/* Hide deprecated fields.
 1480|       |	 */
 1481|  32.7k|	for (i = 0; i < VIPS_NUMBER(vips_image_header_deprecated); i++)
  ------------------
  |  |   60|  32.7k|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (1481:14): [True: 27.3k, False: 5.46k]
  ------------------
 1482|  27.3k|		if (strcmp(meta->name, vips_image_header_deprecated[i]) == 0)
  ------------------
  |  Branch (1482:7): [True: 0, False: 27.3k]
  ------------------
 1483|      0|			return NULL;
 1484|       |
 1485|  5.46k|	return fn(meta->im, meta->name, &meta->value, a);
 1486|  5.46k|}
header.c:meta_get_value:
 1606|   192k|{
 1607|   192k|	GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|   192k|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 1608|       |
 1609|   192k|	if (vips_image_get(image, name, &value))
  ------------------
  |  Branch (1609:6): [True: 0, False: 192k]
  ------------------
 1610|      0|		return -1;
 1611|   192k|	g_value_init(value_copy, type);
 1612|   192k|	if (!g_value_transform(&value, value_copy)) {
  ------------------
  |  Branch (1612:6): [True: 0, False: 192k]
  ------------------
 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|   192k|	g_value_unset(&value);
 1623|       |
 1624|   192k|	return 0;
 1625|   192k|}

vips_image_written:
 1364|  2.61M|{
 1365|  2.61M|	int result;
 1366|       |
 1367|  2.61M|	VIPS_DEBUG_MSG("vips_image_written: %p\n", image);
  ------------------
  |  |   47|  2.61M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.61M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  2.61M|	{ \
  |  |   49|  2.61M|		; \
  |  |   50|  2.61M|	} \
  |  |   51|  2.61M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.61M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1368|       |
 1369|  2.61M|	result = 0;
 1370|  2.61M|	g_signal_emit(image, vips_image_signals[SIG_WRITTEN], 0, &result);
 1371|       |
 1372|  2.61M|	return result;
 1373|  2.61M|}
vips_image_minimise_all:
 1443|   466k|{
 1444|       |	/* Minimisation will modify things like sources, so we can't run it
 1445|       |	 * from many threads.
 1446|       |	 */
 1447|   466k|	g_mutex_lock(&vips__minimise_lock);
 1448|       |
 1449|   466k|	(void) vips__link_map(image, TRUE,
  ------------------
  |  |  798|   466k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|   466k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 1450|   466k|		(VipsSListMap2Fn) vips_image_minimise_all_cb, NULL, NULL);
 1451|       |
 1452|   466k|	g_mutex_unlock(&vips__minimise_lock);
 1453|   466k|}
vips_image_is_sequential:
 1467|  13.0k|{
 1468|  13.0k|	return vips_image_get_typeof(image, VIPS_META_SEQUENTIAL);
  ------------------
  |  |  124|  13.0k|#define VIPS_META_SEQUENTIAL "vips-sequential"
  ------------------
 1469|  13.0k|}
vips_image_preeval:
 1524|   233k|{
 1525|   233k|	if (image->progress_signal) {
  ------------------
  |  Branch (1525:6): [True: 23.4k, False: 209k]
  ------------------
 1526|  23.4k|		VIPS_DEBUG_MSG("vips_image_preeval: %p\n", image);
  ------------------
  |  |   47|  23.4k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  23.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  23.4k|	{ \
  |  |   49|  23.4k|		; \
  |  |   50|  23.4k|	} \
  |  |   51|  23.4k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  23.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1527|       |
 1528|  23.4k|		g_assert(vips_object_sanity(
  ------------------
  |  |  166|  23.4k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  23.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  23.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1529|  23.4k|			VIPS_OBJECT(image->progress_signal)));
 1530|       |
 1531|  23.4k|		(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|  23.4k|		(void) vips_progress_add(image->progress_signal);
 1538|       |
 1539|  23.4k|		if (!vips_image_get_typeof(image, "hide-progress"))
  ------------------
  |  Branch (1539:7): [True: 23.4k, False: 0]
  ------------------
 1540|  23.4k|			g_signal_emit(image->progress_signal,
 1541|  23.4k|				vips_image_signals[SIG_PREEVAL], 0,
 1542|  23.4k|				image->time);
 1543|  23.4k|	}
 1544|   233k|}
vips_image_eval:
 1550|  14.2k|{
 1551|  14.2k|	if (image->progress_signal &&
  ------------------
  |  Branch (1551:6): [True: 14.1k, False: 54]
  ------------------
 1552|  14.2k|		image->time) {
  ------------------
  |  Branch (1552:3): [True: 14.1k, False: 0]
  ------------------
 1553|  14.1k|		VIPS_DEBUG_MSG("vips_image_eval: %p\n", image);
  ------------------
  |  |   47|  14.1k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  14.1k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  14.1k|	{ \
  |  |   49|  14.1k|		; \
  |  |   50|  14.1k|	} \
  |  |   51|  14.1k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  14.1k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1554|       |
 1555|  14.1k|		g_assert(vips_object_sanity(
  ------------------
  |  |  166|  14.1k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  14.1k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  14.1k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1556|  14.1k|			VIPS_OBJECT(image->progress_signal)));
 1557|       |
 1558|  14.1k|		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|  14.1k|		if (image->progress_signal->time != image->time)
  ------------------
  |  Branch (1564:7): [True: 14.1k, False: 0]
  ------------------
 1565|  14.1k|			vips_progress_update(image->progress_signal->time,
 1566|  14.1k|				processed);
 1567|       |
 1568|  14.1k|		if (!vips_image_get_typeof(image, "hide-progress"))
  ------------------
  |  Branch (1568:7): [True: 14.1k, False: 0]
  ------------------
 1569|  14.1k|			g_signal_emit(image->progress_signal,
 1570|  14.1k|				vips_image_signals[SIG_EVAL], 0,
 1571|  14.1k|				image->time);
 1572|  14.1k|	}
 1573|  14.2k|}
vips_image_posteval:
 1577|   233k|{
 1578|   233k|	if (image->progress_signal &&
  ------------------
  |  Branch (1578:6): [True: 23.4k, False: 209k]
  ------------------
 1579|   233k|		image->progress_signal->time) {
  ------------------
  |  Branch (1579:3): [True: 23.4k, False: 0]
  ------------------
 1580|  23.4k|		gint64 processed;
 1581|       |
 1582|  23.4k|		VIPS_DEBUG_MSG("vips_image_posteval: %p\n", image);
  ------------------
  |  |   47|  23.4k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  23.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  23.4k|	{ \
  |  |   49|  23.4k|		; \
  |  |   50|  23.4k|	} \
  |  |   51|  23.4k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  23.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1583|       |
 1584|  23.4k|		g_assert(vips_object_sanity(
  ------------------
  |  |  166|  23.4k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  23.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  23.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1585|  23.4k|			VIPS_OBJECT(image->progress_signal)));
 1586|       |
 1587|       |		/* Make sure posteval sees a finished progress.
 1588|       |		 */
 1589|  23.4k|		processed = image->time->tpels;
 1590|  23.4k|		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|  23.4k|		if (image->progress_signal->time != image->time)
  ------------------
  |  Branch (1596:7): [True: 23.4k, False: 0]
  ------------------
 1597|  23.4k|			vips_progress_update(image->progress_signal->time,
 1598|  23.4k|				processed);
 1599|       |
 1600|  23.4k|		if (!vips_image_get_typeof(image, "hide-progress"))
  ------------------
  |  Branch (1600:7): [True: 23.4k, False: 0]
  ------------------
 1601|  23.4k|			g_signal_emit(image->progress_signal,
 1602|  23.4k|				vips_image_signals[SIG_POSTEVAL], 0,
 1603|  23.4k|				image->time);
 1604|  23.4k|	}
 1605|   233k|}
vips_image_iskilled:
 1645|  2.35M|{
 1646|  2.35M|	gboolean kill;
 1647|       |
 1648|  2.35M|	kill = image->kill;
 1649|       |
 1650|       |	// check the image we are signalling progress on too
 1651|  2.35M|	if (image->progress_signal)
  ------------------
  |  Branch (1651:6): [True: 147k, False: 2.20M]
  ------------------
 1652|   147k|		kill |= image->progress_signal->kill;
 1653|       |
 1654|       |	/* Has kill been set for this image? If yes, abort evaluation.
 1655|       |	 */
 1656|  2.35M|	if (kill) {
  ------------------
  |  Branch (1656:6): [True: 0, False: 2.35M]
  ------------------
 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|  2.35M|	return kill;
 1669|  2.35M|}
vips_image_set_kill:
 1683|   233k|{
 1684|   233k|	if (image->kill != kill)
  ------------------
  |  Branch (1684:6): [True: 0, False: 233k]
  ------------------
 1685|   233k|		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|   233k|			image->filename, image, kill);
 1687|       |
 1688|   233k|	image->kill = kill;
 1689|       |
 1690|       |	// set here too
 1691|   233k|	if (image->progress_signal)
  ------------------
  |  Branch (1691:6): [True: 23.4k, False: 209k]
  ------------------
 1692|  23.4k|		image->progress_signal->kill = kill;
 1693|   233k|}
vips_image_new:
 1723|  2.47M|{
 1724|  2.47M|	VipsImage *image;
 1725|  2.47M|	char filename[26];
 1726|       |
 1727|  2.47M|	vips_check_init();
 1728|       |
 1729|  2.47M|	vips_image_temp_name(filename, sizeof(filename));
 1730|       |
 1731|  2.47M|	image = VIPS_IMAGE(g_object_new(VIPS_TYPE_IMAGE, NULL));
  ------------------
  |  |  171|  2.47M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  2.47M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  2.47M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  172|  2.47M|		VIPS_TYPE_IMAGE, VipsImage))
  ------------------
 1732|  2.47M|	g_object_set(image,
 1733|  2.47M|		"filename", filename,
 1734|  2.47M|		"mode", "p",
 1735|  2.47M|		NULL);
 1736|  2.47M|	if (vips_object_build(VIPS_OBJECT(image))) {
  ------------------
  |  |  433|  2.47M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  2.47M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  2.47M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1736:6): [True: 0, False: 2.47M]
  ------------------
 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|  2.47M|	return image;
 1742|  2.47M|}
vips_image_new_mode:
 1746|   212k|{
 1747|   212k|	VipsImage *image;
 1748|       |
 1749|   212k|	g_assert(filename);
  ------------------
  |  |  166|   212k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   212k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   212k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1750|   212k|	g_assert(mode);
  ------------------
  |  |  166|   212k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   212k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   212k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1751|       |
 1752|   212k|	vips_check_init();
 1753|       |
 1754|   212k|	image = VIPS_IMAGE(g_object_new(VIPS_TYPE_IMAGE, NULL));
  ------------------
  |  |  171|   212k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   212k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   212k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  172|   212k|		VIPS_TYPE_IMAGE, VipsImage))
  ------------------
 1755|   212k|	g_object_set(image,
 1756|   212k|		"filename", filename,
 1757|   212k|		"mode", mode,
 1758|   212k|		NULL);
 1759|   212k|	if (vips_object_build(VIPS_OBJECT(image))) {
  ------------------
  |  |  433|   212k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|   212k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   212k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1759:6): [True: 0, False: 212k]
  ------------------
 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|   212k|	return image;
 1765|   212k|}
vips_image_new_memory:
 1779|   212k|{
 1780|   212k|	char filename[26];
 1781|       |
 1782|   212k|	vips_image_temp_name(filename, sizeof(filename));
 1783|   212k|	return vips_image_new_mode(filename, "t");
 1784|   212k|}
vips_image_new_from_buffer:
 2153|  32.5k|{
 2154|  32.5k|	const char *operation_name;
 2155|  32.5k|	va_list ap;
 2156|  32.5k|	int result;
 2157|  32.5k|	VipsImage *out;
 2158|  32.5k|	VipsBlob *blob;
 2159|       |
 2160|  32.5k|	vips_check_init();
 2161|       |
 2162|  32.5k|	if (!(operation_name = vips_foreign_find_load_buffer(buf, len)))
  ------------------
  |  Branch (2162:6): [True: 4.94k, False: 27.6k]
  ------------------
 2163|  4.94k|		return NULL;
 2164|       |
 2165|       |	/* We don't take a copy of the data or free it.
 2166|       |	 */
 2167|  27.6k|	blob = vips_blob_new(NULL, buf, len);
 2168|       |
 2169|  27.6k|	va_start(ap, option_string);
 2170|  27.6k|	result = vips_call_split_option_string(operation_name,
 2171|  27.6k|		option_string, ap, blob, &out);
 2172|  27.6k|	va_end(ap);
 2173|       |
 2174|  27.6k|	vips_area_unref(VIPS_AREA(blob));
  ------------------
  |  |  137|  27.6k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
 2175|       |
 2176|  27.6k|	if (result)
  ------------------
  |  Branch (2176:6): [True: 7.22k, False: 20.4k]
  ------------------
 2177|  7.22k|		return NULL;
 2178|       |
 2179|  20.4k|	return out;
 2180|  27.6k|}
vips_image_new_matrix:
 2286|  76.3k|{
 2287|  76.3k|	VipsImage *image;
 2288|       |
 2289|  76.3k|	vips_check_init();
 2290|       |
 2291|  76.3k|	image = VIPS_IMAGE(g_object_new(VIPS_TYPE_IMAGE, NULL));
  ------------------
  |  |  171|  76.3k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  76.3k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  76.3k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  172|  76.3k|		VIPS_TYPE_IMAGE, VipsImage))
  ------------------
 2292|  76.3k|	g_object_set(image,
 2293|  76.3k|		"filename", "vips_image_new_matrix",
 2294|  76.3k|		"mode", "t",
 2295|  76.3k|		"width", width,
 2296|  76.3k|		"height", height,
 2297|  76.3k|		"bands", 1,
 2298|  76.3k|		"format", VIPS_FORMAT_DOUBLE,
 2299|  76.3k|		"interpretation", VIPS_INTERPRETATION_MATRIX,
 2300|  76.3k|		NULL);
 2301|  76.3k|	if (vips_object_build(VIPS_OBJECT(image))) {
  ------------------
  |  |  433|  76.3k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  76.3k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  76.3k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2301:6): [True: 0, False: 76.3k]
  ------------------
 2302|      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]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2303|      0|		return NULL;
 2304|      0|	}
 2305|       |
 2306|  76.3k|	if (vips_image_write_prepare(image)) {
  ------------------
  |  Branch (2306:6): [True: 0, False: 76.3k]
  ------------------
 2307|      0|		g_object_unref(image);
 2308|      0|		return NULL;
 2309|      0|	}
 2310|       |
 2311|  76.3k|	return image;
 2312|  76.3k|}
vips_image_new_matrixv:
 2330|  19.0k|{
 2331|  19.0k|	va_list ap;
 2332|  19.0k|	VipsImage *matrix;
 2333|  19.0k|	int x, y;
 2334|       |
 2335|  19.0k|	vips_check_init();
 2336|       |
 2337|  19.0k|	matrix = vips_image_new_matrix(width, height);
 2338|       |
 2339|  19.0k|	va_start(ap, height);
 2340|  76.3k|	for (y = 0; y < height; y++)
  ------------------
  |  Branch (2340:14): [True: 57.2k, False: 19.0k]
  ------------------
 2341|   229k|		for (x = 0; x < width; x++)
  ------------------
  |  Branch (2341:15): [True: 171k, False: 57.2k]
  ------------------
 2342|   171k|			*VIPS_MATRIX(matrix, x, y) = va_arg(ap, double);
  ------------------
  |  |  432|   171k|	((double *) VIPS_IMAGE_ADDR(I, X, Y))
  |  |  ------------------
  |  |  |  |  418|   171k|	((I)->data + \
  |  |  |  |  419|   171k|		(Y) *VIPS_IMAGE_SIZEOF_LINE(I) + \
  |  |  |  |  ------------------
  |  |  |  |  |  |  386|   171k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  384|   171k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  382|   171k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  420|   171k|		(X) *VIPS_IMAGE_SIZEOF_PEL(I))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   171k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   171k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2343|  19.0k|	va_end(ap);
 2344|       |
 2345|  19.0k|	return matrix;
 2346|  19.0k|}
vips_image_new_from_image:
 2422|  19.0k|{
 2423|  19.0k|	VipsObject *scope = (VipsObject *) vips_image_new();
 2424|  19.0k|	VipsImage **t = (VipsImage **) vips_object_local_array(scope, 5);
 2425|       |
 2426|  19.0k|	double *ones;
 2427|  19.0k|	int i;
 2428|  19.0k|	VipsImage *result;
 2429|       |
 2430|  19.0k|	if (!(ones = VIPS_ARRAY(scope, n, double))) {
  ------------------
  |  |   72|  19.0k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  19.0k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  19.0k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  19.0k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  19.0k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2430:6): [True: 0, False: 19.0k]
  ------------------
 2431|      0|		g_object_unref(scope);
 2432|      0|		return NULL;
 2433|      0|	}
 2434|  38.1k|	for (i = 0; i < n; i++)
  ------------------
  |  Branch (2434:14): [True: 19.0k, False: 19.0k]
  ------------------
 2435|  19.0k|		ones[i] = 1.0;
 2436|       |
 2437|  19.0k|	if (vips_black(&t[0], 1, 1, NULL) ||
  ------------------
  |  Branch (2437:6): [True: 0, False: 19.0k]
  ------------------
 2438|  19.0k|		vips_linear(t[0], &t[1], ones, (double *) c, n, NULL) ||
  ------------------
  |  Branch (2438:3): [True: 0, False: 19.0k]
  ------------------
 2439|  19.0k|		vips_cast(t[1], &t[2], image->BandFmt, NULL) ||
  ------------------
  |  Branch (2439:3): [True: 0, False: 19.0k]
  ------------------
 2440|  19.0k|		vips_embed(t[2], &t[3], 0, 0, image->Xsize, image->Ysize,
  ------------------
  |  Branch (2440:3): [True: 0, False: 19.0k]
  ------------------
 2441|  19.0k|			"extend", VIPS_EXTEND_COPY, NULL) ||
 2442|  19.0k|		vips_copy(t[3], &t[4],
  ------------------
  |  Branch (2442:3): [True: 0, False: 19.0k]
  ------------------
 2443|  19.0k|			"interpretation", image->Type,
 2444|  19.0k|			"xres", image->Xres,
 2445|  19.0k|			"yres", image->Yres,
 2446|  19.0k|			"xoffset", image->Xoffset,
 2447|  19.0k|			"yoffset", image->Yoffset,
 2448|  19.0k|			NULL)) {
 2449|      0|		g_object_unref(scope);
 2450|      0|		return NULL;
 2451|      0|	}
 2452|       |
 2453|  19.0k|	result = t[4];
 2454|  19.0k|	g_object_ref(result);
 2455|       |
 2456|  19.0k|	g_object_unref(scope);
 2457|       |
 2458|  19.0k|	return result;
 2459|  19.0k|}
vips_image_new_from_image1:
 2476|  19.0k|{
 2477|  19.0k|	return vips_image_new_from_image(image, (const double *) &c, 1);
 2478|  19.0k|}
vips_get_disc_threshold:
 2517|  19.0k|{
 2518|  19.0k|	static gboolean done = FALSE;
  ------------------
  |  |  794|  19.0k|#define	FALSE	(0)
  ------------------
 2519|  19.0k|	static guint64 threshold;
 2520|       |
 2521|  19.0k|	if (!done) {
  ------------------
  |  Branch (2521:6): [True: 1, False: 19.0k]
  ------------------
 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|  19.0k|	return threshold;
 2546|  19.0k|}
vips_image_write:
 2625|   633k|{
 2626|       |	/* image needs to stay alive for this call. It can be unreffed during
 2627|       |	 * the generate.
 2628|       |	 */
 2629|   633k|	g_object_ref(image);
 2630|       |
 2631|   633k|	if (vips_image_pio_input(image) ||
  ------------------
  |  Branch (2631:6): [True: 0, False: 633k]
  ------------------
 2632|   633k|		vips_image_pipelinev(out,
  ------------------
  |  Branch (2632:3): [True: 0, False: 633k]
  ------------------
 2633|   633k|			VIPS_DEMAND_STYLE_THINSTRIP, image, NULL)) {
 2634|      0|		g_object_unref(image);
 2635|      0|		return -1;
 2636|      0|	}
 2637|       |
 2638|   633k|	if (vips_image_generate(out,
  ------------------
  |  Branch (2638:6): [True: 9.17k, False: 624k]
  ------------------
 2639|   633k|			vips_start_one, vips_image_write_gen, vips_stop_one,
 2640|   633k|			image, NULL)) {
 2641|  9.17k|		g_object_unref(image);
 2642|  9.17k|		return -1;
 2643|  9.17k|	}
 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|   624k|	if (vips_image_ispartial(out)) {
  ------------------
  |  Branch (2652:6): [True: 427k, False: 197k]
  ------------------
 2653|   427k|		vips_object_local(out, image);
  ------------------
  |  |  698|   427k|	(g_signal_connect(V, "close", G_CALLBACK(vips_object_local_cb), G))
  |  |  ------------------
  |  |  |  |  491|   427k|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  |  |  ------------------
  ------------------
 2654|   427k|	}
 2655|   197k|	else {
 2656|   197k|		vips__reorder_clear(out);
 2657|   197k|		vips__link_break_all(out);
 2658|   197k|		g_object_unref(image);
 2659|   197k|	}
 2660|       |
 2661|   624k|	return 0;
 2662|   633k|}
vips_image_decode:
 2925|   989k|{
 2926|       |	/* Keep in sync with vips__vector_to_ink().
 2927|       |	 */
 2928|   989k|	if (in->Coding == VIPS_CODING_LABQ) {
  ------------------
  |  Branch (2928:6): [True: 89, False: 989k]
  ------------------
 2929|     89|		if (vips_LabQ2Lab(in, out, NULL))
  ------------------
  |  Branch (2929:7): [True: 0, False: 89]
  ------------------
 2930|      0|			return -1;
 2931|     89|	}
 2932|   989k|	else if (in->Coding == VIPS_CODING_RAD) {
  ------------------
  |  Branch (2932:11): [True: 200, False: 988k]
  ------------------
 2933|    200|		if (vips_rad2float(in, out, NULL))
  ------------------
  |  Branch (2933:7): [True: 0, False: 200]
  ------------------
 2934|      0|			return -1;
 2935|    200|	}
 2936|   988k|	else {
 2937|   988k|		if (vips_copy(in, out, NULL))
  ------------------
  |  Branch (2937:7): [True: 0, False: 988k]
  ------------------
 2938|      0|			return -1;
 2939|   988k|	}
 2940|       |
 2941|   989k|	return 0;
 2942|   989k|}
vips_image_decode_predict:
 2958|   231k|{
 2959|   231k|	VipsBandFormat format;
 2960|   231k|	int bands;
 2961|       |
 2962|   231k|	if (in->Coding == VIPS_CODING_LABQ) {
  ------------------
  |  Branch (2962:6): [True: 0, False: 231k]
  ------------------
 2963|      0|		bands = 3;
 2964|      0|		format = VIPS_FORMAT_FLOAT;
 2965|      0|	}
 2966|   231k|	else if (in->Coding == VIPS_CODING_RAD) {
  ------------------
  |  Branch (2966:11): [True: 0, False: 231k]
  ------------------
 2967|      0|		bands = 3;
 2968|      0|		format = VIPS_FORMAT_FLOAT;
 2969|      0|	}
 2970|   231k|	else {
 2971|   231k|		bands = in->Bands;
 2972|   231k|		format = in->BandFmt;
 2973|   231k|	}
 2974|       |
 2975|   231k|	if (out_bands)
  ------------------
  |  Branch (2975:6): [True: 231k, False: 0]
  ------------------
 2976|   231k|		*out_bands = bands;
 2977|   231k|	if (out_format)
  ------------------
  |  Branch (2977:6): [True: 17, False: 231k]
  ------------------
 2978|     17|		*out_format = format;
 2979|       |
 2980|   231k|	return 0;
 2981|   231k|}
vips_image_encode:
 2998|     17|{
 2999|     17|	if (coding == VIPS_CODING_LABQ) {
  ------------------
  |  Branch (2999:6): [True: 0, False: 17]
  ------------------
 3000|      0|		if (vips_Lab2LabQ(in, out, NULL))
  ------------------
  |  Branch (3000:7): [True: 0, False: 0]
  ------------------
 3001|      0|			return -1;
 3002|      0|	}
 3003|     17|	else if (coding == VIPS_CODING_RAD) {
  ------------------
  |  Branch (3003:11): [True: 0, False: 17]
  ------------------
 3004|      0|		if (vips_float2rad(in, out, NULL))
  ------------------
  |  Branch (3004:7): [True: 0, False: 0]
  ------------------
 3005|      0|			return -1;
 3006|      0|	}
 3007|     17|	else {
 3008|     17|		if (vips_copy(in, out, NULL))
  ------------------
  |  Branch (3008:7): [True: 0, False: 17]
  ------------------
 3009|      0|			return -1;
 3010|     17|	}
 3011|       |
 3012|     17|	return 0;
 3013|     17|}
vips_image_ispartial:
 3068|   624k|{
 3069|   624k|	if (image->dtype == VIPS_IMAGE_PARTIAL)
  ------------------
  |  Branch (3069:6): [True: 427k, False: 197k]
  ------------------
 3070|   427k|		return 1;
 3071|   197k|	else
 3072|   197k|		return 0;
 3073|   624k|}
vips_image_hasalpha:
 3087|  19.0k|{
 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|  19.0k|	switch (image->Type) {
 3094|  4.06k|	case VIPS_INTERPRETATION_B_W:
  ------------------
  |  Branch (3094:2): [True: 4.06k, False: 15.0k]
  ------------------
 3095|  4.38k|	case VIPS_INTERPRETATION_GREY16:
  ------------------
  |  Branch (3095:2): [True: 324, False: 18.7k]
  ------------------
 3096|  4.38k|		return image->Bands > 1;
 3097|       |
 3098|      0|	case VIPS_INTERPRETATION_RGB:
  ------------------
  |  Branch (3098:2): [True: 0, False: 19.0k]
  ------------------
 3099|      0|	case VIPS_INTERPRETATION_CMC:
  ------------------
  |  Branch (3099:2): [True: 0, False: 19.0k]
  ------------------
 3100|      0|	case VIPS_INTERPRETATION_LCH:
  ------------------
  |  Branch (3100:2): [True: 0, False: 19.0k]
  ------------------
 3101|    119|	case VIPS_INTERPRETATION_LABS:
  ------------------
  |  Branch (3101:2): [True: 119, False: 18.9k]
  ------------------
 3102|  10.7k|	case VIPS_INTERPRETATION_sRGB:
  ------------------
  |  Branch (3102:2): [True: 10.6k, False: 8.48k]
  ------------------
 3103|  10.7k|	case VIPS_INTERPRETATION_YXY:
  ------------------
  |  Branch (3103:2): [True: 0, False: 19.0k]
  ------------------
 3104|  10.9k|	case VIPS_INTERPRETATION_XYZ:
  ------------------
  |  Branch (3104:2): [True: 262, False: 18.8k]
  ------------------
 3105|  11.0k|	case VIPS_INTERPRETATION_LAB:
  ------------------
  |  Branch (3105:2): [True: 47, False: 19.0k]
  ------------------
 3106|  12.8k|	case VIPS_INTERPRETATION_RGB16:
  ------------------
  |  Branch (3106:2): [True: 1.84k, False: 17.2k]
  ------------------
 3107|  13.1k|	case VIPS_INTERPRETATION_scRGB:
  ------------------
  |  Branch (3107:2): [True: 283, False: 18.8k]
  ------------------
 3108|  13.1k|	case VIPS_INTERPRETATION_HSV:
  ------------------
  |  Branch (3108:2): [True: 0, False: 19.0k]
  ------------------
 3109|  13.1k|		return image->Bands > 3;
 3110|       |
 3111|    840|	case VIPS_INTERPRETATION_CMYK:
  ------------------
  |  Branch (3111:2): [True: 840, False: 18.2k]
  ------------------
 3112|    840|		return image->Bands > 4;
 3113|       |
 3114|    704|	default:
  ------------------
  |  Branch (3114:2): [True: 704, False: 18.3k]
  ------------------
 3115|       |		/* We can't really infer anything about bands from things like
 3116|       |		 * HISTOGRAM or FOURIER.
 3117|       |		 */
 3118|    704|		return FALSE;
  ------------------
  |  |  794|    704|#define	FALSE	(0)
  ------------------
 3119|  19.0k|	}
 3120|  19.0k|}
vips_image_write_prepare:
 3137|   303k|{
 3138|   303k|	g_assert(vips_object_sanity(VIPS_OBJECT(image)));
  ------------------
  |  |  166|   303k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   303k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   303k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3139|       |
 3140|   303k|	if (image->Xsize <= 0 ||
  ------------------
  |  Branch (3140:6): [True: 0, False: 303k]
  ------------------
 3141|   303k|		image->Ysize <= 0 ||
  ------------------
  |  Branch (3141:3): [True: 0, False: 303k]
  ------------------
 3142|   303k|		image->Bands <= 0) {
  ------------------
  |  Branch (3142:3): [True: 0, False: 303k]
  ------------------
 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|   303k|	image->Bbits = vips_format_sizeof(image->BandFmt) << 3;
 3151|       |
 3152|   303k|	if (image->dtype == VIPS_IMAGE_PARTIAL) {
  ------------------
  |  Branch (3152:6): [True: 15.6k, False: 287k]
  ------------------
 3153|  15.6k|		VIPS_DEBUG_MSG("vips_image_write_prepare: old-style output for %s\n",
  ------------------
  |  |   47|  15.6k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  15.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  15.6k|	{ \
  |  |   49|  15.6k|		; \
  |  |   50|  15.6k|	} \
  |  |   51|  15.6k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  15.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3154|  15.6k|			image->filename);
 3155|       |
 3156|  15.6k|		image->dtype = VIPS_IMAGE_SETBUF;
 3157|  15.6k|	}
 3158|       |
 3159|   303k|	switch (image->dtype) {
 3160|      0|	case VIPS_IMAGE_MMAPINRW:
  ------------------
  |  Branch (3160:2): [True: 0, False: 303k]
  ------------------
 3161|      0|	case VIPS_IMAGE_SETBUF_FOREIGN:
  ------------------
  |  Branch (3161:2): [True: 0, False: 303k]
  ------------------
 3162|      0|		break;
 3163|       |
 3164|   303k|	case VIPS_IMAGE_SETBUF:
  ------------------
  |  Branch (3164:2): [True: 303k, False: 0]
  ------------------
 3165|   303k|		if (!image->data &&
  ------------------
  |  Branch (3165:7): [True: 303k, False: 0]
  ------------------
 3166|   303k|			!(image->data = vips_tracked_malloc(
  ------------------
  |  Branch (3166:4): [True: 0, False: 303k]
  ------------------
 3167|   303k|				  VIPS_IMAGE_SIZEOF_IMAGE(image))))
  ------------------
  |  |  388|   303k|	(VIPS_IMAGE_SIZEOF_LINE(I) * (I)->Ysize)
  |  |  ------------------
  |  |  |  |  386|   303k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   303k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   303k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3168|      0|			return -1;
 3169|       |
 3170|   303k|		break;
 3171|       |
 3172|   303k|	case VIPS_IMAGE_OPENOUT:
  ------------------
  |  Branch (3172:2): [True: 0, False: 303k]
  ------------------
 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: 303k]
  ------------------
 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|   303k|	}
 3182|       |
 3183|   303k|	return 0;
 3184|   303k|}
vips_image_copy_memory:
 3346|   190k|{
 3347|   190k|	VipsImage *new;
 3348|       |
 3349|   190k|	switch (image->dtype) {
 3350|      0|	case VIPS_IMAGE_SETBUF:
  ------------------
  |  Branch (3350:2): [True: 0, False: 190k]
  ------------------
 3351|      0|	case VIPS_IMAGE_SETBUF_FOREIGN:
  ------------------
  |  Branch (3351:2): [True: 0, False: 190k]
  ------------------
 3352|      0|	case VIPS_IMAGE_MMAPIN:
  ------------------
  |  Branch (3352:2): [True: 0, False: 190k]
  ------------------
 3353|      0|	case VIPS_IMAGE_MMAPINRW:
  ------------------
  |  Branch (3353:2): [True: 0, False: 190k]
  ------------------
 3354|       |		/* Can read from all these, in principle anyway.
 3355|       |		 */
 3356|      0|		new = image;
 3357|      0|		g_object_ref(new);
 3358|      0|		break;
 3359|       |
 3360|      0|	case VIPS_IMAGE_OPENOUT:
  ------------------
  |  Branch (3360:2): [True: 0, False: 190k]
  ------------------
 3361|      0|	case VIPS_IMAGE_OPENIN:
  ------------------
  |  Branch (3361:2): [True: 0, False: 190k]
  ------------------
 3362|   190k|	case VIPS_IMAGE_PARTIAL:
  ------------------
  |  Branch (3362:2): [True: 190k, False: 0]
  ------------------
 3363|   190k|		new = vips_image_new_memory();
 3364|   190k|		if (vips_image_write(image, new)) {
  ------------------
  |  Branch (3364:7): [True: 0, False: 190k]
  ------------------
 3365|      0|			g_object_unref(new);
 3366|      0|			return NULL;
 3367|      0|		}
 3368|   190k|		break;
 3369|       |
 3370|   190k|	default:
  ------------------
  |  Branch (3370:2): [True: 0, False: 190k]
  ------------------
 3371|      0|		vips_error("vips_image_copy_memory",
 3372|      0|			"%s", _("image not readable"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 3373|      0|		return NULL;
 3374|   190k|	}
 3375|       |
 3376|   190k|	return new;
 3377|   190k|}
vips_image_pio_input:
 3628|  1.95M|{
 3629|  1.95M|	g_assert(vips_object_sanity(VIPS_OBJECT(image)));
  ------------------
  |  |  166|  1.95M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  1.95M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.95M|#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|  1.95M|	switch (image->dtype) {
 3637|   394k|	case VIPS_IMAGE_SETBUF:
  ------------------
  |  Branch (3637:2): [True: 394k, False: 1.55M]
  ------------------
 3638|   394k|	case VIPS_IMAGE_SETBUF_FOREIGN:
  ------------------
  |  Branch (3638:2): [True: 0, False: 1.95M]
  ------------------
 3639|       |		/* Should have been written to.
 3640|       |		 */
 3641|   394k|		if (!image->data) {
  ------------------
  |  Branch (3641:7): [True: 0, False: 394k]
  ------------------
 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|   394k|		image->start_fn = NULL;
 3650|   394k|		image->generate_fn = NULL;
 3651|   394k|		image->stop_fn = NULL;
 3652|       |
 3653|   394k|		break;
 3654|       |
 3655|  1.55M|	case VIPS_IMAGE_PARTIAL:
  ------------------
  |  Branch (3655:2): [True: 1.55M, False: 394k]
  ------------------
 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|  1.55M|		break;
 3661|       |
 3662|      0|	case VIPS_IMAGE_MMAPIN:
  ------------------
  |  Branch (3662:2): [True: 0, False: 1.95M]
  ------------------
 3663|      0|	case VIPS_IMAGE_MMAPINRW:
  ------------------
  |  Branch (3663:2): [True: 0, False: 1.95M]
  ------------------
 3664|      0|	case VIPS_IMAGE_OPENIN:
  ------------------
  |  Branch (3664:2): [True: 0, False: 1.95M]
  ------------------
 3665|      0|		break;
 3666|       |
 3667|      0|	case VIPS_IMAGE_OPENOUT:
  ------------------
  |  Branch (3667:2): [True: 0, False: 1.95M]
  ------------------
 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: 1.95M]
  ------------------
 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|  1.95M|	}
 3682|       |
 3683|  1.95M|	return 0;
 3684|  1.95M|}
vips_band_format_isint:
 3745|   370k|{
 3746|   370k|	switch (format) {
 3747|  89.9k|	case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (3747:2): [True: 89.9k, False: 280k]
  ------------------
 3748|  90.0k|	case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (3748:2): [True: 131, False: 370k]
  ------------------
 3749|   116k|	case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (3749:2): [True: 26.8k, False: 343k]
  ------------------
 3750|   117k|	case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (3750:2): [True: 114, False: 370k]
  ------------------
 3751|   117k|	case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (3751:2): [True: 605, False: 369k]
  ------------------
 3752|   117k|	case VIPS_FORMAT_INT:
  ------------------
  |  Branch (3752:2): [True: 4, False: 370k]
  ------------------
 3753|   117k|		return TRUE;
  ------------------
  |  |  798|   117k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|   117k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 3754|       |
 3755|   252k|	case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (3755:2): [True: 252k, False: 117k]
  ------------------
 3756|   252k|	case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (3756:2): [True: 0, False: 370k]
  ------------------
 3757|   252k|	case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (3757:2): [True: 0, False: 370k]
  ------------------
 3758|   252k|	case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (3758:2): [True: 0, False: 370k]
  ------------------
 3759|   252k|		return FALSE;
  ------------------
  |  |  794|   252k|#define	FALSE	(0)
  ------------------
 3760|       |
 3761|      0|	default:
  ------------------
  |  Branch (3761:2): [True: 0, False: 370k]
  ------------------
 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|   370k|	}
 3765|   370k|}
vips_band_format_isuint:
 3775|  54.9k|{
 3776|  54.9k|	switch (format) {
 3777|  4.05k|	case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (3777:2): [True: 4.05k, False: 50.8k]
  ------------------
 3778|  6.86k|	case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (3778:2): [True: 2.80k, False: 52.1k]
  ------------------
 3779|  14.6k|	case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (3779:2): [True: 7.83k, False: 47.0k]
  ------------------
 3780|  14.6k|		return TRUE;
  ------------------
  |  |  798|  14.6k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  14.6k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 3781|       |
 3782|  8.20k|	case VIPS_FORMAT_INT:
  ------------------
  |  Branch (3782:2): [True: 8.20k, False: 46.7k]
  ------------------
 3783|  8.90k|	case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (3783:2): [True: 702, False: 54.2k]
  ------------------
 3784|  15.4k|	case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (3784:2): [True: 6.54k, False: 48.3k]
  ------------------
 3785|  40.2k|	case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (3785:2): [True: 24.7k, False: 30.1k]
  ------------------
 3786|  40.2k|	case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (3786:2): [True: 0, False: 54.9k]
  ------------------
 3787|  40.2k|	case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (3787:2): [True: 0, False: 54.9k]
  ------------------
 3788|  40.2k|	case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (3788:2): [True: 0, False: 54.9k]
  ------------------
 3789|  40.2k|		return FALSE;
  ------------------
  |  |  794|  40.2k|#define	FALSE	(0)
  ------------------
 3790|       |
 3791|      0|	default:
  ------------------
  |  Branch (3791:2): [True: 0, False: 54.9k]
  ------------------
 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|  54.9k|	}
 3795|  54.9k|}
vips_band_format_is8bit:
 3805|  2.28k|{
 3806|  2.28k|	switch (format) {
 3807|      0|	case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (3807:2): [True: 0, False: 2.28k]
  ------------------
 3808|      0|	case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (3808:2): [True: 0, False: 2.28k]
  ------------------
 3809|      0|		return TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 3810|       |
 3811|  1.86k|	case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (3811:2): [True: 1.86k, False: 418]
  ------------------
 3812|  1.91k|	case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (3812:2): [True: 46, False: 2.23k]
  ------------------
 3813|  1.91k|	case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (3813:2): [True: 0, False: 2.28k]
  ------------------
 3814|  1.91k|	case VIPS_FORMAT_INT:
  ------------------
  |  Branch (3814:2): [True: 0, False: 2.28k]
  ------------------
 3815|  2.28k|	case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (3815:2): [True: 372, False: 1.91k]
  ------------------
 3816|  2.28k|	case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (3816:2): [True: 0, False: 2.28k]
  ------------------
 3817|  2.28k|	case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (3817:2): [True: 0, False: 2.28k]
  ------------------
 3818|  2.28k|	case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (3818:2): [True: 0, False: 2.28k]
  ------------------
 3819|  2.28k|		return FALSE;
  ------------------
  |  |  794|  2.28k|#define	FALSE	(0)
  ------------------
 3820|       |
 3821|      0|	default:
  ------------------
  |  Branch (3821:2): [True: 0, False: 2.28k]
  ------------------
 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|  2.28k|	}
 3825|  2.28k|}
vips_band_format_isfloat:
 3835|   345k|{
 3836|   345k|	switch (format) {
 3837|   326k|	case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (3837:2): [True: 326k, False: 19.0k]
  ------------------
 3838|   326k|	case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (3838:2): [True: 0, False: 345k]
  ------------------
 3839|   326k|		return TRUE;
  ------------------
  |  |  798|   326k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|   326k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 3840|       |
 3841|  16.3k|	case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (3841:2): [True: 16.3k, False: 329k]
  ------------------
 3842|  16.4k|	case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (3842:2): [True: 80, False: 345k]
  ------------------
 3843|  17.0k|	case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (3843:2): [True: 662, False: 345k]
  ------------------
 3844|  17.6k|	case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (3844:2): [True: 538, False: 345k]
  ------------------
 3845|  18.6k|	case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (3845:2): [True: 994, False: 344k]
  ------------------
 3846|  19.0k|	case VIPS_FORMAT_INT:
  ------------------
  |  Branch (3846:2): [True: 426, False: 345k]
  ------------------
 3847|  19.0k|	case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (3847:2): [True: 0, False: 345k]
  ------------------
 3848|  19.0k|	case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (3848:2): [True: 0, False: 345k]
  ------------------
 3849|  19.0k|		return FALSE;
  ------------------
  |  |  794|  19.0k|#define	FALSE	(0)
  ------------------
 3850|       |
 3851|      0|	default:
  ------------------
  |  Branch (3851:2): [True: 0, False: 345k]
  ------------------
 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|   345k|	}
 3855|   345k|}
vips_band_format_iscomplex:
 3865|  1.49M|{
 3866|  1.49M|	switch (format) {
 3867|      0|	case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (3867:2): [True: 0, False: 1.49M]
  ------------------
 3868|      0|	case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (3868:2): [True: 0, False: 1.49M]
  ------------------
 3869|      0|		return TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 3870|       |
 3871|  67.4k|	case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (3871:2): [True: 67.4k, False: 1.42M]
  ------------------
 3872|  68.4k|	case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (3872:2): [True: 984, False: 1.49M]
  ------------------
 3873|  72.1k|	case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (3873:2): [True: 3.71k, False: 1.48M]
  ------------------
 3874|  73.6k|	case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (3874:2): [True: 1.44k, False: 1.49M]
  ------------------
 3875|  76.3k|	case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (3875:2): [True: 2.69k, False: 1.49M]
  ------------------
 3876|  77.8k|	case VIPS_FORMAT_INT:
  ------------------
  |  Branch (3876:2): [True: 1.48k, False: 1.49M]
  ------------------
 3877|  1.49M|	case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (3877:2): [True: 1.41M, False: 77.8k]
  ------------------
 3878|  1.49M|	case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (3878:2): [True: 0, False: 1.49M]
  ------------------
 3879|  1.49M|		return FALSE;
  ------------------
  |  |  794|  1.49M|#define	FALSE	(0)
  ------------------
 3880|       |
 3881|      0|	default:
  ------------------
  |  Branch (3881:2): [True: 0, False: 1.49M]
  ------------------
 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|  1.49M|	}
 3885|  1.49M|}
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|  2.76M|{
  428|  2.76M|	VipsImage *image = VIPS_IMAGE(gobject);
  ------------------
  |  |  171|  2.76M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  2.76M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  2.76M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  172|  2.76M|		VIPS_TYPE_IMAGE, VipsImage))
  ------------------
  429|       |
  430|  2.76M|	VIPS_DEBUG_MSG("vips_image_finalize: %p\n", gobject);
  ------------------
  |  |   47|  2.76M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.76M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  2.76M|	{ \
  |  |   49|  2.76M|		; \
  |  |   50|  2.76M|	} \
  |  |   51|  2.76M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.76M|#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|  2.76M|	g_assert(!image->regions);
  ------------------
  |  |  166|  2.76M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.76M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.76M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  436|       |
  437|       |	/* Therefore there should be no windows.
  438|       |	 */
  439|  2.76M|	g_assert(!image->windows);
  ------------------
  |  |  166|  2.76M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.76M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.76M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  440|       |
  441|       |	/* Junk generate functions.
  442|       |	 */
  443|  2.76M|	image->start_fn = NULL;
  444|  2.76M|	image->generate_fn = NULL;
  445|  2.76M|	image->stop_fn = NULL;
  446|  2.76M|	image->client1 = NULL;
  447|  2.76M|	image->client2 = NULL;
  448|       |
  449|       |	/* No more upstream/downstream links.
  450|       |	 */
  451|  2.76M|	vips__link_break_all(image);
  452|       |
  453|  2.76M|	if (image->time) {
  ------------------
  |  Branch (453:6): [True: 40.5k, False: 2.71M]
  ------------------
  454|  40.5k|		VIPS_FREEF(g_timer_destroy, image->time->start);
  ------------------
  |  |   41|  40.5k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  40.5k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  40.5k|	{ \
  |  |   43|  40.5k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 40.5k, False: 0]
  |  |  ------------------
  |  |   44|  40.5k|			(void) F((S)); \
  |  |   45|  40.5k|			(S) = 0; \
  |  |   46|  40.5k|		} \
  |  |   47|  40.5k|	} \
  |  |   48|  40.5k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  40.5k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  455|  40.5k|		VIPS_FREE(image->time);
  ------------------
  |  |   50|  40.5k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  40.5k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  40.5k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  40.5k|	{ \
  |  |  |  |   43|  40.5k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 40.5k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  40.5k|			(void) F((S)); \
  |  |  |  |   45|  40.5k|			(S) = 0; \
  |  |  |  |   46|  40.5k|		} \
  |  |  |  |   47|  40.5k|	} \
  |  |  |  |   48|  40.5k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  40.5k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  456|  40.5k|	}
  457|       |
  458|       |	/* Free attached memory.
  459|       |	 */
  460|  2.76M|	if (image->data) {
  ------------------
  |  Branch (460:6): [True: 303k, False: 2.45M]
  ------------------
  461|   303k|		if (image->dtype == VIPS_IMAGE_SETBUF) {
  ------------------
  |  Branch (461:7): [True: 303k, False: 0]
  ------------------
  462|   303k|			VIPS_DEBUG_MSG("vips_image_finalize: freeing buffer\n");
  ------------------
  |  |   47|   303k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   303k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   303k|	{ \
  |  |   49|   303k|		; \
  |  |   50|   303k|	} \
  |  |   51|   303k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   303k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  463|   303k|			vips_tracked_free(image->data);
  464|   303k|			image->dtype = VIPS_IMAGE_NONE;
  465|   303k|		}
  466|       |
  467|   303k|		image->data = NULL;
  468|   303k|	}
  469|       |
  470|       |	/* Delete associated files.
  471|       |	 */
  472|  2.76M|	vips_image_delete(image);
  473|       |
  474|  2.76M|	VIPS_FREEF(vips_g_mutex_free, image->sslock);
  ------------------
  |  |   41|  2.76M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.76M|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  2.76M|	{ \
  |  |   43|  2.76M|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 2.76M, False: 0]
  |  |  ------------------
  |  |   44|  2.76M|			(void) F((S)); \
  |  |   45|  2.76M|			(S) = 0; \
  |  |   46|  2.76M|		} \
  |  |   47|  2.76M|	} \
  |  |   48|  2.76M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.76M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  475|       |
  476|  2.76M|	VIPS_FREE(image->Hist);
  ------------------
  |  |   50|  2.76M|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  2.76M|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  2.76M|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  2.76M|	{ \
  |  |  |  |   43|  2.76M|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 0, False: 2.76M]
  |  |  |  |  ------------------
  |  |  |  |   44|      0|			(void) F((S)); \
  |  |  |  |   45|      0|			(S) = 0; \
  |  |  |  |   46|      0|		} \
  |  |  |  |   47|  2.76M|	} \
  |  |  |  |   48|  2.76M|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  2.76M|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  477|  2.76M|	VIPS_FREEF(vips__gslist_gvalue_free, image->history_list);
  ------------------
  |  |   41|  2.76M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.76M|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  2.76M|	{ \
  |  |   43|  2.76M|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 2.76M]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|  2.76M|	} \
  |  |   48|  2.76M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.76M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  478|  2.76M|	vips__meta_destroy(image);
  479|       |
  480|  2.76M|	G_OBJECT_CLASS(vips_image_parent_class)->finalize(gobject);
  ------------------
  |  |   58|  2.76M|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  2.76M|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  2.76M|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  481|  2.76M|}
image.c:vips_image_delete:
  413|  2.76M|{
  414|  2.76M|	if (image->delete_on_close) {
  ------------------
  |  Branch (414:6): [True: 0, False: 2.76M]
  ------------------
  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|  2.76M|}
image.c:vips_image_dispose:
  485|  2.76M|{
  486|  2.76M|	VipsImage *image = VIPS_IMAGE(gobject);
  ------------------
  |  |  171|  2.76M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  2.76M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  2.76M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  172|  2.76M|		VIPS_TYPE_IMAGE, VipsImage))
  ------------------
  487|       |
  488|  2.76M|	VIPS_DEBUG_MSG("vips_image_dispose: %p\n", gobject);
  ------------------
  |  |   47|  2.76M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.76M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  2.76M|	{ \
  |  |   49|  2.76M|		; \
  |  |   50|  2.76M|	} \
  |  |   51|  2.76M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.76M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  489|       |
  490|  2.76M|#ifdef DEBUG_LEAK
  491|  2.76M|	{
  492|  2.76M|		VipsImagePixels *pixels = g_object_get_qdata(G_OBJECT(image),
  ------------------
  |  |   51|  2.76M|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|  2.76M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  2.76M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  493|  2.76M|			vips__image_pixels_quark);
  494|       |
  495|  2.76M|		if (pixels &&
  ------------------
  |  Branch (495:7): [True: 2.76M, False: 0]
  ------------------
  496|  2.76M|			pixels->tpels) {
  ------------------
  |  Branch (496:4): [True: 159k, False: 2.60M]
  ------------------
  497|   159k|			int compute_percent = 100.0 * pixels->npels / pixels->tpels;
  498|       |
  499|   159k|			if (compute_percent > 100)
  ------------------
  |  Branch (499:8): [True: 0, False: 159k]
  ------------------
  500|      0|				printf("vips_image_dispose: %s %s computed %d%%\n",
  501|      0|					image->filename,
  502|      0|					pixels->nickname,
  503|      0|					compute_percent);
  504|   159k|		}
  505|  2.76M|	}
  506|  2.76M|#endif /*DEBUG_LEAK*/
  507|       |
  508|  2.76M|	vips_object_preclose(VIPS_OBJECT(gobject));
  ------------------
  |  |  433|  2.76M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  2.76M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  2.76M|#  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|  2.76M|	if (image->baseaddr) {
  ------------------
  |  Branch (517:6): [True: 0, False: 2.76M]
  ------------------
  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|  2.76M|	if (image->fd != -1) {
  ------------------
  |  Branch (534:6): [True: 0, False: 2.76M]
  ------------------
  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|  2.76M|	G_OBJECT_CLASS(vips_image_parent_class)->dispose(gobject);
  ------------------
  |  |   58|  2.76M|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  2.76M|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  2.76M|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  544|  2.76M|}
image.c:vips_image_build:
  833|  2.76M|{
  834|  2.76M|	VipsImage *image = VIPS_IMAGE(object);
  ------------------
  |  |  171|  2.76M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  2.76M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  2.76M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  172|  2.76M|		VIPS_TYPE_IMAGE, VipsImage))
  ------------------
  835|  2.76M|	const char *filename = image->filename;
  836|  2.76M|	const char *mode = image->mode;
  837|       |
  838|  2.76M|	guint32 magic;
  839|  2.76M|	guint64 sizeof_image;
  840|       |
  841|  2.76M|	VIPS_DEBUG_MSG("vips_image_build: %p\n", image);
  ------------------
  |  |   47|  2.76M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.76M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  2.76M|	{ \
  |  |   49|  2.76M|		; \
  |  |   50|  2.76M|	} \
  |  |   51|  2.76M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.76M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  842|       |
  843|  2.76M|	if (VIPS_OBJECT_CLASS(vips_image_parent_class)->build(object))
  ------------------
  |  |  435|  2.76M|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  2.76M|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  2.76M|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (843:6): [True: 0, False: 2.76M]
  ------------------
  844|      0|		return -1;
  845|       |
  846|       |	/* Parse the mode string.
  847|       |	 */
  848|  2.76M|	switch (mode[0]) {
  849|      0|	case 'v':
  ------------------
  |  Branch (849:2): [True: 0, False: 2.76M]
  ------------------
  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: 2.76M]
  ------------------
  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: 2.76M]
  ------------------
  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|   289k|	case 't':
  ------------------
  |  Branch (942:2): [True: 289k, False: 2.47M]
  ------------------
  943|   289k|		image->dtype = VIPS_IMAGE_SETBUF;
  944|   289k|		image->dhint = VIPS_DEMAND_STYLE_ANY;
  945|   289k|		break;
  946|       |
  947|  2.47M|	case 'p':
  ------------------
  |  Branch (947:2): [True: 2.47M, False: 289k]
  ------------------
  948|  2.47M|		image->dtype = VIPS_IMAGE_PARTIAL;
  949|  2.47M|		break;
  950|       |
  951|      0|	case 'a':
  ------------------
  |  Branch (951:2): [True: 0, False: 2.76M]
  ------------------
  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: 2.76M]
  ------------------
  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: 2.76M]
  ------------------
 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|  2.76M|	}
 1007|       |
 1008|  2.76M|	vips_image_add_progress(image);
 1009|       |
 1010|  2.76M|	return 0;
 1011|  2.76M|}
image.c:vips_image_add_progress:
  803|  2.76M|{
  804|  2.76M|	if (vips__progress ||
  ------------------
  |  Branch (804:6): [True: 0, False: 2.76M]
  ------------------
  805|  2.76M|		g_getenv("VIPS_PROGRESS")
  ------------------
  |  Branch (805:3): [True: 0, False: 2.76M]
  ------------------
  806|       |#if ENABLE_DEPRECATED
  807|       |		|| g_getenv("IM_PROGRESS")
  808|       |#endif
  809|  2.76M|	) {
  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|  2.76M|}
image.c:vips_image_real_written:
 1046|  2.61M|{
 1047|  2.61M|	VIPS_DEBUG_MSG("vips_image_real_written: %p\n", image);
  ------------------
  |  |   47|  2.61M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.61M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  2.61M|	{ \
  |  |   49|  2.61M|		; \
  |  |   50|  2.61M|	} \
  |  |   51|  2.61M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.61M|#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|  2.61M|	if (image->dtype == VIPS_IMAGE_OPENOUT &&
  ------------------
  |  Branch (1051:6): [True: 0, False: 2.61M]
  ------------------
 1052|  2.61M|		vips__writehist(image))
  ------------------
  |  Branch (1052:3): [True: 0, False: 0]
  ------------------
 1053|      0|		*result = -1;
 1054|  2.61M|}
image.c:vips_image_real_minimise:
 1040|  5.65M|{
 1041|  5.65M|	VIPS_DEBUG_MSG("vips_image_real_minimise: %p\n", image);
  ------------------
  |  |   47|  5.65M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  5.65M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  5.65M|	{ \
  |  |   49|  5.65M|		; \
  |  |   50|  5.65M|	} \
  |  |   51|  5.65M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  5.65M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1042|  5.65M|}
image.c:vips_image_init:
 1333|  2.76M|{
 1334|  2.76M|	VIPS_DEBUG_MSG("vips_image_init: %p\n", image);
  ------------------
  |  |   47|  2.76M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.76M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  2.76M|	{ \
  |  |   49|  2.76M|		; \
  |  |   50|  2.76M|	} \
  |  |   51|  2.76M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.76M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1335|       |
 1336|       |	/* Default to native order.
 1337|       |	 */
 1338|  2.76M|	image->magic = vips_amiMSBfirst()
  ------------------
  |  Branch (1338:17): [True: 0, False: 2.76M]
  ------------------
 1339|  2.76M|		? VIPS_MAGIC_SPARC
  ------------------
  |  |   55|      0|#define VIPS_MAGIC_SPARC (0x08f2a6b6U)
  ------------------
 1340|  2.76M|		: VIPS_MAGIC_INTEL;
  ------------------
  |  |   54|  5.52M|#define VIPS_MAGIC_INTEL (0xb6a6f208U)
  ------------------
 1341|       |
 1342|  2.76M|	image->Xsize = 1;
 1343|  2.76M|	image->Ysize = 1;
 1344|  2.76M|	image->Bands = 1;
 1345|       |
 1346|  2.76M|	image->Xres = 1.0;
 1347|  2.76M|	image->Yres = 1.0;
 1348|       |
 1349|  2.76M|	image->fd = -1; /* since 0 is stdout */
 1350|  2.76M|	image->sslock = vips_g_mutex_new();
 1351|       |
 1352|  2.76M|	image->sizeof_header = VIPS_SIZEOF_HEADER;
  ------------------
  |  |   57|  2.76M|#define VIPS_SIZEOF_HEADER (64)
  ------------------
 1353|       |
 1354|  2.76M|	image->mode = g_strdup("p");
 1355|       |
 1356|  2.76M|#ifdef DEBUG_LEAK
 1357|  2.76M|	g_object_set_qdata_full(G_OBJECT(image), vips__image_pixels_quark,
  ------------------
  |  |   51|  2.76M|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|  2.76M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  2.76M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1358|  2.76M|		g_new0(VipsImagePixels, 1), (GDestroyNotify) g_free);
  ------------------
  |  |  299|  2.76M|#define g_new0(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc0)
  |  |  ------------------
  |  |  |  |  227|  2.76M|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|  2.76M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|  2.76M|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|  2.76M|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|  2.76M|	  gpointer __p;						\
  |  |  |  |  231|  2.76M|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 2.76M]
  |  |  |  |  ------------------
  |  |  |  |  232|  2.76M|	    __p = g_##func (__n);				\
  |  |  |  |  233|  2.76M|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 2.76M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|  2.76M|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 2.76M]
  |  |  |  |  |  Branch (234:26): [True: 2.76M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|  2.76M|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|  2.76M|	  else							\
  |  |  |  |  237|  2.76M|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|  2.76M|	  __p;							\
  |  |  |  |  239|  2.76M|	}))
  |  |  ------------------
  ------------------
 1359|  2.76M|#endif /*DEBUG_LEAK*/
 1360|  2.76M|}
image.c:vips_image_minimise_all_cb:
 1425|  5.65M|{
 1426|  5.65M|	vips_image_minimise(image);
 1427|       |
 1428|  5.65M|	return NULL;
 1429|  5.65M|}
image.c:vips_image_minimise:
 1417|  5.65M|{
 1418|  5.65M|	VIPS_DEBUG_MSG("vips_image_minimise: %p\n", image);
  ------------------
  |  |   47|  5.65M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  5.65M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  5.65M|	{ \
  |  |   49|  5.65M|		; \
  |  |   50|  5.65M|	} \
  |  |   51|  5.65M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  5.65M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1419|       |
 1420|  5.65M|	g_signal_emit(image, vips_image_signals[SIG_MINIMISE], 0);
 1421|  5.65M|}
image.c:vips_progress_add:
 1475|  46.8k|{
 1476|  46.8k|	VipsProgress *progress;
 1477|       |
 1478|  46.8k|	VIPS_DEBUG_MSG("vips_progress_add: %p\n", image);
  ------------------
  |  |   47|  46.8k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  46.8k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  46.8k|	{ \
  |  |   49|  46.8k|		; \
  |  |   50|  46.8k|	} \
  |  |   51|  46.8k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  46.8k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1479|       |
 1480|  46.8k|	if (!(progress = image->time)) {
  ------------------
  |  Branch (1480:6): [True: 40.5k, False: 6.36k]
  ------------------
 1481|  40.5k|		if (!(image->time = VIPS_NEW(NULL, VipsProgress)))
  ------------------
  |  |   70|  40.5k|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  40.5k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  40.5k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  40.5k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  40.5k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1481:7): [True: 0, False: 40.5k]
  ------------------
 1482|      0|			return -1;
 1483|  40.5k|		progress = image->time;
 1484|       |
 1485|  40.5k|		progress->im = image;
 1486|  40.5k|		progress->start = NULL;
 1487|  40.5k|	}
 1488|       |
 1489|  46.8k|	if (!progress->start)
  ------------------
  |  Branch (1489:6): [True: 40.5k, False: 6.36k]
  ------------------
 1490|  40.5k|		progress->start = g_timer_new();
 1491|       |
 1492|  46.8k|	g_timer_start(progress->start);
 1493|  46.8k|	progress->run = 0;
 1494|  46.8k|	progress->eta = 0;
 1495|  46.8k|	progress->tpels = VIPS_IMAGE_N_PELS(image);
  ------------------
  |  |  392|  46.8k|	((guint64) (I)->Xsize * (I)->Ysize)
  ------------------
 1496|  46.8k|	progress->npels = 0;
 1497|  46.8k|	progress->percent = 0;
 1498|       |
 1499|  46.8k|	return 0;
 1500|  46.8k|}
image.c:vips_progress_update:
 1504|  75.1k|{
 1505|  75.1k|	float prop;
 1506|       |
 1507|  75.1k|	VIPS_DEBUG_MSG("vips_progress_update: %p\n", progress);
  ------------------
  |  |   47|  75.1k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  75.1k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  75.1k|	{ \
  |  |   49|  75.1k|		; \
  |  |   50|  75.1k|	} \
  |  |   51|  75.1k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  75.1k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1508|       |
 1509|  75.1k|	g_assert(progress);
  ------------------
  |  |  166|  75.1k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  75.1k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  75.1k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1510|       |
 1511|  75.1k|	progress->run = g_timer_elapsed(progress->start, NULL);
 1512|  75.1k|	progress->npels = processed;
 1513|  75.1k|	prop = (float) progress->npels / (float) progress->tpels;
 1514|  75.1k|	progress->percent = 100 * prop;
 1515|       |
 1516|       |	/* Don't estimate eta until we are 10% in.
 1517|       |	 */
 1518|  75.1k|	if (prop > 0.1)
  ------------------
  |  Branch (1518:6): [True: 75.1k, False: 1]
  ------------------
 1519|  75.1k|		progress->eta = (1.0 / prop) * progress->run - progress->run;
 1520|  75.1k|}
image.c:vips_image_temp_name:
 1700|  2.68M|{
 1701|  2.68M|	static int global_serial = 0;
 1702|       |
 1703|  2.68M|	int serial = g_atomic_int_add(&global_serial, 1);
  ------------------
  |  |  162|  2.68M|  (G_GNUC_EXTENSION ({                                                       \
  |  |  ------------------
  |  |  |  |   54|  2.68M|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  163|  2.68M|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint));                     \
  |  |  ------------------
  |  |  |  |  745|  2.68M|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  164|  2.68M|    (void) (0 ? *(atomic) ^ (val) : 1);                                      \
  |  |  ------------------
  |  |  |  Branch (164:13): [Folded - Ignored]
  |  |  ------------------
  |  |  165|  2.68M|    (gint) __atomic_fetch_add ((atomic), (val), __ATOMIC_SEQ_CST);           \
  |  |  166|  2.68M|  }))
  ------------------
 1704|       |
 1705|  2.68M|	g_snprintf(name, size, "temp-%d", serial);
 1706|  2.68M|}
image.c:vips_image_write_gen:
 2591|   704k|{
 2592|   704k|	VipsRegion *ir = (VipsRegion *) seq;
 2593|   704k|	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|   704k|	if (vips_region_prepare(ir, r) ||
  ------------------
  |  Branch (2604:6): [True: 124k, False: 579k]
  ------------------
 2605|   704k|		vips_region_region(out_region, ir, r, r->left, r->top))
  ------------------
  |  Branch (2605:3): [True: 0, False: 579k]
  ------------------
 2606|   124k|		return -1;
 2607|       |
 2608|   579k|	return 0;
 2609|   704k|}

vips_max_coord_get:
  154|  57.8k|{
  155|       |	// CLI overrides env var
  156|  57.8k|	const char *as_str = vips__max_coord_arg ?
  ------------------
  |  Branch (156:23): [True: 0, False: 57.8k]
  ------------------
  157|  57.8k|		vips__max_coord_arg : g_getenv("VIPS_MAX_COORD");
  158|       |
  159|  57.8k|	if (as_str) {
  ------------------
  |  Branch (159:6): [True: 0, False: 57.8k]
  ------------------
  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|  57.8k|	else
  165|  57.8k|		return VIPS_DEFAULT_MAX_COORD;
  ------------------
  |  |   65|  57.8k|#define VIPS_DEFAULT_MAX_COORD (100000000)
  ------------------
  166|  57.8k|}
vips_init:
  439|  5.52M|{
  440|  5.52M|	extern GType vips_system_get_type(void);
  441|  5.52M|	extern GType write_thread_state_get_type(void);
  442|  5.52M|	extern GType sink_memory_thread_state_get_type(void);
  443|  5.52M|	extern GType render_thread_state_get_type(void);
  444|  5.52M|	extern GType vips_source_get_type(void);
  445|  5.52M|	extern GType vips_source_custom_get_type(void);
  446|  5.52M|	extern GType vips_target_get_type(void);
  447|  5.52M|	extern GType vips_target_custom_get_type(void);
  448|  5.52M|	extern GType vips_g_input_stream_get_type(void);
  449|       |
  450|  5.52M|	static gboolean started = FALSE;
  ------------------
  |  |  794|  5.52M|#define	FALSE	(0)
  ------------------
  451|  5.52M|	static gboolean done = FALSE;
  ------------------
  |  |  794|  5.52M|#define	FALSE	(0)
  ------------------
  452|  5.52M|	const char *vips_min_stack_size;
  453|  5.52M|	gint64 min_stack_size;
  454|  5.52M|	const char *prefix;
  455|  5.52M|	const char *libdir;
  456|  5.52M|#ifdef ENABLE_NLS
  457|  5.52M|	char *locale;
  458|  5.52M|#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|  5.52M|	if (done)
  ------------------
  |  Branch (464:6): [True: 5.52M, False: 2]
  ------------------
  465|       |		/* Called more than once, we succeeded, just return OK.
  466|       |		 */
  467|  5.52M|		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|  5.52M|{
  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|  5.52M|	if (vips_init("vips"))
  ------------------
  |  Branch (677:6): [True: 0, False: 5.52M]
  ------------------
  678|      0|		vips_error_clear();
  679|  5.52M|}
vips_thread_shutdown:
  699|   233k|{
  700|   233k|	vips__thread_profile_detach();
  701|   233k|	vips__buffer_shutdown();
  702|   233k|}
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|  22.6M|{
  178|  22.6M|	void *buf;
  179|       |
  180|  22.6M|	buf = g_malloc0(size);
  181|       |
  182|  22.6M|	if (object) {
  ------------------
  |  Branch (182:6): [True: 4.44M, False: 18.2M]
  ------------------
  183|  4.44M|		g_signal_connect(object, "postclose",
  ------------------
  |  |  491|  4.44M|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  184|  4.44M|			G_CALLBACK(vips_malloc_cb), buf);
  185|  4.44M|		object->local_memory += size;
  186|  4.44M|	}
  187|       |
  188|  22.6M|	return buf;
  189|  22.6M|}
vips_strdup:
  208|     44|{
  209|     44|	char *str_dup;
  210|       |
  211|     44|	str_dup = g_strdup(str);
  212|       |
  213|     44|	if (object) {
  ------------------
  |  Branch (213:6): [True: 44, False: 0]
  ------------------
  214|     44|		g_signal_connect(object, "postclose",
  ------------------
  |  |  491|     44|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  215|     44|			G_CALLBACK(vips_malloc_cb), str_dup);
  216|     44|		object->local_memory += strlen(str);
  217|     44|	}
  218|       |
  219|     44|	return str_dup;
  220|     44|}
vips_tracked_free:
  234|   303k|{
  235|       |	/* Keep the size of the alloc in the previous 16 bytes. Ensures
  236|       |	 * alignment rules are kept.
  237|       |	 */
  238|   303k|	void *start = (void *) ((char *) s - 16);
  239|   303k|	size_t size = *((size_t *) start);
  240|       |
  241|   303k|	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|   303k|	if (vips_tracked_allocs <= 0)
  ------------------
  |  Branch (247:6): [True: 0, False: 303k]
  ------------------
  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|   303k|	if (vips_tracked_mem < size)
  ------------------
  |  Branch (249:6): [True: 0, False: 303k]
  ------------------
  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|   303k|	vips_tracked_mem -= size;
  253|   303k|	vips_tracked_allocs -= 1;
  254|       |
  255|   303k|	g_mutex_unlock(&vips_tracked_mutex);
  256|       |
  257|   303k|	g_free(start);
  258|       |
  259|   303k|	VIPS_GATE_FREE(size);
  ------------------
  |  |   65|   303k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   303k|#define G_STMT_START  do
  |  |  ------------------
  |  |   66|   303k|	{ \
  |  |   67|   303k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (67:7): [True: 0, False: 303k]
  |  |  ------------------
  |  |   68|   303k|			vips__thread_malloc_free(-((gint64) (SIZE))); \
  |  |   69|   303k|	} \
  |  |   70|   303k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   303k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  260|   303k|}
vips_tracked_aligned_free:
  274|  1.63M|{
  275|  1.63M|	void *start = (size_t *) s - 1;
  276|  1.63M|	size_t size = *((size_t *) start);
  277|       |
  278|  1.63M|	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|  1.63M|	if (vips_tracked_allocs <= 0)
  ------------------
  |  Branch (284:6): [True: 0, False: 1.63M]
  ------------------
  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|  1.63M|	if (vips_tracked_mem < size)
  ------------------
  |  Branch (286:6): [True: 0, False: 1.63M]
  ------------------
  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|  1.63M|	vips_tracked_mem -= size;
  290|  1.63M|	vips_tracked_allocs -= 1;
  291|       |
  292|  1.63M|	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|  1.63M|	free(start);
  298|  1.63M|#endif
  299|       |
  300|  1.63M|	VIPS_GATE_FREE(size);
  ------------------
  |  |   65|  1.63M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.63M|#define G_STMT_START  do
  |  |  ------------------
  |  |   66|  1.63M|	{ \
  |  |   67|  1.63M|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (67:7): [True: 0, False: 1.63M]
  |  |  ------------------
  |  |   68|  1.63M|			vips__thread_malloc_free(-((gint64) (SIZE))); \
  |  |   69|  1.63M|	} \
  |  |   70|  1.63M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.63M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  301|  1.63M|}
vips_tracked_malloc:
  321|   303k|{
  322|   303k|	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|   303k|	size += 16;
  329|       |
  330|   303k|	if (!(buf = g_try_malloc0(size))) {
  ------------------
  |  Branch (330:6): [True: 0, False: 303k]
  ------------------
  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|   303k|	g_mutex_lock(&vips_tracked_mutex);
  345|       |
  346|   303k|	*((size_t *) buf) = size;
  347|   303k|	buf = (void *) ((char *) buf + 16);
  348|       |
  349|   303k|	vips_tracked_mem += size;
  350|   303k|	if (vips_tracked_mem > vips_tracked_mem_highwater)
  ------------------
  |  Branch (350:6): [True: 22, False: 303k]
  ------------------
  351|     22|		vips_tracked_mem_highwater = vips_tracked_mem;
  352|   303k|	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|   303k|	g_mutex_unlock(&vips_tracked_mutex);
  359|       |
  360|   303k|	VIPS_GATE_MALLOC(size);
  ------------------
  |  |   57|   303k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   303k|#define G_STMT_START  do
  |  |  ------------------
  |  |   58|   303k|	{ \
  |  |   59|   303k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (59:7): [True: 0, False: 303k]
  |  |  ------------------
  |  |   60|   303k|			vips__thread_malloc_free((gint64) (SIZE)); \
  |  |   61|   303k|	} \
  |  |   62|   303k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   303k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  361|       |
  362|   303k|	return buf;
  363|   303k|}
vips_tracked_aligned_alloc:
  385|  1.63M|{
  386|  1.63M|	void *buf;
  387|       |
  388|  1.63M|	g_assert(!(align & (align - 1)));
  ------------------
  |  |  166|  1.63M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  1.63M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.63M|#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|  1.63M|	size += sizeof(size_t);
  394|       |
  395|       |#ifdef HAVE__ALIGNED_MALLOC
  396|       |	if (!(buf = _aligned_malloc(size, align))) {
  397|       |#elif defined(HAVE_POSIX_MEMALIGN)
  398|  1.63M|	if (posix_memalign(&buf, align, size)) {
  ------------------
  |  Branch (398:6): [True: 0, False: 1.63M]
  ------------------
  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|  1.63M|	memset(buf, 0, size);
  418|       |
  419|  1.63M|	g_mutex_lock(&vips_tracked_mutex);
  420|       |
  421|  1.63M|	*((size_t *) buf) = size;
  422|       |
  423|  1.63M|	vips_tracked_mem += size;
  424|  1.63M|	if (vips_tracked_mem > vips_tracked_mem_highwater)
  ------------------
  |  Branch (424:6): [True: 196, False: 1.63M]
  ------------------
  425|    196|		vips_tracked_mem_highwater = vips_tracked_mem;
  426|  1.63M|	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|  1.63M|	g_mutex_unlock(&vips_tracked_mutex);
  433|       |
  434|  1.63M|	VIPS_GATE_MALLOC(size);
  ------------------
  |  |   57|  1.63M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.63M|#define G_STMT_START  do
  |  |  ------------------
  |  |   58|  1.63M|	{ \
  |  |   59|  1.63M|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (59:7): [True: 0, False: 1.63M]
  |  |  ------------------
  |  |   60|  1.63M|			vips__thread_malloc_free((gint64) (SIZE)); \
  |  |   61|  1.63M|	} \
  |  |   62|  1.63M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.63M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  435|       |
  436|  1.63M|	return (void *) ((size_t *) buf + 1);
  437|  1.63M|}
vips_tracked_get_mem:
  530|  2.45M|{
  531|  2.45M|	size_t mem;
  532|       |
  533|  2.45M|	g_mutex_lock(&vips_tracked_mutex);
  534|       |
  535|  2.45M|	mem = vips_tracked_mem;
  536|       |
  537|  2.45M|	g_mutex_unlock(&vips_tracked_mutex);
  538|       |
  539|  2.45M|	return mem;
  540|  2.45M|}
vips_tracked_get_files:
  595|  2.45M|{
  596|  2.45M|	int n;
  597|       |
  598|  2.45M|	g_mutex_lock(&vips_tracked_mutex);
  599|       |
  600|  2.45M|	n = vips_tracked_files;
  601|       |
  602|  2.45M|	g_mutex_unlock(&vips_tracked_mutex);
  603|       |
  604|  2.45M|	return n;
  605|  2.45M|}
memory.c:vips_malloc_cb:
  155|  4.44M|{
  156|  4.44M|	g_free(buf);
  157|  4.44M|}

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|  13.6M|{
  271|  13.6M|	if (!object->preclose) {
  ------------------
  |  Branch (271:6): [True: 8.25M, False: 5.35M]
  ------------------
  272|  8.25M|		object->preclose = TRUE;
  ------------------
  |  |  798|  8.25M|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  8.25M|#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|  8.25M|		g_signal_emit(object, vips_object_signals[SIG_PRECLOSE], 0);
  281|  8.25M|	}
  282|  13.6M|}
vips_object_build:
  356|  8.19M|{
  357|  8.19M|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  8.19M|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  8.19M|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  8.19M|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  358|       |
  359|       |	/* Input and output args must both be set.
  360|       |	 */
  361|  8.19M|	VipsArgumentFlags iomask = VIPS_ARGUMENT_INPUT | VIPS_ARGUMENT_OUTPUT;
  362|       |
  363|  8.19M|	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|  8.19M|	if (class->build(object))
  ------------------
  |  Branch (371:6): [True: 29.8k, False: 8.16M]
  ------------------
  372|  29.8k|		return -1;
  373|       |
  374|       |	/* Check all required arguments have been supplied, don't stop on 1st
  375|       |	 * error.
  376|       |	 */
  377|  8.16M|	result = 0;
  378|  8.16M|	(void) vips_argument_map(object,
  379|  8.16M|		vips_object_check_required, &result, &iomask);
  380|       |
  381|       |	/* ... more checks go here.
  382|       |	 */
  383|  8.16M|	object->constructed = TRUE;
  ------------------
  |  |  798|  8.16M|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  8.16M|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  384|       |
  385|       |	/* Only postbuild on success.
  386|       |	 */
  387|  8.16M|	if (!result)
  ------------------
  |  Branch (387:6): [True: 8.16M, False: 67]
  ------------------
  388|  8.16M|		result = vips_object_postbuild(object);
  389|       |
  390|  8.16M|	return result;
  391|  8.19M|}
vips__argument_table_lookup:
  558|   751M|{
  559|   751M|	VipsArgument *argument;
  560|       |
  561|   751M|	g_mutex_lock(&vips__global_lock);
  562|   751M|	argument = (VipsArgument *) g_hash_table_lookup(table, pspec);
  563|   751M|	g_mutex_unlock(&vips__global_lock);
  564|       |
  565|   751M|	return argument;
  566|   751M|}
vips_argument_map:
  596|  42.9M|{
  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|  42.9M|	g_object_ref(object);
  601|       |
  602|   407M|	VIPS_ARGUMENT_FOR_ALL(object,
  ------------------
  |  |  358|  42.9M|	{ \
  |  |  359|  42.9M|		VipsObjectClass *object_class = VIPS_OBJECT_GET_CLASS(OBJECT); \
  |  |  ------------------
  |  |  |  |  441|  42.9M|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  527|  42.9M|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2310|  42.9M|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  360|  42.9M|		GSList *p; \
  |  |  361|  42.9M|\
  |  |  362|   449M|		for (p = object_class->argument_table_traverse; p; p = p->next) { \
  |  |  ------------------
  |  |  |  Branch (362:51): [True: 407M, False: 42.0M]
  |  |  ------------------
  |  |  363|   407M|			VipsArgumentClass *ARG_CLASS = \
  |  |  364|   407M|				(VipsArgumentClass *) p->data; \
  |  |  365|   407M|			VipsArgument *argument = (VipsArgument *) argument_class; \
  |  |  366|   407M|			GParamSpec *PSPEC = argument->pspec; \
  |  |  367|   407M|			VipsArgumentInstance *ARG_INSTANCE G_GNUC_UNUSED = \
  |  |  368|   407M|				vips__argument_get_instance(argument_class, \
  |  |  369|   407M|					VIPS_OBJECT(OBJECT));
  |  |  ------------------
  |  |  |  |  433|   407M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|   407M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|   407M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  603|   407M|		pspec, argument_class, argument_instance)
  604|   407M|	{
  605|   407M|		void *result;
  606|       |
  607|       |		/* argument_instance should not be NULL.
  608|       |		 */
  609|   407M|		g_assert(argument_instance);
  ------------------
  |  |  166|   407M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   407M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   407M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  610|       |
  611|   407M|		if ((result = fn(object, pspec,
  ------------------
  |  Branch (611:7): [True: 919k, False: 406M]
  ------------------
  612|   407M|				 argument_class, argument_instance, a, b))) {
  613|   919k|			g_object_unref(object);
  614|   919k|			return result;
  615|   919k|		}
  616|   407M|	}
  617|   407M|	VIPS_ARGUMENT_FOR_ALL_END
  ------------------
  |  |  372|   407M|	} \
  |  |  373|  42.9M|	}
  ------------------
  618|       |
  619|  42.0M|	g_object_unref(object);
  620|       |
  621|  42.0M|	return NULL;
  622|  42.9M|}
vips__argument_get_instance:
  750|   645M|{
  751|       |	/* Make sure the instance args are built.
  752|       |	 */
  753|   645M|	vips_argument_init(object);
  754|       |
  755|   645M|	return (VipsArgumentInstance *)
  756|   645M|		vips__argument_table_lookup(object->argument_table,
  757|   645M|			((VipsArgument *) argument_class)->pspec);
  758|   645M|}
vips_object_get_argument:
  777|  12.5M|{
  778|  12.5M|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  12.5M|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  12.5M|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  12.5M|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  779|       |
  780|  12.5M|	if (!(*pspec = g_object_class_find_property(G_OBJECT_CLASS(class), name))) {
  ------------------
  |  |   58|  12.5M|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  12.5M|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  12.5M|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (780:6): [True: 0, False: 12.5M]
  ------------------
  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|  12.5M|	if (!(*argument_class = (VipsArgumentClass *)
  ------------------
  |  Branch (785:6): [True: 0, False: 12.5M]
  ------------------
  786|  12.5M|			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|  12.5M|	if (!(*argument_instance = vips__argument_get_instance(
  ------------------
  |  Branch (791:6): [True: 0, False: 12.5M]
  ------------------
  792|  12.5M|		  *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|  12.5M|	return 0;
  798|  12.5M|}
vips_object_argument_isset:
  811|   942k|{
  812|   942k|	GParamSpec *pspec;
  813|   942k|	VipsArgumentClass *argument_class;
  814|   942k|	VipsArgumentInstance *argument_instance;
  815|       |
  816|   942k|	if (vips_object_get_argument(object, name,
  ------------------
  |  Branch (816:6): [True: 0, False: 942k]
  ------------------
  817|   942k|			&pspec, &argument_class, &argument_instance))
  818|      0|		return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  819|       |
  820|   942k|	return argument_instance->assigned;
  821|   942k|}
vips__object_set_member:
 1088|  12.6M|{
 1089|  12.6M|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  12.6M|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  12.6M|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  12.6M|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1090|  12.6M|	VipsArgumentClass *argument_class = (VipsArgumentClass *)
 1091|  12.6M|		vips__argument_table_lookup(class->argument_table, pspec);
 1092|  12.6M|	VipsArgumentInstance *argument_instance =
 1093|  12.6M|		vips__argument_get_instance(argument_class, object);
 1094|  12.6M|	GType otype = G_PARAM_SPEC_VALUE_TYPE(pspec);
  ------------------
  |  |  103|  12.6M|#define	G_PARAM_SPEC_VALUE_TYPE(pspec)	(G_PARAM_SPEC (pspec)->value_type)
  |  |  ------------------
  |  |  |  |   45|  12.6M|#define G_PARAM_SPEC(pspec)		(G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM, GParamSpec))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|  12.6M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|  12.6M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1095|       |
 1096|  12.6M|	g_assert(argument_instance);
  ------------------
  |  |  166|  12.6M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  12.6M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  12.6M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1097|       |
 1098|  12.6M|	vips_object_clear_member(argument_instance);
 1099|       |
 1100|  12.6M|	g_assert(!*member);
  ------------------
  |  |  166|  12.6M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  12.6M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  12.6M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1101|  12.6M|	*member = argument;
 1102|       |
 1103|  12.6M|	if (*member) {
  ------------------
  |  Branch (1103:6): [True: 5.07M, False: 7.54M]
  ------------------
 1104|  5.07M|		if (argument_class->flags & VIPS_ARGUMENT_INPUT) {
  ------------------
  |  Branch (1104:7): [True: 2.68M, False: 2.39M]
  ------------------
 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|  2.68M|			g_object_ref(*member);
 1116|  2.68M|		}
 1117|  2.39M|		else if (argument_class->flags & VIPS_ARGUMENT_OUTPUT) {
  ------------------
  |  Branch (1117:12): [True: 2.39M, 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|  2.39M|			g_object_ref(object);
 1129|  2.39M|		}
 1130|  5.07M|	}
 1131|       |
 1132|  12.6M|	if (*member &&
  ------------------
  |  Branch (1132:6): [True: 5.07M, False: 7.54M]
  ------------------
 1133|  12.6M|		g_type_is_a(otype, VIPS_TYPE_IMAGE)) {
  ------------------
  |  |  169|  5.07M|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  ------------------
  |  Branch (1133:3): [True: 5.06M, False: 6.05k]
  ------------------
 1134|  5.06M|		if (argument_class->flags & VIPS_ARGUMENT_INPUT) {
  ------------------
  |  Branch (1134:7): [True: 2.67M, False: 2.39M]
  ------------------
 1135|  2.67M|			g_assert(!argument_instance->invalidate_id);
  ------------------
  |  |  166|  2.67M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.67M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.67M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1136|       |
 1137|  2.67M|			argument_instance->invalidate_id =
 1138|  2.67M|				g_signal_connect(*member, "invalidate",
  ------------------
  |  |  491|  2.67M|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
 1139|  2.67M|					G_CALLBACK(vips_object_arg_invalidate),
 1140|  2.67M|					argument_instance);
 1141|  2.67M|		}
 1142|  2.39M|		else if (argument_class->flags & VIPS_ARGUMENT_OUTPUT) {
  ------------------
  |  Branch (1142:12): [True: 2.39M, False: 0]
  ------------------
 1143|  2.39M|			g_assert(!argument_instance->close_id);
  ------------------
  |  |  166|  2.39M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.39M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.39M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1144|       |
 1145|  2.39M|			argument_instance->close_id =
 1146|  2.39M|				g_signal_connect(*member, "close",
  ------------------
  |  |  491|  2.39M|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
 1147|  2.39M|					G_CALLBACK(vips_object_arg_close),
 1148|  2.39M|					argument_instance);
 1149|  2.39M|		}
 1150|  5.06M|	}
 1151|  12.6M|}
vips_value_is_null:
 1159|  35.6M|{
 1160|  35.6M|	if (G_IS_PARAM_SPEC_STRING(pspec) &&
  ------------------
  |  |  370|  71.2M|#define G_IS_PARAM_SPEC_STRING(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_STRING))
  |  |  ------------------
  |  |  |  |  497|  35.6M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  35.6M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  35.6M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  35.6M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  35.6M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 35.6M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  35.6M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  35.6M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 35.6M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 27.5M, False: 8.04M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  35.6M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  27.5M|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  27.5M|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  35.6M|  else \
  |  |  |  |  |  | 2321|  35.6M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  35.6M|  __r; \
  |  |  |  |  |  | 2323|  35.6M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (370:44): [True: 27.5M, False: 8.04M]
  |  |  ------------------
  ------------------
 1161|  35.6M|		!g_value_get_string(value))
  ------------------
  |  Branch (1161:3): [True: 27.5M, False: 0]
  ------------------
 1162|  27.5M|		return TRUE;
  ------------------
  |  |  798|  27.5M|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  27.5M|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 1163|  8.04M|	if (G_IS_PARAM_SPEC_OBJECT(pspec) &&
  ------------------
  |  |  491|  16.0M|#define G_IS_PARAM_SPEC_OBJECT(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OBJECT))
  |  |  ------------------
  |  |  |  |  497|  8.04M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  8.04M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  8.04M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  8.04M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  8.04M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 8.04M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  8.04M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  8.04M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 8.04M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 7.38M, False: 659k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  8.04M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  7.38M|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  7.38M|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  8.04M|  else \
  |  |  |  |  |  | 2321|  8.04M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  8.04M|  __r; \
  |  |  |  |  |  | 2323|  8.04M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (491:44): [True: 7.38M, False: 659k]
  |  |  ------------------
  ------------------
 1164|  8.04M|		!g_value_get_object(value))
  ------------------
  |  Branch (1164:3): [True: 7.38M, False: 0]
  ------------------
 1165|  7.38M|		return TRUE;
  ------------------
  |  |  798|  7.38M|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  7.38M|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 1166|   659k|	if (G_IS_PARAM_SPEC_POINTER(pspec) &&
  ------------------
  |  |  439|  1.31M|#define G_IS_PARAM_SPEC_POINTER(pspec)     (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_POINTER))
  |  |  ------------------
  |  |  |  |  497|   659k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   659k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   659k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   659k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   659k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 659k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   659k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   659k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 659k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 0, False: 659k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   659k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   659k|  else \
  |  |  |  |  |  | 2321|   659k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   659k|  __r; \
  |  |  |  |  |  | 2323|   659k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (439:44): [True: 0, False: 659k]
  |  |  ------------------
  ------------------
 1167|   659k|		!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|   659k|	if (G_IS_PARAM_SPEC_BOXED(pspec) &&
  ------------------
  |  |  416|  1.31M|#define G_IS_PARAM_SPEC_BOXED(pspec)       (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOXED))
  |  |  ------------------
  |  |  |  |  497|   659k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   659k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   659k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   659k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   659k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 659k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   659k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   659k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 659k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 659k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   659k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|   659k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|   659k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   659k|  else \
  |  |  |  |  |  | 2321|   659k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   659k|  __r; \
  |  |  |  |  |  | 2323|   659k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (416:44): [True: 659k, False: 0]
  |  |  ------------------
  ------------------
 1170|   659k|		!g_value_get_boxed(value))
  ------------------
  |  Branch (1170:3): [True: 659k, False: 0]
  ------------------
 1171|   659k|		return TRUE;
  ------------------
  |  |  798|   659k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|   659k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 1172|       |
 1173|      0|	return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
 1174|   659k|}
vips_object_set_property:
 1181|  60.4M|{
 1182|  60.4M|	VipsObject *object = VIPS_OBJECT(gobject);
  ------------------
  |  |  433|  60.4M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  60.4M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  60.4M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1183|  60.4M|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(gobject);
  ------------------
  |  |  441|  60.4M|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  60.4M|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  60.4M|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1184|  60.4M|	VipsArgumentClass *argument_class = (VipsArgumentClass *)
 1185|  60.4M|		vips__argument_table_lookup(class->argument_table, pspec);
 1186|  60.4M|	VipsArgumentInstance *argument_instance =
 1187|  60.4M|		vips__argument_get_instance(argument_class, object);
 1188|       |
 1189|  60.4M|	g_assert(argument_instance);
  ------------------
  |  |  166|  60.4M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  60.4M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  60.4M|#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|  60.4M|	g_assert(((VipsArgument *) argument_class)->pspec == pspec);
  ------------------
  |  |  166|  60.4M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  60.4M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  60.4M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1209|  60.4M|	g_assert(((VipsArgument *) argument_instance)->pspec == pspec);
  ------------------
  |  |  166|  60.4M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  60.4M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  60.4M|#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|  60.4M|	if (argument_class->flags & VIPS_ARGUMENT_CONSTRUCT &&
  ------------------
  |  Branch (1214:6): [True: 26.9M, False: 33.5M]
  ------------------
 1215|  60.4M|		object->constructed &&
  ------------------
  |  Branch (1215:3): [True: 13.7M, False: 13.1M]
  ------------------
 1216|  60.4M|		!vips_value_is_null(pspec, value)) {
  ------------------
  |  Branch (1216:3): [True: 0, False: 13.7M]
  ------------------
 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|  60.4M|	if (argument_class->flags & VIPS_ARGUMENT_SET_ONCE &&
  ------------------
  |  Branch (1226:6): [True: 43.8M, False: 16.5M]
  ------------------
 1227|  60.4M|		argument_instance->assigned &&
  ------------------
  |  Branch (1227:3): [True: 21.8M, False: 22.0M]
  ------------------
 1228|  60.4M|		!vips_value_is_null(pspec, value)) {
  ------------------
  |  Branch (1228:3): [True: 0, False: 21.8M]
  ------------------
 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|  60.4M|	if (G_IS_PARAM_SPEC_STRING(pspec)) {
  ------------------
  |  |  370|  60.4M|#define G_IS_PARAM_SPEC_STRING(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_STRING))
  |  |  ------------------
  |  |  |  |  497|  60.4M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  60.4M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  60.4M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  60.4M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  60.4M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 60.4M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  60.4M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  60.4M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 60.4M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 44.0M, False: 16.3M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  60.4M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  44.0M|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  44.0M|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  60.4M|  else \
  |  |  |  |  |  | 2321|  60.4M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  60.4M|  __r; \
  |  |  |  |  |  | 2323|  60.4M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (370:44): [True: 44.0M, False: 16.3M]
  |  |  ------------------
  ------------------
 1240|  44.0M|		char **member = &G_STRUCT_MEMBER(char *, object,
  ------------------
  |  |  842|  44.0M|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|  44.0M|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1241|  44.0M|			argument_class->offset);
 1242|       |
 1243|  44.0M|		if (*member)
  ------------------
  |  Branch (1243:7): [True: 24.5M, False: 19.4M]
  ------------------
 1244|  24.5M|			g_free(*member);
 1245|  44.0M|		*member = g_value_dup_string(value);
 1246|  44.0M|	}
 1247|  16.3M|	else if (G_IS_PARAM_SPEC_OBJECT(pspec)) {
  ------------------
  |  |  491|  16.3M|#define G_IS_PARAM_SPEC_OBJECT(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OBJECT))
  |  |  ------------------
  |  |  |  |  497|  16.3M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  16.3M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  16.3M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  16.3M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  16.3M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 16.3M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  16.3M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  16.3M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 16.3M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 12.6M, False: 3.73M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  16.3M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  12.6M|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  12.6M|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  16.3M|  else \
  |  |  |  |  |  | 2321|  16.3M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  16.3M|  __r; \
  |  |  |  |  |  | 2323|  16.3M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (491:44): [True: 12.6M, False: 3.73M]
  |  |  ------------------
  ------------------
 1248|  12.6M|		GObject **member = &G_STRUCT_MEMBER(GObject *, object,
  ------------------
  |  |  842|  12.6M|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|  12.6M|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1249|  12.6M|			argument_class->offset);
 1250|       |
 1251|  12.6M|		vips__object_set_member(object, pspec, member,
 1252|  12.6M|			g_value_get_object(value));
 1253|  12.6M|	}
 1254|  3.73M|	else if (G_IS_PARAM_SPEC_INT(pspec)) {
  ------------------
  |  |  117|  3.73M|#define G_IS_PARAM_SPEC_INT(pspec)         (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_INT))
  |  |  ------------------
  |  |  |  |  497|  3.73M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  3.73M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  3.73M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  3.73M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  3.73M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 3.73M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  3.73M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  3.73M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 3.73M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 1.33M, False: 2.40M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  3.73M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  1.33M|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  1.33M|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  3.73M|  else \
  |  |  |  |  |  | 2321|  3.73M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  3.73M|  __r; \
  |  |  |  |  |  | 2323|  3.73M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (117:44): [True: 1.33M, False: 2.40M]
  |  |  ------------------
  ------------------
 1255|  1.33M|		int *member = &G_STRUCT_MEMBER(int, object,
  ------------------
  |  |  842|  1.33M|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|  1.33M|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1256|  1.33M|			argument_class->offset);
 1257|       |
 1258|  1.33M|		*member = g_value_get_int(value);
 1259|  1.33M|	}
 1260|  2.40M|	else if (G_IS_PARAM_SPEC_UINT64(pspec)) {
  ------------------
  |  |  232|  2.40M|#define G_IS_PARAM_SPEC_UINT64(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_UINT64))
  |  |  ------------------
  |  |  |  |  497|  2.40M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  2.40M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  2.40M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  2.40M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  2.40M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 2.40M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  2.40M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  2.40M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 2.40M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 0, False: 2.40M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  2.40M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  2.40M|  else \
  |  |  |  |  |  | 2321|  2.40M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  2.40M|  __r; \
  |  |  |  |  |  | 2323|  2.40M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (232:44): [True: 0, False: 2.40M]
  |  |  ------------------
  ------------------
 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|  2.40M|	else if (G_IS_PARAM_SPEC_BOOLEAN(pspec)) {
  ------------------
  |  |   94|  2.40M|#define G_IS_PARAM_SPEC_BOOLEAN(pspec)     (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOOLEAN))
  |  |  ------------------
  |  |  |  |  497|  2.40M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  2.40M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  2.40M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  2.40M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  2.40M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 2.40M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  2.40M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  2.40M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 2.40M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 21.7k, False: 2.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  2.40M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  21.7k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  21.7k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  2.40M|  else \
  |  |  |  |  |  | 2321|  2.40M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  2.40M|  __r; \
  |  |  |  |  |  | 2323|  2.40M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (94:44): [True: 21.7k, False: 2.38M]
  |  |  ------------------
  ------------------
 1267|  21.7k|		gboolean *member = &G_STRUCT_MEMBER(gboolean, object,
  ------------------
  |  |  842|  21.7k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|  21.7k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1268|  21.7k|			argument_class->offset);
 1269|       |
 1270|  21.7k|		*member = g_value_get_boolean(value);
 1271|  21.7k|	}
 1272|  2.38M|	else if (G_IS_PARAM_SPEC_ENUM(pspec)) {
  ------------------
  |  |  278|  2.38M|#define G_IS_PARAM_SPEC_ENUM(pspec)        (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_ENUM))
  |  |  ------------------
  |  |  |  |  497|  2.38M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  2.38M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  2.38M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  2.38M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  2.38M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 2.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  2.38M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  2.38M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 2.38M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 870k, False: 1.51M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  2.38M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|   870k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|   870k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  2.38M|  else \
  |  |  |  |  |  | 2321|  2.38M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  2.38M|  __r; \
  |  |  |  |  |  | 2323|  2.38M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (278:44): [True: 870k, False: 1.51M]
  |  |  ------------------
  ------------------
 1273|   870k|		int *member = &G_STRUCT_MEMBER(int, object,
  ------------------
  |  |  842|   870k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|   870k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1274|   870k|			argument_class->offset);
 1275|       |
 1276|   870k|		*member = g_value_get_enum(value);
 1277|   870k|	}
 1278|  1.51M|	else if (G_IS_PARAM_SPEC_FLAGS(pspec)) {
  ------------------
  |  |  301|  1.51M|#define G_IS_PARAM_SPEC_FLAGS(pspec)       (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_FLAGS))
  |  |  ------------------
  |  |  |  |  497|  1.51M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  1.51M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  1.51M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  1.51M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  1.51M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 1.51M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  1.51M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  1.51M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 1.51M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 25.9k, False: 1.48M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  1.51M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  25.9k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  25.9k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  1.51M|  else \
  |  |  |  |  |  | 2321|  1.51M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  1.51M|  __r; \
  |  |  |  |  |  | 2323|  1.51M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (301:44): [True: 25.9k, False: 1.48M]
  |  |  ------------------
  ------------------
 1279|  25.9k|		int *member = &G_STRUCT_MEMBER(int, object,
  ------------------
  |  |  842|  25.9k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|  25.9k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1280|  25.9k|			argument_class->offset);
 1281|       |
 1282|  25.9k|		*member = g_value_get_flags(value);
 1283|  25.9k|	}
 1284|  1.48M|	else if (G_IS_PARAM_SPEC_POINTER(pspec)) {
  ------------------
  |  |  439|  1.48M|#define G_IS_PARAM_SPEC_POINTER(pspec)     (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_POINTER))
  |  |  ------------------
  |  |  |  |  497|  1.48M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  1.48M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  1.48M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  1.48M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  1.48M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 1.48M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  1.48M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  1.48M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 1.48M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 0, False: 1.48M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  1.48M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  1.48M|  else \
  |  |  |  |  |  | 2321|  1.48M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  1.48M|  __r; \
  |  |  |  |  |  | 2323|  1.48M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (439:44): [True: 0, False: 1.48M]
  |  |  ------------------
  ------------------
 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|  1.48M|	else if (G_IS_PARAM_SPEC_DOUBLE(pspec)) {
  ------------------
  |  |  347|  1.48M|#define G_IS_PARAM_SPEC_DOUBLE(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_DOUBLE))
  |  |  ------------------
  |  |  |  |  497|  1.48M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  1.48M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  1.48M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  1.48M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  1.48M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 1.48M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  1.48M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  1.48M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 1.48M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 245k, False: 1.24M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  1.48M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|   245k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|   245k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  1.48M|  else \
  |  |  |  |  |  | 2321|  1.48M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  1.48M|  __r; \
  |  |  |  |  |  | 2323|  1.48M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (347:44): [True: 245k, False: 1.24M]
  |  |  ------------------
  ------------------
 1291|   245k|		double *member = &G_STRUCT_MEMBER(double, object,
  ------------------
  |  |  842|   245k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|   245k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1292|   245k|			argument_class->offset);
 1293|       |
 1294|   245k|		*member = g_value_get_double(value);
 1295|   245k|	}
 1296|  1.24M|	else if (G_IS_PARAM_SPEC_BOXED(pspec)) {
  ------------------
  |  |  416|  1.24M|#define G_IS_PARAM_SPEC_BOXED(pspec)       (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOXED))
  |  |  ------------------
  |  |  |  |  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: 1.24M, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  1.24M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  1.24M|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  1.24M|#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 (416:44): [True: 1.24M, False: 0]
  |  |  ------------------
  ------------------
 1297|  1.24M|		gpointer *member = &G_STRUCT_MEMBER(gpointer, object,
  ------------------
  |  |  842|  1.24M|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|  1.24M|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1298|  1.24M|			argument_class->offset);
 1299|       |
 1300|  1.24M|		if (*member) {
  ------------------
  |  Branch (1300:7): [True: 647k, False: 595k]
  ------------------
 1301|   647k|			g_boxed_free(G_PARAM_SPEC_VALUE_TYPE(pspec),
  ------------------
  |  |  103|   647k|#define	G_PARAM_SPEC_VALUE_TYPE(pspec)	(G_PARAM_SPEC (pspec)->value_type)
  |  |  ------------------
  |  |  |  |   45|   647k|#define G_PARAM_SPEC(pspec)		(G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM, GParamSpec))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|   647k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|   647k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1302|   647k|				*member);
 1303|   647k|			*member = NULL;
 1304|   647k|		}
 1305|       |
 1306|       |		/* Copy the boxed into our pointer (will use eg.
 1307|       |		 * vips__object_vector_dup()).
 1308|       |		 */
 1309|  1.24M|		*member = g_value_dup_boxed(value);
 1310|  1.24M|	}
 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|  60.4M|	argument_instance->assigned = TRUE;
  ------------------
  |  |  798|  60.4M|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  60.4M|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 1322|  60.4M|}
vips_object_get_property:
 1329|  20.3M|{
 1330|  20.3M|	VipsObject *object = VIPS_OBJECT(gobject);
  ------------------
  |  |  433|  20.3M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  20.3M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  20.3M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1331|  20.3M|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(gobject);
  ------------------
  |  |  441|  20.3M|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  20.3M|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  20.3M|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1332|  20.3M|	VipsArgumentClass *argument_class = (VipsArgumentClass *)
 1333|  20.3M|		vips__argument_table_lookup(class->argument_table, pspec);
 1334|  20.3M|	VipsArgumentInstance *argument_instance =
 1335|  20.3M|		vips__argument_get_instance(argument_class, object);
 1336|       |
 1337|  20.3M|	g_assert(((VipsArgument *) argument_class)->pspec == pspec);
  ------------------
  |  |  166|  20.3M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  20.3M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  20.3M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1338|       |
 1339|  20.3M|	if (!argument_instance->assigned) {
  ------------------
  |  Branch (1339:6): [True: 0, False: 20.3M]
  ------------------
 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|  20.3M|	if (G_IS_PARAM_SPEC_STRING(pspec)) {
  ------------------
  |  |  370|  20.3M|#define G_IS_PARAM_SPEC_STRING(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_STRING))
  |  |  ------------------
  |  |  |  |  497|  20.3M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  20.3M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  20.3M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  20.3M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  20.3M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 20.3M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  20.3M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  20.3M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 20.3M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 3.59k, False: 20.3M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  20.3M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  3.59k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  3.59k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  20.3M|  else \
  |  |  |  |  |  | 2321|  20.3M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  20.3M|  __r; \
  |  |  |  |  |  | 2323|  20.3M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (370:44): [True: 3.59k, False: 20.3M]
  |  |  ------------------
  ------------------
 1350|  3.59k|		char *member = G_STRUCT_MEMBER(char *, object,
  ------------------
  |  |  842|  3.59k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|  3.59k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1351|  3.59k|			argument_class->offset);
 1352|       |
 1353|  3.59k|		g_value_set_string(value, member);
 1354|  3.59k|	}
 1355|  20.3M|	else if (G_IS_PARAM_SPEC_OBJECT(pspec)) {
  ------------------
  |  |  491|  20.3M|#define G_IS_PARAM_SPEC_OBJECT(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OBJECT))
  |  |  ------------------
  |  |  |  |  497|  20.3M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  20.3M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  20.3M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  20.3M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  20.3M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 20.3M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  20.3M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  20.3M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 20.3M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 14.0M, False: 6.29M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  20.3M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  14.0M|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  14.0M|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  20.3M|  else \
  |  |  |  |  |  | 2321|  20.3M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  20.3M|  __r; \
  |  |  |  |  |  | 2323|  20.3M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (491:44): [True: 14.0M, False: 6.29M]
  |  |  ------------------
  ------------------
 1356|  14.0M|		GObject **member = &G_STRUCT_MEMBER(GObject *, object,
  ------------------
  |  |  842|  14.0M|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|  14.0M|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1357|  14.0M|			argument_class->offset);
 1358|       |
 1359|  14.0M|		g_value_set_object(value, *member);
 1360|  14.0M|	}
 1361|  6.29M|	else if (G_IS_PARAM_SPEC_INT(pspec)) {
  ------------------
  |  |  117|  6.29M|#define G_IS_PARAM_SPEC_INT(pspec)         (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_INT))
  |  |  ------------------
  |  |  |  |  497|  6.29M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  6.29M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  6.29M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  6.29M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  6.29M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 6.29M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  6.29M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  6.29M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 6.29M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 3.77M, False: 2.52M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  6.29M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  3.77M|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  3.77M|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  6.29M|  else \
  |  |  |  |  |  | 2321|  6.29M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  6.29M|  __r; \
  |  |  |  |  |  | 2323|  6.29M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (117:44): [True: 3.77M, False: 2.52M]
  |  |  ------------------
  ------------------
 1362|  3.77M|		int *member = &G_STRUCT_MEMBER(int, object,
  ------------------
  |  |  842|  3.77M|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|  3.77M|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1363|  3.77M|			argument_class->offset);
 1364|       |
 1365|  3.77M|		g_value_set_int(value, *member);
 1366|  3.77M|	}
 1367|  2.52M|	else if (G_IS_PARAM_SPEC_UINT64(pspec)) {
  ------------------
  |  |  232|  2.52M|#define G_IS_PARAM_SPEC_UINT64(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_UINT64))
  |  |  ------------------
  |  |  |  |  497|  2.52M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  2.52M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  2.52M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  2.52M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  2.52M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 2.52M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  2.52M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  2.52M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 2.52M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 0, False: 2.52M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  2.52M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  2.52M|  else \
  |  |  |  |  |  | 2321|  2.52M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  2.52M|  __r; \
  |  |  |  |  |  | 2323|  2.52M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (232:44): [True: 0, False: 2.52M]
  |  |  ------------------
  ------------------
 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|  2.52M|	else if (G_IS_PARAM_SPEC_BOOLEAN(pspec)) {
  ------------------
  |  |   94|  2.52M|#define G_IS_PARAM_SPEC_BOOLEAN(pspec)     (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOOLEAN))
  |  |  ------------------
  |  |  |  |  497|  2.52M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  2.52M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  2.52M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  2.52M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  2.52M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 2.52M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  2.52M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  2.52M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 2.52M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 51.6k, False: 2.47M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  2.52M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  51.6k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  51.6k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  2.52M|  else \
  |  |  |  |  |  | 2321|  2.52M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  2.52M|  __r; \
  |  |  |  |  |  | 2323|  2.52M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (94:44): [True: 51.6k, False: 2.47M]
  |  |  ------------------
  ------------------
 1374|  51.6k|		gboolean *member = &G_STRUCT_MEMBER(gboolean, object,
  ------------------
  |  |  842|  51.6k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|  51.6k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1375|  51.6k|			argument_class->offset);
 1376|       |
 1377|  51.6k|		g_value_set_boolean(value, *member);
 1378|  51.6k|	}
 1379|  2.47M|	else if (G_IS_PARAM_SPEC_ENUM(pspec)) {
  ------------------
  |  |  278|  2.47M|#define G_IS_PARAM_SPEC_ENUM(pspec)        (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_ENUM))
  |  |  ------------------
  |  |  |  |  497|  2.47M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  2.47M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  2.47M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  2.47M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  2.47M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 2.47M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  2.47M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  2.47M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 2.47M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 1.37M, False: 1.10M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  2.47M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  1.37M|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  1.37M|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  2.47M|  else \
  |  |  |  |  |  | 2321|  2.47M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  2.47M|  __r; \
  |  |  |  |  |  | 2323|  2.47M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (278:44): [True: 1.37M, False: 1.10M]
  |  |  ------------------
  ------------------
 1380|  1.37M|		int *member = &G_STRUCT_MEMBER(int, object,
  ------------------
  |  |  842|  1.37M|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|  1.37M|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1381|  1.37M|			argument_class->offset);
 1382|       |
 1383|  1.37M|		g_value_set_enum(value, *member);
 1384|  1.37M|	}
 1385|  1.10M|	else if (G_IS_PARAM_SPEC_FLAGS(pspec)) {
  ------------------
  |  |  301|  1.10M|#define G_IS_PARAM_SPEC_FLAGS(pspec)       (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_FLAGS))
  |  |  ------------------
  |  |  |  |  497|  1.10M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  1.10M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  1.10M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  1.10M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  1.10M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 1.10M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  1.10M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  1.10M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 1.10M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 0, False: 1.10M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  1.10M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  1.10M|  else \
  |  |  |  |  |  | 2321|  1.10M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  1.10M|  __r; \
  |  |  |  |  |  | 2323|  1.10M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (301:44): [True: 0, False: 1.10M]
  |  |  ------------------
  ------------------
 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|  1.10M|	else if (G_IS_PARAM_SPEC_POINTER(pspec)) {
  ------------------
  |  |  439|  1.10M|#define G_IS_PARAM_SPEC_POINTER(pspec)     (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_POINTER))
  |  |  ------------------
  |  |  |  |  497|  1.10M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  1.10M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  1.10M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  1.10M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  1.10M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 1.10M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  1.10M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  1.10M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 1.10M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 0, False: 1.10M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  1.10M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  1.10M|  else \
  |  |  |  |  |  | 2321|  1.10M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  1.10M|  __r; \
  |  |  |  |  |  | 2323|  1.10M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (439:44): [True: 0, False: 1.10M]
  |  |  ------------------
  ------------------
 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|  1.10M|	else if (G_IS_PARAM_SPEC_DOUBLE(pspec)) {
  ------------------
  |  |  347|  1.10M|#define G_IS_PARAM_SPEC_DOUBLE(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_DOUBLE))
  |  |  ------------------
  |  |  |  |  497|  1.10M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  1.10M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  1.10M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  1.10M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  1.10M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 1.10M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  1.10M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  1.10M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 1.10M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 467k, False: 634k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  1.10M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|   467k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|   467k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  1.10M|  else \
  |  |  |  |  |  | 2321|  1.10M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  1.10M|  __r; \
  |  |  |  |  |  | 2323|  1.10M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (347:44): [True: 467k, False: 634k]
  |  |  ------------------
  ------------------
 1398|   467k|		double *member = &G_STRUCT_MEMBER(double, object,
  ------------------
  |  |  842|   467k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|   467k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1399|   467k|			argument_class->offset);
 1400|       |
 1401|   467k|		g_value_set_double(value, *member);
 1402|   467k|	}
 1403|   634k|	else if (G_IS_PARAM_SPEC_BOXED(pspec)) {
  ------------------
  |  |  416|   634k|#define G_IS_PARAM_SPEC_BOXED(pspec)       (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOXED))
  |  |  ------------------
  |  |  |  |  497|   634k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   634k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   634k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   634k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   634k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 634k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   634k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   634k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 634k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 634k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   634k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|   634k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|   634k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   634k|  else \
  |  |  |  |  |  | 2321|   634k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   634k|  __r; \
  |  |  |  |  |  | 2323|   634k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (416:44): [True: 634k, False: 0]
  |  |  ------------------
  ------------------
 1404|   634k|		gpointer *member = &G_STRUCT_MEMBER(gpointer, object,
  ------------------
  |  |  842|   634k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|   634k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1405|   634k|			argument_class->offset);
 1406|       |
 1407|       |		/* Copy the boxed into our pointer (will use eg.
 1408|       |		 * vips__object_vector_dup ()).
 1409|       |		 */
 1410|   634k|		g_value_set_boxed(value, *member);
 1411|   634k|	}
 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|  20.3M|}
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|   233k|{
 2362|   233k|	VipsObject *object;
 2363|       |
 2364|   233k|	vips_check_init();
 2365|       |
 2366|   233k|	object = VIPS_OBJECT(g_object_new(type, NULL));
  ------------------
  |  |  433|   233k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|   233k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   233k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2367|       |
 2368|   233k|	if (set && set(object, a, b)) {
  ------------------
  |  Branch (2368:6): [True: 233k, False: 0]
  |  Branch (2368:13): [True: 0, False: 233k]
  ------------------
 2369|      0|		g_object_unref(object);
 2370|      0|		return NULL;
 2371|      0|	}
 2372|       |
 2373|   233k|	if (vips_object_build(object)) {
  ------------------
  |  Branch (2373:6): [True: 0, False: 233k]
  ------------------
 2374|      0|		g_object_unref(object);
 2375|      0|		return NULL;
 2376|      0|	}
 2377|       |
 2378|   233k|	return object;
 2379|   233k|}
vips_object_set_valist:
 2392|  2.48M|{
 2393|  2.48M|	char *name;
 2394|       |
 2395|  2.48M|	VIPS_DEBUG_MSG("vips_object_set_valist:\n");
  ------------------
  |  |   47|  2.48M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.48M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  2.48M|	{ \
  |  |   49|  2.48M|		; \
  |  |   50|  2.48M|	} \
  |  |   51|  2.48M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.48M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2396|       |
 2397|  3.05M|	for (name = va_arg(ap, char *); name; name = va_arg(ap, char *)) {
  ------------------
  |  Branch (2397:34): [True: 578k, False: 2.48M]
  ------------------
 2398|   578k|		GParamSpec *pspec;
 2399|   578k|		VipsArgumentClass *argument_class;
 2400|   578k|		VipsArgumentInstance *argument_instance;
 2401|       |
 2402|   578k|		VIPS_DEBUG_MSG("\tname = '%s' (%p)\n", name, name);
  ------------------
  |  |   47|   578k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   578k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   578k|	{ \
  |  |   49|   578k|		; \
  |  |   50|   578k|	} \
  |  |   51|   578k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   578k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2403|       |
 2404|   578k|		if (vips_object_get_argument(VIPS_OBJECT(object), name,
  ------------------
  |  |  433|   578k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|   578k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   578k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2404:7): [True: 0, False: 578k]
  ------------------
 2405|   578k|				&pspec, &argument_class, &argument_instance))
 2406|      0|			return -1;
 2407|       |
 2408|  1.08M|		VIPS_ARGUMENT_COLLECT_SET(pspec, argument_class, ap);
  ------------------
  |  |  399|   578k|	if ((ARG_CLASS->flags & VIPS_ARGUMENT_INPUT)) { \
  |  |  ------------------
  |  |  |  Branch (399:6): [True: 540k, False: 38.1k]
  |  |  ------------------
  |  |  400|   540k|		GValue value = G_VALUE_INIT; \
  |  |  ------------------
  |  |  |  |  191|   540k|#define G_VALUE_INIT  { 0, { { 0 } } }
  |  |  ------------------
  |  |  401|   540k|		gchar *error = NULL; \
  |  |  402|   540k|\
  |  |  403|   540k|		/* Input args are given inline, eg. ("factor", 12.0) \
  |  |  404|   540k|		 * and must be collected. \
  |  |  405|   540k|		 */ \
  |  |  406|   540k|		G_VALUE_COLLECT_INIT(&value, \
  |  |  ------------------
  |  |  |  |   88|   540k|#define G_VALUE_COLLECT_INIT(value, _value_type, var_args, flags, __error)		\
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   540k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   89|   540k|G_STMT_START {										\
  |  |  |  |   90|   540k|  GValue *g_vci_val = (value);								\
  |  |  |  |   91|   540k|  guint g_vci_flags = (flags);								\
  |  |  |  |   92|   540k|  GTypeValueTable *g_vci_vtab = g_type_value_table_peek (_value_type);			\
  |  |  |  |   93|   540k|  const gchar *g_vci_collect_format = g_vci_vtab->collect_format;					\
  |  |  |  |   94|   540k|  GTypeCValue g_vci_cvalues[G_VALUE_COLLECT_FORMAT_MAX_LENGTH] = { { 0, }, };		\
  |  |  |  |   95|   540k|  guint g_vci_n_values = 0;									\
  |  |  |  |   96|   540k|                                                                                        \
  |  |  |  |   97|   540k|  g_vci_val->g_type = _value_type;		/* value_meminit() from gvalue.c */		\
  |  |  |  |   98|  1.08M|  while (*g_vci_collect_format)								\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (98:10): [True: 540k, False: 540k]
  |  |  |  |  ------------------
  |  |  |  |   99|   540k|    {											\
  |  |  |  |  100|   540k|      GTypeCValue *g_vci_cvalue = g_vci_cvalues + g_vci_n_values++;					\
  |  |  |  |  101|   540k|                                                                                        \
  |  |  |  |  102|   540k|      switch (*g_vci_collect_format++)							\
  |  |  |  |  103|   540k|	{										\
  |  |  |  |  104|   453k|	case G_VALUE_COLLECT_INT:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (104:2): [True: 453k, False: 87.1k]
  |  |  |  |  ------------------
  |  |  |  |  105|   453k|	  g_vci_cvalue->v_int = va_arg ((var_args), gint);					\
  |  |  |  |  106|   453k|	  break;									\
  |  |  |  |  107|      0|	case G_VALUE_COLLECT_LONG:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (107:2): [True: 0, False: 540k]
  |  |  |  |  ------------------
  |  |  |  |  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: 540k]
  |  |  |  |  ------------------
  |  |  |  |  111|      0|	  g_vci_cvalue->v_int64 = va_arg ((var_args), gint64);				\
  |  |  |  |  112|      0|	  break;									\
  |  |  |  |  113|  86.3k|	case G_VALUE_COLLECT_DOUBLE:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (113:2): [True: 86.3k, False: 454k]
  |  |  |  |  ------------------
  |  |  |  |  114|  86.3k|	  g_vci_cvalue->v_double = va_arg ((var_args), gdouble);				\
  |  |  |  |  115|  86.3k|	  break;									\
  |  |  |  |  116|    840|	case G_VALUE_COLLECT_POINTER:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (116:2): [True: 840, False: 539k]
  |  |  |  |  ------------------
  |  |  |  |  117|    840|	  g_vci_cvalue->v_pointer = va_arg ((var_args), gpointer);				\
  |  |  |  |  118|    840|	  break;									\
  |  |  |  |  119|      0|	default:									\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (119:2): [True: 0, False: 540k]
  |  |  |  |  ------------------
  |  |  |  |  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|   540k|	}										\
  |  |  |  |  122|   540k|    }											\
  |  |  |  |  123|   540k|  *(__error) = g_vci_vtab->collect_value (g_vci_val,						\
  |  |  |  |  124|   540k|				       g_vci_n_values,					\
  |  |  |  |  125|   540k|				       g_vci_cvalues,					\
  |  |  |  |  126|   540k|				       g_vci_flags);						\
  |  |  |  |  127|   540k|} G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   540k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  407|   540k|			G_PARAM_SPEC_VALUE_TYPE(PSPEC), AP, 0, &error); \
  |  |  408|   540k|\
  |  |  409|   540k|		/* Don't bother with the error message. \
  |  |  410|   540k|		 */ \
  |  |  411|   540k|		if (error) { \
  |  |  ------------------
  |  |  |  Branch (411:7): [True: 0, False: 540k]
  |  |  ------------------
  |  |  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|  1.08M|		g_object_set_property(G_OBJECT(object), name, &value);
  ------------------
  |  |   51|   540k|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|   540k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   540k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2411|       |
 2412|  1.08M|		VIPS_ARGUMENT_COLLECT_GET(pspec, argument_class, ap);
  ------------------
  |  |  417|   540k|	g_value_unset(&value); \
  |  |  418|   540k|	} \
  |  |  419|   578k|	else if ((ARG_CLASS->flags & VIPS_ARGUMENT_OUTPUT)) \
  |  |  ------------------
  |  |  |  Branch (419:11): [True: 38.1k, False: 0]
  |  |  ------------------
  |  |  420|  38.1k|	{ \
  |  |  421|  38.1k|		void **arg G_GNUC_UNUSED; \
  |  |  422|  38.1k|\
  |  |  423|  38.1k|		/* Output args are a pointer to where to send the \
  |  |  424|  38.1k|		 * result. \
  |  |  425|  38.1k|		 */ \
  |  |  426|  38.1k|		arg = va_arg(AP, void **);
  ------------------
 2413|       |
 2414|  76.3k|		VIPS_ARGUMENT_COLLECT_END
  ------------------
  |  |  429|  38.1k|	}
  ------------------
 2415|   578k|	}
 2416|       |
 2417|  2.48M|	return 0;
 2418|  2.48M|}
vips_object_set_from_string:
 2569|  27.6k|{
 2570|  27.6k|	const char *q;
 2571|  27.6k|	VipsToken token;
 2572|  27.6k|	char buffer[VIPS_PATH_MAX];
 2573|  27.6k|	char str[VIPS_PATH_MAX];
 2574|       |
 2575|  27.6k|	g_strlcpy(buffer, string, VIPS_PATH_MAX);
  ------------------
  |  |  245|  27.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|  27.6k|	if (!(q = vips__token_get(buffer, &token, str, VIPS_PATH_MAX)) ||
  ------------------
  |  |  245|  27.6k|#define VIPS_PATH_MAX (4096)
  ------------------
  |  Branch (2580:6): [True: 27.6k, False: 0]
  ------------------
 2581|  27.6k|		token != VIPS_TOKEN_LEFT)
  ------------------
  |  Branch (2581:3): [True: 0, False: 0]
  ------------------
 2582|  27.6k|		g_snprintf(buffer, VIPS_PATH_MAX, "[%s]", string);
  ------------------
  |  |  245|  27.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|  27.6k|	return vips_object_set_args(object, buffer);
 2587|  27.6k|}
vips_type_map:
 2768|  6.89M|{
 2769|  6.89M|	GType *child;
 2770|  6.89M|	guint n_children;
 2771|  6.89M|	unsigned int i;
 2772|  6.89M|	void *result;
 2773|       |
 2774|  6.89M|	child = g_type_children(base, &n_children);
 2775|  6.89M|	result = NULL;
 2776|  13.7M|	for (i = 0; i < n_children && !result; i++)
  ------------------
  |  Branch (2776:14): [True: 6.98M, False: 6.77M]
  |  Branch (2776:32): [True: 6.86M, False: 123k]
  ------------------
 2777|  6.86M|		result = fn(child[i], a, b);
 2778|  6.89M|	g_free(child);
 2779|       |
 2780|  6.89M|	return result;
 2781|  6.89M|}
vips_class_map_all:
 2822|  6.93M|{
 2823|  6.93M|	void *result;
 2824|       |
 2825|       |	/* Avoid abstract classes. Use type_map_all for them.
 2826|       |	 */
 2827|  6.93M|	if (!G_TYPE_IS_ABSTRACT(type)) {
  ------------------
  |  |  343|  6.93M|#define G_TYPE_IS_ABSTRACT(type)                (g_type_test_flags ((type), G_TYPE_FLAG_ABSTRACT))
  ------------------
  |  Branch (2827:6): [True: 5.61M, False: 1.31M]
  ------------------
 2828|       |		/* We never unref this ref, but we never unload classes
 2829|       |		 * anyway, so so what.
 2830|       |		 */
 2831|  5.61M|		if ((result = fn(
  ------------------
  |  Branch (2831:7): [True: 37.9k, False: 5.57M]
  ------------------
 2832|  5.61M|				 VIPS_OBJECT_CLASS(g_type_class_ref(type)), a)))
  ------------------
  |  |  435|  5.61M|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  5.61M|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  5.61M|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2833|  37.9k|			return result;
 2834|  5.61M|	}
 2835|       |
 2836|  6.89M|	if ((result = vips_type_map(type,
  ------------------
  |  Branch (2836:6): [True: 131k, False: 6.76M]
  ------------------
 2837|  6.89M|			 (VipsTypeMap2Fn) vips_class_map_all, fn, a)))
 2838|   131k|		return result;
 2839|       |
 2840|  6.76M|	return NULL;
 2841|  6.89M|}
vips_class_find:
 2886|  37.9k|{
 2887|  37.9k|	const char *classname = basename ? basename : "VipsObject";
  ------------------
  |  Branch (2887:26): [True: 37.9k, False: 0]
  ------------------
 2888|       |
 2889|  37.9k|	VipsObjectClass *class;
 2890|  37.9k|	GType base;
 2891|       |
 2892|  37.9k|	if (!(base = g_type_from_name(classname)))
  ------------------
  |  Branch (2892:6): [True: 0, False: 37.9k]
  ------------------
 2893|      0|		return NULL;
 2894|  37.9k|	class = vips_class_map_all(base,
 2895|  37.9k|		(VipsClassMapFn) test_name, (void *) nickname);
 2896|       |
 2897|  37.9k|	return class;
 2898|  37.9k|}
vips_type_find:
 2968|  2.48M|{
 2969|  2.48M|	static GOnce once = G_ONCE_INIT;
  ------------------
  |  |  102|  2.48M|#define G_ONCE_INIT { G_ONCE_STATUS_NOTCALLED, NULL }
  ------------------
 2970|       |
 2971|  2.48M|	const char *classname = basename ? basename : "VipsObject";
  ------------------
  |  Branch (2971:26): [True: 2.48M, False: 0]
  ------------------
 2972|       |
 2973|  2.48M|	NicknameGType *hit;
 2974|  2.48M|	GType base;
 2975|  2.48M|	GType type;
 2976|       |
 2977|  2.48M|	VIPS_ONCE(&once, vips_class_build_hash_cb, NULL);
  ------------------
  |  |   93|  2.48M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.48M|#define G_STMT_START  do
  |  |  ------------------
  |  |   94|  2.48M|	{ \
  |  |   95|  2.48M|		if (G_UNLIKELY((ONCE)->status != G_ONCE_STATUS_READY)) \
  |  |  ------------------
  |  |  |  |  935|  2.48M|#define G_UNLIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 0))
  |  |  |  |  ------------------
  |  |  |  |  |  |  926|  2.48M| G_GNUC_EXTENSION ({                            \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  2.48M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  927|  2.48M|   int _g_boolean_var_;                         \
  |  |  |  |  |  |  928|  2.48M|   if (expr)                                    \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (928:8): [True: 1, False: 2.48M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  929|  2.48M|      _g_boolean_var_ = 1;                      \
  |  |  |  |  |  |  930|  2.48M|   else                                         \
  |  |  |  |  |  |  931|  2.48M|      _g_boolean_var_ = 0;                      \
  |  |  |  |  |  |  932|  2.48M|   _g_boolean_var_;                             \
  |  |  |  |  |  |  933|  2.48M|})
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (935:26): [True: 1, False: 2.48M]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   96|  2.48M|			(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.48M|	} \
  |  |   98|  2.48M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.48M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2978|       |
 2979|  2.48M|	hit = (NicknameGType *)
 2980|  2.48M|		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|  2.48M|	if (!(base = g_type_from_name(classname)))
  ------------------
  |  Branch (2985:6): [True: 0, False: 2.48M]
  ------------------
 2986|      0|		return 0;
 2987|  2.48M|	if (hit &&
  ------------------
  |  Branch (2987:6): [True: 2.45M, False: 27.6k]
  ------------------
 2988|  2.48M|		!hit->duplicate &&
  ------------------
  |  Branch (2988:3): [True: 2.44M, False: 10.2k]
  ------------------
 2989|  2.48M|		g_type_is_a(hit->type, base))
  ------------------
  |  Branch (2989:3): [True: 2.44M, False: 0]
  ------------------
 2990|  2.44M|		type = hit->type;
 2991|  37.9k|	else {
 2992|  37.9k|		const VipsObjectClass *class;
 2993|       |
 2994|  37.9k|		if (!(class = vips_class_find(basename, nickname)))
  ------------------
  |  Branch (2994:7): [True: 0, False: 37.9k]
  ------------------
 2995|      0|			return 0;
 2996|       |
 2997|  37.9k|		type = G_OBJECT_CLASS_TYPE(class);
  ------------------
  |  |  114|  37.9k|#define G_OBJECT_CLASS_TYPE(class)  (G_TYPE_FROM_CLASS (class))
  |  |  ------------------
  |  |  |  |  613|  37.9k|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  |  |  ------------------
  ------------------
 2998|  37.9k|	}
 2999|       |
 3000|  2.48M|	return type;
 3001|  2.48M|}
vips_object_local_cb:
 3030|   442k|{
 3031|   442k|	VIPS_FREEF(g_object_unref, gobject);
  ------------------
  |  |   41|   442k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   442k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   442k|	{ \
  |  |   43|   442k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 442k, False: 0]
  |  |  ------------------
  |  |   44|   442k|			(void) F((S)); \
  |  |   45|   442k|			(S) = 0; \
  |  |   46|   442k|		} \
  |  |   47|   442k|	} \
  |  |   48|   442k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   442k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3032|   442k|}
vips_object_local_array:
 3082|  3.28M|{
 3083|  3.28M|	VipsObjectLocal *local;
 3084|       |
 3085|  3.28M|	local = g_new(VipsObjectLocal, 1);
  ------------------
  |  |  282|  3.28M|#define g_new(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc)
  |  |  ------------------
  |  |  |  |  227|  3.28M|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|  3.28M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|  3.28M|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|  3.28M|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|  3.28M|	  gpointer __p;						\
  |  |  |  |  231|  3.28M|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 3.28M]
  |  |  |  |  ------------------
  |  |  |  |  232|  3.28M|	    __p = g_##func (__n);				\
  |  |  |  |  233|  3.28M|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 3.28M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|  3.28M|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 3.28M]
  |  |  |  |  |  Branch (234:26): [True: 3.28M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|  3.28M|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|  3.28M|	  else							\
  |  |  |  |  237|  3.28M|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|  3.28M|	  __p;							\
  |  |  |  |  239|  3.28M|	}))
  |  |  ------------------
  ------------------
 3086|  3.28M|	local->n = n;
 3087|       |	/* Make the array 1 too long so we can be sure there's a NULL
 3088|       |	 * terminator.
 3089|       |	 */
 3090|  3.28M|	local->array = g_new0(VipsObject *, n + 1);
  ------------------
  |  |  299|  3.28M|#define g_new0(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc0)
  |  |  ------------------
  |  |  |  |  227|  3.28M|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|  3.28M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|  3.28M|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|  3.28M|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|  3.28M|	  gpointer __p;						\
  |  |  |  |  231|  3.28M|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 3.28M]
  |  |  |  |  ------------------
  |  |  |  |  232|  3.28M|	    __p = g_##func (__n);				\
  |  |  |  |  233|  3.28M|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 0, False: 3.28M]
  |  |  |  |  ------------------
  |  |  |  |  234|  3.28M|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 0]
  |  |  |  |  |  Branch (234:26): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|  3.28M|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|  3.28M|	  else							\
  |  |  |  |  237|  3.28M|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|  3.28M|	  __p;							\
  |  |  |  |  239|  3.28M|	}))
  |  |  ------------------
  ------------------
 3091|       |
 3092|  3.28M|	g_signal_connect(parent, "close",
  ------------------
  |  |  491|  3.28M|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
 3093|  3.28M|		G_CALLBACK(vips_object_local_array_cb), local);
 3094|       |
 3095|  3.28M|	return local->array;
 3096|  3.28M|}
vips_object_unref_outputs:
 3233|  29.9k|{
 3234|  29.9k|	(void) vips_argument_map(object,
 3235|  29.9k|		vips_object_unref_outputs_sub, NULL, NULL);
 3236|  29.9k|}
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|  8.25M|{
 1001|  8.25M|	VipsObject *object = VIPS_OBJECT(gobject);
  ------------------
  |  |  433|  8.25M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  8.25M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  8.25M|#  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|  8.25M|	vips_object_preclose(object);
 1017|       |
 1018|       |	/* Clear all our arguments: they may be holding resources we should
 1019|       |	 * drop.
 1020|       |	 */
 1021|  8.25M|	vips_argument_dispose_all(object);
 1022|       |
 1023|  8.25M|	vips_object_close(object);
 1024|       |
 1025|  8.25M|	vips_object_postclose(object);
 1026|       |
 1027|  8.25M|	vips_argument_free_all(object);
 1028|       |
 1029|  8.25M|	VIPS_FREEF(vips_argument_table_destroy, object->argument_table);
  ------------------
  |  |   41|  8.25M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  8.25M|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  8.25M|	{ \
  |  |   43|  8.25M|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 8.25M, False: 0]
  |  |  ------------------
  |  |   44|  8.25M|			(void) F((S)); \
  |  |   45|  8.25M|			(S) = 0; \
  |  |   46|  8.25M|		} \
  |  |   47|  8.25M|	} \
  |  |   48|  8.25M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  8.25M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1030|       |
 1031|  8.25M|	G_OBJECT_CLASS(vips_object_parent_class)->dispose(gobject);
  ------------------
  |  |   58|  8.25M|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  8.25M|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  8.25M|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1032|  8.25M|}
object.c:vips_argument_dispose_all:
  947|  8.25M|{
  948|       |#ifdef DEBUG
  949|       |	printf("vips_argument_dispose_all: ");
  950|       |	vips_object_print_name(object);
  951|       |	printf("\n");
  952|       |#endif /*DEBUG*/
  953|       |
  954|  8.25M|	vips_argument_map(object, vips_object_dispose_argument, NULL, NULL);
  955|  8.25M|}
object.c:vips_object_dispose_argument:
  916|  81.4M|{
  917|  81.4M|	g_assert(((VipsArgument *) argument_class)->pspec == pspec);
  ------------------
  |  |  166|  81.4M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  81.4M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  81.4M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  918|  81.4M|	g_assert(((VipsArgument *) argument_instance)->pspec == pspec);
  ------------------
  |  |  166|  81.4M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  81.4M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  81.4M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  919|       |
  920|  81.4M|	if (G_IS_PARAM_SPEC_OBJECT(pspec) ||
  ------------------
  |  |  491|   162M|#define G_IS_PARAM_SPEC_OBJECT(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OBJECT))
  |  |  ------------------
  |  |  |  |  497|  81.4M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  81.4M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  81.4M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  81.4M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  81.4M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 81.4M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  81.4M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  81.4M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 81.4M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 5.15M, False: 76.3M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  81.4M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  5.15M|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  5.15M|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  81.4M|  else \
  |  |  |  |  |  | 2321|  81.4M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  81.4M|  __r; \
  |  |  |  |  |  | 2323|  81.4M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (491:44): [True: 5.15M, False: 76.3M]
  |  |  ------------------
  ------------------
  921|  81.4M|		G_IS_PARAM_SPEC_BOXED(pspec)) {
  ------------------
  |  |  416|  76.3M|#define G_IS_PARAM_SPEC_BOXED(pspec)       (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOXED))
  |  |  ------------------
  |  |  |  |  497|  76.3M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  76.3M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  76.3M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  76.3M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  76.3M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 76.3M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  76.3M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  76.3M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 76.3M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 700k, False: 75.6M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  76.3M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|   700k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|   700k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  76.3M|  else \
  |  |  |  |  |  | 2321|  76.3M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  76.3M|  __r; \
  |  |  |  |  |  | 2323|  76.3M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (416:44): [True: 700k, False: 75.6M]
  |  |  ------------------
  ------------------
  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|  5.85M|		g_object_set(object,
  929|  5.85M|			g_param_spec_get_name(pspec), NULL,
  930|  5.85M|			NULL);
  931|  5.85M|	}
  932|       |
  933|  81.4M|	return NULL;
  934|  81.4M|}
object.c:vips_object_close:
  286|  8.25M|{
  287|  8.25M|	if (!object->close) {
  ------------------
  |  Branch (287:6): [True: 8.25M, False: 0]
  ------------------
  288|  8.25M|		object->close = TRUE;
  ------------------
  |  |  798|  8.25M|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  8.25M|#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|  8.25M|		g_signal_emit(object, vips_object_signals[SIG_CLOSE], 0);
  297|  8.25M|	}
  298|  8.25M|}
object.c:vips_object_postclose:
  302|  8.25M|{
  303|  8.25M|	if (!object->postclose) {
  ------------------
  |  Branch (303:6): [True: 8.25M, False: 0]
  ------------------
  304|  8.25M|		object->postclose = TRUE;
  ------------------
  |  |  798|  8.25M|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  8.25M|#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|  8.25M|		g_signal_emit(object, vips_object_signals[SIG_POSTCLOSE], 0);
  313|  8.25M|	}
  314|  8.25M|}
object.c:vips_argument_free_all:
  988|  8.25M|{
  989|       |#ifdef DEBUG
  990|       |	printf("vips_argument_free_all: ");
  991|       |	vips_object_print_name(object);
  992|       |	printf("\n");
  993|       |#endif /*DEBUG*/
  994|       |
  995|  8.25M|	vips_argument_map(object, vips_object_free_argument, NULL, NULL);
  996|  8.25M|}
object.c:vips_object_free_argument:
  964|  81.4M|{
  965|  81.4M|	g_assert(((VipsArgument *) argument_class)->pspec == pspec);
  ------------------
  |  |  166|  81.4M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  81.4M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  81.4M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  966|  81.4M|	g_assert(((VipsArgument *) argument_instance)->pspec == pspec);
  ------------------
  |  |  166|  81.4M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  81.4M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  81.4M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  967|       |
  968|  81.4M|	if (G_IS_PARAM_SPEC_STRING(pspec)) {
  ------------------
  |  |  370|  81.4M|#define G_IS_PARAM_SPEC_STRING(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_STRING))
  |  |  ------------------
  |  |  |  |  497|  81.4M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  81.4M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  81.4M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  81.4M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  81.4M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 81.4M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  81.4M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  81.4M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 81.4M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 22.2M, False: 59.2M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  81.4M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  22.2M|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  22.2M|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  81.4M|  else \
  |  |  |  |  |  | 2321|  81.4M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  81.4M|  __r; \
  |  |  |  |  |  | 2323|  81.4M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (370:44): [True: 22.2M, False: 59.2M]
  |  |  ------------------
  ------------------
  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|  22.2M|		g_object_set(object,
  976|  22.2M|			g_param_spec_get_name(pspec), NULL,
  977|  22.2M|			NULL);
  978|  22.2M|	}
  979|       |
  980|  81.4M|	return NULL;
  981|  81.4M|}
object.c:vips_argument_table_destroy:
  576|  8.25M|{
  577|  8.25M|	g_hash_table_destroy(table);
  578|  8.25M|}
object.c:vips_object_finalize:
 1036|  8.25M|{
 1037|  8.25M|	VipsObject *object = VIPS_OBJECT(gobject);
  ------------------
  |  |  433|  8.25M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  8.25M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  8.25M|#  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|  8.25M|	g_mutex_lock(&vips__object_all_lock);
 1050|  8.25M|	g_hash_table_remove(vips__object_all, object);
 1051|  8.25M|	g_mutex_unlock(&vips__object_all_lock);
 1052|       |
 1053|  8.25M|	G_OBJECT_CLASS(vips_object_parent_class)->finalize(gobject);
  ------------------
  |  |   58|  8.25M|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  8.25M|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  8.25M|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1054|  8.25M|}
object.c:vips_object_real_build:
 1423|  8.17M|{
 1424|  8.17M|	VipsObjectClass *object_class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  8.17M|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  8.17M|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  8.17M|#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|  8.17M|	VipsArgumentFlags iomask = VIPS_ARGUMENT_INPUT;
 1430|       |
 1431|  8.17M|	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|  8.17M|	g_assert(!object->constructed);
  ------------------
  |  |  166|  8.17M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  8.17M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  8.17M|#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|  8.17M|	g_object_set(object,
 1446|  8.17M|		"nickname", object_class->nickname,
 1447|  8.17M|		"description", object_class->description, NULL);
 1448|       |
 1449|       |	/* Check all required input arguments have been supplied, don't stop
 1450|       |	 * on 1st error.
 1451|       |	 */
 1452|  8.17M|	result = 0;
 1453|  8.17M|	(void) vips_argument_map(object,
 1454|  8.17M|		vips_object_check_required, &result, &iomask);
 1455|       |
 1456|  8.17M|	return result;
 1457|  8.17M|}
object.c:vips_object_real_postbuild:
 1461|  8.16M|{
 1462|       |#ifdef DEBUG
 1463|       |	printf("vips_object_real_postbuild: ");
 1464|       |	vips_object_print_name(object);
 1465|       |	printf("\n");
 1466|       |#endif /*DEBUG*/
 1467|       |
 1468|  8.16M|	g_assert(object->constructed);
  ------------------
  |  |  166|  8.16M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  8.16M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  8.16M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1469|       |
 1470|  8.16M|	return 0;
 1471|  8.16M|}
object.c:vips_object_init:
 1674|  8.25M|{
 1675|       |#ifdef DEBUG
 1676|       |	printf("vips_object_init: ");
 1677|       |	vips_object_print_name(object);
 1678|       |	printf("\n");
 1679|       |#endif /*DEBUG*/
 1680|       |
 1681|  8.25M|	g_mutex_lock(&vips__object_all_lock);
 1682|  8.25M|	g_hash_table_insert(vips__object_all, object, object);
 1683|  8.25M|	g_mutex_unlock(&vips__object_all_lock);
 1684|  8.25M|}
object.c:vips_object_check_required:
  321|   161M|{
  322|   161M|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|   161M|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|   161M|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|   161M|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  323|       |
  324|   161M|	int *result = (int *) a;
  325|   161M|	VipsArgumentFlags *iomask = (VipsArgumentFlags *) b;
  326|       |
  327|   161M|	VIPS_DEBUG_MSG("vips_object_check_required: %s\n",
  ------------------
  |  |   47|   161M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   161M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   161M|	{ \
  |  |   49|   161M|		; \
  |  |   50|   161M|	} \
  |  |   51|   161M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   161M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  328|   161M|		g_param_spec_get_name(pspec));
  329|   161M|	VIPS_DEBUG_MSG("\trequired: %d\n",
  ------------------
  |  |   47|   161M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   161M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   161M|	{ \
  |  |   49|   161M|		; \
  |  |   50|   161M|	} \
  |  |   51|   161M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   161M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  330|   161M|		argument_class->flags & VIPS_ARGUMENT_REQUIRED);
  331|   161M|	VIPS_DEBUG_MSG("\tconstruct: %d\n",
  ------------------
  |  |   47|   161M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   161M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   161M|	{ \
  |  |   49|   161M|		; \
  |  |   50|   161M|	} \
  |  |   51|   161M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   161M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  332|   161M|		argument_class->flags & VIPS_ARGUMENT_CONSTRUCT);
  333|   161M|	VIPS_DEBUG_MSG("\tinput: %d\n",
  ------------------
  |  |   47|   161M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   161M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   161M|	{ \
  |  |   49|   161M|		; \
  |  |   50|   161M|	} \
  |  |   51|   161M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   161M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  334|   161M|		argument_class->flags & VIPS_ARGUMENT_INPUT);
  335|   161M|	VIPS_DEBUG_MSG("\toutput: %d\n",
  ------------------
  |  |   47|   161M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   161M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   161M|	{ \
  |  |   49|   161M|		; \
  |  |   50|   161M|	} \
  |  |   51|   161M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   161M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  336|   161M|		argument_class->flags & VIPS_ARGUMENT_OUTPUT);
  337|   161M|	VIPS_DEBUG_MSG("\tassigned: %d\n",
  ------------------
  |  |   47|   161M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   161M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   161M|	{ \
  |  |   49|   161M|		; \
  |  |   50|   161M|	} \
  |  |   51|   161M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   161M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  338|   161M|		argument_instance->assigned);
  339|       |
  340|   161M|	if ((argument_class->flags & VIPS_ARGUMENT_REQUIRED) &&
  ------------------
  |  Branch (340:6): [True: 12.9M, False: 148M]
  ------------------
  341|   161M|		(argument_class->flags & VIPS_ARGUMENT_CONSTRUCT) &&
  ------------------
  |  Branch (341:3): [True: 12.9M, False: 0]
  ------------------
  342|   161M|		!(argument_class->flags & VIPS_ARGUMENT_DEPRECATED) &&
  ------------------
  |  Branch (342:3): [True: 12.8M, False: 58.1k]
  ------------------
  343|   161M|		(argument_class->flags & *iomask) &&
  ------------------
  |  Branch (343:3): [True: 10.4M, False: 2.40M]
  ------------------
  344|   161M|		!argument_instance->assigned) {
  ------------------
  |  Branch (344:3): [True: 67, False: 10.4M]
  ------------------
  345|     67|		vips_error(class->nickname,
  346|     67|			_("parameter %s not set"),
  ------------------
  |  |   30|     67|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|     67|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  347|     67|			g_param_spec_get_name(pspec));
  348|     67|		*result = -1;
  349|     67|	}
  350|       |
  351|   161M|	return NULL;
  352|   161M|}
object.c:vips_object_postbuild:
  254|  8.16M|{
  255|  8.16M|	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|  8.16M|	g_signal_emit(object, vips_object_signals[SIG_POSTBUILD], 0, &result);
  264|       |
  265|  8.16M|	return result;
  266|  8.16M|}
object.c:vips_argument_init:
  692|   645M|{
  693|   645M|	if (!object->argument_table) {
  ------------------
  |  Branch (693:6): [True: 8.25M, False: 636M]
  ------------------
  694|       |#ifdef DEBUG
  695|       |		printf("vips_argument_init: ");
  696|       |		vips_object_print_name(object);
  697|       |		printf("\n");
  698|       |#endif /*DEBUG*/
  699|       |
  700|  8.25M|		object->argument_table = g_hash_table_new_full(g_direct_hash,
  701|  8.25M|			g_direct_equal, NULL,
  702|  8.25M|			(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|  81.4M|		VIPS_ARGUMENT_FOR_ALL(object,
  ------------------
  |  |  358|  8.25M|	{ \
  |  |  359|  8.25M|		VipsObjectClass *object_class = VIPS_OBJECT_GET_CLASS(OBJECT); \
  |  |  ------------------
  |  |  |  |  441|  8.25M|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  527|  8.25M|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2310|  8.25M|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  360|  8.25M|		GSList *p; \
  |  |  361|  8.25M|\
  |  |  362|  89.7M|		for (p = object_class->argument_table_traverse; p; p = p->next) { \
  |  |  ------------------
  |  |  |  Branch (362:51): [True: 81.4M, False: 8.25M]
  |  |  ------------------
  |  |  363|  81.4M|			VipsArgumentClass *ARG_CLASS = \
  |  |  364|  81.4M|				(VipsArgumentClass *) p->data; \
  |  |  365|  81.4M|			VipsArgument *argument = (VipsArgument *) argument_class; \
  |  |  366|  81.4M|			GParamSpec *PSPEC = argument->pspec; \
  |  |  367|  81.4M|			VipsArgumentInstance *ARG_INSTANCE G_GNUC_UNUSED = \
  |  |  368|  81.4M|				vips__argument_get_instance(argument_class, \
  |  |  369|  81.4M|					VIPS_OBJECT(OBJECT));
  |  |  ------------------
  |  |  |  |  433|  81.4M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|  81.4M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|  81.4M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  710|  81.4M|			pspec, argument_class, argument_instance)
  711|  81.4M|		{
  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|  81.4M|			g_assert(argument_instance == NULL);
  ------------------
  |  |  166|  81.4M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  81.4M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  81.4M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  721|       |
  722|  81.4M|			argument_instance = g_new(VipsArgumentInstance, 1);
  ------------------
  |  |  282|  81.4M|#define g_new(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc)
  |  |  ------------------
  |  |  |  |  227|  81.4M|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|  81.4M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|  81.4M|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|  81.4M|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|  81.4M|	  gpointer __p;						\
  |  |  |  |  231|  81.4M|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 81.4M]
  |  |  |  |  ------------------
  |  |  |  |  232|  81.4M|	    __p = g_##func (__n);				\
  |  |  |  |  233|  81.4M|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 81.4M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|  81.4M|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 81.4M]
  |  |  |  |  |  Branch (234:26): [True: 81.4M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|  81.4M|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|  81.4M|	  else							\
  |  |  |  |  237|  81.4M|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|  81.4M|	  __p;							\
  |  |  |  |  239|  81.4M|	}))
  |  |  ------------------
  ------------------
  723|       |
  724|  81.4M|			((VipsArgument *) argument_instance)->pspec = pspec;
  725|  81.4M|			argument_instance->argument_class = argument_class;
  726|  81.4M|			argument_instance->object = object;
  727|       |			/* SET_ALWAYS args default to assigned.
  728|       |			 */
  729|  81.4M|			argument_instance->assigned =
  730|  81.4M|				argument_class->flags &
  731|  81.4M|				VIPS_ARGUMENT_SET_ALWAYS;
  732|  81.4M|			argument_instance->close_id = 0;
  733|  81.4M|			argument_instance->invalidate_id = 0;
  734|       |
  735|  81.4M|			vips_argument_table_replace(object->argument_table,
  736|  81.4M|				(VipsArgument *) argument_instance);
  737|  81.4M|		}
  738|  81.4M|		VIPS_ARGUMENT_FOR_ALL_END
  ------------------
  |  |  372|  81.4M|	} \
  |  |  373|  8.25M|	}
  ------------------
  739|  8.25M|	}
  740|   645M|}
object.c:vips_argument_instance_free:
  551|  81.4M|{
  552|  81.4M|	vips_argument_instance_detach(argument_instance);
  553|  81.4M|	g_free(argument_instance);
  554|  81.4M|}
object.c:vips_argument_instance_detach:
  517|  94.0M|{
  518|  94.0M|	VipsObject *object = argument_instance->object;
  519|  94.0M|	VipsArgumentClass *argument_class = argument_instance->argument_class;
  520|       |
  521|  94.0M|	if (argument_instance->close_id) {
  ------------------
  |  Branch (521:6): [True: 2.39M, False: 91.6M]
  ------------------
  522|       |		/* If close_id is set, the argument must be a gobject of some
  523|       |		 * sort, so we can fetch it.
  524|       |		 */
  525|  2.39M|		GObject *member = G_STRUCT_MEMBER(GObject *, object,
  ------------------
  |  |  842|  2.39M|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|  2.39M|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
  526|  2.39M|			argument_class->offset);
  527|       |
  528|  2.39M|		if (g_signal_handler_is_connected(member,
  ------------------
  |  Branch (528:7): [True: 2.39M, False: 0]
  ------------------
  529|  2.39M|				argument_instance->close_id))
  530|  2.39M|			g_signal_handler_disconnect(member,
  531|  2.39M|				argument_instance->close_id);
  532|  2.39M|		argument_instance->close_id = 0;
  533|  2.39M|	}
  534|       |
  535|  94.0M|	if (argument_instance->invalidate_id) {
  ------------------
  |  Branch (535:6): [True: 2.67M, False: 91.4M]
  ------------------
  536|  2.67M|		GObject *member = G_STRUCT_MEMBER(GObject *, object,
  ------------------
  |  |  842|  2.67M|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|  2.67M|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
  537|  2.67M|			argument_class->offset);
  538|       |
  539|  2.67M|		if (g_signal_handler_is_connected(member,
  ------------------
  |  Branch (539:7): [True: 2.67M, False: 0]
  ------------------
  540|  2.67M|				argument_instance->invalidate_id))
  541|  2.67M|			g_signal_handler_disconnect(member,
  542|  2.67M|				argument_instance->invalidate_id);
  543|  2.67M|		argument_instance->invalidate_id = 0;
  544|  2.67M|	}
  545|  94.0M|}
object.c:vips_object_clear_member:
  871|  12.6M|{
  872|  12.6M|	VipsObject *object = argument_instance->object;
  873|  12.6M|	VipsArgumentClass *argument_class = argument_instance->argument_class;
  874|  12.6M|	GObject **member = &G_STRUCT_MEMBER(GObject *, object,
  ------------------
  |  |  842|  12.6M|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|  12.6M|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
  875|  12.6M|		argument_class->offset);
  876|       |
  877|  12.6M|	vips_argument_instance_detach(argument_instance);
  878|       |
  879|  12.6M|	if (*member) {
  ------------------
  |  Branch (879:6): [True: 5.07M, False: 7.54M]
  ------------------
  880|  5.07M|		if (argument_class->flags & VIPS_ARGUMENT_INPUT) {
  ------------------
  |  Branch (880:7): [True: 2.68M, False: 2.39M]
  ------------------
  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|  2.68M|			g_object_unref(*member);
  892|  2.68M|		}
  893|  2.39M|		else if (argument_class->flags & VIPS_ARGUMENT_OUTPUT) {
  ------------------
  |  Branch (893:12): [True: 2.39M, 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|  2.39M|			g_object_unref(object);
  903|  2.39M|		}
  904|       |
  905|  5.07M|		*member = NULL;
  906|  5.07M|	}
  907|  12.6M|}
object.c:vips_object_arg_close:
 1070|  2.39M|{
 1071|  2.39M|	VipsObject *object = argument_instance->object;
 1072|  2.39M|	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|  2.39M|	g_object_set(object,
 1078|  2.39M|		g_param_spec_get_name(pspec), NULL,
 1079|  2.39M|		NULL);
 1080|  2.39M|}
object.c:vips_argument_table_replace:
  570|  81.4M|{
  571|  81.4M|	g_hash_table_replace(table, argument->pspec, argument);
  572|  81.4M|}
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|  27.6k|{
 2460|  27.6k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  27.6k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  27.6k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  27.6k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2461|       |
 2462|  27.6k|	VipsToken token;
 2463|  27.6k|	char string[VIPS_PATH_MAX];
 2464|  27.6k|	char string2[VIPS_PATH_MAX];
 2465|  27.6k|	GParamSpec *pspec;
 2466|  27.6k|	VipsArgumentClass *argument_class;
 2467|  27.6k|	VipsArgumentInstance *argument_instance;
 2468|       |
 2469|  27.6k|	if (!(p = vips__token_need(p, VIPS_TOKEN_LEFT,
  ------------------
  |  Branch (2469:6): [True: 0, False: 27.6k]
  ------------------
 2470|  27.6k|			  string, VIPS_PATH_MAX)))
  ------------------
  |  |  245|  27.6k|#define VIPS_PATH_MAX (4096)
  ------------------
 2471|      0|		return -1;
 2472|       |
 2473|  27.6k|	if (!(p = vips__token_segment(p, &token, string, VIPS_PATH_MAX)))
  ------------------
  |  |  245|  27.6k|#define VIPS_PATH_MAX (4096)
  ------------------
  |  Branch (2473:6): [True: 0, False: 27.6k]
  ------------------
 2474|      0|		return -1;
 2475|       |
 2476|  27.6k|	for (;;) {
 2477|  27.6k|		if (token == VIPS_TOKEN_RIGHT)
  ------------------
  |  Branch (2477:7): [True: 27.6k, False: 0]
  ------------------
 2478|  27.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|  27.6k|	if ((p = vips__token_get(p, &token, string, VIPS_PATH_MAX))) {
  ------------------
  |  |  245|  27.6k|#define VIPS_PATH_MAX (4096)
  ------------------
  |  Branch (2542:6): [True: 0, False: 27.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|  27.6k|	return 0;
 2549|  27.6k|}
object.c:test_name:
 2860|  4.50M|{
 2861|  4.50M|	if (g_ascii_strcasecmp(class->nickname, nickname) == 0)
  ------------------
  |  Branch (2861:6): [True: 10.2k, False: 4.49M]
  ------------------
 2862|  10.2k|		return class;
 2863|       |
 2864|       |	/* Check the class name too, why not.
 2865|       |	 */
 2866|  4.49M|	if (g_ascii_strcasecmp(G_OBJECT_CLASS_NAME(class), nickname) == 0)
  ------------------
  |  |  124|  4.49M|#define G_OBJECT_CLASS_NAME(class)  (g_type_name (G_OBJECT_CLASS_TYPE (class)))
  |  |  ------------------
  |  |  |  |  114|  4.49M|#define G_OBJECT_CLASS_TYPE(class)  (G_TYPE_FROM_CLASS (class))
  |  |  |  |  ------------------
  |  |  |  |  |  |  613|  4.49M|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2866:6): [True: 27.6k, False: 4.46M]
  ------------------
 2867|  27.6k|		return class;
 2868|       |
 2869|  4.46M|	return NULL;
 2870|  4.49M|}
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|  3.28M|{
 3042|  3.28M|	int i;
 3043|       |
 3044|  10.9M|	for (i = 0; i < local->n; i++)
  ------------------
  |  Branch (3044:14): [True: 7.62M, False: 3.28M]
  ------------------
 3045|  7.62M|		VIPS_FREEF(g_object_unref, local->array[i]);
  ------------------
  |  |   41|  7.62M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  7.62M|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  7.62M|	{ \
  |  |   43|  7.62M|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 5.41M, False: 2.20M]
  |  |  ------------------
  |  |   44|  5.41M|			(void) F((S)); \
  |  |   45|  5.41M|			(S) = 0; \
  |  |   46|  5.41M|		} \
  |  |   47|  7.62M|	} \
  |  |   48|  7.62M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  7.62M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3046|       |
 3047|  3.28M|	VIPS_FREEF(g_free, local->array);
  ------------------
  |  |   41|  3.28M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  3.28M|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  3.28M|	{ \
  |  |   43|  3.28M|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 3.28M, False: 0]
  |  |  ------------------
  |  |   44|  3.28M|			(void) F((S)); \
  |  |   45|  3.28M|			(S) = 0; \
  |  |   46|  3.28M|		} \
  |  |   47|  3.28M|	} \
  |  |   48|  3.28M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  3.28M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3048|  3.28M|	VIPS_FREEF(g_free, local);
  ------------------
  |  |   41|  3.28M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  3.28M|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  3.28M|	{ \
  |  |   43|  3.28M|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 3.28M, False: 0]
  |  |  ------------------
  |  |   44|  3.28M|			(void) F((S)); \
  |  |   45|  3.28M|			(S) = 0; \
  |  |   46|  3.28M|		} \
  |  |   47|  3.28M|	} \
  |  |   48|  3.28M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  3.28M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3049|  3.28M|}
object.c:vips_object_unref_outputs_sub:
 3199|   332k|{
 3200|   332k|	if ((argument_class->flags & VIPS_ARGUMENT_OUTPUT) &&
  ------------------
  |  Branch (3200:6): [True: 116k, False: 215k]
  ------------------
 3201|   332k|		G_IS_PARAM_SPEC_OBJECT(pspec) &&
  ------------------
  |  |  491|   448k|#define G_IS_PARAM_SPEC_OBJECT(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OBJECT))
  |  |  ------------------
  |  |  |  |  497|   116k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   116k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   116k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   116k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   116k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 116k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   116k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   116k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 116k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 18.7k, False: 97.7k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   116k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  18.7k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  18.7k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   116k|  else \
  |  |  |  |  |  | 2321|   116k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   116k|  __r; \
  |  |  |  |  |  | 2323|   116k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (491:44): [True: 18.7k, False: 97.7k]
  |  |  ------------------
  ------------------
 3202|   332k|		argument_instance->assigned) {
  ------------------
  |  Branch (3202:3): [True: 17.0k, False: 1.66k]
  ------------------
 3203|  17.0k|		GObject *value;
 3204|       |
 3205|  17.0k|		g_object_get(object,
 3206|  17.0k|			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|  17.0k|		g_object_unref(value);
 3212|  17.0k|		g_object_unref(value);
 3213|  17.0k|	}
 3214|       |
 3215|   332k|	return NULL;
 3216|   332k|}

vips_operation_get_flags:
  693|  4.86M|{
  694|  4.86M|	VipsOperationClass *class = VIPS_OPERATION_GET_CLASS(operation);
  ------------------
  |  |   67|  4.86M|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  4.86M|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  4.86M|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   68|  4.86M|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  695|       |
  696|  4.86M|	return class->get_flags(operation);
  697|  4.86M|}
vips_operation_invalidate:
  717|  22.3k|{
  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|  22.3k|	g_signal_emit(operation, vips_operation_signals[SIG_INVALIDATE], 0);
  724|  22.3k|}
vips_operation_new:
  740|  2.48M|{
  741|  2.48M|	GType type;
  742|  2.48M|	VipsObject *object;
  743|  2.48M|	VipsOperation *operation;
  744|       |
  745|  2.48M|	vips_check_init();
  746|       |
  747|  2.48M|	if (!(type = vips_type_find("VipsOperation", name))) {
  ------------------
  |  Branch (747:6): [True: 0, False: 2.48M]
  ------------------
  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|  2.48M|	if (!(object = g_object_new(type, NULL))) {
  ------------------
  |  Branch (753:6): [True: 0, False: 2.48M]
  ------------------
  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|  2.48M|	operation = VIPS_OPERATION(object);
  ------------------
  |  |   57|  2.48M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  2.48M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  2.48M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   58|  2.48M|		VIPS_TYPE_OPERATION, VipsOperation))
  ------------------
  760|       |
  761|  2.48M|	VIPS_DEBUG_MSG("vips_operation_new: %s (%p)\n", name, operation);
  ------------------
  |  |   47|  2.48M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.48M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  2.48M|	{ \
  |  |   49|  2.48M|		; \
  |  |   50|  2.48M|	} \
  |  |   51|  2.48M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.48M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  762|       |
  763|  2.48M|	return operation;
  764|  2.48M|}
vips_call_required_optional:
  956|  2.48M|{
  957|  2.48M|	int result;
  958|  2.48M|	va_list a;
  959|  2.48M|	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|  2.48M|	va_copy(a, required);
  966|  2.48M|	va_copy(b, optional);
  967|  2.48M|	result = vips_operation_set_valist_required(*operation, a) ||
  ------------------
  |  Branch (967:11): [True: 0, False: 2.48M]
  ------------------
  968|  2.48M|		vips_object_set_valist(VIPS_OBJECT(*operation), b);
  ------------------
  |  |  433|  2.48M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  2.48M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  2.48M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (968:3): [True: 0, False: 2.48M]
  ------------------
  969|  2.48M|	va_end(a);
  970|  2.48M|	va_end(b);
  971|       |
  972|  2.48M|	if (result)
  ------------------
  |  Branch (972:6): [True: 0, False: 2.48M]
  ------------------
  973|      0|		return -1;
  974|       |
  975|       |	/* Build from cache.
  976|       |	 */
  977|  2.48M|	if (vips_cache_operation_buildp(operation))
  ------------------
  |  Branch (977:6): [True: 29.9k, False: 2.45M]
  ------------------
  978|  29.9k|		return -1;
  979|       |
  980|       |	/* Walk args again, writing output.
  981|       |	 */
  982|  2.45M|	va_copy(a, required);
  983|  2.45M|	va_copy(b, optional);
  984|  2.45M|	result = vips_operation_get_valist_required(*operation, required) ||
  ------------------
  |  Branch (984:11): [True: 0, False: 2.45M]
  ------------------
  985|  2.45M|		vips_operation_get_valist_optional(*operation, optional);
  ------------------
  |  Branch (985:3): [True: 0, False: 2.45M]
  ------------------
  986|  2.45M|	va_end(a);
  987|  2.45M|	va_end(b);
  988|       |
  989|  2.45M|	return result;
  990|  2.48M|}
vips_call_split:
 1118|  2.45M|{
 1119|  2.45M|	int result;
 1120|  2.45M|	va_list required;
 1121|       |
 1122|  2.45M|	va_start(required, optional);
 1123|  2.45M|	result = vips_call_by_name(operation_name, NULL,
 1124|  2.45M|		required, optional);
 1125|  2.45M|	va_end(required);
 1126|       |
 1127|  2.45M|	return result;
 1128|  2.45M|}
vips_call_split_option_string:
 1133|  27.6k|{
 1134|  27.6k|	int result;
 1135|  27.6k|	va_list required;
 1136|       |
 1137|  27.6k|	va_start(required, optional);
 1138|  27.6k|	result = vips_call_by_name(operation_name, option_string,
 1139|  27.6k|		required, optional);
 1140|  27.6k|	va_end(required);
 1141|       |
 1142|  27.6k|	return result;
 1143|  27.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|  2.48M|{
  230|  2.48M|	VipsOperation *operation = VIPS_OPERATION(gobject);
  ------------------
  |  |   57|  2.48M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  2.48M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  2.48M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   58|  2.48M|		VIPS_TYPE_OPERATION, VipsOperation))
  ------------------
  231|       |
  232|  2.48M|	VIPS_DEBUG_MSG("vips_operation_finalize: %p\n", gobject);
  ------------------
  |  |   47|  2.48M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.48M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  2.48M|	{ \
  |  |   49|  2.48M|		; \
  |  |   50|  2.48M|	} \
  |  |   51|  2.48M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.48M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  233|       |
  234|  2.48M|	if (operation->pixels)
  ------------------
  |  Branch (234:6): [True: 0, False: 2.48M]
  ------------------
  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|  2.48M|	G_OBJECT_CLASS(vips_operation_parent_class)->finalize(gobject);
  ------------------
  |  |   58|  2.48M|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  2.48M|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  2.48M|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  238|  2.48M|}
operation.c:vips_operation_dispose:
  242|  2.48M|{
  243|  2.48M|	VIPS_DEBUG_MSG("vips_operation_dispose: %p\n", gobject);
  ------------------
  |  |   47|  2.48M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.48M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  2.48M|	{ \
  |  |   49|  2.48M|		; \
  |  |   50|  2.48M|	} \
  |  |   51|  2.48M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.48M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  244|       |
  245|  2.48M|	G_OBJECT_CLASS(vips_operation_parent_class)->dispose(gobject);
  ------------------
  |  |   58|  2.48M|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  2.48M|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  2.48M|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  246|  2.48M|}
operation.c:vips_operation_build:
  607|  2.40M|{
  608|  2.40M|	VipsOperationClass *class = VIPS_OPERATION_GET_CLASS(object);
  ------------------
  |  |   67|  2.40M|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  2.40M|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  2.40M|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   68|  2.40M|		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|  2.40M|	if (class->flags & VIPS_OPERATION_BLOCKED) {
  ------------------
  |  Branch (616:6): [True: 0, False: 2.40M]
  ------------------
  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|  2.40M|	if (VIPS_OBJECT_CLASS(vips_operation_parent_class)->build(object))
  ------------------
  |  |  435|  2.40M|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  2.40M|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  2.40M|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (622:6): [True: 0, False: 2.40M]
  ------------------
  623|      0|		return -1;
  624|       |
  625|  2.40M|	return 0;
  626|  2.40M|}
operation.c:vips_operation_real_get_flags:
  645|  4.86M|{
  646|  4.86M|	VipsOperationClass *class = VIPS_OPERATION_GET_CLASS(operation);
  ------------------
  |  |   67|  4.86M|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  4.86M|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  4.86M|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   68|  4.86M|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  647|       |
  648|  4.86M|	return class->flags;
  649|  4.86M|}
operation.c:vips_operation_init:
  680|  2.48M|{
  681|  2.48M|}
operation.c:vips_operation_set_valist_required:
  777|  2.48M|{
  778|  2.48M|	VIPS_DEBUG_MSG("vips_operation_set_valist_required:\n");
  ------------------
  |  |   47|  2.48M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.48M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  2.48M|	{ \
  |  |   49|  2.48M|		; \
  |  |   50|  2.48M|	} \
  |  |   51|  2.48M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.48M|#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|  25.2M|	VIPS_ARGUMENT_FOR_ALL(operation,
  ------------------
  |  |  358|  2.48M|	{ \
  |  |  359|  2.48M|		VipsObjectClass *object_class = VIPS_OBJECT_GET_CLASS(OBJECT); \
  |  |  ------------------
  |  |  |  |  441|  2.48M|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  527|  2.48M|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2310|  2.48M|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  360|  2.48M|		GSList *p; \
  |  |  361|  2.48M|\
  |  |  362|  27.7M|		for (p = object_class->argument_table_traverse; p; p = p->next) { \
  |  |  ------------------
  |  |  |  Branch (362:51): [True: 25.2M, False: 2.48M]
  |  |  ------------------
  |  |  363|  25.2M|			VipsArgumentClass *ARG_CLASS = \
  |  |  364|  25.2M|				(VipsArgumentClass *) p->data; \
  |  |  365|  25.2M|			VipsArgument *argument = (VipsArgument *) argument_class; \
  |  |  366|  25.2M|			GParamSpec *PSPEC = argument->pspec; \
  |  |  367|  25.2M|			VipsArgumentInstance *ARG_INSTANCE G_GNUC_UNUSED = \
  |  |  368|  25.2M|				vips__argument_get_instance(argument_class, \
  |  |  369|  25.2M|					VIPS_OBJECT(OBJECT));
  |  |  ------------------
  |  |  |  |  433|  25.2M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|  25.2M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|  25.2M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  784|  25.2M|		pspec, argument_class, argument_instance)
  785|  25.2M|	{
  786|       |
  787|  25.2M|		g_assert(argument_instance);
  ------------------
  |  |  166|  25.2M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  25.2M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  25.2M|#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|  25.2M|		if ((argument_class->flags & VIPS_ARGUMENT_REQUIRED) &&
  ------------------
  |  Branch (792:7): [True: 6.71M, False: 18.5M]
  ------------------
  793|  25.2M|			!(argument_class->flags & VIPS_ARGUMENT_DEPRECATED)) {
  ------------------
  |  Branch (793:4): [True: 6.68M, False: 29.0k]
  ------------------
  794|  8.40M|			VIPS_ARGUMENT_COLLECT_SET(pspec, argument_class, ap);
  ------------------
  |  |  399|  6.68M|	if ((ARG_CLASS->flags & VIPS_ARGUMENT_INPUT)) { \
  |  |  ------------------
  |  |  |  Branch (399:6): [True: 4.20M, False: 2.48M]
  |  |  ------------------
  |  |  400|  4.20M|		GValue value = G_VALUE_INIT; \
  |  |  ------------------
  |  |  |  |  191|  4.20M|#define G_VALUE_INIT  { 0, { { 0 } } }
  |  |  ------------------
  |  |  401|  4.20M|		gchar *error = NULL; \
  |  |  402|  4.20M|\
  |  |  403|  4.20M|		/* Input args are given inline, eg. ("factor", 12.0) \
  |  |  404|  4.20M|		 * and must be collected. \
  |  |  405|  4.20M|		 */ \
  |  |  406|  4.20M|		G_VALUE_COLLECT_INIT(&value, \
  |  |  ------------------
  |  |  |  |   88|  4.20M|#define G_VALUE_COLLECT_INIT(value, _value_type, var_args, flags, __error)		\
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  4.20M|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   89|  4.20M|G_STMT_START {										\
  |  |  |  |   90|  4.20M|  GValue *g_vci_val = (value);								\
  |  |  |  |   91|  4.20M|  guint g_vci_flags = (flags);								\
  |  |  |  |   92|  4.20M|  GTypeValueTable *g_vci_vtab = g_type_value_table_peek (_value_type);			\
  |  |  |  |   93|  4.20M|  const gchar *g_vci_collect_format = g_vci_vtab->collect_format;					\
  |  |  |  |   94|  4.20M|  GTypeCValue g_vci_cvalues[G_VALUE_COLLECT_FORMAT_MAX_LENGTH] = { { 0, }, };		\
  |  |  |  |   95|  4.20M|  guint g_vci_n_values = 0;									\
  |  |  |  |   96|  4.20M|                                                                                        \
  |  |  |  |   97|  4.20M|  g_vci_val->g_type = _value_type;		/* value_meminit() from gvalue.c */		\
  |  |  |  |   98|  8.40M|  while (*g_vci_collect_format)								\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (98:10): [True: 4.20M, False: 4.20M]
  |  |  |  |  ------------------
  |  |  |  |   99|  4.20M|    {											\
  |  |  |  |  100|  4.20M|      GTypeCValue *g_vci_cvalue = g_vci_cvalues + g_vci_n_values++;					\
  |  |  |  |  101|  4.20M|                                                                                        \
  |  |  |  |  102|  4.20M|      switch (*g_vci_collect_format++)							\
  |  |  |  |  103|  4.20M|	{										\
  |  |  |  |  104|  1.10M|	case G_VALUE_COLLECT_INT:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (104:2): [True: 1.10M, False: 3.10M]
  |  |  |  |  ------------------
  |  |  |  |  105|  1.10M|	  g_vci_cvalue->v_int = va_arg ((var_args), gint);					\
  |  |  |  |  106|  1.10M|	  break;									\
  |  |  |  |  107|      0|	case G_VALUE_COLLECT_LONG:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (107:2): [True: 0, False: 4.20M]
  |  |  |  |  ------------------
  |  |  |  |  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: 4.20M]
  |  |  |  |  ------------------
  |  |  |  |  111|      0|	  g_vci_cvalue->v_int64 = va_arg ((var_args), gint64);				\
  |  |  |  |  112|      0|	  break;									\
  |  |  |  |  113|   105k|	case G_VALUE_COLLECT_DOUBLE:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (113:2): [True: 105k, False: 4.09M]
  |  |  |  |  ------------------
  |  |  |  |  114|   105k|	  g_vci_cvalue->v_double = va_arg ((var_args), gdouble);				\
  |  |  |  |  115|   105k|	  break;									\
  |  |  |  |  116|  2.99M|	case G_VALUE_COLLECT_POINTER:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (116:2): [True: 2.99M, False: 1.20M]
  |  |  |  |  ------------------
  |  |  |  |  117|  2.99M|	  g_vci_cvalue->v_pointer = va_arg ((var_args), gpointer);				\
  |  |  |  |  118|  2.99M|	  break;									\
  |  |  |  |  119|      0|	default:									\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (119:2): [True: 0, False: 4.20M]
  |  |  |  |  ------------------
  |  |  |  |  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|  4.20M|	}										\
  |  |  |  |  122|  4.20M|    }											\
  |  |  |  |  123|  4.20M|  *(__error) = g_vci_vtab->collect_value (g_vci_val,						\
  |  |  |  |  124|  4.20M|				       g_vci_n_values,					\
  |  |  |  |  125|  4.20M|				       g_vci_cvalues,					\
  |  |  |  |  126|  4.20M|				       g_vci_flags);						\
  |  |  |  |  127|  4.20M|} G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  4.20M|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  407|  4.20M|			G_PARAM_SPEC_VALUE_TYPE(PSPEC), AP, 0, &error); \
  |  |  408|  4.20M|\
  |  |  409|  4.20M|		/* Don't bother with the error message. \
  |  |  410|  4.20M|		 */ \
  |  |  411|  4.20M|		if (error) { \
  |  |  ------------------
  |  |  |  Branch (411:7): [True: 0, False: 4.20M]
  |  |  ------------------
  |  |  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|  8.40M|			g_object_set_property(G_OBJECT(operation),
  ------------------
  |  |   51|  4.20M|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|  4.20M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  4.20M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  808|  8.40M|				g_param_spec_get_name(pspec), &value);
  809|       |
  810|  8.40M|			VIPS_ARGUMENT_COLLECT_GET(pspec, argument_class, ap);
  ------------------
  |  |  417|  4.20M|	g_value_unset(&value); \
  |  |  418|  4.20M|	} \
  |  |  419|  6.68M|	else if ((ARG_CLASS->flags & VIPS_ARGUMENT_OUTPUT)) \
  |  |  ------------------
  |  |  |  Branch (419:11): [True: 2.48M, False: 0]
  |  |  ------------------
  |  |  420|  2.48M|	{ \
  |  |  421|  2.48M|		void **arg G_GNUC_UNUSED; \
  |  |  422|  2.48M|\
  |  |  423|  2.48M|		/* Output args are a pointer to where to send the \
  |  |  424|  2.48M|		 * result. \
  |  |  425|  2.48M|		 */ \
  |  |  426|  2.48M|		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|  4.96M|			VIPS_ARGUMENT_COLLECT_END
  ------------------
  |  |  429|  2.48M|	}
  ------------------
  818|  6.68M|		}
  819|  25.2M|	}
  820|  25.2M|	VIPS_ARGUMENT_FOR_ALL_END
  ------------------
  |  |  372|  25.2M|	} \
  |  |  373|  2.48M|	}
  ------------------
  821|       |
  822|  2.48M|	return 0;
  823|  2.48M|}
operation.c:vips_operation_get_valist_required:
  827|  2.45M|{
  828|  2.45M|	VIPS_DEBUG_MSG("vips_operation_get_valist_required:\n");
  ------------------
  |  |   47|  2.45M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.45M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  2.45M|	{ \
  |  |   49|  2.45M|		; \
  |  |   50|  2.45M|	} \
  |  |   51|  2.45M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.45M|#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|  24.8M|	VIPS_ARGUMENT_FOR_ALL(operation,
  ------------------
  |  |  358|  2.45M|	{ \
  |  |  359|  2.45M|		VipsObjectClass *object_class = VIPS_OBJECT_GET_CLASS(OBJECT); \
  |  |  ------------------
  |  |  |  |  441|  2.45M|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  527|  2.45M|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2310|  2.45M|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  360|  2.45M|		GSList *p; \
  |  |  361|  2.45M|\
  |  |  362|  27.3M|		for (p = object_class->argument_table_traverse; p; p = p->next) { \
  |  |  ------------------
  |  |  |  Branch (362:51): [True: 24.8M, False: 2.45M]
  |  |  ------------------
  |  |  363|  24.8M|			VipsArgumentClass *ARG_CLASS = \
  |  |  364|  24.8M|				(VipsArgumentClass *) p->data; \
  |  |  365|  24.8M|			VipsArgument *argument = (VipsArgument *) argument_class; \
  |  |  366|  24.8M|			GParamSpec *PSPEC = argument->pspec; \
  |  |  367|  24.8M|			VipsArgumentInstance *ARG_INSTANCE G_GNUC_UNUSED = \
  |  |  368|  24.8M|				vips__argument_get_instance(argument_class, \
  |  |  369|  24.8M|					VIPS_OBJECT(OBJECT));
  |  |  ------------------
  |  |  |  |  433|  24.8M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|  24.8M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|  24.8M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  834|  24.8M|		pspec, argument_class, argument_instance)
  835|  24.8M|	{
  836|  24.8M|		if ((argument_class->flags & VIPS_ARGUMENT_REQUIRED)) {
  ------------------
  |  Branch (836:7): [True: 6.62M, False: 18.2M]
  ------------------
  837|  8.35M|			VIPS_ARGUMENT_COLLECT_SET(pspec, argument_class, ap);
  ------------------
  |  |  399|  6.62M|	if ((ARG_CLASS->flags & VIPS_ARGUMENT_INPUT)) { \
  |  |  ------------------
  |  |  |  Branch (399:6): [True: 4.17M, False: 2.45M]
  |  |  ------------------
  |  |  400|  4.17M|		GValue value = G_VALUE_INIT; \
  |  |  ------------------
  |  |  |  |  191|  4.17M|#define G_VALUE_INIT  { 0, { { 0 } } }
  |  |  ------------------
  |  |  401|  4.17M|		gchar *error = NULL; \
  |  |  402|  4.17M|\
  |  |  403|  4.17M|		/* Input args are given inline, eg. ("factor", 12.0) \
  |  |  404|  4.17M|		 * and must be collected. \
  |  |  405|  4.17M|		 */ \
  |  |  406|  4.17M|		G_VALUE_COLLECT_INIT(&value, \
  |  |  ------------------
  |  |  |  |   88|  4.17M|#define G_VALUE_COLLECT_INIT(value, _value_type, var_args, flags, __error)		\
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  4.17M|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   89|  4.17M|G_STMT_START {										\
  |  |  |  |   90|  4.17M|  GValue *g_vci_val = (value);								\
  |  |  |  |   91|  4.17M|  guint g_vci_flags = (flags);								\
  |  |  |  |   92|  4.17M|  GTypeValueTable *g_vci_vtab = g_type_value_table_peek (_value_type);			\
  |  |  |  |   93|  4.17M|  const gchar *g_vci_collect_format = g_vci_vtab->collect_format;					\
  |  |  |  |   94|  4.17M|  GTypeCValue g_vci_cvalues[G_VALUE_COLLECT_FORMAT_MAX_LENGTH] = { { 0, }, };		\
  |  |  |  |   95|  4.17M|  guint g_vci_n_values = 0;									\
  |  |  |  |   96|  4.17M|                                                                                        \
  |  |  |  |   97|  4.17M|  g_vci_val->g_type = _value_type;		/* value_meminit() from gvalue.c */		\
  |  |  |  |   98|  8.35M|  while (*g_vci_collect_format)								\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (98:10): [True: 4.17M, False: 4.17M]
  |  |  |  |  ------------------
  |  |  |  |   99|  4.17M|    {											\
  |  |  |  |  100|  4.17M|      GTypeCValue *g_vci_cvalue = g_vci_cvalues + g_vci_n_values++;					\
  |  |  |  |  101|  4.17M|                                                                                        \
  |  |  |  |  102|  4.17M|      switch (*g_vci_collect_format++)							\
  |  |  |  |  103|  4.17M|	{										\
  |  |  |  |  104|  1.07M|	case G_VALUE_COLLECT_INT:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (104:2): [True: 1.07M, False: 3.10M]
  |  |  |  |  ------------------
  |  |  |  |  105|  1.07M|	  g_vci_cvalue->v_int = va_arg ((var_args), gint);					\
  |  |  |  |  106|  1.07M|	  break;									\
  |  |  |  |  107|      0|	case G_VALUE_COLLECT_LONG:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (107:2): [True: 0, False: 4.17M]
  |  |  |  |  ------------------
  |  |  |  |  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: 4.17M]
  |  |  |  |  ------------------
  |  |  |  |  111|      0|	  g_vci_cvalue->v_int64 = va_arg ((var_args), gint64);				\
  |  |  |  |  112|      0|	  break;									\
  |  |  |  |  113|   134k|	case G_VALUE_COLLECT_DOUBLE:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (113:2): [True: 134k, False: 4.04M]
  |  |  |  |  ------------------
  |  |  |  |  114|   134k|	  g_vci_cvalue->v_double = va_arg ((var_args), gdouble);				\
  |  |  |  |  115|   134k|	  break;									\
  |  |  |  |  116|  2.96M|	case G_VALUE_COLLECT_POINTER:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (116:2): [True: 2.96M, False: 1.21M]
  |  |  |  |  ------------------
  |  |  |  |  117|  2.96M|	  g_vci_cvalue->v_pointer = va_arg ((var_args), gpointer);				\
  |  |  |  |  118|  2.96M|	  break;									\
  |  |  |  |  119|      0|	default:									\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (119:2): [True: 0, False: 4.17M]
  |  |  |  |  ------------------
  |  |  |  |  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|  4.17M|	}										\
  |  |  |  |  122|  4.17M|    }											\
  |  |  |  |  123|  4.17M|  *(__error) = g_vci_vtab->collect_value (g_vci_val,						\
  |  |  |  |  124|  4.17M|				       g_vci_n_values,					\
  |  |  |  |  125|  4.17M|				       g_vci_cvalues,					\
  |  |  |  |  126|  4.17M|				       g_vci_flags);						\
  |  |  |  |  127|  4.17M|} G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  4.17M|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  407|  4.17M|			G_PARAM_SPEC_VALUE_TYPE(PSPEC), AP, 0, &error); \
  |  |  408|  4.17M|\
  |  |  409|  4.17M|		/* Don't bother with the error message. \
  |  |  410|  4.17M|		 */ \
  |  |  411|  4.17M|		if (error) { \
  |  |  ------------------
  |  |  |  Branch (411:7): [True: 0, False: 4.17M]
  |  |  ------------------
  |  |  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|  8.35M|			VIPS_ARGUMENT_COLLECT_GET(pspec, argument_class, ap);
  ------------------
  |  |  417|  4.17M|	g_value_unset(&value); \
  |  |  418|  4.17M|	} \
  |  |  419|  6.62M|	else if ((ARG_CLASS->flags & VIPS_ARGUMENT_OUTPUT)) \
  |  |  ------------------
  |  |  |  Branch (419:11): [True: 2.45M, False: 0]
  |  |  ------------------
  |  |  420|  2.45M|	{ \
  |  |  421|  2.45M|		void **arg G_GNUC_UNUSED; \
  |  |  422|  2.45M|\
  |  |  423|  2.45M|		/* Output args are a pointer to where to send the \
  |  |  424|  2.45M|		 * result. \
  |  |  425|  2.45M|		 */ \
  |  |  426|  2.45M|		arg = va_arg(AP, void **);
  ------------------
  840|       |
  841|  4.90M|			if (!argument_instance->assigned)
  ------------------
  |  Branch (841:8): [True: 0, False: 2.45M]
  ------------------
  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|  2.45M|			g_object_get(G_OBJECT(operation),
  ------------------
  |  |   51|  2.45M|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|  2.45M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  2.45M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  860|  2.45M|				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|  2.45M|			if (G_IS_PARAM_SPEC_OBJECT(pspec)) {
  ------------------
  |  |  491|  2.45M|#define G_IS_PARAM_SPEC_OBJECT(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OBJECT))
  |  |  ------------------
  |  |  |  |  497|  2.45M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  2.45M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  2.45M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  2.45M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  2.45M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 2.45M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  2.45M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  2.45M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 2.45M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 2.43M, False: 16.4k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  2.45M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  2.43M|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  2.43M|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  2.45M|  else \
  |  |  |  |  |  | 2321|  2.45M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  2.45M|  __r; \
  |  |  |  |  |  | 2323|  2.45M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (491:44): [True: 2.43M, False: 16.4k]
  |  |  ------------------
  ------------------
  867|  2.43M|				GObject *object;
  868|       |
  869|  2.43M|				object = *((GObject **) arg);
  870|  2.43M|				g_object_unref(object);
  871|  2.43M|			}
  872|       |
  873|  2.45M|			VIPS_ARGUMENT_COLLECT_END
  ------------------
  |  |  429|  2.45M|	}
  ------------------
  874|  6.62M|		}
  875|  24.8M|	}
  876|  24.8M|	VIPS_ARGUMENT_FOR_ALL_END
  ------------------
  |  |  372|  24.8M|	} \
  |  |  373|  2.45M|	}
  ------------------
  877|       |
  878|  2.45M|	return 0;
  879|  2.45M|}
operation.c:vips_operation_get_valist_optional:
  883|  2.45M|{
  884|  2.45M|	char *name;
  885|       |
  886|  2.45M|	VIPS_DEBUG_MSG("vips_operation_get_valist_optional:\n");
  ------------------
  |  |   47|  2.45M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.45M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  2.45M|	{ \
  |  |   49|  2.45M|		; \
  |  |   50|  2.45M|	} \
  |  |   51|  2.45M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.45M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  887|       |
  888|  3.00M|	for (name = va_arg(ap, char *); name; name = va_arg(ap, char *)) {
  ------------------
  |  Branch (888:34): [True: 556k, False: 2.45M]
  ------------------
  889|   556k|		GParamSpec *pspec;
  890|   556k|		VipsArgumentClass *argument_class;
  891|   556k|		VipsArgumentInstance *argument_instance;
  892|       |
  893|   556k|		VIPS_DEBUG_MSG("\tname = '%s' (%p)\n", name, name);
  ------------------
  |  |   47|   556k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   556k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   556k|	{ \
  |  |   49|   556k|		; \
  |  |   50|   556k|	} \
  |  |   51|   556k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   556k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  894|       |
  895|   556k|		if (vips_object_get_argument(VIPS_OBJECT(operation), name,
  ------------------
  |  |  433|   556k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|   556k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   556k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (895:7): [True: 0, False: 556k]
  ------------------
  896|   556k|				&pspec, &argument_class, &argument_instance))
  897|      0|			return -1;
  898|       |
  899|  1.08M|		VIPS_ARGUMENT_COLLECT_SET(pspec, argument_class, ap);
  ------------------
  |  |  399|   556k|	if ((ARG_CLASS->flags & VIPS_ARGUMENT_INPUT)) { \
  |  |  ------------------
  |  |  |  Branch (399:6): [True: 540k, False: 15.6k]
  |  |  ------------------
  |  |  400|   540k|		GValue value = G_VALUE_INIT; \
  |  |  ------------------
  |  |  |  |  191|   540k|#define G_VALUE_INIT  { 0, { { 0 } } }
  |  |  ------------------
  |  |  401|   540k|		gchar *error = NULL; \
  |  |  402|   540k|\
  |  |  403|   540k|		/* Input args are given inline, eg. ("factor", 12.0) \
  |  |  404|   540k|		 * and must be collected. \
  |  |  405|   540k|		 */ \
  |  |  406|   540k|		G_VALUE_COLLECT_INIT(&value, \
  |  |  ------------------
  |  |  |  |   88|   540k|#define G_VALUE_COLLECT_INIT(value, _value_type, var_args, flags, __error)		\
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   540k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   89|   540k|G_STMT_START {										\
  |  |  |  |   90|   540k|  GValue *g_vci_val = (value);								\
  |  |  |  |   91|   540k|  guint g_vci_flags = (flags);								\
  |  |  |  |   92|   540k|  GTypeValueTable *g_vci_vtab = g_type_value_table_peek (_value_type);			\
  |  |  |  |   93|   540k|  const gchar *g_vci_collect_format = g_vci_vtab->collect_format;					\
  |  |  |  |   94|   540k|  GTypeCValue g_vci_cvalues[G_VALUE_COLLECT_FORMAT_MAX_LENGTH] = { { 0, }, };		\
  |  |  |  |   95|   540k|  guint g_vci_n_values = 0;									\
  |  |  |  |   96|   540k|                                                                                        \
  |  |  |  |   97|   540k|  g_vci_val->g_type = _value_type;		/* value_meminit() from gvalue.c */		\
  |  |  |  |   98|  1.08M|  while (*g_vci_collect_format)								\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (98:10): [True: 540k, False: 540k]
  |  |  |  |  ------------------
  |  |  |  |   99|   540k|    {											\
  |  |  |  |  100|   540k|      GTypeCValue *g_vci_cvalue = g_vci_cvalues + g_vci_n_values++;					\
  |  |  |  |  101|   540k|                                                                                        \
  |  |  |  |  102|   540k|      switch (*g_vci_collect_format++)							\
  |  |  |  |  103|   540k|	{										\
  |  |  |  |  104|   453k|	case G_VALUE_COLLECT_INT:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (104:2): [True: 453k, False: 87.1k]
  |  |  |  |  ------------------
  |  |  |  |  105|   453k|	  g_vci_cvalue->v_int = va_arg ((var_args), gint);					\
  |  |  |  |  106|   453k|	  break;									\
  |  |  |  |  107|      0|	case G_VALUE_COLLECT_LONG:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (107:2): [True: 0, False: 540k]
  |  |  |  |  ------------------
  |  |  |  |  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: 540k]
  |  |  |  |  ------------------
  |  |  |  |  111|      0|	  g_vci_cvalue->v_int64 = va_arg ((var_args), gint64);				\
  |  |  |  |  112|      0|	  break;									\
  |  |  |  |  113|  86.3k|	case G_VALUE_COLLECT_DOUBLE:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (113:2): [True: 86.3k, False: 454k]
  |  |  |  |  ------------------
  |  |  |  |  114|  86.3k|	  g_vci_cvalue->v_double = va_arg ((var_args), gdouble);				\
  |  |  |  |  115|  86.3k|	  break;									\
  |  |  |  |  116|    840|	case G_VALUE_COLLECT_POINTER:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (116:2): [True: 840, False: 539k]
  |  |  |  |  ------------------
  |  |  |  |  117|    840|	  g_vci_cvalue->v_pointer = va_arg ((var_args), gpointer);				\
  |  |  |  |  118|    840|	  break;									\
  |  |  |  |  119|      0|	default:									\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (119:2): [True: 0, False: 540k]
  |  |  |  |  ------------------
  |  |  |  |  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|   540k|	}										\
  |  |  |  |  122|   540k|    }											\
  |  |  |  |  123|   540k|  *(__error) = g_vci_vtab->collect_value (g_vci_val,						\
  |  |  |  |  124|   540k|				       g_vci_n_values,					\
  |  |  |  |  125|   540k|				       g_vci_cvalues,					\
  |  |  |  |  126|   540k|				       g_vci_flags);						\
  |  |  |  |  127|   540k|} G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   540k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  407|   540k|			G_PARAM_SPEC_VALUE_TYPE(PSPEC), AP, 0, &error); \
  |  |  408|   540k|\
  |  |  409|   540k|		/* Don't bother with the error message. \
  |  |  410|   540k|		 */ \
  |  |  411|   540k|		if (error) { \
  |  |  ------------------
  |  |  |  Branch (411:7): [True: 0, False: 540k]
  |  |  ------------------
  |  |  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|  1.08M|		VIPS_ARGUMENT_COLLECT_GET(pspec, argument_class, ap);
  ------------------
  |  |  417|   540k|	g_value_unset(&value); \
  |  |  418|   540k|	} \
  |  |  419|   556k|	else if ((ARG_CLASS->flags & VIPS_ARGUMENT_OUTPUT)) \
  |  |  ------------------
  |  |  |  Branch (419:11): [True: 15.6k, False: 0]
  |  |  ------------------
  |  |  420|  15.6k|	{ \
  |  |  421|  15.6k|		void **arg G_GNUC_UNUSED; \
  |  |  422|  15.6k|\
  |  |  423|  15.6k|		/* Output args are a pointer to where to send the \
  |  |  424|  15.6k|		 * result. \
  |  |  425|  15.6k|		 */ \
  |  |  426|  15.6k|		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|  31.3k|		if (arg) {
  ------------------
  |  Branch (917:7): [True: 15.6k, False: 0]
  ------------------
  918|  15.6k|			g_object_get(G_OBJECT(operation),
  ------------------
  |  |   51|  15.6k|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|  15.6k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  15.6k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  919|  15.6k|				g_param_spec_get_name(pspec), arg,
  920|  15.6k|				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|  15.6k|			if (G_IS_PARAM_SPEC_OBJECT(pspec)) {
  ------------------
  |  |  491|  15.6k|#define G_IS_PARAM_SPEC_OBJECT(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OBJECT))
  |  |  ------------------
  |  |  |  |  497|  15.6k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  15.6k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  15.6k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  15.6k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  15.6k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 15.6k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  15.6k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  15.6k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 15.6k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 0, False: 15.6k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  15.6k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  15.6k|  else \
  |  |  |  |  |  | 2321|  15.6k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  15.6k|  __r; \
  |  |  |  |  |  | 2323|  15.6k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (491:44): [True: 0, False: 15.6k]
  |  |  ------------------
  ------------------
  927|      0|				GObject *object;
  928|       |
  929|      0|				object = *((GObject **) arg);
  930|      0|				g_object_unref(object);
  931|      0|			}
  932|  15.6k|		}
  933|       |
  934|  31.3k|		VIPS_ARGUMENT_COLLECT_END
  ------------------
  |  |  429|  15.6k|	}
  ------------------
  935|   556k|	}
  936|       |
  937|  2.45M|	return 0;
  938|  2.45M|}
operation.c:vips_call_by_name:
  995|  2.48M|{
  996|  2.48M|	VipsOperation *operation;
  997|  2.48M|	int result;
  998|       |
  999|  2.48M|	VIPS_DEBUG_MSG("vips_call_by_name: starting for %s ...\n",
  ------------------
  |  |   47|  2.48M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.48M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  2.48M|	{ \
  |  |   49|  2.48M|		; \
  |  |   50|  2.48M|	} \
  |  |   51|  2.48M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.48M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1000|  2.48M|		operation_name);
 1001|       |
 1002|  2.48M|	if (!(operation = vips_operation_new(operation_name)))
  ------------------
  |  Branch (1002:6): [True: 0, False: 2.48M]
  ------------------
 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|  2.48M|	if (option_string &&
  ------------------
  |  Branch (1008:6): [True: 27.6k, False: 2.45M]
  ------------------
 1009|  2.48M|		vips_object_set_from_string(VIPS_OBJECT(operation),
  ------------------
  |  |  433|  27.6k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  27.6k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  27.6k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1009:3): [True: 0, False: 27.6k]
  ------------------
 1010|  27.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|  2.48M|	result = vips_call_required_optional(&operation, required, optional);
 1018|       |
 1019|       |	/* Build failed: junk args and back out.
 1020|       |	 */
 1021|  2.48M|	if (result) {
  ------------------
  |  Branch (1021:6): [True: 29.9k, False: 2.45M]
  ------------------
 1022|  29.9k|		vips_object_unref_outputs(VIPS_OBJECT(operation));
  ------------------
  |  |  433|  29.9k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  29.9k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  29.9k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1023|  29.9k|		g_object_unref(operation);
 1024|       |
 1025|  29.9k|		return -1;
 1026|  29.9k|	}
 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|  2.45M|	g_object_unref(operation);
 1032|       |
 1033|  2.45M|	return result;
 1034|  2.48M|}

vips_rect_isempty:
   97|  5.28M|{
   98|  5.28M|	return r->width <= 0 || r->height <= 0;
  ------------------
  |  Branch (98:9): [True: 108k, False: 5.17M]
  |  Branch (98:26): [True: 101k, False: 5.07M]
  ------------------
   99|  5.28M|}
vips_rect_includesrect:
  112|  2.05M|{
  113|  2.05M|	return r1->left <= r2->left &&
  ------------------
  |  Branch (113:9): [True: 2.00M, False: 54.1k]
  ------------------
  114|  2.05M|		r1->top <= r2->top &&
  ------------------
  |  Branch (114:3): [True: 1.97M, False: 32.1k]
  ------------------
  115|  2.05M|		r1->left + r1->width >= r2->left + r2->width &&
  ------------------
  |  Branch (115:3): [True: 1.96M, False: 6.12k]
  ------------------
  116|  2.05M|		r1->top + r1->height >= r2->top + r2->height;
  ------------------
  |  Branch (116:3): [True: 1.93M, False: 28.1k]
  ------------------
  117|  2.05M|}
vips_rect_marginadjust:
  163|   141k|{
  164|   141k|	r->left -= n;
  165|   141k|	r->top -= n;
  166|   141k|	r->width += 2 * n;
  167|   141k|	r->height += 2 * n;
  168|   141k|}
vips_rect_intersectrect:
  180|  10.0M|{
  181|  10.0M|	int left = VIPS_MAX(r1->left, r2->left);
  ------------------
  |  |   54|  10.0M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 401k, False: 9.67M]
  |  |  ------------------
  ------------------
  182|  10.0M|	int top = VIPS_MAX(r1->top, r2->top);
  ------------------
  |  |   54|  10.0M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 1.28M, False: 8.79M]
  |  |  ------------------
  ------------------
  183|  10.0M|	int right = VIPS_MIN(VIPS_RECT_RIGHT(r1), VIPS_RECT_RIGHT(r2));
  ------------------
  |  |   55|  10.0M|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 553k, False: 9.52M]
  |  |  ------------------
  ------------------
  184|  10.0M|	int bottom = VIPS_MIN(VIPS_RECT_BOTTOM(r1), VIPS_RECT_BOTTOM(r2));
  ------------------
  |  |   55|  10.0M|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 1.91M, False: 8.16M]
  |  |  ------------------
  ------------------
  185|  10.0M|	int width = VIPS_MAX(0, right - left);
  ------------------
  |  |   54|  10.0M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 10.0M]
  |  |  ------------------
  ------------------
  186|  10.0M|	int height = VIPS_MAX(0, bottom - top);
  ------------------
  |  |   54|  10.0M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 10.0M]
  |  |  ------------------
  ------------------
  187|       |
  188|  10.0M|	out->left = left;
  189|  10.0M|	out->top = top;
  190|  10.0M|	out->width = width;
  191|  10.0M|	out->height = height;
  192|  10.0M|}

vips__region_start:
  228|  2.00M|{
  229|  2.00M|	VipsImage *image = region->im;
  230|       |
  231|  2.00M|	if (!region->seq && image->start_fn) {
  ------------------
  |  Branch (231:6): [True: 1.85M, False: 156k]
  |  Branch (231:22): [True: 1.77M, False: 74.8k]
  ------------------
  232|  1.77M|		VIPS_GATE_START("vips__region_start: wait");
  ------------------
  |  |   41|  1.77M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.77M|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  1.77M|	{ \
  |  |   43|  1.77M|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 1.77M]
  |  |  ------------------
  |  |   44|  1.77M|			vips__thread_gate_start(NAME); \
  |  |   45|  1.77M|	} \
  |  |   46|  1.77M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.77M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  233|       |
  234|  1.77M|		g_mutex_lock(image->sslock);
  235|       |
  236|  1.77M|		VIPS_GATE_STOP("vips__region_start: wait");
  ------------------
  |  |   49|  1.77M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.77M|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  1.77M|	{ \
  |  |   51|  1.77M|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 1.77M]
  |  |  ------------------
  |  |   52|  1.77M|			vips__thread_gate_stop(NAME); \
  |  |   53|  1.77M|	} \
  |  |   54|  1.77M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.77M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  237|       |
  238|  1.77M|		region->seq = image->start_fn(image,
  239|  1.77M|			image->client1, image->client2);
  240|       |
  241|  1.77M|		g_mutex_unlock(image->sslock);
  242|       |
  243|  1.77M|		if (!region->seq) {
  ------------------
  |  Branch (243:7): [True: 11.0k, False: 1.76M]
  ------------------
  244|       |#ifdef DEBUG
  245|       |			printf("vips__region_start: start function failed for image %s",
  246|       |				image->filename);
  247|       |#endif /*DEBUG*/
  248|       |
  249|  11.0k|			return -1;
  250|  11.0k|		}
  251|  1.77M|	}
  252|       |
  253|  1.99M|	return 0;
  254|  2.00M|}
vips__region_stop:
  260|  2.59M|{
  261|  2.59M|	VipsImage *image = region->im;
  262|       |
  263|  2.59M|	if (region->seq && image->stop_fn) {
  ------------------
  |  Branch (263:6): [True: 1.76M, False: 831k]
  |  Branch (263:21): [True: 1.76M, False: 0]
  ------------------
  264|  1.76M|		int result;
  265|       |
  266|  1.76M|		VIPS_GATE_START("vips__region_stop: wait");
  ------------------
  |  |   41|  1.76M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.76M|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  1.76M|	{ \
  |  |   43|  1.76M|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 1.76M]
  |  |  ------------------
  |  |   44|  1.76M|			vips__thread_gate_start(NAME); \
  |  |   45|  1.76M|	} \
  |  |   46|  1.76M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.76M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  267|       |
  268|  1.76M|		g_mutex_lock(image->sslock);
  269|       |
  270|  1.76M|		VIPS_GATE_STOP("vips__region_stop: wait");
  ------------------
  |  |   49|  1.76M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.76M|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  1.76M|	{ \
  |  |   51|  1.76M|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 1.76M]
  |  |  ------------------
  |  |   52|  1.76M|			vips__thread_gate_stop(NAME); \
  |  |   53|  1.76M|	} \
  |  |   54|  1.76M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.76M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  271|       |
  272|  1.76M|		result = image->stop_fn(region->seq,
  273|  1.76M|			image->client1, image->client2);
  274|       |
  275|  1.76M|		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|  1.76M|		if (result)
  ------------------
  |  Branch (280:7): [True: 0, False: 1.76M]
  ------------------
  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|  1.76M|				image->filename);
  283|       |
  284|  1.76M|		region->seq = NULL;
  285|  1.76M|	}
  286|  2.59M|}
vips__region_take_ownership:
  379|  2.59M|{
  380|       |	/* Lock so that there's a memory barrier with the thread doing the
  381|       |	 * vips__region_no_ownership() before us.
  382|       |	 */
  383|  2.59M|	VIPS_GATE_START("vips__region_take_ownership: wait");
  ------------------
  |  |   41|  2.59M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.59M|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  2.59M|	{ \
  |  |   43|  2.59M|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 2.59M]
  |  |  ------------------
  |  |   44|  2.59M|			vips__thread_gate_start(NAME); \
  |  |   45|  2.59M|	} \
  |  |   46|  2.59M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.59M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  384|       |
  385|  2.59M|	g_mutex_lock(region->im->sslock);
  386|       |
  387|  2.59M|	VIPS_GATE_STOP("vips__region_take_ownership: wait");
  ------------------
  |  |   49|  2.59M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.59M|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  2.59M|	{ \
  |  |   51|  2.59M|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 2.59M]
  |  |  ------------------
  |  |   52|  2.59M|			vips__thread_gate_stop(NAME); \
  |  |   53|  2.59M|	} \
  |  |   54|  2.59M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.59M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  388|       |
  389|  2.59M|	if (region->thread != g_thread_self()) {
  ------------------
  |  Branch (389:6): [True: 2.59M, False: 0]
  ------------------
  390|  2.59M|		g_assert(region->thread == NULL);
  ------------------
  |  |  166|  2.59M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.59M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.59M|#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|  2.59M|		g_assert(!region->buffer ||
  ------------------
  |  |  166|  2.59M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.59M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.59M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  398|  2.59M|			region->buffer->ref_count == 1);
  399|       |
  400|  2.59M|		region->thread = g_thread_self();
  401|  2.59M|	}
  402|       |
  403|  2.59M|	g_mutex_unlock(region->im->sslock);
  404|  2.59M|}
vips__region_check_ownership:
  408|  5.94M|{
  409|  5.94M|	if (region->thread) {
  ------------------
  |  Branch (409:6): [True: 5.73M, False: 209k]
  ------------------
  410|  5.73M|		g_assert(region->thread == g_thread_self());
  ------------------
  |  |  166|  5.73M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  5.73M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  5.73M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  411|  5.73M|		if (region->buffer && region->buffer->cache)
  ------------------
  |  Branch (411:7): [True: 870k, False: 4.86M]
  |  Branch (411:25): [True: 56.3k, False: 814k]
  ------------------
  412|  5.73M|			g_assert(region->thread ==
  ------------------
  |  |  166|  56.3k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  56.3k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  56.3k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  413|  5.73M|				region->buffer->cache->thread);
  414|  5.73M|	}
  415|  5.94M|}
vips__region_no_ownership:
  422|   209k|{
  423|   209k|	VIPS_GATE_START("vips__region_no_ownership: wait");
  ------------------
  |  |   41|   209k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   209k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   209k|	{ \
  |  |   43|   209k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 209k]
  |  |  ------------------
  |  |   44|   209k|			vips__thread_gate_start(NAME); \
  |  |   45|   209k|	} \
  |  |   46|   209k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   209k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  424|       |
  425|   209k|	g_mutex_lock(region->im->sslock);
  426|       |
  427|   209k|	VIPS_GATE_STOP("vips__region_no_ownership: wait");
  ------------------
  |  |   49|   209k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   209k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|   209k|	{ \
  |  |   51|   209k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 209k]
  |  |  ------------------
  |  |   52|   209k|			vips__thread_gate_stop(NAME); \
  |  |   53|   209k|	} \
  |  |   54|   209k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   209k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  428|       |
  429|   209k|	vips__region_check_ownership(region);
  430|       |
  431|   209k|	region->thread = NULL;
  432|   209k|	if (region->buffer)
  ------------------
  |  Branch (432:6): [True: 0, False: 209k]
  ------------------
  433|      0|		vips_buffer_undone(region->buffer);
  434|       |
  435|   209k|	g_mutex_unlock(region->im->sslock);
  436|   209k|}
vips_region_new:
  505|  2.59M|{
  506|  2.59M|	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|  2.59M|	g_object_ref(image);
  512|  2.59M|	g_assert(G_OBJECT(image)->ref_count > 1);
  ------------------
  |  |  166|  2.59M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.59M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.59M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  513|  2.59M|	g_assert(vips_object_sanity(VIPS_OBJECT(image)));
  ------------------
  |  |  166|  2.59M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.59M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.59M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  514|       |
  515|  2.59M|	region = VIPS_REGION(g_object_new(VIPS_TYPE_REGION, NULL));
  ------------------
  |  |   52|  2.59M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  2.59M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  2.59M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   53|  2.59M|		VIPS_TYPE_REGION, VipsRegion))
  ------------------
  516|  2.59M|	region->im = image;
  517|       |
  518|  2.59M|	if (vips_object_build(VIPS_OBJECT(region))) {
  ------------------
  |  |  433|  2.59M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  2.59M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  2.59M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (518:6): [True: 0, False: 2.59M]
  ------------------
  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|  2.59M|	g_assert(vips_object_sanity(VIPS_OBJECT(region)));
  ------------------
  |  |  166|  2.59M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.59M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.59M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  524|       |
  525|  2.59M|	return region;
  526|  2.59M|}
vips_region_buffer:
  545|  1.90M|{
  546|  1.90M|	VipsImage *im = reg->im;
  547|       |
  548|  1.90M|	VipsRect image;
  549|  1.90M|	VipsRect clipped;
  550|       |
  551|  1.90M|	vips__region_check_ownership(reg);
  552|       |
  553|       |	/* Clip against image.
  554|       |	 */
  555|  1.90M|	image.top = 0;
  556|  1.90M|	image.left = 0;
  557|  1.90M|	image.width = im->Xsize;
  558|  1.90M|	image.height = im->Ysize;
  559|  1.90M|	vips_rect_intersectrect(r, &image, &clipped);
  560|       |
  561|       |	/* Test for empty.
  562|       |	 */
  563|  1.90M|	if (vips_rect_isempty(&clipped)) {
  ------------------
  |  Branch (563:6): [True: 0, False: 1.90M]
  ------------------
  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|  1.90M|	VIPS_FREEF(vips_window_unref, reg->window);
  ------------------
  |  |   41|  1.90M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.90M|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  1.90M|	{ \
  |  |   43|  1.90M|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 1.90M]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|  1.90M|	} \
  |  |   48|  1.90M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.90M|#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|  1.90M|	if (reg->invalid) {
  ------------------
  |  Branch (576:6): [True: 0, False: 1.90M]
  ------------------
  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|  1.90M|	else {
  584|       |		/* We combine buffer unref and new buffer ref in one call
  585|       |		 * to reduce malloc/free cycling.
  586|       |		 */
  587|  1.90M|		if (!(reg->buffer =
  ------------------
  |  Branch (587:7): [True: 0, False: 1.90M]
  ------------------
  588|  1.90M|					vips_buffer_unref_ref(reg->buffer, im, &clipped)))
  589|      0|			return -1;
  590|  1.90M|	}
  591|       |
  592|       |	/* Init new stuff.
  593|       |	 */
  594|  1.90M|	reg->valid = reg->buffer->area;
  595|  1.90M|	reg->bpl = VIPS_IMAGE_SIZEOF_PEL(im) * reg->buffer->area.width;
  ------------------
  |  |  384|  1.90M|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|  1.90M|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  596|  1.90M|	reg->type = VIPS_REGION_BUFFER;
  597|  1.90M|	reg->data = reg->buffer->buf;
  598|       |
  599|  1.90M|	return 0;
  600|  1.90M|}
vips_region_image:
  615|   416k|{
  616|   416k|	VipsImage *image = reg->im;
  617|       |
  618|   416k|	VipsRect all;
  619|   416k|	VipsRect clipped;
  620|       |
  621|       |	/* Sanity check.
  622|       |	 */
  623|   416k|	vips__region_check_ownership(reg);
  624|       |
  625|       |	/* Clip against image.
  626|       |	 */
  627|   416k|	all.top = 0;
  628|   416k|	all.left = 0;
  629|   416k|	all.width = image->Xsize;
  630|   416k|	all.height = image->Ysize;
  631|   416k|	vips_rect_intersectrect(r, &all, &clipped);
  632|       |
  633|   416k|	if (vips_rect_isempty(&clipped)) {
  ------------------
  |  Branch (633:6): [True: 0, False: 416k]
  ------------------
  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|   416k|	reg->invalid = FALSE;
  ------------------
  |  |  794|   416k|#define	FALSE	(0)
  ------------------
  640|   416k|	VIPS_FREEF(vips_buffer_unref, reg->buffer);
  ------------------
  |  |   41|   416k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   416k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   416k|	{ \
  |  |   43|   416k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 416k]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|   416k|	} \
  |  |   48|   416k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   416k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  641|       |
  642|   416k|	if (image->data) {
  ------------------
  |  Branch (642:6): [True: 416k, False: 0]
  ------------------
  643|       |		/* We have the whole image available ... easy!
  644|       |		 */
  645|   416k|		VIPS_FREEF(vips_window_unref, reg->window);
  ------------------
  |  |   41|   416k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   416k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   416k|	{ \
  |  |   43|   416k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 416k]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|   416k|	} \
  |  |   48|   416k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   416k|#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|   416k|		reg->valid = clipped;
  651|   416k|		reg->bpl = VIPS_IMAGE_SIZEOF_LINE(image);
  ------------------
  |  |  386|   416k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  ------------------
  |  |  |  |  384|   416k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  ------------------
  |  |  |  |  |  |  382|   416k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  652|   416k|		reg->data = VIPS_IMAGE_ADDR(image, clipped.left, clipped.top);
  ------------------
  |  |  418|   416k|	((I)->data + \
  |  |  419|   416k|		(Y) *VIPS_IMAGE_SIZEOF_LINE(I) + \
  |  |  ------------------
  |  |  |  |  386|   416k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   416k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   416k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  420|   416k|		(X) *VIPS_IMAGE_SIZEOF_PEL(I))
  |  |  ------------------
  |  |  |  |  384|   416k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  ------------------
  |  |  |  |  |  |  382|   416k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  653|   416k|		reg->type = VIPS_REGION_OTHER_IMAGE;
  654|   416k|	}
  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|   416k|	return 0;
  680|   416k|}
vips_region_region:
  708|  1.50M|{
  709|  1.50M|	VipsRect image;
  710|  1.50M|	VipsRect wanted;
  711|  1.50M|	VipsRect clipped;
  712|  1.50M|	VipsRect clipped2;
  713|  1.50M|	VipsRect final;
  714|       |
  715|       |	/* Sanity check.
  716|       |	 */
  717|  1.50M|	if (!dest->data) {
  ------------------
  |  Branch (717:6): [True: 0, False: 1.50M]
  ------------------
  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|  1.50M|	if (VIPS_IMAGE_SIZEOF_PEL(dest->im) !=
  ------------------
  |  |  384|  1.50M|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|  1.50M|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  |  Branch (722:6): [True: 0, False: 1.50M]
  ------------------
  723|  1.50M|		VIPS_IMAGE_SIZEOF_PEL(reg->im)) {
  ------------------
  |  |  384|  1.50M|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|  1.50M|	(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|  1.50M|	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|  1.50M|	image.top = 0;
  741|  1.50M|	image.left = 0;
  742|  1.50M|	image.width = reg->im->Xsize;
  743|  1.50M|	image.height = reg->im->Ysize;
  744|  1.50M|	vips_rect_intersectrect(r, &image, &clipped);
  745|       |
  746|       |	/* Translate to dest's coordinate space and clip against the available
  747|       |	 * pixels.
  748|       |	 */
  749|  1.50M|	wanted.left = x + (clipped.left - r->left);
  750|  1.50M|	wanted.top = y + (clipped.top - r->top);
  751|  1.50M|	wanted.width = clipped.width;
  752|  1.50M|	wanted.height = clipped.height;
  753|       |
  754|       |	/* Test that dest->valid is large enough.
  755|       |	 */
  756|  1.50M|	if (!vips_rect_includesrect(&dest->valid, &wanted)) {
  ------------------
  |  Branch (756:6): [True: 0, False: 1.50M]
  ------------------
  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|  1.50M|	vips_rect_intersectrect(&wanted, &dest->valid, &clipped2);
  765|       |
  766|       |	/* Translate back to reg's coordinate space and set as valid.
  767|       |	 */
  768|  1.50M|	final.left = r->left + (clipped2.left - wanted.left);
  769|  1.50M|	final.top = r->top + (clipped2.top - wanted.top);
  770|  1.50M|	final.width = clipped2.width;
  771|  1.50M|	final.height = clipped2.height;
  772|       |
  773|       |	/* Test for empty.
  774|       |	 */
  775|  1.50M|	if (vips_rect_isempty(&final)) {
  ------------------
  |  Branch (775:6): [True: 0, False: 1.50M]
  ------------------
  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|  1.50M|	VIPS_FREEF(vips_buffer_unref, reg->buffer);
  ------------------
  |  |   41|  1.50M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.50M|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  1.50M|	{ \
  |  |   43|  1.50M|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 814k, False: 690k]
  |  |  ------------------
  |  |   44|   814k|			(void) F((S)); \
  |  |   45|   814k|			(S) = 0; \
  |  |   46|   814k|		} \
  |  |   47|  1.50M|	} \
  |  |   48|  1.50M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.50M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  784|  1.50M|	VIPS_FREEF(vips_window_unref, reg->window);
  ------------------
  |  |   41|  1.50M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.50M|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  1.50M|	{ \
  |  |   43|  1.50M|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 1.50M]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|  1.50M|	} \
  |  |   48|  1.50M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.50M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  785|  1.50M|	reg->invalid = FALSE;
  ------------------
  |  |  794|  1.50M|#define	FALSE	(0)
  ------------------
  786|  1.50M|	reg->valid = final;
  787|  1.50M|	reg->bpl = dest->bpl;
  788|  1.50M|	reg->data = VIPS_REGION_ADDR(dest, clipped2.left, clipped2.top);
  ------------------
  |  |  227|  1.50M|	((R)->data + \
  |  |  228|  1.50M|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  1.50M|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  1.50M|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  1.50M|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  1.50M|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  1.50M|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  789|  1.50M|	reg->type = VIPS_REGION_OTHER_REGION;
  790|       |
  791|  1.50M|	return 0;
  792|  1.50M|}
vips_region_fill:
  860|  1.69M|{
  861|  1.69M|	g_assert(reg->im->dtype == VIPS_IMAGE_PARTIAL);
  ------------------
  |  |  166|  1.69M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  1.69M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.69M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  862|  1.69M|	g_assert(reg->im->generate_fn);
  ------------------
  |  |  166|  1.69M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  1.69M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.69M|#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|  1.69M|	if (vips_region_buffer(reg, r))
  ------------------
  |  Branch (875:6): [True: 0, False: 1.69M]
  ------------------
  876|      0|		return -1;
  877|       |
  878|       |	/* Evaluate into out_region, if we've not got calculated pixels.
  879|       |	 */
  880|  1.69M|	if (!reg->buffer->done) {
  ------------------
  |  Branch (880:6): [True: 1.57M, False: 120k]
  ------------------
  881|  1.57M|		if (fn(reg, a))
  ------------------
  |  Branch (881:7): [True: 402k, False: 1.17M]
  ------------------
  882|   402k|			return -1;
  883|       |
  884|       |		/* Publish our results.
  885|       |		 */
  886|  1.17M|		if (reg->buffer)
  ------------------
  |  Branch (886:7): [True: 360k, False: 814k]
  ------------------
  887|   360k|			vips_buffer_done(reg->buffer);
  888|  1.17M|	}
  889|       |
  890|  1.29M|	return 0;
  891|  1.69M|}
vips_region_paint:
  923|   116k|{
  924|   116k|	VipsRect clipped;
  925|       |
  926|   116k|	vips_rect_intersectrect(r, &reg->valid, &clipped);
  927|   116k|	if (!vips_rect_isempty(&clipped)) {
  ------------------
  |  Branch (927:6): [True: 116k, False: 0]
  ------------------
  928|   116k|		VipsPel *q = VIPS_REGION_ADDR(reg, clipped.left, clipped.top);
  ------------------
  |  |  227|   116k|	((R)->data + \
  |  |  228|   116k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   116k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   116k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   116k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   116k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   116k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  929|   116k|		size_t ls = VIPS_REGION_LSKIP(reg);
  ------------------
  |  |  195|   116k|	((size_t) ((R)->bpl))
  ------------------
  930|   116k|		size_t wd = clipped.width * VIPS_IMAGE_SIZEOF_PEL(reg->im);
  ------------------
  |  |  384|   116k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|   116k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  931|   116k|		int y;
  932|       |
  933|   116k|		if (vips_band_format_isint(reg->im->BandFmt)) {
  ------------------
  |  Branch (933:7): [True: 116k, False: 15]
  ------------------
  934|   314k|			for (y = 0; y < clipped.height; y++) {
  ------------------
  |  Branch (934:16): [True: 198k, False: 116k]
  ------------------
  935|   198k|				memset((char *) q, value, wd);
  936|   198k|				q += ls;
  937|   198k|			}
  938|   116k|		}
  939|     15|		else {
  940|     15|			gboolean iscomplex =
  941|     15|				vips_band_format_iscomplex(reg->im->BandFmt);
  942|     15|			int nele = clipped.width * reg->im->Bands *
  943|     15|				(iscomplex ? 2 : 1);
  ------------------
  |  Branch (943:6): [True: 0, False: 15]
  ------------------
  944|     15|			VipsPel *q1;
  945|       |
  946|     15|			switch (reg->im->BandFmt) {
  947|     15|			case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (947:4): [True: 15, False: 0]
  ------------------
  948|     15|			case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (948:4): [True: 0, False: 15]
  ------------------
  949|     15|				FILL_LINE(float, q, nele, value);
  ------------------
  |  |  894|     15|	{ \
  |  |  895|     15|		int x; \
  |  |  896|     15|		TYPE *QT = (TYPE *) Q; \
  |  |  897|     15|\
  |  |  898|    783|		for (x = 0; x < (N); x++) \
  |  |  ------------------
  |  |  |  Branch (898:15): [True: 768, False: 15]
  |  |  ------------------
  |  |  899|    768|			QT[x] = (V); \
  |  |  900|     15|	}
  ------------------
  950|     15|				break;
  951|       |
  952|      0|			case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (952:4): [True: 0, False: 15]
  ------------------
  953|      0|			case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (953:4): [True: 0, False: 15]
  ------------------
  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: 15]
  ------------------
  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|     15|			}
  960|       |
  961|     15|			q1 = q + ls;
  962|       |
  963|    231|			for (y = 1; y < clipped.height; y++) {
  ------------------
  |  Branch (963:16): [True: 216, False: 15]
  ------------------
  964|    216|				memcpy((char *) q1, (char *) q, wd);
  965|    216|				q1 += ls;
  966|    216|			}
  967|     15|		}
  968|   116k|	}
  969|   116k|}
vips_region_black:
 1032|   116k|{
 1033|   116k|	vips_region_paint(reg, &reg->valid, 0);
 1034|   116k|}
vips_region_copy:
 1053|   477k|{
 1054|   477k|	size_t len = VIPS_IMAGE_SIZEOF_PEL(reg->im) * r->width;
  ------------------
  |  |  384|   477k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|   477k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
 1055|   477k|	VipsPel *p = VIPS_REGION_ADDR(reg, r->left, r->top);
  ------------------
  |  |  227|   477k|	((R)->data + \
  |  |  228|   477k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   477k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   477k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   477k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   477k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   477k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1056|   477k|	VipsPel *q = VIPS_REGION_ADDR(dest, x, y);
  ------------------
  |  |  227|   477k|	((R)->data + \
  |  |  228|   477k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   477k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   477k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   477k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   477k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   477k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1057|   477k|	size_t plsk = VIPS_REGION_LSKIP(reg);
  ------------------
  |  |  195|   477k|	((size_t) ((R)->bpl))
  ------------------
 1058|   477k|	size_t qlsk = VIPS_REGION_LSKIP(dest);
  ------------------
  |  |  195|   477k|	((size_t) ((R)->bpl))
  ------------------
 1059|       |
 1060|   477k|	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|   477k|	if (len == plsk &&
  ------------------
  |  Branch (1095:6): [True: 475k, False: 2.65k]
  ------------------
 1096|   477k|		len == qlsk)
  ------------------
  |  Branch (1096:3): [True: 415k, False: 59.9k]
  ------------------
 1097|   415k|		memcpy(q, p, len * r->height);
 1098|  62.6k|	else
 1099|  1.43M|		for (z = 0; z < r->height; z++) {
  ------------------
  |  Branch (1099:15): [True: 1.37M, False: 62.6k]
  ------------------
 1100|  1.37M|			memcpy(q, p, len);
 1101|       |
 1102|  1.37M|			p += plsk;
 1103|  1.37M|			q += qlsk;
 1104|  1.37M|		}
 1105|   477k|}
vips_region_prepare:
 1657|  1.90M|{
 1658|  1.90M|	VipsImage *im = reg->im;
 1659|       |
 1660|  1.90M|	VipsRect save = *r;
 1661|       |
 1662|  1.90M|	vips__region_check_ownership(reg);
 1663|       |
 1664|  1.90M|	if (vips_image_iskilled(im))
  ------------------
  |  Branch (1664:6): [True: 0, False: 1.90M]
  ------------------
 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|  1.90M|	{
 1675|  1.90M|		VipsRect image;
 1676|       |
 1677|  1.90M|		image.left = 0;
 1678|  1.90M|		image.top = 0;
 1679|  1.90M|		image.width = reg->im->Xsize;
 1680|  1.90M|		image.height = reg->im->Ysize;
 1681|  1.90M|		vips_rect_intersectrect(&save, &image, &save);
 1682|  1.90M|	}
 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|  1.90M|	switch (im->dtype) {
 1691|  1.69M|	case VIPS_IMAGE_PARTIAL:
  ------------------
  |  Branch (1691:2): [True: 1.69M, False: 210k]
  ------------------
 1692|  1.69M|		if (vips_region_fill(reg, r, vips_region_generate, NULL))
  ------------------
  |  Branch (1692:7): [True: 402k, False: 1.29M]
  ------------------
 1693|   402k|			return -1;
 1694|       |
 1695|  1.29M|		break;
 1696|       |
 1697|  1.29M|	case VIPS_IMAGE_SETBUF:
  ------------------
  |  Branch (1697:2): [True: 210k, False: 1.69M]
  ------------------
 1698|   210k|	case VIPS_IMAGE_SETBUF_FOREIGN:
  ------------------
  |  Branch (1698:2): [True: 0, False: 1.90M]
  ------------------
 1699|   210k|	case VIPS_IMAGE_MMAPIN:
  ------------------
  |  Branch (1699:2): [True: 0, False: 1.90M]
  ------------------
 1700|   210k|	case VIPS_IMAGE_MMAPINRW:
  ------------------
  |  Branch (1700:2): [True: 0, False: 1.90M]
  ------------------
 1701|   210k|	case VIPS_IMAGE_OPENIN:
  ------------------
  |  Branch (1701:2): [True: 0, False: 1.90M]
  ------------------
 1702|       |		/* Attach to existing buffer.
 1703|       |		 */
 1704|   210k|		if (vips_region_image(reg, r))
  ------------------
  |  Branch (1704:7): [True: 0, False: 210k]
  ------------------
 1705|      0|			return -1;
 1706|       |
 1707|   210k|		break;
 1708|       |
 1709|   210k|	default:
  ------------------
  |  Branch (1709:2): [True: 0, False: 1.90M]
  ------------------
 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|  1.90M|	}
 1715|       |
 1716|       |	/* valid should now include all the pixels that were asked for.
 1717|       |	 */
 1718|  1.90M|	g_assert(vips_rect_includesrect(&reg->valid, &save));
  ------------------
  |  |  166|  1.90M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  1.50M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.90M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1719|       |
 1720|  1.50M|	return 0;
 1721|  1.90M|}
vips_region_prepare_to:
 1787|   431k|{
 1788|   431k|	VipsImage *im = reg->im;
 1789|   431k|	VipsRect image;
 1790|   431k|	VipsRect wanted;
 1791|   431k|	VipsRect clipped;
 1792|   431k|	VipsRect clipped2;
 1793|   431k|	VipsRect final;
 1794|       |
 1795|   431k|	if (vips_image_iskilled(im))
  ------------------
  |  Branch (1795:6): [True: 0, False: 431k]
  ------------------
 1796|      0|		return -1;
 1797|       |
 1798|       |	/* Sanity check.
 1799|       |	 */
 1800|   431k|	if (!dest->data ||
  ------------------
  |  Branch (1800:6): [True: 0, False: 431k]
  ------------------
 1801|   431k|		dest->im->BandFmt != reg->im->BandFmt ||
  ------------------
  |  Branch (1801:3): [True: 0, False: 431k]
  ------------------
 1802|   431k|		dest->im->Bands != reg->im->Bands) {
  ------------------
  |  Branch (1802:3): [True: 0, False: 431k]
  ------------------
 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|   431k|	image.top = 0;
 1813|   431k|	image.left = 0;
 1814|   431k|	image.width = reg->im->Xsize;
 1815|   431k|	image.height = reg->im->Ysize;
 1816|   431k|	vips_rect_intersectrect(r, &image, &clipped);
 1817|       |
 1818|   431k|	g_assert(clipped.left == r->left);
  ------------------
  |  |  166|   431k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   431k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   431k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1819|   431k|	g_assert(clipped.top == r->top);
  ------------------
  |  |  166|   431k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   431k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   431k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1820|       |
 1821|   431k|	wanted.left = x + (clipped.left - r->left);
 1822|   431k|	wanted.top = y + (clipped.top - r->top);
 1823|   431k|	wanted.width = clipped.width;
 1824|   431k|	wanted.height = clipped.height;
 1825|       |
 1826|       |	/* Test that dest->valid is large enough.
 1827|       |	 */
 1828|   431k|	if (!vips_rect_includesrect(&dest->valid, &wanted)) {
  ------------------
  |  Branch (1828:6): [True: 0, False: 431k]
  ------------------
 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|   431k|	vips_rect_intersectrect(&wanted, &dest->valid, &clipped2);
 1835|       |
 1836|       |	/* Translate back to reg's coordinate space and set as valid.
 1837|       |	 */
 1838|   431k|	final.left = r->left + (clipped2.left - wanted.left);
 1839|   431k|	final.top = r->top + (clipped2.top - wanted.top);
 1840|   431k|	final.width = clipped2.width;
 1841|   431k|	final.height = clipped2.height;
 1842|       |
 1843|   431k|	x = clipped2.left;
 1844|   431k|	y = clipped2.top;
 1845|       |
 1846|   431k|	if (vips_rect_isempty(&final)) {
  ------------------
  |  Branch (1846:6): [True: 0, False: 431k]
  ------------------
 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|   431k|	switch (im->dtype) {
 1861|      0|	case VIPS_IMAGE_OPENOUT:
  ------------------
  |  Branch (1861:2): [True: 0, False: 431k]
  ------------------
 1862|   201k|	case VIPS_IMAGE_PARTIAL:
  ------------------
  |  Branch (1862:2): [True: 201k, False: 230k]
  ------------------
 1863|       |		/* We are generating with a sequence.
 1864|       |		 */
 1865|   201k|		if (vips_region_prepare_to_generate(reg, dest, &final, x, y))
  ------------------
  |  Branch (1865:7): [True: 57.6k, False: 143k]
  ------------------
 1866|  57.6k|			return -1;
 1867|       |
 1868|   143k|		break;
 1869|       |
 1870|   143k|	case VIPS_IMAGE_MMAPIN:
  ------------------
  |  Branch (1870:2): [True: 0, False: 431k]
  ------------------
 1871|      0|	case VIPS_IMAGE_MMAPINRW:
  ------------------
  |  Branch (1871:2): [True: 0, False: 431k]
  ------------------
 1872|      0|	case VIPS_IMAGE_OPENIN:
  ------------------
  |  Branch (1872:2): [True: 0, False: 431k]
  ------------------
 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|   230k|	case VIPS_IMAGE_SETBUF:
  ------------------
  |  Branch (1881:2): [True: 230k, False: 201k]
  ------------------
 1882|   230k|	case VIPS_IMAGE_SETBUF_FOREIGN:
  ------------------
  |  Branch (1882:2): [True: 0, False: 431k]
  ------------------
 1883|       |		/* Could be either input or output. If there is a generate
 1884|       |		 * function, we are outputting.
 1885|       |		 */
 1886|   230k|		if (im->generate_fn) {
  ------------------
  |  Branch (1886:7): [True: 230k, False: 0]
  ------------------
 1887|   230k|			if (vips_region_prepare_to_generate(reg,
  ------------------
  |  Branch (1887:8): [True: 9.17k, False: 221k]
  ------------------
 1888|   230k|					dest, &final, x, y))
 1889|  9.17k|				return -1;
 1890|   230k|		}
 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|   221k|		break;
 1898|       |
 1899|   221k|	default:
  ------------------
  |  Branch (1899:2): [True: 0, False: 431k]
  ------------------
 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|   431k|	}
 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|   364k|	dest->invalid = FALSE;
  ------------------
  |  |  794|   364k|#define	FALSE	(0)
  ------------------
 1914|       |
 1915|   364k|	return 0;
 1916|   431k|}
vips__region_count_pixels:
 2071|   159k|{
 2072|   159k|	VipsImage *image = region->im;
 2073|   159k|	VipsImagePixels *pixels = g_object_get_qdata(G_OBJECT(image),
  ------------------
  |  |   51|   159k|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|   159k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   159k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2074|   159k|		vips__image_pixels_quark);
 2075|       |
 2076|   159k|	g_mutex_lock(&vips__global_lock);
 2077|   159k|	if (!pixels->tpels)
  ------------------
  |  Branch (2077:6): [True: 159k, False: 75]
  ------------------
 2078|   159k|		pixels->tpels = VIPS_IMAGE_N_PELS(image);
  ------------------
  |  |  392|   159k|	((guint64) (I)->Xsize * (I)->Ysize)
  ------------------
 2079|   159k|	if (!pixels->nickname)
  ------------------
  |  Branch (2079:6): [True: 159k, False: 75]
  ------------------
 2080|   159k|		pixels->nickname = nickname;
 2081|   159k|	pixels->npels += region->valid.width * region->valid.height;
 2082|   159k|	g_mutex_unlock(&vips__global_lock);
 2083|   159k|}
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|  2.59M|{
  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|  2.59M|	G_OBJECT_CLASS(vips_region_parent_class)->finalize(gobject);
  ------------------
  |  |   58|  2.59M|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  2.59M|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  2.59M|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  222|  2.59M|}
region.c:vips_region_dispose:
  290|  2.59M|{
  291|  2.59M|	VipsRegion *region = VIPS_REGION(gobject);
  ------------------
  |  |   52|  2.59M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  2.59M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  2.59M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   53|  2.59M|		VIPS_TYPE_REGION, VipsRegion))
  ------------------
  292|  2.59M|	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|  2.59M|	vips_object_preclose(VIPS_OBJECT(gobject));
  ------------------
  |  |  433|  2.59M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  2.59M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  2.59M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  301|       |
  302|       |	/* Stop this sequence.
  303|       |	 */
  304|  2.59M|	vips__region_stop(region);
  305|       |
  306|       |	/* Free any attached memory.
  307|       |	 */
  308|  2.59M|	VIPS_FREEF(vips_window_unref, region->window);
  ------------------
  |  |   41|  2.59M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.59M|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  2.59M|	{ \
  |  |   43|  2.59M|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 2.59M]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|  2.59M|	} \
  |  |   48|  2.59M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.59M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  309|  2.59M|	VIPS_FREEF(vips_buffer_unref, region->buffer);
  ------------------
  |  |   41|  2.59M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.59M|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  2.59M|	{ \
  |  |   43|  2.59M|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 1.06M, False: 1.53M]
  |  |  ------------------
  |  |   44|  1.06M|			(void) F((S)); \
  |  |   45|  1.06M|			(S) = 0; \
  |  |   46|  1.06M|		} \
  |  |   47|  2.59M|	} \
  |  |   48|  2.59M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.59M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  310|       |
  311|       |	/* Detach from image.
  312|       |	 */
  313|  2.59M|	VIPS_GATE_START("vips_region_dispose: wait");
  ------------------
  |  |   41|  2.59M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.59M|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  2.59M|	{ \
  |  |   43|  2.59M|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 2.59M]
  |  |  ------------------
  |  |   44|  2.59M|			vips__thread_gate_start(NAME); \
  |  |   45|  2.59M|	} \
  |  |   46|  2.59M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.59M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  314|       |
  315|  2.59M|	g_mutex_lock(image->sslock);
  316|       |
  317|  2.59M|	VIPS_GATE_STOP("vips_region_dispose: wait");
  ------------------
  |  |   49|  2.59M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.59M|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  2.59M|	{ \
  |  |   51|  2.59M|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 2.59M]
  |  |  ------------------
  |  |   52|  2.59M|			vips__thread_gate_stop(NAME); \
  |  |   53|  2.59M|	} \
  |  |   54|  2.59M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.59M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  318|       |
  319|  2.59M|	image->regions = g_slist_remove(image->regions, region);
  320|       |
  321|  2.59M|	g_mutex_unlock(image->sslock);
  322|       |
  323|  2.59M|	region->im = NULL;
  324|       |
  325|  2.59M|	g_object_unref(image);
  326|       |
  327|  2.59M|	G_OBJECT_CLASS(vips_region_parent_class)->dispose(gobject);
  ------------------
  |  |   58|  2.59M|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  2.59M|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  2.59M|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  328|  2.59M|}
region.c:vips_region_build:
  440|  2.59M|{
  441|  2.59M|	VipsRegion *region = VIPS_REGION(object);
  ------------------
  |  |   52|  2.59M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  2.59M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  2.59M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   53|  2.59M|		VIPS_TYPE_REGION, VipsRegion))
  ------------------
  442|  2.59M|	VipsImage *image = region->im;
  443|       |
  444|  2.59M|	VIPS_DEBUG_MSG("vips_region_build: %p\n", region);
  ------------------
  |  |   47|  2.59M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.59M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  2.59M|	{ \
  |  |   49|  2.59M|		; \
  |  |   50|  2.59M|	} \
  |  |   51|  2.59M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.59M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  445|       |
  446|  2.59M|	if (VIPS_OBJECT_CLASS(vips_region_parent_class)->build(object))
  ------------------
  |  |  435|  2.59M|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  2.59M|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  2.59M|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (446:6): [True: 0, False: 2.59M]
  ------------------
  447|      0|		return -1;
  448|       |
  449|  2.59M|	vips__region_take_ownership(region);
  450|       |
  451|       |	/* We're usually inside the ss lock anyway. But be safe ...
  452|       |	 */
  453|  2.59M|	VIPS_GATE_START("vips_region_build: wait");
  ------------------
  |  |   41|  2.59M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.59M|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  2.59M|	{ \
  |  |   43|  2.59M|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 2.59M]
  |  |  ------------------
  |  |   44|  2.59M|			vips__thread_gate_start(NAME); \
  |  |   45|  2.59M|	} \
  |  |   46|  2.59M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.59M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  454|       |
  455|  2.59M|	g_mutex_lock(image->sslock);
  456|       |
  457|  2.59M|	VIPS_GATE_STOP("vips_region_build: wait");
  ------------------
  |  |   49|  2.59M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.59M|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  2.59M|	{ \
  |  |   51|  2.59M|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 2.59M]
  |  |  ------------------
  |  |   52|  2.59M|			vips__thread_gate_stop(NAME); \
  |  |   53|  2.59M|	} \
  |  |   54|  2.59M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.59M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  458|       |
  459|  2.59M|	image->regions = g_slist_prepend(image->regions, region);
  460|       |
  461|  2.59M|	g_mutex_unlock(image->sslock);
  462|       |
  463|  2.59M|	return 0;
  464|  2.59M|}
region.c:vips_region_init:
  482|  2.59M|{
  483|  2.59M|	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|  2.59M|}
region.c:vips_region_generate:
 1611|  2.00M|{
 1612|  2.00M|	VipsImage *im = reg->im;
 1613|       |
 1614|  2.00M|	gboolean stop;
 1615|       |
 1616|       |	/* Start new sequence, if necessary.
 1617|       |	 */
 1618|  2.00M|	if (vips__region_start(reg))
  ------------------
  |  Branch (1618:6): [True: 11.0k, False: 1.99M]
  ------------------
 1619|  11.0k|		return -1;
 1620|       |
 1621|       |	/* Ask for evaluation.
 1622|       |	 */
 1623|  1.99M|	stop = FALSE;
  ------------------
  |  |  794|  1.99M|#define	FALSE	(0)
  ------------------
 1624|  1.99M|	if (im->generate_fn(reg, reg->seq, im->client1, im->client2, &stop))
  ------------------
  |  Branch (1624:6): [True: 458k, False: 1.53M]
  ------------------
 1625|   458k|		return -1;
 1626|  1.53M|	if (stop) {
  ------------------
  |  Branch (1626:6): [True: 0, False: 1.53M]
  ------------------
 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|  1.53M|	return 0;
 1633|  1.53M|}
region.c:vips_region_prepare_to_generate:
 1729|   431k|{
 1730|   431k|	VipsImage *im = reg->im;
 1731|   431k|	VipsPel *p;
 1732|       |
 1733|   431k|	if (!im->generate_fn) {
  ------------------
  |  Branch (1733:6): [True: 0, False: 431k]
  ------------------
 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|   431k|	if (vips_region_region(reg, dest, r, x, y))
  ------------------
  |  Branch (1739:6): [True: 0, False: 431k]
  ------------------
 1740|      0|		return -1;
 1741|       |
 1742|       |	/* Remember where reg is pointing now.
 1743|       |	 */
 1744|   431k|	p = VIPS_REGION_ADDR(reg, reg->valid.left, reg->valid.top);
  ------------------
  |  |  227|   431k|	((R)->data + \
  |  |  228|   431k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   431k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   431k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   431k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   431k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   431k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1745|       |
 1746|       |	/* Run sequence into reg.
 1747|       |	 */
 1748|   431k|	if (vips_region_generate(reg, NULL))
  ------------------
  |  Branch (1748:6): [True: 66.8k, False: 364k]
  ------------------
 1749|  66.8k|		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|   364k|	if (VIPS_REGION_ADDR(reg, reg->valid.left, reg->valid.top) != p)
  ------------------
  |  |  227|   364k|	((R)->data + \
  |  |  228|   364k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   364k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   364k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   364k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   364k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   364k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1755:6): [True: 259k, False: 105k]
  ------------------
 1756|   259k|		vips_region_copy(reg, dest, r, x, y);
 1757|       |
 1758|   364k|	return 0;
 1759|   431k|}

vips__reorder_set_input:
  171|  2.67M|{
  172|  2.67M|	VipsReorder *reorder = vips_reorder_get(image);
  173|       |
  174|  2.67M|	int i;
  175|  2.67M|	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|  2.67M|	if (reorder->source) {
  ------------------
  |  Branch (185:6): [True: 28.4k, False: 2.64M]
  ------------------
  186|  28.4k|		if (reorder->n_inputs == 0) {
  ------------------
  |  Branch (186:7): [True: 28.4k, False: 0]
  ------------------
  187|  28.4k|			reorder->n_sources = 0;
  188|  28.4k|			vips_reorder_free(reorder);
  189|  28.4k|		}
  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|  28.4k|	}
  203|       |
  204|       |	/* Make a copy of the input array.
  205|       |	 */
  206|  5.64M|	for (i = 0; in[i]; i++)
  ------------------
  |  Branch (206:14): [True: 2.96M, False: 2.67M]
  ------------------
  207|  2.96M|		;
  208|  2.67M|	reorder->n_inputs = i;
  209|  2.67M|	reorder->input = VIPS_ARRAY(NULL, reorder->n_inputs + 1, VipsImage *);
  ------------------
  |  |   72|  2.67M|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  2.67M|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  2.67M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  2.67M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  2.67M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  210|  2.67M|	reorder->score = VIPS_ARRAY(NULL, reorder->n_inputs, int);
  ------------------
  |  |   72|  2.67M|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  2.67M|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  2.67M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  2.67M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  2.67M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  211|  2.67M|	reorder->recomp_order = VIPS_ARRAY(NULL, reorder->n_inputs, int);
  ------------------
  |  |   72|  2.67M|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  2.67M|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  2.67M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  2.67M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  2.67M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  212|  2.67M|	if (!reorder->input)
  ------------------
  |  Branch (212:6): [True: 0, False: 2.67M]
  ------------------
  213|      0|		return -1;
  214|  2.67M|	if (reorder->n_inputs &&
  ------------------
  |  Branch (214:6): [True: 2.59M, False: 80.2k]
  ------------------
  215|  2.67M|		(!reorder->score ||
  ------------------
  |  Branch (215:4): [True: 0, False: 2.59M]
  ------------------
  216|  2.59M|			!reorder->recomp_order))
  ------------------
  |  Branch (216:4): [True: 0, False: 2.59M]
  ------------------
  217|      0|		return -1;
  218|       |
  219|  5.64M|	for (i = 0; i < reorder->n_inputs; i++) {
  ------------------
  |  Branch (219:14): [True: 2.96M, False: 2.67M]
  ------------------
  220|  2.96M|		reorder->input[i] = in[i];
  221|  2.96M|		reorder->score[i] = 0;
  222|  2.96M|		reorder->recomp_order[i] = i;
  223|  2.96M|	}
  224|  2.67M|	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|  2.67M|	total = 0;
  230|  5.64M|	for (i = 0; i < reorder->n_inputs; i++)
  ------------------
  |  Branch (230:14): [True: 2.96M, False: 2.67M]
  ------------------
  231|  2.96M|		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|  2.67M|	total = VIPS_MAX(1, total);
  ------------------
  |  |   54|  2.67M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 493k, False: 2.17M]
  |  |  ------------------
  ------------------
  237|       |
  238|  2.67M|	reorder->source = VIPS_ARRAY(NULL, total + 1, VipsImage *);
  ------------------
  |  |   72|  2.67M|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  2.67M|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  2.67M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  2.67M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  2.67M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  239|  2.67M|	reorder->cumulative_margin = VIPS_ARRAY(NULL, total, int);
  ------------------
  |  |   72|  2.67M|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  2.67M|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  2.67M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  2.67M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  2.67M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  240|  2.67M|	if (!reorder->source ||
  ------------------
  |  Branch (240:6): [True: 0, False: 2.67M]
  ------------------
  241|  2.67M|		!reorder->cumulative_margin)
  ------------------
  |  Branch (241:3): [True: 0, False: 2.67M]
  ------------------
  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|  5.64M|	for (i = 0; i < reorder->n_inputs; i++) {
  ------------------
  |  Branch (248:14): [True: 2.96M, False: 2.67M]
  ------------------
  249|  2.96M|		VipsReorder *input = vips_reorder_get(reorder->input[i]);
  250|       |
  251|  2.96M|		int j;
  252|       |
  253|  5.82M|		for (j = 0; j < input->n_sources; j++) {
  ------------------
  |  Branch (253:15): [True: 2.85M, False: 2.96M]
  ------------------
  254|  2.85M|			int k;
  255|       |
  256|       |			/* Search for dupe.
  257|       |			 */
  258|  3.20M|			for (k = 0; k < reorder->n_sources; k++)
  ------------------
  |  Branch (258:16): [True: 698k, False: 2.50M]
  ------------------
  259|   698k|				if (reorder->source[k] == input->source[j])
  ------------------
  |  Branch (259:9): [True: 355k, False: 343k]
  ------------------
  260|   355k|					break;
  261|       |
  262|  2.85M|			if (k < reorder->n_sources) {
  ------------------
  |  Branch (262:8): [True: 355k, False: 2.50M]
  ------------------
  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|   355k|				reorder->score[i] +=
  269|   355k|					input->cumulative_margin[j] -
  270|   355k|					reorder->cumulative_margin[k];
  271|       |
  272|   355k|				reorder->cumulative_margin[k] = VIPS_MAX(
  ------------------
  |  |   54|   355k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 38.1k, False: 317k]
  |  |  ------------------
  ------------------
  273|   355k|					reorder->cumulative_margin[k],
  274|   355k|					input->cumulative_margin[j]);
  275|   355k|			}
  276|  2.50M|			else {
  277|       |				/* No dupe, just add to the table.
  278|       |				 */
  279|  2.50M|				reorder->source[reorder->n_sources] =
  280|  2.50M|					input->source[j];
  281|  2.50M|				reorder->cumulative_margin[reorder->n_sources] =
  282|  2.50M|					input->cumulative_margin[j];
  283|  2.50M|				reorder->n_sources += 1;
  284|  2.50M|			}
  285|  2.85M|		}
  286|  2.96M|	}
  287|       |
  288|       |	/* Sort recomp_order by score. qsort_r() is a GNU libc thing, don't use
  289|       |	 * it.
  290|       |	 */
  291|  2.67M|	if (reorder->n_inputs > 1)
  ------------------
  |  Branch (291:6): [True: 254k, False: 2.41M]
  ------------------
  292|       |#if GLIB_CHECK_VERSION(2, 82, 0)
  293|       |		g_sort_array
  294|       |#else
  295|   254k|		g_qsort_with_data
  296|   254k|#endif
  297|   254k|			(reorder->recomp_order,
  298|   254k|				reorder->n_inputs,
  299|   254k|				sizeof(int),
  300|   254k|				vips_reorder_compare_score, reorder);
  301|       |
  302|       |	/* No sources ... make one, us!
  303|       |	 */
  304|  2.67M|	if (reorder->n_inputs == 0) {
  ------------------
  |  Branch (304:6): [True: 80.2k, False: 2.59M]
  ------------------
  305|  80.2k|		reorder->source[0] = image;
  306|  80.2k|		reorder->cumulative_margin[0] = 0;
  307|  80.2k|		reorder->n_sources = 1;
  308|  80.2k|	}
  309|       |
  310|       |#ifdef DEBUG
  311|       |	vips_reorder_print(reorder);
  312|       |#endif /*DEBUG*/
  313|       |
  314|  2.67M|	return 0;
  315|  2.67M|}
vips_reorder_prepare_many:
  335|   229k|{
  336|   229k|	VipsReorder *reorder = vips_reorder_get(image);
  337|       |
  338|   229k|	int i;
  339|       |
  340|   513k|	for (i = 0; i < reorder->n_inputs; i++) {
  ------------------
  |  Branch (340:14): [True: 332k, False: 180k]
  ------------------
  341|   332k|		g_assert(regions[i]);
  ------------------
  |  |  166|   332k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   332k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   332k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  342|       |
  343|   332k|		if (vips_region_prepare(
  ------------------
  |  Branch (343:7): [True: 48.8k, False: 283k]
  ------------------
  344|   332k|				regions[reorder->recomp_order[i]], r))
  345|  48.8k|			return -1;
  346|   332k|	}
  347|       |
  348|   180k|	return 0;
  349|   229k|}
vips_reorder_margin_hint:
  368|  86.3k|{
  369|  86.3k|	VipsReorder *reorder = vips_reorder_get(image);
  370|       |
  371|  86.3k|	int i;
  372|       |
  373|   210k|	for (i = 0; i < reorder->n_sources; i++)
  ------------------
  |  Branch (373:14): [True: 124k, False: 86.3k]
  ------------------
  374|   124k|		reorder->cumulative_margin[i] += margin;
  375|  86.3k|}
vips__reorder_clear:
  379|   197k|{
  380|   197k|	g_object_set_qdata(G_OBJECT(image),
  ------------------
  |  |   51|   197k|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|   197k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   197k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  381|   197k|		vips__image_reorder_quark, NULL);
  382|   197k|}
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|  8.92M|{
  137|  8.92M|	VipsReorder *reorder;
  138|       |
  139|  8.92M|	if ((reorder = g_object_get_qdata(G_OBJECT(image),
  ------------------
  |  |   51|  8.92M|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|  8.92M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  8.92M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (139:6): [True: 6.12M, False: 2.80M]
  ------------------
  140|  8.92M|			 vips__image_reorder_quark)))
  141|  6.12M|		return reorder;
  142|       |
  143|  2.80M|	reorder = VIPS_NEW(NULL, VipsReorder);
  ------------------
  |  |   70|  2.80M|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  2.80M|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  2.80M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  2.80M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  2.80M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  144|  2.80M|	reorder->image = image;
  145|  2.80M|	reorder->n_inputs = 0;
  146|  2.80M|	reorder->input = NULL;
  147|  2.80M|	reorder->score = NULL;
  148|  2.80M|	reorder->recomp_order = NULL;
  149|  2.80M|	reorder->n_sources = 0;
  150|  2.80M|	reorder->source = NULL;
  151|  2.80M|	reorder->cumulative_margin = NULL;
  152|       |
  153|  2.80M|	g_object_set_qdata_full(G_OBJECT(image), vips__image_reorder_quark,
  ------------------
  |  |   51|  2.80M|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|  2.80M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  2.80M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  154|  2.80M|		reorder, (GDestroyNotify) vips_reorder_destroy);
  155|       |
  156|  2.80M|	return reorder;
  157|  8.92M|}
reorder.c:vips_reorder_destroy:
  129|  2.80M|{
  130|  2.80M|	vips_reorder_free(reorder);
  131|  2.80M|	VIPS_FREE(reorder);
  ------------------
  |  |   50|  2.80M|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  2.80M|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  2.80M|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  2.80M|	{ \
  |  |  |  |   43|  2.80M|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 2.80M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  2.80M|			(void) F((S)); \
  |  |  |  |   45|  2.80M|			(S) = 0; \
  |  |  |  |   46|  2.80M|		} \
  |  |  |  |   47|  2.80M|	} \
  |  |  |  |   48|  2.80M|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  2.80M|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  132|  2.80M|}
reorder.c:vips_reorder_free:
  115|  2.83M|{
  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|  2.83M|	VIPS_FREE(reorder->input);
  ------------------
  |  |   50|  2.83M|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  2.83M|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  2.83M|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  2.83M|	{ \
  |  |  |  |   43|  2.83M|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 2.67M, False: 159k]
  |  |  |  |  ------------------
  |  |  |  |   44|  2.67M|			(void) F((S)); \
  |  |  |  |   45|  2.67M|			(S) = 0; \
  |  |  |  |   46|  2.67M|		} \
  |  |  |  |   47|  2.83M|	} \
  |  |  |  |   48|  2.83M|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  2.83M|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  121|  2.83M|	VIPS_FREE(reorder->score);
  ------------------
  |  |   50|  2.83M|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  2.83M|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  2.83M|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  2.83M|	{ \
  |  |  |  |   43|  2.83M|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 2.59M, False: 239k]
  |  |  |  |  ------------------
  |  |  |  |   44|  2.59M|			(void) F((S)); \
  |  |  |  |   45|  2.59M|			(S) = 0; \
  |  |  |  |   46|  2.59M|		} \
  |  |  |  |   47|  2.83M|	} \
  |  |  |  |   48|  2.83M|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  2.83M|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  122|  2.83M|	VIPS_FREE(reorder->recomp_order);
  ------------------
  |  |   50|  2.83M|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  2.83M|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  2.83M|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  2.83M|	{ \
  |  |  |  |   43|  2.83M|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 2.59M, False: 239k]
  |  |  |  |  ------------------
  |  |  |  |   44|  2.59M|			(void) F((S)); \
  |  |  |  |   45|  2.59M|			(S) = 0; \
  |  |  |  |   46|  2.59M|		} \
  |  |  |  |   47|  2.83M|	} \
  |  |  |  |   48|  2.83M|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  2.83M|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  123|  2.83M|	VIPS_FREE(reorder->source);
  ------------------
  |  |   50|  2.83M|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  2.83M|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  2.83M|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  2.83M|	{ \
  |  |  |  |   43|  2.83M|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 2.67M, False: 159k]
  |  |  |  |  ------------------
  |  |  |  |   44|  2.67M|			(void) F((S)); \
  |  |  |  |   45|  2.67M|			(S) = 0; \
  |  |  |  |   46|  2.67M|		} \
  |  |  |  |   47|  2.83M|	} \
  |  |  |  |   48|  2.83M|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  2.83M|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  124|  2.83M|	VIPS_FREE(reorder->cumulative_margin);
  ------------------
  |  |   50|  2.83M|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  2.83M|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  2.83M|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  2.83M|	{ \
  |  |  |  |   43|  2.83M|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 2.67M, False: 159k]
  |  |  |  |  ------------------
  |  |  |  |   44|  2.67M|			(void) F((S)); \
  |  |  |  |   45|  2.67M|			(S) = 0; \
  |  |  |  |   46|  2.67M|		} \
  |  |  |  |   47|  2.83M|	} \
  |  |  |  |   48|  2.83M|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  2.83M|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  125|  2.83M|}
reorder.c:vips_reorder_compare_score:
  161|   374k|{
  162|   374k|	int i1 = *((int *) a);
  163|   374k|	int i2 = *((int *) b);
  164|   374k|	VipsReorder *reorder = (VipsReorder *) arg;
  165|       |
  166|   374k|	return reorder->score[i2] - reorder->score[i1];
  167|   374k|}

vips_sbuf_new_from_source:
  113|  6.05k|{
  114|  6.05k|	VipsSbuf *sbuf;
  115|       |
  116|  6.05k|	g_assert(source);
  ------------------
  |  |  166|  6.05k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  6.05k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  6.05k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  117|       |
  118|  6.05k|	sbuf = VIPS_SBUF(g_object_new(VIPS_TYPE_SBUF,
  ------------------
  |  |   46|  6.05k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  6.05k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  6.05k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   47|  6.05k|		VIPS_TYPE_SBUF, VipsSbuf))
  ------------------
  119|  6.05k|		"input", source,
  120|  6.05k|		NULL));
  121|       |
  122|  6.05k|	if (vips_object_build(VIPS_OBJECT(sbuf))) {
  ------------------
  |  |  433|  6.05k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  6.05k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  6.05k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (122:6): [True: 0, False: 6.05k]
  ------------------
  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|  6.05k|	return sbuf;
  128|  6.05k|}
vips_sbuf_getc:
  189|  10.1k|{
  190|  10.1k|	if (sbuf->read_point == sbuf->chars_in_buffer &&
  ------------------
  |  Branch (190:6): [True: 10.1k, False: 0]
  ------------------
  191|  10.1k|		vips_sbuf_refill(sbuf) <= 0)
  ------------------
  |  Branch (191:3): [True: 3.27k, False: 6.92k]
  ------------------
  192|  3.27k|		return -1;
  193|       |
  194|  10.1k|	g_assert(sbuf->read_point < sbuf->chars_in_buffer);
  ------------------
  |  |  166|  10.1k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  6.92k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  10.1k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  195|       |
  196|  6.92k|	return sbuf->input_buffer[sbuf->read_point++];
  197|  10.1k|}
vips_sbuf_require:
  247|    243|{
  248|    243|	g_assert(require < VIPS_SBUF_BUFFER_SIZE);
  ------------------
  |  |  166|    243|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|    243|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    243|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  249|    243|	g_assert(sbuf->chars_in_buffer >= 0);
  ------------------
  |  |  166|    243|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|    243|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    243|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  250|    243|	g_assert(sbuf->chars_in_buffer <= VIPS_SBUF_BUFFER_SIZE);
  ------------------
  |  |  166|    243|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|    243|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    243|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  251|    243|	g_assert(sbuf->read_point >= 0);
  ------------------
  |  |  166|    243|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|    243|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    243|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  252|    243|	g_assert(sbuf->read_point <= sbuf->chars_in_buffer);
  ------------------
  |  |  166|    243|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|    243|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    243|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  253|       |
  254|    243|	VIPS_DEBUG_MSG("vips_sbuf_require: %d\n", require);
  ------------------
  |  |   47|    243|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    243|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|    243|	{ \
  |  |   49|    243|		; \
  |  |   50|    243|	} \
  |  |   51|    243|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    243|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  255|       |
  256|    243|	if (sbuf->read_point + require > sbuf->chars_in_buffer) {
  ------------------
  |  Branch (256:6): [True: 243, False: 0]
  ------------------
  257|       |		/* Areas can overlap, so we must memmove().
  258|       |		 */
  259|    243|		memmove(sbuf->input_buffer,
  260|    243|			sbuf->input_buffer + sbuf->read_point,
  261|    243|			sbuf->chars_in_buffer - sbuf->read_point);
  262|    243|		sbuf->chars_in_buffer -= sbuf->read_point;
  263|    243|		sbuf->read_point = 0;
  264|       |
  265|    349|		while (require > sbuf->chars_in_buffer) {
  ------------------
  |  Branch (265:10): [True: 246, False: 103]
  ------------------
  266|    246|			unsigned char *to = sbuf->input_buffer +
  267|    246|				sbuf->chars_in_buffer;
  268|    246|			int space_available =
  269|    246|				VIPS_SBUF_BUFFER_SIZE -
  ------------------
  |  |   59|    246|#define VIPS_SBUF_BUFFER_SIZE (4096)
  ------------------
  270|    246|				sbuf->chars_in_buffer;
  271|    246|			gint64 bytes_read;
  272|       |
  273|    246|			if ((bytes_read = vips_source_read(sbuf->source,
  ------------------
  |  Branch (273:8): [True: 0, False: 246]
  ------------------
  274|    246|					 to, space_available)) < 0)
  275|      0|				return -1;
  276|    246|			if (bytes_read == 0) {
  ------------------
  |  Branch (276:8): [True: 140, False: 106]
  ------------------
  277|    140|				vips_error(
  278|    140|					vips_connection_nick(VIPS_CONNECTION(
  ------------------
  |  |   48|    140|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|    140|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    140|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   49|    140|		VIPS_TYPE_CONNECTION, VipsConnection))
  ------------------
  279|    140|						sbuf->source)),
  280|    140|					"%s", _("end of file"));
  ------------------
  |  |   30|    140|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|    140|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  281|    140|				return -1;
  282|    140|			}
  283|       |
  284|    106|			to[bytes_read] = '\0';
  285|    106|			sbuf->chars_in_buffer += bytes_read;
  286|    106|		}
  287|    243|	}
  288|       |
  289|    103|	return 0;
  290|    243|}
vips_sbuf_get_line:
  344|  12.5k|{
  345|  12.5k|	int write_point;
  346|  12.5k|	int space_remaining;
  347|  12.5k|	int ch;
  348|       |
  349|  12.5k|	VIPS_DEBUG_MSG("vips_sbuf_get_line:\n");
  ------------------
  |  |   47|  12.5k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  12.5k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  12.5k|	{ \
  |  |   49|  12.5k|		; \
  |  |   50|  12.5k|	} \
  |  |   51|  12.5k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  12.5k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  350|       |
  351|  12.5k|	write_point = 0;
  352|  12.5k|	space_remaining = VIPS_SBUF_BUFFER_SIZE;
  ------------------
  |  |   59|  12.5k|#define VIPS_SBUF_BUFFER_SIZE (4096)
  ------------------
  353|       |
  354|  1.51M|	while ((ch = VIPS_SBUF_GETC(sbuf)) != -1 &&
  ------------------
  |  |  109|  1.51M|#define VIPS_SBUF_GETC(S) ( \
  |  |  110|  1.51M|	(S)->read_point < (S)->chars_in_buffer \
  |  |  ------------------
  |  |  |  Branch (110:2): [True: 1.50M, False: 9.47k]
  |  |  ------------------
  |  |  111|  1.51M|		? (S)->input_buffer[(S)->read_point++] \
  |  |  112|  1.51M|		: vips_sbuf_getc(S))
  ------------------
  |  Branch (354:9): [True: 1.51M, False: 3.24k]
  ------------------
  355|  1.51M|		ch != '\n' &&
  ------------------
  |  Branch (355:3): [True: 1.50M, False: 9.20k]
  ------------------
  356|  1.51M|		space_remaining > 0) {
  ------------------
  |  Branch (356:3): [True: 1.50M, False: 147]
  ------------------
  357|  1.50M|		sbuf->line[write_point] = ch;
  358|  1.50M|		write_point += 1;
  359|  1.50M|		space_remaining -= 1;
  360|  1.50M|	}
  361|  12.5k|	sbuf->line[write_point] = '\0';
  362|       |
  363|       |	/* If we hit EOF immediately, return EOF.
  364|       |	 */
  365|  12.5k|	if (ch == -1 &&
  ------------------
  |  Branch (365:6): [True: 3.24k, False: 9.35k]
  ------------------
  366|  12.5k|		write_point == 0)
  ------------------
  |  Branch (366:3): [True: 168, False: 3.07k]
  ------------------
  367|    168|		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|  12.4k|	if (write_point > 0 &&
  ------------------
  |  Branch (375:6): [True: 11.9k, False: 441]
  ------------------
  376|  12.4k|		sbuf->line[write_point - 1] == '\r')
  ------------------
  |  Branch (376:3): [True: 429, False: 11.5k]
  ------------------
  377|    429|		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|  12.4k|	if (ch != '\n' &&
  ------------------
  |  Branch (381:6): [True: 3.22k, False: 9.20k]
  ------------------
  382|  12.4k|		space_remaining == 0) {
  ------------------
  |  Branch (382:3): [True: 148, False: 3.07k]
  ------------------
  383|  2.85M|		while ((ch = VIPS_SBUF_GETC(sbuf)) != -1 &&
  ------------------
  |  |  109|  2.85M|#define VIPS_SBUF_GETC(S) ( \
  |  |  110|  2.85M|	(S)->read_point < (S)->chars_in_buffer \
  |  |  ------------------
  |  |  |  Branch (110:2): [True: 2.85M, False: 718]
  |  |  ------------------
  |  |  111|  2.85M|		? (S)->input_buffer[(S)->read_point++] \
  |  |  112|  2.85M|		: vips_sbuf_getc(S))
  ------------------
  |  Branch (383:10): [True: 2.85M, False: 32]
  ------------------
  384|  2.85M|			ch != '\n')
  ------------------
  |  Branch (384:4): [True: 2.85M, False: 116]
  ------------------
  385|  2.85M|			;
  386|    148|	}
  387|       |
  388|  12.4k|	VIPS_DEBUG_MSG("    %s\n", sbuf->line);
  ------------------
  |  |   47|  12.4k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  12.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  12.4k|	{ \
  |  |   49|  12.4k|		; \
  |  |   50|  12.4k|	} \
  |  |   51|  12.4k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  12.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  389|       |
  390|  12.4k|	return (const char *) sbuf->line;
  391|  12.5k|}
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|  6.05k|{
   98|  6.05k|	sbuf->read_point = 0;
   99|  6.05k|	sbuf->chars_in_buffer = 0;
  100|  6.05k|	sbuf->input_buffer[0] = '\0';
  101|  6.05k|}
sbuf.c:vips_sbuf_refill:
  152|  10.1k|{
  153|  10.1k|	gint64 bytes_read;
  154|       |
  155|  10.1k|	VIPS_DEBUG_MSG("vips_sbuf_refill:\n");
  ------------------
  |  |   47|  10.1k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  10.1k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  10.1k|	{ \
  |  |   49|  10.1k|		; \
  |  |   50|  10.1k|	} \
  |  |   51|  10.1k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  10.1k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  156|       |
  157|       |	/* We should not discard any unread bytes.
  158|       |	 */
  159|  10.1k|	g_assert(sbuf->read_point == sbuf->chars_in_buffer);
  ------------------
  |  |  166|  10.1k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  10.1k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  10.1k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  160|       |
  161|  10.1k|	bytes_read = vips_source_read(sbuf->source,
  162|  10.1k|		sbuf->input_buffer, VIPS_SBUF_BUFFER_SIZE);
  ------------------
  |  |   59|  10.1k|#define VIPS_SBUF_BUFFER_SIZE (4096)
  ------------------
  163|  10.1k|	if (bytes_read == -1)
  ------------------
  |  Branch (163:6): [True: 0, False: 10.1k]
  ------------------
  164|      0|		return -1;
  165|       |
  166|  10.1k|	sbuf->read_point = 0;
  167|  10.1k|	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|  10.1k|	sbuf->input_buffer[bytes_read] = '\0';
  173|       |
  174|  10.1k|	return bytes_read;
  175|  10.1k|}

vips_semaphore_init:
   60|   933k|{
   61|   933k|	s->v = v;
   62|   933k|	s->name = name;
   63|   933k|	s->mutex = vips_g_mutex_new();
   64|   933k|	s->cond = vips_g_cond_new();
   65|   933k|}
vips_semaphore_destroy:
   69|   933k|{
   70|   933k|	VIPS_FREEF(vips_g_mutex_free, s->mutex);
  ------------------
  |  |   41|   933k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   933k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   933k|	{ \
  |  |   43|   933k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 933k, False: 0]
  |  |  ------------------
  |  |   44|   933k|			(void) F((S)); \
  |  |   45|   933k|			(S) = 0; \
  |  |   46|   933k|		} \
  |  |   47|   933k|	} \
  |  |   48|   933k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   933k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   71|   933k|	VIPS_FREEF(vips_g_cond_free, s->cond);
  ------------------
  |  |   41|   933k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   933k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   933k|	{ \
  |  |   43|   933k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 933k, False: 0]
  |  |  ------------------
  |  |   44|   933k|			(void) F((S)); \
  |  |   45|   933k|			(S) = 0; \
  |  |   46|   933k|		} \
  |  |   47|   933k|	} \
  |  |   48|   933k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   933k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   72|   933k|}
vips_semaphore_upn:
   79|  1.47M|{
   80|  1.47M|	int value_after_op;
   81|       |
   82|  1.47M|	g_mutex_lock(s->mutex);
   83|  1.47M|	s->v += n;
   84|  1.47M|	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|  1.47M|	if (n == 1)
  ------------------
  |  Branch (89:6): [True: 973k, False: 497k]
  ------------------
   90|   973k|		g_cond_signal(s->cond);
   91|   497k|	else
   92|   497k|		g_cond_broadcast(s->cond);
   93|  1.47M|	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|  1.47M|	return value_after_op;
  103|  1.47M|}
vips_semaphore_up:
  109|   476k|{
  110|   476k|	return vips_semaphore_upn(s, 1);
  111|   476k|}
vips_semaphore_downn:
  158|   466k|{
  159|   466k|	g_assert(n >= 0);
  ------------------
  |  |  166|   466k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   466k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   466k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  160|       |
  161|   466k|	return vips__semaphore_downn_until(s, n, -1);
  162|   466k|}
vips_semaphore_down:
  168|   247k|{
  169|   247k|	return vips__semaphore_downn_until(s, 1, -1);
  170|   247k|}
vips_semaphore_down_timeout:
  178|      8|{
  179|      8|	gint64 end_time = g_get_monotonic_time() + timeout;
  180|       |
  181|      8|	return vips__semaphore_downn_until(s, 1, end_time);
  182|      8|}
semaphore.c:vips__semaphore_downn_until:
  118|   713k|{
  119|   713k|	int value_after_op;
  120|       |
  121|   713k|	VIPS_GATE_START("vips__semaphore_downn_until: wait");
  ------------------
  |  |   41|   713k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   713k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   713k|	{ \
  |  |   43|   713k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 713k]
  |  |  ------------------
  |  |   44|   713k|			vips__thread_gate_start(NAME); \
  |  |   45|   713k|	} \
  |  |   46|   713k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   713k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  122|       |
  123|   713k|	g_mutex_lock(s->mutex);
  124|       |
  125|  1.08M|	while (s->v < n) {
  ------------------
  |  Branch (125:9): [True: 372k, False: 713k]
  ------------------
  126|   372k|		if (end_time == -1)
  ------------------
  |  Branch (126:7): [True: 372k, False: 8]
  ------------------
  127|   372k|			vips__worker_cond_wait(s->cond, s->mutex);
  128|      8|		else if (!g_cond_wait_until(s->cond, s->mutex, end_time)) {
  ------------------
  |  Branch (128:12): [True: 0, False: 8]
  ------------------
  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|   372k|	}
  137|       |
  138|   713k|	s->v -= n;
  139|   713k|	value_after_op = s->v;
  140|       |
  141|   713k|	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|   713k|	VIPS_GATE_STOP("vips__semaphore_downn_until: wait");
  ------------------
  |  |   49|   713k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   713k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|   713k|	{ \
  |  |   51|   713k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 713k]
  |  |  ------------------
  |  |   52|   713k|			vips__thread_gate_stop(NAME); \
  |  |   53|   713k|	} \
  |  |   54|   713k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   713k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  149|       |
  150|   713k|	return value_after_op;
  151|   713k|}

vips_sink_thread_state_new:
  343|  26.9k|{
  344|  26.9k|	return VIPS_THREAD_STATE(vips_object_new(
  ------------------
  |  |   60|  26.9k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  26.9k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  26.9k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|  26.9k|		VIPS_TYPE_THREAD_STATE, VipsThreadState))
  ------------------
  345|  26.9k|		sink_thread_state_get_type(),
  346|  26.9k|		vips_thread_state_set, im, a));
  347|  26.9k|}
vips_sink_base_init:
  359|   233k|{
  360|       |	/* Always clear kill before we start looping. See the
  361|       |	 * call to vips_image_iskilled() below.
  362|       |	 */
  363|   233k|	vips_image_set_kill(image, FALSE);
  ------------------
  |  |  794|   233k|#define	FALSE	(0)
  ------------------
  364|       |
  365|   233k|	sink_base->im = image;
  366|   233k|	sink_base->x = 0;
  367|   233k|	sink_base->y = 0;
  368|       |
  369|   233k|	vips_get_tile_size(image,
  370|   233k|		&sink_base->tile_width, &sink_base->tile_height,
  371|   233k|		&sink_base->n_lines);
  372|       |
  373|   233k|	sink_base->processed = 0;
  374|   233k|}
vips_sink_base_progress:
  430|  14.2k|{
  431|  14.2k|	SinkBase *sink_base = (SinkBase *) a;
  432|       |
  433|  14.2k|	VIPS_DEBUG_MSG("vips_sink_base_progress:\n");
  ------------------
  |  |   47|  14.2k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  14.2k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  14.2k|	{ \
  |  |   49|  14.2k|		; \
  |  |   50|  14.2k|	} \
  |  |   51|  14.2k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  14.2k|#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|  14.2k|	vips_image_eval(sink_base->im, sink_base->processed);
  439|  14.2k|	if (vips_image_iskilled(sink_base->im))
  ------------------
  |  Branch (439:6): [True: 0, False: 14.2k]
  ------------------
  440|      0|		return -1;
  441|       |
  442|  14.2k|	return 0;
  443|  14.2k|}
vips_sink_tile:
  473|  26.9k|{
  474|  26.9k|	Sink sink;
  475|  26.9k|	int result;
  476|       |
  477|  26.9k|	g_assert(vips_object_sanity(VIPS_OBJECT(im)));
  ------------------
  |  |  166|  26.9k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  26.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  26.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  478|       |
  479|       |	/* We don't use this, but make sure it's set in case any old binaries
  480|       |	 * are expecting it.
  481|       |	 */
  482|  26.9k|	im->Bbits = vips_format_sizeof(im->BandFmt) << 3;
  483|       |
  484|  26.9k|	if (sink_init(&sink, im, start_fn, generate_fn, stop_fn, a, b))
  ------------------
  |  Branch (484:6): [True: 0, False: 26.9k]
  ------------------
  485|      0|		return -1;
  486|       |
  487|  26.9k|	if (tile_width > 0) {
  ------------------
  |  Branch (487:6): [True: 0, False: 26.9k]
  ------------------
  488|      0|		sink.sink_base.tile_width = tile_width;
  489|      0|		sink.sink_base.tile_height = tile_height;
  490|      0|	}
  491|       |
  492|       |	/* vips_sink_base_progress() signals progress on im, so we have to do
  493|       |	 * pre/post on that too.
  494|       |	 */
  495|  26.9k|	vips_image_preeval(im);
  496|       |
  497|  26.9k|	sink_area_position(sink.area, 0, sink.sink_base.n_lines);
  498|  26.9k|	result = vips_threadpool_run(im,
  499|  26.9k|		vips_sink_thread_state_new,
  500|  26.9k|		sink_area_allocate_fn,
  501|  26.9k|		sink_work,
  502|  26.9k|		vips_sink_base_progress,
  503|  26.9k|		&sink);
  504|       |
  505|  26.9k|	vips_image_posteval(im);
  506|       |
  507|  26.9k|	sink_free(&sink);
  508|       |
  509|  26.9k|	vips_image_minimise_all(im);
  510|       |
  511|  26.9k|	return result;
  512|  26.9k|}
vips_sink:
  539|  26.9k|{
  540|  26.9k|	return vips_sink_tile(im, -1, -1, start_fn, generate_fn, stop_fn, a, b);
  541|  26.9k|}
sink.c:sink_thread_state_class_init:
  323|      1|{
  324|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  325|      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)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  326|       |
  327|      1|	gobject_class->dispose = sink_thread_state_dispose;
  328|       |
  329|      1|	object_class->build = sink_thread_state_build;
  330|      1|	object_class->nickname = "sinkthreadstate";
  331|      1|	object_class->description = _("per-thread state for sink");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  332|      1|}
sink.c:sink_thread_state_dispose:
  275|  26.9k|{
  276|  26.9k|	SinkThreadState *state = (SinkThreadState *) gobject;
  277|  26.9k|	Sink *sink = (Sink *) ((VipsThreadState *) state)->a;
  278|       |
  279|  26.9k|	sink_call_stop(sink, state);
  280|  26.9k|	VIPS_UNREF(state->reg);
  ------------------
  |  |   57|  26.9k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  26.9k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  26.9k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  26.9k|	{ \
  |  |  |  |   43|  26.9k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 26.9k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  26.9k|			(void) F((S)); \
  |  |  |  |   45|  26.9k|			(S) = 0; \
  |  |  |  |   46|  26.9k|		} \
  |  |  |  |   47|  26.9k|	} \
  |  |  |  |   48|  26.9k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  26.9k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  281|       |
  282|  26.9k|	G_OBJECT_CLASS(sink_thread_state_parent_class)->dispose(gobject);
  ------------------
  |  |   58|  26.9k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  26.9k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  26.9k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  283|  26.9k|}
sink.c:sink_call_stop:
  250|  26.9k|{
  251|  26.9k|	if (state->seq && sink->stop_fn) {
  ------------------
  |  Branch (251:6): [True: 26.9k, False: 0]
  |  Branch (251:20): [True: 26.9k, False: 0]
  ------------------
  252|  26.9k|		int result;
  253|       |
  254|  26.9k|		VIPS_DEBUG_MSG("sink_call_stop: state = %p\n", state);
  ------------------
  |  |   47|  26.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  26.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  26.9k|	{ \
  |  |   49|  26.9k|		; \
  |  |   50|  26.9k|	} \
  |  |   51|  26.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  26.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  255|       |
  256|  26.9k|		result = sink->stop_fn(state->seq, sink->a, sink->b);
  257|       |
  258|  26.9k|		if (result) {
  ------------------
  |  Branch (258:7): [True: 0, False: 26.9k]
  ------------------
  259|      0|			SinkBase *sink_base = (SinkBase *) sink;
  260|       |
  261|      0|			vips_error("vips_sink",
  262|      0|				_("stop function failed for image \"%s\""),
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  263|      0|				sink_base->im->filename);
  264|      0|			return -1;
  265|      0|		}
  266|       |
  267|  26.9k|		state->seq = NULL;
  268|  26.9k|	}
  269|       |
  270|  26.9k|	return 0;
  271|  26.9k|}
sink.c:sink_thread_state_build:
  310|  26.9k|{
  311|  26.9k|	SinkThreadState *state = (SinkThreadState *) object;
  312|  26.9k|	Sink *sink = (Sink *) ((VipsThreadState *) state)->a;
  313|       |
  314|  26.9k|	if (!(state->reg = vips_region_new(sink->t)) ||
  ------------------
  |  Branch (314:6): [True: 0, False: 26.9k]
  ------------------
  315|  26.9k|		sink_call_start(sink, state))
  ------------------
  |  Branch (315:3): [True: 0, False: 26.9k]
  ------------------
  316|      0|		return -1;
  317|       |
  318|  26.9k|	return VIPS_OBJECT_CLASS(sink_thread_state_parent_class)->build(object);
  ------------------
  |  |  435|  26.9k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  26.9k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  26.9k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  319|  26.9k|}
sink.c:sink_call_start:
  289|  26.9k|{
  290|  26.9k|	if (!state->seq && sink->start_fn) {
  ------------------
  |  Branch (290:6): [True: 26.9k, False: 0]
  |  Branch (290:21): [True: 26.9k, False: 0]
  ------------------
  291|  26.9k|		VIPS_DEBUG_MSG("sink_call_start: state = %p\n", state);
  ------------------
  |  |   47|  26.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  26.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  26.9k|	{ \
  |  |   49|  26.9k|		; \
  |  |   50|  26.9k|	} \
  |  |   51|  26.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  26.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  292|       |
  293|  26.9k|		state->seq = sink->start_fn(sink->t, sink->a, sink->b);
  294|       |
  295|  26.9k|		if (!state->seq) {
  ------------------
  |  Branch (295:7): [True: 0, False: 26.9k]
  ------------------
  296|      0|			SinkBase *sink_base = (SinkBase *) sink;
  297|       |
  298|      0|			vips_error("vips_sink",
  299|      0|				_("start function failed for image \"%s\""),
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  300|      0|				sink_base->im->filename);
  301|      0|			return -1;
  302|      0|		}
  303|  26.9k|	}
  304|       |
  305|  26.9k|	return 0;
  306|  26.9k|}
sink.c:sink_thread_state_init:
  336|  26.9k|{
  337|  26.9k|	state->seq = NULL;
  338|  26.9k|	state->reg = NULL;
  339|  26.9k|}
sink.c:sink_init:
  381|  26.9k|{
  382|  26.9k|	g_assert(generate_fn);
  ------------------
  |  |  166|  26.9k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  26.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  26.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  383|       |
  384|  26.9k|	vips_sink_base_init(&sink->sink_base, image);
  385|       |
  386|  26.9k|	sink->t = NULL;
  387|  26.9k|	sink->start_fn = start_fn;
  388|  26.9k|	sink->generate_fn = generate_fn;
  389|  26.9k|	sink->stop_fn = stop_fn;
  390|  26.9k|	sink->a = a;
  391|  26.9k|	sink->b = b;
  392|       |
  393|  26.9k|	sink->area = NULL;
  394|  26.9k|	sink->old_area = NULL;
  395|       |
  396|  26.9k|	if (!(sink->t = vips_image_new()) ||
  ------------------
  |  Branch (396:6): [True: 0, False: 26.9k]
  ------------------
  397|  26.9k|		!(sink->area = sink_area_new(sink)) ||
  ------------------
  |  Branch (397:3): [True: 0, False: 26.9k]
  ------------------
  398|  26.9k|		!(sink->old_area = sink_area_new(sink)) ||
  ------------------
  |  Branch (398:3): [True: 0, False: 26.9k]
  ------------------
  399|  26.9k|		vips_image_write(sink->sink_base.im, sink->t)) {
  ------------------
  |  Branch (399:3): [True: 0, False: 26.9k]
  ------------------
  400|      0|		sink_free(sink);
  401|      0|		return -1;
  402|      0|	}
  403|       |
  404|  26.9k|	return 0;
  405|  26.9k|}
sink.c:sink_area_new:
  128|  53.8k|{
  129|  53.8k|	SinkArea *area;
  130|       |
  131|  53.8k|	if (!(area = VIPS_NEW(NULL, SinkArea)))
  ------------------
  |  |   70|  53.8k|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  53.8k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  53.8k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  53.8k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  53.8k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (131:6): [True: 0, False: 53.8k]
  ------------------
  132|      0|		return NULL;
  133|  53.8k|	area->sink = sink;
  134|  53.8k|	vips_semaphore_init(&area->n_thread, 0, "n_thread");
  135|       |
  136|  53.8k|	return area;
  137|  53.8k|}
sink.c:sink_area_position:
  143|  26.9k|{
  144|  26.9k|	Sink *sink = area->sink;
  145|       |
  146|  26.9k|	VipsRect all, rect;
  147|       |
  148|  26.9k|	all.left = 0;
  149|  26.9k|	all.top = 0;
  150|  26.9k|	all.width = sink->sink_base.im->Xsize;
  151|  26.9k|	all.height = sink->sink_base.im->Ysize;
  152|       |
  153|  26.9k|	rect.left = 0;
  154|  26.9k|	rect.top = top;
  155|  26.9k|	rect.width = sink->sink_base.im->Xsize;
  156|  26.9k|	rect.height = height;
  157|       |
  158|  26.9k|	vips_rect_intersectrect(&all, &rect, &area->rect);
  159|  26.9k|}
sink.c:sink_area_allocate_fn:
  169|  48.9k|{
  170|  48.9k|	SinkThreadState *sstate = (SinkThreadState *) state;
  171|  48.9k|	Sink *sink = (Sink *) a;
  172|  48.9k|	SinkBase *sink_base = (SinkBase *) sink;
  173|       |
  174|  48.9k|	VipsRect image;
  175|  48.9k|	VipsRect tile;
  176|       |
  177|  48.9k|	VIPS_DEBUG_MSG("sink_area_allocate_fn: %p\n", g_thread_self());
  ------------------
  |  |   47|  48.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  48.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  48.9k|	{ \
  |  |   49|  48.9k|		; \
  |  |   50|  48.9k|	} \
  |  |   51|  48.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  48.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  178|       |
  179|       |	/* Is the state x/y OK? New line or maybe new buffer or maybe even
  180|       |	 * all done.
  181|       |	 */
  182|  48.9k|	if (sink_base->x >= sink->area->rect.width) {
  ------------------
  |  Branch (182:6): [True: 22.0k, False: 26.9k]
  ------------------
  183|  22.0k|		sink_base->x = 0;
  184|  22.0k|		sink_base->y += sink_base->tile_height;
  185|       |
  186|  22.0k|		if (sink_base->y >= VIPS_RECT_BOTTOM(&sink->area->rect)) {
  ------------------
  |  |   49|  22.0k|#define VIPS_RECT_BOTTOM(R) ((R)->top + (R)->height)
  ------------------
  |  Branch (186:7): [True: 15.7k, False: 6.36k]
  ------------------
  187|       |			/* Block until the previous area is done.
  188|       |			 */
  189|  15.7k|			if (sink->area->rect.top > 0)
  ------------------
  |  Branch (189:8): [True: 0, False: 15.7k]
  ------------------
  190|      0|				vips_semaphore_downn(
  191|      0|					&sink->old_area->n_thread, 0);
  192|       |
  193|       |			/* End of image?
  194|       |			 */
  195|  15.7k|			if (sink_base->y >= sink_base->im->Ysize) {
  ------------------
  |  Branch (195:8): [True: 15.7k, False: 0]
  ------------------
  196|  15.7k|				*stop = TRUE;
  ------------------
  |  |  798|  15.7k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  15.7k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  197|  15.7k|				return 0;
  198|  15.7k|			}
  199|       |
  200|       |			/* Swap buffers.
  201|       |			 */
  202|  15.7k|			VIPS_SWAP(SinkArea *,
  ------------------
  |  |  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|  15.7k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  15.7k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  203|      0|				sink->area, sink->old_area);
  204|       |
  205|       |			/* Position buf at the new y.
  206|       |			 */
  207|      0|			sink_area_position(sink->area,
  208|      0|				sink_base->y, sink_base->n_lines);
  209|      0|		}
  210|  22.0k|	}
  211|       |
  212|       |	/* x, y and buf are good: save params for thread.
  213|       |	 */
  214|  33.2k|	image.left = 0;
  215|  33.2k|	image.top = 0;
  216|  33.2k|	image.width = sink_base->im->Xsize;
  217|  33.2k|	image.height = sink_base->im->Ysize;
  218|  33.2k|	tile.left = sink_base->x;
  219|  33.2k|	tile.top = sink_base->y;
  220|  33.2k|	tile.width = sink_base->tile_width;
  221|  33.2k|	tile.height = sink_base->tile_height;
  222|  33.2k|	vips_rect_intersectrect(&image, &tile, &state->pos);
  223|       |
  224|       |	/* The thread needs to know which area it's writing to.
  225|       |	 */
  226|  33.2k|	sstate->area = sink->area;
  227|       |
  228|  33.2k|	VIPS_DEBUG_MSG("  %p allocated %d x %d:\n",
  ------------------
  |  |   47|  33.2k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  33.2k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  33.2k|	{ \
  |  |   49|  33.2k|		; \
  |  |   50|  33.2k|	} \
  |  |   51|  33.2k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  33.2k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  229|  33.2k|		g_thread_self(), state->pos.left, state->pos.top);
  230|       |
  231|       |	/* Add to the number of writers on the area.
  232|       |	 */
  233|  33.2k|	vips_semaphore_upn(&sink->area->n_thread, -1);
  234|       |
  235|       |	/* Move state on.
  236|       |	 */
  237|  33.2k|	sink_base->x += sink_base->tile_width;
  238|       |
  239|       |	/* Add the number of pixels we've just allocated to progress.
  240|       |	 */
  241|  33.2k|	sink_base->processed += state->pos.width * state->pos.height;
  242|       |
  243|  33.2k|	return 0;
  244|  48.9k|}
sink.c:sink_work:
  409|  33.2k|{
  410|  33.2k|	SinkThreadState *sstate = (SinkThreadState *) state;
  411|  33.2k|	Sink *sink = (Sink *) a;
  412|  33.2k|	SinkArea *area = sstate->area;
  413|       |
  414|  33.2k|	int result;
  415|       |
  416|  33.2k|	result = vips_region_prepare(sstate->reg, &state->pos);
  417|  33.2k|	if (!result)
  ------------------
  |  Branch (417:6): [True: 22.0k, False: 11.1k]
  ------------------
  418|  22.0k|		result = sink->generate_fn(sstate->reg, sstate->seq,
  419|  22.0k|			sink->a, sink->b, &state->stop);
  420|       |
  421|       |	/* Tell the allocator we're done.
  422|       |	 */
  423|  33.2k|	vips_semaphore_upn(&area->n_thread, 1);
  424|       |
  425|  33.2k|	return result;
  426|  33.2k|}
sink.c:sink_free:
  351|  26.9k|{
  352|  26.9k|	VIPS_FREEF(sink_area_free, sink->area);
  ------------------
  |  |   41|  26.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  26.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  26.9k|	{ \
  |  |   43|  26.9k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 26.9k, False: 0]
  |  |  ------------------
  |  |   44|  26.9k|			(void) F((S)); \
  |  |   45|  26.9k|			(S) = 0; \
  |  |   46|  26.9k|		} \
  |  |   47|  26.9k|	} \
  |  |   48|  26.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  26.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  353|  26.9k|	VIPS_FREEF(sink_area_free, sink->old_area);
  ------------------
  |  |   41|  26.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  26.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  26.9k|	{ \
  |  |   43|  26.9k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 26.9k, False: 0]
  |  |  ------------------
  |  |   44|  26.9k|			(void) F((S)); \
  |  |   45|  26.9k|			(S) = 0; \
  |  |   46|  26.9k|		} \
  |  |   47|  26.9k|	} \
  |  |   48|  26.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  26.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  354|  26.9k|	VIPS_FREEF(g_object_unref, sink->t);
  ------------------
  |  |   41|  26.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  26.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  26.9k|	{ \
  |  |   43|  26.9k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 26.9k, False: 0]
  |  |  ------------------
  |  |   44|  26.9k|			(void) F((S)); \
  |  |   45|  26.9k|			(S) = 0; \
  |  |   46|  26.9k|		} \
  |  |   47|  26.9k|	} \
  |  |   48|  26.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  26.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  355|  26.9k|}
sink.c:sink_area_free:
  121|  53.8k|{
  122|  53.8k|	vips_semaphore_destroy(&area->n_thread);
  123|  53.8k|	g_free(area);
  124|  53.8k|}

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|}

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

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|   173k|{
  461|   173k|	VipsSource *source;
  462|       |
  463|   173k|	VIPS_DEBUG_MSG("vips_source_new_from_blob: %p\n", blob);
  ------------------
  |  |   47|   173k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   173k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   173k|	{ \
  |  |   49|   173k|		; \
  |  |   50|   173k|	} \
  |  |   51|   173k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   173k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  464|       |
  465|   173k|	source = VIPS_SOURCE(g_object_new(VIPS_TYPE_SOURCE,
  ------------------
  |  |  106|   173k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   173k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   173k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  107|   173k|		VIPS_TYPE_SOURCE, VipsSource))
  ------------------
  466|   173k|		"blob", blob,
  467|   173k|		NULL));
  468|       |
  469|   173k|	if (vips_object_build(VIPS_OBJECT(source))) {
  ------------------
  |  |  433|   173k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|   173k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   173k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (469:6): [True: 0, False: 173k]
  ------------------
  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|   173k|	SANITY(source);
  475|       |
  476|   173k|	return source;
  477|   173k|}
vips_source_new_from_memory:
  532|   173k|{
  533|   173k|	VipsSource *source;
  534|   173k|	VipsBlob *blob;
  535|       |
  536|   173k|	VIPS_DEBUG_MSG("vips_source_new_from_buffer: %p, length = %zd\n",
  ------------------
  |  |   47|   173k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   173k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   173k|	{ \
  |  |   49|   173k|		; \
  |  |   50|   173k|	} \
  |  |   51|   173k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   173k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  537|   173k|		data, length);
  538|       |
  539|       |	/* We don't take a copy of the data or free it.
  540|       |	 */
  541|   173k|	blob = vips_blob_new(NULL, data, length);
  542|       |
  543|   173k|	source = vips_source_new_from_blob(blob);
  544|       |
  545|   173k|	vips_area_unref(VIPS_AREA(blob));
  ------------------
  |  |  137|   173k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  546|       |
  547|   173k|	SANITY(source);
  548|       |
  549|   173k|	return source;
  550|   173k|}
vips_source_minimise:
  593|   107k|{
  594|   107k|	VipsConnection *connection = VIPS_CONNECTION(source);
  ------------------
  |  |   48|   107k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  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)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   49|   107k|		VIPS_TYPE_CONNECTION, VipsConnection))
  ------------------
  595|       |
  596|   107k|	SANITY(source);
  597|       |
  598|   107k|	(void) vips_source_test_features(source);
  599|       |
  600|   107k|	if (connection->filename &&
  ------------------
  |  Branch (600:6): [True: 0, False: 107k]
  ------------------
  601|   107k|		connection->descriptor != -1 &&
  ------------------
  |  Branch (601:3): [True: 0, False: 0]
  ------------------
  602|   107k|		connection->tracked_descriptor == connection->descriptor &&
  ------------------
  |  Branch (602:3): [True: 0, False: 0]
  ------------------
  603|   107k|		!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|   107k|	SANITY(source);
  616|   107k|}
vips_source_unminimise:
  631|  10.3M|{
  632|  10.3M|	VipsConnection *connection = VIPS_CONNECTION(source);
  ------------------
  |  |   48|  10.3M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  10.3M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  10.3M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   49|  10.3M|		VIPS_TYPE_CONNECTION, VipsConnection))
  ------------------
  633|       |
  634|  10.3M|	if (connection->descriptor == -1 &&
  ------------------
  |  Branch (634:6): [True: 10.3M, False: 0]
  ------------------
  635|  10.3M|		connection->tracked_descriptor == -1 &&
  ------------------
  |  Branch (635:3): [True: 10.3M, False: 0]
  ------------------
  636|  10.3M|		connection->filename) {
  ------------------
  |  Branch (636:3): [True: 0, False: 10.3M]
  ------------------
  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|  10.3M|	return 0;
  672|  10.3M|}
vips_source_decode:
  689|  4.67k|{
  690|  4.67k|	VIPS_DEBUG_MSG("vips_source_decode:\n");
  ------------------
  |  |   47|  4.67k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  4.67k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  4.67k|	{ \
  |  |   49|  4.67k|		; \
  |  |   50|  4.67k|	} \
  |  |   51|  4.67k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  4.67k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  691|       |
  692|  4.67k|	SANITY(source);
  693|       |
  694|  4.67k|	if (!source->decode) {
  ------------------
  |  Branch (694:6): [True: 4.67k, False: 0]
  ------------------
  695|  4.67k|		source->decode = TRUE;
  ------------------
  |  |  798|  4.67k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  4.67k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  696|       |
  697|  4.67k|		VIPS_FREEF(g_byte_array_unref, source->sniff);
  ------------------
  |  |   41|  4.67k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  4.67k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  4.67k|	{ \
  |  |   43|  4.67k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 4.67k, False: 0]
  |  |  ------------------
  |  |   44|  4.67k|			(void) F((S)); \
  |  |   45|  4.67k|			(S) = 0; \
  |  |   46|  4.67k|		} \
  |  |   47|  4.67k|	} \
  |  |   48|  4.67k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  4.67k|#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|  4.67k|	}
  703|       |
  704|  4.67k|	vips_source_minimise(source);
  705|       |
  706|  4.67k|	SANITY(source);
  707|       |
  708|  4.67k|	return 0;
  709|  4.67k|}
vips_source_read:
  746|  2.18M|{
  747|  2.18M|	VipsSourceClass *class = VIPS_SOURCE_GET_CLASS(source);
  ------------------
  |  |  116|  2.18M|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  2.18M|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  2.18M|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  117|  2.18M|		VIPS_TYPE_SOURCE, VipsSourceClass))
  ------------------
  748|       |
  749|  2.18M|	gint64 total_read;
  750|       |
  751|  2.18M|	VIPS_DEBUG_MSG("vips_source_read:\n");
  ------------------
  |  |   47|  2.18M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.18M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  2.18M|	{ \
  |  |   49|  2.18M|		; \
  |  |   50|  2.18M|	} \
  |  |   51|  2.18M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.18M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  752|       |
  753|  2.18M|	SANITY(source);
  754|       |
  755|  2.18M|	if (vips_source_unminimise(source) ||
  ------------------
  |  Branch (755:6): [True: 0, False: 2.18M]
  ------------------
  756|  2.18M|		vips_source_test_features(source))
  ------------------
  |  Branch (756:3): [True: 0, False: 2.18M]
  ------------------
  757|      0|		return -1;
  758|       |
  759|  2.18M|	total_read = 0;
  760|       |
  761|  2.18M|	if (source->data) {
  ------------------
  |  Branch (761:6): [True: 2.18M, False: 0]
  ------------------
  762|       |		/* The whole thing is in memory somehow.
  763|       |		 */
  764|  2.18M|		gint64 available = VIPS_MIN(length,
  ------------------
  |  |   55|  2.18M|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 2.01M, False: 170k]
  |  |  ------------------
  ------------------
  765|  2.18M|			source->length - source->read_position);
  766|       |
  767|  2.18M|		VIPS_DEBUG_MSG("    %zd bytes from memory\n", available);
  ------------------
  |  |   47|  2.18M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.18M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  2.18M|	{ \
  |  |   49|  2.18M|		; \
  |  |   50|  2.18M|	} \
  |  |   51|  2.18M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.18M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  768|  2.18M|		memcpy(buffer,
  769|  2.18M|			(char *) source->data + source->read_position, available);
  770|  2.18M|		source->read_position += available;
  771|  2.18M|		total_read += available;
  772|  2.18M|	}
  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|  2.18M|	VIPS_DEBUG_MSG("    %zd bytes total\n", total_read);
  ------------------
  |  |   47|  2.18M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.18M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  2.18M|	{ \
  |  |   49|  2.18M|		; \
  |  |   50|  2.18M|	} \
  |  |   51|  2.18M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.18M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  831|       |
  832|  2.18M|	SANITY(source);
  833|       |
  834|  2.18M|	return total_read;
  835|  2.18M|}
vips_source_is_mappable:
  990|  9.84k|{
  991|  9.84k|	if (vips_source_unminimise(source) ||
  ------------------
  |  Branch (991:6): [True: 0, False: 9.84k]
  ------------------
  992|  9.84k|		vips_source_test_features(source))
  ------------------
  |  Branch (992:3): [True: 0, False: 9.84k]
  ------------------
  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|  9.84k|	return source->data ||
  ------------------
  |  Branch (998:9): [True: 9.84k, False: 0]
  ------------------
  999|  9.84k|		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|  9.84k|		(!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|  9.84k|}
vips_source_map:
 1047|  13.8k|{
 1048|  13.8k|	VIPS_DEBUG_MSG("vips_source_map:\n");
  ------------------
  |  |   47|  13.8k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  13.8k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  13.8k|	{ \
  |  |   49|  13.8k|		; \
  |  |   50|  13.8k|	} \
  |  |   51|  13.8k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  13.8k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1049|       |
 1050|  13.8k|	SANITY(source);
 1051|       |
 1052|  13.8k|	if (vips_source_unminimise(source) ||
  ------------------
  |  Branch (1052:6): [True: 0, False: 13.8k]
  ------------------
 1053|  13.8k|		vips_source_test_features(source))
  ------------------
  |  Branch (1053:3): [True: 0, False: 13.8k]
  ------------------
 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|  13.8k|	if (!source->data &&
  ------------------
  |  Branch (1059:6): [True: 0, False: 13.8k]
  ------------------
 1060|  13.8k|		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|  13.8k|	if (!source->data &&
  ------------------
  |  Branch (1066:6): [True: 0, False: 13.8k]
  ------------------
 1067|  13.8k|		!source->is_pipe &&
  ------------------
  |  Branch (1067:3): [True: 0, False: 0]
  ------------------
 1068|  13.8k|		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|  13.8k|	if (source->is_pipe &&
  ------------------
  |  Branch (1073:6): [True: 0, False: 13.8k]
  ------------------
 1074|  13.8k|		vips_source_pipe_read_to_position(source, -1))
  ------------------
  |  Branch (1074:3): [True: 0, False: 0]
  ------------------
 1075|      0|		return NULL;
 1076|       |
 1077|  13.8k|	if (length_out)
  ------------------
  |  Branch (1077:6): [True: 13.8k, False: 0]
  ------------------
 1078|  13.8k|		*length_out = source->length;
 1079|       |
 1080|  13.8k|	SANITY(source);
 1081|       |
 1082|  13.8k|	return source->data;
 1083|  13.8k|}
vips_source_seek:
 1136|  2.56M|{
 1137|  2.56M|	const char *nick = vips_connection_nick(VIPS_CONNECTION(source));
  ------------------
  |  |   48|  2.56M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  2.56M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  2.56M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   49|  2.56M|		VIPS_TYPE_CONNECTION, VipsConnection))
  ------------------
 1138|  2.56M|	VipsSourceClass *class = VIPS_SOURCE_GET_CLASS(source);
  ------------------
  |  |  116|  2.56M|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  2.56M|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  2.56M|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  117|  2.56M|		VIPS_TYPE_SOURCE, VipsSourceClass))
  ------------------
 1139|       |
 1140|  2.56M|	gint64 new_pos;
 1141|       |
 1142|  2.56M|	VIPS_DEBUG_MSG(
  ------------------
  |  |   47|  2.56M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.56M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  2.56M|	{ \
  |  |   49|  2.56M|		; \
  |  |   50|  2.56M|	} \
  |  |   51|  2.56M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.56M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1143|  2.56M|		"vips_source_seek: offset = %" G_GINT64_FORMAT ", whence = %d\n",
 1144|  2.56M|		offset, whence);
 1145|       |
 1146|  2.56M|	if (vips_source_unminimise(source) ||
  ------------------
  |  Branch (1146:6): [True: 0, False: 2.56M]
  ------------------
 1147|  2.56M|		vips_source_test_features(source))
  ------------------
  |  Branch (1147:3): [True: 0, False: 2.56M]
  ------------------
 1148|      0|		return -1;
 1149|       |
 1150|  2.56M|	if (source->data) {
  ------------------
  |  Branch (1150:6): [True: 2.56M, False: 0]
  ------------------
 1151|  2.56M|		switch (whence) {
 1152|  1.59M|		case SEEK_SET:
  ------------------
  |  Branch (1152:3): [True: 1.59M, False: 969k]
  ------------------
 1153|  1.59M|			new_pos = offset;
 1154|  1.59M|			break;
 1155|       |
 1156|   744k|		case SEEK_CUR:
  ------------------
  |  Branch (1156:3): [True: 744k, False: 1.82M]
  ------------------
 1157|   744k|			new_pos = source->read_position + offset;
 1158|   744k|			break;
 1159|       |
 1160|   224k|		case SEEK_END:
  ------------------
  |  Branch (1160:3): [True: 224k, False: 2.34M]
  ------------------
 1161|   224k|			new_pos = source->length + offset;
 1162|   224k|			break;
 1163|       |
 1164|      0|		default:
  ------------------
  |  Branch (1164:3): [True: 0, False: 2.56M]
  ------------------
 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|  2.56M|		}
 1168|  2.56M|	}
 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|  2.56M|	if (source->is_pipe &&
  ------------------
  |  Branch (1202:6): [True: 0, False: 2.56M]
  ------------------
 1203|  2.56M|		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|  2.56M|	if (new_pos < 0 ||
  ------------------
  |  Branch (1208:6): [True: 1.01k, False: 2.56M]
  ------------------
 1209|  2.56M|		(source->length != -1 && new_pos > source->length)) {
  ------------------
  |  Branch (1209:4): [True: 2.56M, False: 0]
  |  Branch (1209:28): [True: 118k, False: 2.44M]
  ------------------
 1210|   119k|		vips_error(nick,
 1211|   119k|			_("bad seek to %" G_GINT64_FORMAT), new_pos);
  ------------------
  |  |   30|   119k|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|   119k|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1212|   119k|		return -1;
 1213|   119k|	}
 1214|       |
 1215|  2.44M|	source->read_position = new_pos;
 1216|       |
 1217|  2.44M|	VIPS_DEBUG_MSG("    new_pos = %" G_GINT64_FORMAT "\n", new_pos);
  ------------------
  |  |   47|  2.44M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.44M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  2.44M|	{ \
  |  |   49|  2.44M|		; \
  |  |   50|  2.44M|	} \
  |  |   51|  2.44M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.44M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1218|       |
 1219|  2.44M|	return new_pos;
 1220|  2.56M|}
vips_source_rewind:
 1235|   199k|{
 1236|   199k|	VIPS_DEBUG_MSG("vips_source_rewind:\n");
  ------------------
  |  |   47|   199k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   199k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   199k|	{ \
  |  |   49|   199k|		; \
  |  |   50|   199k|	} \
  |  |   51|   199k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   199k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1237|       |
 1238|   199k|	SANITY(source);
 1239|       |
 1240|   199k|	if (vips_source_test_features(source) ||
  ------------------
  |  Branch (1240:6): [True: 0, False: 199k]
  ------------------
 1241|   199k|		vips_source_seek(source, 0, SEEK_SET) != 0)
  ------------------
  |  Branch (1241:3): [True: 0, False: 199k]
  ------------------
 1242|      0|		return -1;
 1243|       |
 1244|       |	/* Back into sniff + header decode state.
 1245|       |	 */
 1246|   199k|	source->decode = FALSE;
  ------------------
  |  |  794|   199k|#define	FALSE	(0)
  ------------------
 1247|   199k|	if (!source->sniff)
  ------------------
  |  Branch (1247:6): [True: 0, False: 199k]
  ------------------
 1248|      0|		source->sniff = g_byte_array_new();
 1249|       |
 1250|   199k|	SANITY(source);
 1251|       |
 1252|   199k|	return 0;
 1253|   199k|}
vips_source_length:
 1267|   224k|{
 1268|   224k|	gint64 length;
 1269|   224k|	gint64 read_position;
 1270|       |
 1271|   224k|	VIPS_DEBUG_MSG("vips_source_length:\n");
  ------------------
  |  |   47|   224k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   224k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   224k|	{ \
  |  |   49|   224k|		; \
  |  |   50|   224k|	} \
  |  |   51|   224k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   224k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1272|       |
 1273|   224k|	if (vips_source_test_features(source))
  ------------------
  |  Branch (1273:6): [True: 0, False: 224k]
  ------------------
 1274|      0|		return -1;
 1275|       |
 1276|   224k|	read_position = vips_source_seek(source, 0, SEEK_CUR);
 1277|   224k|	length = vips_source_seek(source, 0, SEEK_END);
 1278|   224k|	vips_source_seek(source, read_position, SEEK_SET);
 1279|       |
 1280|   224k|	return length;
 1281|   224k|}
vips_source_sniff_at_most:
 1299|   129k|{
 1300|   129k|	unsigned char *q;
 1301|   129k|	gint64 read_position;
 1302|       |
 1303|   129k|	VIPS_DEBUG_MSG("vips_source_sniff_at_most: %zd bytes\n", length);
  ------------------
  |  |   47|   129k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   129k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   129k|	{ \
  |  |   49|   129k|		; \
  |  |   50|   129k|	} \
  |  |   51|   129k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   129k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1304|       |
 1305|   129k|	SANITY(source);
 1306|       |
 1307|   129k|	if (vips_source_test_features(source) ||
  ------------------
  |  Branch (1307:6): [True: 0, False: 129k]
  ------------------
 1308|   129k|		vips_source_rewind(source))
  ------------------
  |  Branch (1308:3): [True: 0, False: 129k]
  ------------------
 1309|      0|		return -1;
 1310|       |
 1311|   129k|	g_byte_array_set_size(source->sniff, length);
 1312|       |
 1313|   129k|	read_position = 0;
 1314|   129k|	q = source->sniff->data;
 1315|   259k|	while (read_position < length) {
  ------------------
  |  Branch (1315:9): [True: 130k, False: 128k]
  ------------------
 1316|   130k|		gint64 bytes_read;
 1317|       |
 1318|   130k|		bytes_read = vips_source_read(source, q, length - read_position);
 1319|   130k|		if (bytes_read == -1)
  ------------------
  |  Branch (1319:7): [True: 0, False: 130k]
  ------------------
 1320|      0|			return -1;
 1321|   130k|		if (bytes_read == 0)
  ------------------
  |  Branch (1321:7): [True: 894, False: 129k]
  ------------------
 1322|    894|			break;
 1323|       |
 1324|   129k|		read_position += bytes_read;
 1325|   129k|		q += bytes_read;
 1326|   129k|	}
 1327|       |
 1328|   129k|	SANITY(source);
 1329|       |
 1330|   129k|	*data = source->sniff->data;
 1331|       |
 1332|   129k|	return read_position;
 1333|   129k|}
vips_source_sniff:
 1347|   129k|{
 1348|   129k|	unsigned char *data;
 1349|   129k|	gint64 bytes_read;
 1350|       |
 1351|   129k|	if (vips_source_test_features(source))
  ------------------
  |  Branch (1351:6): [True: 0, False: 129k]
  ------------------
 1352|      0|		return NULL;
 1353|       |
 1354|   129k|	bytes_read = vips_source_sniff_at_most(source, &data, length);
 1355|   129k|	if (bytes_read == -1)
  ------------------
  |  Branch (1355:6): [True: 0, False: 129k]
  ------------------
 1356|      0|		return NULL;
 1357|   129k|	if (bytes_read < length)
  ------------------
  |  Branch (1357:6): [True: 894, False: 128k]
  ------------------
 1358|    894|		return NULL;
 1359|       |
 1360|   128k|	return data;
 1361|   129k|}
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|   173k|{
  251|   173k|	VipsSource *source = VIPS_SOURCE(gobject);
  ------------------
  |  |  106|   173k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   173k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   173k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  107|   173k|		VIPS_TYPE_SOURCE, VipsSource))
  ------------------
  252|       |
  253|       |#ifdef DEBUG_MINIMISE
  254|       |	printf("vips_source_finalize: %p\n", source);
  255|       |#endif /*DEBUG_MINIMISE*/
  256|       |
  257|   173k|	VIPS_FREEF(g_byte_array_unref, source->header_bytes);
  ------------------
  |  |   41|   173k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   173k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   173k|	{ \
  |  |   43|   173k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 173k]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|   173k|	} \
  |  |   48|   173k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   173k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  258|   173k|	VIPS_FREEF(g_byte_array_unref, source->sniff);
  ------------------
  |  |   41|   173k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   173k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   173k|	{ \
  |  |   43|   173k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 169k, False: 4.67k]
  |  |  ------------------
  |  |   44|   169k|			(void) F((S)); \
  |  |   45|   169k|			(S) = 0; \
  |  |   46|   169k|		} \
  |  |   47|   173k|	} \
  |  |   48|   173k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   173k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  259|   173k|	if (source->mmap_baseaddr) {
  ------------------
  |  Branch (259:6): [True: 0, False: 173k]
  ------------------
  260|      0|		vips__munmap(source->mmap_baseaddr, source->mmap_length);
  261|      0|		source->mmap_baseaddr = NULL;
  262|      0|	}
  263|       |
  264|   173k|	G_OBJECT_CLASS(vips_source_parent_class)->finalize(gobject);
  ------------------
  |  |   58|   173k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|   173k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   173k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  265|   173k|}
source.c:vips_source_build:
  269|   173k|{
  270|   173k|	VipsConnection *connection = VIPS_CONNECTION(object);
  ------------------
  |  |   48|   173k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   173k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   173k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   49|   173k|		VIPS_TYPE_CONNECTION, VipsConnection))
  ------------------
  271|   173k|	VipsSource *source = VIPS_SOURCE(object);
  ------------------
  |  |  106|   173k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   173k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   173k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  107|   173k|		VIPS_TYPE_SOURCE, VipsSource))
  ------------------
  272|       |
  273|   173k|	VIPS_DEBUG_MSG("vips_source_build: %p\n", source);
  ------------------
  |  |   47|   173k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   173k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   173k|	{ \
  |  |   49|   173k|		; \
  |  |   50|   173k|	} \
  |  |   51|   173k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   173k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  274|       |
  275|   173k|	if (VIPS_OBJECT_CLASS(vips_source_parent_class)->build(object))
  ------------------
  |  |  435|   173k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|   173k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   173k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (275:6): [True: 0, False: 173k]
  ------------------
  276|      0|		return -1;
  277|       |
  278|   173k|	if (vips_object_argument_isset(object, "filename") &&
  ------------------
  |  Branch (278:6): [True: 0, False: 173k]
  ------------------
  279|   173k|		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|   173k|	if (vips_object_argument_isset(object, "filename") &&
  ------------------
  |  Branch (287:6): [True: 0, False: 173k]
  ------------------
  288|   173k|		vips_source_unminimise(source))
  ------------------
  |  Branch (288:3): [True: 0, False: 0]
  ------------------
  289|      0|		return -1;
  290|       |
  291|   173k|	if (vips_object_argument_isset(object, "descriptor")) {
  ------------------
  |  Branch (291:6): [True: 0, False: 173k]
  ------------------
  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|   173k|	if (vips_object_argument_isset(object, "blob")) {
  ------------------
  |  Branch (303:6): [True: 173k, False: 0]
  ------------------
  304|   173k|		size_t length;
  305|       |
  306|   173k|		if (!(source->data = vips_blob_get(source->blob, &length)))
  ------------------
  |  Branch (306:7): [True: 0, False: 173k]
  ------------------
  307|      0|			return -1;
  308|       |
  309|   173k|		source->length = VIPS_MIN(length, G_MAXSSIZE);
  ------------------
  |  |   55|   173k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 173k, False: 0]
  |  |  ------------------
  ------------------
  310|   173k|	}
  311|       |
  312|   173k|	return 0;
  313|   173k|}
source.c:vips_source_init:
  375|   173k|{
  376|   173k|	source->length = -1;
  377|   173k|	source->sniff = g_byte_array_new();
  378|   173k|	source->header_bytes = g_byte_array_new();
  379|   173k|}
source.c:vips_source_test_features:
  163|  5.56M|{
  164|  5.56M|	if (vips_source_unminimise(source) ||
  ------------------
  |  Branch (164:6): [True: 0, False: 5.56M]
  ------------------
  165|  5.56M|		vips_source_test_seek(source))
  ------------------
  |  Branch (165:3): [True: 0, False: 5.56M]
  ------------------
  166|      0|		return -1;
  167|       |
  168|  5.56M|	return 0;
  169|  5.56M|}
source.c:vips_source_test_seek:
  115|  5.56M|{
  116|  5.56M|	if (!source->have_tested_seek) {
  ------------------
  |  Branch (116:6): [True: 173k, False: 5.39M]
  ------------------
  117|   173k|		VipsSourceClass *class = VIPS_SOURCE_GET_CLASS(source);
  ------------------
  |  |  116|   173k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|   173k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|   173k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  117|   173k|		VIPS_TYPE_SOURCE, VipsSourceClass))
  ------------------
  118|       |
  119|   173k|		source->have_tested_seek = TRUE;
  ------------------
  |  |  798|   173k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|   173k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  120|       |
  121|   173k|		VIPS_DEBUG_MSG("vips_source_can_seek: testing seek ..\n");
  ------------------
  |  |   47|   173k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   173k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   173k|	{ \
  |  |   49|   173k|		; \
  |  |   50|   173k|	} \
  |  |   51|   173k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   173k|#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|   173k|		if (source->data ||
  ------------------
  |  Branch (128:7): [True: 173k, False: 0]
  ------------------
  129|   173k|			class->seek(source, 0, SEEK_CUR) != -1) {
  ------------------
  |  Branch (129:4): [True: 0, False: 0]
  ------------------
  130|   173k|			gint64 length;
  131|       |
  132|   173k|			VIPS_DEBUG_MSG("    seekable source\n");
  ------------------
  |  |   47|   173k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   173k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   173k|	{ \
  |  |   49|   173k|		; \
  |  |   50|   173k|	} \
  |  |   51|   173k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   173k|#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|   173k|			if ((length = vips_source_length(source)) == -1)
  ------------------
  |  Branch (137:8): [True: 0, False: 173k]
  ------------------
  138|      0|				return -1;
  139|       |
  140|   173k|			source->length = length;
  141|       |
  142|       |			/* If we can seek, we won't need to save header bytes.
  143|       |			 */
  144|   173k|			VIPS_FREEF(g_byte_array_unref, source->header_bytes);
  ------------------
  |  |   41|   173k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   173k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   173k|	{ \
  |  |   43|   173k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 173k, False: 0]
  |  |  ------------------
  |  |   44|   173k|			(void) F((S)); \
  |  |   45|   173k|			(S) = 0; \
  |  |   46|   173k|		} \
  |  |   47|   173k|	} \
  |  |   48|   173k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   173k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  145|   173k|		}
  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|   173k|	}
  153|       |
  154|  5.56M|	return 0;
  155|  5.56M|}

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|}

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|}

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|  5.78M|{
   87|  5.78M|	return g_private_get(&is_vips_thread_key) != NULL;
   88|  5.78M|}
vips_g_mutex_new:
   95|  4.68M|{
   96|  4.68M|	GMutex *mutex;
   97|       |
   98|  4.68M|	mutex = g_new(GMutex, 1);
  ------------------
  |  |  282|  4.68M|#define g_new(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc)
  |  |  ------------------
  |  |  |  |  227|  4.68M|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|  4.68M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|  4.68M|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|  4.68M|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|  4.68M|	  gpointer __p;						\
  |  |  |  |  231|  4.68M|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 4.68M]
  |  |  |  |  ------------------
  |  |  |  |  232|  4.68M|	    __p = g_##func (__n);				\
  |  |  |  |  233|  4.68M|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 4.68M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|  4.68M|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 4.68M]
  |  |  |  |  |  Branch (234:26): [True: 4.68M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|  4.68M|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|  4.68M|	  else							\
  |  |  |  |  237|  4.68M|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|  4.68M|	  __p;							\
  |  |  |  |  239|  4.68M|	}))
  |  |  ------------------
  ------------------
   99|  4.68M|	g_mutex_init(mutex);
  100|       |
  101|  4.68M|	return mutex;
  102|  4.68M|}
vips_g_mutex_free:
  106|  4.68M|{
  107|  4.68M|	g_mutex_clear(mutex);
  108|  4.68M|	g_free(mutex);
  109|  4.68M|}
vips_g_cond_new:
  113|   950k|{
  114|   950k|	GCond *cond;
  115|       |
  116|   950k|	cond = g_new(GCond, 1);
  ------------------
  |  |  282|   950k|#define g_new(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc)
  |  |  ------------------
  |  |  |  |  227|   950k|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|   950k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|   950k|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|   950k|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|   950k|	  gpointer __p;						\
  |  |  |  |  231|   950k|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 950k]
  |  |  |  |  ------------------
  |  |  |  |  232|   950k|	    __p = g_##func (__n);				\
  |  |  |  |  233|   950k|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 950k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|   950k|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 950k]
  |  |  |  |  |  Branch (234:26): [True: 950k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|   950k|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|   950k|	  else							\
  |  |  |  |  237|   950k|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|   950k|	  __p;							\
  |  |  |  |  239|   950k|	}))
  |  |  ------------------
  ------------------
  117|   950k|	g_cond_init(cond);
  118|       |
  119|   950k|	return cond;
  120|   950k|}
vips_g_cond_free:
  124|   950k|{
  125|   950k|	g_cond_clear(cond);
  126|   950k|	g_free(cond);
  127|   950k|}
vips_g_thread_new:
  159|      2|{
  160|      2|	GThread *thread;
  161|      2|	VipsThreadInfo *info;
  162|      2|	GError *error = NULL;
  163|       |
  164|      2|	info = g_new(VipsThreadInfo, 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|	}))
  |  |  ------------------
  ------------------
  165|      2|	info->domain = domain;
  166|      2|	info->func = func;
  167|      2|	info->data = data;
  168|       |
  169|      2|	thread = g_thread_try_new(domain, vips_thread_run, info, &error);
  170|       |
  171|      2|	VIPS_DEBUG_MSG_RED("vips_g_thread_new: g_thread_create(%s) = %p\n",
  ------------------
  |  |   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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  172|      2|		domain, thread);
  173|       |
  174|      2|	if (!thread) {
  ------------------
  |  Branch (174:6): [True: 0, False: 2]
  ------------------
  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|      2|	return thread;
  183|      2|}
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|   715k|{
  276|   715k|	return vips__concurrency;
  277|   715k|}
vips_get_tile_size:
  297|   482k|{
  298|   482k|	const int nthr = vips_concurrency_get();
  299|   482k|	const int typical_image_width = 1000;
  300|       |
  301|       |	/* Compiler warnings.
  302|       |	 */
  303|   482k|	*tile_width = 1;
  304|   482k|	*tile_height = 1;
  305|       |
  306|       |	/* Pick a render geometry.
  307|       |	 */
  308|   482k|	switch (im->dhint) {
  309|   155k|	case VIPS_DEMAND_STYLE_SMALLTILE:
  ------------------
  |  Branch (309:2): [True: 155k, False: 326k]
  ------------------
  310|   155k|		*tile_width = vips__tile_width;
  311|   155k|		*tile_height = vips__tile_height;
  312|   155k|		break;
  313|       |
  314|      0|	case VIPS_DEMAND_STYLE_ANY:
  ------------------
  |  Branch (314:2): [True: 0, False: 482k]
  ------------------
  315|  12.1k|	case VIPS_DEMAND_STYLE_FATSTRIP:
  ------------------
  |  Branch (315:2): [True: 12.1k, False: 470k]
  ------------------
  316|  12.1k|		*tile_width = im->Xsize;
  317|  12.1k|		*tile_height = vips__fatstrip_height;
  318|  12.1k|		break;
  319|       |
  320|   314k|	case VIPS_DEMAND_STYLE_THINSTRIP:
  ------------------
  |  Branch (320:2): [True: 314k, False: 167k]
  ------------------
  321|   314k|		*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|   314k|		*tile_height = im->Xsize > 10000
  ------------------
  |  Branch (325:18): [True: 0, False: 314k]
  ------------------
  326|   314k|			? vips__thinstrip_height
  327|   314k|			: vips__fatstrip_height;
  328|   314k|		break;
  329|       |
  330|      0|	default:
  ------------------
  |  Branch (330:2): [True: 0, False: 482k]
  ------------------
  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|   482k|	}
  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|   482k|	*n_lines = vips__tile_height *
  345|   482k|		VIPS_ROUND_UP(vips__tile_width * nthr,
  ------------------
  |  |  111|   482k|#define VIPS_ROUND_UP(N, P) (VIPS_ROUND_DOWN((N) + (P) -1, (P)))
  |  |  ------------------
  |  |  |  |  110|   482k|#define VIPS_ROUND_DOWN(N, P) ((N) - ((N) % (P)))
  |  |  ------------------
  ------------------
  346|   482k|			typical_image_width) /
  347|   482k|		typical_image_width;
  348|   482k|	*n_lines = VIPS_MAX(*n_lines, vips__fatstrip_height * nthr);
  ------------------
  |  |   54|   482k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 482k, False: 0]
  |  |  ------------------
  ------------------
  349|   482k|	*n_lines = VIPS_MAX(*n_lines, vips__thinstrip_height * nthr);
  ------------------
  |  |   54|   482k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 482k, False: 0]
  |  |  ------------------
  ------------------
  350|   482k|	*n_lines = VIPS_ROUND_UP(*n_lines, *tile_height);
  ------------------
  |  |  111|   482k|#define VIPS_ROUND_UP(N, P) (VIPS_ROUND_DOWN((N) + (P) -1, (P)))
  |  |  ------------------
  |  |  |  |  110|   482k|#define VIPS_ROUND_DOWN(N, P) ((N) - ((N) % (P)))
  |  |  ------------------
  ------------------
  351|       |
  352|       |	/* We make this assumption in several places.
  353|       |	 */
  354|   482k|	g_assert(*n_lines % *tile_height == 0);
  ------------------
  |  |  166|   482k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   482k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   482k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  355|       |
  356|   482k|	VIPS_DEBUG_MSG("vips_get_tile_size: %d by %d patches, "
  ------------------
  |  |   47|   482k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   482k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   482k|	{ \
  |  |   49|   482k|		; \
  |  |   50|   482k|	} \
  |  |   51|   482k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   482k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  357|   482k|				   "groups of %d scanlines\n",
  358|   482k|		*tile_width, *tile_height, *n_lines);
  359|   482k|}
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|      2|{
  138|      2|	VipsThreadInfo *info = (VipsThreadInfo *) data;
  139|       |
  140|      2|	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|      2|	g_private_set(&is_vips_thread_key, info);
  147|       |
  148|      2|	result = info->func(info->data);
  149|       |
  150|      2|	g_free(info);
  151|       |
  152|      2|	vips_thread_shutdown();
  153|       |
  154|      2|	return result;
  155|      2|}
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|   233k|{
  154|   233k|	return vips_threadset_run(vips__threadset, domain, func, data);
  155|   233k|}
vips_thread_state_set:
  208|   233k|{
  209|   233k|	VipsThreadState *state = (VipsThreadState *) object;
  210|   233k|	VipsImage *im = (VipsImage *) a;
  211|       |
  212|   233k|	VIPS_DEBUG_MSG("vips_thread_state_set: image %p\n", im);
  ------------------
  |  |   47|   233k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   233k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   233k|	{ \
  |  |   49|   233k|		; \
  |  |   50|   233k|	} \
  |  |   51|   233k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   233k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  213|       |
  214|   233k|	state->im = im;
  215|   233k|	state->a = b;
  216|       |
  217|   233k|	return NULL;
  218|   233k|}
vips__worker_lock:
  455|   598k|{
  456|   598k|	VipsWorker *worker = (VipsWorker *) g_private_get(&worker_key);
  457|       |
  458|   598k|	if (worker)
  ------------------
  |  Branch (458:6): [True: 598k, False: 0]
  ------------------
  459|   598k|		g_atomic_int_inc(&worker->pool->n_waiting);
  ------------------
  |  |  143|   598k|  (G_GNUC_EXTENSION ({                                                       \
  |  |  ------------------
  |  |  |  |   54|   598k|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  144|   598k|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint));                     \
  |  |  ------------------
  |  |  |  |  745|   598k|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  145|   598k|    (void) (0 ? *(atomic) ^ *(atomic) : 1);                                  \
  |  |  ------------------
  |  |  |  Branch (145:13): [Folded - Ignored]
  |  |  ------------------
  |  |  146|   598k|    (void) __atomic_fetch_add ((atomic), 1, __ATOMIC_SEQ_CST);               \
  |  |  147|   598k|  }))
  ------------------
  460|   598k|	g_mutex_lock(mutex);
  461|   598k|	if (worker)
  ------------------
  |  Branch (461:6): [True: 598k, False: 0]
  ------------------
  462|   598k|		g_atomic_int_dec_and_test(&worker->pool->n_waiting);
  ------------------
  |  |  149|   598k|  (G_GNUC_EXTENSION ({                                                       \
  |  |  ------------------
  |  |  |  |   54|   598k|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  150|   598k|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint));                     \
  |  |  ------------------
  |  |  |  |  745|   598k|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  151|   598k|    (void) (0 ? *(atomic) ^ *(atomic) : 1);                                  \
  |  |  ------------------
  |  |  |  Branch (151:13): [Folded - Ignored]
  |  |  ------------------
  |  |  152|   598k|    __atomic_fetch_sub ((atomic), 1, __ATOMIC_SEQ_CST) == 1;                 \
  |  |  153|   598k|  }))
  ------------------
  463|   598k|}
vips__worker_cond_wait:
  467|   372k|{
  468|   372k|	VipsWorker *worker = (VipsWorker *) g_private_get(&worker_key);
  469|       |
  470|   372k|	if (worker)
  ------------------
  |  Branch (470:6): [True: 32.1k, False: 340k]
  ------------------
  471|  32.1k|		g_atomic_int_inc(&worker->pool->n_waiting);
  ------------------
  |  |  143|  32.1k|  (G_GNUC_EXTENSION ({                                                       \
  |  |  ------------------
  |  |  |  |   54|  32.1k|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  144|  32.1k|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint));                     \
  |  |  ------------------
  |  |  |  |  745|  32.1k|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  145|  32.1k|    (void) (0 ? *(atomic) ^ *(atomic) : 1);                                  \
  |  |  ------------------
  |  |  |  Branch (145:13): [Folded - Ignored]
  |  |  ------------------
  |  |  146|  32.1k|    (void) __atomic_fetch_add ((atomic), 1, __ATOMIC_SEQ_CST);               \
  |  |  147|  32.1k|  }))
  ------------------
  472|   372k|	g_cond_wait(cond, mutex);
  473|   372k|	if (worker)
  ------------------
  |  Branch (473:6): [True: 32.1k, False: 340k]
  ------------------
  474|  32.1k|		g_atomic_int_dec_and_test(&worker->pool->n_waiting);
  ------------------
  |  |  149|  32.1k|  (G_GNUC_EXTENSION ({                                                       \
  |  |  ------------------
  |  |  |  |   54|  32.1k|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  150|  32.1k|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint));                     \
  |  |  ------------------
  |  |  |  |  745|  32.1k|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  151|  32.1k|    (void) (0 ? *(atomic) ^ *(atomic) : 1);                                  \
  |  |  ------------------
  |  |  |  Branch (151:13): [Folded - Ignored]
  |  |  ------------------
  |  |  152|  32.1k|    __atomic_fetch_sub ((atomic), 1, __ATOMIC_SEQ_CST) == 1;                 \
  |  |  153|  32.1k|  }))
  ------------------
  475|   372k|}
vips_threadpool_run:
  655|   233k|{
  656|   233k|	VipsThreadpool *pool;
  657|   233k|	int result;
  658|   233k|	int n_waiting;
  659|   233k|	int n_working;
  660|       |
  661|   233k|	if (!(pool = vips_threadpool_new(im)))
  ------------------
  |  Branch (661:6): [True: 0, False: 233k]
  ------------------
  662|      0|		return -1;
  663|       |
  664|   233k|	pool->start = start;
  665|   233k|	pool->allocate = allocate;
  666|   233k|	pool->work = work;
  667|   233k|	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|   466k|	for (n_working = 0; n_working < 1 + pool->max_workers / 2; n_working++)
  ------------------
  |  Branch (672:22): [True: 233k, False: 233k]
  ------------------
  673|   233k|		if (vips_worker_new(pool)) {
  ------------------
  |  Branch (673:7): [True: 0, False: 233k]
  ------------------
  674|      0|			vips_threadpool_free(pool);
  675|      0|			return -1;
  676|      0|		}
  677|       |
  678|   247k|	for (;;) {
  679|       |		/* Wait for a tick from a worker.
  680|       |		 */
  681|   247k|		vips_semaphore_down(&pool->tick);
  682|       |
  683|   247k|		VIPS_DEBUG_MSG("vips_threadpool_run: tick\n");
  ------------------
  |  |   47|   247k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   247k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   247k|	{ \
  |  |   49|   247k|		; \
  |  |   50|   247k|	} \
  |  |   51|   247k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   247k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  684|       |
  685|   247k|		if (pool->stop ||
  ------------------
  |  Branch (685:7): [True: 212k, False: 34.5k]
  ------------------
  686|   247k|			pool->error)
  ------------------
  |  Branch (686:4): [True: 20.3k, False: 14.2k]
  ------------------
  687|   232k|			break;
  688|       |
  689|  14.2k|		if (progress &&
  ------------------
  |  Branch (689:7): [True: 14.2k, False: 0]
  ------------------
  690|  14.2k|			progress(pool->a))
  ------------------
  |  Branch (690:4): [True: 0, False: 14.2k]
  ------------------
  691|      0|			pool->error = TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  692|       |
  693|  14.2k|		if (pool->stop ||
  ------------------
  |  Branch (693:7): [True: 390, False: 13.8k]
  ------------------
  694|  14.2k|			pool->error)
  ------------------
  |  Branch (694:4): [True: 4, False: 13.8k]
  ------------------
  695|    394|			break;
  696|       |
  697|  13.8k|		n_waiting = g_atomic_int_get(&pool->n_waiting);
  ------------------
  |  |   91|  13.8k|  (G_GNUC_EXTENSION ({                                                       \
  |  |  ------------------
  |  |  |  |   54|  13.8k|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |   92|  13.8k|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint));                     \
  |  |  ------------------
  |  |  |  |  745|  13.8k|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |   93|  13.8k|    gint gaig_temp;                                                          \
  |  |   94|  13.8k|    (void) (0 ? *(atomic) ^ *(atomic) : 1);                                  \
  |  |  ------------------
  |  |  |  Branch (94:13): [Folded - Ignored]
  |  |  ------------------
  |  |   95|  13.8k|    __atomic_load ((gint *)(atomic), &gaig_temp, __ATOMIC_SEQ_CST);          \
  |  |   96|  13.8k|    (gint) gaig_temp;                                                        \
  |  |   97|  13.8k|  }))
  ------------------
  698|  13.8k|		VIPS_DEBUG_MSG("n_waiting = %d\n", n_waiting);
  ------------------
  |  |   47|  13.8k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  13.8k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  13.8k|	{ \
  |  |   49|  13.8k|		; \
  |  |   50|  13.8k|	} \
  |  |   51|  13.8k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  13.8k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  699|  13.8k|		VIPS_DEBUG_MSG("n_working = %d\n", n_working);
  ------------------
  |  |   47|  13.8k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  13.8k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  13.8k|	{ \
  |  |   49|  13.8k|		; \
  |  |   50|  13.8k|	} \
  |  |   51|  13.8k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  13.8k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  700|  13.8k|		VIPS_DEBUG_MSG("exit = %d\n", pool->exit);
  ------------------
  |  |   47|  13.8k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  13.8k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  13.8k|	{ \
  |  |   49|  13.8k|		; \
  |  |   50|  13.8k|	} \
  |  |   51|  13.8k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  13.8k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  701|       |
  702|  13.8k|		if (n_waiting > 3 &&
  ------------------
  |  Branch (702:7): [True: 0, False: 13.8k]
  ------------------
  703|  13.8k|			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|  13.8k|		else if (n_waiting < 2 &&
  ------------------
  |  Branch (708:12): [True: 13.8k, False: 0]
  ------------------
  709|  13.8k|			n_working < pool->max_workers) {
  ------------------
  |  Branch (709:4): [True: 0, False: 13.8k]
  ------------------
  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|  13.8k|	}
  718|       |
  719|       |	/* This will block until the last worker completes.
  720|       |	 */
  721|   233k|	vips_threadpool_wait(pool);
  722|       |
  723|       |	/* Return 0 for success.
  724|       |	 */
  725|   233k|	result = pool->error ? -1 : 0;
  ------------------
  |  Branch (725:11): [True: 20.3k, False: 212k]
  ------------------
  726|       |
  727|   233k|	vips_threadpool_free(pool);
  728|       |
  729|   233k|	if (!vips_image_get_concurrency(im, 0))
  ------------------
  |  Branch (729:6): [True: 233k, False: 0]
  ------------------
  730|   233k|		g_info("threadpool completed with %d workers", n_working);
  ------------------
  |  |  341|   233k|#define g_info(...)     g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|   233k|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  342|   233k|                               G_LOG_LEVEL_INFO,     \
  |  |  343|   233k|                               __VA_ARGS__)
  ------------------
  731|       |
  732|       |	/* "minimise" is only emitted for top-level threadpools.
  733|       |	 */
  734|   233k|	if (!vips_image_get_typeof(im, "vips-no-minimise"))
  ------------------
  |  Branch (734:6): [True: 233k, False: 0]
  ------------------
  735|   233k|		vips_image_minimise_all(im);
  736|       |
  737|   233k|	return result;
  738|   233k|}
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|   233k|{
  162|   233k|	VipsThreadState *state = (VipsThreadState *) gobject;
  163|       |
  164|   233k|	VIPS_DEBUG_MSG("vips_thread_state_dispose:\n");
  ------------------
  |  |   47|   233k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   233k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   233k|	{ \
  |  |   49|   233k|		; \
  |  |   50|   233k|	} \
  |  |   51|   233k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   233k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  165|       |
  166|   233k|	VIPS_UNREF(state->reg);
  ------------------
  |  |   57|   233k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|   233k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   233k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|   233k|	{ \
  |  |  |  |   43|   233k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 233k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|   233k|			(void) F((S)); \
  |  |  |  |   45|   233k|			(S) = 0; \
  |  |  |  |   46|   233k|		} \
  |  |  |  |   47|   233k|	} \
  |  |  |  |   48|   233k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   233k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  167|       |
  168|   233k|	G_OBJECT_CLASS(vips_thread_state_parent_class)->dispose(gobject);
  ------------------
  |  |   58|   233k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|   233k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   233k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  169|   233k|}
threadpool.c:vips_thread_state_build:
  173|   233k|{
  174|   233k|	VipsThreadState *state = (VipsThreadState *) object;
  175|       |
  176|   233k|	if (!(state->reg = vips_region_new(state->im)))
  ------------------
  |  Branch (176:6): [True: 0, False: 233k]
  ------------------
  177|      0|		return -1;
  178|       |
  179|   233k|	return VIPS_OBJECT_CLASS(vips_thread_state_parent_class)
  ------------------
  |  |  435|   233k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|   233k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   233k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  180|   233k|		->build(object);
  181|   233k|}
threadpool.c:vips_thread_state_init:
  198|   233k|{
  199|   233k|	VIPS_DEBUG_MSG("vips_thread_state_init:\n");
  ------------------
  |  |   47|   233k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   233k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   233k|	{ \
  |  |   49|   233k|		; \
  |  |   50|   233k|	} \
  |  |   51|   233k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   233k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  200|       |
  201|   233k|	state->reg = NULL;
  202|   233k|	state->stop = FALSE;
  ------------------
  |  |  794|   233k|#define	FALSE	(0)
  ------------------
  203|   233k|	state->stall = FALSE;
  ------------------
  |  |  794|   233k|#define	FALSE	(0)
  ------------------
  204|   233k|}
threadpool.c:vips_threadpool_new:
  502|   233k|{
  503|   233k|	VipsThreadpool *pool;
  504|   233k|	int tile_width;
  505|   233k|	int tile_height;
  506|   233k|	gint64 n_tiles;
  507|   233k|	int n_lines;
  508|       |
  509|       |	/* Allocate and init new thread block.
  510|       |	 */
  511|   233k|	if (!(pool = VIPS_NEW(NULL, VipsThreadpool)))
  ------------------
  |  |   70|   233k|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|   233k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|   233k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|   233k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|   233k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (511:6): [True: 0, False: 233k]
  ------------------
  512|      0|		return NULL;
  513|   233k|	pool->im = im;
  514|   233k|	pool->allocate = NULL;
  515|   233k|	pool->work = NULL;
  516|   233k|	pool->allocate_lock = vips_g_mutex_new();
  517|   233k|	pool->max_workers = vips_concurrency_get();
  518|   233k|	vips_semaphore_init(&pool->n_workers, 0, "n_workers");
  519|   233k|	vips_semaphore_init(&pool->tick, 0, "tick");
  520|   233k|	pool->error = FALSE;
  ------------------
  |  |  794|   233k|#define	FALSE	(0)
  ------------------
  521|   233k|	pool->stop = FALSE;
  ------------------
  |  |  794|   233k|#define	FALSE	(0)
  ------------------
  522|   233k|	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|   233k|	vips_get_tile_size(im, &tile_width, &tile_height, &n_lines);
  530|   233k|	n_tiles = (1 + (gint64) im->Xsize / tile_width) *
  531|   233k|		(1 + (gint64) im->Ysize / tile_height);
  532|   233k|	n_tiles = VIPS_CLIP(1, n_tiles, 1024);
  ------------------
  |  |   57|   233k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|   466k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 0, False: 233k]
  |  |  |  |  |  Branch (54:32): [True: 0, False: 233k]
  |  |  |  |  |  Branch (54:44): [True: 0, False: 233k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  533|   233k|	pool->max_workers = VIPS_MIN(pool->max_workers, n_tiles);
  ------------------
  |  |   55|   233k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 155k, False: 77.7k]
  |  |  ------------------
  ------------------
  534|       |
  535|       |	/* VIPS_META_CONCURRENCY on the image can optionally override
  536|       |	 * concurrency.
  537|       |	 */
  538|   233k|	pool->max_workers = vips_image_get_concurrency(im, pool->max_workers);
  539|       |
  540|   233k|	VIPS_DEBUG_MSG("vips_threadpool_new: \"%s\" (%p), with %d threads\n",
  ------------------
  |  |   47|   233k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   233k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   233k|	{ \
  |  |   49|   233k|		; \
  |  |   50|   233k|	} \
  |  |   51|   233k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   233k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  541|   233k|		im->filename, pool, pool->max_workers);
  542|       |
  543|   233k|	return pool;
  544|   233k|}
threadpool.c:vips_worker_new:
  428|   233k|{
  429|   233k|	VipsWorker *worker;
  430|       |
  431|   233k|	if (!(worker = VIPS_NEW(NULL, VipsWorker)))
  ------------------
  |  |   70|   233k|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|   233k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|   233k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|   233k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|   233k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (431:6): [True: 0, False: 233k]
  ------------------
  432|      0|		return -1;
  433|   233k|	worker->pool = pool;
  434|   233k|	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|   233k|	if (vips_thread_execute("worker", vips_thread_main_loop, worker)) {
  ------------------
  |  Branch (441:6): [True: 0, False: 233k]
  ------------------
  442|      0|		g_free(worker);
  443|      0|		return -1;
  444|      0|	}
  445|       |
  446|       |	/* One more worker in the pool.
  447|       |	 */
  448|   233k|	vips_semaphore_upn(&pool->n_workers, -1);
  449|       |
  450|   233k|	return 0;
  451|   233k|}
threadpool.c:vips_thread_main_loop:
  383|   233k|{
  384|   233k|	VipsWorker *worker = (VipsWorker *) a;
  385|   233k|	VipsThreadpool *pool = worker->pool;
  386|       |
  387|   233k|	g_assert(pool == worker->pool);
  ------------------
  |  |  166|   233k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   233k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   233k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  388|       |
  389|   233k|	VIPS_GATE_START("vips_thread_main_loop: thread");
  ------------------
  |  |   41|   233k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   233k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   233k|	{ \
  |  |   43|   233k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 233k]
  |  |  ------------------
  |  |   44|   233k|			vips__thread_gate_start(NAME); \
  |  |   45|   233k|	} \
  |  |   46|   233k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   233k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  390|       |
  391|   233k|	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|   710k|	while (!pool->stop &&
  ------------------
  |  Branch (396:9): [True: 497k, False: 212k]
  ------------------
  397|   710k|		!worker->stop &&
  ------------------
  |  Branch (397:3): [True: 476k, False: 20.3k]
  ------------------
  398|   710k|		!pool->error) {
  ------------------
  |  Branch (398:3): [True: 476k, False: 0]
  ------------------
  399|   476k|		VIPS_GATE_START("vips_worker_work_unit: u");
  ------------------
  |  |   41|   476k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   476k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   476k|	{ \
  |  |   43|   476k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 476k]
  |  |  ------------------
  |  |   44|   476k|			vips__thread_gate_start(NAME); \
  |  |   45|   476k|	} \
  |  |   46|   476k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   476k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  400|   476k|		vips_worker_work_unit(worker);
  401|   476k|		VIPS_GATE_STOP("vips_worker_work_unit: u");
  ------------------
  |  |   49|   476k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   476k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|   476k|	{ \
  |  |   51|   476k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 476k]
  |  |  ------------------
  |  |   52|   476k|			vips__thread_gate_stop(NAME); \
  |  |   53|   476k|	} \
  |  |   54|   476k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   476k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  402|   476k|		vips_semaphore_up(&pool->tick);
  403|   476k|	}
  404|       |
  405|   233k|	VIPS_GATE_STOP("vips_thread_main_loop: thread");
  ------------------
  |  |   49|   233k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   233k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|   233k|	{ \
  |  |   51|   233k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 233k]
  |  |  ------------------
  |  |   52|   233k|			vips__thread_gate_stop(NAME); \
  |  |   53|   233k|	} \
  |  |   54|   233k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   233k|#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|   233k|	g_mutex_lock(pool->allocate_lock);
  411|       |
  412|   233k|	VIPS_FREEF(g_object_unref, worker->state);
  ------------------
  |  |   41|   233k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   233k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   233k|	{ \
  |  |   43|   233k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 233k, False: 0]
  |  |  ------------------
  |  |   44|   233k|			(void) F((S)); \
  |  |   45|   233k|			(S) = 0; \
  |  |   46|   233k|		} \
  |  |   47|   233k|	} \
  |  |   48|   233k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   233k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  413|       |
  414|   233k|	g_mutex_unlock(pool->allocate_lock);
  415|       |
  416|   233k|	VIPS_FREE(worker);
  ------------------
  |  |   50|   233k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|   233k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   233k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|   233k|	{ \
  |  |  |  |   43|   233k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 233k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|   233k|			(void) F((S)); \
  |  |  |  |   45|   233k|			(S) = 0; \
  |  |  |  |   46|   233k|		} \
  |  |  |  |   47|   233k|	} \
  |  |  |  |   48|   233k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   233k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  417|   233k|	g_private_set(&worker_key, NULL);
  418|       |
  419|       |	/* We are done: tell the main thread.
  420|       |	 */
  421|   233k|	vips_semaphore_upn(&pool->n_workers, 1);
  422|   233k|}
threadpool.c:vips_worker_work_unit:
  309|   476k|{
  310|   476k|	VipsThreadpool *pool = worker->pool;
  311|       |
  312|   476k|	VIPS_GATE_START("vips_worker_work_unit: wait");
  ------------------
  |  |   41|   476k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   476k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   476k|	{ \
  |  |   43|   476k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 476k]
  |  |  ------------------
  |  |   44|   476k|			vips__thread_gate_start(NAME); \
  |  |   45|   476k|	} \
  |  |   46|   476k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   476k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  313|       |
  314|   476k|	vips__worker_lock(pool->allocate_lock);
  315|       |
  316|   476k|	VIPS_GATE_STOP("vips_worker_work_unit: wait");
  ------------------
  |  |   49|   476k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   476k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|   476k|	{ \
  |  |   51|   476k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 476k]
  |  |  ------------------
  |  |   52|   476k|			vips__thread_gate_stop(NAME); \
  |  |   53|   476k|	} \
  |  |   54|   476k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   476k|#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|   476k|	if (pool->stop) {
  ------------------
  |  Branch (320:6): [True: 0, False: 476k]
  ------------------
  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|   476k|	if (g_atomic_int_add(&pool->exit, -1) > 0) {
  ------------------
  |  |  162|   476k|  (G_GNUC_EXTENSION ({                                                       \
  |  |  ------------------
  |  |  |  |   54|   476k|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  163|   476k|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint));                     \
  |  |  ------------------
  |  |  |  |  745|   476k|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  164|   476k|    (void) (0 ? *(atomic) ^ (val) : 1);                                      \
  |  |  ------------------
  |  |  |  Branch (164:13): [Folded - Ignored]
  |  |  ------------------
  |  |  165|   476k|    (gint) __atomic_fetch_add ((atomic), (val), __ATOMIC_SEQ_CST);           \
  |  |  166|   476k|  }))
  ------------------
  |  Branch (328:6): [True: 0, False: 476k]
  ------------------
  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|   476k|	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|   476k|		g_atomic_int_inc(&pool->exit);
  ------------------
  |  |  143|   476k|  (G_GNUC_EXTENSION ({                                                       \
  |  |  ------------------
  |  |  |  |   54|   476k|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  144|   476k|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint));                     \
  |  |  ------------------
  |  |  |  |  745|   476k|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  145|   476k|    (void) (0 ? *(atomic) ^ *(atomic) : 1);                                  \
  |  |  ------------------
  |  |  |  Branch (145:13): [Folded - Ignored]
  |  |  ------------------
  |  |  146|   476k|    (void) __atomic_fetch_add ((atomic), 1, __ATOMIC_SEQ_CST);               \
  |  |  147|   476k|  }))
  ------------------
  341|   476k|	}
  342|       |
  343|   476k|	if (vips_worker_allocate(worker)) {
  ------------------
  |  Branch (343:6): [True: 0, False: 476k]
  ------------------
  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|   476k|	if (pool->stop) {
  ------------------
  |  Branch (352:6): [True: 212k, False: 263k]
  ------------------
  353|   212k|		worker->stop = TRUE;
  ------------------
  |  |  798|   212k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|   212k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  354|   212k|		g_mutex_unlock(pool->allocate_lock);
  355|   212k|		return;
  356|   212k|	}
  357|       |
  358|   263k|	g_mutex_unlock(pool->allocate_lock);
  359|       |
  360|   263k|	if (worker->state->stall &&
  ------------------
  |  Branch (360:6): [True: 0, False: 263k]
  ------------------
  361|   263k|		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|   263k|	if (pool->work(worker->state, pool->a)) {
  ------------------
  |  Branch (373:6): [True: 20.3k, False: 243k]
  ------------------
  374|  20.3k|		worker->stop = TRUE;
  ------------------
  |  |  798|  20.3k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  20.3k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  375|  20.3k|		pool->error = TRUE;
  ------------------
  |  |  798|  20.3k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  20.3k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  376|  20.3k|	}
  377|   263k|}
threadpool.c:vips_worker_allocate:
  289|   476k|{
  290|   476k|	VipsThreadpool *pool = worker->pool;
  291|       |
  292|   476k|	g_assert(!pool->stop);
  ------------------
  |  |  166|   476k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   476k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   476k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  293|       |
  294|   476k|	if (!worker->state &&
  ------------------
  |  Branch (294:6): [True: 233k, False: 243k]
  ------------------
  295|   476k|		!(worker->state = pool->start(pool->im, pool->a)))
  ------------------
  |  Branch (295:3): [True: 0, False: 233k]
  ------------------
  296|      0|		return -1;
  297|       |
  298|   476k|	if (pool->allocate(worker->state, pool->a, &pool->stop))
  ------------------
  |  Branch (298:6): [True: 0, False: 476k]
  ------------------
  299|      0|		return -1;
  300|       |
  301|   476k|	return 0;
  302|   476k|}
threadpool.c:vips_threadpool_free:
  488|   233k|{
  489|   233k|	VIPS_DEBUG_MSG("vips_threadpool_free: \"%s\" (%p)\n",
  ------------------
  |  |   47|   233k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   233k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   233k|	{ \
  |  |   49|   233k|		; \
  |  |   50|   233k|	} \
  |  |   51|   233k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   233k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  490|   233k|		pool->im->filename, pool);
  491|       |
  492|   233k|	vips_threadpool_wait(pool);
  493|       |
  494|   233k|	VIPS_FREEF(vips_g_mutex_free, pool->allocate_lock);
  ------------------
  |  |   41|   233k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   233k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   233k|	{ \
  |  |   43|   233k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 233k, False: 0]
  |  |  ------------------
  |  |   44|   233k|			(void) F((S)); \
  |  |   45|   233k|			(S) = 0; \
  |  |   46|   233k|		} \
  |  |   47|   233k|	} \
  |  |   48|   233k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   233k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  495|   233k|	vips_semaphore_destroy(&pool->n_workers);
  496|   233k|	vips_semaphore_destroy(&pool->tick);
  497|   233k|	VIPS_FREE(pool);
  ------------------
  |  |   50|   233k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|   233k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   233k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|   233k|	{ \
  |  |  |  |   43|   233k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 233k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|   233k|			(void) F((S)); \
  |  |  |  |   45|   233k|			(S) = 0; \
  |  |  |  |   46|   233k|		} \
  |  |  |  |   47|   233k|	} \
  |  |  |  |   48|   233k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   233k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  498|   233k|}
threadpool.c:vips_threadpool_wait:
  479|   466k|{
  480|       |	/* Wait for them all to exit.
  481|       |	 */
  482|   466k|	pool->stop = TRUE;
  ------------------
  |  |  798|   466k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|   466k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  483|   466k|	vips_semaphore_downn(&pool->n_workers, 0);
  484|   466k|}

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|   233k|{
  304|   233k|	VipsThreadExec *task;
  305|       |
  306|   233k|	g_async_queue_lock(set->queue);
  307|       |
  308|       |	/* Create a new thread if there are no waiting threads in the queue.
  309|       |	 */
  310|   233k|	if (g_async_queue_length_unlocked(set->queue) >= 0)
  ------------------
  |  Branch (310:6): [True: 8, False: 233k]
  ------------------
  311|      8|		if (!vips_threadset_add_thread(set)) {
  ------------------
  |  Branch (311:7): [True: 0, False: 8]
  ------------------
  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|   233k|	task = g_new0(VipsThreadExec, 1);
  ------------------
  |  |  299|   233k|#define g_new0(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc0)
  |  |  ------------------
  |  |  |  |  227|   233k|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|   233k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|   233k|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|   233k|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|   233k|	  gpointer __p;						\
  |  |  |  |  231|   233k|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 233k]
  |  |  |  |  ------------------
  |  |  |  |  232|   233k|	    __p = g_##func (__n);				\
  |  |  |  |  233|   233k|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 233k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|   233k|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 233k]
  |  |  |  |  |  Branch (234:26): [True: 233k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|   233k|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|   233k|	  else							\
  |  |  |  |  237|   233k|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|   233k|	  __p;							\
  |  |  |  |  239|   233k|	}))
  |  |  ------------------
  ------------------
  322|   233k|	task->domain = domain;
  323|   233k|	task->func = func;
  324|   233k|	task->data = data;
  325|       |
  326|   233k|	g_async_queue_push_unlocked(set->queue, task);
  327|   233k|	g_async_queue_unlock(set->queue);
  328|       |
  329|   233k|	return 0;
  330|   233k|}
threadset.c:vips_threadset_add_thread:
  212|      8|{
  213|      8|	gboolean reused = FALSE;
  ------------------
  |  |  794|      8|#define	FALSE	(0)
  ------------------
  214|       |
  215|       |	/* There are already sufficient threads running.
  216|       |	 */
  217|      8|	if (set->max_threads > 0 &&
  ------------------
  |  Branch (217:6): [True: 0, False: 8]
  ------------------
  218|      8|		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|      8|	if (set->n_idle_threads > 0) {
  ------------------
  |  Branch (221:6): [True: 6, False: 2]
  ------------------
  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|      8|	if (!reused) {
  ------------------
  |  Branch (228:6): [True: 2, False: 6]
  ------------------
  229|       |		/* No idle thread was found, we have to start a new one.
  230|       |		 */
  231|      2|		GThread *thread;
  232|       |
  233|      2|		if (!(thread = vips_g_thread_new("libvips worker",
  ------------------
  |  Branch (233:7): [True: 0, False: 2]
  ------------------
  234|      2|				  vips_threadset_work, set)))
  235|      0|			return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  236|       |
  237|       |		/* Ensure threads are freed on exit.
  238|       |		 */
  239|      2|		g_thread_unref(thread);
  240|       |
  241|      2|		set->n_threads++;
  242|      2|		set->n_threads_highwater =
  243|      2|			VIPS_MAX(set->n_threads_highwater, set->n_threads);
  ------------------
  |  |   54|      2|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 2]
  |  |  ------------------
  ------------------
  244|      2|	}
  245|       |
  246|      8|	return TRUE;
  ------------------
  |  |  798|      8|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      8|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  247|      8|}
threadset.c:vips_threadset_work:
  133|      2|{
  134|      2|	VipsThreadset *set = (VipsThreadset *) pointer;
  135|      2|	gboolean cleanup = FALSE;
  ------------------
  |  |  794|      2|#define	FALSE	(0)
  ------------------
  136|       |
  137|      2|	VIPS_DEBUG_MSG("vips_threadset_work: starting %p\n", g_thread_self());
  ------------------
  |  |   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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  138|       |
  139|      2|	g_async_queue_lock(set->queue);
  140|       |
  141|   233k|	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|   233k|		VipsThreadExec *task = set->max_threads > 0
  ------------------
  |  Branch (146:26): [True: 0, False: 233k]
  ------------------
  147|   233k|			? g_async_queue_pop_unlocked(set->queue)
  148|   233k|			: g_async_queue_timeout_pop_unlocked(set->queue,
  149|   233k|				  G_USEC_PER_SEC / 2);
  ------------------
  |  |   42|   233k|#define G_USEC_PER_SEC 1000000
  ------------------
  150|       |
  151|       |		/* Request to exit? Leave this thread.
  152|       |		 */
  153|   233k|		if (set->exit) {
  ------------------
  |  Branch (153:7): [True: 0, False: 233k]
  ------------------
  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|   233k|		if (task == NULL) {
  ------------------
  |  Branch (162:7): [True: 8, False: 233k]
  ------------------
  163|      8|			if (!vips_threadset_reuse_wait(set)) {
  ------------------
  |  Branch (163:8): [True: 0, False: 8]
  ------------------
  164|      0|				set->n_idle_threads--;
  165|      0|				break;
  166|      0|			}
  167|       |
  168|      8|			continue;
  169|      8|		}
  170|       |
  171|       |		/* A task was received and there was no request to exit.
  172|       |		 */
  173|   233k|		g_async_queue_unlock(set->queue);
  174|       |
  175|       |		/* If we're profiling, attach a prof struct to this thread.
  176|       |		 */
  177|   233k|		if (vips__thread_profile)
  ------------------
  |  Branch (177:7): [True: 0, False: 233k]
  ------------------
  178|      0|			vips__thread_profile_attach(task->domain);
  179|       |
  180|       |		/* Execute the task.
  181|       |		 */
  182|   233k|		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|   233k|		vips_thread_shutdown();
  188|   233k|		VIPS_FREE(task);
  ------------------
  |  |   50|   233k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|   233k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   233k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|   233k|	{ \
  |  |  |  |   43|   233k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 233k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|   233k|			(void) F((S)); \
  |  |  |  |   45|   233k|			(S) = 0; \
  |  |  |  |   46|   233k|		} \
  |  |  |  |   47|   233k|	} \
  |  |  |  |   48|   233k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   233k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  189|       |
  190|   233k|		g_async_queue_lock(set->queue);
  191|   233k|	}
  192|       |
  193|       |	/* Timed-out or exit has been requested, decrement number of threads.
  194|       |	 */
  195|      2|	set->n_threads--;
  196|      2|	VIPS_DEBUG_MSG(
  ------------------
  |  |   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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  197|      2|		"vips_threadset_work: stopping %p (%d remaining, %d idle)\n",
  198|      2|		g_thread_self(), set->n_threads, set->n_idle_threads);
  199|       |
  200|      2|	g_async_queue_unlock(set->queue);
  201|       |
  202|      2|	if (cleanup)
  ------------------
  |  Branch (202:6): [True: 0, False: 2]
  ------------------
  203|      0|		vips_threadset_free_internal(set);
  204|       |
  205|      2|	return NULL;
  206|      2|}
threadset.c:vips_threadset_reuse_wait:
  102|      8|{
  103|      8|	int result;
  104|       |
  105|       |	/* A superfluous thread? Leave this thread.
  106|       |	 */
  107|      8|	if (++set->n_idle_threads > max_idle_threads)
  ------------------
  |  Branch (107:6): [True: 0, False: 8]
  ------------------
  108|      0|		return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  109|       |
  110|      8|	g_async_queue_unlock(set->queue);
  111|       |
  112|       |	/* Wait for at least 15 seconds before leaving this thread.
  113|       |	 */
  114|      8|	result = vips_semaphore_down_timeout(&set->idle, max_idle_time);
  115|       |
  116|      8|	g_async_queue_lock(set->queue);
  117|       |
  118|      8|	return result != -1;
  119|      8|}

vips_area_copy:
  139|  7.34M|{
  140|  7.34M|	g_mutex_lock(area->lock);
  141|       |
  142|  7.34M|	g_assert(area->count > 0);
  ------------------
  |  |  166|  7.34M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  7.34M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  7.34M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  143|       |
  144|  7.34M|	area->count += 1;
  145|       |
  146|       |#ifdef DEBUG
  147|       |	printf("vips_area_copy: %p count = %d\n", area, area->count);
  148|       |#endif /*DEBUG*/
  149|       |
  150|  7.34M|	g_mutex_unlock(area->lock);
  151|       |
  152|  7.34M|	return area;
  153|  7.34M|}
vips_area_free_cb:
  157|   435k|{
  158|   435k|	g_free(mem);
  159|       |
  160|   435k|	return 0;
  161|   435k|}
vips_area_unref:
  177|  8.06M|{
  178|  8.06M|	g_mutex_lock(area->lock);
  179|       |
  180|  8.06M|	g_assert(area->count > 0);
  ------------------
  |  |  166|  8.06M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  8.06M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  8.06M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  181|       |
  182|  8.06M|	area->count -= 1;
  183|       |
  184|       |#ifdef DEBUG
  185|       |	printf("vips_area_unref: %p count = %d\n", area, area->count);
  186|       |#endif /*DEBUG*/
  187|       |
  188|  8.06M|	if (vips__leak) {
  ------------------
  |  Branch (188:6): [True: 0, False: 8.06M]
  ------------------
  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|  8.06M|	if (area->count == 0) {
  ------------------
  |  Branch (194:6): [True: 720k, False: 7.34M]
  ------------------
  195|   720k|		vips_area_free(area);
  196|       |
  197|   720k|		g_mutex_unlock(area->lock);
  198|       |
  199|   720k|		VIPS_FREEF(vips_g_mutex_free, area->lock);
  ------------------
  |  |   41|   720k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   720k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   720k|	{ \
  |  |   43|   720k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 720k, False: 0]
  |  |  ------------------
  |  |   44|   720k|			(void) F((S)); \
  |  |   45|   720k|			(S) = 0; \
  |  |   46|   720k|		} \
  |  |   47|   720k|	} \
  |  |   48|   720k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   720k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  200|       |
  201|   720k|		g_free(area);
  202|       |
  203|   720k|		if (vips__leak) {
  ------------------
  |  Branch (203:7): [True: 0, False: 720k]
  ------------------
  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|   720k|	}
  216|  7.34M|	else
  217|  7.34M|		g_mutex_unlock(area->lock);
  218|  8.06M|}
vips_area_new:
  254|   720k|{
  255|   720k|	VipsArea *area;
  256|       |
  257|   720k|	area = g_new(VipsArea, 1);
  ------------------
  |  |  282|   720k|#define g_new(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc)
  |  |  ------------------
  |  |  |  |  227|   720k|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|   720k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|   720k|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|   720k|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|   720k|	  gpointer __p;						\
  |  |  |  |  231|   720k|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 720k]
  |  |  |  |  ------------------
  |  |  |  |  232|   720k|	    __p = g_##func (__n);				\
  |  |  |  |  233|   720k|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 720k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|   720k|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 720k]
  |  |  |  |  |  Branch (234:26): [True: 720k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|   720k|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|   720k|	  else							\
  |  |  |  |  237|   720k|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|   720k|	  __p;							\
  |  |  |  |  239|   720k|	}))
  |  |  ------------------
  ------------------
  258|   720k|	area->count = 1;
  259|   720k|	area->lock = vips_g_mutex_new();
  260|   720k|	area->length = 0;
  261|   720k|	area->data = data;
  262|   720k|	area->free_fn = free_fn;
  263|   720k|	area->type = 0;
  264|   720k|	area->sizeof_type = 0;
  265|       |
  266|   720k|	if (vips__leak) {
  ------------------
  |  Branch (266:6): [True: 0, False: 720k]
  ------------------
  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|   720k|	return area;
  281|   720k|}
vips_area_new_array:
  323|   364k|{
  324|   364k|	VipsArea *area;
  325|   364k|	void *array;
  326|       |
  327|   364k|	array = g_malloc(n * sizeof_type);
  328|   364k|	area = vips_area_new((VipsCallbackFn) vips_area_free_cb, array);
  329|   364k|	area->n = n;
  330|   364k|	area->length = n * sizeof_type;
  331|   364k|	area->type = type;
  332|   364k|	area->sizeof_type = sizeof_type;
  333|       |
  334|   364k|	return area;
  335|   364k|}
vips_area_new_array_object:
  367|  82.8k|{
  368|  82.8k|	GObject **array;
  369|  82.8k|	VipsArea *area;
  370|       |
  371|  82.8k|	array = g_new0(GObject *, n + 1);
  ------------------
  |  |  299|  82.8k|#define g_new0(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc0)
  |  |  ------------------
  |  |  |  |  227|  82.8k|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|  82.8k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|  82.8k|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|  82.8k|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|  82.8k|	  gpointer __p;						\
  |  |  |  |  231|  82.8k|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 82.8k]
  |  |  |  |  ------------------
  |  |  |  |  232|  82.8k|	    __p = g_##func (__n);				\
  |  |  |  |  233|  82.8k|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 0, False: 82.8k]
  |  |  |  |  ------------------
  |  |  |  |  234|  82.8k|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 0]
  |  |  |  |  |  Branch (234:26): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|  82.8k|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|  82.8k|	  else							\
  |  |  |  |  237|  82.8k|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|  82.8k|	  __p;							\
  |  |  |  |  239|  82.8k|	}))
  |  |  ------------------
  ------------------
  372|  82.8k|	area = vips_area_new((VipsCallbackFn) vips_area_free_array_object,
  373|  82.8k|		array);
  374|  82.8k|	area->n = n;
  375|  82.8k|	area->length = n * sizeof(GObject *);
  376|  82.8k|	area->type = G_TYPE_OBJECT;
  ------------------
  |  |  178|  82.8k|#define G_TYPE_OBJECT			G_TYPE_MAKE_FUNDAMENTAL (20)
  |  |  ------------------
  |  |  |  |  221|  82.8k|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|  82.8k|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  377|  82.8k|	area->sizeof_type = sizeof(GObject *);
  378|       |
  379|  82.8k|	return area;
  380|  82.8k|}
vips_area_get_data:
  399|   564k|{
  400|   564k|	if (!area)
  ------------------
  |  Branch (400:6): [True: 0, False: 564k]
  ------------------
  401|      0|		return NULL;
  402|       |
  403|   564k|	if (length)
  ------------------
  |  Branch (403:6): [True: 176k, False: 387k]
  ------------------
  404|   176k|		*length = area->length;
  405|   564k|	if (n)
  ------------------
  |  Branch (405:6): [True: 0, False: 564k]
  ------------------
  406|      0|		*n = area->n;
  407|   564k|	if (type)
  ------------------
  |  Branch (407:6): [True: 0, False: 564k]
  ------------------
  408|      0|		*type = area->type;
  409|   564k|	if (sizeof_type)
  ------------------
  |  Branch (409:6): [True: 0, False: 564k]
  ------------------
  410|      0|		*sizeof_type = area->sizeof_type;
  411|       |
  412|   564k|	return area->data;
  413|   564k|}
vips_ref_string_new:
  577|  68.2k|{
  578|  68.2k|	VipsArea *area;
  579|       |
  580|  68.2k|	char *utf8_str = g_utf8_make_valid(str, -1);
  581|       |
  582|  68.2k|	area = vips_area_new((VipsCallbackFn) vips_area_free_cb, utf8_str);
  583|       |
  584|       |	/* Handy place to cache this.
  585|       |	 */
  586|  68.2k|	area->length = strlen(utf8_str);
  587|       |
  588|  68.2k|	return (VipsRefString *) area;
  589|  68.2k|}
vips_blob_new:
  653|   204k|{
  654|   204k|	VipsArea *area;
  655|       |
  656|   204k|	area = vips_area_new(free_fn, (void *) data);
  657|   204k|	area->length = length;
  658|       |
  659|   204k|	return (VipsBlob *) area;
  660|   204k|}
vips_blob_get:
  702|   175k|{
  703|   175k|	return vips_area_get_data(VIPS_AREA(blob),
  ------------------
  |  |  137|   175k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  704|   175k|		length, NULL, NULL, NULL);
  705|   175k|}
vips_array_int_new:
  824|  31.3k|{
  825|  31.3k|	VipsArea *area;
  826|  31.3k|	int *array_copy;
  827|       |
  828|  31.3k|	area = vips_area_new_array(G_TYPE_INT, sizeof(int), n);
  ------------------
  |  |   94|  31.3k|#define G_TYPE_INT			G_TYPE_MAKE_FUNDAMENTAL (6)
  |  |  ------------------
  |  |  |  |  221|  31.3k|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|  31.3k|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  829|  31.3k|	array_copy = vips_area_get_data(area, NULL, NULL, NULL, NULL);
  830|  31.3k|	memcpy(array_copy, array, n * sizeof(int));
  831|       |
  832|  31.3k|	return (VipsArrayInt *) area;
  833|  31.3k|}
vips_array_double_new:
 1069|   168k|{
 1070|   168k|	VipsArea *area;
 1071|   168k|	double *array_copy;
 1072|       |
 1073|   168k|	area = vips_area_new_array(G_TYPE_DOUBLE, sizeof(double), n);
  ------------------
  |  |  148|   168k|#define G_TYPE_DOUBLE			G_TYPE_MAKE_FUNDAMENTAL (15)
  |  |  ------------------
  |  |  |  |  221|   168k|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|   168k|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1074|   168k|	array_copy = vips_area_get_data(area, NULL, NULL, NULL, NULL);
 1075|   168k|	memcpy(array_copy, array, n * sizeof(double));
 1076|       |
 1077|   168k|	return (VipsArrayDouble *) area;
 1078|   168k|}
vips_array_double_newv:
 1094|   105k|{
 1095|   105k|	va_list ap;
 1096|   105k|	VipsArea *area;
 1097|   105k|	double *array;
 1098|   105k|	int i;
 1099|       |
 1100|   105k|	area = vips_area_new_array(G_TYPE_DOUBLE, sizeof(double), n);
  ------------------
  |  |  148|   105k|#define G_TYPE_DOUBLE			G_TYPE_MAKE_FUNDAMENTAL (15)
  |  |  ------------------
  |  |  |  |  221|   105k|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|   105k|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1101|   105k|	array = vips_area_get_data(area, NULL, NULL, NULL, NULL);
 1102|       |
 1103|   105k|	va_start(ap, n);
 1104|   210k|	for (i = 0; i < n; i++)
  ------------------
  |  Branch (1104:14): [True: 105k, False: 105k]
  ------------------
 1105|   105k|		array[i] = va_arg(ap, double);
 1106|   105k|	va_end(ap);
 1107|       |
 1108|   105k|	return (VipsArrayDouble *) area;
 1109|   105k|}
vips_array_image_new:
 1290|  82.8k|{
 1291|  82.8k|	VipsArea *area;
 1292|  82.8k|	VipsImage **array_copy;
 1293|  82.8k|	int i;
 1294|       |
 1295|  82.8k|	area = vips_area_new_array_object(n);
 1296|  82.8k|	area->type = VIPS_TYPE_IMAGE;
  ------------------
  |  |  169|  82.8k|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  ------------------
 1297|       |
 1298|  82.8k|	array_copy = vips_area_get_data(area, NULL, NULL, NULL, NULL);
 1299|   330k|	for (i = 0; i < n; i++) {
  ------------------
  |  Branch (1299:14): [True: 247k, False: 82.8k]
  ------------------
 1300|   247k|		array_copy[i] = (VipsImage *) array[i];
 1301|   247k|		g_object_ref(array_copy[i]);
 1302|   247k|	}
 1303|       |
 1304|  82.8k|	return (VipsArrayImage *) area;
 1305|  82.8k|}
vips_array_image_get:
 1462|  25.5k|{
 1463|  25.5k|	VipsArea *area = VIPS_AREA(array);
  ------------------
  |  |  137|  25.5k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
 1464|       |
 1465|  25.5k|	g_assert(area->type == VIPS_TYPE_IMAGE);
  ------------------
  |  |  166|  25.5k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  25.5k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  25.5k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1466|       |
 1467|  25.5k|	if (n)
  ------------------
  |  Branch (1467:6): [True: 25.5k, False: 0]
  ------------------
 1468|  25.5k|		*n = area->n;
 1469|       |
 1470|  25.5k|	return (VipsImage **) VIPS_ARRAY_ADDR(array, 0);
  ------------------
  |  |  127|  25.5k|	((void *) ((VipsPel *) VIPS_AREA(X)->data + \
  |  |  ------------------
  |  |  |  |  137|  25.5k|#define VIPS_AREA(X) ((VipsArea *) (X))
  |  |  ------------------
  |  |  128|  25.5k|		VIPS_AREA(X)->sizeof_type * (I)))
  |  |  ------------------
  |  |  |  |  137|  25.5k|#define VIPS_AREA(X) ((VipsArea *) (X))
  |  |  ------------------
  ------------------
 1471|  25.5k|}
vips_value_get_area:
 1536|  1.46k|{
 1537|  1.46k|	VipsArea *area;
 1538|       |
 1539|  1.46k|	area = g_value_get_boxed(value);
 1540|       |
 1541|  1.46k|	return vips_area_get_data(area, length, NULL, NULL, NULL);
 1542|  1.46k|}
vips_value_set_ref_string:
 1631|  68.2k|{
 1632|  68.2k|	VipsRefString *ref_str;
 1633|       |
 1634|  68.2k|	g_assert(G_VALUE_TYPE(value) == VIPS_TYPE_REF_STRING);
  ------------------
  |  |  166|  68.2k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  68.2k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  68.2k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1635|       |
 1636|  68.2k|	ref_str = vips_ref_string_new(str);
 1637|  68.2k|	g_value_set_boxed(value, ref_str);
 1638|  68.2k|	vips_area_unref(VIPS_AREA(ref_str));
  ------------------
  |  |  137|  68.2k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
 1639|  68.2k|}
vips_value_set_blob:
 1662|  2.68k|{
 1663|  2.68k|	VipsBlob *blob;
 1664|       |
 1665|  2.68k|	g_assert(G_VALUE_TYPE(value) == VIPS_TYPE_BLOB);
  ------------------
  |  |  166|  2.68k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.68k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.68k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1666|       |
 1667|  2.68k|	blob = vips_blob_new(free_fn, data, length);
 1668|  2.68k|	g_value_set_boxed(value, blob);
 1669|  2.68k|	vips_area_unref(VIPS_AREA(blob));
  ------------------
  |  |  137|  2.68k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
 1670|  2.68k|}
vips_value_get_blob:
 1717|  1.46k|{
 1718|  1.46k|	return vips_value_get_area(value, length);
 1719|  1.46k|}
vips_value_set_array:
 1735|  2.30k|{
 1736|  2.30k|	VipsArea *area;
 1737|       |
 1738|  2.30k|	area = vips_area_new_array(type, sizeof_type, n);
 1739|  2.30k|	g_value_set_boxed(value, area);
 1740|  2.30k|	vips_area_unref(area);
 1741|  2.30k|}
vips_value_get_array:
 1761|  2.30k|{
 1762|  2.30k|	VipsArea *area;
 1763|       |
 1764|       |	/* Can't check value type, because we may get called from
 1765|       |	 * vips_*_get_type().
 1766|       |	 */
 1767|       |
 1768|  2.30k|	if (!(area = g_value_get_boxed(value)))
  ------------------
  |  Branch (1768:6): [True: 0, False: 2.30k]
  ------------------
 1769|      0|		return NULL;
 1770|  2.30k|	if (n)
  ------------------
  |  Branch (1770:6): [True: 0, False: 2.30k]
  ------------------
 1771|      0|		*n = area->n;
 1772|  2.30k|	if (type)
  ------------------
  |  Branch (1772:6): [True: 0, False: 2.30k]
  ------------------
 1773|      0|		*type = area->type;
 1774|  2.30k|	if (sizeof_type)
  ------------------
  |  Branch (1774:6): [True: 0, False: 2.30k]
  ------------------
 1775|      0|		*sizeof_type = area->sizeof_type;
 1776|       |
 1777|  2.30k|	return area->data;
 1778|  2.30k|}
vips_value_get_array_int:
 1794|  1.47k|{
 1795|  1.47k|	return vips_value_get_array(value, n, NULL, NULL);
 1796|  1.47k|}
vips_value_set_array_int:
 1810|  1.47k|{
 1811|  1.47k|	vips_value_set_array(value, n, G_TYPE_INT, sizeof(int));
  ------------------
  |  |   94|  1.47k|#define G_TYPE_INT			G_TYPE_MAKE_FUNDAMENTAL (6)
  |  |  ------------------
  |  |  |  |  221|  1.47k|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|  1.47k|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1812|       |
 1813|  1.47k|	if (array) {
  ------------------
  |  Branch (1813:6): [True: 1.47k, False: 0]
  ------------------
 1814|  1.47k|		int *array_copy;
 1815|       |
 1816|  1.47k|		array_copy = vips_value_get_array_int(value, NULL);
 1817|  1.47k|		memcpy(array_copy, array, n * sizeof(int));
 1818|  1.47k|	}
 1819|  1.47k|}
vips_value_get_array_double:
 1835|    829|{
 1836|    829|	return vips_value_get_array(value, n, NULL, NULL);
 1837|    829|}
vips_value_set_array_double:
 1851|    829|{
 1852|    829|	vips_value_set_array(value, n, G_TYPE_DOUBLE, sizeof(double));
  ------------------
  |  |  148|    829|#define G_TYPE_DOUBLE			G_TYPE_MAKE_FUNDAMENTAL (15)
  |  |  ------------------
  |  |  |  |  221|    829|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|    829|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1853|       |
 1854|    829|	if (array) {
  ------------------
  |  Branch (1854:6): [True: 829, False: 0]
  ------------------
 1855|    829|		double *array_copy;
 1856|       |
 1857|    829|		array_copy = vips_value_get_array_double(value, NULL);
 1858|    829|		memcpy(array_copy, array, n * sizeof(double));
 1859|    829|	}
 1860|    829|}
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|   720k|{
  166|   720k|	if (area->free_fn &&
  ------------------
  |  Branch (166:6): [True: 518k, False: 202k]
  ------------------
  167|   720k|		area->data) {
  ------------------
  |  Branch (167:3): [True: 518k, False: 0]
  ------------------
  168|   518k|		area->free_fn(area->data, area);
  169|   518k|		area->free_fn = NULL;
  170|   518k|	}
  171|       |
  172|   720k|	area->data = NULL;
  173|   720k|}
type.c:vips_area_free_array_object:
  339|  82.8k|{
  340|  82.8k|	int i;
  341|       |
  342|   329k|	for (i = 0; i < area->n; i++)
  ------------------
  |  Branch (342:14): [True: 247k, False: 82.8k]
  ------------------
  343|   247k|		VIPS_FREEF(g_object_unref, array[i]);
  ------------------
  |  |   41|   247k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   247k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   247k|	{ \
  |  |   43|   247k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 247k, False: 0]
  |  |  ------------------
  |  |   44|   247k|			(void) F((S)); \
  |  |   45|   247k|			(S) = 0; \
  |  |   46|   247k|		} \
  |  |   47|   247k|	} \
  |  |   48|   247k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   247k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  344|  82.8k|	VIPS_FREE(array);
  ------------------
  |  |   50|  82.8k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  82.8k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  82.8k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  82.8k|	{ \
  |  |  |  |   43|  82.8k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 82.8k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  82.8k|			(void) F((S)); \
  |  |  |  |   45|  82.8k|			(S) = 0; \
  |  |  |  |   46|  82.8k|		} \
  |  |  |  |   47|  82.8k|	} \
  |  |  |  |   48|  82.8k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  82.8k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  345|       |
  346|  82.8k|	area->n = 0;
  347|       |
  348|  82.8k|	return 0;
  349|  82.8k|}

vips_slist_map2:
   94|  58.1M|{
   95|  58.1M|	GSList *copy;
   96|  58.1M|	GSList *i;
   97|  58.1M|	void *result;
   98|       |
   99|  58.1M|	copy = g_slist_copy(list);
  100|  58.1M|	result = NULL;
  101|   173M|	for (i = copy; i && !(result = fn(i->data, a, b)); i = i->next)
  ------------------
  |  Branch (101:17): [True: 115M, False: 58.1M]
  |  Branch (101:22): [True: 115M, False: 27.6k]
  ------------------
  102|   115M|		;
  103|  58.1M|	g_slist_free(copy);
  104|       |
  105|  58.1M|	return result;
  106|  58.1M|}
vips_isprefix:
  269|  34.1M|{
  270|  34.1M|	int i;
  271|       |
  272|  34.6M|	for (i = 0; a[i] && b[i]; i++)
  ------------------
  |  Branch (272:14): [True: 34.6M, False: 46.0k]
  |  Branch (272:22): [True: 18.0M, False: 16.5M]
  ------------------
  273|  18.0M|		if (a[i] != b[i])
  ------------------
  |  Branch (273:7): [True: 17.5M, False: 522k]
  ------------------
  274|  17.5M|			return FALSE;
  ------------------
  |  |  794|  17.5M|#define	FALSE	(0)
  ------------------
  275|       |
  276|       |	/* If there's stuff left in a but b has finished, we must have a
  277|       |	 * mismatch.
  278|       |	 */
  279|  16.6M|	if (a[i] && !b[i])
  ------------------
  |  Branch (279:6): [True: 16.5M, False: 46.0k]
  |  Branch (279:14): [True: 16.5M, False: 0]
  ------------------
  280|  16.5M|		return FALSE;
  ------------------
  |  |  794|  16.5M|#define	FALSE	(0)
  ------------------
  281|       |
  282|  46.0k|	return TRUE;
  ------------------
  |  |  798|  46.0k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  46.0k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  283|  16.6M|}
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__gslist_gvalue_merge:
  887|  2.96M|{
  888|  2.96M|	const GSList *i, *j;
  889|  2.96M|	GSList *tail;
  890|       |
  891|  2.96M|	tail = NULL;
  892|       |
  893|  2.96M|	for (i = b; i; i = i->next) {
  ------------------
  |  Branch (893:14): [True: 0, False: 2.96M]
  ------------------
  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|  2.96M|	a = g_slist_concat(a, g_slist_reverse(tail));
  918|       |
  919|  2.96M|	return a;
  920|  2.96M|}
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|   110k|{
 1157|   110k|	const char *q;
 1158|   110k|	int ch;
 1159|   110k|	int n;
 1160|       |
 1161|       |	/* string return defaults to "".
 1162|       |	 */
 1163|   110k|	if (size > 0)
  ------------------
  |  Branch (1163:6): [True: 110k, False: 0]
  ------------------
 1164|   110k|		string[0] = '\0';
 1165|       |
 1166|       |	/* Parse this token with p.
 1167|       |	 */
 1168|   110k|	if (!p)
  ------------------
  |  Branch (1168:6): [True: 0, False: 110k]
  ------------------
 1169|      0|		return NULL;
 1170|       |
 1171|       |	/* Skip initial whitespace.
 1172|       |	 */
 1173|   110k|	p += strspn(p, " \t\n\r");
 1174|   110k|	if (!p[0])
  ------------------
  |  Branch (1174:6): [True: 55.3k, False: 55.3k]
  ------------------
 1175|  55.3k|		return NULL;
 1176|       |
 1177|  55.3k|	switch ((ch = p[0])) {
 1178|  27.6k|	case '[':
  ------------------
  |  Branch (1178:2): [True: 27.6k, False: 27.6k]
  ------------------
 1179|  27.6k|		*token = VIPS_TOKEN_LEFT;
 1180|  27.6k|		p += 1;
 1181|  27.6k|		break;
 1182|       |
 1183|  27.6k|	case ']':
  ------------------
  |  Branch (1183:2): [True: 27.6k, False: 27.6k]
  ------------------
 1184|  27.6k|		*token = VIPS_TOKEN_RIGHT;
 1185|  27.6k|		p += 1;
 1186|  27.6k|		break;
 1187|       |
 1188|      0|	case '=':
  ------------------
  |  Branch (1188:2): [True: 0, False: 55.3k]
  ------------------
 1189|      0|		*token = VIPS_TOKEN_EQUALS;
 1190|      0|		p += 1;
 1191|      0|		break;
 1192|       |
 1193|      0|	case ',':
  ------------------
  |  Branch (1193:2): [True: 0, False: 55.3k]
  ------------------
 1194|      0|		*token = VIPS_TOKEN_COMMA;
 1195|      0|		p += 1;
 1196|      0|		break;
 1197|       |
 1198|      0|	case '"':
  ------------------
  |  Branch (1198:2): [True: 0, False: 55.3k]
  ------------------
 1199|      0|	case '\'':
  ------------------
  |  Branch (1199:2): [True: 0, False: 55.3k]
  ------------------
 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|      0|	default:
  ------------------
  |  Branch (1232:2): [True: 0, False: 55.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|      0|		*token = VIPS_TOKEN_STRING;
 1238|      0|		q = p + strcspn(p, "[]=,");
 1239|       |
 1240|      0|		n = VIPS_MIN(q - p, size);
  ------------------
  |  |   55|      0|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1241|      0|		g_strlcpy(string, p, n + 1);
 1242|      0|		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|      0|		if (n != size)
  ------------------
  |  Branch (1247:7): [True: 0, False: 0]
  ------------------
 1248|      0|			while (n > 0 && g_ascii_isspace(string[n - 1])) {
  ------------------
  |  |   81|      0|  ((g_ascii_table[(guchar) (c)] & G_ASCII_SPACE) != 0)
  |  |  ------------------
  |  |  |  Branch (81:3): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (1248:11): [True: 0, False: 0]
  ------------------
 1249|      0|				string[n - 1] = '\0';
 1250|      0|				n--;
 1251|      0|			}
 1252|       |
 1253|      0|		break;
 1254|  55.3k|	}
 1255|       |
 1256|  55.3k|	return p;
 1257|  55.3k|}
vips__token_must:
 1264|  55.3k|{
 1265|  55.3k|	if (!(p = vips__token_get(p, token, string, size))) {
  ------------------
  |  Branch (1265:6): [True: 0, False: 55.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|  55.3k|	return p;
 1272|  55.3k|}
vips__token_need:
 1279|  27.6k|{
 1280|  27.6k|	VipsToken token;
 1281|       |
 1282|  27.6k|	if (!(p = vips__token_must(p, &token, string, size)))
  ------------------
  |  Branch (1282:6): [True: 0, False: 27.6k]
  ------------------
 1283|      0|		return NULL;
 1284|  27.6k|	if (token != need_token) {
  ------------------
  |  Branch (1284:6): [True: 0, False: 27.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|  27.6k|	return p;
 1292|  27.6k|}
vips__token_segment:
 1302|  27.6k|{
 1303|  27.6k|	const char *q;
 1304|       |
 1305|  27.6k|	if (!(q = vips__token_must(p, token, string, size)))
  ------------------
  |  Branch (1305:6): [True: 0, False: 27.6k]
  ------------------
 1306|      0|		return NULL;
 1307|       |
 1308|       |	/* If we stopped on [, read up to the matching ].
 1309|       |	 */
 1310|  27.6k|	if (*token == VIPS_TOKEN_STRING &&
  ------------------
  |  Branch (1310:6): [True: 0, False: 27.6k]
  ------------------
 1311|  27.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|  27.6k|	return q;
 1342|  27.6k|}
vips_amiMSBfirst:
 1482|  2.76M|{
 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|  2.76M|}
vips_enum_nick:
 1644|  10.9k|{
 1645|  10.9k|	GEnumValue *value;
 1646|       |
 1647|  10.9k|	if (!(value = g_enum_get_value(g_type_class_ref(enm), v)))
  ------------------
  |  Branch (1647:6): [True: 0, False: 10.9k]
  ------------------
 1648|      0|		return "(null)";
 1649|       |
 1650|  10.9k|	return value->value_nick;
 1651|  10.9k|}
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|}
vips_vector_isenabled:
   99|  14.5k|{
  100|  14.5k|#ifdef HAVE_HWY
  101|  14.5k|	return vips__vector_enabled && vips_vector_get_supported_targets() != 0;
  ------------------
  |  Branch (101:9): [True: 14.5k, False: 0]
  |  Branch (101:33): [True: 14.5k, False: 0]
  ------------------
  102|       |#elif defined(HAVE_ORC)
  103|       |	return vips__vector_enabled;
  104|       |#else
  105|       |	return FALSE;
  106|       |#endif
  107|  14.5k|}
vips_vector_get_supported_targets:
  142|  14.5k|{
  143|  14.5k|#ifdef HAVE_HWY
  144|  14.5k|	return hwy::SupportedTargets() & ~(HWY_EMU128 | HWY_SCALAR);
  ------------------
  |  |  140|  14.5k|#define HWY_EMU128 (1LL << 61)
  ------------------
              	return hwy::SupportedTargets() & ~(HWY_EMU128 | HWY_SCALAR);
  ------------------
  |  |  142|  14.5k|#define HWY_SCALAR (1LL << 62)
  ------------------
  145|       |#elif defined(HAVE_ORC)
  146|       |	return orc_target_get_default_flags(orc_target_get_default());
  147|       |#else
  148|       |	return 0;
  149|       |#endif
  150|  14.5k|}

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|}

vips_reduce_get_points:
  114|  29.0k|{
  115|  29.0k|	switch (kernel) {
  116|      0|	case VIPS_KERNEL_NEAREST:
  ------------------
  |  Branch (116:2): [True: 0, False: 29.0k]
  ------------------
  117|      0|		return 1;
  118|       |
  119|      0|	case VIPS_KERNEL_LINEAR:
  ------------------
  |  Branch (119:2): [True: 0, False: 29.0k]
  ------------------
  120|      0|		return 2 * rint(shrink) + 1;
  121|       |
  122|      0|	case VIPS_KERNEL_CUBIC:
  ------------------
  |  Branch (122:2): [True: 0, False: 29.0k]
  ------------------
  123|      0|	case VIPS_KERNEL_MITCHELL:
  ------------------
  |  Branch (123:2): [True: 0, False: 29.0k]
  ------------------
  124|      0|		return 2 * rint(2 * shrink) + 1;
  125|       |
  126|      0|	case VIPS_KERNEL_LANCZOS2:
  ------------------
  |  Branch (126:2): [True: 0, False: 29.0k]
  ------------------
  127|      0|		return 2 * rint(2 * shrink) + 1;
  128|       |
  129|  29.0k|	case VIPS_KERNEL_LANCZOS3:
  ------------------
  |  Branch (129:2): [True: 29.0k, False: 0]
  ------------------
  130|  29.0k|		return 2 * rint(3 * shrink) + 1;
  131|       |
  132|      0|	case VIPS_KERNEL_MKS2013:
  ------------------
  |  Branch (132:2): [True: 0, False: 29.0k]
  ------------------
  133|      0|		return 2 * rint(3 * shrink) + 1;
  134|       |
  135|      0|	case VIPS_KERNEL_MKS2021:
  ------------------
  |  Branch (135:2): [True: 0, False: 29.0k]
  ------------------
  136|      0|		return 2 * rint(5 * shrink) + 1;
  137|       |
  138|      0|	default:
  ------------------
  |  Branch (138:2): [True: 0, False: 29.0k]
  ------------------
  139|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  140|      0|		return 0;
  141|  29.0k|	}
  142|  29.0k|}
vips_reduceh:
  637|  15.9k|{
  638|  15.9k|	va_list ap;
  639|  15.9k|	int result;
  640|       |
  641|  15.9k|	va_start(ap, hshrink);
  642|  15.9k|	result = vips_call_split("reduceh", ap, in, out, hshrink);
  643|  15.9k|	va_end(ap);
  644|       |
  645|  15.9k|	return result;
  646|  15.9k|}
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|}
reduceh.cpp:_ZL18vips_reduceh_buildP11_VipsObject:
  394|  15.9k|{
  395|  15.9k|	VipsObjectClass *object_class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  15.9k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  15.9k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  15.9k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  396|  15.9k|	VipsResample *resample = VIPS_RESAMPLE(object);
  ------------------
  |  |   40|  15.9k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  15.9k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  15.9k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  15.9k|		VIPS_TYPE_RESAMPLE, VipsResample))
  ------------------
  397|  15.9k|	VipsReduceh *reduceh = (VipsReduceh *) object;
  398|  15.9k|	VipsImage **t = (VipsImage **)
  399|  15.9k|		vips_object_local_array(object, 3);
  400|       |
  401|  15.9k|	VipsImage *in;
  402|  15.9k|	VipsGenerateFn generate;
  403|  15.9k|	int width;
  404|  15.9k|	int int_hshrink;
  405|  15.9k|	double extra_pixels;
  406|       |
  407|  15.9k|	if (VIPS_OBJECT_CLASS(vips_reduceh_parent_class)->build(object))
  ------------------
  |  |  435|  15.9k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  15.9k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  15.9k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (407:6): [True: 0, False: 15.9k]
  ------------------
  408|      0|		return -1;
  409|       |
  410|  15.9k|	in = resample->in;
  411|       |
  412|  15.9k|	if (reduceh->hshrink < 1.0) {
  ------------------
  |  Branch (412:6): [True: 0, False: 15.9k]
  ------------------
  413|      0|		vips_error(object_class->nickname,
  414|      0|			"%s", _("reduce factor should be >= 1.0"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  415|      0|		return -1;
  416|      0|	}
  417|       |
  418|       |	/* Output size. We need to always round to nearest, so round(), not
  419|       |	 * rint().
  420|       |	 */
  421|  15.9k|	width = VIPS_ROUND_UINT(
  ------------------
  |  |  106|  15.9k|#define VIPS_ROUND_UINT(R) ((int) ((R) + 0.5))
  ------------------
  422|  15.9k|		(double) in->Xsize / reduceh->hshrink);
  423|       |
  424|       |	/* How many pixels we are inventing in the input, -ve for
  425|       |	 * discarding.
  426|       |	 */
  427|  15.9k|	extra_pixels = width * reduceh->hshrink - in->Xsize;
  428|       |
  429|       |	/* The hshrink we do after integer reduction.
  430|       |	 */
  431|  15.9k|	reduceh->residual_hshrink = reduceh->hshrink;
  432|       |
  433|  15.9k|	if (reduceh->gap > 0.0 &&
  ------------------
  |  Branch (433:6): [True: 15.9k, False: 0]
  ------------------
  434|  15.9k|		reduceh->kernel != VIPS_KERNEL_NEAREST) {
  ------------------
  |  Branch (434:3): [True: 15.9k, False: 0]
  ------------------
  435|  15.9k|		if (reduceh->gap < 1.0) {
  ------------------
  |  Branch (435:7): [True: 0, False: 15.9k]
  ------------------
  436|      0|			vips_error(object_class->nickname,
  437|      0|				"%s", _("reduce gap should be >= 1.0"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  438|      0|			return -1;
  439|      0|		}
  440|       |
  441|       |		/* The int part of our reduce.
  442|       |		 */
  443|  15.9k|		int_hshrink = VIPS_MAX(1,
  ------------------
  |  |   54|  15.9k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 6.46k, False: 9.52k]
  |  |  ------------------
  ------------------
  444|  15.9k|			VIPS_FLOOR((double) in->Xsize / width / reduceh->gap));
  445|       |
  446|  15.9k|		if (int_hshrink > 1) {
  ------------------
  |  Branch (446:7): [True: 0, False: 15.9k]
  ------------------
  447|      0|			g_info("shrinkh by %d", int_hshrink);
  ------------------
  |  |  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__)
  ------------------
  448|      0|			if (vips_shrinkh(in, &t[0], int_hshrink,
  ------------------
  |  Branch (448:8): [True: 0, False: 0]
  ------------------
  449|      0|					"ceil", TRUE,
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  450|      0|					nullptr))
  451|      0|				return -1;
  452|      0|			in = t[0];
  453|       |
  454|      0|			reduceh->residual_hshrink /= int_hshrink;
  455|      0|			extra_pixels /= int_hshrink;
  456|      0|		}
  457|  15.9k|	}
  458|       |
  459|  15.9k|	if (reduceh->residual_hshrink == 1.0)
  ------------------
  |  Branch (459:6): [True: 0, False: 15.9k]
  ------------------
  460|      0|		return vips_image_write(in, resample->out);
  461|       |
  462|  15.9k|	reduceh->n_point =
  463|  15.9k|		vips_reduce_get_points(reduceh->kernel, reduceh->residual_hshrink);
  464|  15.9k|	g_info("reduceh: %d point mask", reduceh->n_point);
  ------------------
  |  |  341|  15.9k|#define g_info(...)     g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|  15.9k|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  342|  15.9k|                               G_LOG_LEVEL_INFO,     \
  |  |  343|  15.9k|                               __VA_ARGS__)
  ------------------
  465|  15.9k|	if (reduceh->n_point > MAX_POINT) {
  ------------------
  |  |   70|  15.9k|#define MAX_POINT (2000)
  ------------------
  |  Branch (465:6): [True: 0, False: 15.9k]
  ------------------
  466|      0|		vips_error(object_class->nickname,
  467|      0|			"%s", _("reduce factor too large"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  468|      0|		return -1;
  469|      0|	}
  470|       |
  471|       |	/* If we are rounding down, we are not using some input
  472|       |	 * pixels. We need to move the origin *inside* the input image
  473|       |	 * by half that distance so that we discard pixels equally
  474|       |	 * from left and right.
  475|       |	 */
  476|  15.9k|	reduceh->hoffset = (1 + extra_pixels) / 2.0 - 1;
  477|       |
  478|       |	/* Build the tables of pre-computed coefficients.
  479|       |	 */
  480|  1.05M|	for (int x = 0; x < VIPS_TRANSFORM_SCALE + 1; x++) {
  ------------------
  |  |  112|  1.05M|#define VIPS_TRANSFORM_SCALE (1 << VIPS_TRANSFORM_SHIFT)
  |  |  ------------------
  |  |  |  |  111|  1.05M|#define VIPS_TRANSFORM_SHIFT (6)
  |  |  ------------------
  ------------------
  |  Branch (480:18): [True: 1.03M, False: 15.9k]
  ------------------
  481|  1.03M|		reduceh->matrixf[x] =
  482|  1.03M|			VIPS_ARRAY(object, reduceh->n_point, double);
  ------------------
  |  |   72|  1.03M|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  1.03M|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  1.03M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  1.03M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  1.03M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  483|  1.03M|		reduceh->matrixs[x] =
  484|  1.03M|			VIPS_ARRAY(object, reduceh->n_point, short);
  ------------------
  |  |   72|  1.03M|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  1.03M|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  1.03M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  1.03M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  1.03M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  485|  1.03M|		if (!reduceh->matrixf[x] ||
  ------------------
  |  Branch (485:7): [True: 0, False: 1.03M]
  ------------------
  486|  1.03M|			!reduceh->matrixs[x])
  ------------------
  |  Branch (486:4): [True: 0, False: 1.03M]
  ------------------
  487|      0|			return -1;
  488|       |
  489|  1.03M|		vips_reduce_make_mask(reduceh->matrixf[x], reduceh->kernel,
  490|  1.03M|			reduceh->n_point, reduceh->residual_hshrink,
  491|  1.03M|			(float) x / VIPS_TRANSFORM_SCALE);
  ------------------
  |  |  112|  1.03M|#define VIPS_TRANSFORM_SCALE (1 << VIPS_TRANSFORM_SHIFT)
  |  |  ------------------
  |  |  |  |  111|  1.03M|#define VIPS_TRANSFORM_SHIFT (6)
  |  |  ------------------
  ------------------
  492|       |
  493|  16.1M|		for (int i = 0; i < reduceh->n_point; i++)
  ------------------
  |  Branch (493:19): [True: 15.1M, False: 1.03M]
  ------------------
  494|  15.1M|			reduceh->matrixs[x][i] = (short) (reduceh->matrixf[x][i] *
  495|  15.1M|				VIPS_INTERPOLATE_SCALE);
  ------------------
  |  |  120|  15.1M|#define VIPS_INTERPOLATE_SCALE (1 << VIPS_INTERPOLATE_SHIFT)
  |  |  ------------------
  |  |  |  |  119|  15.1M|#define VIPS_INTERPOLATE_SHIFT (12)
  |  |  ------------------
  ------------------
  496|       |#ifdef DEBUG
  497|       |		printf("vips_reduceh_build: mask %d\n    ", x);
  498|       |		for (int i = 0; i < reduceh->n_point; i++)
  499|       |			printf("%d ", reduceh->matrixs[x][i]);
  500|       |		printf("\n");
  501|       |#endif /*DEBUG*/
  502|  1.03M|	}
  503|       |
  504|       |	/* Unpack for processing.
  505|       |	 */
  506|  15.9k|	if (vips_image_decode(in, &t[1]))
  ------------------
  |  Branch (506:6): [True: 0, False: 15.9k]
  ------------------
  507|      0|		return -1;
  508|  15.9k|	in = t[1];
  509|       |
  510|       |	/* Add new pixels around the input so we can interpolate at the edges.
  511|       |	 */
  512|  15.9k|	if (vips_embed(in, &t[2],
  ------------------
  |  Branch (512:6): [True: 0, False: 15.9k]
  ------------------
  513|  15.9k|			VIPS_CEIL(reduceh->n_point / 2.0) - 1, 0,
  ------------------
  |  |   73|  15.9k|#define VIPS_CEIL(V) __builtin_ceil(V)
  ------------------
  514|  15.9k|			in->Xsize + reduceh->n_point, in->Ysize,
  515|  15.9k|			"extend", VIPS_EXTEND_COPY,
  516|  15.9k|			nullptr))
  517|      0|		return -1;
  518|  15.9k|	in = t[2];
  519|       |
  520|       |	/* For uchar input, try to make a vector path.
  521|       |	 */
  522|  15.9k|#ifdef HAVE_HWY
  523|  15.9k|	if (in->BandFmt == VIPS_FORMAT_UCHAR &&
  ------------------
  |  Branch (523:6): [True: 9.82k, False: 6.15k]
  ------------------
  524|  15.9k|		(in->Bands == 4 || in->Bands == 3) &&
  ------------------
  |  Branch (524:4): [True: 806, False: 9.02k]
  |  Branch (524:22): [True: 5.20k, False: 3.81k]
  ------------------
  525|  15.9k|		vips_vector_isenabled()) {
  ------------------
  |  Branch (525:3): [True: 6.01k, False: 0]
  ------------------
  526|  6.01k|		generate = vips_reduceh_uchar_vector_gen;
  527|  6.01k|		g_info("reduceh: using vector path");
  ------------------
  |  |  341|  6.01k|#define g_info(...)     g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|  6.01k|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  342|  6.01k|                               G_LOG_LEVEL_INFO,     \
  |  |  343|  6.01k|                               __VA_ARGS__)
  ------------------
  528|  6.01k|	}
  529|  9.96k|	else
  530|  9.96k|#endif /*HAVE_HWY*/
  531|       |		/* Default to the C path.
  532|       |		 */
  533|  9.96k|		generate = vips_reduceh_gen;
  534|       |
  535|  15.9k|	if (vips_image_pipelinev(resample->out,
  ------------------
  |  Branch (535:6): [True: 0, False: 15.9k]
  ------------------
  536|  15.9k|			VIPS_DEMAND_STYLE_FATSTRIP, in, nullptr))
  537|      0|		return -1;
  538|       |
  539|       |	/* Don't change xres/yres, leave that to the application layer. For
  540|       |	 * example, vipsthumbnail knows the true reduce factor (including the
  541|       |	 * fractional part), we just see the integer part here.
  542|       |	 */
  543|  15.9k|	resample->out->Xsize = width;
  544|  15.9k|	if (resample->out->Xsize <= 0) {
  ------------------
  |  Branch (544:6): [True: 0, False: 15.9k]
  ------------------
  545|      0|		vips_error(object_class->nickname,
  546|      0|			"%s", _("image has shrunk to nothing"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  547|      0|		return -1;
  548|      0|	}
  549|       |
  550|       |#ifdef DEBUG
  551|       |	printf("vips_reduceh_build: reducing %d x %d image to %d x %d\n",
  552|       |		in->Xsize, in->Ysize,
  553|       |		resample->out->Xsize, resample->out->Ysize);
  554|       |#endif /*DEBUG*/
  555|       |
  556|  15.9k|	if (vips_image_generate(resample->out,
  ------------------
  |  Branch (556:6): [True: 0, False: 15.9k]
  ------------------
  557|  15.9k|			vips_start_one, generate, vips_stop_one,
  558|  15.9k|			in, reduceh))
  559|      0|		return -1;
  560|       |
  561|  15.9k|	vips_reorder_margin_hint(resample->out, reduceh->n_point);
  562|       |
  563|  15.9k|	return 0;
  564|  15.9k|}
reduceh.cpp:_ZL29vips_reduceh_uchar_vector_genP11_VipsRegionPvS1_S1_Pi:
  342|  6.01k|{
  343|  6.01k|	VipsImage *in = (VipsImage *) a;
  344|  6.01k|	VipsReduceh *reduceh = (VipsReduceh *) b;
  345|  6.01k|	const int ps = VIPS_IMAGE_SIZEOF_PEL(in);
  ------------------
  |  |  384|  6.01k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|  6.01k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  346|  6.01k|	VipsRegion *ir = (VipsRegion *) seq;
  347|  6.01k|	VipsRect *r = &out_region->valid;
  348|  6.01k|	const int bands = in->Bands;
  349|       |
  350|  6.01k|	VipsRect s;
  351|       |
  352|       |#ifdef DEBUG
  353|       |	printf("vips_reduceh_uchar_vector_gen: generating %d x %d at %d x %d\n",
  354|       |		r->width, r->height, r->left, r->top);
  355|       |#endif /*DEBUG*/
  356|       |
  357|  6.01k|	s.left = r->left * reduceh->residual_hshrink - reduceh->hoffset;
  358|  6.01k|	s.top = r->top;
  359|  6.01k|	s.width = r->width * reduceh->residual_hshrink + reduceh->n_point;
  360|  6.01k|	s.height = r->height;
  361|  6.01k|	if (vips_region_prepare(ir, &s))
  ------------------
  |  Branch (361:6): [True: 4.88k, False: 1.13k]
  ------------------
  362|  4.88k|		return -1;
  363|       |
  364|  6.01k|	VIPS_GATE_START("vips_reduceh_uchar_vector_gen: work");
  ------------------
  |  |   41|  1.13k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.13k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  1.13k|	{ \
  |  |   43|  1.13k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 1.13k]
  |  |  ------------------
  |  |   44|  1.13k|			vips__thread_gate_start(NAME); \
  |  |   45|  1.13k|	} \
  |  |   46|  6.01k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  6.01k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  365|       |
  366|  37.3k|	for (int y = 0; y < r->height; y++) {
  ------------------
  |  Branch (366:18): [True: 36.2k, False: 1.13k]
  ------------------
  367|  36.2k|		VipsPel *p0;
  368|  36.2k|		VipsPel *q;
  369|       |
  370|  36.2k|		double X;
  371|       |
  372|  36.2k|		q = VIPS_REGION_ADDR(out_region, r->left, r->top + y);
  ------------------
  |  |  227|  36.2k|	((R)->data + \
  |  |  228|  36.2k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  36.2k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  36.2k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  36.2k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  36.2k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  36.2k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  373|       |
  374|  36.2k|		X = (r->left + 0.5) * reduceh->residual_hshrink - 0.5 -
  375|  36.2k|			reduceh->hoffset;
  376|       |
  377|  36.2k|		p0 = VIPS_REGION_ADDR(ir, ir->valid.left, r->top + y) -
  ------------------
  |  |  227|  36.2k|	((R)->data + \
  |  |  228|  36.2k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  36.2k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  36.2k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  36.2k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  36.2k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  36.2k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  378|  36.2k|			ir->valid.left * ps;
  379|       |
  380|  36.2k|		vips_reduceh_uchar_hwy(q, p0, reduceh->n_point, r->width,
  381|  36.2k|			bands, reduceh->matrixs, X, reduceh->residual_hshrink);
  382|  36.2k|	}
  383|       |
  384|  1.13k|	VIPS_GATE_STOP("vips_reduceh_uchar_vector_gen: work");
  ------------------
  |  |   49|  1.13k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.13k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  1.13k|	{ \
  |  |   51|  1.13k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 1.13k]
  |  |  ------------------
  |  |   52|  1.13k|			vips__thread_gate_stop(NAME); \
  |  |   53|  1.13k|	} \
  |  |   54|  1.13k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.13k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  385|       |
  386|  1.13k|	VIPS_COUNT_PIXELS(out_region, "vips_reduceh_uchar_vector_gen");
  ------------------
  |  |  189|  1.13k|#define VIPS_COUNT_PIXELS(R, N) vips__region_count_pixels(R, N)
  ------------------
  387|       |
  388|  1.13k|	return 0;
  389|  6.01k|}
reduceh.cpp:_ZL16vips_reduceh_genP11_VipsRegionPvS1_S1_Pi:
  218|  9.96k|{
  219|  9.96k|	VipsImage *in = (VipsImage *) a;
  220|  9.96k|	VipsReduceh *reduceh = (VipsReduceh *) b;
  221|  9.96k|	const int ps = VIPS_IMAGE_SIZEOF_PEL(in);
  ------------------
  |  |  384|  9.96k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|  9.96k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  222|  9.96k|	VipsRegion *ir = (VipsRegion *) seq;
  223|  9.96k|	VipsRect *r = &out_region->valid;
  224|       |
  225|       |	/* Double bands for complex.
  226|       |	 */
  227|  9.96k|	const int bands = in->Bands *
  228|  9.96k|		(vips_band_format_iscomplex(in->BandFmt) ? 2 : 1);
  ------------------
  |  Branch (228:4): [True: 0, False: 9.96k]
  ------------------
  229|       |
  230|  9.96k|	VipsRect s;
  231|       |
  232|       |#ifdef DEBUG
  233|       |	printf("vips_reduceh_gen: generating %d x %d at %d x %d\n",
  234|       |		r->width, r->height, r->left, r->top);
  235|       |#endif /*DEBUG*/
  236|       |
  237|  9.96k|	s.left = r->left * reduceh->residual_hshrink - reduceh->hoffset;
  238|  9.96k|	s.top = r->top;
  239|  9.96k|	s.width = r->width * reduceh->residual_hshrink + reduceh->n_point;
  240|  9.96k|	s.height = r->height;
  241|  9.96k|	if (vips_region_prepare(ir, &s))
  ------------------
  |  Branch (241:6): [True: 4.04k, False: 5.91k]
  ------------------
  242|  4.04k|		return -1;
  243|       |
  244|  9.96k|	VIPS_GATE_START("vips_reduceh_gen: work");
  ------------------
  |  |   41|  5.91k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  5.91k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  5.91k|	{ \
  |  |   43|  5.91k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 5.91k]
  |  |  ------------------
  |  |   44|  5.91k|			vips__thread_gate_start(NAME); \
  |  |   45|  5.91k|	} \
  |  |   46|  9.96k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  9.96k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  245|       |
  246|   195k|	for (int y = 0; y < r->height; y++) {
  ------------------
  |  Branch (246:18): [True: 189k, False: 5.91k]
  ------------------
  247|   189k|		VipsPel *p0;
  248|   189k|		VipsPel *q;
  249|       |
  250|   189k|		double X;
  251|       |
  252|   189k|		q = VIPS_REGION_ADDR(out_region, r->left, r->top + y);
  ------------------
  |  |  227|   189k|	((R)->data + \
  |  |  228|   189k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   189k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   189k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   189k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   189k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   189k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  253|       |
  254|   189k|		X = (r->left + 0.5) * reduceh->residual_hshrink - 0.5 -
  255|   189k|			reduceh->hoffset;
  256|       |
  257|       |		/* We want p0 to be the start (ie. x == 0) of the input
  258|       |		 * scanline we are reading from. We can then calculate the p we
  259|       |		 * need for each pixel with a single mul and avoid calling ADDR
  260|       |		 * for each pixel.
  261|       |		 *
  262|       |		 * We can't get p0 directly with ADDR since it could be outside
  263|       |		 * valid, so get the leftmost pixel in valid and subtract a
  264|       |		 * bit.
  265|       |		 */
  266|   189k|		p0 = VIPS_REGION_ADDR(ir, ir->valid.left, r->top + y) -
  ------------------
  |  |  227|   189k|	((R)->data + \
  |  |  228|   189k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   189k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   189k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   189k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   189k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   189k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  267|   189k|			ir->valid.left * ps;
  268|       |
  269|  6.24M|		for (int x = 0; x < r->width; x++) {
  ------------------
  |  Branch (269:19): [True: 6.05M, False: 189k]
  ------------------
  270|  6.05M|			const int ix = (int) X;
  271|  6.05M|			VipsPel *p = p0 + ix * ps;
  272|  6.05M|			const int sx = X * VIPS_TRANSFORM_SCALE * 2;
  ------------------
  |  |  112|  6.05M|#define VIPS_TRANSFORM_SCALE (1 << VIPS_TRANSFORM_SHIFT)
  |  |  ------------------
  |  |  |  |  111|  6.05M|#define VIPS_TRANSFORM_SHIFT (6)
  |  |  ------------------
  ------------------
  273|  6.05M|			const int six = sx & (VIPS_TRANSFORM_SCALE * 2 - 1);
  ------------------
  |  |  112|  6.05M|#define VIPS_TRANSFORM_SCALE (1 << VIPS_TRANSFORM_SHIFT)
  |  |  ------------------
  |  |  |  |  111|  6.05M|#define VIPS_TRANSFORM_SHIFT (6)
  |  |  ------------------
  ------------------
  274|  6.05M|			const int tx = (six + 1) >> 1;
  275|  6.05M|			const short *cxs = reduceh->matrixs[tx];
  276|  6.05M|			const double *cxf = reduceh->matrixf[tx];
  277|       |
  278|  6.05M|			switch (in->BandFmt) {
  279|  3.04M|			case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (279:4): [True: 3.04M, False: 3.00M]
  ------------------
  280|  3.04M|				reduceh_unsigned_int_tab<unsigned char,
  281|  3.04M|					UCHAR_MAX>(reduceh, q, p, bands, cxs);
  282|  3.04M|				break;
  283|       |
  284|   122k|			case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (284:4): [True: 122k, False: 5.93M]
  ------------------
  285|   122k|				reduceh_signed_int_tab<signed char,
  286|   122k|					SCHAR_MIN, SCHAR_MAX>(reduceh, q, p, bands, cxs);
  287|   122k|				break;
  288|       |
  289|   279k|			case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (289:4): [True: 279k, False: 5.77M]
  ------------------
  290|   279k|				reduceh_unsigned_int_tab<unsigned short,
  291|   279k|					USHRT_MAX>(reduceh, q, p, bands, cxs);
  292|   279k|				break;
  293|       |
  294|   124k|			case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (294:4): [True: 124k, False: 5.93M]
  ------------------
  295|   124k|				reduceh_signed_int_tab<signed short,
  296|   124k|					SHRT_MIN, SHRT_MAX>(reduceh, q, p, bands, cxs);
  297|   124k|				break;
  298|       |
  299|   236k|			case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (299:4): [True: 236k, False: 5.82M]
  ------------------
  300|   236k|				reduceh_unsigned_int_tab<unsigned int,
  301|   236k|					UINT_MAX>(reduceh, q, p, bands, cxs);
  302|   236k|				break;
  303|       |
  304|  94.2k|			case VIPS_FORMAT_INT:
  ------------------
  |  Branch (304:4): [True: 94.2k, False: 5.96M]
  ------------------
  305|  94.2k|				reduceh_signed_int_tab<signed int,
  306|  94.2k|					INT_MIN, INT_MAX>(reduceh, q, p, bands, cxs);
  307|  94.2k|				break;
  308|       |
  309|  2.15M|			case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (309:4): [True: 2.15M, False: 3.90M]
  ------------------
  310|  2.15M|			case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (310:4): [True: 0, False: 6.05M]
  ------------------
  311|  2.15M|				reduceh_float_tab<float>(reduceh,
  312|  2.15M|					q, p, bands, cxf);
  313|  2.15M|				break;
  314|       |
  315|      0|			case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (315:4): [True: 0, False: 6.05M]
  ------------------
  316|      0|			case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (316:4): [True: 0, False: 6.05M]
  ------------------
  317|      0|				reduceh_notab<double>(reduceh,
  318|      0|					q, p, bands, X - ix);
  319|      0|				break;
  320|       |
  321|      0|			default:
  ------------------
  |  Branch (321:4): [True: 0, False: 6.05M]
  ------------------
  322|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  323|      0|				break;
  324|  6.05M|			}
  325|       |
  326|  6.05M|			X += reduceh->residual_hshrink;
  327|  6.05M|			q += ps;
  328|  6.05M|		}
  329|   189k|	}
  330|       |
  331|  5.91k|	VIPS_GATE_STOP("vips_reduceh_gen: work");
  ------------------
  |  |   49|  5.91k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  5.91k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  5.91k|	{ \
  |  |   51|  5.91k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 5.91k]
  |  |  ------------------
  |  |   52|  5.91k|			vips__thread_gate_stop(NAME); \
  |  |   53|  5.91k|	} \
  |  |   54|  5.91k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  5.91k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  332|       |
  333|  5.91k|	VIPS_COUNT_PIXELS(out_region, "vips_reduceh_gen");
  ------------------
  |  |  189|  5.91k|#define VIPS_COUNT_PIXELS(R, N) vips__region_count_pixels(R, N)
  ------------------
  334|       |
  335|  5.91k|	return 0;
  336|  5.91k|}
reduceh.cpp:_ZL24reduceh_unsigned_int_tabIhTnT_Lh255EEvP12_VipsReducehPhPKhiPKs:
  148|  3.04M|{
  149|  3.04M|	T *restrict out = (T *) pout;
  150|  3.04M|	const T *restrict in = (T *) pin;
  151|  3.04M|	const int n = reduceh->n_point;
  152|       |
  153|  6.22M|	for (int z = 0; z < bands; z++) {
  ------------------
  |  Branch (153:18): [True: 3.17M, False: 3.04M]
  ------------------
  154|  3.17M|		typename LongT<T>::type sum;
  155|       |
  156|  3.17M|		sum = reduce_sum<T>(in + z, bands, cx, n);
  157|  3.17M|		sum = unsigned_fixed_round(sum);
  158|  3.17M|		out[z] = VIPS_CLIP(0, sum, max_value);
  ------------------
  |  |   57|  3.17M|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|  6.34M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 53.7k, False: 3.11M]
  |  |  |  |  |  Branch (54:32): [True: 75.4k, False: 3.09M]
  |  |  |  |  |  Branch (54:44): [True: 75.4k, False: 3.04M]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  159|  3.17M|	}
  160|  3.04M|}
reduceh.cpp:_ZL22reduceh_signed_int_tabIaLin128ELi127EEvP12_VipsReducehPhPKhiPKs:
  166|   122k|{
  167|   122k|	T *restrict out = (T *) pout;
  168|   122k|	const T *restrict in = (T *) pin;
  169|   122k|	const int n = reduceh->n_point;
  170|       |
  171|   491k|	for (int z = 0; z < bands; z++) {
  ------------------
  |  Branch (171:18): [True: 368k, False: 122k]
  ------------------
  172|   368k|		typename LongT<T>::type sum;
  173|       |
  174|   368k|		sum = reduce_sum<T>(in + z, bands, cx, n);
  175|   368k|		sum = signed_fixed_round(sum);
  176|   368k|		out[z] = VIPS_CLIP(min_value, sum, max_value);
  ------------------
  |  |   57|   368k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|   737k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 1.05k, False: 367k]
  |  |  |  |  |  Branch (54:32): [True: 8.93k, False: 359k]
  |  |  |  |  |  Branch (54:44): [True: 8.93k, False: 358k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  177|   368k|	}
  178|   122k|}
reduceh.cpp:_ZL24reduceh_unsigned_int_tabItTnT_Lt65535EEvP12_VipsReducehPhPKhiPKs:
  148|   279k|{
  149|   279k|	T *restrict out = (T *) pout;
  150|   279k|	const T *restrict in = (T *) pin;
  151|   279k|	const int n = reduceh->n_point;
  152|       |
  153|   952k|	for (int z = 0; z < bands; z++) {
  ------------------
  |  Branch (153:18): [True: 672k, False: 279k]
  ------------------
  154|   672k|		typename LongT<T>::type sum;
  155|       |
  156|   672k|		sum = reduce_sum<T>(in + z, bands, cx, n);
  157|   672k|		sum = unsigned_fixed_round(sum);
  158|   672k|		out[z] = VIPS_CLIP(0, sum, max_value);
  ------------------
  |  |   57|   672k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|  1.34M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 37.1k, False: 635k]
  |  |  |  |  |  Branch (54:32): [True: 4.41k, False: 668k]
  |  |  |  |  |  Branch (54:44): [True: 4.41k, False: 631k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  159|   672k|	}
  160|   279k|}
reduceh.cpp:_ZL22reduceh_signed_int_tabIsLin32768ELi32767EEvP12_VipsReducehPhPKhiPKs:
  166|   124k|{
  167|   124k|	T *restrict out = (T *) pout;
  168|   124k|	const T *restrict in = (T *) pin;
  169|   124k|	const int n = reduceh->n_point;
  170|       |
  171|   329k|	for (int z = 0; z < bands; z++) {
  ------------------
  |  Branch (171:18): [True: 204k, False: 124k]
  ------------------
  172|   204k|		typename LongT<T>::type sum;
  173|       |
  174|   204k|		sum = reduce_sum<T>(in + z, bands, cx, n);
  175|   204k|		sum = signed_fixed_round(sum);
  176|   204k|		out[z] = VIPS_CLIP(min_value, sum, max_value);
  ------------------
  |  |   57|   204k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|   409k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 645, False: 204k]
  |  |  |  |  |  Branch (54:32): [True: 912, False: 203k]
  |  |  |  |  |  Branch (54:44): [True: 912, False: 203k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  177|   204k|	}
  178|   124k|}
reduceh.cpp:_ZL24reduceh_unsigned_int_tabIjTnT_Lj4294967295EEvP12_VipsReducehPhPKhiPKs:
  148|   236k|{
  149|   236k|	T *restrict out = (T *) pout;
  150|   236k|	const T *restrict in = (T *) pin;
  151|   236k|	const int n = reduceh->n_point;
  152|       |
  153|   535k|	for (int z = 0; z < bands; z++) {
  ------------------
  |  Branch (153:18): [True: 299k, False: 236k]
  ------------------
  154|   299k|		typename LongT<T>::type sum;
  155|       |
  156|   299k|		sum = reduce_sum<T>(in + z, bands, cx, n);
  157|   299k|		sum = unsigned_fixed_round(sum);
  158|   299k|		out[z] = VIPS_CLIP(0, sum, max_value);
  ------------------
  |  |   57|   299k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|   598k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 14.4k, False: 284k]
  |  |  |  |  |  Branch (54:32): [True: 8.12k, False: 290k]
  |  |  |  |  |  Branch (54:44): [True: 8.12k, False: 276k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  159|   299k|	}
  160|   236k|}
reduceh.cpp:_ZL22reduceh_signed_int_tabIiLin2147483648ELi2147483647EEvP12_VipsReducehPhPKhiPKs:
  166|  94.2k|{
  167|  94.2k|	T *restrict out = (T *) pout;
  168|  94.2k|	const T *restrict in = (T *) pin;
  169|  94.2k|	const int n = reduceh->n_point;
  170|       |
  171|   230k|	for (int z = 0; z < bands; z++) {
  ------------------
  |  Branch (171:18): [True: 136k, False: 94.2k]
  ------------------
  172|   136k|		typename LongT<T>::type sum;
  173|       |
  174|   136k|		sum = reduce_sum<T>(in + z, bands, cx, n);
  175|   136k|		sum = signed_fixed_round(sum);
  176|   136k|		out[z] = VIPS_CLIP(min_value, sum, max_value);
  ------------------
  |  |   57|   136k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|   272k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 1.73k, False: 134k]
  |  |  |  |  |  Branch (54:32): [True: 2.43k, False: 133k]
  |  |  |  |  |  Branch (54:44): [True: 2.43k, False: 132k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  177|   136k|	}
  178|  94.2k|}
reduceh.cpp:_ZL17reduceh_float_tabIfEvP12_VipsReducehPhPKhiPKd:
  186|  2.15M|{
  187|  2.15M|	T *restrict out = (T *) pout;
  188|  2.15M|	const T *restrict in = (T *) pin;
  189|  2.15M|	const int n = reduceh->n_point;
  190|       |
  191|  9.63M|	for (int z = 0; z < bands; z++)
  ------------------
  |  Branch (191:18): [True: 7.47M, False: 2.15M]
  ------------------
  192|  7.47M|		out[z] = reduce_sum<T>(in + z, bands, cx, n);
  193|  2.15M|}
reduceh.cpp:_ZL17vips_reduceh_initP12_VipsReduceh:
  627|  15.9k|{
  628|  15.9k|	reduceh->gap = 0.0;
  629|  15.9k|	reduceh->kernel = VIPS_KERNEL_LANCZOS3;
  630|  15.9k|}

_ZN6N_AVX222vips_reduceh_uchar_hwyEPhS0_iiiPrPsdd:
   76|  36.2k|{
   77|  36.2k|#if HWY_TARGET != HWY_SCALAR
   78|  36.2k|	const auto initial = Set(di32, VIPS_INTERPOLATE_SCALE >> 1);
  ------------------
  |  |  120|  36.2k|#define VIPS_INTERPOLATE_SCALE (1 << VIPS_INTERPOLATE_SHIFT)
  |  |  ------------------
  |  |  |  |  119|  36.2k|#define VIPS_INTERPOLATE_SHIFT (12)
  |  |  ------------------
  ------------------
   79|       |
   80|  36.2k|#ifdef HAVE_HWY_1_1_0
   81|       |	/*  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
   82|       |	 * r0 g0 b0 r1 g1 b1 r2 g2 b2 r3 g3 b3
   83|       |	 */
   84|  36.2k|	const auto shuf3_lo = Dup128VecFromValues(di8,
   85|  36.2k|		0, -1, 3, -1, 1, -1, 4, -1,
   86|  36.2k|		2, -1, 5, -1, -1, -1, -1, -1);
   87|  36.2k|	const auto shuf3_hi = Dup128VecFromValues(di8,
   88|  36.2k|		6, -1, 9, -1, 7, -1, 10, -1,
   89|  36.2k|		8, -1, 11, -1, -1, -1, -1, -1);
   90|       |
   91|       |	/*  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
   92|       |	 * r0 g0 b0 a0 r1 g1 b1 a1 r2 g2 b2 a2 r3 g3 b3 a3
   93|       |	 */
   94|  36.2k|	const auto shuf4_lo = Dup128VecFromValues(di8,
   95|  36.2k|		0, -1, 4, -1, 1, -1, 5, -1,
   96|  36.2k|		2, -1, 6, -1, 3, -1, 7, -1);
   97|  36.2k|	const auto shuf4_hi = Dup128VecFromValues(di8,
   98|  36.2k|		8, -1, 12, -1, 9, -1, 13, -1,
   99|  36.2k|		10, -1, 14, -1, 11, -1, 15, -1);
  100|       |
  101|  36.2k|	const auto shuf_lo = BitCast(di16, bands == 3 ? shuf3_lo : shuf4_lo);
  ------------------
  |  Branch (101:37): [True: 23.6k, False: 12.6k]
  ------------------
  102|  36.2k|	const auto shuf_hi = BitCast(di16, bands == 3 ? shuf3_hi : shuf4_hi);
  ------------------
  |  Branch (102:37): [True: 23.6k, False: 12.6k]
  ------------------
  103|       |#else
  104|       |	/*  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
  105|       |	 * r0 g0 b0 r1 g1 b1 r2 g2 b2 r3 g3 b3
  106|       |	 */
  107|       |	alignas(16) static constexpr int8_t tbl3_lo[16] = {
  108|       |		0, -1, 3, -1, 1, -1, 4, -1,
  109|       |		2, -1, 5, -1, -1, -1, -1, -1
  110|       |	};
  111|       |	alignas(16) static constexpr int8_t tbl3_hi[16] = {
  112|       |		6, -1, 9, -1, 7, -1, 10, -1,
  113|       |		8, -1, 11, -1, -1, -1, -1, -1
  114|       |	};
  115|       |
  116|       |	/*  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
  117|       |	 * r0 g0 b0 a0 r1 g1 b1 a1 r2 g2 b2 a2 r3 g3 b3 a3
  118|       |	 */
  119|       |	alignas(16) static constexpr int8_t tbl4_lo[16] = {
  120|       |		0, -1, 4, -1, 1, -1, 5, -1,
  121|       |		2, -1, 6, -1, 3, -1, 7, -1
  122|       |	};
  123|       |	alignas(16) static constexpr int8_t tbl4_hi[16] = {
  124|       |		8, -1, 12, -1, 9, -1, 13, -1,
  125|       |		10, -1, 14, -1, 11, -1, 15, -1
  126|       |	};
  127|       |
  128|       |	const auto shuf_lo = BitCast(di16,
  129|       |		LoadDup128(di8, bands == 3 ? tbl3_lo : tbl4_lo));
  130|       |	const auto shuf_hi = BitCast(di16,
  131|       |		LoadDup128(di8, bands == 3 ? tbl3_hi : tbl4_hi));
  132|       |#endif
  133|       |
  134|  1.19M|	for (int32_t x = 0; x < width; ++x) {
  ------------------
  |  Branch (134:22): [True: 1.16M, False: 36.2k]
  ------------------
  135|  1.16M|		const int ix = (int) X;
  136|  1.16M|		const int sx = X * VIPS_TRANSFORM_SCALE * 2;
  ------------------
  |  |  112|  1.16M|#define VIPS_TRANSFORM_SCALE (1 << VIPS_TRANSFORM_SHIFT)
  |  |  ------------------
  |  |  |  |  111|  1.16M|#define VIPS_TRANSFORM_SHIFT (6)
  |  |  ------------------
  ------------------
  137|  1.16M|		const int six = sx & (VIPS_TRANSFORM_SCALE * 2 - 1);
  ------------------
  |  |  112|  1.16M|#define VIPS_TRANSFORM_SCALE (1 << VIPS_TRANSFORM_SHIFT)
  |  |  ------------------
  |  |  |  |  111|  1.16M|#define VIPS_TRANSFORM_SHIFT (6)
  |  |  ------------------
  ------------------
  138|  1.16M|		const int tx = (six + 1) >> 1;
  139|  1.16M|		const int16_t *k = cs[tx];
  140|       |
  141|  1.16M|		auto *HWY_RESTRICT p = (uint8_t *) pin + ix * bands;
  142|  1.16M|		auto *HWY_RESTRICT q = (uint8_t *) pout + x * bands;
  143|       |
  144|  1.16M|#if HWY_ARCH_X86 || HWY_ARCH_WASM || HWY_TARGET == HWY_EMU128
  145|       |		/* Initialize the sum with the addition on x86 and Wasm,
  146|       |		 * avoids an extra add instruction. Should be safe given
  147|       |		 * that only one accumulator is used.
  148|       |		 */
  149|  1.16M|		auto sum0 = initial;
  150|       |#else
  151|       |		auto sum0 = Zero(di32);
  152|       |#endif
  153|  1.16M|		auto sum1 = Zero(di32); /* unused on x86 and Wasm */
  154|       |
  155|  1.16M|		int32_t i = 0;
  156|  4.85M|		for (; i + 4 <= n; i += 4) {
  ------------------
  |  Branch (156:10): [True: 3.69M, False: 1.16M]
  ------------------
  157|       |			/* Load four coefficients.
  158|       |			 */
  159|  3.69M|			auto mmk_lo = BitCast(di16, Set(di32, *(int32_t *) &k[i]));
  160|  3.69M|			auto mmk_hi = BitCast(di16, Set(di32, *(int32_t *) &k[i + 2]));
  161|       |
  162|  3.69M|			auto source = LoadU(du8, p);
  163|  3.69M|			p += bands * 4;
  164|       |
  165|  3.69M|			auto pix = TableLookupBytesOr0(source, shuf_lo);
  166|       |
  167|  3.69M|			sum0 = ReorderWidenMulAccumulate(di32, pix, mmk_lo, sum0,
  168|  3.69M|				/* byref */ sum1);
  169|       |
  170|  3.69M|			pix = TableLookupBytesOr0(source, shuf_hi);
  171|       |
  172|  3.69M|			sum0 = ReorderWidenMulAccumulate(di32, pix, mmk_hi, sum0,
  173|  3.69M|				/* byref */ sum1);
  174|  3.69M|		}
  175|  2.15M|		for (; i + 2 <= n; i += 2) {
  ------------------
  |  Branch (175:10): [True: 993k, False: 1.16M]
  ------------------
  176|       |			/* Load two coefficients at once.
  177|       |			 */
  178|   993k|			auto mmk_lo = BitCast(di16, Set(di32, *(int32_t *) &k[i]));
  179|       |
  180|   993k|			auto source = LoadU(du8, p);
  181|   993k|			p += bands * 2;
  182|       |
  183|   993k|			auto pix = TableLookupBytesOr0(source, shuf_lo);
  184|       |
  185|   993k|			sum0 = ReorderWidenMulAccumulate(di32, pix, mmk_lo, sum0,
  186|   993k|				/* byref */ sum1);
  187|   993k|		}
  188|  2.32M|		for (; i < n; ++i) {
  ------------------
  |  Branch (188:10): [True: 1.16M, False: 1.16M]
  ------------------
  189|  1.16M|			auto mmk = Set(di16, k[i]);
  190|       |
  191|  1.16M|			auto source = LoadU(du8x32, p);
  192|  1.16M|			p += bands;
  193|       |
  194|  1.16M|			auto pix = BitCast(di16, PromoteTo(di32, source));
  195|       |
  196|  1.16M|			sum0 = ReorderWidenMulAccumulate(di32, pix, mmk, sum0,
  197|  1.16M|				/* byref */ sum1);
  198|  1.16M|		}
  199|       |
  200|  1.16M|		sum0 = RearrangeToOddPlusEven(sum0, sum1);
  201|       |
  202|       |#if !(HWY_ARCH_X86 || HWY_ARCH_WASM || HWY_TARGET == HWY_EMU128)
  203|       |		sum0 = Add(sum0, initial);
  204|       |#endif
  205|       |
  206|       |		/* The final 32->8 conversion.
  207|       |		 */
  208|  1.16M|		sum0 = ShiftRight<VIPS_INTERPOLATE_SHIFT>(sum0);
  209|       |
  210|  1.16M|		auto demoted = DemoteTo(du8x32, sum0);
  211|  1.16M|		StoreU(demoted, du8x32, q);
  212|       |
  213|  1.16M|		X += hshrink;
  214|  1.16M|	}
  215|  36.2k|#endif
  216|  36.2k|}
vips_reduceh_uchar_hwy:
  228|  36.2k|{
  229|       |	/* clang-format off */
  230|  36.2k|	HWY_DYNAMIC_DISPATCH(vips_reduceh_uchar_hwy)(pout, pin,
  ------------------
  |  |  570|  36.2k|#define HWY_DYNAMIC_DISPATCH(FUNC_NAME) (*(HWY_DYNAMIC_POINTER(FUNC_NAME)))
  |  |  ------------------
  |  |  |  |  567|  36.2k|  (HWY_DISPATCH_TABLE(FUNC_NAME)[hwy::GetChosenTarget().GetIndex()])
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  36.2k|  HWY_CONCAT(FUNC_NAME, HighwayDispatchTable)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  204|  36.2k|#define HWY_CONCAT(a, b) HWY_CONCAT_IMPL(a, b)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  203|  36.2k|#define HWY_CONCAT_IMPL(a, b) a##b
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  231|  36.2k|		n, width, bands, cs, X, hshrink);
  232|       |	/* clang-format on */
  233|  36.2k|}

vips_reducev:
 1121|  13.0k|{
 1122|  13.0k|	va_list ap;
 1123|  13.0k|	int result;
 1124|       |
 1125|  13.0k|	va_start(ap, vshrink);
 1126|  13.0k|	result = vips_call_split("reducev", ap, in, out, vshrink);
 1127|  13.0k|	va_end(ap);
 1128|       |
 1129|  13.0k|	return result;
 1130|  13.0k|}
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|}
reducev.cpp:_ZL18vips_reducev_buildP11_VipsObject:
  828|  13.0k|{
  829|  13.0k|	VipsObjectClass *object_class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  13.0k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  13.0k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  13.0k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  830|  13.0k|	VipsResample *resample = VIPS_RESAMPLE(object);
  ------------------
  |  |   40|  13.0k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  13.0k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  13.0k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  13.0k|		VIPS_TYPE_RESAMPLE, VipsResample))
  ------------------
  831|  13.0k|	VipsReducev *reducev = (VipsReducev *) object;
  832|  13.0k|	VipsImage **t = (VipsImage **)
  833|  13.0k|		vips_object_local_array(object, 5);
  834|       |
  835|  13.0k|	VipsImage *in;
  836|  13.0k|	VipsGenerateFn generate;
  837|  13.0k|	int height;
  838|  13.0k|	int int_vshrink;
  839|  13.0k|	double extra_pixels;
  840|       |
  841|  13.0k|	if (VIPS_OBJECT_CLASS(vips_reducev_parent_class)->build(object))
  ------------------
  |  |  435|  13.0k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  13.0k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  13.0k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (841:6): [True: 0, False: 13.0k]
  ------------------
  842|      0|		return -1;
  843|       |
  844|  13.0k|	in = resample->in;
  845|       |
  846|  13.0k|	if (reducev->vshrink < 1.0) {
  ------------------
  |  Branch (846:6): [True: 0, False: 13.0k]
  ------------------
  847|      0|		vips_error(object_class->nickname,
  848|      0|			"%s", _("reduce factor should be >= 1.0"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  849|      0|		return -1;
  850|      0|	}
  851|       |
  852|       |	/* Output size. We need to always round to nearest, so round(), not
  853|       |	 * rint().
  854|       |	 */
  855|  13.0k|	height = VIPS_ROUND_UINT((double) in->Ysize / reducev->vshrink);
  ------------------
  |  |  106|  13.0k|#define VIPS_ROUND_UINT(R) ((int) ((R) + 0.5))
  ------------------
  856|       |
  857|       |	/* How many pixels we are inventing in the input, -ve for
  858|       |	 * discarding.
  859|       |	 */
  860|  13.0k|	extra_pixels = height * reducev->vshrink - in->Ysize;
  861|       |
  862|       |	/* The vshrink we do after integer reduction.
  863|       |	 */
  864|  13.0k|	reducev->residual_vshrink = reducev->vshrink;
  865|       |
  866|  13.0k|	if (reducev->gap > 0.0 &&
  ------------------
  |  Branch (866:6): [True: 13.0k, False: 0]
  ------------------
  867|  13.0k|		reducev->kernel != VIPS_KERNEL_NEAREST) {
  ------------------
  |  Branch (867:3): [True: 13.0k, False: 0]
  ------------------
  868|  13.0k|		if (reducev->gap < 1.0) {
  ------------------
  |  Branch (868:7): [True: 0, False: 13.0k]
  ------------------
  869|      0|			vips_error(object_class->nickname,
  870|      0|				"%s", _("reduce gap should be >= 1.0"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  871|      0|			return -1;
  872|      0|		}
  873|       |
  874|       |		/* The int part of our reduce.
  875|       |		 */
  876|  13.0k|		int_vshrink = VIPS_MAX(1,
  ------------------
  |  |   54|  13.0k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 4.86k, False: 8.23k]
  |  |  ------------------
  ------------------
  877|  13.0k|			VIPS_FLOOR((double) in->Ysize / height / reducev->gap));
  878|       |
  879|  13.0k|		if (int_vshrink > 1) {
  ------------------
  |  Branch (879:7): [True: 0, False: 13.0k]
  ------------------
  880|      0|			g_info("shrinkv by %d", int_vshrink);
  ------------------
  |  |  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__)
  ------------------
  881|      0|			if (vips_shrinkv(in, &t[0], int_vshrink,
  ------------------
  |  Branch (881:8): [True: 0, False: 0]
  ------------------
  882|      0|					"ceil", TRUE,
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  883|      0|					nullptr))
  884|      0|				return -1;
  885|      0|			in = t[0];
  886|       |
  887|      0|			extra_pixels /= int_vshrink;
  888|      0|			reducev->residual_vshrink /= int_vshrink;
  889|      0|		}
  890|  13.0k|	}
  891|       |
  892|  13.0k|	if (reducev->residual_vshrink == 1.0)
  ------------------
  |  Branch (892:6): [True: 0, False: 13.0k]
  ------------------
  893|      0|		return vips_image_write(in, resample->out);
  894|       |
  895|  13.0k|	reducev->n_point =
  896|  13.0k|		vips_reduce_get_points(reducev->kernel, reducev->residual_vshrink);
  897|  13.0k|	g_info("reducev: %d point mask", reducev->n_point);
  ------------------
  |  |  341|  13.0k|#define g_info(...)     g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|  13.0k|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  342|  13.0k|                               G_LOG_LEVEL_INFO,     \
  |  |  343|  13.0k|                               __VA_ARGS__)
  ------------------
  898|  13.0k|	if (reducev->n_point > MAX_POINT) {
  ------------------
  |  |   70|  13.0k|#define MAX_POINT (2000)
  ------------------
  |  Branch (898:6): [True: 0, False: 13.0k]
  ------------------
  899|      0|		vips_error(object_class->nickname,
  900|      0|			"%s", _("reduce factor too large"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  901|      0|		return -1;
  902|      0|	}
  903|       |
  904|       |	/* If we are rounding down, we are not using some input
  905|       |	 * pixels. We need to move the origin *inside* the input image
  906|       |	 * by half that distance so that we discard pixels equally
  907|       |	 * from left and right.
  908|       |	 */
  909|  13.0k|	reducev->voffset = (1 + extra_pixels) / 2.0 - 1;
  910|       |
  911|       |	/* Build the tables of pre-computed coefficients.
  912|       |	 */
  913|   864k|	for (int y = 0; y < VIPS_TRANSFORM_SCALE + 1; y++) {
  ------------------
  |  |  112|   864k|#define VIPS_TRANSFORM_SCALE (1 << VIPS_TRANSFORM_SHIFT)
  |  |  ------------------
  |  |  |  |  111|   864k|#define VIPS_TRANSFORM_SHIFT (6)
  |  |  ------------------
  ------------------
  |  Branch (913:18): [True: 851k, False: 13.0k]
  ------------------
  914|   851k|		reducev->matrixf[y] = VIPS_ARRAY(object, reducev->n_point, double);
  ------------------
  |  |   72|   851k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|   851k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|   851k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|   851k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|   851k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  915|   851k|		reducev->matrixs[y] = VIPS_ARRAY(object, reducev->n_point, short);
  ------------------
  |  |   72|   851k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|   851k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|   851k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|   851k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|   851k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  916|   851k|		if (!reducev->matrixf[y] ||
  ------------------
  |  Branch (916:7): [True: 0, False: 851k]
  ------------------
  917|   851k|			!reducev->matrixs[y])
  ------------------
  |  Branch (917:4): [True: 0, False: 851k]
  ------------------
  918|      0|			return -1;
  919|       |
  920|   851k|		vips_reduce_make_mask(reducev->matrixf[y], reducev->kernel,
  921|   851k|			reducev->n_point, reducev->residual_vshrink,
  922|   851k|			(float) y / VIPS_TRANSFORM_SCALE);
  ------------------
  |  |  112|   851k|#define VIPS_TRANSFORM_SCALE (1 << VIPS_TRANSFORM_SHIFT)
  |  |  ------------------
  |  |  |  |  111|   851k|#define VIPS_TRANSFORM_SHIFT (6)
  |  |  ------------------
  ------------------
  923|       |
  924|  13.2M|		for (int i = 0; i < reducev->n_point; i++)
  ------------------
  |  Branch (924:19): [True: 12.3M, False: 851k]
  ------------------
  925|  12.3M|			reducev->matrixs[y][i] =
  926|  12.3M|				(short) (reducev->matrixf[y][i] * VIPS_INTERPOLATE_SCALE);
  ------------------
  |  |  120|  12.3M|#define VIPS_INTERPOLATE_SCALE (1 << VIPS_INTERPOLATE_SHIFT)
  |  |  ------------------
  |  |  |  |  119|  12.3M|#define VIPS_INTERPOLATE_SHIFT (12)
  |  |  ------------------
  ------------------
  927|       |#ifdef DEBUG
  928|       |		printf("vips_reducev_build: mask %d\n    ", y);
  929|       |		for (int i = 0; i < reducev->n_point; i++)
  930|       |			printf("%d ", reducev->matrixs[y][i]);
  931|       |		printf("\n");
  932|       |#endif /*DEBUG*/
  933|   851k|	}
  934|       |
  935|       |	/* Unpack for processing.
  936|       |	 */
  937|  13.0k|	if (vips_image_decode(in, &t[1]))
  ------------------
  |  Branch (937:6): [True: 0, False: 13.0k]
  ------------------
  938|      0|		return -1;
  939|  13.0k|	in = t[1];
  940|       |
  941|       |	/* Add new pixels around the input so we can interpolate at the edges.
  942|       |	 */
  943|  13.0k|	if (vips_embed(in, &t[2],
  ------------------
  |  Branch (943:6): [True: 0, False: 13.0k]
  ------------------
  944|  13.0k|			0, VIPS_CEIL(reducev->n_point / 2.0) - 1,
  ------------------
  |  |   73|  13.0k|#define VIPS_CEIL(V) __builtin_ceil(V)
  ------------------
  945|  13.0k|			in->Xsize, in->Ysize + reducev->n_point,
  946|  13.0k|			"extend", VIPS_EXTEND_COPY,
  947|  13.0k|			nullptr))
  948|      0|		return -1;
  949|  13.0k|	in = t[2];
  950|       |
  951|       |	/* For uchar input, try to make a vector path.
  952|       |	 */
  953|  13.0k|#ifdef HAVE_HWY
  954|  13.0k|	if (in->BandFmt == VIPS_FORMAT_UCHAR &&
  ------------------
  |  Branch (954:6): [True: 8.58k, False: 4.51k]
  ------------------
  955|  13.0k|		vips_vector_isenabled()) {
  ------------------
  |  Branch (955:3): [True: 8.58k, False: 0]
  ------------------
  956|  8.58k|		generate = vips_reducev_uchar_vector_gen;
  957|  8.58k|		g_info("reducev: using vector path");
  ------------------
  |  |  341|  8.58k|#define g_info(...)     g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|  8.58k|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  342|  8.58k|                               G_LOG_LEVEL_INFO,     \
  |  |  343|  8.58k|                               __VA_ARGS__)
  ------------------
  958|  8.58k|	}
  959|  4.51k|	else
  960|       |#elif defined(HAVE_ORC)
  961|       |	if (in->BandFmt == VIPS_FORMAT_UCHAR &&
  962|       |		vips_vector_isenabled() &&
  963|       |		!vips_reducev_compile(reducev)) {
  964|       |		generate = vips_reducev_vector_gen;
  965|       |		g_info("reducev: using vector path");
  966|       |
  967|       |		/* We need an 2.6 version if we will use the vector path.
  968|       |		 */
  969|       |		for (int y = 0; y < VIPS_TRANSFORM_SCALE + 1; y++) {
  970|       |			reducev->matrixo[y] =
  971|       |				VIPS_ARRAY(object, reducev->n_point, int);
  972|       |			if (!reducev->matrixo[y])
  973|       |				return -1;
  974|       |
  975|       |			vips_reducev_vector_to_fixed_point(
  976|       |				reducev->matrixf[y], reducev->matrixo[y],
  977|       |				reducev->n_point, 64);
  978|       |		}
  979|       |	}
  980|       |	else
  981|       |#endif /*HAVE_HWY*/
  982|       |		/* Default to the C path.
  983|       |		 */
  984|  4.51k|		generate = vips_reducev_gen;
  985|       |
  986|  13.0k|	t[3] = vips_image_new();
  987|  13.0k|	if (vips_image_pipelinev(t[3],
  ------------------
  |  Branch (987:6): [True: 0, False: 13.0k]
  ------------------
  988|  13.0k|			VIPS_DEMAND_STYLE_FATSTRIP, in, nullptr))
  989|      0|		return -1;
  990|       |
  991|       |	/* Size output. We need to always round to nearest, so round(), not
  992|       |	 * rint().
  993|       |	 *
  994|       |	 * Don't change xres/yres, leave that to the application layer. For
  995|       |	 * example, vipsthumbnail knows the true reduce factor (including the
  996|       |	 * fractional part), we just see the integer part here.
  997|       |	 */
  998|  13.0k|	t[3]->Ysize = height;
  999|  13.0k|	if (t[3]->Ysize <= 0) {
  ------------------
  |  Branch (999:6): [True: 0, False: 13.0k]
  ------------------
 1000|      0|		vips_error(object_class->nickname,
 1001|      0|			"%s", _("image has shrunk to nothing"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1002|      0|		return -1;
 1003|      0|	}
 1004|       |
 1005|       |#ifdef DEBUG
 1006|       |	printf("vips_reducev_build: reducing %d x %d image to %d x %d\n",
 1007|       |		in->Xsize, in->Ysize,
 1008|       |		t[3]->Xsize, t[3]->Ysize);
 1009|       |#endif /*DEBUG*/
 1010|       |
 1011|  13.0k|	if (vips_image_generate(t[3],
  ------------------
  |  Branch (1011:6): [True: 0, False: 13.0k]
  ------------------
 1012|  13.0k|			vips_reducev_start, generate, vips_reducev_stop,
 1013|  13.0k|			in, reducev))
 1014|      0|		return -1;
 1015|       |
 1016|  13.0k|	in = t[3];
 1017|       |
 1018|  13.0k|	vips_reorder_margin_hint(in, reducev->n_point);
 1019|       |
 1020|       |	/* Large reducev will throw off sequential mode. Suppose thread1 is
 1021|       |	 * generating tile (0, 0), but stalls. thread2 generates tile
 1022|       |	 * (0, 1), 128 lines further down the output. After it has done,
 1023|       |	 * thread1 tries to generate (0, 0), but by then the pixels it needs
 1024|       |	 * have gone from the input image line cache if the reducev is large.
 1025|       |	 *
 1026|       |	 * To fix this, put another seq on the output of reducev. Now we'll
 1027|       |	 * always have the previous XX lines of the shrunk image, and we won't
 1028|       |	 * fetch out of order.
 1029|       |	 */
 1030|  13.0k|	if (vips_image_is_sequential(in)) {
  ------------------
  |  Branch (1030:6): [True: 0, False: 13.0k]
  ------------------
 1031|      0|		g_info("reducev sequential line cache");
  ------------------
  |  |  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__)
  ------------------
 1032|       |
 1033|      0|		if (vips_sequential(in, &t[4],
  ------------------
  |  Branch (1033:7): [True: 0, False: 0]
  ------------------
 1034|      0|				"tile_height", 10,
 1035|       |				// "trace", TRUE,
 1036|      0|				nullptr))
 1037|      0|			return -1;
 1038|      0|		in = t[4];
 1039|      0|	}
 1040|       |
 1041|  13.0k|	if (vips_image_write(in, resample->out))
  ------------------
  |  Branch (1041:6): [True: 0, False: 13.0k]
  ------------------
 1042|      0|		return -1;
 1043|       |
 1044|  13.0k|	return 0;
 1045|  13.0k|}
reducev.cpp:_ZL29vips_reducev_uchar_vector_genP11_VipsRegionPvS1_S1_Pi:
  593|  8.58k|{
  594|  8.58k|	VipsImage *in = (VipsImage *) a;
  595|  8.58k|	VipsReducev *reducev = (VipsReducev *) b;
  596|  8.58k|	VipsReducevSequence *seq = (VipsReducevSequence *) vseq;
  597|  8.58k|	VipsRegion *ir = seq->ir;
  598|  8.58k|	VipsRect *r = &out_region->valid;
  599|  8.58k|	const int bands = in->Bands;
  600|  8.58k|	int ne = r->width * bands;
  601|       |
  602|  8.58k|	VipsRect s;
  603|       |
  604|       |#ifdef DEBUG
  605|       |	printf("vips_reducev_uchar_vector_gen: generating %d x %d at %d x %d\n",
  606|       |		r->width, r->height, r->left, r->top);
  607|       |#endif /*DEBUG*/
  608|       |
  609|  8.58k|	s.left = r->left;
  610|  8.58k|	s.top = r->top * reducev->residual_vshrink - reducev->voffset;
  611|  8.58k|	s.width = r->width;
  612|  8.58k|	s.height = r->height * reducev->residual_vshrink + reducev->n_point;
  613|  8.58k|	if (vips_region_prepare(ir, &s))
  ------------------
  |  Branch (613:6): [True: 4.41k, False: 4.16k]
  ------------------
  614|  4.41k|		return -1;
  615|       |
  616|  8.58k|	VIPS_GATE_START("vips_reducev_uchar_vector_gen: work");
  ------------------
  |  |   41|  4.16k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  4.16k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  4.16k|	{ \
  |  |   43|  4.16k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 4.16k]
  |  |  ------------------
  |  |   44|  4.16k|			vips__thread_gate_start(NAME); \
  |  |   45|  4.16k|	} \
  |  |   46|  8.58k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  8.58k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  617|       |
  618|  4.16k|	double Y = (r->top + 0.5) * reducev->residual_vshrink - 0.5 -
  619|  4.16k|		reducev->voffset;
  620|       |
  621|   137k|	for (int y = 0; y < r->height; y++) {
  ------------------
  |  Branch (621:18): [True: 133k, False: 4.16k]
  ------------------
  622|   133k|		VipsPel *q =
  623|   133k|			VIPS_REGION_ADDR(out_region, r->left, r->top + y);
  ------------------
  |  |  227|   133k|	((R)->data + \
  |  |  228|   133k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   133k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   133k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   133k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   133k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   133k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  624|   133k|		const int py = (int) Y;
  625|   133k|		VipsPel *p = VIPS_REGION_ADDR(ir, r->left, py);
  ------------------
  |  |  227|   133k|	((R)->data + \
  |  |  228|   133k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   133k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   133k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   133k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   133k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   133k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  626|   133k|		const int sy = Y * VIPS_TRANSFORM_SCALE * 2;
  ------------------
  |  |  112|   133k|#define VIPS_TRANSFORM_SCALE (1 << VIPS_TRANSFORM_SHIFT)
  |  |  ------------------
  |  |  |  |  111|   133k|#define VIPS_TRANSFORM_SHIFT (6)
  |  |  ------------------
  ------------------
  627|   133k|		const int siy = sy & (VIPS_TRANSFORM_SCALE * 2 - 1);
  ------------------
  |  |  112|   133k|#define VIPS_TRANSFORM_SCALE (1 << VIPS_TRANSFORM_SHIFT)
  |  |  ------------------
  |  |  |  |  111|   133k|#define VIPS_TRANSFORM_SHIFT (6)
  |  |  ------------------
  ------------------
  628|   133k|		const int ty = (siy + 1) >> 1;
  629|   133k|		const short *cys = reducev->matrixs[ty];
  630|   133k|		const int lskip = VIPS_REGION_LSKIP(ir);
  ------------------
  |  |  195|   133k|	((size_t) ((R)->bpl))
  ------------------
  631|       |
  632|   133k|		vips_reducev_uchar_hwy(
  633|   133k|			q, p,
  634|   133k|			reducev->n_point, ne, lskip, cys);
  635|       |
  636|   133k|		Y += reducev->residual_vshrink;
  637|   133k|	}
  638|       |
  639|  4.16k|	VIPS_GATE_STOP("vips_reducev_uchar_vector_gen: work");
  ------------------
  |  |   49|  4.16k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  4.16k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  4.16k|	{ \
  |  |   51|  4.16k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 4.16k]
  |  |  ------------------
  |  |   52|  4.16k|			vips__thread_gate_stop(NAME); \
  |  |   53|  4.16k|	} \
  |  |   54|  4.16k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  4.16k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  640|       |
  641|  4.16k|	VIPS_COUNT_PIXELS(out_region, "vips_reducev_uchar_vector_gen");
  ------------------
  |  |  189|  4.16k|#define VIPS_COUNT_PIXELS(R, N) vips__region_count_pixels(R, N)
  ------------------
  642|       |
  643|  4.16k|	return 0;
  644|  8.58k|}
reducev.cpp:_ZL16vips_reducev_genP11_VipsRegionPvS1_S1_Pi:
  487|  4.50k|{
  488|  4.50k|	VipsImage *in = (VipsImage *) a;
  489|  4.50k|	VipsReducev *reducev = (VipsReducev *) b;
  490|  4.50k|	VipsReducevSequence *seq = (VipsReducevSequence *) vseq;
  491|  4.50k|	VipsRegion *ir = seq->ir;
  492|  4.50k|	VipsRect *r = &out_region->valid;
  493|       |
  494|       |	/* Double bands for complex.
  495|       |	 */
  496|  4.50k|	const int bands = in->Bands *
  497|  4.50k|		(vips_band_format_iscomplex(in->BandFmt) ? 2 : 1);
  ------------------
  |  Branch (497:4): [True: 0, False: 4.50k]
  ------------------
  498|  4.50k|	int ne = r->width * bands;
  499|       |
  500|  4.50k|	VipsRect s;
  501|       |
  502|       |#ifdef DEBUG
  503|       |	printf("vips_reducev_gen: generating %d x %d at %d x %d\n",
  504|       |		r->width, r->height, r->left, r->top);
  505|       |#endif /*DEBUG*/
  506|       |
  507|  4.50k|	s.left = r->left;
  508|  4.50k|	s.top = r->top * reducev->residual_vshrink - reducev->voffset;
  509|  4.50k|	s.width = r->width;
  510|  4.50k|	s.height = r->height * reducev->residual_vshrink + reducev->n_point;
  511|  4.50k|	if (vips_region_prepare(ir, &s))
  ------------------
  |  Branch (511:6): [True: 1.47k, False: 3.03k]
  ------------------
  512|  1.47k|		return -1;
  513|       |
  514|  4.50k|	VIPS_GATE_START("vips_reducev_gen: work");
  ------------------
  |  |   41|  3.03k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  3.03k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  3.03k|	{ \
  |  |   43|  3.03k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 3.03k]
  |  |  ------------------
  |  |   44|  3.03k|			vips__thread_gate_start(NAME); \
  |  |   45|  3.03k|	} \
  |  |   46|  4.50k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  4.50k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  515|       |
  516|  3.03k|	double Y = (r->top + 0.5) * reducev->residual_vshrink - 0.5 -
  517|  3.03k|		reducev->voffset;
  518|       |
  519|   100k|	for (int y = 0; y < r->height; y++) {
  ------------------
  |  Branch (519:18): [True: 97.1k, False: 3.03k]
  ------------------
  520|  97.1k|		VipsPel *q =
  521|  97.1k|			VIPS_REGION_ADDR(out_region, r->left, r->top + y);
  ------------------
  |  |  227|  97.1k|	((R)->data + \
  |  |  228|  97.1k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  97.1k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  97.1k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  97.1k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  97.1k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  97.1k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  522|  97.1k|		const int py = (int) Y;
  523|  97.1k|		VipsPel *p = VIPS_REGION_ADDR(ir, r->left, py);
  ------------------
  |  |  227|  97.1k|	((R)->data + \
  |  |  228|  97.1k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  97.1k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  97.1k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  97.1k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  97.1k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  97.1k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  524|  97.1k|		const int sy = Y * VIPS_TRANSFORM_SCALE * 2;
  ------------------
  |  |  112|  97.1k|#define VIPS_TRANSFORM_SCALE (1 << VIPS_TRANSFORM_SHIFT)
  |  |  ------------------
  |  |  |  |  111|  97.1k|#define VIPS_TRANSFORM_SHIFT (6)
  |  |  ------------------
  ------------------
  525|  97.1k|		const int siy = sy & (VIPS_TRANSFORM_SCALE * 2 - 1);
  ------------------
  |  |  112|  97.1k|#define VIPS_TRANSFORM_SCALE (1 << VIPS_TRANSFORM_SHIFT)
  |  |  ------------------
  |  |  |  |  111|  97.1k|#define VIPS_TRANSFORM_SHIFT (6)
  |  |  ------------------
  ------------------
  526|  97.1k|		const int ty = (siy + 1) >> 1;
  527|  97.1k|		const short *cys = reducev->matrixs[ty];
  528|  97.1k|		const double *cyf = reducev->matrixf[ty];
  529|  97.1k|		const int lskip = VIPS_REGION_LSKIP(ir);
  ------------------
  |  |  195|  97.1k|	((size_t) ((R)->bpl))
  ------------------
  530|       |
  531|  97.1k|		switch (in->BandFmt) {
  532|      0|		case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (532:3): [True: 0, False: 97.1k]
  ------------------
  533|      0|			reducev_unsigned_int_tab<unsigned char,
  534|      0|				UCHAR_MAX>(reducev, q, p, ne, lskip, cys);
  535|      0|			break;
  536|       |
  537|  3.87k|		case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (537:3): [True: 3.87k, False: 93.2k]
  ------------------
  538|  3.87k|			reducev_signed_int_tab<signed char,
  539|  3.87k|				SCHAR_MIN, SCHAR_MAX>(reducev, q, p, ne, lskip, cys);
  540|  3.87k|			break;
  541|       |
  542|  7.00k|		case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (542:3): [True: 7.00k, False: 90.1k]
  ------------------
  543|  7.00k|			reducev_unsigned_int_tab<unsigned short,
  544|  7.00k|				USHRT_MAX>(reducev, q, p, ne, lskip, cys);
  545|  7.00k|			break;
  546|       |
  547|  3.90k|		case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (547:3): [True: 3.90k, False: 93.2k]
  ------------------
  548|  3.90k|			reducev_signed_int_tab<signed short,
  549|  3.90k|				SHRT_MIN, SHRT_MAX>(reducev, q, p, ne, lskip, cys);
  550|  3.90k|			break;
  551|       |
  552|  12.8k|		case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (552:3): [True: 12.8k, False: 84.3k]
  ------------------
  553|  12.8k|			reducev_unsigned_int_tab<unsigned int,
  554|  12.8k|				UINT_MAX>(reducev, q, p, ne, lskip, cys);
  555|  12.8k|			break;
  556|       |
  557|  4.09k|		case VIPS_FORMAT_INT:
  ------------------
  |  Branch (557:3): [True: 4.09k, False: 93.0k]
  ------------------
  558|  4.09k|			reducev_signed_int_tab<signed int,
  559|  4.09k|				INT_MIN, INT_MAX>(reducev, q, p, ne, lskip, cys);
  560|  4.09k|			break;
  561|       |
  562|  65.4k|		case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (562:3): [True: 65.4k, False: 31.6k]
  ------------------
  563|  65.4k|		case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (563:3): [True: 0, False: 97.1k]
  ------------------
  564|  65.4k|			reducev_float_tab<float>(reducev,
  565|  65.4k|				q, p, ne, lskip, cyf);
  566|  65.4k|			break;
  567|       |
  568|      0|		case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (568:3): [True: 0, False: 97.1k]
  ------------------
  569|      0|		case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (569:3): [True: 0, False: 97.1k]
  ------------------
  570|      0|			reducev_notab<double>(reducev,
  571|      0|				q, p, ne, lskip, Y - py);
  572|      0|			break;
  573|       |
  574|      0|		default:
  ------------------
  |  Branch (574:3): [True: 0, False: 97.1k]
  ------------------
  575|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  576|      0|			break;
  577|  97.1k|		}
  578|       |
  579|  97.1k|		Y += reducev->residual_vshrink;
  580|  97.1k|	}
  581|       |
  582|  3.03k|	VIPS_GATE_STOP("vips_reducev_gen: work");
  ------------------
  |  |   49|  3.03k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  3.03k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  3.03k|	{ \
  |  |   51|  3.03k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 3.03k]
  |  |  ------------------
  |  |   52|  3.03k|			vips__thread_gate_stop(NAME); \
  |  |   53|  3.03k|	} \
  |  |   54|  3.03k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  3.03k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  583|       |
  584|  3.03k|	VIPS_COUNT_PIXELS(out_region, "vips_reducev_gen");
  ------------------
  |  |  189|  3.03k|#define VIPS_COUNT_PIXELS(R, N) vips__region_count_pixels(R, N)
  ------------------
  585|       |
  586|  3.03k|	return 0;
  587|  3.03k|}
reducev.cpp:_ZL22reducev_signed_int_tabIaLin128ELi127EEvP12_VipsReducevPhPKhiiPKs:
  432|  3.87k|{
  433|  3.87k|	T *restrict out = (T *) pout;
  434|  3.87k|	const T *restrict in = (T *) pin;
  435|  3.87k|	const int n = reducev->n_point;
  436|  3.87k|	const int l1 = lskip / sizeof(T);
  437|       |
  438|   502k|	for (int z = 0; z < ne; z++) {
  ------------------
  |  Branch (438:18): [True: 498k, False: 3.87k]
  ------------------
  439|   498k|		typename LongT<T>::type sum;
  440|       |
  441|   498k|		sum = reduce_sum<T>(in + z, l1, cy, n);
  442|   498k|		sum = signed_fixed_round(sum);
  443|   498k|		out[z] = VIPS_CLIP(min_value, sum, max_value);
  ------------------
  |  |   57|   498k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|   996k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 7.22k, False: 491k]
  |  |  |  |  |  Branch (54:32): [True: 7.59k, False: 490k]
  |  |  |  |  |  Branch (54:44): [True: 7.59k, False: 483k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  444|   498k|	}
  445|  3.87k|}
reducev.cpp:_ZL24reducev_unsigned_int_tabItTnT_Lt65535EEvP12_VipsReducevPhPKhiiPKs:
  413|  7.00k|{
  414|  7.00k|	T *restrict out = (T *) pout;
  415|  7.00k|	const T *restrict in = (T *) pin;
  416|  7.00k|	const int n = reducev->n_point;
  417|  7.00k|	const int l1 = lskip / sizeof(T);
  418|       |
  419|  1.06M|	for (int z = 0; z < ne; z++) {
  ------------------
  |  Branch (419:18): [True: 1.05M, False: 7.00k]
  ------------------
  420|  1.05M|		typename LongT<T>::type sum;
  421|       |
  422|  1.05M|		sum = reduce_sum<T>(in + z, l1, cy, n);
  423|  1.05M|		sum = unsigned_fixed_round(sum);
  424|  1.05M|		out[z] = VIPS_CLIP(0, sum, max_value);
  ------------------
  |  |   57|  1.05M|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|  2.11M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 59.1k, False: 999k]
  |  |  |  |  |  Branch (54:32): [True: 6.21k, False: 1.05M]
  |  |  |  |  |  Branch (54:44): [True: 6.21k, False: 993k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  425|  1.05M|	}
  426|  7.00k|}
reducev.cpp:_ZL22reducev_signed_int_tabIsLin32768ELi32767EEvP12_VipsReducevPhPKhiiPKs:
  432|  3.90k|{
  433|  3.90k|	T *restrict out = (T *) pout;
  434|  3.90k|	const T *restrict in = (T *) pin;
  435|  3.90k|	const int n = reducev->n_point;
  436|  3.90k|	const int l1 = lskip / sizeof(T);
  437|       |
  438|   284k|	for (int z = 0; z < ne; z++) {
  ------------------
  |  Branch (438:18): [True: 280k, False: 3.90k]
  ------------------
  439|   280k|		typename LongT<T>::type sum;
  440|       |
  441|   280k|		sum = reduce_sum<T>(in + z, l1, cy, n);
  442|   280k|		sum = signed_fixed_round(sum);
  443|   280k|		out[z] = VIPS_CLIP(min_value, sum, max_value);
  ------------------
  |  |   57|   280k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|   561k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 666, False: 280k]
  |  |  |  |  |  Branch (54:32): [True: 1.36k, False: 279k]
  |  |  |  |  |  Branch (54:44): [True: 1.36k, False: 278k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  444|   280k|	}
  445|  3.90k|}
reducev.cpp:_ZL24reducev_unsigned_int_tabIjTnT_Lj4294967295EEvP12_VipsReducevPhPKhiiPKs:
  413|  12.8k|{
  414|  12.8k|	T *restrict out = (T *) pout;
  415|  12.8k|	const T *restrict in = (T *) pin;
  416|  12.8k|	const int n = reducev->n_point;
  417|  12.8k|	const int l1 = lskip / sizeof(T);
  418|       |
  419|   943k|	for (int z = 0; z < ne; z++) {
  ------------------
  |  Branch (419:18): [True: 930k, False: 12.8k]
  ------------------
  420|   930k|		typename LongT<T>::type sum;
  421|       |
  422|   930k|		sum = reduce_sum<T>(in + z, l1, cy, n);
  423|   930k|		sum = unsigned_fixed_round(sum);
  424|   930k|		out[z] = VIPS_CLIP(0, sum, max_value);
  ------------------
  |  |   57|   930k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|  1.86M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 33.4k, False: 897k]
  |  |  |  |  |  Branch (54:32): [True: 5.49k, False: 925k]
  |  |  |  |  |  Branch (54:44): [True: 5.49k, False: 891k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  425|   930k|	}
  426|  12.8k|}
reducev.cpp:_ZL22reducev_signed_int_tabIiLin2147483648ELi2147483647EEvP12_VipsReducevPhPKhiiPKs:
  432|  4.09k|{
  433|  4.09k|	T *restrict out = (T *) pout;
  434|  4.09k|	const T *restrict in = (T *) pin;
  435|  4.09k|	const int n = reducev->n_point;
  436|  4.09k|	const int l1 = lskip / sizeof(T);
  437|       |
  438|   323k|	for (int z = 0; z < ne; z++) {
  ------------------
  |  Branch (438:18): [True: 318k, False: 4.09k]
  ------------------
  439|   318k|		typename LongT<T>::type sum;
  440|       |
  441|   318k|		sum = reduce_sum<T>(in + z, l1, cy, n);
  442|   318k|		sum = signed_fixed_round(sum);
  443|   318k|		out[z] = VIPS_CLIP(min_value, sum, max_value);
  ------------------
  |  |   57|   318k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|   637k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 1.08k, False: 317k]
  |  |  |  |  |  Branch (54:32): [True: 1.65k, False: 317k]
  |  |  |  |  |  Branch (54:44): [True: 1.65k, False: 316k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  444|   318k|	}
  445|  4.09k|}
reducev.cpp:_ZL17reducev_float_tabIfEvP12_VipsReducevPhPKhiiPKd:
  453|  65.4k|{
  454|  65.4k|	T *restrict out = (T *) pout;
  455|  65.4k|	const T *restrict in = (T *) pin;
  456|  65.4k|	const int n = reducev->n_point;
  457|  65.4k|	const int l1 = lskip / sizeof(T);
  458|       |
  459|  13.0M|	for (int z = 0; z < ne; z++)
  ------------------
  |  Branch (459:18): [True: 12.9M, False: 65.4k]
  ------------------
  460|  12.9M|		out[z] = reduce_sum<T>(in + z, l1, cy, n);
  461|  65.4k|}
reducev.cpp:_ZL18vips_reducev_startP10_VipsImagePvS1_:
  195|  13.0k|{
  196|  13.0k|	VipsImage *in = (VipsImage *) a;
  197|  13.0k|	VipsReducev *reducev = (VipsReducev *) b;
  198|       |
  199|  13.0k|	VipsReducevSequence *seq;
  200|       |
  201|  13.0k|	if (!(seq = VIPS_NEW(out, VipsReducevSequence)))
  ------------------
  |  |   70|  13.0k|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  13.0k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  13.0k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  13.0k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  13.0k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (201:6): [True: 0, False: 13.0k]
  ------------------
  202|      0|		return NULL;
  203|       |
  204|       |	/* Init!
  205|       |	 */
  206|  13.0k|	seq->reducev = reducev;
  207|  13.0k|	seq->ir = NULL;
  208|       |#ifdef HAVE_ORC
  209|       |	seq->t1 = NULL;
  210|       |	seq->t2 = NULL;
  211|       |#endif /*HAVE_ORC*/
  212|       |
  213|       |	/* Attach region.
  214|       |	 */
  215|  13.0k|	seq->ir = vips_region_new(in);
  216|       |
  217|       |#ifdef HAVE_ORC
  218|       |	/* Vector mode.
  219|       |	 */
  220|       |	if (reducev->n_pass) {
  221|       |		seq->t1 = VIPS_ARRAY(NULL, VIPS_IMAGE_N_ELEMENTS(in), short);
  222|       |		seq->t2 = VIPS_ARRAY(NULL, VIPS_IMAGE_N_ELEMENTS(in), short);
  223|       |
  224|       |		if (!seq->t1 ||
  225|       |			!seq->t2) {
  226|       |			vips_reducev_stop(seq, in, reducev);
  227|       |			return NULL;
  228|       |		}
  229|       |	}
  230|       |#endif /*HAVE_ORC*/
  231|       |
  232|  13.0k|	return seq;
  233|  13.0k|}
reducev.cpp:_ZL17vips_reducev_stopPvS_S_:
  181|  13.0k|{
  182|  13.0k|	VipsReducevSequence *seq = (VipsReducevSequence *) vseq;
  183|       |
  184|  13.0k|	VIPS_UNREF(seq->ir);
  ------------------
  |  |   57|  13.0k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  13.0k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  13.0k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  13.0k|	{ \
  |  |  |  |   43|  13.0k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 13.0k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  13.0k|			(void) F((S)); \
  |  |  |  |   45|  13.0k|			(S) = 0; \
  |  |  |  |   46|  13.0k|		} \
  |  |  |  |   47|  13.0k|	} \
  |  |  |  |   48|  13.0k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  13.0k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  185|       |#ifdef HAVE_ORC
  186|       |	VIPS_FREE(seq->t1);
  187|       |	VIPS_FREE(seq->t2);
  188|       |#endif /*HAVE_ORC*/
  189|       |
  190|  13.0k|	return 0;
  191|  13.0k|}
reducev.cpp:_ZL17vips_reducev_initP12_VipsReducev:
 1111|  13.0k|{
 1112|  13.0k|	reducev->gap = 0.0;
 1113|  13.0k|	reducev->kernel = VIPS_KERNEL_LANCZOS3;
 1114|  13.0k|}

_ZN6N_AVX222vips_reducev_uchar_hwyEPhS0_iiiPKs:
   83|   133k|{
   84|   133k|#if HWY_TARGET != HWY_SCALAR
   85|   133k|	const auto l1 = lskip / sizeof(uint8_t);
   86|       |
   87|       |#if !defined(HAVE_HWY_1_1_0) && \
   88|       |	(HWY_ARCH_RVV || (HWY_ARCH_ARM_A64 && HWY_TARGET <= HWY_SVE))
   89|       |	/* Ensure we do not cross 128-bit block boundaries on RVV/SVE.
   90|       |	 */
   91|       |	const int32_t N = 16;
   92|       |#else
   93|   133k|	const int32_t N = Lanes(du8);
   94|   133k|#endif
   95|       |
   96|   133k|	const auto zero = Zero(du8);
   97|   133k|	const auto initial = Set(di32, VIPS_INTERPOLATE_SCALE >> 1);
  ------------------
  |  |  120|   133k|#define VIPS_INTERPOLATE_SCALE (1 << VIPS_INTERPOLATE_SHIFT)
  |  |  ------------------
  |  |  |  |  119|   133k|#define VIPS_INTERPOLATE_SHIFT (12)
  |  |  ------------------
  ------------------
   98|       |
   99|       |	/* Main loop: unrolled.
  100|       |	 */
  101|   133k|	int32_t x = 0;
  102|   631k|	for (; x + N <= ne; x += N) {
  ------------------
  |  Branch (102:9): [True: 498k, False: 133k]
  ------------------
  103|   498k|		auto *HWY_RESTRICT p = (uint8_t *) pin + x;
  104|   498k|		auto *HWY_RESTRICT q = (uint8_t *) pout + x;
  105|       |
  106|   498k|#if HWY_ARCH_X86 || HWY_ARCH_WASM || HWY_TARGET == HWY_EMU128
  107|       |		/* Initialize the sum with the addition on x86 and Wasm,
  108|       |		 * avoids an extra add instruction. Should be safe given
  109|       |		 * that only one accumulator is used.
  110|       |		 */
  111|   498k|		auto sum0 = initial;
  112|   498k|		auto sum2 = initial;
  113|   498k|		auto sum4 = initial;
  114|   498k|		auto sum6 = initial;
  115|       |#else
  116|       |		auto sum0 = Zero(di32);
  117|       |		auto sum2 = Zero(di32);
  118|       |		auto sum4 = Zero(di32);
  119|       |		auto sum6 = Zero(di32);
  120|       |#endif
  121|   498k|		auto sum1 = Zero(di32); /* unused on x86 and Wasm */
  122|   498k|		auto sum3 = Zero(di32); /* unused on x86 and Wasm */
  123|   498k|		auto sum5 = Zero(di32); /* unused on x86 and Wasm */
  124|   498k|		auto sum7 = Zero(di32); /* unused on x86 and Wasm */
  125|       |
  126|   498k|		int32_t i = 0;
  127|  4.40M|		for (; i + 2 <= n; i += 2) {
  ------------------
  |  Branch (127:10): [True: 3.90M, False: 498k]
  ------------------
  128|       |			/* Load two coefficients at once.
  129|       |			 */
  130|  3.90M|			auto mmk = BitCast(di16, Set(di32, *(int32_t *) &k[i]));
  131|       |
  132|  3.90M|			auto top = LoadU(du8, p); /* top line */
  133|  3.90M|			p += l1;
  134|  3.90M|			auto bottom = LoadU(du8, p); /* bottom line */
  135|  3.90M|			p += l1;
  136|       |
  137|  3.90M|			auto source = InterleaveLower(top, bottom);
  138|  3.90M|			auto pix = BitCast(di16, InterleaveLower(source, zero));
  139|       |
  140|  3.90M|			sum0 = ReorderWidenMulAccumulate(di32, pix, mmk, sum0,
  141|  3.90M|				/* byref */ sum1);
  142|       |
  143|  3.90M|			pix = BitCast(di16, InterleaveUpper(du8, source, zero));
  144|       |
  145|  3.90M|			sum2 = ReorderWidenMulAccumulate(di32, pix, mmk, sum2,
  146|  3.90M|				/* byref */ sum3);
  147|       |
  148|  3.90M|			source = InterleaveUpper(du8, top, bottom);
  149|  3.90M|			pix = BitCast(di16, InterleaveLower(source, zero));
  150|       |
  151|  3.90M|			sum4 = ReorderWidenMulAccumulate(di32, pix, mmk, sum4,
  152|  3.90M|				/* byref */ sum5);
  153|       |
  154|  3.90M|			pix = BitCast(di16, InterleaveUpper(du8, source, zero));
  155|       |
  156|  3.90M|			sum6 = ReorderWidenMulAccumulate(di32, pix, mmk, sum6,
  157|  3.90M|				/* byref */ sum7);
  158|  3.90M|		}
  159|   996k|		for (; i < n; ++i) {
  ------------------
  |  Branch (159:10): [True: 498k, False: 498k]
  ------------------
  160|   498k|			auto mmk = Set(di16, k[i]);
  161|       |
  162|   498k|			auto top = LoadU(du8, p);
  163|   498k|			p += l1;
  164|       |
  165|   498k|			auto source = InterleaveLower(top, zero);
  166|   498k|			auto pix = BitCast(di16, InterleaveLower(source, zero));
  167|       |
  168|   498k|			sum0 = ReorderWidenMulAccumulate(di32, pix, mmk, sum0,
  169|   498k|				/* byref */ sum1);
  170|       |
  171|   498k|			pix = BitCast(di16, InterleaveUpper(du8, source, zero));
  172|       |
  173|   498k|			sum2 = ReorderWidenMulAccumulate(di32, pix, mmk, sum2,
  174|   498k|				/* byref */ sum3);
  175|       |
  176|   498k|			source = InterleaveUpper(du8, top, zero);
  177|   498k|			pix = BitCast(di16, InterleaveLower(source, zero));
  178|       |
  179|   498k|			sum4 = ReorderWidenMulAccumulate(di32, pix, mmk, sum4,
  180|   498k|				/* byref */ sum5);
  181|       |
  182|   498k|			pix = BitCast(di16, InterleaveUpper(du8, source, zero));
  183|       |
  184|   498k|			sum6 = ReorderWidenMulAccumulate(di32, pix, mmk, sum6,
  185|   498k|				/* byref */ sum7);
  186|   498k|		}
  187|       |
  188|   498k|		sum0 = RearrangeToOddPlusEven(sum0, sum1);
  189|   498k|		sum2 = RearrangeToOddPlusEven(sum2, sum3);
  190|   498k|		sum4 = RearrangeToOddPlusEven(sum4, sum5);
  191|   498k|		sum6 = RearrangeToOddPlusEven(sum6, sum7);
  192|       |
  193|       |#if !(HWY_ARCH_X86 || HWY_ARCH_WASM || HWY_TARGET == HWY_EMU128)
  194|       |		sum0 = Add(sum0, initial);
  195|       |		sum2 = Add(sum2, initial);
  196|       |		sum4 = Add(sum4, initial);
  197|       |		sum6 = Add(sum6, initial);
  198|       |#endif
  199|       |
  200|       |		/* The final 32->8 conversion.
  201|       |		 */
  202|   498k|		sum0 = ShiftRight<VIPS_INTERPOLATE_SHIFT>(sum0);
  203|   498k|		sum2 = ShiftRight<VIPS_INTERPOLATE_SHIFT>(sum2);
  204|   498k|		sum4 = ShiftRight<VIPS_INTERPOLATE_SHIFT>(sum4);
  205|   498k|		sum6 = ShiftRight<VIPS_INTERPOLATE_SHIFT>(sum6);
  206|       |
  207|       |#if HWY_ARCH_RVV || (HWY_ARCH_ARM_A64 && HWY_TARGET <= HWY_SVE)
  208|       |		/* RVV/SVE defines demotion as writing to the upper or lower half
  209|       |		 * of each lane, rather than compacting them within a vector.
  210|       |		 */
  211|       |		auto demoted0 = DemoteTo(du8x32, sum0);
  212|       |		auto demoted1 = DemoteTo(du8x32, sum2);
  213|       |		auto demoted2 = DemoteTo(du8x32, sum4);
  214|       |		auto demoted3 = DemoteTo(du8x32, sum6);
  215|       |
  216|       |		StoreU(demoted0, du8x32, q + 0 * N / 4);
  217|       |		StoreU(demoted1, du8x32, q + 1 * N / 4);
  218|       |		StoreU(demoted2, du8x32, q + 2 * N / 4);
  219|       |		StoreU(demoted3, du8x32, q + 3 * N / 4);
  220|       |#else
  221|   498k|		auto demoted0 = ReorderDemote2To(di16, sum0, sum2);
  222|   498k|		auto demoted2 = ReorderDemote2To(di16, sum4, sum6);
  223|   498k|		auto demoted = ReorderDemote2To(du8, demoted0, demoted2);
  224|       |
  225|   498k|		StoreU(demoted, du8, q);
  226|   498k|#endif
  227|   498k|	}
  228|       |
  229|       |	/* `ne` was not a multiple of the vector length `N`;
  230|       |	 * proceed one by one.
  231|       |	 */
  232|  1.91M|	for (; x < ne; ++x) {
  ------------------
  |  Branch (232:9): [True: 1.78M, False: 133k]
  ------------------
  233|  1.78M|		auto *HWY_RESTRICT p = (uint8_t *) pin + x;
  234|  1.78M|		auto *HWY_RESTRICT q = (uint8_t *) pout + x;
  235|       |
  236|  1.78M|#if HWY_ARCH_X86 || HWY_ARCH_WASM || HWY_TARGET == HWY_EMU128
  237|       |		/* Initialize the sum with the addition on x86 and Wasm,
  238|       |		 * avoids an extra add instruction. Should be safe given
  239|       |		 * that only one accumulator is used.
  240|       |		 */
  241|  1.78M|		auto sum0 = initial;
  242|       |#else
  243|       |		auto sum0 = Zero(di32);
  244|       |#endif
  245|  1.78M|		auto sum1 = Zero(di32); /* unused on x86 and Wasm */
  246|       |
  247|  1.78M|		int32_t i = 0;
  248|  14.9M|		for (; i + 2 <= n; i += 2) {
  ------------------
  |  Branch (248:10): [True: 13.2M, False: 1.78M]
  ------------------
  249|       |			/* Load two coefficients at once.
  250|       |			 */
  251|  13.2M|			auto mmk = BitCast(di16, Set(di32, *(int32_t *) &k[i]));
  252|       |
  253|  13.2M|			auto top = LoadU(du8x16, p); /* top line */
  254|  13.2M|			p += l1;
  255|  13.2M|			auto bottom = LoadU(du8x16, p); /* bottom line */
  256|  13.2M|			p += l1;
  257|       |
  258|  13.2M|			auto source = InterleaveLower(top, bottom);
  259|  13.2M|			auto pix = PromoteTo(di16, source);
  260|       |
  261|  13.2M|			sum0 = ReorderWidenMulAccumulate(di32, pix, mmk, sum0,
  262|  13.2M|				/* byref */ sum1);
  263|  13.2M|		}
  264|  3.56M|		for (; i < n; ++i) {
  ------------------
  |  Branch (264:10): [True: 1.78M, False: 1.78M]
  ------------------
  265|  1.78M|			auto mmk = Set(di16, k[i]);
  266|       |
  267|  1.78M|			auto top = LoadU(du8x32, p);
  268|  1.78M|			p += l1;
  269|       |
  270|  1.78M|			auto source = PromoteTo(di32, top);
  271|  1.78M|			auto pix = BitCast(di16, source);
  272|       |
  273|  1.78M|			sum0 = ReorderWidenMulAccumulate(di32, pix, mmk, sum0,
  274|  1.78M|				/* byref */ sum1);
  275|  1.78M|		}
  276|       |
  277|  1.78M|		sum0 = RearrangeToOddPlusEven(sum0, sum1);
  278|       |
  279|       |#if !(HWY_ARCH_X86 || HWY_ARCH_WASM || HWY_TARGET == HWY_EMU128)
  280|       |		sum0 = Add(sum0, initial);
  281|       |#endif
  282|       |
  283|       |		/* The final 32->8 conversion.
  284|       |		 */
  285|  1.78M|		sum0 = ShiftRight<VIPS_INTERPOLATE_SHIFT>(sum0);
  286|       |
  287|  1.78M|		auto demoted = DemoteTo(du8x32, sum0);
  288|  1.78M|		*q = GetLane(demoted);
  289|  1.78M|	}
  290|   133k|#endif
  291|   133k|}
vips_reducev_uchar_hwy:
  304|   133k|{
  305|       |	/* clang-format off */
  306|   133k|	HWY_DYNAMIC_DISPATCH(vips_reducev_uchar_hwy)(pout, pin, n, ne, lskip, k);
  ------------------
  |  |  570|   133k|#define HWY_DYNAMIC_DISPATCH(FUNC_NAME) (*(HWY_DYNAMIC_POINTER(FUNC_NAME)))
  |  |  ------------------
  |  |  |  |  567|   133k|  (HWY_DISPATCH_TABLE(FUNC_NAME)[hwy::GetChosenTarget().GetIndex()])
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   133k|  HWY_CONCAT(FUNC_NAME, HighwayDispatchTable)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  204|   133k|#define HWY_CONCAT(a, b) HWY_CONCAT_IMPL(a, b)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  203|   133k|#define HWY_CONCAT_IMPL(a, b) a##b
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  307|       |	/* clang-format on */
  308|   133k|}

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|}
resample.c:vips_resample_build:
  109|  48.1k|{
  110|  48.1k|	VipsResample *resample = VIPS_RESAMPLE(object);
  ------------------
  |  |   40|  48.1k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  48.1k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  48.1k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  48.1k|		VIPS_TYPE_RESAMPLE, VipsResample))
  ------------------
  111|       |
  112|       |#ifdef DEBUG
  113|       |	printf("vips_resample_build: ");
  114|       |	vips_object_print_name(object);
  115|       |	printf("\n");
  116|       |#endif /*DEBUG*/
  117|       |
  118|  48.1k|	g_object_set(resample, "out", vips_image_new(), NULL);
  119|       |
  120|  48.1k|	if (VIPS_OBJECT_CLASS(vips_resample_parent_class)->build(object))
  ------------------
  |  |  435|  48.1k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  48.1k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  48.1k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (120:6): [True: 0, False: 48.1k]
  ------------------
  121|      0|		return -1;
  122|       |
  123|  48.1k|	return 0;
  124|  48.1k|}
resample.c:vips_resample_init:
  154|  48.1k|{
  155|  48.1k|}

vips_resize:
  448|  19.0k|{
  449|  19.0k|	va_list ap;
  450|  19.0k|	int result;
  451|       |
  452|  19.0k|	va_start(ap, scale);
  453|  19.0k|	result = vips_call_split("resize", ap, in, out, scale);
  454|  19.0k|	va_end(ap);
  455|       |
  456|  19.0k|	return result;
  457|  19.0k|}
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|}
resize.c:vips_resize_build:
  136|  19.0k|{
  137|  19.0k|	VipsResample *resample = VIPS_RESAMPLE(object);
  ------------------
  |  |   40|  19.0k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  19.0k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  19.0k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  19.0k|		VIPS_TYPE_RESAMPLE, VipsResample))
  ------------------
  138|  19.0k|	VipsResize *resize = (VipsResize *) object;
  139|       |
  140|  19.0k|	VipsImage **t = (VipsImage **) vips_object_local_array(object, 5);
  141|       |
  142|  19.0k|	VipsImage *in;
  143|  19.0k|	double hscale;
  144|  19.0k|	double vscale;
  145|  19.0k|	int int_hshrink;
  146|  19.0k|	int int_vshrink;
  147|       |
  148|  19.0k|	if (VIPS_OBJECT_CLASS(vips_resize_parent_class)->build(object))
  ------------------
  |  |  435|  19.0k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  19.0k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  19.0k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (148:6): [True: 0, False: 19.0k]
  ------------------
  149|      0|		return -1;
  150|       |
  151|  19.0k|	in = resample->in;
  152|       |
  153|       |	/* Updated below when we do the int part of our shrink.
  154|       |	 */
  155|  19.0k|	hscale = resize->scale;
  156|  19.0k|	if (vips_object_argument_isset(object, "vscale"))
  ------------------
  |  Branch (156:6): [True: 19.0k, False: 0]
  ------------------
  157|  19.0k|		vscale = resize->vscale;
  158|      0|	else
  159|      0|		vscale = resize->scale;
  160|       |
  161|       |	/* Unpack for processing.
  162|       |	 */
  163|  19.0k|	if (vips_image_decode(in, &t[0]))
  ------------------
  |  Branch (163:6): [True: 0, False: 19.0k]
  ------------------
  164|      0|		return -1;
  165|  19.0k|	in = t[0];
  166|       |
  167|  19.0k|	if (resize->kernel == VIPS_KERNEL_NEAREST) {
  ------------------
  |  Branch (167:6): [True: 0, False: 19.0k]
  ------------------
  168|      0|		int target_width;
  169|      0|		int target_height;
  170|       |
  171|       |		/* The int part of our scale.
  172|       |		 */
  173|      0|		if (resize->gap < 1.0) {
  ------------------
  |  Branch (173:7): [True: 0, False: 0]
  ------------------
  174|      0|			int_hshrink = VIPS_FLOOR(1.0 / hscale);
  ------------------
  |  |   72|      0|#define VIPS_FLOOR(V) __builtin_floor(V)
  ------------------
  175|      0|			int_vshrink = VIPS_FLOOR(1.0 / vscale);
  ------------------
  |  |   72|      0|#define VIPS_FLOOR(V) __builtin_floor(V)
  ------------------
  176|      0|		}
  177|      0|		else {
  178|      0|			target_width = VIPS_ROUND_UINT(in->Xsize * hscale);
  ------------------
  |  |  106|      0|#define VIPS_ROUND_UINT(R) ((int) ((R) + 0.5))
  ------------------
  179|      0|			target_height = VIPS_ROUND_UINT(in->Ysize * vscale);
  ------------------
  |  |  106|      0|#define VIPS_ROUND_UINT(R) ((int) ((R) + 0.5))
  ------------------
  180|       |
  181|      0|			int_hshrink = VIPS_FLOOR(
  ------------------
  |  |   72|      0|#define VIPS_FLOOR(V) __builtin_floor(V)
  ------------------
  182|      0|				(double) in->Xsize / target_width /
  183|      0|				resize->gap);
  184|      0|			int_vshrink = VIPS_FLOOR(
  ------------------
  |  |   72|      0|#define VIPS_FLOOR(V) __builtin_floor(V)
  ------------------
  185|      0|				(double) in->Ysize / target_height /
  186|      0|				resize->gap);
  187|      0|		}
  188|       |
  189|      0|		int_hshrink = VIPS_MAX(1, int_hshrink);
  ------------------
  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  190|      0|		int_vshrink = VIPS_MAX(1, int_vshrink);
  ------------------
  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  191|       |
  192|      0|		if (int_vshrink > 1 ||
  ------------------
  |  Branch (192:7): [True: 0, False: 0]
  ------------------
  193|      0|			int_hshrink > 1) {
  ------------------
  |  Branch (193:4): [True: 0, False: 0]
  ------------------
  194|      0|			g_info("subsample by %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__)
  ------------------
  195|      0|				int_hshrink, int_vshrink);
  196|      0|			if (vips_subsample(in, &t[1],
  ------------------
  |  Branch (196:8): [True: 0, False: 0]
  ------------------
  197|      0|					int_hshrink, int_vshrink, NULL))
  198|      0|				return -1;
  199|      0|			in = t[1];
  200|       |
  201|      0|			hscale *= int_hshrink;
  202|      0|			vscale *= int_vshrink;
  203|      0|		}
  204|      0|	}
  205|       |
  206|       |	/* Don't let either axis drop below 1 px.
  207|       |	 */
  208|  19.0k|	hscale = VIPS_MAX(hscale, 1.0 / in->Xsize);
  ------------------
  |  |   54|  19.0k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 19.0k, False: 0]
  |  |  ------------------
  ------------------
  209|  19.0k|	vscale = VIPS_MAX(vscale, 1.0 / in->Ysize);
  ------------------
  |  |   54|  19.0k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 19.0k, False: 0]
  |  |  ------------------
  ------------------
  210|       |
  211|       |	/* Any residual downsizing.
  212|       |	 */
  213|  19.0k|	if (vscale < 1.0) {
  ------------------
  |  Branch (213:6): [True: 13.0k, False: 5.99k]
  ------------------
  214|  13.0k|		g_info("residual reducev by %g", vscale);
  ------------------
  |  |  341|  13.0k|#define g_info(...)     g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|  13.0k|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  342|  13.0k|                               G_LOG_LEVEL_INFO,     \
  |  |  343|  13.0k|                               __VA_ARGS__)
  ------------------
  215|  13.0k|		if (vips_reducev(in, &t[2], 1.0 / vscale,
  ------------------
  |  Branch (215:7): [True: 0, False: 13.0k]
  ------------------
  216|  13.0k|				"kernel", resize->kernel,
  217|  13.0k|				"gap", resize->gap,
  218|  13.0k|				NULL))
  219|      0|			return -1;
  220|  13.0k|		in = t[2];
  221|  13.0k|	}
  222|       |
  223|  19.0k|	if (hscale < 1.0) {
  ------------------
  |  Branch (223:6): [True: 15.9k, False: 3.10k]
  ------------------
  224|  15.9k|		g_info("residual reduceh by %g", hscale);
  ------------------
  |  |  341|  15.9k|#define g_info(...)     g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|  15.9k|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  342|  15.9k|                               G_LOG_LEVEL_INFO,     \
  |  |  343|  15.9k|                               __VA_ARGS__)
  ------------------
  225|  15.9k|		if (vips_reduceh(in, &t[3], 1.0 / hscale,
  ------------------
  |  Branch (225:7): [True: 0, False: 15.9k]
  ------------------
  226|  15.9k|				"kernel", resize->kernel,
  227|  15.9k|				"gap", resize->gap,
  228|  15.9k|				NULL))
  229|      0|			return -1;
  230|  15.9k|		in = t[3];
  231|  15.9k|	}
  232|       |
  233|       |	/* Any upsizing.
  234|       |	 */
  235|  19.0k|	if (hscale > 1.0 ||
  ------------------
  |  Branch (235:6): [True: 0, False: 19.0k]
  ------------------
  236|  19.0k|		vscale > 1.0) {
  ------------------
  |  Branch (236:3): [True: 0, False: 19.0k]
  ------------------
  237|      0|		const char *nickname =
  238|      0|			vips_resize_interpolate(resize->kernel);
  239|       |
  240|       |		/* Input displacement. For centre sampling, shift by 0.5 down
  241|       |		 * and right. Except if this is nearest, which is always
  242|       |		 * centre.
  243|       |		 */
  244|      0|		const double id = resize->kernel == VIPS_KERNEL_NEAREST
  ------------------
  |  Branch (244:21): [True: 0, False: 0]
  ------------------
  245|      0|			? 0.0
  246|      0|			: 0.5;
  247|       |
  248|      0|		VipsInterpolate *interpolate;
  249|       |
  250|      0|		if (!(interpolate = vips_interpolate_new(nickname)))
  ------------------
  |  Branch (250:7): [True: 0, False: 0]
  ------------------
  251|      0|			return -1;
  252|      0|		vips_object_local(object, interpolate);
  ------------------
  |  |  698|      0|	(g_signal_connect(V, "close", G_CALLBACK(vips_object_local_cb), G))
  |  |  ------------------
  |  |  |  |  491|      0|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  |  |  ------------------
  ------------------
  253|       |
  254|      0|		if (resize->kernel == VIPS_KERNEL_NEAREST &&
  ------------------
  |  Branch (254:7): [True: 0, False: 0]
  ------------------
  255|      0|			hscale == VIPS_FLOOR(hscale) &&
  ------------------
  |  |   72|      0|#define VIPS_FLOOR(V) __builtin_floor(V)
  ------------------
  |  Branch (255:4): [True: 0, False: 0]
  ------------------
  256|      0|			vscale == VIPS_FLOOR(vscale)) {
  ------------------
  |  |   72|      0|#define VIPS_FLOOR(V) __builtin_floor(V)
  ------------------
  |  Branch (256:4): [True: 0, False: 0]
  ------------------
  257|       |			/* Fast, integral nearest neighbour enlargement
  258|       |			 */
  259|      0|			if (vips_zoom(in, &t[4], VIPS_FLOOR(hscale),
  ------------------
  |  |   72|      0|#define VIPS_FLOOR(V) __builtin_floor(V)
  ------------------
  |  Branch (259:8): [True: 0, False: 0]
  ------------------
  260|      0|					VIPS_FLOOR(vscale), NULL))
  ------------------
  |  |   72|      0|#define VIPS_FLOOR(V) __builtin_floor(V)
  ------------------
  261|      0|				return -1;
  262|      0|			in = t[4];
  263|      0|		}
  264|      0|		else if (hscale > 1.0 &&
  ------------------
  |  Branch (264:12): [True: 0, False: 0]
  ------------------
  265|      0|			vscale > 1.0) {
  ------------------
  |  Branch (265:4): [True: 0, False: 0]
  ------------------
  266|      0|			g_info("residual scale %g x %g", hscale, vscale);
  ------------------
  |  |  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__)
  ------------------
  267|      0|			if (vips_affine(in, &t[4],
  ------------------
  |  Branch (267:8): [True: 0, False: 0]
  ------------------
  268|      0|					hscale, 0.0, 0.0, vscale,
  269|      0|					"interpolate", interpolate,
  270|      0|					"idx", id,
  271|      0|					"idy", id,
  272|      0|					"extend", VIPS_EXTEND_COPY,
  273|      0|					"premultiplied", TRUE,
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  274|      0|					NULL))
  275|      0|				return -1;
  276|      0|			in = t[4];
  277|      0|		}
  278|      0|		else if (hscale > 1.0) {
  ------------------
  |  Branch (278:12): [True: 0, False: 0]
  ------------------
  279|      0|			g_info("residual scale %g", hscale);
  ------------------
  |  |  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__)
  ------------------
  280|      0|			if (vips_affine(in, &t[4], hscale, 0.0, 0.0, 1.0,
  ------------------
  |  Branch (280:8): [True: 0, False: 0]
  ------------------
  281|      0|					"interpolate", interpolate,
  282|      0|					"idx", id,
  283|      0|					"idy", id,
  284|      0|					"extend", VIPS_EXTEND_COPY,
  285|      0|					"premultiplied", TRUE,
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  286|      0|					NULL))
  287|      0|				return -1;
  288|      0|			in = t[4];
  289|      0|		}
  290|      0|		else {
  291|      0|			g_info("residual scale %g", vscale);
  ------------------
  |  |  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__)
  ------------------
  292|      0|			if (vips_affine(in, &t[4], 1.0, 0.0, 0.0, vscale,
  ------------------
  |  Branch (292:8): [True: 0, False: 0]
  ------------------
  293|      0|					"interpolate", interpolate,
  294|      0|					"idx", id,
  295|      0|					"idy", id,
  296|      0|					"extend", VIPS_EXTEND_COPY,
  297|      0|					"premultiplied", TRUE,
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  298|      0|					NULL))
  299|      0|				return -1;
  300|      0|			in = t[4];
  301|      0|		}
  302|      0|	}
  303|       |
  304|  19.0k|	if (vips_image_write(in, resample->out))
  ------------------
  |  Branch (304:6): [True: 0, False: 19.0k]
  ------------------
  305|      0|		return -1;
  306|       |
  307|  19.0k|	return 0;
  308|  19.0k|}
resize.c:vips_resize_init:
  393|  19.0k|{
  394|  19.0k|	resize->gap = 2.0;
  395|  19.0k|	resize->kernel = VIPS_KERNEL_LANCZOS3;
  396|  19.0k|}

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|}

reduceh.cpp:_ZL21vips_reduce_make_maskIdEvPT_10VipsKernelidd:
  480|  1.03M|{
  481|  1.03M|	switch (kernel) {
  482|      0|	case VIPS_KERNEL_NEAREST:
  ------------------
  |  Branch (482:2): [True: 0, False: 1.03M]
  ------------------
  483|      0|		c[0] = 1.0;
  484|      0|		break;
  485|       |
  486|      0|	case VIPS_KERNEL_LINEAR:
  ------------------
  |  Branch (486:2): [True: 0, False: 1.03M]
  ------------------
  487|      0|		calculate_coefficients(c, n_points,
  488|      0|			filter<VIPS_KERNEL_LINEAR>, shrink, x);
  489|      0|		break;
  490|       |
  491|      0|	case VIPS_KERNEL_CUBIC:
  ------------------
  |  Branch (491:2): [True: 0, False: 1.03M]
  ------------------
  492|      0|		calculate_coefficients(c, n_points,
  493|      0|			filter<VIPS_KERNEL_CUBIC>, shrink, x);
  494|      0|		break;
  495|       |
  496|      0|	case VIPS_KERNEL_MITCHELL:
  ------------------
  |  Branch (496:2): [True: 0, False: 1.03M]
  ------------------
  497|      0|		calculate_coefficients(c, n_points,
  498|      0|			filter<VIPS_KERNEL_MITCHELL>, shrink, x);
  499|      0|		break;
  500|       |
  501|      0|	case VIPS_KERNEL_LANCZOS2:
  ------------------
  |  Branch (501:2): [True: 0, False: 1.03M]
  ------------------
  502|      0|		calculate_coefficients(c, n_points,
  503|      0|			filter<VIPS_KERNEL_LANCZOS2>, shrink, x);
  504|      0|		break;
  505|       |
  506|  1.03M|	case VIPS_KERNEL_LANCZOS3:
  ------------------
  |  Branch (506:2): [True: 1.03M, False: 0]
  ------------------
  507|  1.03M|		calculate_coefficients(c, n_points,
  508|  1.03M|			filter<VIPS_KERNEL_LANCZOS3>, shrink, x);
  509|  1.03M|		break;
  510|       |
  511|      0|	case VIPS_KERNEL_MKS2013:
  ------------------
  |  Branch (511:2): [True: 0, False: 1.03M]
  ------------------
  512|      0|		calculate_coefficients(c, n_points,
  513|      0|			filter<VIPS_KERNEL_MKS2013>, shrink, x);
  514|      0|		break;
  515|       |
  516|      0|	case VIPS_KERNEL_MKS2021:
  ------------------
  |  Branch (516:2): [True: 0, False: 1.03M]
  ------------------
  517|      0|		calculate_coefficients(c, n_points,
  518|      0|			filter<VIPS_KERNEL_MKS2021>, shrink, x);
  519|      0|		break;
  520|       |
  521|      0|	default:
  ------------------
  |  Branch (521:2): [True: 0, False: 1.03M]
  ------------------
  522|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  523|      0|		break;
  524|  1.03M|	}
  525|  1.03M|}
reduceh.cpp:_ZL22calculate_coefficientsIdEvPT_iPFddEdd:
  455|  1.03M|{
  456|  1.03M|	const double half = x + n_points / 2.0 - 1;
  457|       |
  458|  1.03M|	int i;
  459|  1.03M|	T sum;
  460|       |
  461|  1.03M|	sum = 0.0;
  462|  16.1M|	for (i = 0; i < n_points; i++) {
  ------------------
  |  Branch (462:14): [True: 15.1M, False: 1.03M]
  ------------------
  463|  15.1M|		const double xp = (i - half) / shrink;
  464|  15.1M|		double l = filter_fn(xp);
  465|       |
  466|  15.1M|		c[i] = l;
  467|  15.1M|		sum += l;
  468|  15.1M|	}
  469|       |
  470|  16.1M|	for (i = 0; i < n_points; i++)
  ------------------
  |  Branch (470:14): [True: 15.1M, False: 1.03M]
  ------------------
  471|  15.1M|		c[i] /= sum;
  472|  1.03M|}
reduceh.cpp:_ZL11sinc_filterd:
  347|  27.9M|{
  348|  27.9M|	if (x == 0.0)
  ------------------
  |  Branch (348:6): [True: 31.9k, False: 27.9M]
  ------------------
  349|  31.9k|		return 1.0;
  350|       |
  351|  27.9M|	x = x * VIPS_PI;
  ------------------
  |  |   47|  27.9M|#define VIPS_PI (3.14159265358979323846)
  ------------------
  352|       |
  353|  27.9M|	return sin(x) / x;
  354|  27.9M|}
reduceh.cpp:_ZL6filterIL10VipsKernel5EEdd:
  397|  15.1M|{
  398|  15.1M|	if (x >= -3 && x <= 3)
  ------------------
  |  Branch (398:6): [True: 14.5M, False: 575k]
  |  Branch (398:17): [True: 13.9M, False: 575k]
  ------------------
  399|  13.9M|		return sinc_filter(x) * sinc_filter(x / 3);
  400|       |
  401|  1.15M|	return 0.0;
  402|  15.1M|}
reduceh.cpp:_ZL10reduce_sumIhsiET1_PKT_iPKT0_i:
  567|  3.17M|{
  568|  3.17M|	IT sum;
  569|       |
  570|  3.17M|	sum = 0;
  571|  54.3M|	for (int i = 0; i < n; i++) {
  ------------------
  |  Branch (571:18): [True: 51.2M, False: 3.17M]
  ------------------
  572|  51.2M|		sum += (IT) c[i] * in[0];
  573|  51.2M|		in += stride;
  574|  51.2M|	}
  575|       |
  576|  3.17M|	return sum;
  577|  3.17M|}
reduceh.cpp:_ZL20unsigned_fixed_roundIiET_S0_:
  153|  3.84M|{
  154|  3.84M|	const int round_by = VIPS_INTERPOLATE_SCALE >> 1;
  ------------------
  |  |  120|  3.84M|#define VIPS_INTERPOLATE_SCALE (1 << VIPS_INTERPOLATE_SHIFT)
  |  |  ------------------
  |  |  |  |  119|  3.84M|#define VIPS_INTERPOLATE_SHIFT (12)
  |  |  ------------------
  ------------------
  155|       |
  156|  3.84M|	return (v + round_by) >> VIPS_INTERPOLATE_SHIFT;
  ------------------
  |  |  119|  3.84M|#define VIPS_INTERPOLATE_SHIFT (12)
  ------------------
  157|  3.84M|}
reduceh.cpp:_ZL10reduce_sumIasiET1_PKT_iPKT0_i:
  567|   368k|{
  568|   368k|	IT sum;
  569|       |
  570|   368k|	sum = 0;
  571|  3.69M|	for (int i = 0; i < n; i++) {
  ------------------
  |  Branch (571:18): [True: 3.32M, False: 368k]
  ------------------
  572|  3.32M|		sum += (IT) c[i] * in[0];
  573|  3.32M|		in += stride;
  574|  3.32M|	}
  575|       |
  576|   368k|	return sum;
  577|   368k|}
reduceh.cpp:_ZL18signed_fixed_roundIiET_S0_:
  204|   573k|{
  205|   573k|	const int sign_of_v = 2 * (v >= 0) - 1;
  206|   573k|	const int round_by = sign_of_v * (VIPS_INTERPOLATE_SCALE >> 1);
  ------------------
  |  |  120|   573k|#define VIPS_INTERPOLATE_SCALE (1 << VIPS_INTERPOLATE_SHIFT)
  |  |  ------------------
  |  |  |  |  119|   573k|#define VIPS_INTERPOLATE_SHIFT (12)
  |  |  ------------------
  ------------------
  207|       |
  208|   573k|	return (v + round_by) >> VIPS_INTERPOLATE_SHIFT;
  ------------------
  |  |  119|   573k|#define VIPS_INTERPOLATE_SHIFT (12)
  ------------------
  209|   573k|}
reduceh.cpp:_ZL10reduce_sumItsiET1_PKT_iPKT0_i:
  567|   672k|{
  568|   672k|	IT sum;
  569|       |
  570|   672k|	sum = 0;
  571|  8.52M|	for (int i = 0; i < n; i++) {
  ------------------
  |  Branch (571:18): [True: 7.85M, False: 672k]
  ------------------
  572|  7.85M|		sum += (IT) c[i] * in[0];
  573|  7.85M|		in += stride;
  574|  7.85M|	}
  575|       |
  576|   672k|	return sum;
  577|   672k|}
reduceh.cpp:_ZL10reduce_sumIssiET1_PKT_iPKT0_i:
  567|   204k|{
  568|   204k|	IT sum;
  569|       |
  570|   204k|	sum = 0;
  571|  2.11M|	for (int i = 0; i < n; i++) {
  ------------------
  |  Branch (571:18): [True: 1.91M, False: 204k]
  ------------------
  572|  1.91M|		sum += (IT) c[i] * in[0];
  573|  1.91M|		in += stride;
  574|  1.91M|	}
  575|       |
  576|   204k|	return sum;
  577|   204k|}
reduceh.cpp:_ZL10reduce_sumIjslET1_PKT_iPKT0_i:
  567|   299k|{
  568|   299k|	IT sum;
  569|       |
  570|   299k|	sum = 0;
  571|  3.10M|	for (int i = 0; i < n; i++) {
  ------------------
  |  Branch (571:18): [True: 2.80M, False: 299k]
  ------------------
  572|  2.80M|		sum += (IT) c[i] * in[0];
  573|  2.80M|		in += stride;
  574|  2.80M|	}
  575|       |
  576|   299k|	return sum;
  577|   299k|}
reduceh.cpp:_ZL20unsigned_fixed_roundIlET_S0_:
  153|   299k|{
  154|   299k|	const int round_by = VIPS_INTERPOLATE_SCALE >> 1;
  ------------------
  |  |  120|   299k|#define VIPS_INTERPOLATE_SCALE (1 << VIPS_INTERPOLATE_SHIFT)
  |  |  ------------------
  |  |  |  |  119|   299k|#define VIPS_INTERPOLATE_SHIFT (12)
  |  |  ------------------
  ------------------
  155|       |
  156|   299k|	return (v + round_by) >> VIPS_INTERPOLATE_SHIFT;
  ------------------
  |  |  119|   299k|#define VIPS_INTERPOLATE_SHIFT (12)
  ------------------
  157|   299k|}
reduceh.cpp:_ZL10reduce_sumIislET1_PKT_iPKT0_i:
  567|   136k|{
  568|   136k|	IT sum;
  569|       |
  570|   136k|	sum = 0;
  571|  1.36M|	for (int i = 0; i < n; i++) {
  ------------------
  |  Branch (571:18): [True: 1.22M, False: 136k]
  ------------------
  572|  1.22M|		sum += (IT) c[i] * in[0];
  573|  1.22M|		in += stride;
  574|  1.22M|	}
  575|       |
  576|   136k|	return sum;
  577|   136k|}
reduceh.cpp:_ZL18signed_fixed_roundIlET_S0_:
  204|   136k|{
  205|   136k|	const int sign_of_v = 2 * (v >= 0) - 1;
  206|   136k|	const int round_by = sign_of_v * (VIPS_INTERPOLATE_SCALE >> 1);
  ------------------
  |  |  120|   136k|#define VIPS_INTERPOLATE_SCALE (1 << VIPS_INTERPOLATE_SHIFT)
  |  |  ------------------
  |  |  |  |  119|   136k|#define VIPS_INTERPOLATE_SHIFT (12)
  |  |  ------------------
  ------------------
  207|       |
  208|   136k|	return (v + round_by) >> VIPS_INTERPOLATE_SHIFT;
  ------------------
  |  |  119|   136k|#define VIPS_INTERPOLATE_SHIFT (12)
  ------------------
  209|   136k|}
reduceh.cpp:_ZL10reduce_sumIfddET1_PKT_iPKT0_i:
  567|  7.47M|{
  568|  7.47M|	IT sum;
  569|       |
  570|  7.47M|	sum = 0;
  571|  97.2M|	for (int i = 0; i < n; i++) {
  ------------------
  |  Branch (571:18): [True: 89.7M, False: 7.47M]
  ------------------
  572|  89.7M|		sum += (IT) c[i] * in[0];
  573|  89.7M|		in += stride;
  574|  89.7M|	}
  575|       |
  576|  7.47M|	return sum;
  577|  7.47M|}
reducev.cpp:_ZL21vips_reduce_make_maskIdEvPT_10VipsKernelidd:
  480|   851k|{
  481|   851k|	switch (kernel) {
  482|      0|	case VIPS_KERNEL_NEAREST:
  ------------------
  |  Branch (482:2): [True: 0, False: 851k]
  ------------------
  483|      0|		c[0] = 1.0;
  484|      0|		break;
  485|       |
  486|      0|	case VIPS_KERNEL_LINEAR:
  ------------------
  |  Branch (486:2): [True: 0, False: 851k]
  ------------------
  487|      0|		calculate_coefficients(c, n_points,
  488|      0|			filter<VIPS_KERNEL_LINEAR>, shrink, x);
  489|      0|		break;
  490|       |
  491|      0|	case VIPS_KERNEL_CUBIC:
  ------------------
  |  Branch (491:2): [True: 0, False: 851k]
  ------------------
  492|      0|		calculate_coefficients(c, n_points,
  493|      0|			filter<VIPS_KERNEL_CUBIC>, shrink, x);
  494|      0|		break;
  495|       |
  496|      0|	case VIPS_KERNEL_MITCHELL:
  ------------------
  |  Branch (496:2): [True: 0, False: 851k]
  ------------------
  497|      0|		calculate_coefficients(c, n_points,
  498|      0|			filter<VIPS_KERNEL_MITCHELL>, shrink, x);
  499|      0|		break;
  500|       |
  501|      0|	case VIPS_KERNEL_LANCZOS2:
  ------------------
  |  Branch (501:2): [True: 0, False: 851k]
  ------------------
  502|      0|		calculate_coefficients(c, n_points,
  503|      0|			filter<VIPS_KERNEL_LANCZOS2>, shrink, x);
  504|      0|		break;
  505|       |
  506|   851k|	case VIPS_KERNEL_LANCZOS3:
  ------------------
  |  Branch (506:2): [True: 851k, False: 0]
  ------------------
  507|   851k|		calculate_coefficients(c, n_points,
  508|   851k|			filter<VIPS_KERNEL_LANCZOS3>, shrink, x);
  509|   851k|		break;
  510|       |
  511|      0|	case VIPS_KERNEL_MKS2013:
  ------------------
  |  Branch (511:2): [True: 0, False: 851k]
  ------------------
  512|      0|		calculate_coefficients(c, n_points,
  513|      0|			filter<VIPS_KERNEL_MKS2013>, shrink, x);
  514|      0|		break;
  515|       |
  516|      0|	case VIPS_KERNEL_MKS2021:
  ------------------
  |  Branch (516:2): [True: 0, False: 851k]
  ------------------
  517|      0|		calculate_coefficients(c, n_points,
  518|      0|			filter<VIPS_KERNEL_MKS2021>, shrink, x);
  519|      0|		break;
  520|       |
  521|      0|	default:
  ------------------
  |  Branch (521:2): [True: 0, False: 851k]
  ------------------
  522|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  523|      0|		break;
  524|   851k|	}
  525|   851k|}
reducev.cpp:_ZL22calculate_coefficientsIdEvPT_iPFddEdd:
  455|   851k|{
  456|   851k|	const double half = x + n_points / 2.0 - 1;
  457|       |
  458|   851k|	int i;
  459|   851k|	T sum;
  460|       |
  461|   851k|	sum = 0.0;
  462|  13.2M|	for (i = 0; i < n_points; i++) {
  ------------------
  |  Branch (462:14): [True: 12.3M, False: 851k]
  ------------------
  463|  12.3M|		const double xp = (i - half) / shrink;
  464|  12.3M|		double l = filter_fn(xp);
  465|       |
  466|  12.3M|		c[i] = l;
  467|  12.3M|		sum += l;
  468|  12.3M|	}
  469|       |
  470|  13.2M|	for (i = 0; i < n_points; i++)
  ------------------
  |  Branch (470:14): [True: 12.3M, False: 851k]
  ------------------
  471|  12.3M|		c[i] /= sum;
  472|   851k|}
reducev.cpp:_ZL11sinc_filterd:
  347|  23.1M|{
  348|  23.1M|	if (x == 0.0)
  ------------------
  |  Branch (348:6): [True: 26.1k, False: 23.1M]
  ------------------
  349|  26.1k|		return 1.0;
  350|       |
  351|  23.1M|	x = x * VIPS_PI;
  ------------------
  |  |   47|  23.1M|#define VIPS_PI (3.14159265358979323846)
  ------------------
  352|       |
  353|  23.1M|	return sin(x) / x;
  354|  23.1M|}
reducev.cpp:_ZL6filterIL10VipsKernel5EEdd:
  397|  12.3M|{
  398|  12.3M|	if (x >= -3 && x <= 3)
  ------------------
  |  Branch (398:6): [True: 11.9M, False: 389k]
  |  Branch (398:17): [True: 11.5M, False: 389k]
  ------------------
  399|  11.5M|		return sinc_filter(x) * sinc_filter(x / 3);
  400|       |
  401|   779k|	return 0.0;
  402|  12.3M|}
reducev.cpp:_ZL20unsigned_fixed_roundIiET_S0_:
  153|  1.05M|{
  154|  1.05M|	const int round_by = VIPS_INTERPOLATE_SCALE >> 1;
  ------------------
  |  |  120|  1.05M|#define VIPS_INTERPOLATE_SCALE (1 << VIPS_INTERPOLATE_SHIFT)
  |  |  ------------------
  |  |  |  |  119|  1.05M|#define VIPS_INTERPOLATE_SHIFT (12)
  |  |  ------------------
  ------------------
  155|       |
  156|  1.05M|	return (v + round_by) >> VIPS_INTERPOLATE_SHIFT;
  ------------------
  |  |  119|  1.05M|#define VIPS_INTERPOLATE_SHIFT (12)
  ------------------
  157|  1.05M|}
reducev.cpp:_ZL10reduce_sumIasiET1_PKT_iPKT0_i:
  567|   498k|{
  568|   498k|	IT sum;
  569|       |
  570|   498k|	sum = 0;
  571|  5.32M|	for (int i = 0; i < n; i++) {
  ------------------
  |  Branch (571:18): [True: 4.83M, False: 498k]
  ------------------
  572|  4.83M|		sum += (IT) c[i] * in[0];
  573|  4.83M|		in += stride;
  574|  4.83M|	}
  575|       |
  576|   498k|	return sum;
  577|   498k|}
reducev.cpp:_ZL18signed_fixed_roundIiET_S0_:
  204|   779k|{
  205|   779k|	const int sign_of_v = 2 * (v >= 0) - 1;
  206|   779k|	const int round_by = sign_of_v * (VIPS_INTERPOLATE_SCALE >> 1);
  ------------------
  |  |  120|   779k|#define VIPS_INTERPOLATE_SCALE (1 << VIPS_INTERPOLATE_SHIFT)
  |  |  ------------------
  |  |  |  |  119|   779k|#define VIPS_INTERPOLATE_SHIFT (12)
  |  |  ------------------
  ------------------
  207|       |
  208|   779k|	return (v + round_by) >> VIPS_INTERPOLATE_SHIFT;
  ------------------
  |  |  119|   779k|#define VIPS_INTERPOLATE_SHIFT (12)
  ------------------
  209|   779k|}
reducev.cpp:_ZL10reduce_sumItsiET1_PKT_iPKT0_i:
  567|  1.05M|{
  568|  1.05M|	IT sum;
  569|       |
  570|  1.05M|	sum = 0;
  571|  13.0M|	for (int i = 0; i < n; i++) {
  ------------------
  |  Branch (571:18): [True: 11.9M, False: 1.05M]
  ------------------
  572|  11.9M|		sum += (IT) c[i] * in[0];
  573|  11.9M|		in += stride;
  574|  11.9M|	}
  575|       |
  576|  1.05M|	return sum;
  577|  1.05M|}
reducev.cpp:_ZL10reduce_sumIssiET1_PKT_iPKT0_i:
  567|   280k|{
  568|   280k|	IT sum;
  569|       |
  570|   280k|	sum = 0;
  571|  3.10M|	for (int i = 0; i < n; i++) {
  ------------------
  |  Branch (571:18): [True: 2.82M, False: 280k]
  ------------------
  572|  2.82M|		sum += (IT) c[i] * in[0];
  573|  2.82M|		in += stride;
  574|  2.82M|	}
  575|       |
  576|   280k|	return sum;
  577|   280k|}
reducev.cpp:_ZL10reduce_sumIjslET1_PKT_iPKT0_i:
  567|   930k|{
  568|   930k|	IT sum;
  569|       |
  570|   930k|	sum = 0;
  571|  13.6M|	for (int i = 0; i < n; i++) {
  ------------------
  |  Branch (571:18): [True: 12.7M, False: 930k]
  ------------------
  572|  12.7M|		sum += (IT) c[i] * in[0];
  573|  12.7M|		in += stride;
  574|  12.7M|	}
  575|       |
  576|   930k|	return sum;
  577|   930k|}
reducev.cpp:_ZL20unsigned_fixed_roundIlET_S0_:
  153|   930k|{
  154|   930k|	const int round_by = VIPS_INTERPOLATE_SCALE >> 1;
  ------------------
  |  |  120|   930k|#define VIPS_INTERPOLATE_SCALE (1 << VIPS_INTERPOLATE_SHIFT)
  |  |  ------------------
  |  |  |  |  119|   930k|#define VIPS_INTERPOLATE_SHIFT (12)
  |  |  ------------------
  ------------------
  155|       |
  156|   930k|	return (v + round_by) >> VIPS_INTERPOLATE_SHIFT;
  ------------------
  |  |  119|   930k|#define VIPS_INTERPOLATE_SHIFT (12)
  ------------------
  157|   930k|}
reducev.cpp:_ZL10reduce_sumIislET1_PKT_iPKT0_i:
  567|   318k|{
  568|   318k|	IT sum;
  569|       |
  570|   318k|	sum = 0;
  571|  4.73M|	for (int i = 0; i < n; i++) {
  ------------------
  |  Branch (571:18): [True: 4.42M, False: 318k]
  ------------------
  572|  4.42M|		sum += (IT) c[i] * in[0];
  573|  4.42M|		in += stride;
  574|  4.42M|	}
  575|       |
  576|   318k|	return sum;
  577|   318k|}
reducev.cpp:_ZL18signed_fixed_roundIlET_S0_:
  204|   318k|{
  205|   318k|	const int sign_of_v = 2 * (v >= 0) - 1;
  206|   318k|	const int round_by = sign_of_v * (VIPS_INTERPOLATE_SCALE >> 1);
  ------------------
  |  |  120|   318k|#define VIPS_INTERPOLATE_SCALE (1 << VIPS_INTERPOLATE_SHIFT)
  |  |  ------------------
  |  |  |  |  119|   318k|#define VIPS_INTERPOLATE_SHIFT (12)
  |  |  ------------------
  ------------------
  207|       |
  208|   318k|	return (v + round_by) >> VIPS_INTERPOLATE_SHIFT;
  ------------------
  |  |  119|   318k|#define VIPS_INTERPOLATE_SHIFT (12)
  ------------------
  209|   318k|}
reducev.cpp:_ZL10reduce_sumIfddET1_PKT_iPKT0_i:
  567|  12.9M|{
  568|  12.9M|	IT sum;
  569|       |
  570|  12.9M|	sum = 0;
  571|   194M|	for (int i = 0; i < n; i++) {
  ------------------
  |  Branch (571:18): [True: 181M, False: 12.9M]
  ------------------
  572|   181M|		sum += (IT) c[i] * in[0];
  573|   181M|		in += stride;
  574|   181M|	}
  575|       |
  576|  12.9M|	return sum;
  577|  12.9M|}
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|}

