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

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|  31.1k|{
   16|  31.1k|	VipsImage *image, *out;
   17|  31.1k|	double d;
   18|       |
   19|  31.1k|	if (!(image = vips_image_new_from_buffer(data, size, "", nullptr)))
  ------------------
  |  Branch (19:6): [True: 13.9k, False: 17.1k]
  ------------------
   20|  13.9k|		return 0;
   21|       |
   22|  17.1k|	if (image->Xsize > 100 ||
  ------------------
  |  Branch (22:6): [True: 1.12k, False: 16.0k]
  ------------------
   23|  17.1k|		image->Ysize > 100 ||
  ------------------
  |  Branch (23:3): [True: 459, False: 15.6k]
  ------------------
   24|  17.1k|		image->Bands > 4) {
  ------------------
  |  Branch (24:3): [True: 28, False: 15.5k]
  ------------------
   25|  1.60k|		g_object_unref(image);
   26|  1.60k|		return 0;
   27|  1.60k|	}
   28|       |
   29|  15.5k|	if (vips_sharpen(image, &out, nullptr)) {
  ------------------
  |  Branch (29:6): [True: 26, False: 15.5k]
  ------------------
   30|     26|		g_object_unref(image);
   31|     26|		return 0;
   32|     26|	}
   33|       |
   34|  15.5k|	vips_avg(out, &d, nullptr);
   35|       |
   36|  15.5k|	g_object_unref(out);
   37|  15.5k|	g_object_unref(image);
   38|       |
   39|  15.5k|	return 0;
   40|  15.5k|}

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

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

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

vips_avg:
  263|  15.5k|{
  264|  15.5k|	va_list ap;
  265|  15.5k|	int result;
  266|       |
  267|  15.5k|	va_start(ap, out);
  268|  15.5k|	result = vips_call_split("avg", ap, in, out);
  269|  15.5k|	va_end(ap);
  270|       |
  271|  15.5k|	return result;
  272|  15.5k|}
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|}
avg.c:vips_avg_build:
   93|  15.5k|{
   94|  15.5k|	VipsStatistic *statistic = VIPS_STATISTIC(object);
  ------------------
  |  |   40|  15.5k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  15.5k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  15.5k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  15.5k|		VIPS_TYPE_STATISTIC, VipsStatistic))
  ------------------
   95|  15.5k|	VipsAvg *avg = (VipsAvg *) object;
   96|       |
   97|  15.5k|	gint64 vals;
   98|  15.5k|	double average;
   99|       |
  100|  15.5k|	if (VIPS_OBJECT_CLASS(vips_avg_parent_class)->build(object))
  ------------------
  |  |  435|  15.5k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  15.5k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  15.5k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (100:6): [True: 6.48k, False: 9.08k]
  ------------------
  101|  6.48k|		return -1;
  102|       |
  103|  9.08k|	vals = (gint64) vips_image_get_width(statistic->in) *
  104|  9.08k|		vips_image_get_height(statistic->in) *
  105|  9.08k|		vips_image_get_bands(statistic->in);
  106|  9.08k|	average = avg->sum / vals;
  107|  9.08k|	g_object_set(object, "out", average, NULL);
  108|       |
  109|  9.08k|	return 0;
  110|  15.5k|}
avg.c:vips_avg_start:
  117|  15.5k|{
  118|  15.5k|	return (void *) g_new0(double, 1);
  ------------------
  |  |  299|  15.5k|#define g_new0(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc0)
  |  |  ------------------
  |  |  |  |  227|  15.5k|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|  15.5k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|  15.5k|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|  15.5k|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|  15.5k|	  gpointer __p;						\
  |  |  |  |  231|  15.5k|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 15.5k]
  |  |  |  |  ------------------
  |  |  |  |  232|  15.5k|	    __p = g_##func (__n);				\
  |  |  |  |  233|  15.5k|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 15.5k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|  15.5k|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 15.5k]
  |  |  |  |  |  Branch (234:26): [True: 15.5k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|  15.5k|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|  15.5k|	  else							\
  |  |  |  |  237|  15.5k|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|  15.5k|	  __p;							\
  |  |  |  |  239|  15.5k|	}))
  |  |  ------------------
  ------------------
  119|  15.5k|}
avg.c:vips_avg_scan:
  163|   478k|{
  164|   478k|	const int sz = n * vips_image_get_bands(statistic->in);
  165|       |
  166|   478k|	double *sum = (double *) seq;
  167|       |
  168|   478k|	int i;
  169|   478k|	double m;
  170|       |
  171|   478k|	m = *sum;
  172|       |
  173|       |	/* Now generate code for all types.
  174|       |	 */
  175|   478k|	switch (vips_image_get_format(statistic->in)) {
  176|   435k|	case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (176:2): [True: 435k, False: 43.0k]
  ------------------
  177|   435k|		LOOP(unsigned char);
  ------------------
  |  |  139|   435k|	{ \
  |  |  140|   435k|		TYPE *p = (TYPE *) in; \
  |  |  141|   435k|\
  |  |  142|  65.0M|		for (i = 0; i < sz; i++) \
  |  |  ------------------
  |  |  |  Branch (142:15): [True: 64.6M, False: 435k]
  |  |  ------------------
  |  |  143|  64.6M|			m += p[i]; \
  |  |  144|   435k|	}
  ------------------
  178|   435k|		break;
  179|      0|	case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (179:2): [True: 0, False: 478k]
  ------------------
  180|      0|		LOOP(signed char);
  ------------------
  |  |  139|      0|	{ \
  |  |  140|      0|		TYPE *p = (TYPE *) in; \
  |  |  141|      0|\
  |  |  142|      0|		for (i = 0; i < sz; i++) \
  |  |  ------------------
  |  |  |  Branch (142:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|      0|			m += p[i]; \
  |  |  144|      0|	}
  ------------------
  181|      0|		break;
  182|  23.3k|	case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (182:2): [True: 23.3k, False: 454k]
  ------------------
  183|  23.3k|		LOOP(unsigned short);
  ------------------
  |  |  139|  23.3k|	{ \
  |  |  140|  23.3k|		TYPE *p = (TYPE *) in; \
  |  |  141|  23.3k|\
  |  |  142|  2.13M|		for (i = 0; i < sz; i++) \
  |  |  ------------------
  |  |  |  Branch (142:15): [True: 2.10M, False: 23.3k]
  |  |  ------------------
  |  |  143|  2.10M|			m += p[i]; \
  |  |  144|  23.3k|	}
  ------------------
  184|  23.3k|		break;
  185|  5.10k|	case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (185:2): [True: 5.10k, False: 473k]
  ------------------
  186|  5.10k|		LOOP(signed short);
  ------------------
  |  |  139|  5.10k|	{ \
  |  |  140|  5.10k|		TYPE *p = (TYPE *) in; \
  |  |  141|  5.10k|\
  |  |  142|   490k|		for (i = 0; i < sz; i++) \
  |  |  ------------------
  |  |  |  Branch (142:15): [True: 485k, False: 5.10k]
  |  |  ------------------
  |  |  143|   485k|			m += p[i]; \
  |  |  144|  5.10k|	}
  ------------------
  187|  5.10k|		break;
  188|      0|	case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (188:2): [True: 0, False: 478k]
  ------------------
  189|      0|		LOOP(unsigned int);
  ------------------
  |  |  139|      0|	{ \
  |  |  140|      0|		TYPE *p = (TYPE *) in; \
  |  |  141|      0|\
  |  |  142|      0|		for (i = 0; i < sz; i++) \
  |  |  ------------------
  |  |  |  Branch (142:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|      0|			m += p[i]; \
  |  |  144|      0|	}
  ------------------
  190|      0|		break;
  191|      0|	case VIPS_FORMAT_INT:
  ------------------
  |  Branch (191:2): [True: 0, False: 478k]
  ------------------
  192|      0|		LOOP(signed int);
  ------------------
  |  |  139|      0|	{ \
  |  |  140|      0|		TYPE *p = (TYPE *) in; \
  |  |  141|      0|\
  |  |  142|      0|		for (i = 0; i < sz; i++) \
  |  |  ------------------
  |  |  |  Branch (142:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|      0|			m += p[i]; \
  |  |  144|      0|	}
  ------------------
  193|      0|		break;
  194|  14.6k|	case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (194:2): [True: 14.6k, False: 463k]
  ------------------
  195|  14.6k|		LOOP(float);
  ------------------
  |  |  139|  14.6k|	{ \
  |  |  140|  14.6k|		TYPE *p = (TYPE *) in; \
  |  |  141|  14.6k|\
  |  |  142|  1.03M|		for (i = 0; i < sz; i++) \
  |  |  ------------------
  |  |  |  Branch (142:15): [True: 1.02M, False: 14.6k]
  |  |  ------------------
  |  |  143|  1.02M|			m += p[i]; \
  |  |  144|  14.6k|	}
  ------------------
  196|  14.6k|		break;
  197|      0|	case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (197:2): [True: 0, False: 478k]
  ------------------
  198|      0|		LOOP(double);
  ------------------
  |  |  139|      0|	{ \
  |  |  140|      0|		TYPE *p = (TYPE *) in; \
  |  |  141|      0|\
  |  |  142|      0|		for (i = 0; i < sz; i++) \
  |  |  ------------------
  |  |  |  Branch (142:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  143|      0|			m += p[i]; \
  |  |  144|      0|	}
  ------------------
  199|      0|		break;
  200|      0|	case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (200:2): [True: 0, False: 478k]
  ------------------
  201|      0|		CLOOP(float);
  ------------------
  |  |  147|      0|	{ \
  |  |  148|      0|		TYPE *p = (TYPE *) in; \
  |  |  149|      0|\
  |  |  150|      0|		for (i = 0; i < sz; i++) { \
  |  |  ------------------
  |  |  |  Branch (150:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  151|      0|			double mod = sqrt(p[0] * p[0] + p[1] * p[1]); \
  |  |  152|      0|\
  |  |  153|      0|			m += mod; \
  |  |  154|      0|			p += 2; \
  |  |  155|      0|		} \
  |  |  156|      0|	}
  ------------------
  202|      0|		break;
  203|      0|	case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (203:2): [True: 0, False: 478k]
  ------------------
  204|      0|		CLOOP(double);
  ------------------
  |  |  147|      0|	{ \
  |  |  148|      0|		TYPE *p = (TYPE *) in; \
  |  |  149|      0|\
  |  |  150|      0|		for (i = 0; i < sz; i++) { \
  |  |  ------------------
  |  |  |  Branch (150:15): [True: 0, False: 0]
  |  |  ------------------
  |  |  151|      0|			double mod = sqrt(p[0] * p[0] + p[1] * p[1]); \
  |  |  152|      0|\
  |  |  153|      0|			m += mod; \
  |  |  154|      0|			p += 2; \
  |  |  155|      0|		} \
  |  |  156|      0|	}
  ------------------
  205|      0|		break;
  206|       |
  207|      0|	default:
  ------------------
  |  Branch (207:2): [True: 0, False: 478k]
  ------------------
  208|      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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  209|   478k|	}
  210|       |
  211|   478k|	*sum = m;
  212|       |
  213|   478k|	return 0;
  214|   478k|}
avg.c:vips_avg_stop:
  125|  15.5k|{
  126|  15.5k|	VipsAvg *avg = (VipsAvg *) statistic;
  127|  15.5k|	double *sum = (double *) seq;
  128|       |
  129|  15.5k|	avg->sum += *sum;
  130|       |
  131|  15.5k|	g_free(seq);
  132|       |
  133|  15.5k|	return 0;
  134|  15.5k|}
avg.c:vips_avg_init:
  244|  15.5k|{
  245|  15.5k|}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

statistic.c:vips_statistic_class_init:
  152|      1|{
  153|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  154|      1|	VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS(class);
  ------------------
  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  155|      1|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      1|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  156|       |
  157|      1|	gobject_class->set_property = vips_object_set_property;
  158|      1|	gobject_class->get_property = vips_object_get_property;
  159|       |
  160|      1|	vobject_class->nickname = "statistic";
  161|      1|	vobject_class->description = _("VIPS statistic operations");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  162|      1|	vobject_class->build = vips_statistic_build;
  163|       |
  164|      1|	operation_class->flags = VIPS_OPERATION_SEQUENTIAL;
  165|       |
  166|      1|	VIPS_ARG_IMAGE(class, "in", 0,
  ------------------
  |  |  112|      1|	{ \
  |  |  113|      1|		GParamSpec *pspec; \
  |  |  114|      1|\
  |  |  115|      1|		pspec = g_param_spec_object((NAME), (LONG), (DESC), \
  |  |  116|      1|			VIPS_TYPE_IMAGE, \
  |  |  ------------------
  |  |  |  |  169|      1|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  |  |  ------------------
  |  |  117|      1|			(GParamFlags) (G_PARAM_READWRITE)); \
  |  |  118|      1|		g_object_class_install_property(G_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      1|			vips_argument_get_id(), pspec); \
  |  |  120|      1|		vips_object_class_install_argument(VIPS_OBJECT_CLASS(CLASS), \
  |  |  ------------------
  |  |  |  |  435|      1|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      1|			pspec, (VipsArgumentFlags) (FLAGS), (PRIORITY), (OFFSET)); \
  |  |  122|      1|	}
  ------------------
  167|      1|		_("Input"),
  168|      1|		_("Input image"),
  169|      1|		VIPS_ARGUMENT_REQUIRED_INPUT,
  170|      1|		G_STRUCT_OFFSET(VipsStatistic, in));
  171|      1|}
statistic.c:vips_statistic_build:
  111|  15.5k|{
  112|  15.5k|	VipsStatistic *statistic = VIPS_STATISTIC(object);
  ------------------
  |  |   40|  15.5k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  15.5k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  15.5k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  15.5k|		VIPS_TYPE_STATISTIC, VipsStatistic))
  ------------------
  113|  15.5k|	VipsStatisticClass *sclass = VIPS_STATISTIC_GET_CLASS(statistic);
  ------------------
  |  |   50|  15.5k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  15.5k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  15.5k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   51|  15.5k|		VIPS_TYPE_STATISTIC, VipsStatisticClass))
  ------------------
  114|  15.5k|	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|  15.5k|	if (VIPS_OBJECT_CLASS(vips_statistic_parent_class)->build(object))
  ------------------
  |  |  435|  15.5k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  15.5k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  15.5k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (122:6): [True: 0, False: 15.5k]
  ------------------
  123|      0|		return -1;
  124|       |
  125|  15.5k|	statistic->ready = statistic->in;
  126|       |
  127|  15.5k|	if (vips_image_decode(statistic->ready, &t[0]))
  ------------------
  |  Branch (127:6): [True: 0, False: 15.5k]
  ------------------
  128|      0|		return -1;
  129|  15.5k|	statistic->ready = t[0];
  130|       |
  131|       |	/* If there's a format table, cast the input.
  132|       |	 */
  133|  15.5k|	if (sclass->format_table) {
  ------------------
  |  Branch (133:6): [True: 0, False: 15.5k]
  ------------------
  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|  15.5k|	if (vips_sink(statistic->ready,
  ------------------
  |  Branch (140:6): [True: 6.48k, False: 9.08k]
  ------------------
  141|  15.5k|			vips_statistic_scan_start,
  142|  15.5k|			vips_statistic_scan,
  143|  15.5k|			vips_statistic_scan_stop,
  144|  15.5k|			statistic, NULL))
  145|  6.48k|		return -1;
  146|       |
  147|  9.08k|	return 0;
  148|  15.5k|}
statistic.c:vips_statistic_scan_start:
   61|  15.5k|{
   62|  15.5k|	VipsStatistic *statistic = VIPS_STATISTIC(a);
  ------------------
  |  |   40|  15.5k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  15.5k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  15.5k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  15.5k|		VIPS_TYPE_STATISTIC, VipsStatistic))
  ------------------
   63|  15.5k|	VipsStatisticClass *class = VIPS_STATISTIC_GET_CLASS(statistic);
  ------------------
  |  |   50|  15.5k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  15.5k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  15.5k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   51|  15.5k|		VIPS_TYPE_STATISTIC, VipsStatisticClass))
  ------------------
   64|       |
   65|  15.5k|	return class->start(statistic);
   66|  15.5k|}
statistic.c:vips_statistic_scan:
   71|  9.08k|{
   72|  9.08k|	VipsStatistic *statistic = VIPS_STATISTIC(a);
  ------------------
  |  |   40|  9.08k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  9.08k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  9.08k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  9.08k|		VIPS_TYPE_STATISTIC, VipsStatistic))
  ------------------
   73|  9.08k|	VipsStatisticClass *class = VIPS_STATISTIC_GET_CLASS(statistic);
  ------------------
  |  |   50|  9.08k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  9.08k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  9.08k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   51|  9.08k|		VIPS_TYPE_STATISTIC, VipsStatisticClass))
  ------------------
   74|       |
   75|  9.08k|	VipsRect *r = &region->valid;
   76|  9.08k|	int lsk = VIPS_REGION_LSKIP(region);
  ------------------
  |  |  195|  9.08k|	((size_t) ((R)->bpl))
  ------------------
   77|       |
   78|  9.08k|	int y;
   79|  9.08k|	VipsPel *p;
   80|       |
   81|  9.08k|	VIPS_DEBUG_MSG("vips_statistic_scan: %d x %d @ %d x %d\n",
  ------------------
  |  |   47|  9.08k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  9.08k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  9.08k|	{ \
  |  |   49|  9.08k|		; \
  |  |   50|  9.08k|	} \
  |  |   51|  9.08k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  9.08k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   82|  9.08k|		r->width, r->height, r->left, r->top);
   83|       |
   84|  9.08k|	p = VIPS_REGION_ADDR(region, r->left, r->top);
  ------------------
  |  |  227|  9.08k|	((R)->data + \
  |  |  228|  9.08k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  9.08k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  9.08k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  9.08k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  9.08k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  9.08k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   85|   487k|	for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (85:14): [True: 478k, False: 9.08k]
  ------------------
   86|   478k|		if (class->scan(statistic,
  ------------------
  |  Branch (86:7): [True: 0, False: 478k]
  ------------------
   87|   478k|				seq, r->left, r->top + y, p, r->width))
   88|      0|			return -1;
   89|   478k|		p += lsk;
   90|   478k|	}
   91|       |
   92|       |	/* If we've requested stop, pass the message on.
   93|       |	 */
   94|  9.08k|	if (statistic->stop)
  ------------------
  |  Branch (94:6): [True: 0, False: 9.08k]
  ------------------
   95|      0|		*stop = TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
   96|       |
   97|  9.08k|	return 0;
   98|  9.08k|}
statistic.c:vips_statistic_scan_stop:
  102|  15.5k|{
  103|  15.5k|	VipsStatistic *statistic = VIPS_STATISTIC(a);
  ------------------
  |  |   40|  15.5k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  15.5k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  15.5k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  15.5k|		VIPS_TYPE_STATISTIC, VipsStatistic))
  ------------------
  104|  15.5k|	VipsStatisticClass *class = VIPS_STATISTIC_GET_CLASS(statistic);
  ------------------
  |  |   50|  15.5k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  15.5k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  15.5k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   51|  15.5k|		VIPS_TYPE_STATISTIC, VipsStatisticClass))
  ------------------
  105|       |
  106|  15.5k|	return class->stop(statistic, seq);
  107|  15.5k|}
statistic.c:vips_statistic_init:
  175|  15.5k|{
  176|  15.5k|}

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

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

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

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

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

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

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

vips_Lab2LabS:
  116|  15.4k|{
  117|  15.4k|	va_list ap;
  118|  15.4k|	int result;
  119|       |
  120|  15.4k|	va_start(ap, out);
  121|  15.4k|	result = vips_call_split("Lab2LabS", ap, in, out);
  122|  15.4k|	va_end(ap);
  123|       |
  124|  15.4k|	return result;
  125|  15.4k|}
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|}
Lab2LabS.c:vips_Lab2LabS_line:
   60|   472k|{
   61|   472k|	float *restrict p = (float *) in[0];
   62|   472k|	signed short *restrict q = (signed short *) out;
   63|   472k|	int i;
   64|       |
   65|  31.4M|	for (i = 0; i < width; i++) {
  ------------------
  |  Branch (65:14): [True: 30.9M, False: 472k]
  ------------------
   66|  30.9M|		q[0] = VIPS_CLIP(0, p[0] * (32767.0 / 100.0), SHRT_MAX);
  ------------------
  |  |   57|  30.9M|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|  61.9M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 11.7M, False: 19.2M]
  |  |  |  |  |  Branch (54:32): [True: 7.91k, False: 30.9M]
  |  |  |  |  |  Branch (54:44): [True: 7.91k, False: 19.2M]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   67|  30.9M|		q[1] = VIPS_CLIP(SHRT_MIN, p[1] * (32768.0 / 128.0), SHRT_MAX);
  ------------------
  |  |   57|  30.9M|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|  61.9M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 2.34k, False: 30.9M]
  |  |  |  |  |  Branch (54:32): [True: 4.91k, False: 30.9M]
  |  |  |  |  |  Branch (54:44): [True: 4.91k, False: 30.9M]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   68|  30.9M|		q[2] = VIPS_CLIP(SHRT_MIN, p[2] * (32768.0 / 128.0), SHRT_MAX);
  ------------------
  |  |   57|  30.9M|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|  61.9M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 3.12k, False: 30.9M]
  |  |  |  |  |  Branch (54:32): [True: 4.24k, False: 30.9M]
  |  |  |  |  |  Branch (54:44): [True: 4.24k, False: 30.9M]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   69|       |
   70|  30.9M|		q += 3;
   71|  30.9M|		p += 3;
   72|  30.9M|	}
   73|   472k|}
Lab2LabS.c:vips_Lab2LabS_init:
   89|  15.4k|{
   90|  15.4k|	VipsColour *colour = VIPS_COLOUR(Lab2LabS);
  ------------------
  |  |   42|  15.4k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  15.4k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  15.4k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|  15.4k|		VIPS_TYPE_COLOUR, VipsColour))
  ------------------
   91|  15.4k|	VipsColourCode *code = VIPS_COLOUR_CODE(Lab2LabS);
  ------------------
  |  |  135|  15.4k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  15.4k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  15.4k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  136|  15.4k|		VIPS_TYPE_COLOUR_CODE, VipsColourCode))
  ------------------
   92|       |
   93|  15.4k|	colour->interpretation = VIPS_INTERPRETATION_LABS;
   94|  15.4k|	colour->format = VIPS_FORMAT_SHORT;
   95|  15.4k|	colour->input_bands = 3;
   96|  15.4k|	colour->bands = 3;
   97|       |
   98|  15.4k|	code->input_coding = VIPS_CODING_NONE;
   99|  15.4k|	code->input_format = VIPS_FORMAT_FLOAT;
  100|  15.4k|}

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

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

vips_LabQ2LabS:
  137|     25|{
  138|     25|	va_list ap;
  139|     25|	int result;
  140|       |
  141|     25|	va_start(ap, out);
  142|     25|	result = vips_call_split("LabQ2LabS", ap, in, out);
  143|     25|	va_end(ap);
  144|       |
  145|     25|	return result;
  146|     25|}
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|}
LabQ2LabS.c:vips_LabQ2LabS_line:
   62|    280|{
   63|    280|	unsigned char *restrict p = (unsigned char *) in[0];
   64|    280|	signed short *restrict q = (signed short *) out;
   65|       |
   66|    280|	int i;
   67|    280|	unsigned char ext;
   68|    280|	signed short l, a, b;
   69|       |
   70|  5.79k|	for (i = 0; i < width; i++) {
  ------------------
  |  Branch (70:14): [True: 5.51k, False: 280]
  ------------------
   71|       |		/* Get most significant 8 bits of lab.
   72|       |		 */
   73|  5.51k|		l = p[0] << 7;
   74|  5.51k|		a = p[1] << 8;
   75|  5.51k|		b = p[2] << 8;
   76|       |
   77|       |		/* Get x-tra bits.
   78|       |		 */
   79|  5.51k|		ext = p[3];
   80|  5.51k|		p += 4;
   81|       |
   82|       |		/* Shift and mask in to lab.
   83|       |		 */
   84|  5.51k|		l |= (unsigned char) (ext & 0xc0) >> 1;
   85|  5.51k|		a |= (ext & 0x38) << 2;
   86|  5.51k|		b |= (ext & 0x7) << 5;
   87|       |
   88|       |		/* Write!
   89|       |		 */
   90|  5.51k|		q[0] = l;
   91|  5.51k|		q[1] = a;
   92|  5.51k|		q[2] = b;
   93|  5.51k|		q += 3;
   94|  5.51k|	}
   95|    280|}
LabQ2LabS.c:vips_LabQ2LabS_init:
  111|     25|{
  112|     25|	VipsColour *colour = VIPS_COLOUR(LabQ2LabS);
  ------------------
  |  |   42|     25|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|     25|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|     25|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|     25|		VIPS_TYPE_COLOUR, VipsColour))
  ------------------
  113|     25|	VipsColourCode *code = VIPS_COLOUR_CODE(LabQ2LabS);
  ------------------
  |  |  135|     25|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|     25|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|     25|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  136|     25|		VIPS_TYPE_COLOUR_CODE, VipsColourCode))
  ------------------
  114|       |
  115|     25|	colour->coding = VIPS_CODING_NONE;
  116|     25|	colour->interpretation = VIPS_INTERPRETATION_LABS;
  117|     25|	colour->format = VIPS_FORMAT_SHORT;
  118|     25|	colour->bands = 3;
  119|       |
  120|     25|	code->input_coding = VIPS_CODING_LABQ;
  121|     25|}

vips_col_make_tables_RGB_8:
  171|  26.6M|{
  172|  26.6M|	static GOnce once = G_ONCE_INIT;
  ------------------
  |  |  102|  26.6M|#define G_ONCE_INIT { G_ONCE_STATUS_NOTCALLED, NULL }
  ------------------
  173|       |
  174|  26.6M|	VIPS_ONCE(&once, calcul_tables_8, NULL);
  ------------------
  |  |   93|  26.6M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  26.6M|#define G_STMT_START  do
  |  |  ------------------
  |  |   94|  26.6M|	{ \
  |  |   95|  26.6M|		if (G_UNLIKELY((ONCE)->status != G_ONCE_STATUS_READY)) \
  |  |  ------------------
  |  |  |  |  935|  26.6M|#define G_UNLIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 0))
  |  |  |  |  ------------------
  |  |  |  |  |  |  926|  26.6M| G_GNUC_EXTENSION ({                            \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  26.6M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  927|  26.6M|   int _g_boolean_var_;                         \
  |  |  |  |  |  |  928|  26.6M|   if (expr)                                    \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (928:8): [True: 1, False: 26.6M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  929|  26.6M|      _g_boolean_var_ = 1;                      \
  |  |  |  |  |  |  930|  26.6M|   else                                         \
  |  |  |  |  |  |  931|  26.6M|      _g_boolean_var_ = 0;                      \
  |  |  |  |  |  |  932|  26.6M|   _g_boolean_var_;                             \
  |  |  |  |  |  |  933|  26.6M|})
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (935:26): [True: 1, False: 26.6M]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   96|  26.6M|			(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|  26.6M|	} \
  |  |   98|  26.6M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  26.6M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  175|  26.6M|}
vips_col_make_tables_RGB_16:
  195|   779k|{
  196|   779k|	static GOnce once = G_ONCE_INIT;
  ------------------
  |  |  102|   779k|#define G_ONCE_INIT { G_ONCE_STATUS_NOTCALLED, NULL }
  ------------------
  197|       |
  198|   779k|	VIPS_ONCE(&once, calcul_tables_16, NULL);
  ------------------
  |  |   93|   779k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   779k|#define G_STMT_START  do
  |  |  ------------------
  |  |   94|   779k|	{ \
  |  |   95|   779k|		if (G_UNLIKELY((ONCE)->status != G_ONCE_STATUS_READY)) \
  |  |  ------------------
  |  |  |  |  935|   779k|#define G_UNLIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 0))
  |  |  |  |  ------------------
  |  |  |  |  |  |  926|   779k| G_GNUC_EXTENSION ({                            \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   779k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  927|   779k|   int _g_boolean_var_;                         \
  |  |  |  |  |  |  928|   779k|   if (expr)                                    \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (928:8): [True: 1, False: 779k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  929|   779k|      _g_boolean_var_ = 1;                      \
  |  |  |  |  |  |  930|   779k|   else                                         \
  |  |  |  |  |  |  931|   779k|      _g_boolean_var_ = 0;                      \
  |  |  |  |  |  |  932|   779k|   _g_boolean_var_;                             \
  |  |  |  |  |  |  933|   779k|})
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (935:26): [True: 1, False: 779k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   96|   779k|			(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|   779k|	} \
  |  |   98|   779k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   779k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  199|   779k|}
vips_col_XYZ2scRGB:
  262|  27.4M|{
  263|  27.4M|	X /= SCALE;
  ------------------
  |  |  212|  27.4M|#define SCALE (VIPS_D65_Y0)
  |  |  ------------------
  |  |  |  |   59|  27.4M|#define VIPS_D65_Y0 (100.0)
  |  |  ------------------
  ------------------
  264|  27.4M|	Y /= SCALE;
  ------------------
  |  |  212|  27.4M|#define SCALE (VIPS_D65_Y0)
  |  |  ------------------
  |  |  |  |   59|  27.4M|#define VIPS_D65_Y0 (100.0)
  |  |  ------------------
  ------------------
  265|  27.4M|	Z /= SCALE;
  ------------------
  |  |  212|  27.4M|#define SCALE (VIPS_D65_Y0)
  |  |  ------------------
  |  |  |  |   59|  27.4M|#define VIPS_D65_Y0 (100.0)
  |  |  ------------------
  ------------------
  266|       |
  267|       |	/* Use 6 decimal places of precision for the inverse matrix.
  268|       |	 */
  269|  27.4M|	*R = 3.240625 * X +
  270|  27.4M|		-1.537208 * Y +
  271|  27.4M|		-0.498629 * Z;
  272|  27.4M|	*G = -0.968931 * X +
  273|  27.4M|		1.875756 * Y +
  274|  27.4M|		0.041518 * Z;
  275|  27.4M|	*B = 0.055710 * X +
  276|  27.4M|		-0.204021 * Y +
  277|  27.4M|		1.056996 * Z;
  278|       |
  279|  27.4M|	return 0;
  280|  27.4M|}
vips_col_scRGB2sRGB_8:
  363|  9.09M|{
  364|  9.09M|	vips_col_make_tables_RGB_8();
  365|       |
  366|  9.09M|	return vips_col_scRGB2sRGB(256, vips_Y2v_8, R, G, B, r, g, b, og);
  367|  9.09M|}
vips_col_scRGB2sRGB_16:
  372|   370k|{
  373|   370k|	vips_col_make_tables_RGB_16();
  374|       |
  375|   370k|	return vips_col_scRGB2sRGB(65536, vips_Y2v_16, R, G, B, r, g, b, og);
  376|   370k|}
vips_col_scRGB2BW_16:
  430|   408k|{
  431|   408k|	vips_col_make_tables_RGB_16();
  432|       |
  433|   408k|	return vips_col_scRGB2BW(65536, vips_Y2v_16, R, G, B, g, og);
  434|   408k|}
vips_col_scRGB2BW_8:
  438|  17.5M|{
  439|  17.5M|	vips_col_make_tables_RGB_8();
  440|       |
  441|  17.5M|	return vips_col_scRGB2BW(256, vips_Y2v_8, R, G, B, g, og);
  442|  17.5M|}
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|}
LabQ2sRGB.c:vips_col_scRGB2sRGB:
  292|  9.46M|{
  293|  9.46M|	int maxval = range - 1;
  294|       |
  295|  9.46M|	int og;
  296|  9.46M|	float Yf;
  297|  9.46M|	int Yi;
  298|  9.46M|	float v;
  299|       |
  300|       |	/* RGB can be NaN. Throw those values out, they will break
  301|       |	 * our clipping.
  302|       |	 *
  303|       |	 * Don't use isnormal(), it is false for 0.0 and for subnormal
  304|       |	 * numbers.
  305|       |	 */
  306|  9.46M|	if (VIPS_ISNAN(R) || VIPS_ISNAN(G) || VIPS_ISNAN(B)) {
  ------------------
  |  |   71|  18.9M|#define VIPS_ISNAN(V) __builtin_isnan(V)
  |  |  ------------------
  |  |  |  Branch (71:23): [True: 0, False: 9.46M]
  |  |  ------------------
  ------------------
              	if (VIPS_ISNAN(R) || VIPS_ISNAN(G) || VIPS_ISNAN(B)) {
  ------------------
  |  |   71|  18.9M|#define VIPS_ISNAN(V) __builtin_isnan(V)
  |  |  ------------------
  |  |  |  Branch (71:23): [True: 0, False: 9.46M]
  |  |  ------------------
  ------------------
              	if (VIPS_ISNAN(R) || VIPS_ISNAN(G) || VIPS_ISNAN(B)) {
  ------------------
  |  |   71|  9.46M|#define VIPS_ISNAN(V) __builtin_isnan(V)
  |  |  ------------------
  |  |  |  Branch (71:23): [True: 0, False: 9.46M]
  |  |  ------------------
  ------------------
  307|      0|		*r = 0;
  308|      0|		*g = 0;
  309|      0|		*b = 0;
  310|       |
  311|      0|		return -1;
  312|      0|	}
  313|       |
  314|       |	/* Clip range, set the out-of-gamut flag.
  315|       |	 */
  316|  9.46M|#define CLIP(L, V, H) \
  317|  9.46M|	{ \
  318|  9.46M|		if ((V) < (L)) { \
  319|  9.46M|			(V) = (L); \
  320|  9.46M|			og = 1; \
  321|  9.46M|		} \
  322|  9.46M|		else if ((V) > (H)) { \
  323|  9.46M|			(V) = (H); \
  324|  9.46M|			og = 1; \
  325|  9.46M|		} \
  326|  9.46M|	}
  327|       |
  328|       |	/* Look up with a float index: interpolate between the nearest two
  329|       |	 * points.
  330|       |	 *
  331|       |	 * The +1 on the index is safe, see above.
  332|       |	 */
  333|       |
  334|  9.46M|	og = 0;
  335|       |
  336|  9.46M|	Yf = R * maxval;
  337|  9.46M|	CLIP(0, Yf, maxval);
  ------------------
  |  |  317|  9.46M|	{ \
  |  |  318|  9.46M|		if ((V) < (L)) { \
  |  |  ------------------
  |  |  |  Branch (318:7): [True: 1.35M, False: 8.10M]
  |  |  ------------------
  |  |  319|  1.35M|			(V) = (L); \
  |  |  320|  1.35M|			og = 1; \
  |  |  321|  1.35M|		} \
  |  |  322|  9.46M|		else if ((V) > (H)) { \
  |  |  ------------------
  |  |  |  Branch (322:12): [True: 71.7k, False: 8.03M]
  |  |  ------------------
  |  |  323|  71.7k|			(V) = (H); \
  |  |  324|  71.7k|			og = 1; \
  |  |  325|  71.7k|		} \
  |  |  326|  9.46M|	}
  ------------------
  338|  9.46M|	Yi = (int) Yf;
  339|  9.46M|	v = lut[Yi] + (lut[Yi + 1] - lut[Yi]) * (Yf - Yi);
  340|  9.46M|	*r = VIPS_RINT(v);
  ------------------
  |  |   74|  9.46M|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  341|       |
  342|  9.46M|	Yf = G * maxval;
  343|  9.46M|	CLIP(0, Yf, maxval);
  ------------------
  |  |  317|  9.46M|	{ \
  |  |  318|  9.46M|		if ((V) < (L)) { \
  |  |  ------------------
  |  |  |  Branch (318:7): [True: 5.33M, False: 4.12M]
  |  |  ------------------
  |  |  319|  5.33M|			(V) = (L); \
  |  |  320|  5.33M|			og = 1; \
  |  |  321|  5.33M|		} \
  |  |  322|  9.46M|		else if ((V) > (H)) { \
  |  |  ------------------
  |  |  |  Branch (322:12): [True: 268k, False: 3.85M]
  |  |  ------------------
  |  |  323|   268k|			(V) = (H); \
  |  |  324|   268k|			og = 1; \
  |  |  325|   268k|		} \
  |  |  326|  9.46M|	}
  ------------------
  344|  9.46M|	Yi = (int) Yf;
  345|  9.46M|	v = lut[Yi] + (lut[Yi + 1] - lut[Yi]) * (Yf - Yi);
  346|  9.46M|	*g = VIPS_RINT(v);
  ------------------
  |  |   74|  9.46M|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  347|       |
  348|  9.46M|	Yf = B * maxval;
  349|  9.46M|	CLIP(0, Yf, maxval);
  ------------------
  |  |  317|  9.46M|	{ \
  |  |  318|  9.46M|		if ((V) < (L)) { \
  |  |  ------------------
  |  |  |  Branch (318:7): [True: 1.15M, False: 8.30M]
  |  |  ------------------
  |  |  319|  1.15M|			(V) = (L); \
  |  |  320|  1.15M|			og = 1; \
  |  |  321|  1.15M|		} \
  |  |  322|  9.46M|		else if ((V) > (H)) { \
  |  |  ------------------
  |  |  |  Branch (322:12): [True: 58.8k, False: 8.24M]
  |  |  ------------------
  |  |  323|  58.8k|			(V) = (H); \
  |  |  324|  58.8k|			og = 1; \
  |  |  325|  58.8k|		} \
  |  |  326|  9.46M|	}
  ------------------
  350|  9.46M|	Yi = (int) Yf;
  351|  9.46M|	v = lut[Yi] + (lut[Yi + 1] - lut[Yi]) * (Yf - Yi);
  352|  9.46M|	*b = VIPS_RINT(v);
  ------------------
  |  |   74|  9.46M|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  353|       |
  354|  9.46M|	if (og_ret)
  ------------------
  |  Branch (354:6): [True: 0, False: 9.46M]
  ------------------
  355|      0|		*og_ret = og;
  356|       |
  357|  9.46M|	return 0;
  358|  9.46M|}
LabQ2sRGB.c:vips_col_scRGB2BW:
  386|  18.0M|{
  387|  18.0M|	int maxval = range - 1;
  388|       |
  389|  18.0M|	float Y;
  390|  18.0M|	int og;
  391|  18.0M|	float Yf;
  392|  18.0M|	int Yi;
  393|  18.0M|	float v;
  394|       |
  395|       |	/* CIE linear luminance function, see https://en.wikipedia.org/wiki/Grayscale#Colorimetric_(perceptual_luminance-preserving)_conversion_to_grayscale
  396|       |	 */
  397|  18.0M|	Y = 0.2126 * R + 0.7152 * G + 0.0722 * B;
  398|       |
  399|       |	/* Y can be Nan. Throw those values out, they will break
  400|       |	 * our clipping.
  401|       |	 */
  402|  18.0M|	if (VIPS_ISNAN(Y)) {
  ------------------
  |  |   71|  18.0M|#define VIPS_ISNAN(V) __builtin_isnan(V)
  |  |  ------------------
  |  |  |  Branch (71:23): [True: 0, False: 18.0M]
  |  |  ------------------
  ------------------
  403|      0|		*g = 0;
  404|       |
  405|      0|		return -1;
  406|      0|	}
  407|       |
  408|       |	/* Look up with a float index: interpolate between the nearest two
  409|       |	 * points.
  410|       |	 *
  411|       |	 * The +1 on the index is safe, see above.
  412|       |	 */
  413|       |
  414|  18.0M|	og = 0;
  415|       |
  416|  18.0M|	Yf = Y * maxval;
  417|  18.0M|	CLIP(0, Yf, maxval);
  ------------------
  |  |  317|  18.0M|	{ \
  |  |  318|  18.0M|		if ((V) < (L)) { \
  |  |  ------------------
  |  |  |  Branch (318:7): [True: 6.49M, False: 11.5M]
  |  |  ------------------
  |  |  319|  6.49M|			(V) = (L); \
  |  |  320|  6.49M|			og = 1; \
  |  |  321|  6.49M|		} \
  |  |  322|  18.0M|		else if ((V) > (H)) { \
  |  |  ------------------
  |  |  |  Branch (322:12): [True: 0, False: 11.5M]
  |  |  ------------------
  |  |  323|      0|			(V) = (H); \
  |  |  324|      0|			og = 1; \
  |  |  325|      0|		} \
  |  |  326|  18.0M|	}
  ------------------
  418|  18.0M|	Yi = (int) Yf;
  419|  18.0M|	v = lut[Yi] + (lut[Yi + 1] - lut[Yi]) * (Yf - Yi);
  420|  18.0M|	*g = VIPS_RINT(v);
  ------------------
  |  |   74|  18.0M|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  421|       |
  422|  18.0M|	if (og_ret)
  ------------------
  |  Branch (422:6): [True: 18.0M, False: 0]
  ------------------
  423|  18.0M|		*og_ret = og;
  424|       |
  425|  18.0M|	return 0;
  426|  18.0M|}

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

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

vips_XYZ2CMYK:
  231|    743|{
  232|    743|	va_list ap;
  233|    743|	int result;
  234|       |
  235|    743|	va_start(ap, out);
  236|    743|	result = vips_call_split("XYZ2CMYK", ap, in, out);
  237|    743|	va_end(ap);
  238|       |
  239|    743|	return result;
  240|    743|}
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|}
XYZ2CMYK.c:vips_XYZ2CMYK_build:
   78|    743|{
   79|    743|	VipsXYZ2CMYK *XYZ2CMYK = (VipsXYZ2CMYK *) object;
   80|       |
   81|    743|	VipsImage *out;
   82|    743|	VipsImage *t;
   83|       |
   84|    743|	if (VIPS_OBJECT_CLASS(vips_XYZ2CMYK_parent_class)->build(object))
  ------------------
  |  |  435|    743|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|    743|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    743|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (84:6): [True: 0, False: 743]
  ------------------
   85|      0|		return -1;
   86|       |
   87|    743|	out = vips_image_new();
   88|    743|	g_object_set(object, "out", out, NULL);
   89|       |
   90|    743|	if (vips__colourspace_process_n("XYZ2CMYK",
  ------------------
  |  Branch (90:6): [True: 0, False: 743]
  ------------------
   91|    743|			XYZ2CMYK->in, &t, 3, vips_XYZ2CMYK_process))
   92|      0|		return -1;
   93|    743|	if (vips_image_write(t, out)) {
  ------------------
  |  Branch (93:6): [True: 0, False: 743]
  ------------------
   94|      0|		g_object_unref(t);
   95|      0|		return -1;
   96|      0|	}
   97|    743|	g_object_unref(t);
   98|       |
   99|    743|	return 0;
  100|    743|}
XYZ2CMYK.c:vips_XYZ2CMYK_process:
   69|    743|{
   70|    743|	return vips_icc_export(in, out,
   71|    743|		"output_profile", "cmyk",
   72|    743|		"pcs", VIPS_PCS_XYZ,
   73|    743|		NULL);
   74|    743|}
XYZ2CMYK.c:vips_XYZ2CMYK_init:
  133|    743|{
  134|    743|}

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

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

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

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|  63.6k|{
  268|  63.6k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  63.6k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  63.6k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  63.6k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  269|  63.6k|	VipsColour *colour = VIPS_COLOUR(object);
  ------------------
  |  |   42|  63.6k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  63.6k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  63.6k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|  63.6k|		VIPS_TYPE_COLOUR, VipsColour))
  ------------------
  270|       |
  271|  63.6k|	VipsImage **in;
  272|  63.6k|	VipsImage **extra_bands;
  273|  63.6k|	VipsImage *out;
  274|       |
  275|  63.6k|	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|  63.6k|	if (VIPS_OBJECT_CLASS(vips_colour_parent_class)->build(object))
  ------------------
  |  |  435|  63.6k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  63.6k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  63.6k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (283:6): [True: 0, False: 63.6k]
  ------------------
  284|      0|		return -1;
  285|       |
  286|  63.6k|	if (colour->n > MAX_INPUT_IMAGES) {
  ------------------
  |  |  223|  63.6k|#define MAX_INPUT_IMAGES (64)
  ------------------
  |  Branch (286:6): [True: 0, False: 63.6k]
  ------------------
  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|   127k|	for (i = 0; i < colour->n; i++)
  ------------------
  |  Branch (291:14): [True: 63.6k, False: 63.6k]
  ------------------
  292|  63.6k|		if (vips_image_pio_input(colour->in[i]))
  ------------------
  |  Branch (292:7): [True: 0, False: 63.6k]
  ------------------
  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|  63.6k|	g_assert(!colour->in[colour->n]);
  ------------------
  |  |  166|  63.6k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  63.6k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  63.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  299|       |
  300|  63.6k|	in = colour->in;
  301|  63.6k|	extra_bands = (VipsImage **)
  302|  63.6k|		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|  63.6k|	if (colour->input_bands > 0) {
  ------------------
  |  Branch (307:6): [True: 63.3k, False: 324]
  ------------------
  308|  63.3k|		VipsImage **new_in = (VipsImage **)
  309|  63.3k|			vips_object_local_array(object, colour->n);
  310|       |
  311|   126k|		for (i = 0; i < colour->n; i++) {
  ------------------
  |  Branch (311:15): [True: 63.3k, False: 63.3k]
  ------------------
  312|  63.3k|			if (vips_check_bands_atleast(class->nickname,
  ------------------
  |  Branch (312:8): [True: 0, False: 63.3k]
  ------------------
  313|  63.3k|					in[i], colour->input_bands))
  314|      0|				return -1;
  315|       |
  316|  63.3k|			if (in[i]->Bands > colour->input_bands) {
  ------------------
  |  Branch (316:8): [True: 19.6k, False: 43.6k]
  ------------------
  317|  19.6k|				if (vips_extract_band(in[i], &new_in[i], 0,
  ------------------
  |  Branch (317:9): [True: 0, False: 19.6k]
  ------------------
  318|  19.6k|						"n", colour->input_bands,
  319|  19.6k|						NULL))
  320|      0|					return -1;
  321|  19.6k|			}
  322|  43.6k|			else {
  323|  43.6k|				new_in[i] = in[i];
  324|  43.6k|				g_object_ref(new_in[i]);
  325|  43.6k|			}
  326|       |
  327|  63.3k|			if (in[i]->Bands > colour->input_bands)
  ------------------
  |  Branch (327:8): [True: 19.6k, False: 43.6k]
  ------------------
  328|  19.6k|				if (vips_extract_band(in[i], &extra_bands[i],
  ------------------
  |  Branch (328:9): [True: 0, False: 19.6k]
  ------------------
  329|  19.6k|						colour->input_bands,
  330|  19.6k|						"n", in[i]->Bands - colour->input_bands,
  331|  19.6k|						NULL))
  332|      0|					return -1;
  333|  63.3k|		}
  334|       |
  335|  63.3k|		in = new_in;
  336|  63.3k|	}
  337|       |
  338|  63.6k|	out = vips_image_new();
  339|  63.6k|	if (vips_image_pipeline_array(out,
  ------------------
  |  Branch (339:6): [True: 0, False: 63.6k]
  ------------------
  340|  63.6k|			VIPS_DEMAND_STYLE_THINSTRIP, in)) {
  341|      0|		g_object_unref(out);
  342|      0|		return -1;
  343|      0|	}
  344|  63.6k|	out->Coding = colour->coding;
  345|  63.6k|	out->Type = colour->interpretation;
  346|  63.6k|	out->BandFmt = colour->format;
  347|  63.6k|	out->Bands = colour->bands;
  348|       |
  349|  63.6k|	if (colour->profile_filename &&
  ------------------
  |  Branch (349:6): [True: 743, False: 62.9k]
  ------------------
  350|  63.6k|		vips__profile_set(out, colour->profile_filename))
  ------------------
  |  Branch (350:3): [True: 0, False: 743]
  ------------------
  351|      0|		return -1;
  352|       |
  353|  63.6k|	if (vips_image_generate(out,
  ------------------
  |  Branch (353:6): [True: 0, False: 63.6k]
  ------------------
  354|  63.6k|			vips_start_many, vips_colour_gen, vips_stop_many,
  355|  63.6k|			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|   107k|	for (i = 0; i < colour->n; i++)
  ------------------
  |  Branch (363:14): [True: 63.6k, False: 44.0k]
  ------------------
  364|  63.6k|		if (extra_bands[i]) {
  ------------------
  |  Branch (364:7): [True: 19.6k, False: 44.0k]
  ------------------
  365|  19.6k|			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|  19.6k|			if (vips_cast(extra_bands[i], &t1, out->BandFmt,
  ------------------
  |  Branch (373:8): [True: 0, False: 19.6k]
  ------------------
  374|  19.6k|					"shift", TRUE,
  ------------------
  |  |  798|  19.6k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  19.6k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  375|  19.6k|					NULL)) {
  376|      0|				g_object_unref(out);
  377|      0|				return -1;
  378|      0|			}
  379|       |
  380|  19.6k|			if (vips_bandjoin2(out, t1, &t2,
  ------------------
  |  Branch (380:8): [True: 0, False: 19.6k]
  ------------------
  381|  19.6k|					NULL)) {
  382|      0|				g_object_unref(t1);
  383|      0|				g_object_unref(out);
  384|      0|				return -1;
  385|      0|			}
  386|  19.6k|			g_object_unref(out);
  387|  19.6k|			g_object_unref(t1);
  388|  19.6k|			out = t2;
  389|       |
  390|  19.6k|			break;
  391|  19.6k|		}
  392|       |
  393|  63.6k|	g_object_set(colour, "out", out, NULL);
  394|       |
  395|  63.6k|	return 0;
  396|  63.6k|}
colour.c:vips_colour_gen:
  228|  63.6k|{
  229|  63.6k|	VipsRegion **ir = (VipsRegion **) seq;
  230|  63.6k|	VipsColour *colour = VIPS_COLOUR(b);
  ------------------
  |  |   42|  63.6k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  63.6k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  63.6k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|  63.6k|		VIPS_TYPE_COLOUR, VipsColour))
  ------------------
  231|  63.6k|	VipsColourClass *class = VIPS_COLOUR_GET_CLASS(colour);
  ------------------
  |  |   52|  63.6k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  63.6k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  63.6k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   53|  63.6k|		VIPS_TYPE_COLOUR, VipsColourClass))
  ------------------
  232|  63.6k|	VipsRect *r = &out_region->valid;
  233|       |
  234|  63.6k|	int i, y;
  235|  63.6k|	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|  63.6k|	if (vips_reorder_prepare_many(out_region->im, ir, r))
  ------------------
  |  Branch (244:6): [True: 26.6k, False: 36.9k]
  ------------------
  245|  26.6k|		return -1;
  246|       |
  247|  63.6k|	VIPS_GATE_START("vips_colour_gen: work");
  ------------------
  |  |   41|  36.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  36.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  36.9k|	{ \
  |  |   43|  36.9k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 36.9k]
  |  |  ------------------
  |  |   44|  36.9k|			vips__thread_gate_start(NAME); \
  |  |   45|  36.9k|	} \
  |  |   46|  63.6k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  63.6k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  248|       |
  249|  2.00M|	for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (249:14): [True: 1.96M, False: 36.9k]
  ------------------
  250|  3.93M|		for (i = 0; ir[i]; i++)
  ------------------
  |  Branch (250:15): [True: 1.96M, False: 1.96M]
  ------------------
  251|  1.96M|			p[i] = VIPS_REGION_ADDR(ir[i], r->left, r->top + y);
  ------------------
  |  |  227|  1.96M|	((R)->data + \
  |  |  228|  1.96M|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  1.96M|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  1.96M|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  1.96M|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  1.96M|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  1.96M|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  252|  1.96M|		p[i] = NULL;
  253|  1.96M|		q = VIPS_REGION_ADDR(out_region, r->left, r->top + y);
  ------------------
  |  |  227|  1.96M|	((R)->data + \
  |  |  228|  1.96M|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  1.96M|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  1.96M|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  1.96M|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  1.96M|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  1.96M|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  254|       |
  255|  1.96M|		class->process_line(colour, q, p, r->width);
  256|  1.96M|	}
  257|       |
  258|  36.9k|	VIPS_GATE_STOP("vips_colour_gen: work");
  ------------------
  |  |   49|  36.9k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  36.9k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  36.9k|	{ \
  |  |   51|  36.9k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 36.9k]
  |  |  ------------------
  |  |   52|  36.9k|			vips__thread_gate_stop(NAME); \
  |  |   53|  36.9k|	} \
  |  |   54|  36.9k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  36.9k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  259|       |
  260|  36.9k|	VIPS_COUNT_PIXELS(out_region, VIPS_OBJECT_GET_CLASS(colour)->nickname);
  ------------------
  |  |  189|  36.9k|#define VIPS_COUNT_PIXELS(R, N) vips__region_count_pixels(R, N)
  ------------------
  261|       |
  262|  36.9k|	return 0;
  263|  63.6k|}
colour.c:vips_colour_init:
  423|  63.6k|{
  424|  63.6k|	colour->coding = VIPS_CODING_NONE;
  425|  63.6k|	colour->interpretation = VIPS_INTERPRETATION_sRGB;
  426|  63.6k|	colour->format = VIPS_FORMAT_UCHAR;
  427|  63.6k|	colour->bands = 3;
  428|  63.6k|	colour->input_bands = -1;
  429|  63.6k|}
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|  30.8k|{
  437|  30.8k|	VipsColour *colour = VIPS_COLOUR(object);
  ------------------
  |  |   42|  30.8k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  30.8k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  30.8k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|  30.8k|		VIPS_TYPE_COLOUR, VipsColour))
  ------------------
  438|  30.8k|	VipsColourTransform *transform = VIPS_COLOUR_TRANSFORM(object);
  ------------------
  |  |  103|  30.8k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  30.8k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  30.8k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  104|  30.8k|		VIPS_TYPE_COLOUR_TRANSFORM, VipsColourTransform))
  ------------------
  439|  30.8k|	VipsImage **t = (VipsImage **) vips_object_local_array(object, 1);
  440|       |
  441|       |	/* We only process float.
  442|       |	 */
  443|  30.8k|	if (transform->in &&
  ------------------
  |  Branch (443:6): [True: 30.8k, False: 0]
  ------------------
  444|  30.8k|		transform->in->BandFmt != VIPS_FORMAT_FLOAT) {
  ------------------
  |  Branch (444:3): [True: 0, False: 30.8k]
  ------------------
  445|      0|		if (vips_cast_float(transform->in, &t[0], NULL))
  ------------------
  |  Branch (445:7): [True: 0, False: 0]
  ------------------
  446|      0|			return -1;
  447|      0|	}
  448|  30.8k|	else {
  449|  30.8k|		t[0] = transform->in;
  450|  30.8k|		g_object_ref(t[0]);
  451|  30.8k|	}
  452|       |
  453|       |	/* We always do 3 bands -> 3 bands.
  454|       |	 */
  455|  30.8k|	colour->input_bands = 3;
  456|       |
  457|  30.8k|	colour->n = 1;
  458|  30.8k|	colour->in = t;
  459|       |
  460|  30.8k|	if (VIPS_OBJECT_CLASS(vips_colour_transform_parent_class)->build(object))
  ------------------
  |  |  435|  30.8k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  30.8k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  30.8k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (460:6): [True: 0, False: 30.8k]
  ------------------
  461|      0|		return -1;
  462|       |
  463|  30.8k|	return 0;
  464|  30.8k|}
colour.c:vips_colour_transform_init:
  488|  30.8k|{
  489|  30.8k|	VipsColour *colour = (VipsColour *) space;
  490|       |
  491|       |	/* What we write. interpretation should be overwritten in subclass
  492|       |	 * builds.
  493|       |	 */
  494|  30.8k|	colour->coding = VIPS_CODING_NONE;
  495|  30.8k|	colour->interpretation = VIPS_INTERPRETATION_LAB;
  496|  30.8k|	colour->format = VIPS_FORMAT_FLOAT;
  497|  30.8k|	colour->bands = 3;
  498|  30.8k|}
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|  32.7k|{
  505|  32.7k|	VipsColour *colour = VIPS_COLOUR(object);
  ------------------
  |  |   42|  32.7k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  32.7k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  32.7k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|  32.7k|		VIPS_TYPE_COLOUR, VipsColour))
  ------------------
  506|  32.7k|	VipsColourCode *code = VIPS_COLOUR_CODE(object);
  ------------------
  |  |  135|  32.7k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  32.7k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  32.7k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  136|  32.7k|		VIPS_TYPE_COLOUR_CODE, VipsColourCode))
  ------------------
  507|  32.7k|	VipsColourCodeClass *class = VIPS_COLOUR_CODE_GET_CLASS(object);
  ------------------
  |  |  145|  32.7k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  32.7k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  32.7k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  146|  32.7k|		VIPS_TYPE_COLOUR_CODE, VipsColourCodeClass))
  ------------------
  508|  32.7k|	VipsImage **t = (VipsImage **) vips_object_local_array(object, 6);
  509|       |
  510|  32.7k|	VipsImage *in;
  511|       |
  512|  32.7k|	in = code->in;
  513|       |
  514|       |	/* If this is a LABQ and the coder wants uncoded, unpack.
  515|       |	 */
  516|  32.7k|	if (in &&
  ------------------
  |  Branch (516:6): [True: 32.7k, False: 0]
  ------------------
  517|  32.7k|		in->Coding == VIPS_CODING_LABQ &&
  ------------------
  |  Branch (517:3): [True: 35, False: 32.7k]
  ------------------
  518|  32.7k|		code->input_coding == VIPS_CODING_NONE) {
  ------------------
  |  Branch (518:3): [True: 0, False: 35]
  ------------------
  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|  32.7k|	if (in &&
  ------------------
  |  Branch (524:6): [True: 32.7k, False: 0]
  ------------------
  525|  32.7k|		vips_check_coding(VIPS_OBJECT_CLASS(class)->nickname,
  ------------------
  |  |  435|  32.7k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  32.7k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  32.7k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (525:3): [True: 0, False: 32.7k]
  ------------------
  526|  32.7k|			in, code->input_coding))
  527|      0|		return -1;
  528|       |
  529|  32.7k|	if (in &&
  ------------------
  |  Branch (529:6): [True: 32.7k, False: 0]
  ------------------
  530|  32.7k|		code->input_coding == VIPS_CODING_NONE &&
  ------------------
  |  Branch (530:3): [True: 32.4k, False: 324]
  ------------------
  531|  32.7k|		code->input_format != VIPS_FORMAT_NOTSET &&
  ------------------
  |  Branch (531:3): [True: 32.4k, False: 0]
  ------------------
  532|  32.7k|		in->BandFmt != code->input_format) {
  ------------------
  |  Branch (532:3): [True: 58, False: 32.3k]
  ------------------
  533|     58|		if (vips_cast(in, &t[3], code->input_format, NULL))
  ------------------
  |  Branch (533:7): [True: 0, False: 58]
  ------------------
  534|      0|			return -1;
  535|     58|		in = t[3];
  536|     58|	}
  537|       |
  538|  32.7k|	if (in &&
  ------------------
  |  Branch (538:6): [True: 32.7k, False: 0]
  ------------------
  539|  32.7k|		code->input_coding == VIPS_CODING_NONE &&
  ------------------
  |  Branch (539:3): [True: 32.4k, False: 324]
  ------------------
  540|  32.7k|		code->input_interpretation != VIPS_INTERPRETATION_ERROR &&
  ------------------
  |  Branch (540:3): [True: 743, False: 31.6k]
  ------------------
  541|  32.7k|		in->Type != code->input_interpretation) {
  ------------------
  |  Branch (541:3): [True: 0, False: 743]
  ------------------
  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|  32.7k|	colour->n = 1;
  549|  32.7k|	colour->in = VIPS_ARRAY(object, 2, VipsImage *);
  ------------------
  |  |   72|  32.7k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  32.7k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  32.7k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  32.7k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  32.7k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  550|  32.7k|	colour->in[0] = in;
  551|  32.7k|	colour->in[1] = NULL;
  552|       |
  553|  32.7k|	if (VIPS_OBJECT_CLASS(vips_colour_code_parent_class)->build(object))
  ------------------
  |  |  435|  32.7k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  32.7k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  32.7k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (553:6): [True: 0, False: 32.7k]
  ------------------
  554|      0|		return -1;
  555|       |
  556|  32.7k|	return 0;
  557|  32.7k|}
colour.c:vips_colour_code_init:
  581|  32.7k|{
  582|  32.7k|	code->input_coding = VIPS_CODING_NONE;
  583|  32.7k|	code->input_interpretation = VIPS_INTERPRETATION_ERROR;
  584|  32.7k|	code->input_format = VIPS_FORMAT_NOTSET;
  585|  32.7k|}
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|  7.34k|{
  119|  7.34k|	if (in->Bands > n) {
  ------------------
  |  Branch (119:6): [True: 1.14k, False: 6.20k]
  ------------------
  120|  1.14k|		VipsImage *scope = vips_image_new();
  121|  1.14k|		VipsImage **t = (VipsImage **)
  122|  1.14k|			vips_object_local_array(VIPS_OBJECT(scope), 4);
  ------------------
  |  |  433|  1.14k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  1.14k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.14k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  123|       |
  124|  1.14k|		if (vips_extract_band(in, &t[0], 0,
  ------------------
  |  Branch (124:7): [True: 0, False: 1.14k]
  ------------------
  125|  1.14k|				"n", n,
  126|  1.14k|				NULL) ||
  127|  1.14k|			vips_extract_band(in, &t[1], n,
  ------------------
  |  Branch (127:4): [True: 0, False: 1.14k]
  ------------------
  128|  1.14k|				"n", in->Bands - n,
  129|  1.14k|				NULL) ||
  130|  1.14k|			fn(t[0], &t[2], NULL) ||
  ------------------
  |  Branch (130:4): [True: 0, False: 1.14k]
  ------------------
  131|  1.14k|			vips_cast(t[1], &t[3], t[2]->BandFmt,
  ------------------
  |  Branch (131:4): [True: 0, False: 1.14k]
  ------------------
  132|  1.14k|				NULL) ||
  133|  1.14k|			vips_bandjoin2(t[2], t[3], out, NULL)) {
  ------------------
  |  Branch (133:4): [True: 0, False: 1.14k]
  ------------------
  134|      0|			g_object_unref(scope);
  135|      0|			return -1;
  136|      0|		}
  137|       |
  138|  1.14k|		g_object_unref(scope);
  139|  1.14k|	}
  140|  6.20k|	else if (in->Bands == n) {
  ------------------
  |  Branch (140:11): [True: 6.20k, False: 0]
  ------------------
  141|  6.20k|		if (fn(in, out, NULL))
  ------------------
  |  Branch (141:7): [True: 0, False: 6.20k]
  ------------------
  142|      0|			return -1;
  143|  6.20k|	}
  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|  7.34k|	return 0;
  150|  7.34k|}
vips_colourspace:
  616|  31.1k|{
  617|  31.1k|	va_list ap;
  618|  31.1k|	int result;
  619|       |
  620|  31.1k|	va_start(ap, space);
  621|  31.1k|	result = vips_call_split("colourspace", ap, in, out, space);
  622|  31.1k|	va_end(ap);
  623|       |
  624|  31.1k|	return result;
  625|  31.1k|}
colourspace.c:vips_scRGB2RGB16:
   73|    626|{
   74|    626|	return vips_scRGB2sRGB(in, out, "depth", 16, NULL);
   75|    626|}
colourspace.c:vips_scRGB2BW16:
   79|    437|{
   80|    437|	return vips_scRGB2BW(in, out, "depth", 16, NULL);
   81|    437|}
colourspace.c:vips_GREY162RGB16:
  179|    441|{
  180|    441|	if (vips__colourspace_process_n("GREY162RGB16",
  ------------------
  |  Branch (180:6): [True: 0, False: 441]
  ------------------
  181|    441|			in, out, 1, vips_BW2sRGB_op))
  182|      0|		return -1;
  183|    441|	(*out)->Type = VIPS_INTERPRETATION_RGB16;
  184|       |
  185|    441|	return 0;
  186|    441|}
colourspace.c:vips_BW2sRGB_op:
  154|  5.86k|{
  155|  5.86k|	VipsImage *t[3];
  156|       |
  157|  5.86k|	t[0] = in;
  158|  5.86k|	t[1] = in;
  159|  5.86k|	t[2] = in;
  160|  5.86k|	if (vips_bandjoin(t, out, 3, NULL))
  ------------------
  |  Branch (160:6): [True: 0, False: 5.86k]
  ------------------
  161|      0|		return -1;
  162|       |
  163|  5.86k|	return 0;
  164|  5.86k|}
colourspace.c:vips_BW2sRGB:
  168|  5.41k|{
  169|  5.41k|	if (vips__colourspace_process_n("BW2sRGB",
  ------------------
  |  Branch (169:6): [True: 0, False: 5.41k]
  ------------------
  170|  5.41k|			in, out, 1, vips_BW2sRGB_op))
  171|      0|		return -1;
  172|  5.41k|	(*out)->Type = VIPS_INTERPRETATION_sRGB;
  173|       |
  174|  5.41k|	return 0;
  175|  5.41k|}
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|  31.1k|{
  467|  31.1k|	VipsColourspace *colourspace = (VipsColourspace *) object;
  468|       |
  469|  31.1k|	int i, j;
  470|  31.1k|	VipsImage *x;
  471|  31.1k|	VipsImage **t = (VipsImage **)
  472|  31.1k|		vips_object_local_array(object, 1);
  473|  31.1k|	VipsImage **pipe = (VipsImage **)
  474|  31.1k|		vips_object_local_array(object, MAX_STEPS);
  ------------------
  |  |  191|  31.1k|#define MAX_STEPS (10)
  ------------------
  475|       |
  476|  31.1k|	VipsInterpretation interpretation;
  477|       |
  478|       |	/* Verify that all input args have been set.
  479|       |	 */
  480|  31.1k|	if (VIPS_OBJECT_CLASS(vips_colourspace_parent_class)->build(object))
  ------------------
  |  |  435|  31.1k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  31.1k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  31.1k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (480:6): [True: 0, False: 31.1k]
  ------------------
  481|      0|		return -1;
  482|       |
  483|  31.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|  31.1k|	if (x->Coding == VIPS_CODING_RAD) {
  ------------------
  |  Branch (488:6): [True: 289, False: 30.8k]
  ------------------
  489|    289|		if (vips_rad2float(x, &t[0], NULL))
  ------------------
  |  Branch (489:7): [True: 0, False: 289]
  ------------------
  490|      0|			return -1;
  491|    289|		x = t[0];
  492|    289|	}
  493|       |
  494|  31.1k|	if (vips_object_argument_isset(object, "source_space"))
  ------------------
  |  Branch (494:6): [True: 0, False: 31.1k]
  ------------------
  495|      0|		interpretation = colourspace->source_space;
  496|  31.1k|	else
  497|  31.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|  31.1k|	if (interpretation == VIPS_INTERPRETATION_RGB)
  ------------------
  |  Branch (502:6): [True: 0, False: 31.1k]
  ------------------
  503|      0|		interpretation = VIPS_INTERPRETATION_sRGB;
  504|       |
  505|       |	/* No conversion necessary.
  506|       |	 */
  507|  31.1k|	if (interpretation == colourspace->space) {
  ------------------
  |  Branch (507:6): [True: 174, False: 31.0k]
  ------------------
  508|    174|		g_object_set(colourspace, "out", vips_image_new(), NULL);
  509|       |
  510|    174|		return vips_image_write(colourspace->in, colourspace->out);
  511|    174|	}
  512|       |
  513|  3.17M|	for (i = 0; i < VIPS_NUMBER(vips_colour_routes); i++)
  ------------------
  |  |   60|  3.17M|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (513:14): [True: 3.17M, False: 26]
  ------------------
  514|  3.17M|		if (vips_colour_routes[i].from == interpretation &&
  ------------------
  |  Branch (514:7): [True: 288k, False: 2.88M]
  ------------------
  515|  3.17M|			vips_colour_routes[i].to == colourspace->space)
  ------------------
  |  Branch (515:4): [True: 30.9k, False: 258k]
  ------------------
  516|  30.9k|			break;
  517|  31.0k|	if (i == VIPS_NUMBER(vips_colour_routes)) {
  ------------------
  |  |   60|  31.0k|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (517:6): [True: 26, False: 30.9k]
  ------------------
  518|     26|		vips_error("vips_colourspace",
  519|     26|			_("no known route from '%s' to '%s'"),
  ------------------
  |  |   30|     26|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|     26|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  520|     26|			vips_enum_nick(VIPS_TYPE_INTERPRETATION,
  ------------------
  |  |  142|     26|#define VIPS_TYPE_INTERPRETATION (vips_interpretation_get_type())
  ------------------
  521|     26|				interpretation),
  522|     26|			vips_enum_nick(VIPS_TYPE_INTERPRETATION,
  ------------------
  |  |  142|     26|#define VIPS_TYPE_INTERPRETATION (vips_interpretation_get_type())
  ------------------
  523|     26|				colourspace->space));
  524|     26|		return -1;
  525|     26|	}
  526|       |
  527|   157k|	for (j = 0; vips_colour_routes[i].route[j]; j++) {
  ------------------
  |  Branch (527:14): [True: 126k, False: 30.9k]
  ------------------
  528|   126k|		if (vips_colour_routes[i].route[j](x, &pipe[j], NULL))
  ------------------
  |  Branch (528:7): [True: 0, False: 126k]
  ------------------
  529|      0|			return -1;
  530|   126k|		x = pipe[j];
  531|   126k|	}
  532|       |
  533|  30.9k|	g_object_set(colourspace, "out", vips_image_new(), NULL);
  534|  30.9k|	if (vips_image_write(x, colourspace->out))
  ------------------
  |  Branch (534:6): [True: 0, False: 30.9k]
  ------------------
  535|      0|		return -1;
  536|       |
  537|  30.9k|	return 0;
  538|  30.9k|}
colourspace.c:vips_colourspace_init:
  585|  31.1k|{
  586|  31.1k|	colourspace->source_space = VIPS_INTERPRETATION_sRGB;
  587|  31.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|    743|{
 1452|    743|	va_list ap;
 1453|    743|	int result;
 1454|       |
 1455|    743|	va_start(ap, out);
 1456|    743|	result = vips_call_split("icc_import", ap, in, out);
 1457|    743|	va_end(ap);
 1458|       |
 1459|    743|	return result;
 1460|    743|}
vips_icc_export:
 1490|    743|{
 1491|    743|	va_list ap;
 1492|    743|	int result;
 1493|       |
 1494|    743|	va_start(ap, out);
 1495|    743|	result = vips_call_split("icc_export", ap, in, out);
 1496|    743|	va_end(ap);
 1497|       |
 1498|    743|	return result;
 1499|    743|}
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|  1.48k|{
  188|  1.48k|	VipsIcc *icc = (VipsIcc *) gobject;
  189|       |
  190|  1.48k|	VIPS_FREEF(cmsDeleteTransform, icc->trans);
  ------------------
  |  |   41|  1.48k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.48k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  1.48k|	{ \
  |  |   43|  1.48k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 1.48k, False: 0]
  |  |  ------------------
  |  |   44|  1.48k|			(void) F((S)); \
  |  |   45|  1.48k|			(S) = 0; \
  |  |   46|  1.48k|		} \
  |  |   47|  1.48k|	} \
  |  |   48|  1.48k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.48k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  191|  1.48k|	VIPS_FREEF(cmsCloseProfile, icc->in_profile);
  ------------------
  |  |   41|  1.48k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.48k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  1.48k|	{ \
  |  |   43|  1.48k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 1.48k, False: 0]
  |  |  ------------------
  |  |   44|  1.48k|			(void) F((S)); \
  |  |   45|  1.48k|			(S) = 0; \
  |  |   46|  1.48k|		} \
  |  |   47|  1.48k|	} \
  |  |   48|  1.48k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.48k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  192|  1.48k|	VIPS_FREEF(cmsCloseProfile, icc->out_profile);
  ------------------
  |  |   41|  1.48k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.48k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  1.48k|	{ \
  |  |   43|  1.48k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 1.48k, False: 0]
  |  |  ------------------
  |  |   44|  1.48k|			(void) F((S)); \
  |  |   45|  1.48k|			(S) = 0; \
  |  |   46|  1.48k|		} \
  |  |   47|  1.48k|	} \
  |  |   48|  1.48k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.48k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  193|       |
  194|  1.48k|	if (icc->in_blob) {
  ------------------
  |  Branch (194:6): [True: 743, False: 743]
  ------------------
  195|    743|		vips_area_unref((VipsArea *) icc->in_blob);
  196|    743|		icc->in_blob = NULL;
  197|    743|	}
  198|       |
  199|  1.48k|	if (icc->out_blob) {
  ------------------
  |  Branch (199:6): [True: 743, False: 743]
  ------------------
  200|    743|		vips_area_unref((VipsArea *) icc->out_blob);
  201|    743|		icc->out_blob = NULL;
  202|    743|	}
  203|       |
  204|  1.48k|	G_OBJECT_CLASS(vips_icc_parent_class)->dispose(gobject);
  ------------------
  |  |   58|  1.48k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  1.48k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  1.48k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  205|  1.48k|}
icc_transform.c:vips_icc_build:
  258|  1.48k|{
  259|  1.48k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  1.48k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  1.48k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  1.48k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  260|  1.48k|	VipsColour *colour = (VipsColour *) object;
  261|  1.48k|	VipsColourCode *code = (VipsColourCode *) object;
  262|  1.48k|	VipsIcc *icc = (VipsIcc *) object;
  263|       |
  264|  1.48k|	cmsUInt32Number flags;
  265|       |
  266|  1.48k|	if (icc->depth != 8 &&
  ------------------
  |  Branch (266:6): [True: 0, False: 1.48k]
  ------------------
  267|  1.48k|		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|  1.48k|	if (icc->in_profile &&
  ------------------
  |  Branch (273:6): [True: 1.48k, False: 0]
  ------------------
  274|  1.48k|		code->in) {
  ------------------
  |  Branch (274:3): [True: 1.48k, False: 0]
  ------------------
  275|  1.48k|		int signature;
  276|  1.48k|		VipsIccInfo *info;
  277|       |
  278|  1.48k|		signature = cmsGetColorSpace(icc->in_profile);
  279|  1.48k|		if (!(info = vips_icc_info(signature))) {
  ------------------
  |  Branch (279:7): [True: 0, False: 1.48k]
  ------------------
  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|  1.48k|		colour->input_bands = info->bands;
  287|       |
  288|  1.48k|		switch (signature) {
  289|      0|		case cmsSigGrayData:
  ------------------
  |  Branch (289:3): [True: 0, False: 1.48k]
  ------------------
  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: 1.48k]
  ------------------
  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: 1.48k]
  ------------------
  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|    743|		case cmsSigXYZData:
  ------------------
  |  Branch (314:3): [True: 743, False: 743]
  ------------------
  315|    743|			code->input_format = VIPS_FORMAT_FLOAT;
  316|    743|			code->input_interpretation =
  317|    743|				VIPS_INTERPRETATION_XYZ;
  318|    743|			icc->in_icc_format = info->lcms_type8;
  319|    743|			break;
  320|       |
  321|    743|		case cmsSigCmykData:
  ------------------
  |  Branch (321:3): [True: 743, False: 743]
  ------------------
  322|    743|		case cmsSig5colorData:
  ------------------
  |  Branch (322:3): [True: 0, False: 1.48k]
  ------------------
  323|    743|		case cmsSig6colorData:
  ------------------
  |  Branch (323:3): [True: 0, False: 1.48k]
  ------------------
  324|    743|		case cmsSig7colorData:
  ------------------
  |  Branch (324:3): [True: 0, False: 1.48k]
  ------------------
  325|    743|		case cmsSig8colorData:
  ------------------
  |  Branch (325:3): [True: 0, False: 1.48k]
  ------------------
  326|    743|		case cmsSig9colorData:
  ------------------
  |  Branch (326:3): [True: 0, False: 1.48k]
  ------------------
  327|    743|		case cmsSig10colorData:
  ------------------
  |  Branch (327:3): [True: 0, False: 1.48k]
  ------------------
  328|    743|		case cmsSig11colorData:
  ------------------
  |  Branch (328:3): [True: 0, False: 1.48k]
  ------------------
  329|    743|		case cmsSig12colorData:
  ------------------
  |  Branch (329:3): [True: 0, False: 1.48k]
  ------------------
  330|       |			/* Treat as forms of CMYK.
  331|       |			 */
  332|    743|			info = vips_icc_info(
  333|    743|				cmsGetColorSpace(icc->in_profile));
  334|       |
  335|    743|			code->input_format = code->in->BandFmt == VIPS_FORMAT_USHORT
  ------------------
  |  Branch (335:25): [True: 22, False: 721]
  ------------------
  336|    743|				? VIPS_FORMAT_USHORT
  337|    743|				: VIPS_FORMAT_UCHAR;
  338|    743|			icc->in_icc_format =
  339|    743|				code->in->BandFmt == VIPS_FORMAT_USHORT
  ------------------
  |  Branch (339:5): [True: 22, False: 721]
  ------------------
  340|    743|				? info->lcms_type16
  341|    743|				: info->lcms_type8;
  342|    743|			break;
  343|       |
  344|      0|		default:
  ------------------
  |  Branch (344:3): [True: 0, False: 1.48k]
  ------------------
  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|  1.48k|		}
  348|  1.48k|	}
  349|       |
  350|  1.48k|	if (icc->out_profile) {
  ------------------
  |  Branch (350:6): [True: 1.48k, False: 0]
  ------------------
  351|  1.48k|		int signature;
  352|  1.48k|		VipsIccInfo *info;
  353|       |
  354|  1.48k|		signature = cmsGetColorSpace(icc->out_profile);
  355|  1.48k|		if (!(info = vips_icc_info(signature))) {
  ------------------
  |  Branch (355:7): [True: 0, False: 1.48k]
  ------------------
  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|  1.48k|		colour->bands = info->bands;
  363|       |
  364|  1.48k|		switch (signature) {
  365|      0|		case cmsSigGrayData:
  ------------------
  |  Branch (365:3): [True: 0, False: 1.48k]
  ------------------
  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: 1.48k]
  ------------------
  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: 1.48k]
  ------------------
  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|    743|		case cmsSigXYZData:
  ------------------
  |  Branch (395:3): [True: 743, False: 743]
  ------------------
  396|    743|			colour->interpretation = VIPS_INTERPRETATION_XYZ;
  397|    743|			colour->format = VIPS_FORMAT_FLOAT;
  398|    743|			icc->out_icc_format = info->lcms_type16;
  399|    743|			break;
  400|       |
  401|    743|		case cmsSigCmykData:
  ------------------
  |  Branch (401:3): [True: 743, False: 743]
  ------------------
  402|    743|		case cmsSig5colorData:
  ------------------
  |  Branch (402:3): [True: 0, False: 1.48k]
  ------------------
  403|    743|		case cmsSig6colorData:
  ------------------
  |  Branch (403:3): [True: 0, False: 1.48k]
  ------------------
  404|    743|		case cmsSig7colorData:
  ------------------
  |  Branch (404:3): [True: 0, False: 1.48k]
  ------------------
  405|    743|		case cmsSig8colorData:
  ------------------
  |  Branch (405:3): [True: 0, False: 1.48k]
  ------------------
  406|    743|		case cmsSig9colorData:
  ------------------
  |  Branch (406:3): [True: 0, False: 1.48k]
  ------------------
  407|    743|		case cmsSig10colorData:
  ------------------
  |  Branch (407:3): [True: 0, False: 1.48k]
  ------------------
  408|    743|		case cmsSig11colorData:
  ------------------
  |  Branch (408:3): [True: 0, False: 1.48k]
  ------------------
  409|    743|		case cmsSig12colorData:
  ------------------
  |  Branch (409:3): [True: 0, False: 1.48k]
  ------------------
  410|       |			/* Treat as forms of CMYK.
  411|       |			 */
  412|    743|			colour->interpretation = VIPS_INTERPRETATION_CMYK;
  413|    743|			colour->format = icc->depth == 8
  ------------------
  |  Branch (413:21): [True: 743, False: 0]
  ------------------
  414|    743|				? VIPS_FORMAT_UCHAR
  415|    743|				: VIPS_FORMAT_USHORT;
  416|    743|			icc->out_icc_format = icc->depth == 16
  ------------------
  |  Branch (416:26): [True: 0, False: 743]
  ------------------
  417|    743|				? info->lcms_type16
  418|    743|				: info->lcms_type8;
  419|    743|			break;
  420|       |
  421|      0|		default:
  ------------------
  |  Branch (421:3): [True: 0, False: 1.48k]
  ------------------
  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|  1.48k|		}
  425|  1.48k|	}
  426|       |
  427|       |	/* At least one must be a device profile.
  428|       |	 */
  429|  1.48k|	if (icc->in_profile &&
  ------------------
  |  Branch (429:6): [True: 1.48k, False: 0]
  ------------------
  430|  1.48k|		icc->out_profile &&
  ------------------
  |  Branch (430:3): [True: 1.48k, False: 0]
  ------------------
  431|  1.48k|		is_pcs(icc->in_profile) &&
  ------------------
  |  Branch (431:3): [True: 743, False: 743]
  ------------------
  432|  1.48k|		is_pcs(icc->out_profile)) {
  ------------------
  |  Branch (432:3): [True: 0, False: 743]
  ------------------
  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|  1.48k|	flags = cmsFLAGS_NOCACHE;
  ------------------
  |  | 1722|  1.48k|#define cmsFLAGS_NOCACHE                  0x0040    // Inhibit 1-pixel cache
  ------------------
  442|       |
  443|  1.48k|	if (icc->black_point_compensation)
  ------------------
  |  Branch (443:6): [True: 0, False: 1.48k]
  ------------------
  444|      0|		flags |= cmsFLAGS_BLACKPOINTCOMPENSATION;
  ------------------
  |  | 1731|      0|#define cmsFLAGS_BLACKPOINTCOMPENSATION   0x2000
  ------------------
  445|       |
  446|  1.48k|	if (!(icc->trans = cmsCreateTransform(
  ------------------
  |  Branch (446:6): [True: 0, False: 1.48k]
  ------------------
  447|  1.48k|			  icc->in_profile, icc->in_icc_format,
  448|  1.48k|			  icc->out_profile, icc->out_icc_format,
  449|  1.48k|			  icc->intent, flags)))
  450|      0|		return -1;
  451|       |
  452|  1.48k|	if (VIPS_OBJECT_CLASS(vips_icc_parent_class)->build(object))
  ------------------
  |  |  435|  1.48k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  1.48k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  1.48k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (452:6): [True: 0, False: 1.48k]
  ------------------
  453|      0|		return -1;
  454|       |
  455|  1.48k|	return 0;
  456|  1.48k|}
icc_transform.c:is_pcs:
  211|  2.22k|{
  212|  2.22k|	return cmsGetColorSpace(profile) == cmsSigLabData ||
  ------------------
  |  Branch (212:9): [True: 0, False: 2.22k]
  ------------------
  213|  2.22k|		cmsGetColorSpace(profile) == cmsSigXYZData;
  ------------------
  |  Branch (213:3): [True: 743, False: 1.48k]
  ------------------
  214|  2.22k|}
icc_transform.c:icc_error:
  181|      4|{
  182|      4|	vips_error("VipsIcc", "%s", text);
  183|      4|}
icc_transform.c:vips_icc_init:
  787|  1.48k|{
  788|  1.48k|	icc->intent = VIPS_INTENT_RELATIVE;
  789|  1.48k|	icc->pcs = VIPS_PCS_LAB;
  790|  1.48k|	icc->depth = 8;
  791|  1.48k|}
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|    743|{
  808|    743|	VipsColour *colour = (VipsColour *) object;
  809|    743|	VipsIcc *icc = (VipsIcc *) object;
  810|    743|	VipsIccImport *import = (VipsIccImport *) object;
  811|       |
  812|    743|	if (vips_icc_set_import(icc,
  ------------------
  |  Branch (812:6): [True: 0, False: 743]
  ------------------
  813|    743|			import->embedded, import->input_profile_filename))
  814|      0|		return -1;
  815|       |
  816|    743|	if (icc->pcs == VIPS_PCS_LAB) {
  ------------------
  |  Branch (816:6): [True: 0, False: 743]
  ------------------
  817|      0|		cmsCIExyY white;
  818|      0|		cmsWhitePointFromTemp(&white, 6504);
  819|       |
  820|      0|		icc->out_profile = cmsCreateLab4Profile(&white);
  821|      0|	}
  822|    743|	else
  823|    743|		icc->out_profile = cmsCreateXYZProfile();
  824|       |
  825|    743|	if (VIPS_OBJECT_CLASS(vips_icc_import_parent_class)->build(object))
  ------------------
  |  |  435|    743|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|    743|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    743|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (825:6): [True: 0, False: 743]
  ------------------
  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|    743|	if (icc->non_standard_input_profile &&
  ------------------
  |  Branch (834:6): [True: 743, False: 0]
  ------------------
  835|    743|		icc->in_blob) {
  ------------------
  |  Branch (835:3): [True: 743, False: 0]
  ------------------
  836|    743|		const void *data;
  837|    743|		size_t size;
  838|       |
  839|    743|		data = vips_blob_get(icc->in_blob, &size);
  840|    743|		vips_image_set_blob(colour->out, VIPS_META_ICC_NAME,
  ------------------
  |  |   78|    743|#define VIPS_META_ICC_NAME "icc-profile-data"
  ------------------
  841|    743|			NULL, data, size);
  842|    743|	}
  843|       |
  844|    743|	return 0;
  845|    743|}
icc_transform.c:vips_icc_set_import:
  688|    743|{
  689|    743|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(icc);
  ------------------
  |  |  441|    743|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|    743|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|    743|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  690|    743|	VipsColourCode *code = (VipsColourCode *) icc;
  691|       |
  692|    743|	icc->non_standard_input_profile = FALSE;
  ------------------
  |  |  794|    743|#define	FALSE	(0)
  ------------------
  693|       |
  694|       |	/* Try embedded profile.
  695|       |	 */
  696|    743|	if (code->in &&
  ------------------
  |  Branch (696:6): [True: 743, False: 0]
  ------------------
  697|    743|		(embedded || !input_profile_filename)) {
  ------------------
  |  Branch (697:4): [True: 743, False: 0]
  |  Branch (697:16): [True: 0, False: 0]
  ------------------
  698|    743|		icc->in_blob = vips_icc_get_profile_image(code->in);
  699|    743|		icc->in_profile = vips_icc_verify_blob(icc, &icc->in_blob);
  700|    743|	}
  701|       |
  702|       |	/* Try profile from filename.
  703|       |	 */
  704|    743|	if (code->in &&
  ------------------
  |  Branch (704:6): [True: 743, False: 0]
  ------------------
  705|    743|		!icc->in_blob &&
  ------------------
  |  Branch (705:3): [True: 743, False: 0]
  ------------------
  706|    743|		input_profile_filename) {
  ------------------
  |  Branch (706:3): [True: 743, False: 0]
  ------------------
  707|    743|		if (!vips_profile_load(input_profile_filename, &icc->in_blob, NULL) &&
  ------------------
  |  Branch (707:7): [True: 743, False: 0]
  ------------------
  708|    743|			(icc->in_profile = vips_icc_verify_blob(icc, &icc->in_blob)))
  ------------------
  |  Branch (708:4): [True: 743, False: 0]
  ------------------
  709|    743|			icc->non_standard_input_profile = TRUE;
  ------------------
  |  |  798|    743|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|    743|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  710|    743|	}
  711|       |
  712|       |	/* Try a built-in profile.
  713|       |	 */
  714|    743|	if (code->in &&
  ------------------
  |  Branch (714:6): [True: 743, False: 0]
  ------------------
  715|    743|		!icc->in_profile) {
  ------------------
  |  Branch (715:3): [True: 0, False: 743]
  ------------------
  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|    743|	if (!icc->in_profile) {
  ------------------
  |  Branch (738:6): [True: 0, False: 743]
  ------------------
  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|    743|	return 0;
  745|    743|}
icc_transform.c:vips_icc_get_profile_image:
  462|    743|{
  463|    743|	const void *data;
  464|    743|	size_t size;
  465|       |
  466|    743|	if (!vips_image_get_typeof(image, VIPS_META_ICC_NAME))
  ------------------
  |  |   78|    743|#define VIPS_META_ICC_NAME "icc-profile-data"
  ------------------
  |  Branch (466:6): [True: 739, False: 4]
  ------------------
  467|    739|		return NULL;
  468|      4|	if (vips_image_get_blob(image, VIPS_META_ICC_NAME, &data, &size))
  ------------------
  |  |   78|      4|#define VIPS_META_ICC_NAME "icc-profile-data"
  ------------------
  |  Branch (468:6): [True: 0, False: 4]
  ------------------
  469|      0|		return NULL;
  470|       |
  471|      4|	return vips_blob_new(NULL, data, size);
  472|      4|}
icc_transform.c:vips_icc_verify_blob:
  654|  1.48k|{
  655|  1.48k|	if (*blob) {
  ------------------
  |  Branch (655:6): [True: 747, False: 739]
  ------------------
  656|    747|		VipsColourCode *code = (VipsColourCode *) icc;
  657|    747|		cmsHPROFILE profile = vips_icc_load_profile_blob(*blob,
  658|    747|			code->in, icc->intent, LCMS_USED_AS_INPUT);
  ------------------
  |  | 1555|    747|#define LCMS_USED_AS_INPUT      0
  ------------------
  659|       |
  660|    747|		if (!profile) {
  ------------------
  |  Branch (660:7): [True: 4, False: 743]
  ------------------
  661|      4|			vips_area_unref((VipsArea *) *blob);
  662|      4|			*blob = NULL;
  663|      4|		}
  664|       |
  665|    747|		return profile;
  666|    747|	}
  667|       |
  668|    739|	return NULL;
  669|  1.48k|}
icc_transform.c:vips_icc_load_profile_blob:
  601|  1.49k|{
  602|  1.49k|	const void *data;
  603|  1.49k|	size_t size;
  604|  1.49k|	cmsHPROFILE profile;
  605|  1.49k|	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|  1.49k|	data = vips_blob_get(blob, &size);
  615|  1.49k|	if (!(profile = cmsOpenProfileFromMem(data, size))) {
  ------------------
  |  Branch (615:6): [True: 4, False: 1.48k]
  ------------------
  616|      4|		g_warning("%s", _("corrupt profile"));
  ------------------
  |  |  338|      4|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|      4|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|      4|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|      4|                               __VA_ARGS__)
  ------------------
  617|      4|		return NULL;
  618|      4|	}
  619|       |
  620|       |#ifdef DEBUG
  621|       |	vips_icc_print_profile("loaded from blob to make", profile);
  622|       |#endif /*DEBUG*/
  623|       |
  624|  1.48k|	if (!(info = vips_icc_info(cmsGetColorSpace(profile)))) {
  ------------------
  |  Branch (624:6): [True: 0, False: 1.48k]
  ------------------
  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|  1.48k|	if (image &&
  ------------------
  |  Branch (630:6): [True: 743, False: 743]
  ------------------
  631|  1.48k|		!vips_image_is_profile_compatible(image, info->bands)) {
  ------------------
  |  Branch (631:3): [True: 0, False: 743]
  ------------------
  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|  1.48k|	if (!cmsIsIntentSupported(profile, intent, direction)) {
  ------------------
  |  Branch (637:6): [True: 0, False: 1.48k]
  ------------------
  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|  1.48k|	return profile;
  646|  1.48k|}
icc_transform.c:vips_icc_import_line:
  909|  36.9k|{
  910|  36.9k|	VipsIcc *icc = (VipsIcc *) colour;
  911|       |
  912|  36.9k|	VipsPel *p;
  913|  36.9k|	float *q;
  914|  36.9k|	int i;
  915|       |
  916|       |	/* Buffer of encoded 16-bit pixels we transform.
  917|       |	 */
  918|  36.9k|	guint16 encoded[3 * PIXEL_BUFFER_SIZE];
  919|       |
  920|  36.9k|	p = (VipsPel *) in[0];
  921|  36.9k|	q = (float *) out;
  922|  73.8k|	for (i = 0; i < width; i += PIXEL_BUFFER_SIZE) {
  ------------------
  |  |  101|  36.9k|#define PIXEL_BUFFER_SIZE (10000)
  ------------------
  |  Branch (922:14): [True: 36.9k, False: 36.9k]
  ------------------
  923|  36.9k|		const int chunk = VIPS_MIN(width - i, PIXEL_BUFFER_SIZE);
  ------------------
  |  |   55|  36.9k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 36.9k, False: 0]
  |  |  ------------------
  ------------------
  924|       |
  925|  36.9k|		cmsDoTransform(icc->trans, p, encoded, chunk);
  926|       |
  927|  36.9k|		if (icc->pcs == VIPS_PCS_LAB)
  ------------------
  |  Branch (927:7): [True: 0, False: 36.9k]
  ------------------
  928|      0|			decode_lab(encoded, q, chunk);
  929|  36.9k|		else
  930|  36.9k|			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|  36.9k|		p += PIXEL_BUFFER_SIZE *
  ------------------
  |  |  101|  36.9k|#define PIXEL_BUFFER_SIZE (10000)
  ------------------
  935|  36.9k|			colour->input_bands *
  936|  36.9k|			VIPS_IMAGE_SIZEOF_ELEMENT(colour->in[0]);
  ------------------
  |  |  382|  36.9k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  ------------------
  937|  36.9k|		q += PIXEL_BUFFER_SIZE * 3;
  ------------------
  |  |  101|  36.9k|#define PIXEL_BUFFER_SIZE (10000)
  ------------------
  938|  36.9k|	}
  939|  36.9k|}
icc_transform.c:decode_xyz:
  871|  36.9k|{
  872|  36.9k|	int i;
  873|       |
  874|  3.21M|	for (i = 0; i < n; i++) {
  ------------------
  |  Branch (874:14): [True: 3.17M, False: 36.9k]
  ------------------
  875|       |		/* cmsXYZEncoded2Float inlined.
  876|       |		 */
  877|  3.17M|		float X = fixed[0] / 32768.0;
  878|  3.17M|		float Y = fixed[1] / 32768.0;
  879|  3.17M|		float Z = fixed[2] / 32768.0;
  880|       |
  881|  3.17M|		X *= SCALE;
  ------------------
  |  |  867|  3.17M|#define SCALE (VIPS_D65_Y0)
  |  |  ------------------
  |  |  |  |   59|  3.17M|#define VIPS_D65_Y0 (100.0)
  |  |  ------------------
  ------------------
  882|  3.17M|		Y *= SCALE;
  ------------------
  |  |  867|  3.17M|#define SCALE (VIPS_D65_Y0)
  |  |  ------------------
  |  |  |  |   59|  3.17M|#define VIPS_D65_Y0 (100.0)
  |  |  ------------------
  ------------------
  883|  3.17M|		Z *= SCALE;
  ------------------
  |  |  867|  3.17M|#define SCALE (VIPS_D65_Y0)
  |  |  ------------------
  |  |  |  |   59|  3.17M|#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|  3.17M|		xyz[0] = 0.955513 * X +
  890|  3.17M|			-0.023073 * Y +
  891|  3.17M|			0.063309 * Z;
  892|  3.17M|		xyz[1] = -0.028325 * X +
  893|  3.17M|			1.009942 * Y +
  894|  3.17M|			0.021055 * Z;
  895|  3.17M|		xyz[2] = 0.012329 * X +
  896|  3.17M|			-0.020536 * Y +
  897|  3.17M|			1.330714 * Z;
  898|       |
  899|  3.17M|		xyz += 3;
  900|  3.17M|		fixed += 3;
  901|  3.17M|	}
  902|  36.9k|}
icc_transform.c:vips_icc_import_init:
  974|    743|{
  975|    743|}
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_export_build:
  990|    743|{
  991|    743|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|    743|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|    743|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|    743|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  992|    743|	VipsColour *colour = (VipsColour *) object;
  993|    743|	VipsColourCode *code = (VipsColourCode *) object;
  994|    743|	VipsIcc *icc = (VipsIcc *) object;
  995|    743|	VipsIccExport *export = (VipsIccExport *) object;
  996|       |
  997|       |	/* If icc->pcs hasn't been set and this image is tagged as XYZ, swap
  998|       |	 * to XYZ pcs. This will save a XYZ->LAB conversion when we chain up.
  999|       |	 */
 1000|    743|	if (!vips_object_argument_isset(object, "pcs") &&
  ------------------
  |  Branch (1000:6): [True: 0, False: 743]
  ------------------
 1001|    743|		code->in &&
  ------------------
  |  Branch (1001:3): [True: 0, False: 0]
  ------------------
 1002|    743|		code->in->Type == VIPS_INTERPRETATION_XYZ)
  ------------------
  |  Branch (1002:3): [True: 0, False: 0]
  ------------------
 1003|      0|		icc->pcs = VIPS_PCS_XYZ; // FIXME: Invalidates operation cache
 1004|       |
 1005|    743|	if (icc->pcs == VIPS_PCS_LAB) {
  ------------------
  |  Branch (1005:6): [True: 0, False: 743]
  ------------------
 1006|      0|		cmsCIExyY white;
 1007|      0|		cmsWhitePointFromTemp(&white, 6504);
 1008|       |
 1009|      0|		icc->in_profile = cmsCreateLab4Profile(&white);
 1010|      0|	}
 1011|    743|	else
 1012|    743|		icc->in_profile = cmsCreateXYZProfile();
 1013|       |
 1014|    743|	if (code->in &&
  ------------------
  |  Branch (1014:6): [True: 743, False: 0]
  ------------------
 1015|    743|		!export->output_profile_filename)
  ------------------
  |  Branch (1015:3): [True: 0, False: 743]
  ------------------
 1016|      0|		icc->out_blob = vips_icc_get_profile_image(code->in);
 1017|       |
 1018|    743|	if (!icc->out_blob &&
  ------------------
  |  Branch (1018:6): [True: 743, False: 0]
  ------------------
 1019|    743|		export->output_profile_filename) {
  ------------------
  |  Branch (1019:3): [True: 743, False: 0]
  ------------------
 1020|    743|		if (vips_profile_load(export->output_profile_filename,
  ------------------
  |  Branch (1020:7): [True: 0, False: 743]
  ------------------
 1021|    743|				&icc->out_blob, NULL))
 1022|      0|			return -1;
 1023|    743|		colour->profile_filename = export->output_profile_filename;
 1024|    743|	}
 1025|       |
 1026|    743|	if (icc->out_blob &&
  ------------------
  |  Branch (1026:6): [True: 743, False: 0]
  ------------------
 1027|    743|		!(icc->out_profile = vips_icc_load_profile_blob(icc->out_blob,
  ------------------
  |  Branch (1027:3): [True: 0, False: 743]
  ------------------
 1028|    743|			  NULL, icc->intent, LCMS_USED_AS_OUTPUT))) {
  ------------------
  |  | 1556|    743|#define LCMS_USED_AS_OUTPUT     1
  ------------------
 1029|      0|		vips_error(class->nickname, "%s", _("no output profile"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1030|      0|		return -1;
 1031|      0|	}
 1032|       |
 1033|    743|	if (VIPS_OBJECT_CLASS(vips_icc_export_parent_class)->build(object))
  ------------------
  |  |  435|    743|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|    743|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    743|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1033:6): [True: 0, False: 743]
  ------------------
 1034|      0|		return -1;
 1035|       |
 1036|    743|	return 0;
 1037|    743|}
icc_transform.c:vips_icc_export_line:
 1104|  36.9k|{
 1105|  36.9k|	VipsIcc *icc = (VipsIcc *) colour;
 1106|       |
 1107|  36.9k|	if (icc->pcs == VIPS_PCS_LAB)
  ------------------
  |  Branch (1107:6): [True: 0, False: 36.9k]
  ------------------
 1108|      0|		cmsDoTransform(icc->trans, in[0], out, width);
 1109|  36.9k|	else
 1110|  36.9k|		vips_icc_export_line_xyz(colour, out, in, width);
 1111|  36.9k|}
icc_transform.c:vips_icc_export_line_xyz:
 1071|  36.9k|{
 1072|  36.9k|	VipsIcc *icc = (VipsIcc *) colour;
 1073|       |
 1074|  36.9k|	float *p;
 1075|  36.9k|	VipsPel *q;
 1076|  36.9k|	int x;
 1077|       |
 1078|       |	/* Buffer of encoded float pixels we transform to device space.
 1079|       |	 */
 1080|  36.9k|	float encoded[3 * PIXEL_BUFFER_SIZE];
 1081|       |
 1082|  36.9k|	p = (float *) in[0];
 1083|  36.9k|	q = (VipsPel *) out;
 1084|  73.8k|	for (x = 0; x < width; x += PIXEL_BUFFER_SIZE) {
  ------------------
  |  |  101|  36.9k|#define PIXEL_BUFFER_SIZE (10000)
  ------------------
  |  Branch (1084:14): [True: 36.9k, False: 36.9k]
  ------------------
 1085|  36.9k|		const int chunk = VIPS_MIN(width - x, PIXEL_BUFFER_SIZE);
  ------------------
  |  |   55|  36.9k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 36.9k, False: 0]
  |  |  ------------------
  ------------------
 1086|       |
 1087|  36.9k|		encode_xyz(p, encoded, chunk);
 1088|  36.9k|		cmsDoTransform(icc->trans, encoded, q, chunk);
 1089|       |
 1090|  36.9k|		p += PIXEL_BUFFER_SIZE * 3;
  ------------------
  |  |  101|  36.9k|#define PIXEL_BUFFER_SIZE (10000)
  ------------------
 1091|       |		// use colour->bands, since out may have had alpha reattached
 1092|       |		// and can have extra bands
 1093|  36.9k|		q += PIXEL_BUFFER_SIZE *
  ------------------
  |  |  101|  36.9k|#define PIXEL_BUFFER_SIZE (10000)
  ------------------
 1094|  36.9k|			colour->bands *
 1095|  36.9k|			VIPS_IMAGE_SIZEOF_ELEMENT(colour->out);
  ------------------
  |  |  382|  36.9k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  ------------------
 1096|  36.9k|	}
 1097|  36.9k|}
icc_transform.c:encode_xyz:
 1041|  36.9k|{
 1042|  36.9k|	int i;
 1043|       |
 1044|  3.21M|	for (i = 0; i < n; i++) {
  ------------------
  |  Branch (1044:14): [True: 3.17M, False: 36.9k]
  ------------------
 1045|  3.17M|		float X = in[0] / SCALE;
  ------------------
  |  |  867|  3.17M|#define SCALE (VIPS_D65_Y0)
  |  |  ------------------
  |  |  |  |   59|  3.17M|#define VIPS_D65_Y0 (100.0)
  |  |  ------------------
  ------------------
 1046|  3.17M|		float Y = in[1] / SCALE;
  ------------------
  |  |  867|  3.17M|#define SCALE (VIPS_D65_Y0)
  |  |  ------------------
  |  |  |  |   59|  3.17M|#define VIPS_D65_Y0 (100.0)
  |  |  ------------------
  ------------------
 1047|  3.17M|		float Z = in[2] / SCALE;
  ------------------
  |  |  867|  3.17M|#define SCALE (VIPS_D65_Y0)
  |  |  ------------------
  |  |  |  |   59|  3.17M|#define VIPS_D65_Y0 (100.0)
  |  |  ------------------
  ------------------
 1048|       |
 1049|       |		/* Transform XYZ D65 to D50, chromatic adaption is done with the
 1050|       |		 * Bradford transformation.
 1051|       |		 * See: https://fujiwaratko.sakura.ne.jp/infosci/colorspace/bradford_e.html
 1052|       |		 */
 1053|  3.17M|		out[0] = 1.047886 * X +
 1054|  3.17M|			0.022919 * Y +
 1055|  3.17M|			-0.050216 * Z;
 1056|  3.17M|		out[1] = 0.029582 * X +
 1057|  3.17M|			0.990484 * Y +
 1058|  3.17M|			-0.017079 * Z;
 1059|  3.17M|		out[2] = -0.009252 * X +
 1060|  3.17M|			0.015073 * Y +
 1061|  3.17M|			0.751678 * Z;
 1062|       |
 1063|  3.17M|		in += 3;
 1064|  3.17M|		out += 3;
 1065|  3.17M|	}
 1066|  36.9k|}
icc_transform.c:vips_icc_export_init:
 1146|    743|{
 1147|    743|}
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|  5.20k|{
  247|  5.20k|	int i;
  248|       |
  249|  24.5k|	for (i = 0; i < VIPS_NUMBER(vips_icc_info_table); i++)
  ------------------
  |  |   60|  24.5k|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (249:14): [True: 24.5k, False: 0]
  ------------------
  250|  24.5k|		if (vips_icc_info_table[i].signature == signature)
  ------------------
  |  Branch (250:7): [True: 5.20k, False: 19.3k]
  ------------------
  251|  5.20k|			return &vips_icc_info_table[i];
  252|       |
  253|      0|	return NULL;
  254|  5.20k|}
icc_transform.c:vips_image_is_profile_compatible:
  553|    743|{
  554|    743|	switch (image->Type) {
  555|      0|	case VIPS_INTERPRETATION_B_W:
  ------------------
  |  Branch (555:2): [True: 0, False: 743]
  ------------------
  556|      0|	case VIPS_INTERPRETATION_GREY16:
  ------------------
  |  Branch (556:2): [True: 0, False: 743]
  ------------------
  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: 743]
  ------------------
  562|      0|	case VIPS_INTERPRETATION_LAB:
  ------------------
  |  Branch (562:2): [True: 0, False: 743]
  ------------------
  563|      0|	case VIPS_INTERPRETATION_LABQ:
  ------------------
  |  Branch (563:2): [True: 0, False: 743]
  ------------------
  564|      0|	case VIPS_INTERPRETATION_RGB:
  ------------------
  |  Branch (564:2): [True: 0, False: 743]
  ------------------
  565|      0|	case VIPS_INTERPRETATION_CMC:
  ------------------
  |  Branch (565:2): [True: 0, False: 743]
  ------------------
  566|      0|	case VIPS_INTERPRETATION_LCH:
  ------------------
  |  Branch (566:2): [True: 0, False: 743]
  ------------------
  567|      0|	case VIPS_INTERPRETATION_LABS:
  ------------------
  |  Branch (567:2): [True: 0, False: 743]
  ------------------
  568|      0|	case VIPS_INTERPRETATION_sRGB:
  ------------------
  |  Branch (568:2): [True: 0, False: 743]
  ------------------
  569|      0|	case VIPS_INTERPRETATION_YXY:
  ------------------
  |  Branch (569:2): [True: 0, False: 743]
  ------------------
  570|      0|	case VIPS_INTERPRETATION_RGB16:
  ------------------
  |  Branch (570:2): [True: 0, False: 743]
  ------------------
  571|      0|	case VIPS_INTERPRETATION_scRGB:
  ------------------
  |  Branch (571:2): [True: 0, False: 743]
  ------------------
  572|      0|	case VIPS_INTERPRETATION_HSV:
  ------------------
  |  Branch (572:2): [True: 0, False: 743]
  ------------------
  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|    743|	case VIPS_INTERPRETATION_CMYK:
  ------------------
  |  Branch (578:2): [True: 743, 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|    743|		return profile_bands >= 4;
  583|       |
  584|      0|	case VIPS_INTERPRETATION_MULTIBAND:
  ------------------
  |  Branch (584:2): [True: 0, False: 743]
  ------------------
  585|      0|	case VIPS_INTERPRETATION_HISTOGRAM:
  ------------------
  |  Branch (585:2): [True: 0, False: 743]
  ------------------
  586|      0|	case VIPS_INTERPRETATION_MATRIX:
  ------------------
  |  Branch (586:2): [True: 0, False: 743]
  ------------------
  587|      0|	case VIPS_INTERPRETATION_FOURIER:
  ------------------
  |  Branch (587:2): [True: 0, False: 743]
  ------------------
  588|      0|	default:
  ------------------
  |  Branch (588:2): [True: 0, False: 743]
  ------------------
  589|      0|		return image->Bands >= profile_bands;
  590|    743|	}
  591|    743|}

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

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

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

vips_scRGB2BW:
  283|  5.63k|{
  284|  5.63k|	va_list ap;
  285|  5.63k|	int result;
  286|       |
  287|  5.63k|	va_start(ap, out);
  288|  5.63k|	result = vips_call_split("scRGB2BW", ap, in, out);
  289|  5.63k|	va_end(ap);
  290|       |
  291|  5.63k|	return result;
  292|  5.63k|}
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|}
scRGB2BW.c:vips_scRGB2BW_build:
  159|  5.63k|{
  160|  5.63k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  5.63k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  5.63k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  5.63k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  161|  5.63k|	VipsscRGB2BW *scRGB2BW = (VipsscRGB2BW *) object;
  162|       |
  163|  5.63k|	VipsImage **t = (VipsImage **) vips_object_local_array(object, 2);
  164|       |
  165|  5.63k|	VipsImage *in;
  166|  5.63k|	VipsBandFormat format;
  167|  5.63k|	VipsInterpretation interpretation;
  168|  5.63k|	VipsImage *out;
  169|       |
  170|  5.63k|	if (VIPS_OBJECT_CLASS(vips_scRGB2BW_parent_class)->build(object))
  ------------------
  |  |  435|  5.63k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  5.63k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  5.63k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (170:6): [True: 0, False: 5.63k]
  ------------------
  171|      0|		return -1;
  172|       |
  173|  5.63k|	in = scRGB2BW->in;
  174|  5.63k|	if (vips_check_bands_atleast(class->nickname, in, 3))
  ------------------
  |  Branch (174:6): [True: 0, False: 5.63k]
  ------------------
  175|      0|		return -1;
  176|       |
  177|  5.63k|	switch (scRGB2BW->depth) {
  178|    437|	case 16:
  ------------------
  |  Branch (178:2): [True: 437, False: 5.20k]
  ------------------
  179|    437|		interpretation = VIPS_INTERPRETATION_GREY16;
  180|    437|		format = VIPS_FORMAT_USHORT;
  181|    437|		break;
  182|       |
  183|  5.20k|	case 8:
  ------------------
  |  Branch (183:2): [True: 5.20k, False: 437]
  ------------------
  184|  5.20k|		interpretation = VIPS_INTERPRETATION_B_W;
  185|  5.20k|		format = VIPS_FORMAT_UCHAR;
  186|  5.20k|		break;
  187|       |
  188|      0|	default:
  ------------------
  |  Branch (188:2): [True: 0, False: 5.63k]
  ------------------
  189|      0|		vips_error(class->nickname,
  190|      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"
  |  |  ------------------
  ------------------
  191|      0|		return -1;
  192|  5.63k|	}
  193|       |
  194|  5.63k|	if (vips_cast_float(in, &t[0], NULL))
  ------------------
  |  Branch (194:6): [True: 0, False: 5.63k]
  ------------------
  195|      0|		return -1;
  196|  5.63k|	in = t[0];
  197|       |
  198|  5.63k|	out = vips_image_new();
  199|  5.63k|	if (vips_image_pipelinev(out,
  ------------------
  |  Branch (199:6): [True: 0, False: 5.63k]
  ------------------
  200|  5.63k|			VIPS_DEMAND_STYLE_THINSTRIP, in, NULL)) {
  201|      0|		g_object_unref(out);
  202|      0|		return -1;
  203|      0|	}
  204|  5.63k|	out->Type = interpretation;
  205|  5.63k|	out->BandFmt = format;
  206|  5.63k|	out->Bands = in->Bands - 2;
  207|       |
  208|  5.63k|	if (vips_image_generate(out,
  ------------------
  |  Branch (208:6): [True: 0, False: 5.63k]
  ------------------
  209|  5.63k|			vips_start_one, vips_scRGB2BW_gen, vips_stop_one,
  210|  5.63k|			in, scRGB2BW)) {
  211|      0|		g_object_unref(out);
  212|      0|		return -1;
  213|      0|	}
  214|       |
  215|  5.63k|	g_object_set(object, "out", out, NULL);
  216|       |
  217|  5.63k|	return 0;
  218|  5.63k|}
scRGB2BW.c:vips_scRGB2BW_gen:
  125|  5.63k|{
  126|  5.63k|	VipsRegion *ir = (VipsRegion *) seq;
  127|  5.63k|	VipsscRGB2BW *scRGB2BW = (VipsscRGB2BW *) b;
  128|  5.63k|	VipsRect *r = &out_region->valid;
  129|  5.63k|	VipsImage *in = ir->im;
  130|       |
  131|  5.63k|	int y;
  132|       |
  133|  5.63k|	if (vips_region_prepare(ir, r))
  ------------------
  |  Branch (133:6): [True: 549, False: 5.08k]
  ------------------
  134|    549|		return -1;
  135|       |
  136|  5.63k|	VIPS_GATE_START("vips_scRGB2BW_gen: work");
  ------------------
  |  |   41|  5.08k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  5.08k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  5.08k|	{ \
  |  |   43|  5.08k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 5.08k]
  |  |  ------------------
  |  |   44|  5.08k|			vips__thread_gate_start(NAME); \
  |  |   45|  5.08k|	} \
  |  |   46|  5.63k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  5.63k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  137|       |
  138|   270k|	for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (138:14): [True: 265k, False: 5.08k]
  ------------------
  139|   265k|		float *p = (float *)
  140|   265k|			VIPS_REGION_ADDR(ir, r->left, r->top + 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))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  141|   265k|		VipsPel *q = (VipsPel *)
  142|   265k|			VIPS_REGION_ADDR(out_region, r->left, r->top + 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))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  143|       |
  144|   265k|		if (scRGB2BW->depth == 16)
  ------------------
  |  Branch (144:7): [True: 12.9k, False: 252k]
  ------------------
  145|  12.9k|			vips_scRGB2BW_line_16((unsigned short *) q, p,
  146|  12.9k|				in->Bands - 3, r->width);
  147|   252k|		else
  148|   252k|			vips_scRGB2BW_line_8(q, p,
  149|   252k|				in->Bands - 3, r->width);
  150|   265k|	}
  151|       |
  152|  5.08k|	VIPS_GATE_STOP("vips_scRGB2BW_gen: work");
  ------------------
  |  |   49|  5.08k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  5.08k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  5.08k|	{ \
  |  |   51|  5.08k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 5.08k]
  |  |  ------------------
  |  |   52|  5.08k|			vips__thread_gate_stop(NAME); \
  |  |   53|  5.08k|	} \
  |  |   54|  5.08k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  5.08k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  153|       |
  154|  5.08k|	return 0;
  155|  5.63k|}
scRGB2BW.c:vips_scRGB2BW_line_16:
   96|  12.9k|{
   97|  12.9k|	int i, j;
   98|       |
   99|   421k|	for (i = 0; i < width; i++) {
  ------------------
  |  Branch (99:14): [True: 408k, False: 12.9k]
  ------------------
  100|   408k|		float R = p[0];
  101|   408k|		float G = p[1];
  102|   408k|		float B = p[2];
  103|       |
  104|   408k|		int g;
  105|   408k|		int og;
  106|       |
  107|   408k|		vips_col_scRGB2BW_16(R, G, B, &g, &og);
  108|       |
  109|   408k|		p += 3;
  110|       |
  111|   408k|		q[0] = g;
  112|       |
  113|   408k|		q += 1;
  114|       |
  115|   824k|		for (j = 0; j < extra_bands; j++)
  ------------------
  |  Branch (115:15): [True: 415k, False: 408k]
  ------------------
  116|   415k|			q[j] = VIPS_CLIP(0, (int) (p[j] * 65535.0), USHRT_MAX);
  ------------------
  |  |   57|   415k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|   830k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 0, False: 415k]
  |  |  |  |  |  Branch (54:32): [True: 0, False: 415k]
  |  |  |  |  |  Branch (54:44): [True: 0, False: 415k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  117|   408k|		p += extra_bands;
  118|   408k|		q += extra_bands;
  119|   408k|	}
  120|  12.9k|}
scRGB2BW.c:vips_scRGB2BW_line_8:
   67|   252k|{
   68|   252k|	int i, j;
   69|       |
   70|  17.8M|	for (i = 0; i < width; i++) {
  ------------------
  |  Branch (70:14): [True: 17.5M, False: 252k]
  ------------------
   71|  17.5M|		float R = p[0];
   72|  17.5M|		float G = p[1];
   73|  17.5M|		float B = p[2];
   74|       |
   75|  17.5M|		int g;
   76|  17.5M|		int og;
   77|       |
   78|  17.5M|		vips_col_scRGB2BW_8(R, G, B, &g, &og);
   79|       |
   80|  17.5M|		p += 3;
   81|       |
   82|  17.5M|		q[0] = g;
   83|       |
   84|  17.5M|		q += 1;
   85|       |
   86|  18.8M|		for (j = 0; j < extra_bands; j++)
  ------------------
  |  Branch (86:15): [True: 1.21M, False: 17.5M]
  ------------------
   87|  17.5M|			q[j] = VIPS_CLIP(0, (int) (p[j] * 255.0), UCHAR_MAX);
  ------------------
  |  |   57|  1.21M|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|  2.43M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 0, False: 1.21M]
  |  |  |  |  |  Branch (54:32): [True: 0, False: 1.21M]
  |  |  |  |  |  Branch (54:44): [True: 0, False: 1.21M]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   88|  17.5M|		p += extra_bands;
   89|  17.5M|		q += extra_bands;
   90|  17.5M|	}
   91|   252k|}
scRGB2BW.c:vips_scRGB2BW_init:
  258|  5.63k|{
  259|  5.63k|	scRGB2BW->depth = 8;
  260|  5.63k|}

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

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

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

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

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|  5.86k|{
  256|  5.86k|	va_list ap;
  257|  5.86k|	int result;
  258|       |
  259|  5.86k|	va_start(ap, n);
  260|  5.86k|	result = vips_bandjoinv(in, out, n, ap);
  261|  5.86k|	va_end(ap);
  262|       |
  263|  5.86k|	return result;
  264|  5.86k|}
vips_bandjoin2:
  279|  36.3k|{
  280|  36.3k|	va_list ap;
  281|  36.3k|	int result;
  282|  36.3k|	VipsImage *in[2];
  283|       |
  284|  36.3k|	in[0] = in1;
  285|  36.3k|	in[1] = in2;
  286|       |
  287|  36.3k|	va_start(ap, out);
  288|  36.3k|	result = vips_bandjoinv(in, out, 2, ap);
  289|  36.3k|	va_end(ap);
  290|       |
  291|  36.3k|	return result;
  292|  36.3k|}
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|  42.2k|{
  157|  42.2k|	VipsBandary *bandary = (VipsBandary *) object;
  158|  42.2k|	VipsBandjoin *bandjoin = (VipsBandjoin *) object;
  159|       |
  160|  42.2k|	if (bandjoin->in) {
  ------------------
  |  Branch (160:6): [True: 42.2k, False: 0]
  ------------------
  161|  42.2k|		bandary->in = vips_array_image_get(bandjoin->in, &bandary->n);
  162|       |
  163|  42.2k|		if (bandary->n == 1)
  ------------------
  |  Branch (163:7): [True: 0, False: 42.2k]
  ------------------
  164|      0|			return vips_bandary_copy(bandary);
  165|  42.2k|		else {
  166|  42.2k|			int i;
  167|       |
  168|  42.2k|			bandary->out_bands = 0;
  169|   132k|			for (i = 0; i < bandary->n; i++)
  ------------------
  |  Branch (169:16): [True: 90.3k, False: 42.2k]
  ------------------
  170|  90.3k|				if (bandary->in[i])
  ------------------
  |  Branch (170:9): [True: 90.3k, False: 0]
  ------------------
  171|  90.3k|					bandary->out_bands +=
  172|  90.3k|						bandary->in[i]->Bands;
  173|  42.2k|		}
  174|  42.2k|	}
  175|       |
  176|  42.2k|	if (VIPS_OBJECT_CLASS(vips_bandjoin_parent_class)->build(object))
  ------------------
  |  |  435|  42.2k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  42.2k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  42.2k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (176:6): [True: 0, False: 42.2k]
  ------------------
  177|      0|		return -1;
  178|       |
  179|  42.2k|	return 0;
  180|  42.2k|}
bandjoin.c:vips_bandjoin_buffer:
   93|  1.27M|{
   94|  1.27M|	VipsBandary *bandary = seq->bandary;
   95|  1.27M|	VipsConversion *conversion = (VipsConversion *) bandary;
   96|  1.27M|	VipsImage **in = bandary->ready;
   97|       |
   98|       |	/* Output pel size.
   99|       |	 */
  100|  1.27M|	const int ops = VIPS_IMAGE_SIZEOF_PEL(conversion->out);
  ------------------
  |  |  384|  1.27M|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|  1.27M|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  101|       |
  102|  1.27M|	int i;
  103|       |
  104|       |	/* Loop for each input image. Scattered write is faster than
  105|       |	 * scattered read.
  106|       |	 */
  107|  4.09M|	for (i = 0; i < bandary->n; i++) {
  ------------------
  |  Branch (107:14): [True: 2.82M, False: 1.27M]
  ------------------
  108|       |		/* Input pel size.
  109|       |		 */
  110|  2.82M|		int ips = VIPS_IMAGE_SIZEOF_PEL(in[i]);
  ------------------
  |  |  384|  2.82M|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|  2.82M|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  111|       |
  112|  2.82M|		VipsPel *restrict p1;
  113|  2.82M|		VipsPel *restrict q1;
  114|  2.82M|		int x, z;
  115|       |
  116|  2.82M|		q1 = q;
  117|  2.82M|		p1 = p[i];
  118|       |
  119|  2.82M|		if (ips == 1) {
  ------------------
  |  Branch (119:7): [True: 686k, False: 2.13M]
  ------------------
  120|  52.3M|			for (x = 0; x < width; x++) {
  ------------------
  |  Branch (120:16): [True: 51.6M, False: 686k]
  ------------------
  121|  51.6M|				q1[0] = p1[x];
  122|       |
  123|  51.6M|				q1 += ops;
  124|  51.6M|			}
  125|       |
  126|   686k|			q += ips;
  127|   686k|		}
  128|  2.13M|		else if (ips == 3) {
  ------------------
  |  Branch (128:12): [True: 8.13k, False: 2.12M]
  ------------------
  129|   325k|			for (x = 0; x < width; x++) {
  ------------------
  |  Branch (129:16): [True: 317k, False: 8.13k]
  ------------------
  130|   317k|				q1[0] = p1[0];
  131|   317k|				q1[1] = p1[1];
  132|   317k|				q1[2] = p1[2];
  133|       |
  134|   317k|				p1 += ips;
  135|   317k|				q1 += ops;
  136|   317k|			}
  137|       |
  138|  8.13k|			q += ips;
  139|  8.13k|		}
  140|  2.12M|		else {
  141|   122M|			for (x = 0; x < width; x++) {
  ------------------
  |  Branch (141:16): [True: 120M, False: 2.12M]
  ------------------
  142|   734M|				for (z = 0; z < ips; z++)
  ------------------
  |  Branch (142:17): [True: 614M, False: 120M]
  ------------------
  143|   614M|					q1[z] = p1[z];
  144|       |
  145|   120M|				p1 += ips;
  146|   120M|				q1 += ops;
  147|   120M|			}
  148|       |
  149|  2.12M|			q += ips;
  150|  2.12M|		}
  151|  2.82M|	}
  152|  1.27M|}
bandjoin.c:vips_bandjoin_init:
  210|  42.2k|{
  211|       |	/* Init our instance fields.
  212|       |	 */
  213|  42.2k|}
bandjoin.c:vips_bandjoinv:
  217|  42.2k|{
  218|  42.2k|	VipsArrayImage *array;
  219|  42.2k|	int result;
  220|       |
  221|  42.2k|	array = vips_array_image_new(in, n);
  222|  42.2k|	result = vips_call_split("bandjoin", ap, array, out);
  223|  42.2k|	vips_area_unref(VIPS_AREA(array));
  ------------------
  |  |  137|  42.2k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
  224|       |
  225|  42.2k|	return result;
  226|  42.2k|}
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|   136k|{
  590|   136k|	va_list ap;
  591|   136k|	int result;
  592|       |
  593|   136k|	va_start(ap, format);
  594|   136k|	result = vips_castv(in, out, format, ap);
  595|   136k|	va_end(ap);
  596|       |
  597|   136k|	return result;
  598|   136k|}
vips_cast_short:
  681|  15.5k|{
  682|  15.5k|	va_list ap;
  683|  15.5k|	int result;
  684|       |
  685|  15.5k|	va_start(ap, out);
  686|  15.5k|	result = vips_castv(in, out, VIPS_FORMAT_SHORT, ap);
  687|  15.5k|	va_end(ap);
  688|       |
  689|  15.5k|	return result;
  690|  15.5k|}
vips_cast_float:
  750|  43.0k|{
  751|  43.0k|	va_list ap;
  752|  43.0k|	int result;
  753|       |
  754|  43.0k|	va_start(ap, out);
  755|  43.0k|	result = vips_castv(in, out, VIPS_FORMAT_FLOAT, ap);
  756|  43.0k|	va_end(ap);
  757|       |
  758|  43.0k|	return result;
  759|  43.0k|}
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|   179k|{
  462|   179k|	VipsConversion *conversion = VIPS_CONVERSION(object);
  ------------------
  |  |   40|   179k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   179k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   179k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|   179k|		VIPS_TYPE_CONVERSION, VipsConversion))
  ------------------
  463|   179k|	VipsCast *cast = (VipsCast *) object;
  464|   179k|	VipsImage **t = (VipsImage **)
  465|   179k|		vips_object_local_array(object, 2);
  466|       |
  467|   179k|	VipsImage *in;
  468|       |
  469|   179k|	if (VIPS_OBJECT_CLASS(vips_cast_parent_class)->build(object))
  ------------------
  |  |  435|   179k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|   179k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   179k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (469:6): [True: 0, False: 179k]
  ------------------
  470|      0|		return -1;
  471|       |
  472|   179k|	in = cast->in;
  473|       |
  474|       |	/* Trivial case: fall back to copy().
  475|       |	 */
  476|   179k|	if (in->BandFmt == cast->format)
  ------------------
  |  Branch (476:6): [True: 168k, False: 11.5k]
  ------------------
  477|   168k|		return vips_image_write(in, conversion->out);
  478|       |
  479|  11.5k|	if (vips_image_decode(in, &t[0]))
  ------------------
  |  Branch (479:6): [True: 0, False: 11.5k]
  ------------------
  480|      0|		return -1;
  481|  11.5k|	in = t[0];
  482|       |
  483|       |	/* If @shift is on but we're not in an int format and we're going to
  484|       |	 * an int format, we need to cast to int first. For example, what
  485|       |	 * about a float image tagged as rgb16 being cast to uint8? We need
  486|       |	 * to cast to ushort before we do the final cast to uint8.
  487|       |	 */
  488|  11.5k|	if (cast->shift &&
  ------------------
  |  Branch (488:6): [True: 9.82k, False: 1.77k]
  ------------------
  489|  11.5k|		!vips_band_format_isint(in->BandFmt) &&
  ------------------
  |  Branch (489:3): [True: 4.91k, False: 4.90k]
  ------------------
  490|  11.5k|		vips_band_format_isint(cast->format)) {
  ------------------
  |  Branch (490:3): [True: 4.91k, False: 0]
  ------------------
  491|  4.91k|		if (vips_cast(in, &t[1],
  ------------------
  |  Branch (491:7): [True: 0, False: 4.91k]
  ------------------
  492|  4.91k|				vips_image_guess_format(in), NULL))
  493|      0|			return -1;
  494|  4.91k|		in = t[1];
  495|  4.91k|	}
  496|       |
  497|  11.5k|	if (vips_image_pipelinev(conversion->out,
  ------------------
  |  Branch (497:6): [True: 0, False: 11.5k]
  ------------------
  498|  11.5k|			VIPS_DEMAND_STYLE_THINSTRIP, in, NULL))
  499|      0|		return -1;
  500|       |
  501|  11.5k|	conversion->out->BandFmt = cast->format;
  502|       |
  503|  11.5k|	if (vips_image_generate(conversion->out,
  ------------------
  |  Branch (503:6): [True: 0, False: 11.5k]
  ------------------
  504|  11.5k|			vips_start_one, vips_cast_gen, vips_stop_one,
  505|  11.5k|			in, cast))
  506|      0|		return -1;
  507|       |
  508|  11.5k|	return 0;
  509|  11.5k|}
cast.c:vips_cast_gen:
  360|  8.46k|{
  361|  8.46k|	VipsRegion *ir = (VipsRegion *) vseq;
  362|  8.46k|	VipsCast *cast = (VipsCast *) b;
  363|  8.46k|	VipsConversion *conversion = (VipsConversion *) b;
  364|  8.46k|	VipsRect *r = &out_region->valid;
  365|  8.46k|	int sz = VIPS_REGION_N_ELEMENTS(out_region);
  ------------------
  |  |  197|  8.46k|	((size_t) ((R)->valid.width * (R)->im->Bands))
  ------------------
  366|       |
  367|  8.46k|	int x, y;
  368|       |
  369|  8.46k|	if (vips_region_prepare(ir, r))
  ------------------
  |  Branch (369:6): [True: 35, False: 8.43k]
  ------------------
  370|     35|		return -1;
  371|       |
  372|  8.46k|	VIPS_GATE_START("vips_cast_gen: work");
  ------------------
  |  |   41|  8.43k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  8.43k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  8.43k|	{ \
  |  |   43|  8.43k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 8.43k]
  |  |  ------------------
  |  |   44|  8.43k|			vips__thread_gate_start(NAME); \
  |  |   45|  8.43k|	} \
  |  |   46|  8.46k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  8.46k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  373|       |
  374|   322k|	for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (374:14): [True: 313k, False: 8.43k]
  ------------------
  375|   313k|		VipsPel *in = VIPS_REGION_ADDR(ir, r->left, r->top + y);
  ------------------
  |  |  227|   313k|	((R)->data + \
  |  |  228|   313k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   313k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   313k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   313k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   313k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   313k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  376|   313k|		VipsPel *out = VIPS_REGION_ADDR(out_region, r->left, r->top + y);
  ------------------
  |  |  227|   313k|	((R)->data + \
  |  |  228|   313k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   313k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   313k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   313k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   313k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   313k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  377|       |
  378|   313k|		switch (ir->im->BandFmt) {
  379|      0|		case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (379:3): [True: 0, False: 313k]
  ------------------
  380|      0|			BAND_SWITCH_INNER(unsigned char,
  ------------------
  |  |  310|      0|	{ \
  |  |  311|      0|		switch (conversion->out->BandFmt) { \
  |  |  312|      0|		case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (312:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  313|      0|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  ------------------
  |  |  |  |  381|      0|				INT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|      0|	{ \
  |  |  |  |  |  |  198|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (198:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  199|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (199:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  200|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|      0|		} \
  |  |  |  |  |  |  202|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (202:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  203|      0|			SHIFT_LEFT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|      0|	{ \
  |  |  |  |  |  |  |  |  155|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  156|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  157|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  158|      0|\
  |  |  |  |  |  |  |  |  159|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  160|      0|\
  |  |  |  |  |  |  |  |  161|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (161:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  162|      0|			q[x] = (p[x] << n) | (((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  163|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  204|      0|		} \
  |  |  |  |  |  |  205|      0|		else { \
  |  |  |  |  |  |  206|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  313|      0|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  123|      0|#define CAST_UCHAR(X) VIPS_CLIP(0, (X), UCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  207|      0|		} \
  |  |  |  |  |  |  208|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  314|      0|			break; \
  |  |  315|      0|\
  |  |  316|      0|		case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (316:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  317|      0|			INT(ITYPE, signed char, int, CAST_CHAR); \
  |  |  ------------------
  |  |  |  |  381|      0|				INT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|      0|	{ \
  |  |  |  |  |  |  198|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (198:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  199|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (199:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  200|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|      0|		} \
  |  |  |  |  |  |  202|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (202:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  203|      0|			SHIFT_LEFT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|      0|	{ \
  |  |  |  |  |  |  |  |  155|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  156|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  157|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  158|      0|\
  |  |  |  |  |  |  |  |  159|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  160|      0|\
  |  |  |  |  |  |  |  |  161|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (161:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  162|      0|			q[x] = (p[x] << n) | (((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  163|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  204|      0|		} \
  |  |  |  |  |  |  205|      0|		else { \
  |  |  |  |  |  |  206|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  317|      0|			INT(ITYPE, signed char, int, CAST_CHAR); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  124|      0|#define CAST_CHAR(X) VIPS_CLIP(SCHAR_MIN, (X), SCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  207|      0|		} \
  |  |  |  |  |  |  208|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  318|      0|			break; \
  |  |  319|      0|\
  |  |  320|      0|		case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (320:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  321|      0|			INT(ITYPE, unsigned short, int, CAST_USHORT); \
  |  |  ------------------
  |  |  |  |  381|      0|				INT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|      0|	{ \
  |  |  |  |  |  |  198|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (198:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  199|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (199:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  200|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|      0|		} \
  |  |  |  |  |  |  202|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (202:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  203|      0|			SHIFT_LEFT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|      0|	{ \
  |  |  |  |  |  |  |  |  155|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  156|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  157|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  158|      0|\
  |  |  |  |  |  |  |  |  159|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  160|      0|\
  |  |  |  |  |  |  |  |  161|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (161:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  162|      0|			q[x] = (p[x] << n) | (((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  163|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  204|      0|		} \
  |  |  |  |  |  |  205|      0|		else { \
  |  |  |  |  |  |  206|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  321|      0|			INT(ITYPE, unsigned short, int, CAST_USHORT); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  125|      0|#define CAST_USHORT(X) VIPS_CLIP(0, (X), USHRT_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  207|      0|		} \
  |  |  |  |  |  |  208|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  322|      0|			break; \
  |  |  323|      0|\
  |  |  324|      0|		case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (324:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  325|      0|			INT(ITYPE, signed short, int, CAST_SHORT); \
  |  |  ------------------
  |  |  |  |  381|      0|				INT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|      0|	{ \
  |  |  |  |  |  |  198|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (198:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  199|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (199:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  200|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|      0|		} \
  |  |  |  |  |  |  202|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (202:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  203|      0|			SHIFT_LEFT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|      0|	{ \
  |  |  |  |  |  |  |  |  155|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  156|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  157|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  158|      0|\
  |  |  |  |  |  |  |  |  159|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  160|      0|\
  |  |  |  |  |  |  |  |  161|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (161:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  162|      0|			q[x] = (p[x] << n) | (((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  163|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  204|      0|		} \
  |  |  |  |  |  |  205|      0|		else { \
  |  |  |  |  |  |  206|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  325|      0|			INT(ITYPE, signed short, int, CAST_SHORT); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  126|      0|#define CAST_SHORT(X) VIPS_CLIP(SHRT_MIN, (X), SHRT_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  207|      0|		} \
  |  |  |  |  |  |  208|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  326|      0|			break; \
  |  |  327|      0|\
  |  |  328|      0|		case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (328:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  329|      0|			INT(ITYPE, unsigned int, gint64, CAST_UINT); \
  |  |  ------------------
  |  |  |  |  381|      0|				INT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|      0|	{ \
  |  |  |  |  |  |  198|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (198:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  199|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (199:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  200|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|      0|		} \
  |  |  |  |  |  |  202|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (202:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  203|      0|			SHIFT_LEFT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|      0|	{ \
  |  |  |  |  |  |  |  |  155|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  156|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  157|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  158|      0|\
  |  |  |  |  |  |  |  |  159|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  160|      0|\
  |  |  |  |  |  |  |  |  161|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (161:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  162|      0|			q[x] = (p[x] << n) | (((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  163|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  204|      0|		} \
  |  |  |  |  |  |  205|      0|		else { \
  |  |  |  |  |  |  206|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  329|      0|			INT(ITYPE, unsigned int, gint64, CAST_UINT); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  130|      0|#define CAST_UINT(X) VIPS_CLIP(0, (X), UINT_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  207|      0|		} \
  |  |  |  |  |  |  208|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  330|      0|			break; \
  |  |  331|      0|\
  |  |  332|      0|		case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (332:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  333|      0|			INT(ITYPE, signed int, gint64, CAST_INT); \
  |  |  ------------------
  |  |  |  |  381|      0|				INT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|      0|	{ \
  |  |  |  |  |  |  198|      0|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (198:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  199|      0|			sizeof(ITYPE) > sizeof(OTYPE)) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (199:4): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  200|      0|			SHIFT_RIGHT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  139|      0|	{ \
  |  |  |  |  |  |  |  |  140|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  141|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  142|      0|		int n = ((int) sizeof(ITYPE) << 3) - ((int) sizeof(OTYPE) << 3); \
  |  |  |  |  |  |  |  |  143|      0|\
  |  |  |  |  |  |  |  |  144|      0|		g_assert(sizeof(ITYPE) >= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  145|      0|\
  |  |  |  |  |  |  |  |  146|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (146:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  147|      0|			q[x] = p[x] >> n; \
  |  |  |  |  |  |  |  |  148|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  201|      0|		} \
  |  |  |  |  |  |  202|      0|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (202:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  203|      0|			SHIFT_LEFT(ITYPE, OTYPE); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  154|      0|	{ \
  |  |  |  |  |  |  |  |  155|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  156|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  157|      0|		int n = ((int) sizeof(OTYPE) << 3) - ((int) sizeof(ITYPE) << 3); \
  |  |  |  |  |  |  |  |  158|      0|\
  |  |  |  |  |  |  |  |  159|      0|		g_assert(sizeof(ITYPE) <= sizeof(OTYPE)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  166|      0|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  160|      0|\
  |  |  |  |  |  |  |  |  161|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (161:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  162|      0|			q[x] = (p[x] << n) | (((p[x] & 1) << n) - (p[x] & 1)); \
  |  |  |  |  |  |  |  |  163|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  204|      0|		} \
  |  |  |  |  |  |  205|      0|		else { \
  |  |  |  |  |  |  206|      0|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|      0|	{ \
  |  |  |  |  |  |  |  |  184|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|      0|\
  |  |  |  |  |  |  |  |  187|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|      0|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|      0|\
  |  |  |  |  |  |  |  |  190|      0|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  333|      0|			INT(ITYPE, signed int, gint64, CAST_INT); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  131|      0|#define CAST_INT(X) VIPS_CLIP(INT_MIN, (X), INT_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  207|      0|		} \
  |  |  |  |  |  |  208|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  334|      0|			break; \
  |  |  335|      0|\
  |  |  336|      0|		case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (336:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  337|      0|			FLOAT(ITYPE, float); \
  |  |  ------------------
  |  |  |  |  382|      0|				CAST_REAL_FLOAT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  259|      0|	{ \
  |  |  |  |  |  |  260|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  261|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  262|      0|\
  |  |  |  |  |  |  263|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (263:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  264|      0|			q[x] = p[x]; \
  |  |  |  |  |  |  265|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  338|      0|			break; \
  |  |  339|      0|\
  |  |  340|      0|		case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (340:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  341|      0|			FLOAT(ITYPE, double); \
  |  |  ------------------
  |  |  |  |  382|      0|				CAST_REAL_FLOAT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  259|      0|	{ \
  |  |  |  |  |  |  260|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  261|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  262|      0|\
  |  |  |  |  |  |  263|      0|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (263:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  264|      0|			q[x] = p[x]; \
  |  |  |  |  |  |  265|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  342|      0|			break; \
  |  |  343|      0|\
  |  |  344|      0|		case VIPS_FORMAT_COMPLEX: \
  |  |  ------------------
  |  |  |  Branch (344:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  345|      0|			COMPLEX(ITYPE, float); \
  |  |  ------------------
  |  |  |  |  383|      0|				CAST_REAL_COMPLEX);
  |  |  |  |  ------------------
  |  |  |  |  |  |  283|      0|	{ \
  |  |  |  |  |  |  284|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  285|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  286|      0|\
  |  |  |  |  |  |  287|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (287:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  288|      0|			q[0] = p[x]; \
  |  |  |  |  |  |  289|      0|			q[1] = 0.0; \
  |  |  |  |  |  |  290|      0|			q += 2; \
  |  |  |  |  |  |  291|      0|		} \
  |  |  |  |  |  |  292|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  346|      0|			break; \
  |  |  347|      0|\
  |  |  348|      0|		case VIPS_FORMAT_DPCOMPLEX: \
  |  |  ------------------
  |  |  |  Branch (348:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  349|      0|			COMPLEX(ITYPE, double); \
  |  |  ------------------
  |  |  |  |  383|      0|				CAST_REAL_COMPLEX);
  |  |  |  |  ------------------
  |  |  |  |  |  |  283|      0|	{ \
  |  |  |  |  |  |  284|      0|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  285|      0|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  286|      0|\
  |  |  |  |  |  |  287|      0|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (287:15): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  288|      0|			q[0] = p[x]; \
  |  |  |  |  |  |  289|      0|			q[1] = 0.0; \
  |  |  |  |  |  |  290|      0|			q += 2; \
  |  |  |  |  |  |  291|      0|		} \
  |  |  |  |  |  |  292|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  350|      0|			break; \
  |  |  351|      0|\
  |  |  352|      0|		default: \
  |  |  ------------------
  |  |  |  Branch (352:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  353|      0|			g_assert_not_reached(); \
  |  |  ------------------
  |  |  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  354|      0|		} \
  |  |  355|      0|	}
  ------------------
  381|      0|				INT_INT,
  382|      0|				CAST_REAL_FLOAT,
  383|      0|				CAST_REAL_COMPLEX);
  384|      0|			break;
  385|       |
  386|  1.71k|		case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (386:3): [True: 1.71k, False: 312k]
  ------------------
  387|  1.71k|			BAND_SWITCH_INNER(signed char,
  ------------------
  |  |  310|  1.71k|	{ \
  |  |  311|  1.71k|		switch (conversion->out->BandFmt) { \
  |  |  312|  1.71k|		case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (312:3): [True: 1.71k, False: 0]
  |  |  ------------------
  |  |  313|  1.71k|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  ------------------
  |  |  |  |  388|  1.71k|				INT_INT_SIGNED,
  |  |  |  |  ------------------
  |  |  |  |  |  |  213|  1.71k|	{ \
  |  |  |  |  |  |  214|  1.71k|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (214:7): [True: 0, False: 1.71k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  215|  1.71k|			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.71k|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (218:12): [True: 0, False: 1.71k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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.71k|		else { \
  |  |  |  |  |  |  222|  1.71k|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|  1.71k|	{ \
  |  |  |  |  |  |  |  |  184|  1.71k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|  1.71k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|  1.71k|\
  |  |  |  |  |  |  |  |  187|   297k|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 295k, False: 1.71k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|   295k|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|   295k|\
  |  |  |  |  |  |  |  |  190|   295k|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  313|   295k|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  123|   295k|#define CAST_UCHAR(X) VIPS_CLIP(0, (X), UCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|   295k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|   591k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 24.1k, False: 271k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 295k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 271k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|   295k|		} \
  |  |  |  |  |  |  |  |  192|  1.71k|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|  1.71k|		} \
  |  |  |  |  |  |  224|  1.71k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  314|  1.71k|			break; \
  |  |  315|      0|\
  |  |  316|      0|		case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (316:3): [True: 0, False: 1.71k]
  |  |  ------------------
  |  |  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: 1.71k]
  |  |  ------------------
  |  |  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: 1.71k]
  |  |  ------------------
  |  |  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: 1.71k]
  |  |  ------------------
  |  |  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: 1.71k]
  |  |  ------------------
  |  |  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: 1.71k]
  |  |  ------------------
  |  |  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: 1.71k]
  |  |  ------------------
  |  |  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: 1.71k]
  |  |  ------------------
  |  |  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: 1.71k]
  |  |  ------------------
  |  |  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: 1.71k]
  |  |  ------------------
  |  |  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|  1.71k|		} \
  |  |  355|  1.71k|	}
  ------------------
  388|  1.71k|				INT_INT_SIGNED,
  389|  1.71k|				CAST_REAL_FLOAT,
  390|  1.71k|				CAST_REAL_COMPLEX);
  391|  1.71k|			break;
  392|       |
  393|      0|		case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (393:3): [True: 0, False: 313k]
  ------------------
  394|      0|			BAND_SWITCH_INNER(unsigned short,
  ------------------
  |  |  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); \
  |  |  ------------------
  |  |  |  |  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); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  313|      0|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  123|      0|#define CAST_UCHAR(X) VIPS_CLIP(0, (X), UCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|      0|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|      0|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 0]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|      0|		} \
  |  |  |  |  |  |  |  |  192|      0|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  207|      0|		} \
  |  |  |  |  |  |  208|      0|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  314|      0|			break; \
  |  |  315|      0|\
  |  |  316|      0|		case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (316:3): [True: 0, False: 0]
  |  |  ------------------
  |  |  317|      0|			INT(ITYPE, signed char, int, CAST_CHAR); \
  |  |  ------------------
  |  |  |  |  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: 0]
  |  |  ------------------
  |  |  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: 0]
  |  |  ------------------
  |  |  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: 0]
  |  |  ------------------
  |  |  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: 0]
  |  |  ------------------
  |  |  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: 0]
  |  |  ------------------
  |  |  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: 0]
  |  |  ------------------
  |  |  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: 0]
  |  |  ------------------
  |  |  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: 0]
  |  |  ------------------
  |  |  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: 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|	}
  ------------------
  395|      0|				INT_INT,
  396|      0|				CAST_REAL_FLOAT,
  397|      0|				CAST_REAL_COMPLEX);
  398|      0|			break;
  399|       |
  400|   126k|		case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (400:3): [True: 126k, False: 187k]
  ------------------
  401|   126k|			BAND_SWITCH_INNER(signed short,
  ------------------
  |  |  310|   126k|	{ \
  |  |  311|   126k|		switch (conversion->out->BandFmt) { \
  |  |  312|    453|		case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (312:3): [True: 453, False: 125k]
  |  |  ------------------
  |  |  313|    453|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  ------------------
  |  |  |  |  402|    453|				INT_INT_SIGNED,
  |  |  |  |  ------------------
  |  |  |  |  |  |  213|    453|	{ \
  |  |  |  |  |  |  214|    453|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (214:7): [True: 0, False: 453]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  215|    453|			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|    453|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (218:12): [True: 0, False: 453]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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|    453|		else { \
  |  |  |  |  |  |  222|    453|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|    453|	{ \
  |  |  |  |  |  |  |  |  184|    453|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|    453|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|    453|\
  |  |  |  |  |  |  |  |  187|  15.7k|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 15.3k, False: 453]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|  15.3k|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|  15.3k|\
  |  |  |  |  |  |  |  |  190|  15.3k|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  313|  15.3k|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  123|  15.3k|#define CAST_UCHAR(X) VIPS_CLIP(0, (X), UCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|  15.3k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|  30.6k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 1.44k, False: 13.9k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 3.30k, False: 12.0k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 3.30k, False: 10.6k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|  15.3k|		} \
  |  |  |  |  |  |  |  |  192|    453|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|    453|		} \
  |  |  |  |  |  |  224|    453|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  314|    453|			break; \
  |  |  315|      0|\
  |  |  316|      0|		case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (316:3): [True: 0, False: 126k]
  |  |  ------------------
  |  |  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.41k|		case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (320:3): [True: 1.41k, False: 125k]
  |  |  ------------------
  |  |  321|  1.41k|			INT(ITYPE, unsigned short, int, CAST_USHORT); \
  |  |  ------------------
  |  |  |  |  402|  1.41k|				INT_INT_SIGNED,
  |  |  |  |  ------------------
  |  |  |  |  |  |  213|  1.41k|	{ \
  |  |  |  |  |  |  214|  1.41k|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (214:7): [True: 0, False: 1.41k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  215|  1.41k|			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.41k|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (218:12): [True: 0, False: 1.41k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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.41k|		else { \
  |  |  |  |  |  |  222|  1.41k|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|  1.41k|	{ \
  |  |  |  |  |  |  |  |  184|  1.41k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|  1.41k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|  1.41k|\
  |  |  |  |  |  |  |  |  187|   130k|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 128k, False: 1.41k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|   128k|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|   128k|\
  |  |  |  |  |  |  |  |  190|   128k|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  321|   128k|			INT(ITYPE, unsigned short, int, CAST_USHORT); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  125|   128k|#define CAST_USHORT(X) VIPS_CLIP(0, (X), USHRT_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|   128k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|   257k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 5.37k, False: 123k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 128k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 123k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|   128k|		} \
  |  |  |  |  |  |  |  |  192|  1.41k|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|  1.41k|		} \
  |  |  |  |  |  |  224|  1.41k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  322|  1.41k|			break; \
  |  |  323|      0|\
  |  |  324|      0|		case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (324:3): [True: 0, False: 126k]
  |  |  ------------------
  |  |  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: 126k]
  |  |  ------------------
  |  |  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: 126k]
  |  |  ------------------
  |  |  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|   124k|		case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (336:3): [True: 124k, False: 1.86k]
  |  |  ------------------
  |  |  337|   124k|			FLOAT(ITYPE, float); \
  |  |  ------------------
  |  |  |  |  403|   124k|				CAST_REAL_FLOAT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  259|   124k|	{ \
  |  |  |  |  |  |  260|   124k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  261|   124k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  262|   124k|\
  |  |  |  |  |  |  263|  7.80M|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (263:15): [True: 7.67M, False: 124k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  264|  7.67M|			q[x] = p[x]; \
  |  |  |  |  |  |  265|   124k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  338|   124k|			break; \
  |  |  339|      0|\
  |  |  340|      0|		case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (340:3): [True: 0, False: 126k]
  |  |  ------------------
  |  |  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: 126k]
  |  |  ------------------
  |  |  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: 126k]
  |  |  ------------------
  |  |  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: 126k]
  |  |  ------------------
  |  |  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|   126k|		} \
  |  |  355|   126k|	}
  ------------------
  402|   126k|				INT_INT_SIGNED,
  403|   126k|				CAST_REAL_FLOAT,
  404|   126k|				CAST_REAL_COMPLEX);
  405|   126k|			break;
  406|       |
  407|  11.1k|		case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (407:3): [True: 11.1k, False: 302k]
  ------------------
  408|  11.1k|			BAND_SWITCH_INNER(unsigned int,
  ------------------
  |  |  310|  11.1k|	{ \
  |  |  311|  11.1k|		switch (conversion->out->BandFmt) { \
  |  |  312|  10.9k|		case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (312:3): [True: 10.9k, False: 220]
  |  |  ------------------
  |  |  313|  10.9k|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  ------------------
  |  |  |  |  409|  10.9k|				INT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  197|  10.9k|	{ \
  |  |  |  |  |  |  198|  10.9k|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (198:7): [True: 0, False: 10.9k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  199|  10.9k|			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|  10.9k|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (202:12): [True: 0, False: 10.9k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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|  10.9k|		else { \
  |  |  |  |  |  |  206|  10.9k|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|  10.9k|	{ \
  |  |  |  |  |  |  |  |  184|  10.9k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|  10.9k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|  10.9k|\
  |  |  |  |  |  |  |  |  187|   581k|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 570k, False: 10.9k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|   570k|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|   570k|\
  |  |  |  |  |  |  |  |  190|   570k|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  313|   570k|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  123|   570k|#define CAST_UCHAR(X) VIPS_CLIP(0, (X), UCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|   570k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|  1.14M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 59.2k, False: 511k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 62.9k, False: 507k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 62.9k, False: 448k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|   570k|		} \
  |  |  |  |  |  |  |  |  192|  10.9k|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  207|  10.9k|		} \
  |  |  |  |  |  |  208|  10.9k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  314|  10.9k|			break; \
  |  |  315|      0|\
  |  |  316|      0|		case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (316:3): [True: 0, False: 11.1k]
  |  |  ------------------
  |  |  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: 11.1k]
  |  |  ------------------
  |  |  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: 11.1k]
  |  |  ------------------
  |  |  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: 11.1k]
  |  |  ------------------
  |  |  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: 11.1k]
  |  |  ------------------
  |  |  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|    220|		case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (336:3): [True: 220, False: 10.9k]
  |  |  ------------------
  |  |  337|    220|			FLOAT(ITYPE, float); \
  |  |  ------------------
  |  |  |  |  410|    220|				CAST_REAL_FLOAT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  259|    220|	{ \
  |  |  |  |  |  |  260|    220|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  261|    220|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  262|    220|\
  |  |  |  |  |  |  263|  5.44k|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (263:15): [True: 5.22k, False: 220]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  264|  5.22k|			q[x] = p[x]; \
  |  |  |  |  |  |  265|    220|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  338|    220|			break; \
  |  |  339|      0|\
  |  |  340|      0|		case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (340:3): [True: 0, False: 11.1k]
  |  |  ------------------
  |  |  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: 11.1k]
  |  |  ------------------
  |  |  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: 11.1k]
  |  |  ------------------
  |  |  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: 11.1k]
  |  |  ------------------
  |  |  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|  11.1k|		} \
  |  |  355|  11.1k|	}
  ------------------
  409|  11.1k|				INT_INT,
  410|  11.1k|				CAST_REAL_FLOAT,
  411|  11.1k|				CAST_REAL_COMPLEX);
  412|  11.1k|			break;
  413|       |
  414|  8.51k|		case VIPS_FORMAT_INT:
  ------------------
  |  Branch (414:3): [True: 8.51k, False: 305k]
  ------------------
  415|  8.51k|			BAND_SWITCH_INNER(signed int,
  ------------------
  |  |  310|  8.51k|	{ \
  |  |  311|  8.51k|		switch (conversion->out->BandFmt) { \
  |  |  312|  8.39k|		case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (312:3): [True: 8.39k, False: 121]
  |  |  ------------------
  |  |  313|  8.39k|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  ------------------
  |  |  |  |  416|  8.39k|				INT_INT_SIGNED,
  |  |  |  |  ------------------
  |  |  |  |  |  |  213|  8.39k|	{ \
  |  |  |  |  |  |  214|  8.39k|		if (cast->shift && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (214:7): [True: 0, False: 8.39k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  215|  8.39k|			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|  8.39k|		else if (cast->shift) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (218:12): [True: 0, False: 8.39k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  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|  8.39k|		else { \
  |  |  |  |  |  |  222|  8.39k|			CAST_INT_INT(ITYPE, OTYPE, TEMP, CAST); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  183|  8.39k|	{ \
  |  |  |  |  |  |  |  |  184|  8.39k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  |  |  185|  8.39k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  |  |  186|  8.39k|\
  |  |  |  |  |  |  |  |  187|   566k|		for (x = 0; x < sz; x++) { \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (187:15): [True: 557k, False: 8.39k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  188|   557k|			TEMP t = (TEMP) p[x]; \
  |  |  |  |  |  |  |  |  189|   557k|\
  |  |  |  |  |  |  |  |  190|   557k|			q[x] = CAST(t); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  313|   557k|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  123|   557k|#define CAST_UCHAR(X) VIPS_CLIP(0, (X), UCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   57|   557k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|  1.11M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 24.7k, False: 533k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 76.6k, False: 481k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 76.6k, False: 456k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  191|   557k|		} \
  |  |  |  |  |  |  |  |  192|  8.39k|	}
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  223|  8.39k|		} \
  |  |  |  |  |  |  224|  8.39k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  314|  8.39k|			break; \
  |  |  315|      0|\
  |  |  316|      0|		case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (316:3): [True: 0, False: 8.51k]
  |  |  ------------------
  |  |  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: 8.51k]
  |  |  ------------------
  |  |  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: 8.51k]
  |  |  ------------------
  |  |  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: 8.51k]
  |  |  ------------------
  |  |  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: 8.51k]
  |  |  ------------------
  |  |  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|    121|		case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (336:3): [True: 121, False: 8.39k]
  |  |  ------------------
  |  |  337|    121|			FLOAT(ITYPE, float); \
  |  |  ------------------
  |  |  |  |  417|    121|				CAST_REAL_FLOAT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  259|    121|	{ \
  |  |  |  |  |  |  260|    121|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  261|    121|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  262|    121|\
  |  |  |  |  |  |  263|  9.37k|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (263:15): [True: 9.25k, False: 121]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  264|  9.25k|			q[x] = p[x]; \
  |  |  |  |  |  |  265|    121|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  338|    121|			break; \
  |  |  339|      0|\
  |  |  340|      0|		case VIPS_FORMAT_DOUBLE: \
  |  |  ------------------
  |  |  |  Branch (340:3): [True: 0, False: 8.51k]
  |  |  ------------------
  |  |  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: 8.51k]
  |  |  ------------------
  |  |  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: 8.51k]
  |  |  ------------------
  |  |  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: 8.51k]
  |  |  ------------------
  |  |  353|      0|			g_assert_not_reached(); \
  |  |  ------------------
  |  |  |  |  161|      0|#define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |               #define g_assert_not_reached()          G_STMT_START { (void) 0; __builtin_unreachable (); } G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  354|  8.51k|		} \
  |  |  355|  8.51k|	}
  ------------------
  416|  8.51k|				INT_INT_SIGNED,
  417|  8.51k|				CAST_REAL_FLOAT,
  418|  8.51k|				CAST_REAL_COMPLEX);
  419|  8.51k|			break;
  420|       |
  421|   166k|		case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (421:3): [True: 166k, False: 147k]
  ------------------
  422|   166k|			BAND_SWITCH_INNER(float,
  ------------------
  |  |  310|   166k|	{ \
  |  |  311|   166k|		switch (conversion->out->BandFmt) { \
  |  |  312|  18.5k|		case VIPS_FORMAT_UCHAR: \
  |  |  ------------------
  |  |  |  Branch (312:3): [True: 18.5k, False: 147k]
  |  |  ------------------
  |  |  313|  18.5k|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  ------------------
  |  |  |  |  423|  18.5k|				CAST_FLOAT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  232|  18.5k|	{ \
  |  |  |  |  |  |  233|  18.5k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  234|  18.5k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  235|  18.5k|\
  |  |  |  |  |  |  236|  2.90M|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (236:15): [True: 2.88M, False: 18.5k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  237|  2.88M|			q[x] = CAST((double) p[x]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  313|  18.5k|			INT(ITYPE, unsigned char, int, CAST_UCHAR); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  123|  18.5k|#define CAST_UCHAR(X) VIPS_CLIP(0, (X), UCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|  2.88M|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|  5.77M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 8.45k, False: 2.87M]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 54.8k, False: 2.83M]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 54.8k, False: 2.82M]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  238|  18.5k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  314|  18.5k|			break; \
  |  |  315|      0|\
  |  |  316|  1.51k|		case VIPS_FORMAT_CHAR: \
  |  |  ------------------
  |  |  |  Branch (316:3): [True: 1.51k, False: 164k]
  |  |  ------------------
  |  |  317|  1.51k|			INT(ITYPE, signed char, int, CAST_CHAR); \
  |  |  ------------------
  |  |  |  |  423|  1.51k|				CAST_FLOAT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  232|  1.51k|	{ \
  |  |  |  |  |  |  233|  1.51k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  234|  1.51k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  235|  1.51k|\
  |  |  |  |  |  |  236|   171k|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (236:15): [True: 169k, False: 1.51k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  237|   169k|			q[x] = CAST((double) p[x]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  317|  1.51k|			INT(ITYPE, signed char, int, CAST_CHAR); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  124|  1.51k|#define CAST_CHAR(X) VIPS_CLIP(SCHAR_MIN, (X), SCHAR_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|   169k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|   339k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 6.42k, False: 163k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 17.2k, False: 152k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 17.2k, False: 145k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  238|  1.51k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  318|  1.51k|			break; \
  |  |  319|      0|\
  |  |  320|  5.22k|		case VIPS_FORMAT_USHORT: \
  |  |  ------------------
  |  |  |  Branch (320:3): [True: 5.22k, False: 160k]
  |  |  ------------------
  |  |  321|  5.22k|			INT(ITYPE, unsigned short, int, CAST_USHORT); \
  |  |  ------------------
  |  |  |  |  423|  5.22k|				CAST_FLOAT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  232|  5.22k|	{ \
  |  |  |  |  |  |  233|  5.22k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  234|  5.22k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  235|  5.22k|\
  |  |  |  |  |  |  236|   346k|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (236:15): [True: 340k, False: 5.22k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  237|   340k|			q[x] = CAST((double) p[x]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  321|  5.22k|			INT(ITYPE, unsigned short, int, CAST_USHORT); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  125|  5.22k|#define CAST_USHORT(X) VIPS_CLIP(0, (X), USHRT_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|   340k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|   681k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 8.54k, False: 332k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 17.8k, False: 323k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 17.8k, False: 314k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  238|  5.22k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  322|  5.22k|			break; \
  |  |  323|      0|\
  |  |  324|   128k|		case VIPS_FORMAT_SHORT: \
  |  |  ------------------
  |  |  |  Branch (324:3): [True: 128k, False: 37.2k]
  |  |  ------------------
  |  |  325|   128k|			INT(ITYPE, signed short, int, CAST_SHORT); \
  |  |  ------------------
  |  |  |  |  423|   128k|				CAST_FLOAT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  232|   128k|	{ \
  |  |  |  |  |  |  233|   128k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  234|   128k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  235|   128k|\
  |  |  |  |  |  |  236|  8.17M|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (236:15): [True: 8.04M, False: 128k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  237|  8.04M|			q[x] = CAST((double) p[x]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  325|   128k|			INT(ITYPE, signed short, int, CAST_SHORT); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  126|   128k|#define CAST_SHORT(X) VIPS_CLIP(SHRT_MIN, (X), SHRT_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|  8.04M|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|  16.0M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 3.30k, False: 8.04M]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 9.64k, False: 8.03M]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 9.64k, False: 8.03M]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  238|   128k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  326|   128k|			break; \
  |  |  327|      0|\
  |  |  328|  4.38k|		case VIPS_FORMAT_UINT: \
  |  |  ------------------
  |  |  |  Branch (328:3): [True: 4.38k, False: 161k]
  |  |  ------------------
  |  |  329|  4.38k|			INT(ITYPE, unsigned int, gint64, CAST_UINT); \
  |  |  ------------------
  |  |  |  |  423|  4.38k|				CAST_FLOAT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  232|  4.38k|	{ \
  |  |  |  |  |  |  233|  4.38k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  234|  4.38k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  235|  4.38k|\
  |  |  |  |  |  |  236|   161k|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (236:15): [True: 156k, False: 4.38k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  237|   156k|			q[x] = CAST((double) p[x]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  329|  4.38k|			INT(ITYPE, unsigned int, gint64, CAST_UINT); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  130|  4.38k|#define CAST_UINT(X) VIPS_CLIP(0, (X), UINT_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|   156k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|   313k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 156k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 428, False: 156k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 428, False: 156k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  238|  4.38k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  330|  4.38k|			break; \
  |  |  331|      0|\
  |  |  332|  7.59k|		case VIPS_FORMAT_INT: \
  |  |  ------------------
  |  |  |  Branch (332:3): [True: 7.59k, False: 158k]
  |  |  ------------------
  |  |  333|  7.59k|			INT(ITYPE, signed int, gint64, CAST_INT); \
  |  |  ------------------
  |  |  |  |  423|  7.59k|				CAST_FLOAT_INT,
  |  |  |  |  ------------------
  |  |  |  |  |  |  232|  7.59k|	{ \
  |  |  |  |  |  |  233|  7.59k|		ITYPE *restrict p = (ITYPE *) in; \
  |  |  |  |  |  |  234|  7.59k|		OTYPE *restrict q = (OTYPE *) out; \
  |  |  |  |  |  |  235|  7.59k|\
  |  |  |  |  |  |  236|   343k|		for (x = 0; x < sz; x++) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (236:15): [True: 336k, False: 7.59k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  237|   336k|			q[x] = CAST((double) p[x]); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  333|  7.59k|			INT(ITYPE, signed int, gint64, CAST_INT); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  131|  7.59k|#define CAST_INT(X) VIPS_CLIP(INT_MIN, (X), INT_MAX)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |   57|   336k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |   54|   672k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 964, False: 335k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 1.36k, False: 334k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 1.36k, False: 334k]
  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  238|  7.59k|	}
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  334|  7.59k|			break; \
  |  |  335|      0|\
  |  |  336|      0|		case VIPS_FORMAT_FLOAT: \
  |  |  ------------------
  |  |  |  Branch (336:3): [True: 0, False: 166k]
  |  |  ------------------
  |  |  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: 166k]
  |  |  ------------------
  |  |  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: 166k]
  |  |  ------------------
  |  |  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: 166k]
  |  |  ------------------
  |  |  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: 166k]
  |  |  ------------------
  |  |  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|   166k|		} \
  |  |  355|   166k|	}
  ------------------
  423|   166k|				CAST_FLOAT_INT,
  424|   166k|				CAST_REAL_FLOAT,
  425|   166k|				CAST_REAL_COMPLEX);
  426|   166k|			break;
  427|       |
  428|      0|		case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (428:3): [True: 0, False: 313k]
  ------------------
  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: 313k]
  ------------------
  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: 313k]
  ------------------
  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: 313k]
  ------------------
  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|   313k|		}
  452|   313k|	}
  453|       |
  454|  8.43k|	VIPS_GATE_STOP("vips_cast_gen: work");
  ------------------
  |  |   49|  8.43k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  8.43k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  8.43k|	{ \
  |  |   51|  8.43k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 8.43k]
  |  |  ------------------
  |  |   52|  8.43k|			vips__thread_gate_stop(NAME); \
  |  |   53|  8.43k|	} \
  |  |   54|  8.43k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  8.43k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  455|       |
  456|  8.43k|	return 0;
  457|  8.43k|}
cast.c:vips_cast_init:
  552|   195k|{
  553|   195k|}
cast.c:vips_castv:
  557|   195k|{
  558|   195k|	return vips_call_split("cast", ap, in, out, format);
  559|   195k|}

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

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

vips_embed:
  703|  31.1k|{
  704|  31.1k|	va_list ap;
  705|  31.1k|	int result;
  706|       |
  707|  31.1k|	va_start(ap, height);
  708|  31.1k|	result = vips_call_split("embed", ap, in, out, x, y, width, height);
  709|  31.1k|	va_end(ap);
  710|       |
  711|  31.1k|	return result;
  712|  31.1k|}
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|  31.1k|{
  354|  31.1k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  31.1k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  31.1k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  31.1k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  355|  31.1k|	VipsConversion *conversion = VIPS_CONVERSION(object);
  ------------------
  |  |   40|  31.1k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  31.1k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  31.1k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  31.1k|		VIPS_TYPE_CONVERSION, VipsConversion))
  ------------------
  356|  31.1k|	VipsEmbedBase *base = (VipsEmbedBase *) object;
  357|  31.1k|	VipsImage **t = (VipsImage **) vips_object_local_array(object, 7);
  358|       |
  359|  31.1k|	VipsRect want;
  360|       |
  361|  31.1k|	if (VIPS_OBJECT_CLASS(vips_embed_base_parent_class)->build(object))
  ------------------
  |  |  435|  31.1k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  31.1k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  31.1k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (361:6): [True: 0, False: 31.1k]
  ------------------
  362|      0|		return -1;
  363|       |
  364|       |	/* nip2 can generate this quite often ... just copy.
  365|       |	 */
  366|  31.1k|	if (base->x == 0 &&
  ------------------
  |  Branch (366:6): [True: 15.5k, False: 15.5k]
  ------------------
  367|  31.1k|		base->y == 0 &&
  ------------------
  |  Branch (367:3): [True: 0, False: 15.5k]
  ------------------
  368|  31.1k|		base->width == base->in->Xsize &&
  ------------------
  |  Branch (368:3): [True: 0, False: 0]
  ------------------
  369|  31.1k|		base->height == base->in->Ysize)
  ------------------
  |  Branch (369:3): [True: 0, False: 0]
  ------------------
  370|      0|		return vips_image_write(base->in, conversion->out);
  371|       |
  372|  31.1k|	if (!vips_object_argument_isset(object, "extend") &&
  ------------------
  |  Branch (372:6): [True: 0, False: 31.1k]
  ------------------
  373|  31.1k|		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|  31.1k|	if (base->extend == VIPS_EXTEND_BACKGROUND)
  ------------------
  |  Branch (376:6): [True: 0, False: 31.1k]
  ------------------
  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|  31.1k|	switch (base->extend) {
  384|      0|	case VIPS_EXTEND_REPEAT: {
  ------------------
  |  Branch (384:2): [True: 0, False: 31.1k]
  ------------------
  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: 31.1k]
  ------------------
  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: 31.1k]
  ------------------
  445|      0|	case VIPS_EXTEND_WHITE:
  ------------------
  |  Branch (445:2): [True: 0, False: 31.1k]
  ------------------
  446|      0|	case VIPS_EXTEND_BACKGROUND:
  ------------------
  |  Branch (446:2): [True: 0, False: 31.1k]
  ------------------
  447|  31.1k|	case VIPS_EXTEND_COPY:
  ------------------
  |  Branch (447:2): [True: 31.1k, 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|  31.1k|		if (vips_image_pipelinev(conversion->out,
  ------------------
  |  Branch (451:7): [True: 0, False: 31.1k]
  ------------------
  452|  31.1k|				VIPS_DEMAND_STYLE_ANY, base->in, NULL))
  453|      0|			return -1;
  454|       |
  455|  31.1k|		conversion->out->Xsize = base->width;
  456|  31.1k|		conversion->out->Ysize = base->height;
  457|       |
  458|       |		/* Whole output area.
  459|       |		 */
  460|  31.1k|		base->rout.left = 0;
  461|  31.1k|		base->rout.top = 0;
  462|  31.1k|		base->rout.width = conversion->out->Xsize;
  463|  31.1k|		base->rout.height = conversion->out->Ysize;
  464|       |
  465|       |		/* Rect occupied by image (can be clipped to nothing).
  466|       |		 */
  467|  31.1k|		want.left = base->x;
  468|  31.1k|		want.top = base->y;
  469|  31.1k|		want.width = base->in->Xsize;
  470|  31.1k|		want.height = base->in->Ysize;
  471|  31.1k|		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|  31.1k|		if (vips_rect_isempty(&base->rsub)) {
  ------------------
  |  Branch (477:7): [True: 0, False: 31.1k]
  ------------------
  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|  31.1k|		base->border[0].left = base->rsub.left;
  487|  31.1k|		base->border[0].top = 0;
  488|  31.1k|		base->border[0].width = base->rsub.width;
  489|  31.1k|		base->border[0].height = base->rsub.top;
  490|       |
  491|  31.1k|		base->border[1].left = VIPS_RECT_RIGHT(&base->rsub);
  ------------------
  |  |   48|  31.1k|#define VIPS_RECT_RIGHT(R) ((R)->left + (R)->width)
  ------------------
  492|  31.1k|		base->border[1].top = base->rsub.top;
  493|  31.1k|		base->border[1].width = conversion->out->Xsize -
  494|  31.1k|			VIPS_RECT_RIGHT(&base->rsub);
  ------------------
  |  |   48|  31.1k|#define VIPS_RECT_RIGHT(R) ((R)->left + (R)->width)
  ------------------
  495|  31.1k|		base->border[1].height = base->rsub.height;
  496|       |
  497|  31.1k|		base->border[2].left = base->rsub.left;
  498|  31.1k|		base->border[2].top = VIPS_RECT_BOTTOM(&base->rsub);
  ------------------
  |  |   49|  31.1k|#define VIPS_RECT_BOTTOM(R) ((R)->top + (R)->height)
  ------------------
  499|  31.1k|		base->border[2].width = base->rsub.width;
  500|  31.1k|		base->border[2].height = conversion->out->Ysize -
  501|  31.1k|			VIPS_RECT_BOTTOM(&base->rsub);
  ------------------
  |  |   49|  31.1k|#define VIPS_RECT_BOTTOM(R) ((R)->top + (R)->height)
  ------------------
  502|       |
  503|  31.1k|		base->border[3].left = 0;
  504|  31.1k|		base->border[3].top = base->rsub.top;
  505|  31.1k|		base->border[3].width = base->rsub.left;
  506|  31.1k|		base->border[3].height = base->rsub.height;
  507|       |
  508|       |		/* Corner rects. Top-left, top-right, bottom-right,
  509|       |		 * bottom-left. Order important.
  510|       |		 */
  511|  31.1k|		base->border[4].left = 0;
  512|  31.1k|		base->border[4].top = 0;
  513|  31.1k|		base->border[4].width = base->rsub.left;
  514|  31.1k|		base->border[4].height = base->rsub.top;
  515|       |
  516|  31.1k|		base->border[5].left = VIPS_RECT_RIGHT(&base->rsub);
  ------------------
  |  |   48|  31.1k|#define VIPS_RECT_RIGHT(R) ((R)->left + (R)->width)
  ------------------
  517|  31.1k|		base->border[5].top = 0;
  518|  31.1k|		base->border[5].width = conversion->out->Xsize -
  519|  31.1k|			VIPS_RECT_RIGHT(&base->rsub);
  ------------------
  |  |   48|  31.1k|#define VIPS_RECT_RIGHT(R) ((R)->left + (R)->width)
  ------------------
  520|  31.1k|		base->border[5].height = base->rsub.top;
  521|       |
  522|  31.1k|		base->border[6].left = VIPS_RECT_RIGHT(&base->rsub);
  ------------------
  |  |   48|  31.1k|#define VIPS_RECT_RIGHT(R) ((R)->left + (R)->width)
  ------------------
  523|  31.1k|		base->border[6].top = VIPS_RECT_BOTTOM(&base->rsub);
  ------------------
  |  |   49|  31.1k|#define VIPS_RECT_BOTTOM(R) ((R)->top + (R)->height)
  ------------------
  524|  31.1k|		base->border[6].width = conversion->out->Xsize -
  525|  31.1k|			VIPS_RECT_RIGHT(&base->rsub);
  ------------------
  |  |   48|  31.1k|#define VIPS_RECT_RIGHT(R) ((R)->left + (R)->width)
  ------------------
  526|  31.1k|		base->border[6].height = conversion->out->Ysize -
  527|  31.1k|			VIPS_RECT_BOTTOM(&base->rsub);
  ------------------
  |  |   49|  31.1k|#define VIPS_RECT_BOTTOM(R) ((R)->top + (R)->height)
  ------------------
  528|       |
  529|  31.1k|		base->border[7].left = 0;
  530|  31.1k|		base->border[7].top = VIPS_RECT_BOTTOM(&base->rsub);
  ------------------
  |  |   49|  31.1k|#define VIPS_RECT_BOTTOM(R) ((R)->top + (R)->height)
  ------------------
  531|  31.1k|		base->border[7].width = base->rsub.left;
  532|  31.1k|		base->border[7].height = conversion->out->Ysize -
  533|  31.1k|			VIPS_RECT_BOTTOM(&base->rsub);
  ------------------
  |  |   49|  31.1k|#define VIPS_RECT_BOTTOM(R) ((R)->top + (R)->height)
  ------------------
  534|       |
  535|  31.1k|		if (vips_image_generate(conversion->out,
  ------------------
  |  Branch (535:7): [True: 0, False: 31.1k]
  ------------------
  536|  31.1k|				vips_start_one, vips_embed_base_gen, vips_stop_one,
  537|  31.1k|				base->in, base))
  538|      0|			return -1;
  539|       |
  540|  31.1k|		break;
  541|       |
  542|  31.1k|	default:
  ------------------
  |  Branch (542:2): [True: 0, False: 31.1k]
  ------------------
  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|  31.1k|	}
  545|       |
  546|  31.1k|	return 0;
  547|  31.1k|}
embed.c:vips_embed_base_gen:
  230|  31.1k|{
  231|  31.1k|	VipsRegion *ir = (VipsRegion *) seq;
  232|  31.1k|	VipsEmbedBase *base = (VipsEmbedBase *) b;
  233|  31.1k|	VipsRect *r = &out_region->valid;
  234|       |
  235|  31.1k|	VipsRect ovl;
  236|  31.1k|	int i;
  237|  31.1k|	VipsPel *p;
  238|  31.1k|	int plsk;
  239|  31.1k|	int ink;
  240|       |
  241|       |	/* Entirely within the input image? Generate the subimage and copy
  242|       |	 * pointers.
  243|       |	 */
  244|  31.1k|	if (vips_rect_includesrect(&base->rsub, r)) {
  ------------------
  |  Branch (244:6): [True: 0, False: 31.1k]
  ------------------
  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|  31.1k|	vips_rect_intersectrect(r, &base->rsub, &ovl);
  261|  31.1k|	if (!vips_rect_isempty(&ovl)) {
  ------------------
  |  Branch (261:6): [True: 31.1k, False: 0]
  ------------------
  262|       |		/* Paint the bits coming from the input image.
  263|       |		 */
  264|  31.1k|		ovl.left -= base->x;
  265|  31.1k|		ovl.top -= base->y;
  266|  31.1k|		if (vips_region_prepare_to(ir, out_region, &ovl,
  ------------------
  |  Branch (266:7): [True: 12.9k, False: 18.1k]
  ------------------
  267|  31.1k|				ovl.left + base->x, ovl.top + base->y))
  268|  12.9k|			return -1;
  269|  18.1k|		ovl.left += base->x;
  270|  18.1k|		ovl.top += base->y;
  271|  18.1k|	}
  272|       |
  273|  18.1k|	switch (base->extend) {
  274|      0|	case VIPS_EXTEND_BLACK:
  ------------------
  |  Branch (274:2): [True: 0, False: 18.1k]
  ------------------
  275|      0|	case VIPS_EXTEND_WHITE:
  ------------------
  |  Branch (275:2): [True: 0, False: 18.1k]
  ------------------
  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: 18.1k]
  ------------------
  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|  18.1k|	case VIPS_EXTEND_COPY:
  ------------------
  |  Branch (303:2): [True: 18.1k, False: 0]
  ------------------
  304|       |		/* Extend the borders.
  305|       |		 */
  306|   163k|		for (i = 0; i < 8; i++) {
  ------------------
  |  Branch (306:15): [True: 145k, False: 18.1k]
  ------------------
  307|   145k|			VipsRect todo;
  308|   145k|			VipsRect edge;
  309|       |
  310|   145k|			vips_rect_intersectrect(r, &base->border[i], &todo);
  311|   145k|			if (!vips_rect_isempty(&todo)) {
  ------------------
  |  Branch (311:8): [True: 36.3k, False: 108k]
  ------------------
  312|  36.3k|				vips_embed_base_find_edge(base,
  313|  36.3k|					&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|  36.3k|				if (!vips_rect_isempty(&ovl)) {
  ------------------
  |  Branch (319:9): [True: 36.3k, False: 0]
  ------------------
  320|  36.3k|					p = VIPS_REGION_ADDR(out_region,
  ------------------
  |  |  227|  36.3k|	((R)->data + \
  |  |  228|  36.3k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  36.3k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  36.3k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  36.3k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  36.3k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  36.3k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  321|  36.3k|						edge.left, edge.top);
  322|  36.3k|					plsk = VIPS_REGION_LSKIP(out_region);
  ------------------
  |  |  195|  36.3k|	((size_t) ((R)->bpl))
  ------------------
  323|  36.3k|				}
  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|  36.3k|				vips_embed_base_paint_edge(base,
  338|  36.3k|					out_region, i, &todo, p, plsk);
  339|  36.3k|			}
  340|   145k|		}
  341|       |
  342|  18.1k|		break;
  343|       |
  344|  18.1k|	default:
  ------------------
  |  Branch (344:2): [True: 0, False: 18.1k]
  ------------------
  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|  18.1k|	}
  347|       |
  348|  18.1k|	return 0;
  349|  18.1k|}
embed.c:vips_embed_base_find_edge:
  122|  36.3k|{
  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|  36.3k|	*out = base->border[i];
  128|  36.3k|	vips_rect_marginadjust(out, 1);
  129|  36.3k|	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|  36.3k|	if (i == 0 ||
  ------------------
  |  Branch (135:6): [True: 9.08k, False: 27.2k]
  ------------------
  136|  36.3k|		i == 2) {
  ------------------
  |  Branch (136:3): [True: 9.08k, False: 18.1k]
  ------------------
  137|  18.1k|		VipsRect extend;
  138|       |
  139|       |		/* Above or below.
  140|       |		 */
  141|  18.1k|		extend = *r;
  142|  18.1k|		extend.top = 0;
  143|  18.1k|		extend.height = base->height;
  144|  18.1k|		vips_rect_intersectrect(out, &extend, out);
  145|  18.1k|	}
  146|  36.3k|	if (i == 1 ||
  ------------------
  |  Branch (146:6): [True: 9.08k, False: 27.2k]
  ------------------
  147|  36.3k|		i == 3) {
  ------------------
  |  Branch (147:3): [True: 9.08k, False: 18.1k]
  ------------------
  148|  18.1k|		VipsRect extend;
  149|       |
  150|       |		/* Left or right.
  151|       |		 */
  152|  18.1k|		extend = *r;
  153|  18.1k|		extend.left = 0;
  154|  18.1k|		extend.width = base->width;
  155|  18.1k|		vips_rect_intersectrect(out, &extend, out);
  156|  18.1k|	}
  157|  36.3k|}
embed.c:vips_embed_base_paint_edge:
  181|  36.3k|{
  182|  36.3k|	const int bs = VIPS_IMAGE_SIZEOF_PEL(base->in);
  ------------------
  |  |  384|  36.3k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|  36.3k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  183|       |
  184|  36.3k|	VipsRect todo;
  185|  36.3k|	VipsPel *q;
  186|  36.3k|	int y;
  187|       |
  188|  36.3k|	VIPS_GATE_START("vips_embed_base_paint_edge: work");
  ------------------
  |  |   41|  36.3k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  36.3k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  36.3k|	{ \
  |  |   43|  36.3k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 36.3k]
  |  |  ------------------
  |  |   44|  36.3k|			vips__thread_gate_start(NAME); \
  |  |   45|  36.3k|	} \
  |  |   46|  36.3k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  36.3k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  189|       |
  190|       |	/* Pixels left to paint.
  191|       |	 */
  192|  36.3k|	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|  36.3k|	if (i > 3) {
  ------------------
  |  Branch (197:6): [True: 0, False: 36.3k]
  ------------------
  198|      0|		q = VIPS_REGION_ADDR(out_region, todo.left, todo.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))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  199|      0|		vips_embed_base_copy_pixel(base, q, p, todo.width);
  200|       |
  201|      0|		p = q;
  202|      0|		todo.top += 1;
  203|      0|		todo.height -= 1;
  204|      0|	}
  205|       |
  206|  36.3k|	if (i == 1 || i == 3) {
  ------------------
  |  Branch (206:6): [True: 9.08k, False: 27.2k]
  |  Branch (206:16): [True: 9.08k, False: 18.1k]
  ------------------
  207|       |		/* Vertical line of pixels to copy.
  208|       |		 */
  209|   974k|		for (y = 0; y < todo.height; y++) {
  ------------------
  |  Branch (209:15): [True: 956k, False: 18.1k]
  ------------------
  210|   956k|			q = VIPS_REGION_ADDR(out_region, todo.left, todo.top + y);
  ------------------
  |  |  227|   956k|	((R)->data + \
  |  |  228|   956k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   956k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   956k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   956k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   956k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   956k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  211|   956k|			vips_embed_base_copy_pixel(base, q, p, todo.width);
  212|   956k|			p += plsk;
  213|   956k|		}
  214|  18.1k|	}
  215|  18.1k|	else {
  216|       |		/* Horizontal line of pixels to copy.
  217|       |		 */
  218|  36.3k|		for (y = 0; y < todo.height; y++) {
  ------------------
  |  Branch (218:15): [True: 18.1k, False: 18.1k]
  ------------------
  219|  18.1k|			q = VIPS_REGION_ADDR(out_region, todo.left, todo.top + y);
  ------------------
  |  |  227|  18.1k|	((R)->data + \
  |  |  228|  18.1k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  18.1k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  18.1k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  18.1k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  18.1k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  18.1k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  220|  18.1k|			memcpy(q, p, bs * todo.width);
  221|  18.1k|		}
  222|  18.1k|	}
  223|       |
  224|  36.3k|	VIPS_GATE_STOP("vips_embed_base_paint_edge: work");
  ------------------
  |  |   49|  36.3k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  36.3k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  36.3k|	{ \
  |  |   51|  36.3k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 36.3k]
  |  |  ------------------
  |  |   52|  36.3k|			vips__thread_gate_stop(NAME); \
  |  |   53|  36.3k|	} \
  |  |   54|  36.3k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  36.3k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  225|  36.3k|}
embed.c:vips_embed_base_copy_pixel:
  164|   956k|{
  165|   956k|	const int bs = VIPS_IMAGE_SIZEOF_PEL(base->in);
  ------------------
  |  |  384|   956k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|   956k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  166|       |
  167|   956k|	int x, b;
  168|       |
  169|  1.91M|	for (x = 0; x < n; x++)
  ------------------
  |  Branch (169:14): [True: 956k, False: 956k]
  ------------------
  170|  2.86M|		for (b = 0; b < bs; b++)
  ------------------
  |  Branch (170:15): [True: 1.91M, False: 956k]
  ------------------
  171|  1.91M|			*q++ = p[b];
  172|   956k|}
embed.c:vips_embed_base_init:
  604|  31.1k|{
  605|  31.1k|	base->extend = VIPS_EXTEND_BLACK;
  606|  31.1k|	base->background = vips_array_double_newv(1, 0.0);
  607|  31.1k|}
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|  31.1k|{
  626|  31.1k|	VipsEmbedBase *base = (VipsEmbedBase *) object;
  627|  31.1k|	VipsEmbed *embed = (VipsEmbed *) object;
  628|       |
  629|       |	/* Just pass the specified x, y down.
  630|       |	 */
  631|  31.1k|	base->x = embed->x;
  632|  31.1k|	base->y = embed->y;
  633|       |
  634|  31.1k|	if (VIPS_OBJECT_CLASS(vips_embed_parent_class)->build(object))
  ------------------
  |  |  435|  31.1k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  31.1k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  31.1k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (634:6): [True: 0, False: 31.1k]
  ------------------
  635|      0|		return -1;
  636|       |
  637|  31.1k|	return 0;
  638|  31.1k|}
embed.c:vips_embed_init:
  672|  31.1k|{
  673|  31.1k|}
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|  2.86k|{
  261|  2.86k|	va_list ap;
  262|  2.86k|	int result;
  263|       |
  264|  2.86k|	va_start(ap, height);
  265|  2.86k|	result = vips_call_split("extract_area", ap, in, out,
  266|  2.86k|		left, top, width, height);
  267|  2.86k|	va_end(ap);
  268|       |
  269|  2.86k|	return result;
  270|  2.86k|}
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|  72.7k|{
  480|  72.7k|	va_list ap;
  481|  72.7k|	int result;
  482|       |
  483|  72.7k|	va_start(ap, band);
  484|  72.7k|	result = vips_call_split("extract_band", ap, in, out, band);
  485|  72.7k|	va_end(ap);
  486|       |
  487|  72.7k|	return result;
  488|  72.7k|}
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|  2.86k|{
  139|  2.86k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  2.86k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  2.86k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  2.86k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  140|  2.86k|	VipsConversion *conversion = VIPS_CONVERSION(object);
  ------------------
  |  |   40|  2.86k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  2.86k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  2.86k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  2.86k|		VIPS_TYPE_CONVERSION, VipsConversion))
  ------------------
  141|  2.86k|	VipsExtractArea *extract = (VipsExtractArea *) object;
  142|       |
  143|  2.86k|	if (VIPS_OBJECT_CLASS(vips_extract_area_parent_class)->build(object))
  ------------------
  |  |  435|  2.86k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  2.86k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  2.86k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (143:6): [True: 0, False: 2.86k]
  ------------------
  144|      0|		return -1;
  145|       |
  146|  2.86k|	if (extract->left + extract->width > extract->in->Xsize ||
  ------------------
  |  Branch (146:6): [True: 0, False: 2.86k]
  ------------------
  147|  2.86k|		extract->top + extract->height > extract->in->Ysize ||
  ------------------
  |  Branch (147:3): [True: 0, False: 2.86k]
  ------------------
  148|  2.86k|		extract->left < 0 || extract->top < 0 ||
  ------------------
  |  Branch (148:3): [True: 0, False: 2.86k]
  |  Branch (148:24): [True: 0, False: 2.86k]
  ------------------
  149|  2.86k|		extract->width <= 0 || extract->height <= 0) {
  ------------------
  |  Branch (149:3): [True: 0, False: 2.86k]
  |  Branch (149:26): [True: 0, False: 2.86k]
  ------------------
  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|  2.86k|	if (vips_image_pio_input(extract->in) ||
  ------------------
  |  Branch (154:6): [True: 0, False: 2.86k]
  ------------------
  155|  2.86k|		vips_check_coding_known(class->nickname, extract->in))
  ------------------
  |  Branch (155:3): [True: 0, False: 2.86k]
  ------------------
  156|      0|		return -1;
  157|       |
  158|  2.86k|	if (vips_image_pipelinev(conversion->out,
  ------------------
  |  Branch (158:6): [True: 0, False: 2.86k]
  ------------------
  159|  2.86k|			VIPS_DEMAND_STYLE_THINSTRIP, extract->in, NULL))
  160|      0|		return -1;
  161|       |
  162|  2.86k|	conversion->out->Xsize = extract->width;
  163|  2.86k|	conversion->out->Ysize = extract->height;
  164|  2.86k|	conversion->out->Xoffset = -extract->left;
  165|  2.86k|	conversion->out->Yoffset = -extract->top;
  166|       |
  167|  2.86k|	if (vips_image_generate(conversion->out,
  ------------------
  |  Branch (167:6): [True: 0, False: 2.86k]
  ------------------
  168|  2.86k|			vips_start_one, vips_extract_area_gen, vips_stop_one,
  169|  2.86k|			extract->in, extract))
  170|      0|		return -1;
  171|       |
  172|  2.86k|	return 0;
  173|  2.86k|}
extract.c:vips_extract_area_gen:
  113|  9.57k|{
  114|  9.57k|	VipsRegion *ir = (VipsRegion *) seq;
  115|  9.57k|	VipsExtractArea *extract = (VipsExtractArea *) b;
  116|  9.57k|	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|  9.57k|	iarea = out_region->valid;
  122|  9.57k|	iarea.left += extract->left;
  123|  9.57k|	iarea.top += extract->top;
  124|  9.57k|	if (vips_region_prepare(ir, &iarea))
  ------------------
  |  Branch (124:6): [True: 1.09k, False: 8.48k]
  ------------------
  125|  1.09k|		return -1;
  126|       |
  127|       |	/* Attach or to ir.
  128|       |	 */
  129|  8.48k|	if (vips_region_region(out_region, ir,
  ------------------
  |  Branch (129:6): [True: 0, False: 8.48k]
  ------------------
  130|  8.48k|			&out_region->valid, iarea.left, iarea.top))
  131|      0|		return -1;
  132|       |
  133|  8.48k|	return 0;
  134|  8.48k|}
extract.c:vips_extract_area_init:
  238|  2.86k|{
  239|  2.86k|}
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|  72.7k|{
  383|  72.7k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  72.7k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  72.7k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  72.7k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  384|  72.7k|	VipsBandary *bandary = (VipsBandary *) object;
  385|  72.7k|	VipsExtractBand *extract = (VipsExtractBand *) object;
  386|       |
  387|  72.7k|	if (extract->in) {
  ------------------
  |  Branch (387:6): [True: 72.7k, False: 0]
  ------------------
  388|  72.7k|		int bands;
  389|       |
  390|  72.7k|		vips_image_decode_predict(extract->in, &bands, NULL);
  391|       |
  392|  72.7k|		bandary->n = 1;
  393|  72.7k|		bandary->in = &extract->in;
  394|  72.7k|		bandary->out_bands = extract->n;
  395|       |
  396|  72.7k|		if (extract->band + extract->n > bands) {
  ------------------
  |  Branch (396:7): [True: 0, False: 72.7k]
  ------------------
  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|  72.7k|		if (extract->band == 0 &&
  ------------------
  |  Branch (402:7): [True: 36.3k, False: 36.3k]
  ------------------
  403|  72.7k|			extract->n == bands)
  ------------------
  |  Branch (403:4): [True: 0, False: 36.3k]
  ------------------
  404|      0|			return vips_bandary_copy(bandary);
  405|  72.7k|	}
  406|       |
  407|  72.7k|	if (VIPS_OBJECT_CLASS(vips_extract_band_parent_class)->build(object))
  ------------------
  |  |  435|  72.7k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  72.7k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  72.7k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (407:6): [True: 0, False: 72.7k]
  ------------------
  408|      0|		return -1;
  409|       |
  410|  72.7k|	return 0;
  411|  72.7k|}
extract.c:vips_extract_band_buffer:
  348|  2.02M|{
  349|  2.02M|	VipsBandary *bandary = seq->bandary;
  350|  2.02M|	VipsConversion *conversion = (VipsConversion *) bandary;
  351|  2.02M|	VipsExtractBand *extract = (VipsExtractBand *) bandary;
  352|  2.02M|	VipsImage *im = bandary->ready[0];
  353|  2.02M|	int es = VIPS_IMAGE_SIZEOF_ELEMENT(im);
  ------------------
  |  |  382|  2.02M|	(vips_format_sizeof_unsafe((I)->BandFmt))
  ------------------
  354|  2.02M|	int ips = VIPS_IMAGE_SIZEOF_PEL(im);
  ------------------
  |  |  384|  2.02M|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|  2.02M|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  355|  2.02M|	const int ops = VIPS_IMAGE_SIZEOF_PEL(conversion->out);
  ------------------
  |  |  384|  2.02M|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  ------------------
  |  |  |  |  382|  2.02M|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  ------------------
  ------------------
  356|       |
  357|  2.02M|	VipsPel *restrict p;
  358|  2.02M|	VipsPel *restrict q;
  359|  2.02M|	int x, z;
  360|       |
  361|  2.02M|	p = in[0] + extract->band * es;
  362|  2.02M|	q = out;
  363|  2.02M|	if (ops == 1) {
  ------------------
  |  Branch (363:6): [True: 8.34k, False: 2.01M]
  ------------------
  364|   340k|		for (x = 0; x < width; x++) {
  ------------------
  |  Branch (364:15): [True: 331k, False: 8.34k]
  ------------------
  365|   331k|			q[x] = p[0];
  366|   331k|			p += ips;
  367|   331k|		}
  368|  8.34k|	}
  369|  2.01M|	else {
  370|   120M|		for (x = 0; x < width; x++) {
  ------------------
  |  Branch (370:15): [True: 118M, False: 2.01M]
  ------------------
  371|   721M|			for (z = 0; z < ops; z++)
  ------------------
  |  Branch (371:16): [True: 602M, False: 118M]
  ------------------
  372|   602M|				q[z] = p[z];
  373|       |
  374|   118M|			p += ips;
  375|   118M|			q += ops;
  376|   118M|		}
  377|  2.01M|	}
  378|  2.02M|}
extract.c:vips_extract_band_init:
  454|  72.7k|{
  455|  72.7k|	extract->n = 1;
  456|  72.7k|}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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|  1.06k|{
  394|  1.06k|	va_list ap;
  395|  1.06k|	int result;
  396|       |
  397|  1.06k|	va_start(ap, out);
  398|  1.06k|	result = vips_call_split("unpremultiply", ap, in, out);
  399|  1.06k|	va_end(ap);
  400|       |
  401|  1.06k|	return result;
  402|  1.06k|}
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|  1.06k|{
  252|  1.06k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  1.06k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  1.06k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  1.06k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  253|  1.06k|	VipsConversion *conversion = VIPS_CONVERSION(object);
  ------------------
  |  |   40|  1.06k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  1.06k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.06k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|  1.06k|		VIPS_TYPE_CONVERSION, VipsConversion))
  ------------------
  254|  1.06k|	VipsUnpremultiply *unpremultiply = (VipsUnpremultiply *) object;
  255|  1.06k|	VipsImage **t = (VipsImage **) vips_object_local_array(object, 1);
  256|       |
  257|  1.06k|	VipsImage *in;
  258|       |
  259|  1.06k|	if (VIPS_OBJECT_CLASS(vips_unpremultiply_parent_class)->build(object))
  ------------------
  |  |  435|  1.06k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  1.06k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  1.06k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (259:6): [True: 0, False: 1.06k]
  ------------------
  260|      0|		return -1;
  261|       |
  262|  1.06k|	in = unpremultiply->in;
  263|       |
  264|  1.06k|	if (vips_image_decode(in, &t[0]))
  ------------------
  |  Branch (264:6): [True: 0, False: 1.06k]
  ------------------
  265|      0|		return -1;
  266|  1.06k|	in = t[0];
  267|       |
  268|       |	/* Trivial case: fall back to copy().
  269|       |	 */
  270|  1.06k|	if (in->Bands == 1)
  ------------------
  |  Branch (270:6): [True: 70, False: 998]
  ------------------
  271|     70|		return vips_image_write(in, conversion->out);
  272|       |
  273|    998|	if (vips_check_noncomplex(class->nickname, in))
  ------------------
  |  Branch (273:6): [True: 0, False: 998]
  ------------------
  274|      0|		return -1;
  275|       |
  276|    998|	if (vips_image_pipelinev(conversion->out,
  ------------------
  |  Branch (276:6): [True: 0, False: 998]
  ------------------
  277|    998|			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|    998|	if (!vips_object_argument_isset(object, "max_alpha"))
  ------------------
  |  Branch (283:6): [True: 998, False: 0]
  ------------------
  284|    998|		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|    998|	if (!vips_object_argument_isset(object, "alpha_band"))
  ------------------
  |  Branch (288:6): [True: 0, False: 998]
  ------------------
  289|      0|		unpremultiply->alpha_band = in->Bands - 1; // FIXME: Invalidates operation cache
  290|       |
  291|    998|	if (in->BandFmt == VIPS_FORMAT_DOUBLE)
  ------------------
  |  Branch (291:6): [True: 0, False: 998]
  ------------------
  292|      0|		conversion->out->BandFmt = VIPS_FORMAT_DOUBLE;
  293|    998|	else
  294|    998|		conversion->out->BandFmt = VIPS_FORMAT_FLOAT;
  295|       |
  296|    998|	if (vips_image_generate(conversion->out,
  ------------------
  |  Branch (296:6): [True: 0, False: 998]
  ------------------
  297|    998|			vips_start_one, vips_unpremultiply_gen, vips_stop_one,
  298|    998|			in, unpremultiply))
  299|      0|		return -1;
  300|       |
  301|    998|	return 0;
  302|    998|}
unpremultiply.c:vips_unpremultiply_init:
  345|  1.06k|{
  346|  1.06k|	unpremultiply->max_alpha = 255.0;
  347|  1.06k|}
unpremultiply.c:vips_unpremultiply_gen.avx.0:
  187|  2.94k|{
  188|  2.94k|	VipsUnpremultiply *unpremultiply = (VipsUnpremultiply *) b;
  189|  2.94k|	VipsRegion *ir = (VipsRegion *) vseq;
  190|  2.94k|	VipsImage *im = ir->im;
  191|  2.94k|	VipsRect *r = &out_region->valid;
  192|  2.94k|	int width = r->width;
  193|  2.94k|	int bands = im->Bands;
  194|  2.94k|	double max_alpha = unpremultiply->max_alpha;
  195|  2.94k|	int alpha_band = unpremultiply->alpha_band;
  196|       |
  197|  2.94k|	int x, y, i;
  198|       |
  199|  2.94k|	if (vips_region_prepare(ir, r))
  ------------------
  |  Branch (199:6): [True: 29, False: 2.91k]
  ------------------
  200|     29|		return -1;
  201|       |
  202|  42.0k|	for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (202:14): [True: 39.1k, False: 2.91k]
  ------------------
  203|  39.1k|		VipsPel *in = VIPS_REGION_ADDR(ir, r->left, r->top + y);
  ------------------
  |  |  227|  39.1k|	((R)->data + \
  |  |  228|  39.1k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  39.1k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  39.1k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  39.1k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  39.1k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  39.1k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  204|  39.1k|		VipsPel *out = VIPS_REGION_ADDR(out_region, r->left, r->top + y);
  ------------------
  |  |  227|  39.1k|	((R)->data + \
  |  |  228|  39.1k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  39.1k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  39.1k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  39.1k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  39.1k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  39.1k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  205|       |
  206|  39.1k|		switch (im->BandFmt) {
  207|  11.0k|		case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (207:3): [True: 11.0k, False: 28.0k]
  ------------------
  208|  11.0k|			UNPRE(unsigned char, float);
  ------------------
  |  |  122|  11.0k|	{ \
  |  |  123|  11.0k|		if (bands == 4) { \
  |  |  ------------------
  |  |  |  Branch (123:7): [True: 2.31k, False: 8.73k]
  |  |  ------------------
  |  |  124|  2.31k|			UNPRE_RGBA(IN, OUT); \
  |  |  ------------------
  |  |  |  |  103|  2.31k|	{ \
  |  |  |  |  104|  2.31k|		IN *restrict p = (IN *) in; \
  |  |  |  |  105|  2.31k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  106|  2.31k|\
  |  |  |  |  107|   129k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (107:15): [True: 127k, False: 2.31k]
  |  |  |  |  ------------------
  |  |  |  |  108|   127k|			IN alpha = p[3]; \
  |  |  |  |  109|   127k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (109:17): [True: 74.7k, False: 52.7k]
  |  |  |  |  ------------------
  |  |  |  |  110|   127k|\
  |  |  |  |  111|   127k|			q[0] = factor * p[0]; \
  |  |  |  |  112|   127k|			q[1] = factor * p[1]; \
  |  |  |  |  113|   127k|			q[2] = factor * p[2]; \
  |  |  |  |  114|   127k|			q[3] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   127k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   255k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 127k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 127k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 127k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  115|   127k|\
  |  |  |  |  116|   127k|			p += 4; \
  |  |  |  |  117|   127k|			q += 4; \
  |  |  |  |  118|   127k|		} \
  |  |  |  |  119|  2.31k|	}
  |  |  ------------------
  |  |  125|  2.31k|		} \
  |  |  126|  11.0k|		else { \
  |  |  127|  8.73k|			UNPRE_MANY(IN, OUT); \
  |  |  ------------------
  |  |  |  |   81|  8.73k|	{ \
  |  |  |  |   82|  8.73k|		IN *restrict p = (IN *) in; \
  |  |  |  |   83|  8.73k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |   84|  8.73k|\
  |  |  |  |   85|   435k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (85:15): [True: 426k, False: 8.73k]
  |  |  |  |  ------------------
  |  |  |  |   86|   426k|			IN alpha = p[alpha_band]; \
  |  |  |  |   87|   426k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (87:17): [True: 307k, False: 119k]
  |  |  |  |  ------------------
  |  |  |  |   88|   426k|\
  |  |  |  |   89|   929k|			for (i = 0; i < alpha_band; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (89:16): [True: 502k, False: 426k]
  |  |  |  |  ------------------
  |  |  |  |   90|   502k|				q[i] = factor * p[i]; \
  |  |  |  |   91|   426k|			q[alpha_band] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   426k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   853k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 426k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 426k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 426k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   92|   776k|			for (i = alpha_band + 1; i < bands; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (92:29): [True: 349k, False: 426k]
  |  |  |  |  ------------------
  |  |  |  |   93|   426k|				q[i] = p[i]; \
  |  |  |  |   94|   426k|\
  |  |  |  |   95|   426k|			p += bands; \
  |  |  |  |   96|   426k|			q += bands; \
  |  |  |  |   97|   426k|		} \
  |  |  |  |   98|  8.73k|	}
  |  |  ------------------
  |  |  128|  8.73k|		} \
  |  |  129|  11.0k|	}
  ------------------
  209|  11.0k|			break;
  210|       |
  211|  1.51k|		case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (211:3): [True: 1.51k, False: 37.5k]
  ------------------
  212|  1.51k|			UNPRE(signed char, float);
  ------------------
  |  |  122|  1.51k|	{ \
  |  |  123|  1.51k|		if (bands == 4) { \
  |  |  ------------------
  |  |  |  Branch (123:7): [True: 845, False: 669]
  |  |  ------------------
  |  |  124|    845|			UNPRE_RGBA(IN, OUT); \
  |  |  ------------------
  |  |  |  |  103|    845|	{ \
  |  |  |  |  104|    845|		IN *restrict p = (IN *) in; \
  |  |  |  |  105|    845|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  106|    845|\
  |  |  |  |  107|  28.6k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (107:15): [True: 27.7k, False: 845]
  |  |  |  |  ------------------
  |  |  |  |  108|  27.7k|			IN alpha = p[3]; \
  |  |  |  |  109|  27.7k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (109:17): [True: 14.8k, False: 12.8k]
  |  |  |  |  ------------------
  |  |  |  |  110|  27.7k|\
  |  |  |  |  111|  27.7k|			q[0] = factor * p[0]; \
  |  |  |  |  112|  27.7k|			q[1] = factor * p[1]; \
  |  |  |  |  113|  27.7k|			q[2] = factor * p[2]; \
  |  |  |  |  114|  27.7k|			q[3] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  27.7k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  55.5k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 3.68k, False: 24.0k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 27.7k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 24.0k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  115|  27.7k|\
  |  |  |  |  116|  27.7k|			p += 4; \
  |  |  |  |  117|  27.7k|			q += 4; \
  |  |  |  |  118|  27.7k|		} \
  |  |  |  |  119|    845|	}
  |  |  ------------------
  |  |  125|    845|		} \
  |  |  126|  1.51k|		else { \
  |  |  127|    669|			UNPRE_MANY(IN, OUT); \
  |  |  ------------------
  |  |  |  |   81|    669|	{ \
  |  |  |  |   82|    669|		IN *restrict p = (IN *) in; \
  |  |  |  |   83|    669|		OUT *restrict q = (OUT *) out; \
  |  |  |  |   84|    669|\
  |  |  |  |   85|  24.8k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (85:15): [True: 24.1k, False: 669]
  |  |  |  |  ------------------
  |  |  |  |   86|  24.1k|			IN alpha = p[alpha_band]; \
  |  |  |  |   87|  24.1k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (87:17): [True: 18.2k, False: 5.87k]
  |  |  |  |  ------------------
  |  |  |  |   88|  24.1k|\
  |  |  |  |   89|  56.5k|			for (i = 0; i < alpha_band; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (89:16): [True: 32.3k, False: 24.1k]
  |  |  |  |  ------------------
  |  |  |  |   90|  32.3k|				q[i] = factor * p[i]; \
  |  |  |  |   91|  24.1k|			q[alpha_band] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  24.1k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  48.2k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 1.60k, False: 22.5k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 24.1k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 22.5k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   92|  26.1k|			for (i = alpha_band + 1; i < bands; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (92:29): [True: 2.04k, False: 24.1k]
  |  |  |  |  ------------------
  |  |  |  |   93|  24.1k|				q[i] = p[i]; \
  |  |  |  |   94|  24.1k|\
  |  |  |  |   95|  24.1k|			p += bands; \
  |  |  |  |   96|  24.1k|			q += bands; \
  |  |  |  |   97|  24.1k|		} \
  |  |  |  |   98|    669|	}
  |  |  ------------------
  |  |  128|    669|		} \
  |  |  129|  1.51k|	}
  ------------------
  213|  1.51k|			break;
  214|       |
  215|  2.93k|		case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (215:3): [True: 2.93k, False: 36.1k]
  ------------------
  216|  2.93k|			UNPRE(unsigned short, float);
  ------------------
  |  |  122|  2.93k|	{ \
  |  |  123|  2.93k|		if (bands == 4) { \
  |  |  ------------------
  |  |  |  Branch (123:7): [True: 575, False: 2.36k]
  |  |  ------------------
  |  |  124|    575|			UNPRE_RGBA(IN, OUT); \
  |  |  ------------------
  |  |  |  |  103|    575|	{ \
  |  |  |  |  104|    575|		IN *restrict p = (IN *) in; \
  |  |  |  |  105|    575|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  106|    575|\
  |  |  |  |  107|  10.0k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (107:15): [True: 9.45k, False: 575]
  |  |  |  |  ------------------
  |  |  |  |  108|  9.45k|			IN alpha = p[3]; \
  |  |  |  |  109|  9.45k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (109:17): [True: 7.36k, False: 2.09k]
  |  |  |  |  ------------------
  |  |  |  |  110|  9.45k|\
  |  |  |  |  111|  9.45k|			q[0] = factor * p[0]; \
  |  |  |  |  112|  9.45k|			q[1] = factor * p[1]; \
  |  |  |  |  113|  9.45k|			q[2] = factor * p[2]; \
  |  |  |  |  114|  9.45k|			q[3] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  9.45k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  18.9k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 9.45k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 1.31k, False: 8.14k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 1.31k, False: 8.14k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  115|  9.45k|\
  |  |  |  |  116|  9.45k|			p += 4; \
  |  |  |  |  117|  9.45k|			q += 4; \
  |  |  |  |  118|  9.45k|		} \
  |  |  |  |  119|    575|	}
  |  |  ------------------
  |  |  125|    575|		} \
  |  |  126|  2.93k|		else { \
  |  |  127|  2.36k|			UNPRE_MANY(IN, OUT); \
  |  |  ------------------
  |  |  |  |   81|  2.36k|	{ \
  |  |  |  |   82|  2.36k|		IN *restrict p = (IN *) in; \
  |  |  |  |   83|  2.36k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |   84|  2.36k|\
  |  |  |  |   85|  66.3k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (85:15): [True: 64.0k, False: 2.36k]
  |  |  |  |  ------------------
  |  |  |  |   86|  64.0k|			IN alpha = p[alpha_band]; \
  |  |  |  |   87|  64.0k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (87:17): [True: 42.9k, False: 21.0k]
  |  |  |  |  ------------------
  |  |  |  |   88|  64.0k|\
  |  |  |  |   89|   161k|			for (i = 0; i < alpha_band; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (89:16): [True: 97.1k, False: 64.0k]
  |  |  |  |  ------------------
  |  |  |  |   90|  97.1k|				q[i] = factor * p[i]; \
  |  |  |  |   91|  64.0k|			q[alpha_band] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  64.0k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   128k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 64.0k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 64.0k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 64.0k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   92|  91.1k|			for (i = alpha_band + 1; i < bands; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (92:29): [True: 27.1k, False: 64.0k]
  |  |  |  |  ------------------
  |  |  |  |   93|  64.0k|				q[i] = p[i]; \
  |  |  |  |   94|  64.0k|\
  |  |  |  |   95|  64.0k|			p += bands; \
  |  |  |  |   96|  64.0k|			q += bands; \
  |  |  |  |   97|  64.0k|		} \
  |  |  |  |   98|  2.36k|	}
  |  |  ------------------
  |  |  128|  2.36k|		} \
  |  |  129|  2.93k|	}
  ------------------
  217|  2.93k|			break;
  218|       |
  219|  4.28k|		case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (219:3): [True: 4.28k, False: 34.8k]
  ------------------
  220|  4.28k|			UNPRE(signed short, float);
  ------------------
  |  |  122|  4.28k|	{ \
  |  |  123|  4.28k|		if (bands == 4) { \
  |  |  ------------------
  |  |  |  Branch (123:7): [True: 1.17k, False: 3.11k]
  |  |  ------------------
  |  |  124|  1.17k|			UNPRE_RGBA(IN, OUT); \
  |  |  ------------------
  |  |  |  |  103|  1.17k|	{ \
  |  |  |  |  104|  1.17k|		IN *restrict p = (IN *) in; \
  |  |  |  |  105|  1.17k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  106|  1.17k|\
  |  |  |  |  107|  23.9k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (107:15): [True: 22.7k, False: 1.17k]
  |  |  |  |  ------------------
  |  |  |  |  108|  22.7k|			IN alpha = p[3]; \
  |  |  |  |  109|  22.7k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (109:17): [True: 17.0k, False: 5.71k]
  |  |  |  |  ------------------
  |  |  |  |  110|  22.7k|\
  |  |  |  |  111|  22.7k|			q[0] = factor * p[0]; \
  |  |  |  |  112|  22.7k|			q[1] = factor * p[1]; \
  |  |  |  |  113|  22.7k|			q[2] = factor * p[2]; \
  |  |  |  |  114|  22.7k|			q[3] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  22.7k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  45.5k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 1.76k, False: 21.0k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 1.91k, False: 20.8k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 1.91k, False: 19.0k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  115|  22.7k|\
  |  |  |  |  116|  22.7k|			p += 4; \
  |  |  |  |  117|  22.7k|			q += 4; \
  |  |  |  |  118|  22.7k|		} \
  |  |  |  |  119|  1.17k|	}
  |  |  ------------------
  |  |  125|  1.17k|		} \
  |  |  126|  4.28k|		else { \
  |  |  127|  3.11k|			UNPRE_MANY(IN, OUT); \
  |  |  ------------------
  |  |  |  |   81|  3.11k|	{ \
  |  |  |  |   82|  3.11k|		IN *restrict p = (IN *) in; \
  |  |  |  |   83|  3.11k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |   84|  3.11k|\
  |  |  |  |   85|  97.7k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (85:15): [True: 94.6k, False: 3.11k]
  |  |  |  |  ------------------
  |  |  |  |   86|  94.6k|			IN alpha = p[alpha_band]; \
  |  |  |  |   87|  94.6k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (87:17): [True: 43.9k, False: 50.7k]
  |  |  |  |  ------------------
  |  |  |  |   88|  94.6k|\
  |  |  |  |   89|   222k|			for (i = 0; i < alpha_band; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (89:16): [True: 127k, False: 94.6k]
  |  |  |  |  ------------------
  |  |  |  |   90|   127k|				q[i] = factor * p[i]; \
  |  |  |  |   91|  94.6k|			q[alpha_band] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  94.6k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   189k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 10.6k, False: 83.9k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 26.3k, False: 68.3k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 26.3k, False: 57.6k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   92|   152k|			for (i = alpha_band + 1; i < bands; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (92:29): [True: 57.6k, False: 94.6k]
  |  |  |  |  ------------------
  |  |  |  |   93|  94.6k|				q[i] = p[i]; \
  |  |  |  |   94|  94.6k|\
  |  |  |  |   95|  94.6k|			p += bands; \
  |  |  |  |   96|  94.6k|			q += bands; \
  |  |  |  |   97|  94.6k|		} \
  |  |  |  |   98|  3.11k|	}
  |  |  ------------------
  |  |  128|  3.11k|		} \
  |  |  129|  4.28k|	}
  ------------------
  221|  4.28k|			break;
  222|       |
  223|  4.38k|		case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (223:3): [True: 4.38k, False: 34.7k]
  ------------------
  224|  4.38k|			UNPRE(unsigned int, float);
  ------------------
  |  |  122|  4.38k|	{ \
  |  |  123|  4.38k|		if (bands == 4) { \
  |  |  ------------------
  |  |  |  Branch (123:7): [True: 1.26k, False: 3.12k]
  |  |  ------------------
  |  |  124|  1.26k|			UNPRE_RGBA(IN, OUT); \
  |  |  ------------------
  |  |  |  |  103|  1.26k|	{ \
  |  |  |  |  104|  1.26k|		IN *restrict p = (IN *) in; \
  |  |  |  |  105|  1.26k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  106|  1.26k|\
  |  |  |  |  107|  19.5k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (107:15): [True: 18.3k, False: 1.26k]
  |  |  |  |  ------------------
  |  |  |  |  108|  18.3k|			IN alpha = p[3]; \
  |  |  |  |  109|  18.3k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (109:17): [True: 12.3k, False: 5.92k]
  |  |  |  |  ------------------
  |  |  |  |  110|  18.3k|\
  |  |  |  |  111|  18.3k|			q[0] = factor * p[0]; \
  |  |  |  |  112|  18.3k|			q[1] = factor * p[1]; \
  |  |  |  |  113|  18.3k|			q[2] = factor * p[2]; \
  |  |  |  |  114|  18.3k|			q[3] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  18.3k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  36.6k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 18.3k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 5.66k, False: 12.6k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 5.66k, False: 12.6k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  115|  18.3k|\
  |  |  |  |  116|  18.3k|			p += 4; \
  |  |  |  |  117|  18.3k|			q += 4; \
  |  |  |  |  118|  18.3k|		} \
  |  |  |  |  119|  1.26k|	}
  |  |  ------------------
  |  |  125|  1.26k|		} \
  |  |  126|  4.38k|		else { \
  |  |  127|  3.12k|			UNPRE_MANY(IN, OUT); \
  |  |  ------------------
  |  |  |  |   81|  3.12k|	{ \
  |  |  |  |   82|  3.12k|		IN *restrict p = (IN *) in; \
  |  |  |  |   83|  3.12k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |   84|  3.12k|\
  |  |  |  |   85|  36.3k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (85:15): [True: 33.2k, False: 3.12k]
  |  |  |  |  ------------------
  |  |  |  |   86|  33.2k|			IN alpha = p[alpha_band]; \
  |  |  |  |   87|  33.2k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (87:17): [True: 9.79k, False: 23.4k]
  |  |  |  |  ------------------
  |  |  |  |   88|  33.2k|\
  |  |  |  |   89|  62.4k|			for (i = 0; i < alpha_band; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (89:16): [True: 29.1k, False: 33.2k]
  |  |  |  |  ------------------
  |  |  |  |   90|  33.2k|				q[i] = factor * p[i]; \
  |  |  |  |   91|  33.2k|			q[alpha_band] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  33.2k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  66.4k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 33.2k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 22.5k, False: 10.6k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 22.5k, False: 10.6k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   92|  54.3k|			for (i = alpha_band + 1; i < bands; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (92:29): [True: 21.1k, False: 33.2k]
  |  |  |  |  ------------------
  |  |  |  |   93|  33.2k|				q[i] = p[i]; \
  |  |  |  |   94|  33.2k|\
  |  |  |  |   95|  33.2k|			p += bands; \
  |  |  |  |   96|  33.2k|			q += bands; \
  |  |  |  |   97|  33.2k|		} \
  |  |  |  |   98|  3.12k|	}
  |  |  ------------------
  |  |  128|  3.12k|		} \
  |  |  129|  4.38k|	}
  ------------------
  225|  4.38k|			break;
  226|       |
  227|  7.59k|		case VIPS_FORMAT_INT:
  ------------------
  |  Branch (227:3): [True: 7.59k, False: 31.5k]
  ------------------
  228|  7.59k|			UNPRE(signed int, float);
  ------------------
  |  |  122|  7.59k|	{ \
  |  |  123|  7.59k|		if (bands == 4) { \
  |  |  ------------------
  |  |  |  Branch (123:7): [True: 2.25k, False: 5.34k]
  |  |  ------------------
  |  |  124|  2.25k|			UNPRE_RGBA(IN, OUT); \
  |  |  ------------------
  |  |  |  |  103|  2.25k|	{ \
  |  |  |  |  104|  2.25k|		IN *restrict p = (IN *) in; \
  |  |  |  |  105|  2.25k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  106|  2.25k|\
  |  |  |  |  107|  36.8k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (107:15): [True: 34.6k, False: 2.25k]
  |  |  |  |  ------------------
  |  |  |  |  108|  34.6k|			IN alpha = p[3]; \
  |  |  |  |  109|  34.6k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (109:17): [True: 20.2k, False: 14.3k]
  |  |  |  |  ------------------
  |  |  |  |  110|  34.6k|\
  |  |  |  |  111|  34.6k|			q[0] = factor * p[0]; \
  |  |  |  |  112|  34.6k|			q[1] = factor * p[1]; \
  |  |  |  |  113|  34.6k|			q[2] = factor * p[2]; \
  |  |  |  |  114|  34.6k|			q[3] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  34.6k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  69.2k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 3.29k, False: 31.3k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 10.4k, False: 24.1k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 10.4k, False: 20.8k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  115|  34.6k|\
  |  |  |  |  116|  34.6k|			p += 4; \
  |  |  |  |  117|  34.6k|			q += 4; \
  |  |  |  |  118|  34.6k|		} \
  |  |  |  |  119|  2.25k|	}
  |  |  ------------------
  |  |  125|  2.25k|		} \
  |  |  126|  7.59k|		else { \
  |  |  127|  5.34k|			UNPRE_MANY(IN, OUT); \
  |  |  ------------------
  |  |  |  |   81|  5.34k|	{ \
  |  |  |  |   82|  5.34k|		IN *restrict p = (IN *) in; \
  |  |  |  |   83|  5.34k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |   84|  5.34k|\
  |  |  |  |   85|  76.2k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (85:15): [True: 70.9k, False: 5.34k]
  |  |  |  |  ------------------
  |  |  |  |   86|  70.9k|			IN alpha = p[alpha_band]; \
  |  |  |  |   87|  70.9k|			OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (87:17): [True: 27.4k, False: 43.5k]
  |  |  |  |  ------------------
  |  |  |  |   88|  70.9k|\
  |  |  |  |   89|   175k|			for (i = 0; i < alpha_band; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (89:16): [True: 104k, False: 70.9k]
  |  |  |  |  ------------------
  |  |  |  |   90|   104k|				q[i] = factor * p[i]; \
  |  |  |  |   91|  70.9k|			q[alpha_band] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  70.9k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   141k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 4.02k, False: 66.9k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 37.9k, False: 33.0k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 37.9k, False: 29.0k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   92|  93.7k|			for (i = alpha_band + 1; i < bands; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (92:29): [True: 22.8k, False: 70.9k]
  |  |  |  |  ------------------
  |  |  |  |   93|  70.9k|				q[i] = p[i]; \
  |  |  |  |   94|  70.9k|\
  |  |  |  |   95|  70.9k|			p += bands; \
  |  |  |  |   96|  70.9k|			q += bands; \
  |  |  |  |   97|  70.9k|		} \
  |  |  |  |   98|  5.34k|	}
  |  |  ------------------
  |  |  128|  5.34k|		} \
  |  |  129|  7.59k|	}
  ------------------
  229|  7.59k|			break;
  230|       |
  231|  7.32k|		case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (231:3): [True: 7.32k, False: 31.7k]
  ------------------
  232|  7.32k|			FUNPRE(float, float);
  ------------------
  |  |  174|  7.32k|	{ \
  |  |  175|  7.32k|		if (bands == 4) { \
  |  |  ------------------
  |  |  |  Branch (175:7): [True: 1.69k, False: 5.63k]
  |  |  ------------------
  |  |  176|  1.69k|			FUNPRE_RGBA(IN, OUT); \
  |  |  ------------------
  |  |  |  |  155|  1.69k|	{ \
  |  |  |  |  156|  1.69k|		IN *restrict p = (IN *) in; \
  |  |  |  |  157|  1.69k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  158|  1.69k|\
  |  |  |  |  159|  41.5k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (159:15): [True: 39.8k, False: 1.69k]
  |  |  |  |  ------------------
  |  |  |  |  160|  39.8k|			IN alpha = p[3]; \
  |  |  |  |  161|  39.8k|			OUT factor = VIPS_ABS(alpha) < 0.01 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  |   62|  39.8k|#define VIPS_ABS(X) (((X) >= 0) ? (X) : -(X))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (62:22): [True: 38.9k, False: 868]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (161:17): [True: 35.5k, False: 4.22k]
  |  |  |  |  ------------------
  |  |  |  |  162|  39.8k|\
  |  |  |  |  163|  39.8k|			q[0] = factor * p[0]; \
  |  |  |  |  164|  39.8k|			q[1] = factor * p[1]; \
  |  |  |  |  165|  39.8k|			q[2] = factor * p[2]; \
  |  |  |  |  166|  39.8k|			q[3] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  39.8k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  79.6k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 840, False: 38.9k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 1.29k, False: 38.5k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 1.29k, False: 37.6k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  167|  39.8k|\
  |  |  |  |  168|  39.8k|			p += 4; \
  |  |  |  |  169|  39.8k|			q += 4; \
  |  |  |  |  170|  39.8k|		} \
  |  |  |  |  171|  1.69k|	}
  |  |  ------------------
  |  |  177|  1.69k|		} \
  |  |  178|  7.32k|		else { \
  |  |  179|  5.63k|			FUNPRE_MANY(IN, OUT); \
  |  |  ------------------
  |  |  |  |  135|  5.63k|	{ \
  |  |  |  |  136|  5.63k|		IN *restrict p = (IN *) in; \
  |  |  |  |  137|  5.63k|		OUT *restrict q = (OUT *) out; \
  |  |  |  |  138|  5.63k|\
  |  |  |  |  139|   182k|		for (x = 0; x < width; x++) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (139:15): [True: 176k, False: 5.63k]
  |  |  |  |  ------------------
  |  |  |  |  140|   176k|			IN alpha = p[alpha_band]; \
  |  |  |  |  141|   176k|			OUT factor = VIPS_ABS(alpha) < 0.01 ? 0 : max_alpha / alpha; \
  |  |  |  |  ------------------
  |  |  |  |  |  |   62|   176k|#define VIPS_ABS(X) (((X) >= 0) ? (X) : -(X))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (62:22): [True: 174k, False: 2.77k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (141:17): [True: 161k, False: 15.4k]
  |  |  |  |  ------------------
  |  |  |  |  142|   176k|\
  |  |  |  |  143|   371k|			for (i = 0; i < alpha_band; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (143:16): [True: 194k, False: 176k]
  |  |  |  |  ------------------
  |  |  |  |  144|   194k|				q[i] = factor * p[i]; \
  |  |  |  |  145|   176k|			q[alpha_band] = VIPS_CLIP(0, alpha, max_alpha); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   176k|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   353k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 2.49k, False: 174k]
  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 3.37k, False: 173k]
  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 3.37k, False: 171k]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  146|   335k|			for (i = alpha_band + 1; i < bands; i++) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (146:29): [True: 158k, False: 176k]
  |  |  |  |  ------------------
  |  |  |  |  147|   176k|				q[i] = p[i]; \
  |  |  |  |  148|   176k|\
  |  |  |  |  149|   176k|			p += bands; \
  |  |  |  |  150|   176k|			q += bands; \
  |  |  |  |  151|   176k|		} \
  |  |  |  |  152|  5.63k|	}
  |  |  ------------------
  |  |  180|  5.63k|		} \
  |  |  181|  7.32k|	}
  ------------------
  233|  7.32k|			break;
  234|       |
  235|      0|		case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (235:3): [True: 0, False: 39.1k]
  ------------------
  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: 39.1k]
  ------------------
  240|      0|		case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (240:3): [True: 0, False: 39.1k]
  ------------------
  241|      0|		default:
  ------------------
  |  Branch (241:3): [True: 0, False: 39.1k]
  ------------------
  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|  39.1k|		}
  244|  39.1k|	}
  245|       |
  246|  2.91k|	return 0;
  247|  2.91k|}

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|  31.1k|{
  225|  31.1k|	va_list ap;
  226|  31.1k|	int result;
  227|       |
  228|  31.1k|	va_start(ap, mask);
  229|  31.1k|	result = vips_call_split("conv", ap, in, out, mask);
  230|  31.1k|	va_end(ap);
  231|       |
  232|  31.1k|	return result;
  233|  31.1k|}
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|  31.1k|{
   64|  31.1k|	VipsConvolution *convolution = (VipsConvolution *) object;
   65|  31.1k|	VipsConv *conv = (VipsConv *) object;
   66|  31.1k|	VipsImage **t = (VipsImage **) vips_object_local_array(object, 4);
   67|       |
   68|  31.1k|	VipsImage *in;
   69|       |
   70|  31.1k|	if (VIPS_OBJECT_CLASS(vips_conv_parent_class)->build(object))
  ------------------
  |  |  435|  31.1k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  31.1k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  31.1k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (70:6): [True: 0, False: 31.1k]
  ------------------
   71|      0|		return -1;
   72|       |
   73|  31.1k|	g_object_set(conv, "out", vips_image_new(), NULL);
   74|       |
   75|  31.1k|	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|  31.1k|	if (vips_image_decode(in, &t[0]))
  ------------------
  |  Branch (84:6): [True: 0, False: 31.1k]
  ------------------
   85|      0|		return -1;
   86|  31.1k|	in = t[0];
   87|       |
   88|  31.1k|	switch (conv->precision) {
   89|      0|	case VIPS_PRECISION_FLOAT:
  ------------------
  |  Branch (89:2): [True: 0, False: 31.1k]
  ------------------
   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|  31.1k|	case VIPS_PRECISION_INTEGER:
  ------------------
  |  Branch (95:2): [True: 31.1k, False: 0]
  ------------------
   96|  31.1k|		if (vips_convi(in, &t[1], convolution->M, NULL) ||
  ------------------
  |  Branch (96:7): [True: 0, False: 31.1k]
  ------------------
   97|  31.1k|			vips_image_write(t[1], convolution->out))
  ------------------
  |  Branch (97:4): [True: 0, False: 31.1k]
  ------------------
   98|      0|			return -1;
   99|  31.1k|		break;
  100|       |
  101|  31.1k|	case VIPS_PRECISION_APPROXIMATE:
  ------------------
  |  Branch (101:2): [True: 0, False: 31.1k]
  ------------------
  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: 31.1k]
  ------------------
  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|  31.1k|	}
  113|       |
  114|  31.1k|	vips_reorder_margin_hint(convolution->out,
  115|  31.1k|		convolution->M->Xsize * convolution->M->Ysize);
  116|       |
  117|  31.1k|	return 0;
  118|  31.1k|}
conv.c:vips_conv_init:
  157|  31.1k|{
  158|  31.1k|	conv->precision = VIPS_PRECISION_FLOAT;
  159|  31.1k|	conv->layers = 5;
  160|  31.1k|	conv->cluster = 1;
  161|  31.1k|}

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|  31.1k|{
  860|  31.1k|	VipsImage *t;
  861|  31.1k|	int x, y;
  862|  31.1k|	double double_result;
  863|  31.1k|	double out_scale;
  864|  31.1k|	double out_offset;
  865|  31.1k|	int int_result;
  866|       |
  867|  31.1k|	if (vips_check_matrix("vips2imask", in, &t))
  ------------------
  |  Branch (867:6): [True: 0, False: 31.1k]
  ------------------
  868|      0|		return -1;
  869|  31.1k|	if (!(*out = vips_image_new_matrix(t->Xsize, t->Ysize))) {
  ------------------
  |  Branch (869:6): [True: 0, False: 31.1k]
  ------------------
  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|  31.1k|	double_result = 0;
  885|  93.5k|	for (y = 0; y < t->Ysize; y++)
  ------------------
  |  Branch (885:14): [True: 62.3k, False: 31.1k]
  ------------------
  886|   155k|		for (x = 0; x < t->Xsize; x++)
  ------------------
  |  Branch (886:15): [True: 93.5k, False: 62.3k]
  ------------------
  887|  93.5k|			double_result += *VIPS_MATRIX(t, x, y);
  ------------------
  |  |  432|   124k|	((double *) VIPS_IMAGE_ADDR(I, X, Y))
  |  |  ------------------
  |  |  |  |  418|  93.5k|	((I)->data + \
  |  |  |  |  419|  93.5k|		(Y) *VIPS_IMAGE_SIZEOF_LINE(I) + \
  |  |  |  |  ------------------
  |  |  |  |  |  |  386|  93.5k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  384|  93.5k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  382|  93.5k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  420|  93.5k|		(X) *VIPS_IMAGE_SIZEOF_PEL(I))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  93.5k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  93.5k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  888|  31.1k|	double_result /= vips_image_get_scale(t);
  889|       |
  890|  93.5k|	for (y = 0; y < t->Ysize; y++)
  ------------------
  |  Branch (890:14): [True: 62.3k, False: 31.1k]
  ------------------
  891|   155k|		for (x = 0; x < t->Xsize; x++)
  ------------------
  |  Branch (891:15): [True: 93.5k, False: 62.3k]
  ------------------
  892|  93.5k|			*VIPS_MATRIX(*out, x, y) =
  ------------------
  |  |  432|  93.5k|	((double *) VIPS_IMAGE_ADDR(I, X, Y))
  |  |  ------------------
  |  |  |  |  418|  93.5k|	((I)->data + \
  |  |  |  |  419|  93.5k|		(Y) *VIPS_IMAGE_SIZEOF_LINE(I) + \
  |  |  |  |  ------------------
  |  |  |  |  |  |  386|  93.5k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  384|  93.5k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  382|  93.5k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  420|  93.5k|		(X) *VIPS_IMAGE_SIZEOF_PEL(I))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  93.5k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  93.5k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  893|  93.5k|				VIPS_RINT(*VIPS_MATRIX(t, x, y));
  ------------------
  |  |   74|   124k|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  894|       |
  895|  31.1k|	out_scale = VIPS_RINT(vips_image_get_scale(t));
  ------------------
  |  |   74|  31.1k|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  896|  31.1k|	if (out_scale == 0)
  ------------------
  |  Branch (896:6): [True: 0, False: 31.1k]
  ------------------
  897|      0|		out_scale = 1;
  898|  31.1k|	out_offset = VIPS_RINT(vips_image_get_offset(t));
  ------------------
  |  |   74|  31.1k|#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|  31.1k|	int_result = 0;
  904|  93.5k|	for (y = 0; y < t->Ysize; y++)
  ------------------
  |  Branch (904:14): [True: 62.3k, False: 31.1k]
  ------------------
  905|   155k|		for (x = 0; x < t->Xsize; x++)
  ------------------
  |  Branch (905:15): [True: 93.5k, False: 62.3k]
  ------------------
  906|  93.5k|			int_result += *VIPS_MATRIX(*out, x, y);
  ------------------
  |  |  432|   124k|	((double *) VIPS_IMAGE_ADDR(I, X, Y))
  |  |  ------------------
  |  |  |  |  418|  93.5k|	((I)->data + \
  |  |  |  |  419|  93.5k|		(Y) *VIPS_IMAGE_SIZEOF_LINE(I) + \
  |  |  |  |  ------------------
  |  |  |  |  |  |  386|  93.5k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  384|  93.5k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  382|  93.5k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  420|  93.5k|		(X) *VIPS_IMAGE_SIZEOF_PEL(I))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  93.5k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  93.5k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  907|  31.1k|	int_result /= out_scale;
  908|       |
  909|       |	/* And adjust the scale to get as close to a match as we can.
  910|       |	 */
  911|  31.1k|	out_scale = VIPS_RINT(out_scale + (int_result - double_result));
  ------------------
  |  |   74|  31.1k|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  912|  31.1k|	if (out_scale == 0)
  ------------------
  |  Branch (912:6): [True: 0, False: 31.1k]
  ------------------
  913|      0|		out_scale = 1;
  914|       |
  915|  31.1k|	vips_image_set_double(*out, "scale", out_scale);
  916|  31.1k|	vips_image_set_double(*out, "offset", out_offset);
  917|       |
  918|  31.1k|	g_object_unref(t);
  919|       |
  920|  31.1k|	return 0;
  921|  31.1k|}
vips_convi:
 1290|  31.1k|{
 1291|  31.1k|	va_list ap;
 1292|  31.1k|	int result;
 1293|       |
 1294|  31.1k|	va_start(ap, mask);
 1295|  31.1k|	result = vips_call_split("convi", ap, in, out, mask);
 1296|  31.1k|	va_end(ap);
 1297|       |
 1298|  31.1k|	return result;
 1299|  31.1k|}
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|  31.1k|{
 1122|  31.1k|	VipsConvolution *convolution = (VipsConvolution *) object;
 1123|  31.1k|	VipsConvi *convi = (VipsConvi *) object;
 1124|  31.1k|	VipsImage **t = (VipsImage **) vips_object_local_array(object, 4);
 1125|       |
 1126|  31.1k|	VipsImage *in;
 1127|  31.1k|	VipsImage *M;
 1128|  31.1k|	VipsGenerateFn generate;
 1129|  31.1k|	double *coeff;
 1130|  31.1k|	int i;
 1131|       |
 1132|  31.1k|	if (VIPS_OBJECT_CLASS(vips_convi_parent_class)->build(object))
  ------------------
  |  |  435|  31.1k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  31.1k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  31.1k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1132:6): [True: 0, False: 31.1k]
  ------------------
 1133|      0|		return -1;
 1134|       |
 1135|  31.1k|	in = convolution->in;
 1136|  31.1k|	M = convolution->M;
 1137|  31.1k|	convi->n_point = M->Xsize * M->Ysize;
 1138|       |
 1139|  31.1k|	if (vips_embed(in, &t[0],
  ------------------
  |  Branch (1139:6): [True: 0, False: 31.1k]
  ------------------
 1140|  31.1k|			M->Xsize / 2, M->Ysize / 2,
 1141|  31.1k|			in->Xsize + M->Xsize - 1, in->Ysize + M->Ysize - 1,
 1142|  31.1k|			"extend", VIPS_EXTEND_COPY,
 1143|  31.1k|			NULL))
 1144|      0|		return -1;
 1145|  31.1k|	in = t[0];
 1146|       |
 1147|       |	/* For uchar input, try to make a vector path.
 1148|       |	 */
 1149|  31.1k|#ifdef HAVE_HWY
 1150|  31.1k|	if (in->BandFmt == VIPS_FORMAT_UCHAR &&
  ------------------
  |  Branch (1150:6): [True: 0, False: 31.1k]
  ------------------
 1151|  31.1k|		vips_vector_isenabled() &&
  ------------------
  |  Branch (1151:3): [True: 0, False: 0]
  ------------------
 1152|  31.1k|		!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|  31.1k|	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|  31.1k|		generate = vips_convi_gen;
 1170|       |
 1171|       |	/* Make the data for the C path.
 1172|       |	 */
 1173|  31.1k|	if (generate == vips_convi_gen) {
  ------------------
  |  Branch (1173:6): [True: 31.1k, False: 0]
  ------------------
 1174|  31.1k|		g_info("convi: using C path");
  ------------------
  |  |  341|  31.1k|#define g_info(...)     g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|  31.1k|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  342|  31.1k|                               G_LOG_LEVEL_INFO,     \
  |  |  343|  31.1k|                               __VA_ARGS__)
  ------------------
 1175|       |
 1176|       |		/* Make an int version of our mask.
 1177|       |		 */
 1178|  31.1k|		if (vips__image_intize(M, &t[1]))
  ------------------
  |  Branch (1178:7): [True: 0, False: 31.1k]
  ------------------
 1179|      0|			return -1;
 1180|  31.1k|		M = t[1];
 1181|       |
 1182|  31.1k|		coeff = VIPS_MATRIX(M, 0, 0);
  ------------------
  |  |  432|  31.1k|	((double *) VIPS_IMAGE_ADDR(I, X, Y))
  |  |  ------------------
  |  |  |  |  418|  31.1k|	((I)->data + \
  |  |  |  |  419|  31.1k|		(Y) *VIPS_IMAGE_SIZEOF_LINE(I) + \
  |  |  |  |  ------------------
  |  |  |  |  |  |  386|  31.1k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  384|  31.1k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  382|  31.1k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  420|  31.1k|		(X) *VIPS_IMAGE_SIZEOF_PEL(I))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  31.1k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  31.1k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1183|  31.1k|		if (!(convi->coeff = VIPS_ARRAY(object, convi->n_point, int)) ||
  ------------------
  |  |   72|  31.1k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  31.1k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  31.1k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  31.1k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  31.1k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1183:7): [True: 0, False: 31.1k]
  ------------------
 1184|  31.1k|			!(convi->coeff_pos =
  ------------------
  |  Branch (1184:4): [True: 0, False: 31.1k]
  ------------------
 1185|  31.1k|					VIPS_ARRAY(object, convi->n_point, int)))
  ------------------
  |  |   72|  31.1k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  31.1k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  31.1k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  31.1k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  31.1k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1186|      0|			return -1;
 1187|       |
 1188|       |		/* Squeeze out zero mask elements.
 1189|       |		 */
 1190|  31.1k|		convi->nnz = 0;
 1191|   124k|		for (i = 0; i < convi->n_point; i++)
  ------------------
  |  Branch (1191:15): [True: 93.5k, False: 31.1k]
  ------------------
 1192|  93.5k|			if (coeff[i]) {
  ------------------
  |  Branch (1192:8): [True: 93.5k, False: 0]
  ------------------
 1193|  93.5k|				convi->coeff[convi->nnz] = coeff[i];
 1194|  93.5k|				convi->coeff_pos[convi->nnz] = i;
 1195|  93.5k|				convi->nnz += 1;
 1196|  93.5k|			}
 1197|       |
 1198|       |		/* Was the whole mask zero? We must have at least 1 element
 1199|       |		 * in there: set it to zero.
 1200|       |		 */
 1201|  31.1k|		if (convi->nnz == 0) {
  ------------------
  |  Branch (1201:7): [True: 0, False: 31.1k]
  ------------------
 1202|      0|			convi->coeff[0] = 0;
 1203|      0|			convi->coeff_pos[0] = 0;
 1204|      0|			convi->nnz = 1;
 1205|      0|		}
 1206|  31.1k|	}
 1207|       |
 1208|  31.1k|	g_object_set(convi, "out", vips_image_new(), NULL);
 1209|  31.1k|	if (vips_image_pipelinev(convolution->out,
  ------------------
  |  Branch (1209:6): [True: 0, False: 31.1k]
  ------------------
 1210|  31.1k|			VIPS_DEMAND_STYLE_SMALLTILE, in, NULL))
 1211|      0|		return -1;
 1212|       |
 1213|  31.1k|	convolution->out->Xoffset = 0;
 1214|  31.1k|	convolution->out->Yoffset = 0;
 1215|       |
 1216|       |	/* Prepare output. Consider a 7x7 mask and a 7x7 image --- the output
 1217|       |	 * would be 1x1.
 1218|       |	 */
 1219|  31.1k|	convolution->out->Xsize -= M->Xsize - 1;
 1220|  31.1k|	convolution->out->Ysize -= M->Ysize - 1;
 1221|       |
 1222|  31.1k|	if (vips_image_generate(convolution->out,
  ------------------
  |  Branch (1222:6): [True: 0, False: 31.1k]
  ------------------
 1223|  31.1k|			vips_convi_start, generate, vips_convi_stop, in, convi))
 1224|      0|		return -1;
 1225|       |
 1226|  31.1k|	convolution->out->Xoffset = -M->Xsize / 2;
 1227|  31.1k|	convolution->out->Yoffset = -M->Ysize / 2;
 1228|       |
 1229|  31.1k|	return 0;
 1230|  31.1k|}
convi.c:vips_convi_gen:
  753|  31.1k|{
  754|  31.1k|	VipsConviSequence *seq = (VipsConviSequence *) vseq;
  755|  31.1k|	VipsConvi *convi = (VipsConvi *) b;
  756|  31.1k|	VipsConvolution *convolution = (VipsConvolution *) convi;
  757|  31.1k|	VipsImage *M = convolution->M;
  758|  31.1k|	int scale = VIPS_RINT(vips_image_get_scale(M));
  ------------------
  |  |   74|  31.1k|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  759|  31.1k|	int rounding = scale / 2;
  760|  31.1k|	int offset = VIPS_RINT(vips_image_get_offset(M));
  ------------------
  |  |   74|  31.1k|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  761|  31.1k|	VipsImage *in = (VipsImage *) a;
  762|  31.1k|	VipsRegion *ir = seq->ir;
  763|  31.1k|	int *restrict t = convi->coeff;
  764|  31.1k|	const int nnz = convi->nnz;
  765|  31.1k|	VipsRect *r = &out_region->valid;
  766|  31.1k|	int le = r->left;
  767|  31.1k|	int to = r->top;
  768|  31.1k|	int bo = VIPS_RECT_BOTTOM(r);
  ------------------
  |  |   49|  31.1k|#define VIPS_RECT_BOTTOM(R) ((R)->top + (R)->height)
  ------------------
  769|  31.1k|	int sz = VIPS_REGION_N_ELEMENTS(out_region) *
  ------------------
  |  |  197|  31.1k|	((size_t) ((R)->valid.width * (R)->im->Bands))
  ------------------
  770|  31.1k|		(vips_band_format_iscomplex(in->BandFmt) ? 2 : 1);
  ------------------
  |  Branch (770:4): [True: 0, False: 31.1k]
  ------------------
  771|       |
  772|  31.1k|	VipsRect s;
  773|  31.1k|	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|  31.1k|	s = *r;
  779|  31.1k|	s.width += M->Xsize - 1;
  780|  31.1k|	s.height += M->Ysize - 1;
  781|  31.1k|	if (vips_region_prepare(ir, &s))
  ------------------
  |  Branch (781:6): [True: 12.9k, False: 18.1k]
  ------------------
  782|  12.9k|		return -1;
  783|       |
  784|       |	/* Fill offset array. Only do this if the bpl has changed since the
  785|       |	 * previous vips_region_prepare().
  786|       |	 */
  787|  18.1k|	if (seq->last_bpl != VIPS_REGION_LSKIP(ir)) {
  ------------------
  |  |  195|  18.1k|	((size_t) ((R)->bpl))
  ------------------
  |  Branch (787:6): [True: 18.1k, False: 0]
  ------------------
  788|  18.1k|		seq->last_bpl = VIPS_REGION_LSKIP(ir);
  ------------------
  |  |  195|  18.1k|	((size_t) ((R)->bpl))
  ------------------
  789|       |
  790|  72.6k|		for (i = 0; i < nnz; i++) {
  ------------------
  |  Branch (790:15): [True: 54.4k, False: 18.1k]
  ------------------
  791|  54.4k|			z = convi->coeff_pos[i];
  792|  54.4k|			x = z % M->Xsize;
  793|  54.4k|			y = z / M->Xsize;
  794|       |
  795|  54.4k|			seq->offsets[i] =
  796|  54.4k|				(VIPS_REGION_ADDR(ir, x + le, y + to) -
  ------------------
  |  |  227|  54.4k|	((R)->data + \
  |  |  228|  54.4k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  54.4k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  54.4k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  54.4k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  54.4k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  54.4k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  797|  54.4k|					VIPS_REGION_ADDR(ir, le, to)) /
  ------------------
  |  |  227|  54.4k|	((R)->data + \
  |  |  228|  54.4k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|  54.4k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|  54.4k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|  54.4k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  54.4k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  54.4k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  798|  54.4k|				VIPS_IMAGE_SIZEOF_ELEMENT(ir->im);
  ------------------
  |  |  382|  54.4k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  ------------------
  799|  54.4k|		}
  800|  18.1k|	}
  801|       |
  802|  18.1k|	VIPS_GATE_START("vips_convi_gen: work");
  ------------------
  |  |   41|  18.1k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  18.1k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  18.1k|	{ \
  |  |   43|  18.1k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 18.1k]
  |  |  ------------------
  |  |   44|  18.1k|			vips__thread_gate_start(NAME); \
  |  |   45|  18.1k|	} \
  |  |   46|  18.1k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  18.1k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  803|       |
  804|   974k|	for (y = to; y < bo; y++) {
  ------------------
  |  Branch (804:15): [True: 956k, False: 18.1k]
  ------------------
  805|   956k|		switch (in->BandFmt) {
  806|      0|		case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (806:3): [True: 0, False: 956k]
  ------------------
  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: 956k]
  ------------------
  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: 956k]
  ------------------
  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|   956k|		case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (818:3): [True: 956k, False: 0]
  ------------------
  819|   956k|			CONV_INT(signed short, CLIP_SHORT);
  ------------------
  |  |  697|   956k|	{ \
  |  |  698|   956k|		TYPE *restrict p = (TYPE *) VIPS_REGION_ADDR(ir, le, y); \
  |  |  ------------------
  |  |  |  |  227|   956k|	((R)->data + \
  |  |  |  |  228|   956k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  |  |  ------------------
  |  |  |  |  |  |  195|   956k|	((size_t) ((R)->bpl))
  |  |  |  |  ------------------
  |  |  |  |  229|   956k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  |  |  ------------------
  |  |  |  |  |  |  201|   956k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  384|   956k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  382|   956k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  699|   956k|		TYPE *restrict q = (TYPE *) VIPS_REGION_ADDR(out_region, le, y); \
  |  |  ------------------
  |  |  |  |  227|   956k|	((R)->data + \
  |  |  |  |  228|   956k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  |  |  ------------------
  |  |  |  |  |  |  195|   956k|	((size_t) ((R)->bpl))
  |  |  |  |  ------------------
  |  |  |  |  229|   956k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  |  |  ------------------
  |  |  |  |  |  |  201|   956k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  384|   956k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  382|   956k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  700|   956k|		int *restrict offsets = seq->offsets; \
  |  |  701|   956k|\
  |  |  702|  63.1M|		for (x = 0; x < sz; x++) { \
  |  |  ------------------
  |  |  |  Branch (702:15): [True: 62.2M, False: 956k]
  |  |  ------------------
  |  |  703|  62.2M|			int sum; \
  |  |  704|  62.2M|			int i; \
  |  |  705|  62.2M|\
  |  |  706|  62.2M|			sum = 0; \
  |  |  707|   248M|			for (i = 0; i < nnz; i++) \
  |  |  ------------------
  |  |  |  Branch (707:16): [True: 186M, False: 62.2M]
  |  |  ------------------
  |  |  708|   186M|				sum += t[i] * p[offsets[i]]; \
  |  |  709|  62.2M|\
  |  |  710|  62.2M|			sum = CLIP(((sum + rounding) / scale) + offset); \
  |  |  ------------------
  |  |  |  |  819|  62.2M|			CONV_INT(signed short, CLIP_SHORT);
  |  |  |  |  ------------------
  |  |  |  |  |  |  745|  62.2M|#define CLIP_SHORT(X) VIPS_CLIP(SHRT_MIN, (X), SHRT_MAX)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|  62.2M|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   54|   124M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  Branch (54:25): [True: 0, False: 62.2M]
  |  |  |  |  |  |  |  |  |  |  |  Branch (54:32): [True: 0, False: 62.2M]
  |  |  |  |  |  |  |  |  |  |  |  Branch (54:44): [True: 0, False: 62.2M]
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  711|  62.2M|\
  |  |  712|  62.2M|			q[x] = sum; \
  |  |  713|  62.2M|			p += 1; \
  |  |  714|  62.2M|		} \
  |  |  715|   956k|	}
  ------------------
  820|   956k|			break;
  821|       |
  822|      0|		case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (822:3): [True: 0, False: 956k]
  ------------------
  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: 956k]
  ------------------
  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|      0|		case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (830:3): [True: 0, False: 956k]
  ------------------
  831|      0|		case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (831:3): [True: 0, False: 956k]
  ------------------
  832|      0|			CONV_FLOAT(float);
  ------------------
  |  |  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|	}
  ------------------
  833|      0|			break;
  834|       |
  835|      0|		case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (835:3): [True: 0, False: 956k]
  ------------------
  836|      0|		case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (836:3): [True: 0, False: 956k]
  ------------------
  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: 956k]
  ------------------
  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|   956k|		}
  843|   956k|	}
  844|       |
  845|  18.1k|	VIPS_GATE_STOP("vips_convi_gen: work");
  ------------------
  |  |   49|  18.1k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  18.1k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  18.1k|	{ \
  |  |   51|  18.1k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 18.1k]
  |  |  ------------------
  |  |   52|  18.1k|			vips__thread_gate_stop(NAME); \
  |  |   53|  18.1k|	} \
  |  |   54|  18.1k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  18.1k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  846|       |
  847|  18.1k|	VIPS_COUNT_PIXELS(out_region, "vips_convi_gen");
  ------------------
  |  |  189|  18.1k|#define VIPS_COUNT_PIXELS(R, N) vips__region_count_pixels(R, N)
  ------------------
  848|       |
  849|  18.1k|	return 0;
  850|  18.1k|}
convi.c:vips_convi_start:
  259|  31.1k|{
  260|  31.1k|	VipsImage *in = (VipsImage *) a;
  261|  31.1k|	VipsConvi *convi = (VipsConvi *) b;
  262|  31.1k|	VipsConviSequence *seq;
  263|       |
  264|  31.1k|	if (!(seq = VIPS_NEW(out, VipsConviSequence)))
  ------------------
  |  |   70|  31.1k|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  31.1k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  31.1k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  31.1k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  31.1k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (264:6): [True: 0, False: 31.1k]
  ------------------
  265|      0|		return NULL;
  266|       |
  267|  31.1k|	seq->convi = convi;
  268|  31.1k|	seq->ir = NULL;
  269|  31.1k|	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|  31.1k|	seq->ir = vips_region_new(in);
  277|       |
  278|  31.1k|	if (convi->nnz) {
  ------------------
  |  Branch (278:6): [True: 31.1k, False: 0]
  ------------------
  279|  31.1k|		if (!(seq->offsets = VIPS_ARRAY(NULL, convi->nnz, int))) {
  ------------------
  |  |   72|  31.1k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  31.1k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  31.1k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  31.1k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  31.1k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (279:7): [True: 0, False: 31.1k]
  ------------------
  280|      0|			vips_convi_stop(seq, in, convi);
  281|      0|			return NULL;
  282|      0|		}
  283|  31.1k|	}
  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|  31.1k|	return (void *) seq;
  301|  31.1k|}
convi.c:vips_convi_stop:
  242|  31.1k|{
  243|  31.1k|	VipsConviSequence *seq = (VipsConviSequence *) vseq;
  244|       |
  245|  31.1k|	VIPS_UNREF(seq->ir);
  ------------------
  |  |   57|  31.1k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  31.1k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  31.1k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  31.1k|	{ \
  |  |  |  |   43|  31.1k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 31.1k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  31.1k|			(void) F((S)); \
  |  |  |  |   45|  31.1k|			(S) = 0; \
  |  |  |  |   46|  31.1k|		} \
  |  |  |  |   47|  31.1k|	} \
  |  |  |  |   48|  31.1k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  31.1k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  246|  31.1k|	VIPS_FREE(seq->offsets);
  ------------------
  |  |   50|  31.1k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  31.1k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  31.1k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  31.1k|	{ \
  |  |  |  |   43|  31.1k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 31.1k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  31.1k|			(void) F((S)); \
  |  |  |  |   45|  31.1k|			(S) = 0; \
  |  |  |  |   46|  31.1k|		} \
  |  |  |  |   47|  31.1k|	} \
  |  |  |  |   48|  31.1k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  31.1k|#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|  31.1k|	return 0;
  253|  31.1k|}
convi.c:vips_convi_init:
 1251|  31.1k|{
 1252|  31.1k|	convi->nnz = 0;
 1253|  31.1k|	convi->coeff = NULL;
 1254|  31.1k|	convi->coeff_pos = NULL;
 1255|  31.1k|#if defined(HAVE_HWY) || defined(HAVE_ORC)
 1256|  31.1k|	convi->mant = NULL;
 1257|  31.1k|#endif /*HAVE_HWY || HAVE_ORC*/
 1258|  31.1k|}

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

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

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

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

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

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

vips_sharpen:
  467|  15.5k|{
  468|  15.5k|	va_list ap;
  469|  15.5k|	int result;
  470|       |
  471|  15.5k|	va_start(ap, out);
  472|  15.5k|	result = vips_call_split("sharpen", ap, in, out);
  473|  15.5k|	va_end(ap);
  474|       |
  475|  15.5k|	return result;
  476|  15.5k|}
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|}
sharpen.c:vips_sharpen_build:
  172|  15.5k|{
  173|  15.5k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  15.5k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  15.5k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  15.5k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  174|  15.5k|	VipsSharpen *sharpen = (VipsSharpen *) object;
  175|  15.5k|	VipsImage **t = (VipsImage **) vips_object_local_array(object, 8);
  176|  15.5k|	VipsImage **args = (VipsImage **) vips_object_local_array(object, 2);
  177|       |
  178|  15.5k|	VipsImage *in;
  179|  15.5k|	VipsInterpretation old_interpretation;
  180|  15.5k|	int i;
  181|       |
  182|  15.5k|	VIPS_GATE_START("vips_sharpen_build: build");
  ------------------
  |  |   41|  15.5k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  15.5k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  15.5k|	{ \
  |  |   43|  15.5k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 15.5k]
  |  |  ------------------
  |  |   44|  15.5k|			vips__thread_gate_start(NAME); \
  |  |   45|  15.5k|	} \
  |  |   46|  15.5k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  15.5k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  183|       |
  184|  15.5k|	if (VIPS_OBJECT_CLASS(vips_sharpen_parent_class)->build(object))
  ------------------
  |  |  435|  15.5k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  15.5k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  15.5k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (184:6): [True: 0, False: 15.5k]
  ------------------
  185|      0|		return -1;
  186|       |
  187|       |	/* We used to have a radius control. If that's set but sigma isn't,
  188|       |	 * use it to set a reasonable value for sigma.
  189|       |	 */
  190|  15.5k|	if (!vips_object_argument_isset(object, "sigma") &&
  ------------------
  |  Branch (190:6): [True: 15.5k, False: 0]
  ------------------
  191|  15.5k|		vips_object_argument_isset(object, "radius"))
  ------------------
  |  Branch (191:3): [True: 0, False: 15.5k]
  ------------------
  192|      0|		sharpen->sigma = 1 + sharpen->radius / 2; // FIXME: Invalidates operation cache
  193|       |
  194|  15.5k|	in = sharpen->in;
  195|       |
  196|  15.5k|	old_interpretation = in->Type;
  197|  15.5k|	if (vips_colourspace(in, &t[0], VIPS_INTERPRETATION_LABS, NULL))
  ------------------
  |  Branch (197:6): [True: 2, False: 15.5k]
  ------------------
  198|      2|		return -1;
  199|  15.5k|	in = t[0];
  200|       |
  201|  15.5k|	if (vips_check_uncoded(class->nickname, in) ||
  ------------------
  |  Branch (201:6): [True: 0, False: 15.5k]
  ------------------
  202|  15.5k|		vips_check_bands_atleast(class->nickname, in, 3))
  ------------------
  |  Branch (202:3): [True: 0, False: 15.5k]
  ------------------
  203|      0|		return -1;
  204|       |
  205|       |	/* Stop at 10% of max ... a bit mean. We always sharpen a short,
  206|       |	 * so there's no point using a float mask.
  207|       |	 */
  208|  15.5k|	if (vips_gaussmat(&t[1], sharpen->sigma, 0.1,
  ------------------
  |  Branch (208:6): [True: 0, False: 15.5k]
  ------------------
  209|  15.5k|			"separable", TRUE,
  ------------------
  |  |  798|  15.5k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  15.5k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  210|  15.5k|			"precision", VIPS_PRECISION_INTEGER,
  211|  15.5k|			NULL))
  212|      0|		return -1;
  213|       |
  214|       |#ifdef DEBUG
  215|       |	printf("sharpen: blurring with:\n");
  216|       |	vips_matrixprint(t[1], NULL);
  217|       |#endif /*DEBUG*/
  218|       |
  219|       |	/* Make sure we're short (need this for the LUT) and not eg. float LABS.
  220|       |	 */
  221|  15.5k|	if (vips_cast_short(in, &t[2], NULL))
  ------------------
  |  Branch (221:6): [True: 0, False: 15.5k]
  ------------------
  222|      0|		return -1;
  223|  15.5k|	in = t[2];
  224|       |
  225|       |	/* Index with the signed difference between two 0 - 32767 images.
  226|       |	 */
  227|  15.5k|	if (!(sharpen->lut = VIPS_ARRAY(object, 65536, int)))
  ------------------
  |  |   72|  15.5k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  15.5k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  15.5k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  15.5k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  15.5k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (227:6): [True: 0, False: 15.5k]
  ------------------
  228|      0|		return -1;
  229|       |
  230|  1.02G|	for (i = 0; i < 65536; i++) {
  ------------------
  |  Branch (230:14): [True: 1.02G, False: 15.5k]
  ------------------
  231|       |		/* Rescale to +/- 100.
  232|       |		 */
  233|  1.02G|		double v = (i - 32767) / 327.67;
  234|  1.02G|		double y;
  235|       |
  236|  1.02G|		if (v < -sharpen->x1)
  ------------------
  |  Branch (236:7): [True: 500M, False: 521M]
  ------------------
  237|       |			/* Left of -x1.
  238|       |			 */
  239|   500M|			y = (v + sharpen->x1) * sharpen->m2 +
  240|   500M|				-sharpen->x1 * sharpen->m1;
  241|   521M|		else if (v < sharpen->x1)
  ------------------
  |  Branch (241:12): [True: 20.4M, False: 500M]
  ------------------
  242|       |			/* Centre section.
  243|       |			 */
  244|  20.4M|			y = v * sharpen->m1;
  245|   500M|		else
  246|       |			/* Right of x1.
  247|       |			 */
  248|   500M|			y = (v - sharpen->x1) * sharpen->m2 +
  249|   500M|				sharpen->x1 * sharpen->m1;
  250|       |
  251|  1.02G|		if (y < -sharpen->y3)
  ------------------
  |  Branch (251:7): [True: 466M, False: 555M]
  ------------------
  252|   466M|			y = -sharpen->y3;
  253|  1.02G|		if (y > sharpen->y2)
  ------------------
  |  Branch (253:7): [True: 483M, False: 538M]
  ------------------
  254|   483M|			y = sharpen->y2;
  255|       |
  256|  1.02G|		sharpen->lut[i] = VIPS_RINT(y * 327.67);
  ------------------
  |  |   74|  1.02G|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  257|  1.02G|	}
  258|       |
  259|       |#ifdef DEBUG
  260|       |	{
  261|       |		VipsImage *mat;
  262|       |
  263|       |		mat = vips_image_new_matrix(65536, 1);
  264|       |		for (i = 0; i < 65536; i++)
  265|       |			*VIPS_MATRIX(mat, i, 0) = sharpen->lut[i];
  266|       |		vips_image_write_to_file(mat, "x.v", NULL);
  267|       |		printf("lut written to x.v\n");
  268|       |		g_object_unref(mat);
  269|       |	}
  270|       |#endif /*DEBUG*/
  271|       |
  272|       |	/* Extract L and the rest, convolve L.
  273|       |	 */
  274|  15.5k|	if (vips_extract_band(in, &args[0], 0, NULL) ||
  ------------------
  |  Branch (274:6): [True: 0, False: 15.5k]
  ------------------
  275|  15.5k|		vips_extract_band(in, &t[3], 1, "n", in->Bands - 1, NULL) ||
  ------------------
  |  Branch (275:3): [True: 0, False: 15.5k]
  ------------------
  276|  15.5k|		vips_convsep(args[0], &args[1], t[1],
  ------------------
  |  Branch (276:3): [True: 0, False: 15.5k]
  ------------------
  277|  15.5k|			"precision", VIPS_PRECISION_INTEGER,
  278|  15.5k|			NULL))
  279|      0|		return -1;
  280|       |
  281|  15.5k|	t[5] = vips_image_new();
  282|  15.5k|	if (vips_image_pipeline_array(t[5],
  ------------------
  |  Branch (282:6): [True: 0, False: 15.5k]
  ------------------
  283|  15.5k|			VIPS_DEMAND_STYLE_FATSTRIP, args))
  284|      0|		return -1;
  285|       |
  286|  15.5k|	if (vips_image_generate(t[5],
  ------------------
  |  Branch (286:6): [True: 0, False: 15.5k]
  ------------------
  287|  15.5k|			vips_start_many, vips_sharpen_generate, vips_stop_many,
  288|  15.5k|			args, sharpen))
  289|      0|		return -1;
  290|       |
  291|  15.5k|	g_object_set(object, "out", vips_image_new(), NULL);
  292|       |
  293|       |	/* Reattach the rest.
  294|       |	 */
  295|  15.5k|	if (vips_bandjoin2(t[5], t[3], &t[6], NULL) ||
  ------------------
  |  Branch (295:6): [True: 0, False: 15.5k]
  ------------------
  296|  15.5k|		vips_colourspace(t[6], &t[7], old_interpretation, NULL) ||
  ------------------
  |  Branch (296:3): [True: 24, False: 15.5k]
  ------------------
  297|  15.5k|		vips_image_write(t[7], sharpen->out))
  ------------------
  |  Branch (297:3): [True: 0, False: 15.5k]
  ------------------
  298|     24|		return -1;
  299|       |
  300|  15.5k|	VIPS_GATE_STOP("vips_sharpen_build: build");
  ------------------
  |  |   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]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  301|       |
  302|  15.5k|	return 0;
  303|  15.5k|}
sharpen.c:vips_sharpen_generate:
  118|  15.5k|{
  119|  15.5k|	VipsRegion **in = (VipsRegion **) vseq;
  120|  15.5k|	VipsSharpen *sharpen = (VipsSharpen *) b;
  121|  15.5k|	VipsRect *r = &out_region->valid;
  122|  15.5k|	int *lut = sharpen->lut;
  123|       |
  124|  15.5k|	int x, y;
  125|       |
  126|  15.5k|	if (vips_reorder_prepare_many(out_region->im, in, r))
  ------------------
  |  Branch (126:6): [True: 6.48k, False: 9.08k]
  ------------------
  127|  6.48k|		return -1;
  128|       |
  129|  15.5k|	VIPS_GATE_START("vips_sharpen_generate: work");
  ------------------
  |  |   41|  9.08k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  9.08k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  9.08k|	{ \
  |  |   43|  9.08k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 9.08k]
  |  |  ------------------
  |  |   44|  9.08k|			vips__thread_gate_start(NAME); \
  |  |   45|  9.08k|	} \
  |  |   46|  15.5k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  15.5k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  130|       |
  131|   487k|	for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (131:14): [True: 478k, False: 9.08k]
  ------------------
  132|   478k|		short *p1 = (short *restrict)
  133|   478k|			VIPS_REGION_ADDR(in[0], r->left, r->top + y);
  ------------------
  |  |  227|   478k|	((R)->data + \
  |  |  228|   478k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   478k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   478k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   478k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   478k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   478k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  134|   478k|		short *p2 = (short *restrict)
  135|   478k|			VIPS_REGION_ADDR(in[1], r->left, r->top + y);
  ------------------
  |  |  227|   478k|	((R)->data + \
  |  |  228|   478k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   478k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   478k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   478k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   478k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   478k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  136|   478k|		short *q = (short *restrict)
  137|   478k|			VIPS_REGION_ADDR(out_region, r->left, r->top + y);
  ------------------
  |  |  227|   478k|	((R)->data + \
  |  |  228|   478k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   478k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   478k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   478k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   478k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   478k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  138|       |
  139|  31.5M|		for (x = 0; x < r->width; x++) {
  ------------------
  |  Branch (139:15): [True: 31.1M, False: 478k]
  ------------------
  140|  31.1M|			int v1 = p1[x];
  141|  31.1M|			int v2 = p2[x];
  142|       |
  143|       |			/* Our LUT is -32768 - 32767. For the v1, v2
  144|       |			 * difference to be in this range, both must be 0 -
  145|       |			 * 32767.
  146|       |			 */
  147|  31.1M|			int diff = ((v1 & 0x7fff) - (v2 & 0x7fff));
  148|       |
  149|  31.1M|			int out;
  150|       |
  151|  31.1M|			g_assert(diff + 32768 >= 0);
  ------------------
  |  |  166|  31.1M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  31.1M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  31.1M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  152|  31.1M|			g_assert(diff + 32768 < 65536);
  ------------------
  |  |  166|  31.1M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  31.1M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  31.1M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  153|       |
  154|  31.1M|			out = v1 + lut[diff + 32768];
  155|       |
  156|  31.1M|			if (out < 0)
  ------------------
  |  Branch (156:8): [True: 1.26M, False: 29.8M]
  ------------------
  157|  1.26M|				out = 0;
  158|  31.1M|			if (out > 32767)
  ------------------
  |  Branch (158:8): [True: 1.10M, False: 30.0M]
  ------------------
  159|  1.10M|				out = 32767;
  160|       |
  161|  31.1M|			q[x] = out;
  162|  31.1M|		}
  163|   478k|	}
  164|       |
  165|  9.08k|	VIPS_GATE_STOP("vips_sharpen_generate: work");
  ------------------
  |  |   49|  9.08k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  9.08k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  9.08k|	{ \
  |  |   51|  9.08k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 9.08k]
  |  |  ------------------
  |  |   52|  9.08k|			vips__thread_gate_stop(NAME); \
  |  |   53|  9.08k|	} \
  |  |   54|  9.08k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  9.08k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  166|       |
  167|  9.08k|	return 0;
  168|  15.5k|}
sharpen.c:vips_sharpen_init:
  387|  15.5k|{
  388|  15.5k|	sharpen->sigma = 0.5;
  389|  15.5k|	sharpen->x1 = 2.0;
  390|  15.5k|	sharpen->y2 = 10.0;
  391|  15.5k|	sharpen->y3 = 20.0;
  392|  15.5k|	sharpen->m1 = 0.0;
  393|  15.5k|	sharpen->m2 = 3.0;
  394|  15.5k|}

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

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

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|  15.5k|{
  267|  15.5k|	va_list ap;
  268|  15.5k|	int result;
  269|       |
  270|  15.5k|	va_start(ap, min_ampl);
  271|  15.5k|	result = vips_call_split("gaussmat", ap, out, sigma, min_ampl);
  272|  15.5k|	va_end(ap);
  273|       |
  274|  15.5k|	return result;
  275|  15.5k|}
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|     40|{
   97|     40|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|     40|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|     40|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|     40|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   98|     40|	VipsCreate *create = VIPS_CREATE(object);
  ------------------
  |  |   40|     40|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|     40|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|     40|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|     40|		VIPS_TYPE_CREATE, VipsCreate))
  ------------------
   99|     40|	VipsGaussmat *gaussmat = (VipsGaussmat *) object;
  100|     40|	double sig2 = 2. * gaussmat->sigma * gaussmat->sigma;
  101|     40|	int max_x = VIPS_CLIP(0, 8 * gaussmat->sigma, MASK_SANITY);
  ------------------
  |  |   57|     40|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|     80|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 0, False: 40]
  |  |  |  |  |  Branch (54:32): [True: 0, False: 40]
  |  |  |  |  |  Branch (54:44): [True: 0, False: 40]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  102|       |
  103|     40|	int x, y;
  104|     40|	int width, height;
  105|     40|	double sum;
  106|       |
  107|     40|	if (VIPS_OBJECT_CLASS(vips_gaussmat_parent_class)->build(object))
  ------------------
  |  |  435|     40|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|     40|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|     40|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (107:6): [True: 0, False: 40]
  ------------------
  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|     40|	if (vips_object_argument_isset(object, "integer") &&
  ------------------
  |  Branch (114:6): [True: 0, False: 40]
  ------------------
  115|     40|		!vips_object_argument_isset(object, "precision") &&
  ------------------
  |  Branch (115:3): [True: 0, False: 0]
  ------------------
  116|     40|		!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|    120|	for (x = 0; x < max_x; x++) {
  ------------------
  |  Branch (122:14): [True: 120, False: 0]
  ------------------
  123|    120|		double v = exp(-((double) (x * x)) / sig2);
  124|       |
  125|    120|		if (v < gaussmat->min_ampl)
  ------------------
  |  Branch (125:7): [True: 40, False: 80]
  ------------------
  126|     40|			break;
  127|    120|	}
  128|     40|	if (x >= MASK_SANITY) {
  ------------------
  |  |   92|     40|#define MASK_SANITY (5000)
  ------------------
  |  Branch (128:6): [True: 0, False: 40]
  ------------------
  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|     40|	width = 2 * VIPS_MAX(x - 1, 0) + 1;
  ------------------
  |  |   54|     40|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 40, False: 0]
  |  |  ------------------
  ------------------
  133|     40|	height = gaussmat->separable ? 1 : width;
  ------------------
  |  Branch (133:11): [True: 40, False: 0]
  ------------------
  134|       |
  135|     40|	vips_image_init_fields(create->out,
  136|     40|		width, height, 1,
  137|     40|		VIPS_FORMAT_DOUBLE, VIPS_CODING_NONE,
  138|     40|		VIPS_INTERPRETATION_MULTIBAND,
  139|     40|		1.0, 1.0);
  140|     40|	if (vips_image_pipelinev(create->out, VIPS_DEMAND_STYLE_ANY, NULL) ||
  ------------------
  |  Branch (140:6): [True: 0, False: 40]
  ------------------
  141|     40|		vips_image_write_prepare(create->out))
  ------------------
  |  Branch (141:3): [True: 0, False: 40]
  ------------------
  142|      0|		return -1;
  143|       |
  144|     40|	sum = 0.0;
  145|     80|	for (y = 0; y < height; y++) {
  ------------------
  |  Branch (145:14): [True: 40, False: 40]
  ------------------
  146|    160|		for (x = 0; x < width; x++) {
  ------------------
  |  Branch (146:15): [True: 120, False: 40]
  ------------------
  147|    120|			int xo = x - width / 2;
  148|    120|			int yo = y - height / 2;
  149|    120|			double distance = xo * xo + yo * yo;
  150|    120|			double v = exp(-distance / sig2);
  151|       |
  152|    120|			if (gaussmat->precision != VIPS_PRECISION_FLOAT)
  ------------------
  |  Branch (152:8): [True: 120, False: 0]
  ------------------
  153|    120|				v = VIPS_RINT(20 * v);
  ------------------
  |  |   74|    120|#define VIPS_RINT(V) __builtin_rint(V)
  ------------------
  154|       |
  155|    120|			*VIPS_MATRIX(create->out, x, y) = v;
  ------------------
  |  |  432|    120|	((double *) VIPS_IMAGE_ADDR(I, X, Y))
  |  |  ------------------
  |  |  |  |  418|    120|	((I)->data + \
  |  |  |  |  419|    120|		(Y) *VIPS_IMAGE_SIZEOF_LINE(I) + \
  |  |  |  |  ------------------
  |  |  |  |  |  |  386|    120|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  384|    120|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  382|    120|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  420|    120|		(X) *VIPS_IMAGE_SIZEOF_PEL(I))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|    120|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|    120|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  156|    120|			sum += v;
  157|    120|		}
  158|     40|	}
  159|       |
  160|       |	/* Make sure we can't make sum == 0: it'd certainly cause /0 later.
  161|       |	 */
  162|     40|	if (sum == 0)
  ------------------
  |  Branch (162:6): [True: 0, False: 40]
  ------------------
  163|      0|		sum = 1;
  164|       |
  165|     40|	vips_image_set_double(create->out, "scale", sum);
  166|     40|	vips_image_set_double(create->out, "offset", 0.0);
  167|       |
  168|     40|	return 0;
  169|     40|}
gaussmat.c:vips_gaussmat_init:
  222|  15.5k|{
  223|  15.5k|	gaussmat->sigma = 1;
  224|  15.5k|	gaussmat->min_ampl = 0.1;
  225|  15.5k|	gaussmat->precision = VIPS_PRECISION_INTEGER;
  226|  15.5k|}

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

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

vips_foreign_map:
  468|  31.1k|{
  469|  31.1k|	GSList *files;
  470|  31.1k|	void *result;
  471|       |
  472|  31.1k|	files = NULL;
  473|  31.1k|	(void) vips_class_map_all(g_type_from_name(base),
  474|  31.1k|		(VipsClassMapFn) file_add_class, (void *) &files);
  475|       |
  476|  31.1k|	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|  31.1k|	result = vips_slist_map2(files, fn, a, b);
  490|       |
  491|  31.1k|	g_slist_free(files);
  492|       |
  493|  31.1k|	return result;
  494|  31.1k|}
vips_foreign_find_load_buffer:
  700|  31.1k|{
  701|  31.1k|	VipsForeignLoadClass *load_class;
  702|       |
  703|  31.1k|	if (!(load_class = (VipsForeignLoadClass *) vips_foreign_map(
  ------------------
  |  Branch (703:6): [True: 5.95k, False: 25.1k]
  ------------------
  704|  31.1k|			  "VipsForeignLoad",
  705|  31.1k|			  (VipsSListMap2Fn) vips_foreign_find_load_buffer_sub,
  706|  31.1k|			  &data, &size))) {
  707|  5.95k|		vips_error("VipsForeignLoad",
  708|  5.95k|			"%s", _("buffer is not in a known format"));
  ------------------
  |  |   30|  5.95k|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|  5.95k|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  709|  5.95k|		return NULL;
  710|  5.95k|	}
  711|       |
  712|  25.1k|	return G_OBJECT_CLASS_NAME(load_class);
  ------------------
  |  |  124|  25.1k|#define G_OBJECT_CLASS_NAME(class)  (g_type_name (G_OBJECT_CLASS_TYPE (class)))
  |  |  ------------------
  |  |  |  |  114|  25.1k|#define G_OBJECT_CLASS_TYPE(class)  (G_TYPE_FROM_CLASS (class))
  |  |  |  |  ------------------
  |  |  |  |  |  |  613|  25.1k|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  713|  31.1k|}
vips_foreign_load_invalidate:
 1306|  1.73k|{
 1307|  1.73k|	VipsOperation *operation;
 1308|       |
 1309|       |#ifdef DEBUG
 1310|       |	printf("vips_foreign_load_invalidate: %p\n", image);
 1311|       |#endif /*DEBUG*/
 1312|       |
 1313|  1.73k|	if ((operation = g_object_get_qdata(G_OBJECT(image),
  ------------------
  |  |   51|  1.73k|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|  1.73k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.73k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1313:6): [True: 1.73k, False: 0]
  ------------------
 1314|  1.73k|			 vips__foreign_load_operation))) {
 1315|  1.73k|		vips_operation_invalidate(operation);
 1316|  1.73k|	}
 1317|  1.73k|}
vips_foreign_operation_init:
 2939|      2|{
 2940|      2|	extern GType vips_foreign_load_rad_file_get_type(void);
 2941|      2|	extern GType vips_foreign_load_rad_buffer_get_type(void);
 2942|      2|	extern GType vips_foreign_load_rad_source_get_type(void);
 2943|      2|	extern GType vips_foreign_save_rad_file_get_type(void);
 2944|      2|	extern GType vips_foreign_save_rad_buffer_get_type(void);
 2945|      2|	extern GType vips_foreign_save_rad_target_get_type(void);
 2946|       |
 2947|      2|	extern GType vips_foreign_load_mat_get_type(void);
 2948|       |
 2949|      2|	extern GType vips_foreign_load_ppm_file_get_type(void);
 2950|      2|	extern GType vips_foreign_load_ppm_source_get_type(void);
 2951|      2|	extern GType vips_foreign_save_ppm_file_get_type(void);
 2952|      2|	extern GType vips_foreign_save_pbm_target_get_type(void);
 2953|      2|	extern GType vips_foreign_save_pgm_target_get_type(void);
 2954|      2|	extern GType vips_foreign_save_ppm_target_get_type(void);
 2955|      2|	extern GType vips_foreign_save_pfm_target_get_type(void);
 2956|      2|	extern GType vips_foreign_save_pnm_target_get_type(void);
 2957|       |
 2958|      2|	extern GType vips_foreign_load_png_file_get_type(void);
 2959|      2|	extern GType vips_foreign_load_png_buffer_get_type(void);
 2960|      2|	extern GType vips_foreign_load_png_source_get_type(void);
 2961|      2|	extern GType vips_foreign_save_png_file_get_type(void);
 2962|      2|	extern GType vips_foreign_save_png_buffer_get_type(void);
 2963|      2|	extern GType vips_foreign_save_png_target_get_type(void);
 2964|       |
 2965|      2|	extern GType vips_foreign_save_spng_file_get_type(void);
 2966|      2|	extern GType vips_foreign_save_spng_buffer_get_type(void);
 2967|      2|	extern GType vips_foreign_save_spng_target_get_type(void);
 2968|       |
 2969|      2|	extern GType vips_foreign_load_csv_file_get_type(void);
 2970|      2|	extern GType vips_foreign_load_csv_source_get_type(void);
 2971|      2|	extern GType vips_foreign_save_csv_file_get_type(void);
 2972|      2|	extern GType vips_foreign_save_csv_target_get_type(void);
 2973|       |
 2974|      2|	extern GType vips_foreign_load_matrix_file_get_type(void);
 2975|      2|	extern GType vips_foreign_load_matrix_source_get_type(void);
 2976|      2|	extern GType vips_foreign_save_matrix_file_get_type(void);
 2977|      2|	extern GType vips_foreign_save_matrix_target_get_type(void);
 2978|      2|	extern GType vips_foreign_print_matrix_get_type(void);
 2979|       |
 2980|      2|	extern GType vips_foreign_load_fits_file_get_type(void);
 2981|      2|	extern GType vips_foreign_load_fits_source_get_type(void);
 2982|      2|	extern GType vips_foreign_save_fits_get_type(void);
 2983|       |
 2984|      2|	extern GType vips_foreign_load_analyze_get_type(void);
 2985|       |
 2986|      2|	extern GType vips_foreign_load_openexr_get_type(void);
 2987|       |
 2988|      2|	extern GType vips_foreign_load_openslide_file_get_type(void);
 2989|      2|	extern GType vips_foreign_load_openslide_source_get_type(void);
 2990|       |
 2991|      2|	extern GType vips_foreign_load_vips_file_get_type(void);
 2992|      2|	extern GType vips_foreign_load_vips_source_get_type(void);
 2993|      2|	extern GType vips_foreign_save_vips_file_get_type(void);
 2994|      2|	extern GType vips_foreign_save_vips_target_get_type(void);
 2995|       |
 2996|      2|	extern GType vips_foreign_load_jpeg_file_get_type(void);
 2997|      2|	extern GType vips_foreign_load_jpeg_buffer_get_type(void);
 2998|      2|	extern GType vips_foreign_load_jpeg_source_get_type(void);
 2999|      2|	extern GType vips_foreign_save_jpeg_file_get_type(void);
 3000|      2|	extern GType vips_foreign_save_jpeg_buffer_get_type(void);
 3001|      2|	extern GType vips_foreign_save_jpeg_target_get_type(void);
 3002|      2|	extern GType vips_foreign_save_jpeg_mime_get_type(void);
 3003|       |
 3004|      2|	extern GType vips_foreign_load_tiff_file_get_type(void);
 3005|      2|	extern GType vips_foreign_load_tiff_buffer_get_type(void);
 3006|      2|	extern GType vips_foreign_load_tiff_source_get_type(void);
 3007|      2|	extern GType vips_foreign_save_tiff_file_get_type(void);
 3008|      2|	extern GType vips_foreign_save_tiff_buffer_get_type(void);
 3009|      2|	extern GType vips_foreign_save_tiff_target_get_type(void);
 3010|       |
 3011|      2|	extern GType vips_foreign_load_raw_get_type(void);
 3012|      2|	extern GType vips_foreign_save_raw_file_get_type(void);
 3013|      2|	extern GType vips_foreign_save_raw_buffer_get_type(void);
 3014|      2|	extern GType vips_foreign_save_raw_target_get_type(void);
 3015|       |
 3016|      2|	extern GType vips_foreign_load_magick_file_get_type(void);
 3017|      2|	extern GType vips_foreign_load_magick_buffer_get_type(void);
 3018|      2|	extern GType vips_foreign_load_magick7_file_get_type(void);
 3019|      2|	extern GType vips_foreign_load_magick7_buffer_get_type(void);
 3020|       |
 3021|      2|	extern GType vips_foreign_save_magick_file_get_type(void);
 3022|      2|	extern GType vips_foreign_save_magick_buffer_get_type(void);
 3023|      2|	extern GType vips_foreign_save_magick_bmp_file_get_type(void);
 3024|      2|	extern GType vips_foreign_save_magick_bmp_buffer_get_type(void);
 3025|      2|	extern GType vips_foreign_save_magick_gif_file_get_type(void);
 3026|      2|	extern GType vips_foreign_save_magick_gif_buffer_get_type(void);
 3027|       |
 3028|      2|	extern GType vips_foreign_save_dz_file_get_type(void);
 3029|      2|	extern GType vips_foreign_save_dz_buffer_get_type(void);
 3030|      2|	extern GType vips_foreign_save_dz_target_get_type(void);
 3031|       |
 3032|      2|	extern GType vips_foreign_load_webp_file_get_type(void);
 3033|      2|	extern GType vips_foreign_load_webp_buffer_get_type(void);
 3034|      2|	extern GType vips_foreign_load_webp_source_get_type(void);
 3035|      2|	extern GType vips_foreign_save_webp_file_get_type(void);
 3036|      2|	extern GType vips_foreign_save_webp_buffer_get_type(void);
 3037|      2|	extern GType vips_foreign_save_webp_target_get_type(void);
 3038|      2|	extern GType vips_foreign_save_webp_mime_get_type(void);
 3039|       |
 3040|      2|	extern GType vips_foreign_load_pdf_file_get_type(void);
 3041|      2|	extern GType vips_foreign_load_pdf_buffer_get_type(void);
 3042|      2|	extern GType vips_foreign_load_pdf_source_get_type(void);
 3043|       |
 3044|      2|	extern GType vips_foreign_load_svg_file_get_type(void);
 3045|      2|	extern GType vips_foreign_load_svg_buffer_get_type(void);
 3046|      2|	extern GType vips_foreign_load_svg_source_get_type(void);
 3047|       |
 3048|      2|	extern GType vips_foreign_load_jp2k_file_get_type(void);
 3049|      2|	extern GType vips_foreign_load_jp2k_buffer_get_type(void);
 3050|      2|	extern GType vips_foreign_load_jp2k_source_get_type(void);
 3051|      2|	extern GType vips_foreign_save_jp2k_file_get_type(void);
 3052|      2|	extern GType vips_foreign_save_jp2k_buffer_get_type(void);
 3053|      2|	extern GType vips_foreign_save_jp2k_target_get_type(void);
 3054|       |
 3055|      2|	extern GType vips_foreign_load_jxl_file_get_type(void);
 3056|      2|	extern GType vips_foreign_load_jxl_buffer_get_type(void);
 3057|      2|	extern GType vips_foreign_load_jxl_source_get_type(void);
 3058|      2|	extern GType vips_foreign_save_jxl_file_get_type(void);
 3059|      2|	extern GType vips_foreign_save_jxl_buffer_get_type(void);
 3060|      2|	extern GType vips_foreign_save_jxl_target_get_type(void);
 3061|       |
 3062|      2|	extern GType vips_foreign_load_heif_file_get_type(void);
 3063|      2|	extern GType vips_foreign_load_heif_buffer_get_type(void);
 3064|      2|	extern GType vips_foreign_load_heif_source_get_type(void);
 3065|      2|	extern GType vips_foreign_save_heif_file_get_type(void);
 3066|      2|	extern GType vips_foreign_save_heif_buffer_get_type(void);
 3067|      2|	extern GType vips_foreign_save_heif_target_get_type(void);
 3068|      2|	extern GType vips_foreign_save_avif_target_get_type(void);
 3069|       |
 3070|      2|	extern GType vips_foreign_load_nifti_file_get_type(void);
 3071|      2|	extern GType vips_foreign_load_nifti_source_get_type(void);
 3072|      2|	extern GType vips_foreign_save_nifti_get_type(void);
 3073|       |
 3074|      2|	extern GType vips_foreign_load_nsgif_file_get_type(void);
 3075|      2|	extern GType vips_foreign_load_nsgif_buffer_get_type(void);
 3076|      2|	extern GType vips_foreign_load_nsgif_source_get_type(void);
 3077|       |
 3078|      2|	extern GType vips_foreign_save_cgif_file_get_type(void);
 3079|      2|	extern GType vips_foreign_save_cgif_buffer_get_type(void);
 3080|      2|	extern GType vips_foreign_save_cgif_target_get_type(void);
 3081|       |
 3082|      2|	vips_foreign_load_csv_file_get_type();
 3083|      2|	vips_foreign_load_csv_source_get_type();
 3084|      2|	vips_foreign_save_csv_file_get_type();
 3085|      2|	vips_foreign_save_csv_target_get_type();
 3086|       |
 3087|      2|	vips_foreign_load_matrix_file_get_type();
 3088|      2|	vips_foreign_load_matrix_source_get_type();
 3089|      2|	vips_foreign_save_matrix_file_get_type();
 3090|      2|	vips_foreign_save_matrix_target_get_type();
 3091|      2|	vips_foreign_print_matrix_get_type();
 3092|       |
 3093|      2|	vips_foreign_load_raw_get_type();
 3094|      2|	vips_foreign_save_raw_file_get_type();
 3095|      2|	vips_foreign_save_raw_buffer_get_type();
 3096|      2|	vips_foreign_save_raw_target_get_type();
 3097|       |
 3098|      2|	vips_foreign_load_vips_file_get_type();
 3099|      2|	vips_foreign_load_vips_source_get_type();
 3100|      2|	vips_foreign_save_vips_file_get_type();
 3101|      2|	vips_foreign_save_vips_target_get_type();
 3102|       |
 3103|      2|#ifdef HAVE_ANALYZE
 3104|      2|	vips_foreign_load_analyze_get_type();
 3105|      2|#endif /*HAVE_ANALYZE*/
 3106|       |
 3107|      2|#ifdef HAVE_PPM
 3108|      2|	vips_foreign_load_ppm_file_get_type();
 3109|      2|	vips_foreign_load_ppm_source_get_type();
 3110|      2|	vips_foreign_save_ppm_file_get_type();
 3111|      2|	vips_foreign_save_pbm_target_get_type();
 3112|      2|	vips_foreign_save_pgm_target_get_type();
 3113|      2|	vips_foreign_save_ppm_target_get_type();
 3114|      2|	vips_foreign_save_pfm_target_get_type();
 3115|      2|	vips_foreign_save_pnm_target_get_type();
 3116|      2|#endif /*HAVE_PPM*/
 3117|       |
 3118|      2|#ifdef HAVE_RADIANCE
 3119|      2|	vips_foreign_load_rad_file_get_type();
 3120|      2|	vips_foreign_load_rad_buffer_get_type();
 3121|      2|	vips_foreign_load_rad_source_get_type();
 3122|      2|	vips_foreign_save_rad_file_get_type();
 3123|      2|	vips_foreign_save_rad_buffer_get_type();
 3124|      2|	vips_foreign_save_rad_target_get_type();
 3125|      2|#endif /*HAVE_RADIANCE*/
 3126|       |
 3127|       |#if defined(HAVE_POPPLER) && !defined(POPPLER_MODULE)
 3128|       |	vips_foreign_load_pdf_file_get_type();
 3129|       |	vips_foreign_load_pdf_buffer_get_type();
 3130|       |	vips_foreign_load_pdf_source_get_type();
 3131|       |#endif /*defined(HAVE_POPPLER) && !defined(POPPLER_MODULE)*/
 3132|       |
 3133|      2|#ifdef HAVE_PDFIUM
 3134|      2|	vips_foreign_load_pdf_file_get_type();
 3135|      2|	vips_foreign_load_pdf_buffer_get_type();
 3136|      2|	vips_foreign_load_pdf_source_get_type();
 3137|      2|#endif /*HAVE_PDFIUM*/
 3138|       |
 3139|       |#ifdef HAVE_RSVG
 3140|       |	vips_foreign_load_svg_file_get_type();
 3141|       |	vips_foreign_load_svg_buffer_get_type();
 3142|       |	vips_foreign_load_svg_source_get_type();
 3143|       |#endif /*HAVE_RSVG*/
 3144|       |
 3145|       |#if defined(HAVE_LIBJXL) && !defined(LIBJXL_MODULE)
 3146|       |	vips_foreign_load_jxl_file_get_type();
 3147|       |	vips_foreign_load_jxl_buffer_get_type();
 3148|       |	vips_foreign_load_jxl_source_get_type();
 3149|       |	vips_foreign_save_jxl_file_get_type();
 3150|       |	vips_foreign_save_jxl_buffer_get_type();
 3151|       |	vips_foreign_save_jxl_target_get_type();
 3152|       |#endif /*defined(HAVE_LIBJXL) && !defined(LIBJXL_MODULE)*/
 3153|       |
 3154|       |#ifdef HAVE_LIBOPENJP2
 3155|       |	vips_foreign_load_jp2k_file_get_type();
 3156|       |	vips_foreign_load_jp2k_buffer_get_type();
 3157|       |	vips_foreign_load_jp2k_source_get_type();
 3158|       |	vips_foreign_save_jp2k_file_get_type();
 3159|       |	vips_foreign_save_jp2k_buffer_get_type();
 3160|       |	vips_foreign_save_jp2k_target_get_type();
 3161|       |#endif /*HAVE_LIBOPENJP2*/
 3162|       |
 3163|      2|#ifdef HAVE_NSGIF
 3164|      2|	vips_foreign_load_nsgif_file_get_type();
 3165|      2|	vips_foreign_load_nsgif_buffer_get_type();
 3166|      2|	vips_foreign_load_nsgif_source_get_type();
 3167|      2|#endif /*HAVE_NSGIF*/
 3168|       |
 3169|      2|#ifdef HAVE_CGIF
 3170|      2|	vips_foreign_save_cgif_file_get_type();
 3171|      2|	vips_foreign_save_cgif_buffer_get_type();
 3172|      2|	vips_foreign_save_cgif_target_get_type();
 3173|      2|#endif /*HAVE_CGIF*/
 3174|       |
 3175|       |#ifdef HAVE_LIBARCHIVE
 3176|       |	vips_foreign_save_dz_file_get_type();
 3177|       |	vips_foreign_save_dz_buffer_get_type();
 3178|       |	vips_foreign_save_dz_target_get_type();
 3179|       |#endif /*HAVE_LIBARCHIVE*/
 3180|       |
 3181|       |#ifdef HAVE_PNG
 3182|       |	vips_foreign_load_png_file_get_type();
 3183|       |	vips_foreign_load_png_buffer_get_type();
 3184|       |	vips_foreign_load_png_source_get_type();
 3185|       |	vips_foreign_save_png_file_get_type();
 3186|       |	vips_foreign_save_png_buffer_get_type();
 3187|       |	vips_foreign_save_png_target_get_type();
 3188|       |#endif /*HAVE_PNG*/
 3189|       |
 3190|      2|#ifdef HAVE_SPNG
 3191|      2|	vips_foreign_load_png_file_get_type();
 3192|      2|	vips_foreign_load_png_buffer_get_type();
 3193|      2|	vips_foreign_load_png_source_get_type();
 3194|      2|	vips_foreign_save_spng_file_get_type();
 3195|      2|	vips_foreign_save_spng_buffer_get_type();
 3196|      2|	vips_foreign_save_spng_target_get_type();
 3197|      2|#endif /*HAVE_SPNG*/
 3198|       |
 3199|       |#ifdef HAVE_MATIO
 3200|       |	vips_foreign_load_mat_get_type();
 3201|       |#endif /*HAVE_MATIO*/
 3202|       |
 3203|      2|#ifdef HAVE_JPEG
 3204|      2|	vips_foreign_load_jpeg_file_get_type();
 3205|      2|	vips_foreign_load_jpeg_buffer_get_type();
 3206|      2|	vips_foreign_load_jpeg_source_get_type();
 3207|      2|	vips_foreign_save_jpeg_file_get_type();
 3208|      2|	vips_foreign_save_jpeg_buffer_get_type();
 3209|      2|	vips_foreign_save_jpeg_target_get_type();
 3210|      2|	vips_foreign_save_jpeg_mime_get_type();
 3211|      2|#endif /*HAVE_JPEG*/
 3212|       |
 3213|      2|#ifdef HAVE_LIBWEBP
 3214|      2|	vips_foreign_load_webp_file_get_type();
 3215|      2|	vips_foreign_load_webp_buffer_get_type();
 3216|      2|	vips_foreign_load_webp_source_get_type();
 3217|      2|	vips_foreign_save_webp_file_get_type();
 3218|      2|	vips_foreign_save_webp_buffer_get_type();
 3219|      2|	vips_foreign_save_webp_target_get_type();
 3220|      2|	vips_foreign_save_webp_mime_get_type();
 3221|      2|#endif /*HAVE_LIBWEBP*/
 3222|       |
 3223|      2|#ifdef HAVE_TIFF
 3224|      2|	vips_foreign_load_tiff_file_get_type();
 3225|      2|	vips_foreign_load_tiff_buffer_get_type();
 3226|      2|	vips_foreign_load_tiff_source_get_type();
 3227|      2|	vips_foreign_save_tiff_file_get_type();
 3228|      2|	vips_foreign_save_tiff_buffer_get_type();
 3229|      2|	vips_foreign_save_tiff_target_get_type();
 3230|      2|#endif /*HAVE_TIFF*/
 3231|       |
 3232|       |#if defined(HAVE_OPENSLIDE) && !defined(OPENSLIDE_MODULE)
 3233|       |	vips_foreign_load_openslide_file_get_type();
 3234|       |	vips_foreign_load_openslide_source_get_type();
 3235|       |#endif /*defined(HAVE_OPENSLIDE) && !defined(OPENSLIDE_MODULE)*/
 3236|       |
 3237|       |#if defined(ENABLE_MAGICKLOAD) && !defined(MAGICK_MODULE)
 3238|       |#ifdef HAVE_MAGICK6
 3239|       |	vips_foreign_load_magick_file_get_type();
 3240|       |	vips_foreign_load_magick_buffer_get_type();
 3241|       |#endif /*HAVE_MAGICK6*/
 3242|       |
 3243|       |#ifdef HAVE_MAGICK7
 3244|       |	vips_foreign_load_magick7_file_get_type();
 3245|       |	vips_foreign_load_magick7_buffer_get_type();
 3246|       |#endif /*HAVE_MAGICK7*/
 3247|       |#endif /*defined(ENABLE_MAGICKLOAD) && !defined(MAGICK_MODULE)*/
 3248|       |
 3249|       |#if defined(ENABLE_MAGICKSAVE) && !defined(MAGICK_MODULE)
 3250|       |	vips_foreign_save_magick_file_get_type();
 3251|       |	vips_foreign_save_magick_buffer_get_type();
 3252|       |	vips_foreign_save_magick_bmp_file_get_type();
 3253|       |	vips_foreign_save_magick_bmp_buffer_get_type();
 3254|       |	vips_foreign_save_magick_gif_file_get_type();
 3255|       |	vips_foreign_save_magick_gif_buffer_get_type();
 3256|       |#endif /*defined(ENABLE_MAGICKSAVE) && !defined(MAGICK_MODULE)*/
 3257|       |
 3258|       |#ifdef HAVE_CFITSIO
 3259|       |	vips_foreign_load_fits_file_get_type();
 3260|       |	vips_foreign_load_fits_source_get_type();
 3261|       |	vips_foreign_save_fits_get_type();
 3262|       |#endif /*HAVE_CFITSIO*/
 3263|       |
 3264|       |#ifdef HAVE_OPENEXR
 3265|       |	vips_foreign_load_openexr_get_type();
 3266|       |#endif /*HAVE_OPENEXR*/
 3267|       |
 3268|       |#ifdef HAVE_NIFTI
 3269|       |	vips_foreign_load_nifti_file_get_type();
 3270|       |	vips_foreign_load_nifti_source_get_type();
 3271|       |	vips_foreign_save_nifti_get_type();
 3272|       |#endif /*HAVE_NIFTI*/
 3273|       |
 3274|      2|#if defined(HAVE_HEIF) && !defined(HEIF_MODULE)
 3275|      2|	vips_foreign_load_heif_file_get_type();
 3276|      2|	vips_foreign_load_heif_buffer_get_type();
 3277|      2|	vips_foreign_load_heif_source_get_type();
 3278|      2|	vips_foreign_save_heif_file_get_type();
 3279|      2|	vips_foreign_save_heif_buffer_get_type();
 3280|      2|	vips_foreign_save_heif_target_get_type();
 3281|      2|	vips_foreign_save_avif_target_get_type();
 3282|      2|#endif /*defined(HAVE_HEIF) && !defined(HEIF_MODULE)*/
 3283|       |
 3284|      2|	vips__foreign_load_operation =
 3285|      2|		g_quark_from_static_string("vips-foreign-load-operation");
 3286|      2|}
foreign.c:vips_foreign_class_init:
  400|      1|{
  401|      1|	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
  ------------------
  |  |   58|      1|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|      1|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|      1|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  402|      1|	VipsObjectClass *object_class = (VipsObjectClass *) class;
  403|       |
  404|      1|	gobject_class->set_property = vips_object_set_property;
  405|      1|	gobject_class->get_property = vips_object_get_property;
  406|       |
  407|      1|	object_class->nickname = "foreign";
  408|      1|	object_class->description = _("load and save image files");
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  409|      1|	object_class->summary_class = vips_foreign_summary_class;
  410|      1|}
foreign.c:vips_foreign_init:
  414|  25.1k|{
  415|  25.1k|}
foreign.c:file_add_class:
  423|  1.05M|{
  424|  1.05M|	VipsOperationClass *operation_class = VIPS_OPERATION_CLASS(class);
  ------------------
  |  |   60|  1.05M|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|  1.05M|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  1.05M|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|  1.05M|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
  425|       |
  426|       |	// don't consider blocked classes ... we don't want eg. sniffers to run
  427|  1.05M|	if (operation_class->flags & VIPS_OPERATION_BLOCKED)
  ------------------
  |  Branch (427:6): [True: 0, False: 1.05M]
  ------------------
  428|      0|		return NULL;
  429|       |
  430|       |	// exclude "rawload" as it has a different API.
  431|  1.05M|	if (vips_isprefix("rawload", VIPS_OBJECT_CLASS(class)->nickname))
  ------------------
  |  |  435|  1.05M|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  1.05M|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  1.05M|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (431:6): [True: 31.1k, False: 1.02M]
  ------------------
  432|  31.1k|		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.02M|	*files = g_slist_append(*files, class);
  438|       |
  439|  1.02M|	return NULL;
  440|  1.05M|}
foreign.c:file_compare:
  444|  3.35M|{
  445|  3.35M|	return b->priority - a->priority;
  446|  3.35M|}
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|  25.1k|{
  504|  25.1k|	VipsForeignLoad *load = VIPS_FOREIGN_LOAD(gobject);
  ------------------
  |  |  133|  25.1k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  25.1k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  25.1k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|  25.1k|		VIPS_TYPE_FOREIGN_LOAD, VipsForeignLoad))
  ------------------
  505|       |
  506|  25.1k|	VIPS_UNREF(load->real);
  ------------------
  |  |   57|  25.1k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  25.1k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  25.1k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  25.1k|	{ \
  |  |  |  |   43|  25.1k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 15.5k, False: 9.58k]
  |  |  |  |  ------------------
  |  |  |  |   44|  15.5k|			(void) F((S)); \
  |  |  |  |   45|  15.5k|			(S) = 0; \
  |  |  |  |   46|  15.5k|		} \
  |  |  |  |   47|  25.1k|	} \
  |  |  |  |   48|  25.1k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  25.1k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  507|       |
  508|  25.1k|	G_OBJECT_CLASS(vips_foreign_load_parent_class)->dispose(gobject);
  ------------------
  |  |   58|  25.1k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  25.1k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  25.1k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  509|  25.1k|}
foreign.c:vips_foreign_load_build:
 1079|  23.6k|{
 1080|  23.6k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  23.6k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  23.6k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  23.6k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1081|  23.6k|	VipsForeignLoad *load = VIPS_FOREIGN_LOAD(object);
  ------------------
  |  |  133|  23.6k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  23.6k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  23.6k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|  23.6k|		VIPS_TYPE_FOREIGN_LOAD, VipsForeignLoad))
  ------------------
 1082|  23.6k|	VipsForeignLoadClass *fclass = VIPS_FOREIGN_LOAD_GET_CLASS(object);
  ------------------
  |  |  143|  23.6k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  23.6k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  23.6k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  144|  23.6k|		VIPS_TYPE_FOREIGN_LOAD, VipsForeignLoadClass))
  ------------------
 1083|       |
 1084|  23.6k|	VipsForeignFlags flags;
 1085|       |
 1086|       |#ifdef DEBUG
 1087|       |	printf("vips_foreign_load_build:\n");
 1088|       |#endif /*DEBUG*/
 1089|       |
 1090|  23.6k|	flags = 0;
 1091|  23.6k|	if (fclass->get_flags)
  ------------------
  |  Branch (1091:6): [True: 23.6k, False: 0]
  ------------------
 1092|  23.6k|		flags |= fclass->get_flags(load);
 1093|       |
 1094|  23.6k|	if ((flags & VIPS_FOREIGN_PARTIAL) &&
  ------------------
  |  Branch (1094:6): [True: 3.44k, False: 20.2k]
  ------------------
 1095|  23.6k|		(flags & VIPS_FOREIGN_SEQUENTIAL)) {
  ------------------
  |  Branch (1095:3): [True: 0, False: 3.44k]
  ------------------
 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|  23.6k|	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|  23.6k|	if ((load->flags & VIPS_FOREIGN_SEQUENTIAL) &&
  ------------------
  |  Branch (1108:6): [True: 17.9k, False: 5.69k]
  ------------------
 1109|  23.6k|		load->access != VIPS_ACCESS_RANDOM)
  ------------------
  |  Branch (1109:3): [True: 0, False: 17.9k]
  ------------------
 1110|      0|		load->nocache = TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 1111|       |
 1112|       |	/* The deprecated "fail" field sets fail_on warning.
 1113|       |	 */
 1114|  23.6k|	if (vips_object_argument_isset(object, "fail") &&
  ------------------
  |  Branch (1114:6): [True: 0, False: 23.6k]
  ------------------
 1115|  23.6k|		!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|  23.6k|	if (VIPS_OBJECT_CLASS(vips_foreign_load_parent_class)->build(object))
  ------------------
  |  |  435|  23.6k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  23.6k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  23.6k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1120:6): [True: 0, False: 23.6k]
  ------------------
 1121|      0|		return -1;
 1122|       |
 1123|  23.6k|	if (load->sequential)
  ------------------
  |  Branch (1123:6): [True: 0, False: 23.6k]
  ------------------
 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|  23.6k|			_("ignoring deprecated \"sequential\" mode -- "
 1126|  23.6k|			  "please use \"access\" instead"));
 1127|       |
 1128|  23.6k|	g_object_set(object, "out", vips_image_new(), NULL);
 1129|       |
 1130|  23.6k|	vips_image_set_string(load->out,
 1131|  23.6k|		VIPS_META_LOADER, class->nickname);
  ------------------
  |  |  115|  23.6k|#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|  23.6k|	if (fclass->header &&
  ------------------
  |  Branch (1139:6): [True: 23.6k, False: 0]
  ------------------
 1140|  23.6k|		fclass->header(load))
  ------------------
  |  Branch (1140:3): [True: 6.47k, False: 17.1k]
  ------------------
 1141|  6.47k|		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|  17.1k|	if (fclass->load) {
  ------------------
  |  Branch (1150:6): [True: 17.1k, 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|  17.1k|		if (vips_image_pipelinev(load->out, load->out->dhint, NULL))
  ------------------
  |  Branch (1158:7): [True: 0, False: 17.1k]
  ------------------
 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|  17.1k|		if (vips_image_generate(load->out,
  ------------------
  |  Branch (1164:7): [True: 0, False: 17.1k]
  ------------------
 1165|  17.1k|				vips_foreign_load_start,
 1166|  17.1k|				vips_foreign_load_generate,
 1167|  17.1k|				vips_stop_one,
 1168|  17.1k|				NULL, load))
 1169|      0|			return -1;
 1170|  17.1k|	}
 1171|       |
 1172|       |	/* Tell downstream if seq mode was requested.
 1173|       |	 */
 1174|  17.1k|	if (load->access != VIPS_ACCESS_RANDOM)
  ------------------
  |  Branch (1174:6): [True: 0, False: 17.1k]
  ------------------
 1175|      0|		vips_image_set_int(load->out, VIPS_META_SEQUENTIAL, 1);
  ------------------
  |  |  124|      0|#define VIPS_META_SEQUENTIAL "vips-sequential"
  ------------------
 1176|       |
 1177|  17.1k|	return 0;
 1178|  17.1k|}
foreign.c:vips_foreign_load_start:
  991|  24.9k|{
  992|  24.9k|	VipsForeignLoad *load = VIPS_FOREIGN_LOAD(b);
  ------------------
  |  |  133|  24.9k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  24.9k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  24.9k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|  24.9k|		VIPS_TYPE_FOREIGN_LOAD, VipsForeignLoad))
  ------------------
  993|  24.9k|	VipsForeignLoadClass *class = VIPS_FOREIGN_LOAD_GET_CLASS(load);
  ------------------
  |  |  143|  24.9k|	(G_TYPE_INSTANCE_GET_CLASS((obj), \
  |  |  ------------------
  |  |  |  |  527|  24.9k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  24.9k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  144|  24.9k|		VIPS_TYPE_FOREIGN_LOAD, VipsForeignLoadClass))
  ------------------
  994|       |
  995|       |	/* If this start has failed before in another thread, we can fail now.
  996|       |	 */
  997|  24.9k|	if (load->error)
  ------------------
  |  Branch (997:6): [True: 0, False: 24.9k]
  ------------------
  998|      0|		return NULL;
  999|       |
 1000|  24.9k|	if (!load->real) {
  ------------------
  |  Branch (1000:6): [True: 15.5k, False: 9.41k]
  ------------------
 1001|  15.5k|		if (!(load->real = vips_foreign_load_temp(load)))
  ------------------
  |  Branch (1001:7): [True: 0, False: 15.5k]
  ------------------
 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|  15.5k|		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|  15.5k|		g_object_set_qdata(G_OBJECT(load->real),
  ------------------
  |  |   51|  15.5k|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|  15.5k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  15.5k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1021|  15.5k|			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|  15.5k|		if (class->load(load) ||
  ------------------
  |  Branch (1034:7): [True: 6.30k, False: 9.25k]
  ------------------
 1035|  15.5k|			vips_image_pio_input(load->real) ||
  ------------------
  |  Branch (1035:4): [True: 0, False: 9.25k]
  ------------------
 1036|  15.5k|			!vips_foreign_load_iscompat(load->real, out)) {
  ------------------
  |  Branch (1036:4): [True: 10, False: 9.24k]
  ------------------
 1037|  6.31k|			vips_operation_invalidate(VIPS_OPERATION(load));
  ------------------
  |  |   57|  6.31k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  6.31k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  6.31k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   58|  6.31k|		VIPS_TYPE_OPERATION, VipsOperation))
  ------------------
 1038|  6.31k|			load->error = TRUE;
  ------------------
  |  |  798|  6.31k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  6.31k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 1039|       |
 1040|  6.31k|			return NULL;
 1041|  6.31k|		}
 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|  9.24k|		if (vips_image_pipelinev(load->out, load->out->dhint,
  ------------------
  |  Branch (1046:7): [True: 0, False: 9.24k]
  ------------------
 1047|  9.24k|				load->real, NULL))
 1048|      0|			return NULL;
 1049|  9.24k|	}
 1050|       |
 1051|  18.6k|	return vips_region_new(load->real);
 1052|  24.9k|}
foreign.c:vips_foreign_load_temp:
  908|  15.5k|{
  909|  15.5k|	const guint64 disc_threshold = vips_get_disc_threshold();
  910|  15.5k|	const guint64 image_size = VIPS_IMAGE_SIZEOF_IMAGE(load->out);
  ------------------
  |  |  388|  15.5k|	(VIPS_IMAGE_SIZEOF_LINE(I) * (I)->Ysize)
  |  |  ------------------
  |  |  |  |  386|  15.5k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|  15.5k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|  15.5k|	(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|  15.5k|	if (!load->disc)
  ------------------
  |  Branch (915:6): [True: 0, False: 15.5k]
  ------------------
  916|      0|		load->memory = TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  917|       |
  918|  15.5k|	if (load->memory) {
  ------------------
  |  Branch (918:6): [True: 0, False: 15.5k]
  ------------------
  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|  15.5k|	if (load->flags & VIPS_FOREIGN_PARTIAL) {
  ------------------
  |  Branch (928:6): [True: 2.32k, False: 13.2k]
  ------------------
  929|       |#ifdef DEBUG
  930|       |		printf("vips_foreign_load_temp: partial temp\n");
  931|       |#endif /*DEBUG*/
  932|       |
  933|  2.32k|		return vips_image_new();
  934|  2.32k|	}
  935|       |
  936|       |	/* If it can do sequential access and it's been requested, we can open
  937|       |	 * directly.
  938|       |	 */
  939|  13.2k|	if ((load->flags & VIPS_FOREIGN_SEQUENTIAL) &&
  ------------------
  |  Branch (939:6): [True: 11.6k, False: 1.62k]
  ------------------
  940|  13.2k|		load->access != VIPS_ACCESS_RANDOM) {
  ------------------
  |  Branch (940:3): [True: 0, False: 11.6k]
  ------------------
  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|  13.2k|	if (image_size > disc_threshold) {
  ------------------
  |  Branch (951:6): [True: 0, False: 13.2k]
  ------------------
  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|  13.2k|	return vips_image_new_memory();
  966|  13.2k|}
foreign.c:vips_foreign_load_iscompat:
  972|  9.25k|{
  973|  9.25k|	if (a->Xsize != b->Xsize ||
  ------------------
  |  Branch (973:6): [True: 0, False: 9.25k]
  ------------------
  974|  9.25k|		a->Ysize != b->Ysize ||
  ------------------
  |  Branch (974:3): [True: 0, False: 9.25k]
  ------------------
  975|  9.25k|		a->Bands != b->Bands ||
  ------------------
  |  Branch (975:3): [True: 10, False: 9.24k]
  ------------------
  976|  9.25k|		a->Coding != b->Coding ||
  ------------------
  |  Branch (976:3): [True: 0, False: 9.24k]
  ------------------
  977|  9.25k|		a->BandFmt != b->BandFmt) {
  ------------------
  |  Branch (977:3): [True: 0, False: 9.24k]
  ------------------
  978|     10|		vips_error("VipsForeignLoad", "%s",
  979|     10|			_("images do not match between header and load"));
  ------------------
  |  |   30|     10|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|     10|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  980|     10|		return FALSE;
  ------------------
  |  |  794|     10|#define	FALSE	(0)
  ------------------
  981|     10|	}
  982|       |
  983|  9.24k|	return TRUE;
  ------------------
  |  |  798|  9.24k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  9.24k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  984|  9.25k|}
foreign.c:vips_foreign_load_generate:
 1059|  18.6k|{
 1060|  18.6k|	VipsRegion *ir = (VipsRegion *) seq;
 1061|       |
 1062|  18.6k|	VipsRect *r = &out_region->valid;
 1063|       |
 1064|       |	/* Ask for input we need.
 1065|       |	 */
 1066|  18.6k|	if (vips_region_prepare(ir, r))
  ------------------
  |  Branch (1066:6): [True: 165, False: 18.4k]
  ------------------
 1067|    165|		return -1;
 1068|       |
 1069|       |	/* Attach output region to that.
 1070|       |	 */
 1071|  18.4k|	if (vips_region_region(out_region, ir, r, r->left, r->top))
  ------------------
  |  Branch (1071:6): [True: 0, False: 18.4k]
  ------------------
 1072|      0|		return -1;
 1073|       |
 1074|  18.4k|	return 0;
 1075|  18.4k|}
foreign.c:vips_foreign_load_operation_get_flags:
 1182|  42.3k|{
 1183|  42.3k|	VipsForeignLoad *load = VIPS_FOREIGN_LOAD(operation);
  ------------------
  |  |  133|  42.3k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  42.3k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  42.3k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|  42.3k|		VIPS_TYPE_FOREIGN_LOAD, VipsForeignLoad))
  ------------------
 1184|       |
 1185|  42.3k|	VipsOperationFlags flags;
 1186|       |
 1187|  42.3k|	flags = VIPS_OPERATION_CLASS(vips_foreign_load_parent_class)
  ------------------
  |  |   60|  42.3k|	(G_TYPE_CHECK_CLASS_CAST((klass), \
  |  |  ------------------
  |  |  |  |  553|  42.3k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  42.3k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|  42.3k|		VIPS_TYPE_OPERATION, VipsOperationClass))
  ------------------
 1188|  42.3k|				->get_flags(operation);
 1189|  42.3k|	if (load->nocache)
  ------------------
  |  Branch (1189:6): [True: 0, False: 42.3k]
  ------------------
 1190|      0|		flags |= VIPS_OPERATION_NOCACHE;
 1191|  42.3k|	if (load->revalidate)
  ------------------
  |  Branch (1191:6): [True: 0, False: 42.3k]
  ------------------
 1192|      0|		flags |= VIPS_OPERATION_REVALIDATE;
 1193|       |
 1194|  42.3k|	return flags;
 1195|  42.3k|}
foreign.c:vips_foreign_load_init:
 1281|  25.1k|{
 1282|  25.1k|	load->disc = TRUE;
  ------------------
  |  |  798|  25.1k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  25.1k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 1283|  25.1k|	load->access = VIPS_ACCESS_RANDOM;
 1284|  25.1k|	load->fail_on = VIPS_FAIL_ON_NONE;
 1285|  25.1k|}
foreign.c:vips_foreign_find_load_buffer_sub:
  663|   600k|{
  664|   600k|	VipsObjectClass *object_class = VIPS_OBJECT_CLASS(load_class);
  ------------------
  |  |  435|   600k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|   600k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|   600k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  665|       |
  666|       |	/* Skip non-buffer loaders.
  667|       |	 */
  668|   600k|	if (!g_str_has_suffix(object_class->nickname, "_buffer"))
  ------------------
  |  Branch (668:6): [True: 446k, False: 153k]
  ------------------
  669|   446k|		return NULL;
  670|       |
  671|   153k|	if (load_class->is_a_buffer) {
  ------------------
  |  Branch (671:6): [True: 153k, False: 0]
  ------------------
  672|   153k|		if (load_class->is_a_buffer(*buf, *len))
  ------------------
  |  Branch (672:7): [True: 25.1k, False: 128k]
  ------------------
  673|  25.1k|			return load_class;
  674|   153k|	}
  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|   153k|			object_class->nickname);
  678|       |
  679|   128k|	return NULL;
  680|   153k|}
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|  1.64k|{
  243|  1.64k|	if (error->code)
  ------------------
  |  Branch (243:6): [True: 1.64k, False: 0]
  ------------------
  244|  1.64k|		vips_error("heif", "%s (%d.%d)",
  245|  1.64k|			error->message ? error->message : "(null)",
  ------------------
  |  Branch (245:4): [True: 1.64k, False: 0]
  ------------------
  246|  1.64k|			error->code, error->subcode);
  247|  1.64k|}
vips__heif_chroma:
  297|    231|{
  298|    231|	if (bits_per_pixel == 8) {
  ------------------
  |  Branch (298:6): [True: 20, False: 211]
  ------------------
  299|     20|		if (has_alpha)
  ------------------
  |  Branch (299:7): [True: 0, False: 20]
  ------------------
  300|      0|			return heif_chroma_interleaved_RGBA;
  301|     20|		else
  302|     20|			return heif_chroma_interleaved_RGB;
  303|     20|	}
  304|    211|	else {
  305|    211|		if (has_alpha)
  ------------------
  |  Branch (305:7): [True: 0, False: 211]
  ------------------
  306|      0|			return heif_chroma_interleaved_RRGGBBAA_BE;
  307|    211|		else
  308|    211|			return heif_chroma_interleaved_RRGGBB_BE;
  309|    211|	}
  310|    231|}
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|  1.68k|{
  323|  1.68k|	VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) gobject;
  324|       |
  325|  1.68k|	heif->data = NULL;
  326|  1.68k|	VIPS_FREEF(heif_image_release, heif->img);
  ------------------
  |  |   41|  1.68k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.68k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  1.68k|	{ \
  |  |   43|  1.68k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 1.68k]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|  1.68k|	} \
  |  |   48|  1.68k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.68k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  327|  1.68k|	VIPS_FREEF(heif_image_handle_release, heif->handle);
  ------------------
  |  |   41|  1.68k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.68k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  1.68k|	{ \
  |  |   43|  1.68k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 263, False: 1.41k]
  |  |  ------------------
  |  |   44|    263|			(void) F((S)); \
  |  |   45|    263|			(S) = 0; \
  |  |   46|    263|		} \
  |  |   47|  1.68k|	} \
  |  |   48|  1.68k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.68k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  328|  1.68k|	VIPS_FREEF(heif_context_free, heif->ctx);
  ------------------
  |  |   41|  1.68k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.68k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  1.68k|	{ \
  |  |   43|  1.68k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 1.68k, False: 0]
  |  |  ------------------
  |  |   44|  1.68k|			(void) F((S)); \
  |  |   45|  1.68k|			(S) = 0; \
  |  |   46|  1.68k|		} \
  |  |   47|  1.68k|	} \
  |  |   48|  1.68k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.68k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  329|  1.68k|	VIPS_FREE(heif->id);
  ------------------
  |  |   50|  1.68k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  1.68k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  1.68k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  1.68k|	{ \
  |  |  |  |   43|  1.68k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 263, False: 1.41k]
  |  |  |  |  ------------------
  |  |  |  |   44|    263|			(void) F((S)); \
  |  |  |  |   45|    263|			(S) = 0; \
  |  |  |  |   46|    263|		} \
  |  |  |  |   47|  1.68k|	} \
  |  |  |  |   48|  1.68k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  1.68k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  330|  1.68k|	VIPS_FREE(heif->reader);
  ------------------
  |  |   50|  1.68k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  1.68k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  1.68k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  1.68k|	{ \
  |  |  |  |   43|  1.68k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 1.68k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  1.68k|			(void) F((S)); \
  |  |  |  |   45|  1.68k|			(S) = 0; \
  |  |  |  |   46|  1.68k|		} \
  |  |  |  |   47|  1.68k|	} \
  |  |  |  |   48|  1.68k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  1.68k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  331|  1.68k|	VIPS_UNREF(heif->source);
  ------------------
  |  |   57|  1.68k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  1.68k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  1.68k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  1.68k|	{ \
  |  |  |  |   43|  1.68k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 1.68k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  1.68k|			(void) F((S)); \
  |  |  |  |   45|  1.68k|			(S) = 0; \
  |  |  |  |   46|  1.68k|		} \
  |  |  |  |   47|  1.68k|	} \
  |  |  |  |   48|  1.68k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  1.68k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  332|       |
  333|  1.68k|	G_OBJECT_CLASS(vips_foreign_load_heif_parent_class)->dispose(gobject);
  ------------------
  |  |   58|  1.68k|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  1.68k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  1.68k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  334|  1.68k|}
heifload.c:vips_foreign_load_heif_build:
  338|  1.68k|{
  339|  1.68k|	VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) object;
  340|       |
  341|       |#ifdef DEBUG
  342|       |	printf("vips_foreign_load_heif_build:\n");
  343|       |#endif /*DEBUG*/
  344|       |
  345|  1.68k|	if (heif->source &&
  ------------------
  |  Branch (345:6): [True: 1.68k, False: 0]
  ------------------
  346|  1.68k|		vips_source_rewind(heif->source))
  ------------------
  |  Branch (346:3): [True: 0, False: 1.68k]
  ------------------
  347|      0|		return -1;
  348|       |
  349|  1.68k|	if (!heif->ctx) {
  ------------------
  |  Branch (349:6): [True: 1.68k, False: 0]
  ------------------
  350|  1.68k|		struct heif_error error;
  351|       |
  352|  1.68k|		heif->ctx = heif_context_alloc();
  353|  1.68k|#ifdef HAVE_HEIF_SET_MAX_IMAGE_SIZE_LIMIT
  354|  1.68k|		heif_context_set_maximum_image_size_limit(heif->ctx,
  355|  1.68k|			heif->unlimited ? USHRT_MAX : 0x4000);
  ------------------
  |  Branch (355:4): [True: 0, False: 1.68k]
  ------------------
  356|  1.68k|#endif /* HAVE_HEIF_SET_MAX_IMAGE_SIZE_LIMIT */
  357|  1.68k|		error = heif_context_read_from_reader(heif->ctx,
  358|  1.68k|			heif->reader, heif, NULL);
  359|  1.68k|		if (error.code) {
  ------------------
  |  Branch (359:7): [True: 1.41k, False: 263]
  ------------------
  360|  1.41k|			vips__heif_error(&error);
  361|  1.41k|			return -1;
  362|  1.41k|		}
  363|  1.68k|	}
  364|       |
  365|    263|	if (VIPS_OBJECT_CLASS(vips_foreign_load_heif_parent_class)->build(object))
  ------------------
  |  |  435|    263|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|    263|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|    263|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (365:6): [True: 14, False: 249]
  ------------------
  366|     14|		return -1;
  367|       |
  368|    249|	return 0;
  369|    263|}
heifload.c:vips_foreign_load_heif_get_flags:
  420|    263|{
  421|       |	/* FIXME .. could support random access for grid images.
  422|       |	 */
  423|    263|	return VIPS_FOREIGN_SEQUENTIAL;
  424|    263|}
heifload.c:vips_foreign_load_heif_header:
  780|    263|{
  781|    263|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(load);
  ------------------
  |  |  441|    263|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|    263|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|    263|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  782|    263|	VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) load;
  783|       |
  784|    263|	struct heif_error error;
  785|    263|	heif_item_id primary_id;
  786|    263|	int i;
  787|       |
  788|       |#ifdef DEBUG
  789|       |	printf("vips_foreign_load_heif_header:\n");
  790|       |#endif /*DEBUG*/
  791|       |
  792|    263|	heif->n_top = heif_context_get_number_of_top_level_images(heif->ctx);
  793|    263|	heif->id = VIPS_ARRAY(NULL, heif->n_top, heif_item_id);
  ------------------
  |  |   72|    263|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|    263|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|    263|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|    263|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|    263|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  794|    263|	heif_context_get_list_of_top_level_image_IDs(heif->ctx,
  795|    263|		heif->id, heif->n_top);
  796|       |
  797|       |	/* Note page number of primary image.
  798|       |	 */
  799|    263|	error = heif_context_get_primary_image_ID(heif->ctx, &primary_id);
  800|    263|	if (error.code) {
  ------------------
  |  Branch (800:6): [True: 0, False: 263]
  ------------------
  801|      0|		vips__heif_error(&error);
  802|      0|		return -1;
  803|      0|	}
  804|    526|	for (i = 0; i < heif->n_top; i++)
  ------------------
  |  Branch (804:14): [True: 263, False: 263]
  ------------------
  805|    263|		if (heif->id[i] == primary_id)
  ------------------
  |  Branch (805:7): [True: 263, False: 0]
  ------------------
  806|    263|			heif->primary_page = i;
  807|       |
  808|       |	/* If @n and @page have not been set, @page defaults to the primary
  809|       |	 * page.
  810|       |	 */
  811|    263|	if (!vips_object_argument_isset(VIPS_OBJECT(load), "page") &&
  ------------------
  |  |  433|    263|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|    263|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    263|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (811:6): [True: 263, False: 0]
  ------------------
  812|    263|		!vips_object_argument_isset(VIPS_OBJECT(load), "n"))
  ------------------
  |  |  433|    263|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|    263|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    263|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (812:3): [True: 263, False: 0]
  ------------------
  813|    263|		heif->page = heif->primary_page; // FIXME: Invalidates operation cache
  814|       |
  815|    263|	if (heif->n == -1)
  ------------------
  |  Branch (815:6): [True: 0, False: 263]
  ------------------
  816|      0|		heif->n = heif->n_top - heif->page; // FIXME: Invalidates operation cache
  817|    263|	if (heif->page < 0 ||
  ------------------
  |  Branch (817:6): [True: 0, False: 263]
  ------------------
  818|    263|		heif->n <= 0 ||
  ------------------
  |  Branch (818:3): [True: 0, False: 263]
  ------------------
  819|    263|		heif->page + heif->n > heif->n_top) {
  ------------------
  |  Branch (819:3): [True: 0, False: 263]
  ------------------
  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|    263|	if (vips_foreign_load_heif_set_page(heif, heif->page, heif->thumbnail))
  ------------------
  |  Branch (865:6): [True: 0, False: 263]
  ------------------
  866|      0|		return -1;
  867|    263|	heif->page_width = heif_image_handle_get_width(heif->handle);
  868|    263|	heif->page_height = heif_image_handle_get_height(heif->handle);
  869|    263|	heif->bits_per_pixel =
  870|    263|		heif_image_handle_get_luma_bits_per_pixel(heif->handle);
  871|    263|	if (heif->bits_per_pixel < 0) {
  ------------------
  |  Branch (871:6): [True: 6, False: 257]
  ------------------
  872|      6|		vips_error(class->nickname, "%s", _("undefined bits per pixel"));
  ------------------
  |  |   30|      6|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      6|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  873|      6|		return -1;
  874|      6|	}
  875|       |
  876|    257|	for (i = heif->page + 1; i < heif->page + heif->n; i++) {
  ------------------
  |  Branch (876:27): [True: 0, False: 257]
  ------------------
  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|    257|	if (vips_foreign_load_heif_set_header(heif, load->out))
  ------------------
  |  Branch (919:6): [True: 8, False: 249]
  ------------------
  920|      8|		return -1;
  921|       |
  922|    249|	vips_source_minimise(heif->source);
  923|       |
  924|    249|	return 0;
  925|    257|}
heifload.c:vips_foreign_load_heif_set_page:
  501|    982|{
  502|    982|	if (!heif->handle ||
  ------------------
  |  Branch (502:6): [True: 263, False: 719]
  ------------------
  503|    982|		page_no != heif->page_no ||
  ------------------
  |  Branch (503:3): [True: 0, False: 719]
  ------------------
  504|    982|		thumbnail != heif->thumbnail_set) {
  ------------------
  |  Branch (504:3): [True: 0, False: 719]
  ------------------
  505|    263|		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|    263|		VIPS_FREEF(heif_image_handle_release, heif->handle);
  ------------------
  |  |   41|    263|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    263|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|    263|	{ \
  |  |   43|    263|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 263]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|    263|	} \
  |  |   48|    263|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    263|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  513|    263|		VIPS_FREEF(heif_image_release, heif->img);
  ------------------
  |  |   41|    263|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    263|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|    263|	{ \
  |  |   43|    263|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 263]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|    263|	} \
  |  |   48|    263|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    263|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  514|    263|		heif->data = NULL;
  515|    263|		heif->thumbnail_set = FALSE;
  ------------------
  |  |  794|    263|#define	FALSE	(0)
  ------------------
  516|       |
  517|    263|		error = heif_context_get_image_handle(heif->ctx,
  518|    263|			heif->id[page_no], &heif->handle);
  519|    263|		if (error.code) {
  ------------------
  |  Branch (519:7): [True: 0, False: 263]
  ------------------
  520|      0|			vips__heif_error(&error);
  521|      0|			return -1;
  522|      0|		}
  523|       |
  524|    263|		if (thumbnail) {
  ------------------
  |  Branch (524:7): [True: 0, False: 263]
  ------------------
  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|    263|		heif->page_no = page_no;
  540|    263|	}
  541|       |
  542|    982|	return 0;
  543|    982|}
heifload.c:vips_foreign_load_heif_set_header:
  547|    488|{
  548|    488|	VipsForeignLoad *load = (VipsForeignLoad *) heif;
  549|       |
  550|    488|	int bands;
  551|    488|	int i;
  552|       |	/* Surely, 16 metadata items will be enough for anyone.
  553|       |	 */
  554|    488|	heif_item_id id[16];
  555|    488|	int n_metadata;
  556|    488|	struct heif_error error;
  557|    488|	VipsForeignHeifCompression compression;
  558|    488|	VipsInterpretation interpretation;
  559|    488|	VipsBandFormat format;
  560|       |
  561|       |	/* We take the metadata from the non-thumbnail first page. HEIC
  562|       |	 * thumbnails don't have metadata.
  563|       |	 */
  564|    488|	if (vips_foreign_load_heif_set_page(heif, heif->page, FALSE))
  ------------------
  |  |  794|    488|#define	FALSE	(0)
  ------------------
  |  Branch (564:6): [True: 0, False: 488]
  ------------------
  565|      0|		return -1;
  566|       |
  567|       |	/* Verify dimensions
  568|       |	 */
  569|    488|	if (heif->page_width < 1 ||
  ------------------
  |  Branch (569:6): [True: 8, False: 480]
  ------------------
  570|    488|		heif->page_height < 1) {
  ------------------
  |  Branch (570:3): [True: 0, False: 480]
  ------------------
  571|      8|		vips_error("heifload", "%s", _("bad dimensions"));
  ------------------
  |  |   30|      8|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      8|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  572|      8|		return -1;
  573|      8|	}
  574|       |
  575|    480|	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|    480|	bands = heif->has_alpha ? 4 : 3;
  ------------------
  |  Branch (579:10): [True: 0, False: 480]
  ------------------
  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|    480|	n_metadata = heif_image_handle_get_list_of_metadata_block_IDs(
  589|    480|		heif->handle, NULL, id, VIPS_NUMBER(id));
  ------------------
  |  |   60|    480|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  590|    480|	for (i = 0; i < n_metadata; i++) {
  ------------------
  |  Branch (590:14): [True: 0, False: 480]
  ------------------
  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|    480|	vips_autorot_remove_angle(out);
  652|       |
  653|    480|#ifdef HAVE_HEIF_COLOR_PROFILE
  654|    480|	enum heif_color_profile_type profile_type =
  655|    480|		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|    480|	if (profile_type == heif_color_profile_type_prof ||
  ------------------
  |  Branch (687:6): [True: 0, False: 480]
  ------------------
  688|    480|		profile_type == heif_color_profile_type_rICC) {
  ------------------
  |  Branch (688:3): [True: 0, False: 480]
  ------------------
  689|      0|		size_t length = heif_image_handle_get_raw_color_profile_size(
  690|      0|			heif->handle);
  691|       |
  692|      0|		unsigned char *data;
  693|       |
  694|      0|		if (!(data = VIPS_ARRAY(NULL, length, unsigned char)))
  ------------------
  |  |   72|      0|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|      0|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|      0|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|      0|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|      0|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (694:7): [True: 0, False: 0]
  ------------------
  695|      0|			return -1;
  696|      0|		error = heif_image_handle_get_raw_color_profile(heif->handle, data);
  697|      0|		if (error.code) {
  ------------------
  |  Branch (697:7): [True: 0, False: 0]
  ------------------
  698|      0|			VIPS_FREE(data);
  ------------------
  |  |   50|      0|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|      0|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|      0|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|      0|	{ \
  |  |  |  |   43|      0|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|      0|			(void) F((S)); \
  |  |  |  |   45|      0|			(S) = 0; \
  |  |  |  |   46|      0|		} \
  |  |  |  |   47|      0|	} \
  |  |  |  |   48|      0|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|      0|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  699|      0|			vips__heif_error(&error);
  700|      0|			return -1;
  701|      0|		}
  702|       |
  703|       |#ifdef DEBUG
  704|       |		printf("profile data, length = %zd\n", length);
  705|       |#endif /*DEBUG*/
  706|       |
  707|      0|		vips_image_set_blob(out, VIPS_META_ICC_NAME,
  ------------------
  |  |   78|      0|#define VIPS_META_ICC_NAME "icc-profile-data"
  ------------------
  708|      0|			(VipsCallbackFn) vips_area_free_cb, data, length);
  709|      0|	}
  710|    480|	else if (profile_type == heif_color_profile_type_nclx) {
  ------------------
  |  Branch (710:11): [True: 1, False: 479]
  ------------------
  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|    480|#endif /*HAVE_HEIF_COLOR_PROFILE*/
  714|       |
  715|    480|	vips_image_set_int(out, "heif-primary", heif->primary_page);
  716|    480|	vips_image_set_int(out, VIPS_META_N_PAGES, heif->n_top);
  ------------------
  |  |  165|    480|#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|    480|	if (heif->n > 1)
  ------------------
  |  Branch (721:6): [True: 0, False: 480]
  ------------------
  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|    480|	compression = VIPS_FOREIGN_HEIF_COMPRESSION_HEVC;
  728|       |
  729|    480|#ifdef HAVE_HEIF_AVIF
  730|    480|	{
  731|    480|		const unsigned char *brand_data;
  732|       |
  733|    480|		if ((brand_data = vips_source_sniff(heif->source, 12))) {
  ------------------
  |  Branch (733:7): [True: 480, False: 0]
  ------------------
  734|    480|			enum heif_brand brand;
  735|    480|			brand = heif_main_brand(brand_data, 12);
  736|    480|			if (brand == heif_avif ||
  ------------------
  |  Branch (736:8): [True: 427, False: 53]
  ------------------
  737|    480|				brand == heif_avis)
  ------------------
  |  Branch (737:5): [True: 0, False: 53]
  ------------------
  738|    427|				compression = VIPS_FOREIGN_HEIF_COMPRESSION_AV1;
  739|    480|		}
  740|    480|	}
  741|    480|#endif /*HAVE_HEIF_AVIF*/
  742|       |
  743|    480|	vips_image_set_string(out, "heif-compression",
  744|    480|		vips_enum_nick(VIPS_TYPE_FOREIGN_HEIF_COMPRESSION,
  ------------------
  |  |  129|    480|#define VIPS_TYPE_FOREIGN_HEIF_COMPRESSION (vips_foreign_heif_compression_get_type())
  ------------------
  745|    480|			compression));
  746|       |
  747|    480|	vips_image_set_int(out, VIPS_META_BITS_PER_SAMPLE, heif->bits_per_pixel);
  ------------------
  |  |  100|    480|#define VIPS_META_BITS_PER_SAMPLE "bits-per-sample"
  ------------------
  748|       |
  749|       |	/* Deprecated "heif-bitdepth" use "bits-per-sample" instead.
  750|       |	 */
  751|    480|	vips_image_set_int(out, "heif-bitdepth", heif->bits_per_pixel);
  752|       |
  753|    480|	if (heif->bits_per_pixel > 8) {
  ------------------
  |  Branch (753:6): [True: 435, False: 45]
  ------------------
  754|    435|		interpretation = VIPS_INTERPRETATION_RGB16;
  755|    435|		format = VIPS_FORMAT_USHORT;
  756|    435|	}
  757|     45|	else {
  758|     45|		interpretation = VIPS_INTERPRETATION_sRGB;
  759|     45|		format = VIPS_FORMAT_UCHAR;
  760|     45|	}
  761|       |
  762|       |	/* FIXME .. we always decode to RGB in generate. We should check for
  763|       |	 * all grey images, perhaps.
  764|       |	 */
  765|    480|	if (vips_image_pipelinev(out, VIPS_DEMAND_STYLE_THINSTRIP, NULL))
  ------------------
  |  Branch (765:6): [True: 0, False: 480]
  ------------------
  766|      0|		return -1;
  767|    480|	vips_image_init_fields(out,
  768|    480|		heif->page_width, heif->page_height * heif->n, bands,
  769|    480|		format, VIPS_CODING_NONE, interpretation,
  770|    480|		1.0, 1.0);
  771|       |
  772|    480|	VIPS_SETSTR(load->out->filename,
  ------------------
  |  |   53|    480|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|    480|#define G_STMT_START  do
  |  |  ------------------
  |  |   54|    480|	{ \
  |  |   55|    480|		const char *sst = (V); \
  |  |   56|    480|		\
  |  |   57|    480|		if ((S) != sst) { \
  |  |  ------------------
  |  |  |  Branch (57:7): [True: 249, False: 231]
  |  |  ------------------
  |  |   58|    249|			if (!(S) || !sst || strcmp((S), sst) != 0) { \
  |  |  ------------------
  |  |  |  Branch (58:8): [True: 0, False: 249]
  |  |  |  Branch (58:16): [True: 249, False: 0]
  |  |  |  Branch (58:24): [True: 0, False: 0]
  |  |  ------------------
  |  |   59|    249|				VIPS_FREE(S); \
  |  |  ------------------
  |  |  |  |   50|    249|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  |  |  ------------------
  |  |  |  |  |  |   41|    249|	G_STMT_START \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  854|    249|#define G_STMT_START  do
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   42|    249|	{ \
  |  |  |  |  |  |   43|    249|		if (S) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (43:7): [True: 249, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   44|    249|			(void) F((S)); \
  |  |  |  |  |  |   45|    249|			(S) = 0; \
  |  |  |  |  |  |   46|    249|		} \
  |  |  |  |  |  |   47|    249|	} \
  |  |  |  |  |  |   48|    249|	G_STMT_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  862|    249|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   60|    249|				if (sst) \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 0, False: 249]
  |  |  ------------------
  |  |   61|    249|					(S) = g_strdup(sst); \
  |  |   62|    249|			} \
  |  |   63|    249|		} \
  |  |   64|    480|	} \
  |  |   65|    480|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    480|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  773|    480|		vips_connection_filename(VIPS_CONNECTION(heif->source)));
  774|       |
  775|    480|	return 0;
  776|    480|}
heifload.c:vips_foreign_load_heif_load:
 1030|    231|{
 1031|    231|	VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) load;
 1032|       |
 1033|    231|	VipsImage **t = (VipsImage **)
 1034|    231|		vips_object_local_array(VIPS_OBJECT(load), 3);
  ------------------
  |  |  433|    231|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|    231|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|    231|#  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|    231|	t[0] = vips_image_new();
 1041|    231|	if (vips_foreign_load_heif_set_header(heif, t[0]))
  ------------------
  |  Branch (1041:6): [True: 0, False: 231]
  ------------------
 1042|      0|		return -1;
 1043|       |
 1044|       |	/* Close input immediately at end of read.
 1045|       |	 */
 1046|    231|	g_signal_connect(t[0], "minimise",
  ------------------
  |  |  491|    231|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
 1047|    231|		G_CALLBACK(vips_foreign_load_heif_minimise), heif);
 1048|       |
 1049|    231|	if (vips_image_generate(t[0],
  ------------------
  |  Branch (1049:6): [True: 0, False: 231]
  ------------------
 1050|    231|			NULL, vips_foreign_load_heif_generate, NULL, heif, NULL) ||
 1051|    231|		vips_sequential(t[0], &t[1], NULL) ||
  ------------------
  |  Branch (1051:3): [True: 0, False: 231]
  ------------------
 1052|    231|		vips_image_write(t[1], load->real))
  ------------------
  |  Branch (1052:3): [True: 231, False: 0]
  ------------------
 1053|    231|		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|    462|{
 1025|    462|	vips_source_minimise(heif->source);
 1026|    462|}
heifload.c:vips_foreign_load_heif_generate:
  930|    231|{
  931|    231|	VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) a;
  932|    231|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(heif);
  ------------------
  |  |  441|    231|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|    231|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|    231|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  933|    231|	VipsRect *r = &out_region->valid;
  934|       |
  935|    231|	int page = r->top / heif->page_height + heif->page;
  936|    231|	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|    231|	g_assert(r->height == 1);
  ------------------
  |  |  166|    231|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|    231|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|    231|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  943|       |
  944|    231|	if (vips_foreign_load_heif_set_page(heif, page, heif->thumbnail))
  ------------------
  |  Branch (944:6): [True: 0, False: 231]
  ------------------
  945|      0|		return -1;
  946|       |
  947|    231|	if (!heif->img) {
  ------------------
  |  Branch (947:6): [True: 231, False: 0]
  ------------------
  948|    231|		enum heif_chroma chroma =
  949|    231|			vips__heif_chroma(heif->bits_per_pixel, heif->has_alpha);
  950|       |
  951|    231|		struct heif_error error;
  952|    231|		struct heif_decoding_options *options;
  953|       |
  954|    231|		options = heif_decoding_options_alloc();
  955|    231|		error = heif_decode_image(heif->handle, &heif->img,
  956|    231|			heif_colorspace_RGB,
  957|    231|			chroma,
  958|    231|			options);
  959|    231|		heif_decoding_options_free(options);
  960|    231|		if (error.code) {
  ------------------
  |  Branch (960:7): [True: 231, False: 0]
  ------------------
  961|    231|			vips__heif_error(&error);
  962|    231|			return -1;
  963|    231|		}
  964|       |
  965|       |#ifdef DEBUG
  966|       |		vips__heif_image_print(heif->img);
  967|       |#endif /*DEBUG*/
  968|    231|	}
  969|       |
  970|      0|	if (!heif->data) {
  ------------------
  |  Branch (970:6): [True: 0, False: 0]
  ------------------
  971|      0|		int image_width = heif_image_get_width(heif->img,
  972|      0|			heif_channel_interleaved);
  973|      0|		int image_height = heif_image_get_height(heif->img,
  974|      0|			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|      0|		if (image_width != heif->page_width ||
  ------------------
  |  Branch (980:7): [True: 0, False: 0]
  ------------------
  981|      0|			image_height != heif->page_height) {
  ------------------
  |  Branch (981:4): [True: 0, False: 0]
  ------------------
  982|      0|			vips_error(class->nickname,
  983|      0|				"%s", _("bad image dimensions on decode"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  984|      0|			return -1;
  985|      0|		}
  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|      0|}
heifload.c:vips_foreign_load_heif_init:
 1195|  1.68k|{
 1196|  1.68k|	heif->n = 1;
 1197|       |
 1198|  1.68k|	heif->reader = VIPS_ARRAY(NULL, 1, struct heif_reader);
  ------------------
  |  |   72|  1.68k|	((T *) VIPS_MALLOC(OBJ, (N) * sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  1.68k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  1.68k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  1.68k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  1.68k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1199|       |
 1200|       |	/* The first version to support heif_reader.
 1201|       |	 */
 1202|  1.68k|	heif->reader->reader_api_version = 1;
 1203|  1.68k|	heif->reader->get_position = vips_foreign_load_heif_get_position;
 1204|  1.68k|	heif->reader->read = vips_foreign_load_heif_read;
 1205|  1.68k|	heif->reader->seek = vips_foreign_load_heif_seek;
 1206|  1.68k|	heif->reader->wait_for_file_size =
 1207|  1.68k|		vips_foreign_load_heif_wait_for_file_size;
 1208|  1.68k|}
heifload.c:vips_foreign_load_heif_get_position:
 1122|  76.7k|{
 1123|  76.7k|	VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) userdata;
 1124|       |
 1125|  76.7k|	return vips_source_seek(heif->source, 0L, SEEK_CUR);
 1126|  76.7k|}
heifload.c:vips_foreign_load_heif_read:
 1135|   185k|{
 1136|   185k|	VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) userdata;
 1137|       |
 1138|   367k|	while (size > 0) {
  ------------------
  |  Branch (1138:9): [True: 182k, False: 185k]
  ------------------
 1139|   182k|		gint64 bytes_read;
 1140|       |
 1141|   182k|		bytes_read = vips_source_read(heif->source, data, size);
 1142|   182k|		if (bytes_read <= 0)
  ------------------
  |  Branch (1142:7): [True: 17, False: 182k]
  ------------------
 1143|     17|			return -1;
 1144|       |
 1145|   182k|		size -= bytes_read;
 1146|   182k|		data = (char *) data + bytes_read;
 1147|   182k|	}
 1148|       |
 1149|   185k|	return 0;
 1150|   185k|}
heifload.c:vips_foreign_load_heif_seek:
 1154|  56.8k|{
 1155|  56.8k|	VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) userdata;
 1156|       |
 1157|       |	/* Return 0 on success.
 1158|       |	 */
 1159|  56.8k|	return vips_source_seek(heif->source, position, SEEK_SET) == -1;
 1160|  56.8k|}
heifload.c:vips_foreign_load_heif_wait_for_file_size:
 1167|  75.2k|{
 1168|  75.2k|	VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) userdata;
 1169|       |
 1170|  75.2k|	gint64 old_position;
 1171|  75.2k|	gint64 result;
 1172|  75.2k|	enum heif_reader_grow_status status;
 1173|       |
 1174|       |	/* We seek the VipsSource to the position and check for errors.
 1175|       |	 */
 1176|  75.2k|	old_position = vips_source_seek(heif->source, 0L, SEEK_CUR);
 1177|  75.2k|	result = vips_source_seek(heif->source, target_size, SEEK_SET);
 1178|  75.2k|	vips_source_seek(heif->source, old_position, SEEK_SET);
 1179|       |
 1180|  75.2k|	if (result < 0)
  ------------------
  |  Branch (1180:6): [True: 911, False: 74.3k]
  ------------------
 1181|       |		/* Unable to seek to this point, so it's beyond EOF.
 1182|       |		 */
 1183|    911|		status = heif_reader_grow_status_size_beyond_eof;
 1184|  74.3k|	else
 1185|       |		/* Successfully read to the requested point, but the requested
 1186|       |		 * point is not necessarily EOF.
 1187|       |		 */
 1188|  74.3k|		status = heif_reader_grow_status_size_reached;
 1189|       |
 1190|  75.2k|	return status;
 1191|  75.2k|}
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|  8.31k|{
  394|  8.31k|	if (len >= 12) {
  ------------------
  |  Branch (394:6): [True: 8.01k, False: 302]
  ------------------
  395|  8.01k|		unsigned char *p = (unsigned char *) buf;
  396|  8.01k|		guint32 chunk_len =
  397|  8.01k|			VIPS_LSHIFT_INT(p[0], 24) |
  ------------------
  |  |   87|  8.01k|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  ------------------
  398|  8.01k|			VIPS_LSHIFT_INT(p[1], 16) |
  ------------------
  |  |   87|  8.01k|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  ------------------
  399|  8.01k|			VIPS_LSHIFT_INT(p[2], 8) |
  ------------------
  |  |   87|  8.01k|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  ------------------
  400|  8.01k|			VIPS_LSHIFT_INT(p[3], 0);
  ------------------
  |  |   87|  8.01k|#define VIPS_LSHIFT_INT(I, N) ((int) ((unsigned int) (I) << (N)))
  ------------------
  401|       |
  402|  8.01k|		int i;
  403|       |
  404|       |		/* chunk_len can be pretty big for eg. animated AVIF.
  405|       |		 */
  406|  8.01k|		if (chunk_len > 2048 ||
  ------------------
  |  Branch (406:7): [True: 6.28k, False: 1.72k]
  ------------------
  407|  8.01k|			chunk_len % 4 != 0)
  ------------------
  |  Branch (407:4): [True: 5, False: 1.72k]
  ------------------
  408|  6.29k|			return 0;
  409|       |
  410|  14.8k|		for (i = 0; i < VIPS_NUMBER(heif_magic); i++)
  ------------------
  |  |   60|  14.8k|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (410:15): [True: 14.8k, False: 40]
  ------------------
  411|  14.8k|			if (strncmp(buf + 4, heif_magic[i], 8) == 0)
  ------------------
  |  Branch (411:8): [True: 1.68k, False: 13.1k]
  ------------------
  412|  1.68k|				return 1;
  413|  1.72k|	}
  414|       |
  415|    342|	return 0;
  416|  8.31k|}
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|  1.68k|{
 1300|  1.68k|	VipsForeignLoadHeif *heif = (VipsForeignLoadHeif *) object;
 1301|  1.68k|	VipsForeignLoadHeifBuffer *buffer =
 1302|  1.68k|		(VipsForeignLoadHeifBuffer *) object;
 1303|       |
 1304|  1.68k|	if (buffer->buf &&
  ------------------
  |  Branch (1304:6): [True: 1.68k, False: 0]
  ------------------
 1305|  1.68k|		!(heif->source = vips_source_new_from_memory(
  ------------------
  |  Branch (1305:3): [True: 0, False: 1.68k]
  ------------------
 1306|  1.68k|			VIPS_AREA(buffer->buf)->data,
  ------------------
  |  |  137|  1.68k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
 1307|  1.68k|			VIPS_AREA(buffer->buf)->length)))
  ------------------
  |  |  137|  1.68k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
 1308|      0|		return -1;
 1309|       |
 1310|  1.68k|	if (VIPS_OBJECT_CLASS(vips_foreign_load_heif_file_parent_class)
  ------------------
  |  |  435|  1.68k|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  1.68k|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  1.68k|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1310:6): [True: 1.43k, False: 249]
  ------------------
 1311|  1.68k|			->build(object))
 1312|  1.43k|		return -1;
 1313|       |
 1314|    249|	return 0;
 1315|  1.68k|}
heifload.c:vips_foreign_load_heif_buffer_is_a:
 1319|  8.31k|{
 1320|  8.31k|	return vips_foreign_load_heif_is_a(buf, len);
 1321|  8.31k|}
heifload.c:vips_foreign_load_heif_buffer_init:
 1349|  1.68k|{
 1350|  1.68k|}
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__foreign_load_jp2k_decompress:
 1598|      1|{
 1599|      1|	vips_error("jp2k",
 1600|      1|		"%s", _("libvips built without JPEG2000 support"));
  ------------------
  |  |   30|      1|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      1|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1601|      1|	return -1;
 1602|      1|}

vips__jpeg_read_source:
 1054|  10.9k|{
 1055|  10.9k|	ReadJpeg *jpeg;
 1056|       |
 1057|  10.9k|	if (!(jpeg = readjpeg_new(source, out, shrink, fail_on,
  ------------------
  |  Branch (1057:6): [True: 0, False: 10.9k]
  ------------------
 1058|  10.9k|			  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|  10.9k|	if (setjmp(jpeg->eman.jmp))
 1065|  1.00k|		return -1;
 1066|       |
 1067|  9.98k|	if (readjpeg_open_input(jpeg) ||
  ------------------
  |  Branch (1067:6): [True: 18.4E, False: 10.9k]
  ------------------
 1068|  10.9k|		vips__jpeg_read(jpeg, out, header_only))
  ------------------
  |  Branch (1068:3): [True: 3.79k, False: 7.19k]
  ------------------
 1069|  2.79k|		return -1;
 1070|       |
 1071|  7.19k|	if (header_only)
  ------------------
  |  Branch (1071:6): [True: 5.42k, False: 1.77k]
  ------------------
 1072|  5.42k|		vips_source_minimise(source);
 1073|       |
 1074|  7.19k|	return 0;
 1075|  9.98k|}
vips__isjpeg_source:
 1079|  25.4k|{
 1080|  25.4k|	const unsigned char *p;
 1081|       |
 1082|  25.4k|	if ((p = vips_source_sniff(source, 2)) &&
  ------------------
  |  Branch (1082:6): [True: 25.4k, False: 12]
  ------------------
 1083|  25.4k|		p[0] == 0xff &&
  ------------------
  |  Branch (1083:3): [True: 6.47k, False: 18.9k]
  ------------------
 1084|  25.4k|		p[1] == 0xd8)
  ------------------
  |  Branch (1084:3): [True: 6.42k, False: 50]
  ------------------
 1085|  6.42k|		return 1;
 1086|       |
 1087|  19.0k|	return 0;
 1088|  25.4k|}
jpeg2vips.c:readjpeg_new:
  454|  10.9k|{
  455|  10.9k|	ReadJpeg *jpeg;
  456|       |
  457|  10.9k|	if (!(jpeg = VIPS_NEW(out, ReadJpeg)))
  ------------------
  |  |   70|  10.9k|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  10.9k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  10.9k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  10.9k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  10.9k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (457:6): [True: 0, False: 10.9k]
  ------------------
  458|      0|		return NULL;
  459|       |
  460|  10.9k|	jpeg->out = out;
  461|  10.9k|	jpeg->source = source;
  462|  10.9k|	g_object_ref(source);
  463|  10.9k|	jpeg->shrink = shrink;
  464|  10.9k|	jpeg->fail_on = fail_on;
  465|  10.9k|	jpeg->cinfo.err = jpeg_std_error(&jpeg->eman.pub);
  466|  10.9k|	jpeg->cinfo.err->addon_message_table = vips__jpeg_message_table;
  467|  10.9k|	jpeg->cinfo.err->first_addon_message = 1000;
  468|  10.9k|	jpeg->cinfo.err->last_addon_message = 1001;
  469|  10.9k|	jpeg->eman.pub.error_exit = vips__new_error_exit;
  470|  10.9k|	jpeg->eman.pub.emit_message = readjpeg_emit_message;
  471|  10.9k|	jpeg->eman.pub.output_message = vips__new_output_message;
  472|  10.9k|	jpeg->eman.fp = NULL;
  473|  10.9k|	jpeg->autorotate = autorotate;
  474|  10.9k|	jpeg->unlimited = unlimited;
  475|  10.9k|	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|  10.9k|	if (setjmp(jpeg->eman.jmp))
  481|      0|		return NULL;
  482|       |
  483|  10.9k|	jpeg_create_decompress(&jpeg->cinfo);
  ------------------
  |  |  972|  10.9k|  jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \
  |  |  ------------------
  |  |  |  |    4|  10.9k|#define JPEG_LIB_VERSION  62
  |  |  ------------------
  |  |  973|  10.9k|                        (size_t)sizeof(struct jpeg_decompress_struct))
  ------------------
  484|       |
  485|  10.9k|	g_signal_connect(out, "close",
  ------------------
  |  |  491|  10.9k|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  486|  10.9k|		G_CALLBACK(readjpeg_close_cb), jpeg);
  487|  10.9k|	g_signal_connect(out, "minimise",
  ------------------
  |  |  491|  10.9k|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
  488|  10.9k|		G_CALLBACK(readjpeg_minimise_cb), jpeg);
  489|       |
  490|  10.9k|	return jpeg;
  491|  10.9k|}
jpeg2vips.c:readjpeg_emit_message:
  383|   304k|{
  384|   304k|	ReadJpeg *jpeg = (ReadJpeg *) cinfo->client_data;
  385|       |
  386|   304k|	long num_warnings;
  387|       |
  388|   304k|	if (msg_level < 0) {
  ------------------
  |  Branch (388:6): [True: 96.4k, False: 208k]
  ------------------
  389|       |		/* Always count warnings in num_warnings.
  390|       |		 */
  391|  96.4k|		num_warnings = ++cinfo->err->num_warnings;
  392|       |
  393|       |		/* Corrupt files may give many warnings, the policy here is to
  394|       |		 * show only the first warning and treat many warnings as fatal,
  395|       |		 * unless unlimited is set.
  396|       |		 */
  397|  96.4k|		if (num_warnings == 1)
  ------------------
  |  Branch (397:7): [True: 10.7k, False: 85.7k]
  ------------------
  398|  10.7k|			(*cinfo->err->output_message)(cinfo);
  399|  85.7k|		else if (!jpeg ||
  ------------------
  |  Branch (399:12): [True: 0, False: 85.7k]
  ------------------
  400|  85.7k|			(!jpeg->unlimited && num_warnings >= 100))
  ------------------
  |  Branch (400:5): [True: 85.7k, False: 0]
  |  Branch (400:25): [True: 179, False: 85.5k]
  ------------------
  401|    179|			cinfo->err->error_exit(cinfo);
  402|  96.4k|	}
  403|   208k|	else if (cinfo->err->trace_level >= msg_level)
  ------------------
  |  Branch (403:11): [True: 0, False: 208k]
  ------------------
  404|       |		/* It's a trace message. Show it if trace_level >= msg_level.
  405|       |		 */
  406|      0|		(*cinfo->err->output_message)(cinfo);
  407|   304k|}
jpeg2vips.c:readjpeg_close_cb:
  440|  10.9k|{
  441|  10.9k|	(void) readjpeg_free(jpeg);
  442|  10.9k|}
jpeg2vips.c:readjpeg_free:
  413|  10.9k|{
  414|  10.9k|	if (jpeg->eman.pub.num_warnings != 0) {
  ------------------
  |  Branch (414:6): [True: 10.7k, False: 246]
  ------------------
  415|  10.7k|		g_warning(_("read gave %ld warnings"),
  ------------------
  |  |  338|  10.7k|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|  10.7k|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|  10.7k|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|  10.7k|                               __VA_ARGS__)
  ------------------
  416|  10.7k|			jpeg->eman.pub.num_warnings);
  417|  10.7k|		g_warning("%s", vips_error_buffer());
  ------------------
  |  |  338|  10.7k|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|  10.7k|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|  10.7k|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|  10.7k|                               __VA_ARGS__)
  ------------------
  418|       |
  419|       |		/* Make the message only appear once.
  420|       |		 */
  421|  10.7k|		jpeg->eman.pub.num_warnings = 0;
  422|  10.7k|	}
  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|  10.9k|	jpeg_destroy_decompress(&jpeg->cinfo);
  432|       |
  433|  10.9k|	VIPS_UNREF(jpeg->source);
  ------------------
  |  |   57|  10.9k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  10.9k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  10.9k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  10.9k|	{ \
  |  |  |  |   43|  10.9k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 10.9k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  10.9k|			(void) F((S)); \
  |  |  |  |   45|  10.9k|			(S) = 0; \
  |  |  |  |   46|  10.9k|		} \
  |  |  |  |   47|  10.9k|	} \
  |  |  |  |   48|  10.9k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  10.9k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  434|       |
  435|  10.9k|	return 0;
  436|  10.9k|}
jpeg2vips.c:readjpeg_minimise_cb:
  446|  18.4k|{
  447|  18.4k|	vips_source_minimise(jpeg->source);
  448|  18.4k|}
jpeg2vips.c:readjpeg_open_input:
  328|  10.9k|{
  329|  10.9k|	j_decompress_ptr cinfo = &jpeg->cinfo;
  330|       |
  331|  10.9k|	if (jpeg->source &&
  ------------------
  |  Branch (331:6): [True: 10.9k, False: 0]
  ------------------
  332|  10.9k|		!cinfo->src) {
  ------------------
  |  Branch (332:3): [True: 10.9k, False: 0]
  ------------------
  333|  10.9k|		Source *src;
  334|       |
  335|  10.9k|		if (vips_source_rewind(jpeg->source))
  ------------------
  |  Branch (335:7): [True: 0, False: 10.9k]
  ------------------
  336|      0|			return -1;
  337|       |
  338|  10.9k|		cinfo->src =
  339|  10.9k|			(struct jpeg_source_mgr *) (*cinfo->mem->alloc_small)(
  340|  10.9k|				(j_common_ptr) cinfo,
  341|  10.9k|				JPOOL_PERMANENT,
  ------------------
  |  |  888|  10.9k|#define JPOOL_PERMANENT  0      /* lasts until master record is destroyed */
  ------------------
  342|  10.9k|				sizeof(Source));
  343|       |
  344|  10.9k|		src = (Source *) cinfo->src;
  345|  10.9k|		src->jpeg = jpeg;
  346|  10.9k|		src->source = jpeg->source;
  347|  10.9k|		src->pub.init_source = source_init_source;
  348|       |
  349|       |		/* Use default method.
  350|       |		 */
  351|  10.9k|		src->pub.resync_to_restart = jpeg_resync_to_restart;
  352|       |
  353|  10.9k|		if (vips_source_is_mappable(jpeg->source)) {
  ------------------
  |  Branch (353:7): [True: 10.9k, False: 0]
  ------------------
  354|  10.9k|			size_t src_len;
  355|  10.9k|			const unsigned char *src_data = vips_source_map(
  356|  10.9k|				jpeg->source, &src_len);
  357|       |
  358|  10.9k|			src->pub.fill_input_buffer =
  359|  10.9k|				source_fill_input_buffer_mappable;
  360|  10.9k|			src->pub.skip_input_data = skip_input_data_mappable;
  361|  10.9k|			src->pub.bytes_in_buffer = src_len;
  362|  10.9k|			src->pub.next_input_byte = src_data;
  363|  10.9k|		}
  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|  10.9k|	}
  377|       |
  378|  10.9k|	return 0;
  379|  10.9k|}
jpeg2vips.c:source_init_source:
  228|  10.9k|{
  229|       |	/* No work necessary here.
  230|       |	 */
  231|  10.9k|}
jpeg2vips.c:source_fill_input_buffer_mappable:
  268|  19.6k|{
  269|  19.6k|	Source *src = (Source *) cinfo->src;
  270|       |
  271|  19.6k|	if (src->jpeg->fail_on >= VIPS_FAIL_ON_TRUNCATED) {
  ------------------
  |  Branch (271:6): [True: 0, False: 19.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|  19.6k|	else
  278|  19.6k|		WARNMS(cinfo, JWRN_VIPS_IMAGE_EOF);
  ------------------
  |  |  283|  19.6k|  ((cinfo)->err->msg_code = (code), \
  |  |  284|  19.6k|   (*(cinfo)->err->emit_message) ((j_common_ptr)(cinfo), -1))
  ------------------
  279|       |
  280|       |	/* Insert a fake EOI marker.
  281|       |	 */
  282|  19.6k|	src->buf[0] = (JOCTET) 0xFF;
  283|  19.6k|	src->buf[1] = (JOCTET) JPEG_EOI;
  ------------------
  |  | 1167|  19.6k|#define JPEG_EOI        0xD9    /* EOI marker code */
  ------------------
  284|       |
  285|  19.6k|	src->pub.next_input_byte = src->buf;
  286|  19.6k|	src->pub.bytes_in_buffer = 2;
  287|       |
  288|  19.6k|	return TRUE;
  ------------------
  |  |  209|  19.6k|#define TRUE    1
  ------------------
  289|  19.6k|}
jpeg2vips.c:skip_input_data_mappable:
  313|  4.53k|{
  314|  4.53k|	Source *src = (Source *) cinfo->src;
  315|       |
  316|  4.53k|	if (num_bytes > (long) src->pub.bytes_in_buffer) {
  ------------------
  |  Branch (316:6): [True: 222, False: 4.31k]
  ------------------
  317|    222|		src->pub.next_input_byte += src->pub.bytes_in_buffer;
  318|    222|		src->pub.bytes_in_buffer = 0;
  319|    222|	}
  320|  4.31k|	else {
  321|  4.31k|		src->pub.next_input_byte += (size_t) num_bytes;
  322|  4.31k|		src->pub.bytes_in_buffer -= (size_t) num_bytes;
  323|  4.31k|	}
  324|  4.53k|}
jpeg2vips.c:vips__jpeg_read:
 1002|  10.9k|{
 1003|       |	/* Need to read in APP1 (EXIF metadata), APP2 (ICC profile), APP13
 1004|       |	 * (photoshop IPTC) and APP14 (Adobe flags).
 1005|       |	 */
 1006|  10.9k|	jpeg_save_markers(&jpeg->cinfo, JPEG_APP0 + 1, 0xffff);
  ------------------
  |  | 1168|  10.9k|#define JPEG_APP0       0xE0    /* APP0 marker code */
  ------------------
 1007|  10.9k|	jpeg_save_markers(&jpeg->cinfo, JPEG_APP0 + 2, 0xffff);
  ------------------
  |  | 1168|  10.9k|#define JPEG_APP0       0xE0    /* APP0 marker code */
  ------------------
 1008|  10.9k|	jpeg_save_markers(&jpeg->cinfo, JPEG_APP0 + 13, 0xffff);
  ------------------
  |  | 1168|  10.9k|#define JPEG_APP0       0xE0    /* APP0 marker code */
  ------------------
 1009|  10.9k|	jpeg_save_markers(&jpeg->cinfo, JPEG_APP0 + 14, 0xffff);
  ------------------
  |  | 1168|  10.9k|#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|  10.9k|	if (header_only) {
  ------------------
  |  Branch (1024:6): [True: 6.42k, False: 4.56k]
  ------------------
 1025|  6.42k|		if (read_jpeg_header(jpeg, out))
  ------------------
  |  Branch (1025:7): [True: 0, False: 6.42k]
  ------------------
 1026|      0|			return -1;
 1027|       |
 1028|       |		/* Patch in the correct size.
 1029|       |		 */
 1030|  6.42k|		out->Xsize = jpeg->output_width;
 1031|  6.42k|		out->Ysize = jpeg->output_height;
 1032|       |
 1033|       |		/* Swap width and height if we're going to rotate this image.
 1034|       |		 */
 1035|  6.42k|		if (jpeg->autorotate) {
  ------------------
  |  Branch (1035:7): [True: 0, False: 6.42k]
  ------------------
 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|  6.42k|	}
 1042|  4.56k|	else {
 1043|  4.56k|		if (read_jpeg_image(jpeg, out))
  ------------------
  |  Branch (1043:7): [True: 2.79k, False: 1.77k]
  ------------------
 1044|  2.79k|			return -1;
 1045|  4.56k|	}
 1046|       |
 1047|  8.19k|	return 0;
 1048|  10.9k|}
jpeg2vips.c:read_jpeg_header:
  571|  10.9k|{
  572|  10.9k|	struct jpeg_decompress_struct *cinfo = &jpeg->cinfo;
  573|       |
  574|  10.9k|	jpeg_saved_marker_ptr p;
  575|  10.9k|	VipsInterpretation interpretation;
  576|  10.9k|	double xres, yres;
  577|       |
  578|       |	/* Capture app2 sections here for assembly.
  579|       |	 */
  580|  10.9k|	void *app2_data[MAX_APP2_SECTIONS] = { 0 };
  581|  10.9k|	size_t app2_data_length[MAX_APP2_SECTIONS] = { 0 };
  582|  10.9k|	size_t data_length;
  583|  10.9k|	int i;
  584|       |
  585|       |	/* Read JPEG header. libjpeg will set out_color_space sanely for us
  586|       |	 * for YUV YCCK etc.
  587|       |	 */
  588|  10.9k|	jpeg_read_header(cinfo, TRUE);
  ------------------
  |  |  209|  10.9k|#define TRUE    1
  ------------------
  589|  10.9k|	cinfo->scale_denom = jpeg->shrink;
  590|  10.9k|	cinfo->scale_num = 1;
  591|  10.9k|	jpeg_calc_output_dimensions(cinfo);
  592|       |
  593|  10.9k|	jpeg->invert_pels = FALSE;
  ------------------
  |  |  206|  10.9k|#define FALSE   0               /* values of boolean */
  ------------------
  594|  10.9k|	switch (cinfo->out_color_space) {
  595|  3.20k|	case JCS_GRAYSCALE:
  ------------------
  |  Branch (595:2): [True: 3.20k, False: 7.78k]
  ------------------
  596|  3.20k|		interpretation = VIPS_INTERPRETATION_B_W;
  597|  3.20k|		break;
  598|       |
  599|  1.36k|	case JCS_CMYK:
  ------------------
  |  Branch (599:2): [True: 1.36k, False: 9.63k]
  ------------------
  600|  1.36k|		interpretation = VIPS_INTERPRETATION_CMYK;
  601|       |
  602|       |		/* CMYKs are almost always returned inverted, but see below.
  603|       |		 */
  604|  1.36k|		jpeg->invert_pels = TRUE;
  ------------------
  |  |  209|  1.36k|#define TRUE    1
  ------------------
  605|  1.36k|		break;
  606|       |
  607|  4.99k|	case JCS_RGB:
  ------------------
  |  Branch (607:2): [True: 4.99k, False: 5.99k]
  ------------------
  608|  5.42k|	default:
  ------------------
  |  Branch (608:2): [True: 430, False: 10.5k]
  ------------------
  609|  5.42k|		interpretation = VIPS_INTERPRETATION_sRGB;
  610|  5.42k|		break;
  611|  10.9k|	}
  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|  9.98k|	xres = 72.0 / 25.4;
  624|  9.98k|	yres = 72.0 / 25.4;
  625|  9.98k|	if (cinfo->saw_JFIF_marker &&
  ------------------
  |  Branch (625:6): [True: 501, False: 9.48k]
  ------------------
  626|  9.98k|		cinfo->X_density != 1U &&
  ------------------
  |  Branch (626:3): [True: 494, False: 7]
  ------------------
  627|  9.98k|		cinfo->Y_density != 1U) {
  ------------------
  |  Branch (627:3): [True: 489, False: 5]
  ------------------
  628|    489|		switch (cinfo->density_unit) {
  629|     32|		case 0:
  ------------------
  |  Branch (629:3): [True: 32, False: 457]
  ------------------
  630|       |			/* X_density / Y_density gives the pixel aspect ratio.
  631|       |			 * Leave xres, but adjust yres.
  632|       |			 */
  633|     32|			if (cinfo->Y_density > 0)
  ------------------
  |  Branch (633:8): [True: 22, False: 10]
  ------------------
  634|     22|				yres = xres * cinfo->X_density /
  635|     22|					cinfo->Y_density;
  636|     32|			break;
  637|       |
  638|     32|		case 1:
  ------------------
  |  Branch (638:3): [True: 32, False: 457]
  ------------------
  639|       |			/* Pixels per inch.
  640|       |			 */
  641|     32|			xres = cinfo->X_density / 25.4;
  642|     32|			yres = cinfo->Y_density / 25.4;
  643|     32|			vips_image_set_string(out,
  644|     32|				VIPS_META_RESOLUTION_UNIT, "in");
  ------------------
  |  |   93|     32|#define VIPS_META_RESOLUTION_UNIT "resolution-unit"
  ------------------
  645|     32|			break;
  646|       |
  647|    362|		case 2:
  ------------------
  |  Branch (647:3): [True: 362, False: 127]
  ------------------
  648|       |			/* Pixels per cm.
  649|       |			 */
  650|    362|			xres = cinfo->X_density / 10.0;
  651|    362|			yres = cinfo->Y_density / 10.0;
  652|    362|			vips_image_set_string(out,
  653|    362|				VIPS_META_RESOLUTION_UNIT, "cm");
  ------------------
  |  |   93|    362|#define VIPS_META_RESOLUTION_UNIT "resolution-unit"
  ------------------
  654|    362|			break;
  655|       |
  656|     63|		default:
  ------------------
  |  Branch (656:3): [True: 63, False: 426]
  ------------------
  657|     63|			g_warning("%s", _("unknown JFIF resolution unit"));
  ------------------
  |  |  338|     63|#define g_warning(...)  g_log (G_LOG_DOMAIN,         \
  |  |  ------------------
  |  |  |  |   12|     63|#define G_LOG_DOMAIN "VIPS"
  |  |  ------------------
  |  |  339|     63|                               G_LOG_LEVEL_WARNING,  \
  |  |  340|     63|                               __VA_ARGS__)
  ------------------
  658|     63|			break;
  659|    489|		}
  660|       |
  661|       |#ifdef DEBUG
  662|       |		printf("read_jpeg_header: seen jfif resolution %g, %g p/mm\n",
  663|       |			xres, yres);
  664|       |#endif /*DEBUG*/
  665|    489|	}
  666|       |
  667|       |	/* Set VIPS header.
  668|       |	 */
  669|  9.98k|	vips_image_init_fields(out,
  670|  9.98k|		cinfo->output_width, cinfo->output_height,
  671|  9.98k|		cinfo->output_components,
  672|  9.98k|		VIPS_FORMAT_UCHAR, VIPS_CODING_NONE,
  673|  9.98k|		interpretation,
  674|  9.98k|		xres, yres);
  675|       |
  676|  9.98k|	VIPS_SETSTR(out->filename,
  ------------------
  |  |   53|  9.98k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  9.98k|#define G_STMT_START  do
  |  |  ------------------
  |  |   54|  9.98k|	{ \
  |  |   55|  9.98k|		const char *sst = (V); \
  |  |   56|  9.98k|		\
  |  |   57|  9.98k|		if ((S) != sst) { \
  |  |  ------------------
  |  |  |  Branch (57:7): [True: 9.98k, False: 0]
  |  |  ------------------
  |  |   58|  9.98k|			if (!(S) || !sst || strcmp((S), sst) != 0) { \
  |  |  ------------------
  |  |  |  Branch (58:8): [True: 0, False: 9.98k]
  |  |  |  Branch (58:16): [True: 9.98k, False: 0]
  |  |  |  Branch (58:24): [True: 0, False: 0]
  |  |  ------------------
  |  |   59|  9.98k|				VIPS_FREE(S); \
  |  |  ------------------
  |  |  |  |   50|  9.98k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  |  |  ------------------
  |  |  |  |  |  |   41|  9.98k|	G_STMT_START \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  854|  9.98k|#define G_STMT_START  do
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   42|  9.98k|	{ \
  |  |  |  |  |  |   43|  9.98k|		if (S) { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (43:7): [True: 9.98k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   44|  9.98k|			(void) F((S)); \
  |  |  |  |  |  |   45|  9.98k|			(S) = 0; \
  |  |  |  |  |  |   46|  9.98k|		} \
  |  |  |  |  |  |   47|  9.98k|	} \
  |  |  |  |  |  |   48|  9.98k|	G_STMT_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  862|  9.98k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   60|  9.98k|				if (sst) \
  |  |  ------------------
  |  |  |  Branch (60:9): [True: 0, False: 9.98k]
  |  |  ------------------
  |  |   61|  9.98k|					(S) = g_strdup(sst); \
  |  |   62|  9.98k|			} \
  |  |   63|  9.98k|		} \
  |  |   64|  9.98k|	} \
  |  |   65|  9.98k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  9.98k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  677|  9.98k|		vips_connection_filename(VIPS_CONNECTION(jpeg->source)));
  678|       |
  679|  9.98k|	if (vips_image_pipelinev(out, VIPS_DEMAND_STYLE_FATSTRIP, NULL))
  ------------------
  |  Branch (679:6): [True: 0, False: 9.98k]
  ------------------
  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|  9.98k|	jpeg->output_width = cinfo->image_width / jpeg->shrink;
  692|  9.98k|	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|  9.98k|	(void) vips_image_set_int(out, "jpeg-multiscan",
  698|  9.98k|		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|  9.98k|	if (jpeg_has_multiple_scans(cinfo))
  ------------------
  |  Branch (702:6): [True: 8.05k, False: 1.93k]
  ------------------
  703|  8.05k|		vips_image_set_int(out, "interlaced", 1);
  704|       |
  705|  9.98k|	(void) vips_image_set_string(out, "jpeg-chroma-subsample",
  706|  9.98k|		find_chroma_subsample(cinfo));
  707|       |
  708|       |	/* Look for EXIF and ICC profile.
  709|       |	 */
  710|  16.5k|	for (p = cinfo->marker_list; p; p = p->next) {
  ------------------
  |  Branch (710:31): [True: 6.57k, False: 9.98k]
  ------------------
  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|  6.57k|		switch (p->marker) {
  724|  4.10k|		case JPEG_APP0 + 1:
  ------------------
  |  | 1168|  4.10k|#define JPEG_APP0       0xE0    /* APP0 marker code */
  ------------------
  |  Branch (724:3): [True: 4.10k, False: 2.46k]
  ------------------
  725|       |			/* Possible EXIF or XMP data.
  726|       |			 */
  727|  4.10k|			if (p->data_length > 4 &&
  ------------------
  |  Branch (727:8): [True: 3.86k, False: 243]
  ------------------
  728|  4.10k|				vips_isprefix("Exif", (char *) p->data) &&
  ------------------
  |  Branch (728:5): [True: 2.22k, False: 1.63k]
  ------------------
  729|  4.10k|				attach_blob(out, VIPS_META_EXIF_NAME,
  ------------------
  |  |   46|  2.22k|#define VIPS_META_EXIF_NAME "exif-data"
  ------------------
  |  Branch (729:5): [True: 0, False: 2.22k]
  ------------------
  730|  2.22k|					p->data, p->data_length))
  731|      0|				return -1;
  732|       |
  733|  4.10k|			if (p->data_length > 4 &&
  ------------------
  |  Branch (733:8): [True: 3.86k, False: 243]
  ------------------
  734|  4.10k|				vips_isprefix("http", (char *) p->data) &&
  ------------------
  |  Branch (734:5): [True: 1.22k, False: 2.63k]
  ------------------
  735|  4.10k|				attach_xmp_blob(out,
  ------------------
  |  Branch (735:5): [True: 0, False: 1.22k]
  ------------------
  736|  1.22k|					p->data, p->data_length))
  737|      0|				return -1;
  738|       |
  739|  4.10k|			break;
  740|       |
  741|  4.10k|		case JPEG_APP0 + 2:
  ------------------
  |  | 1168|    642|#define JPEG_APP0       0xE0    /* APP0 marker code */
  ------------------
  |  Branch (741:3): [True: 642, False: 5.93k]
  ------------------
  742|       |			/* Possible ICC profile.
  743|       |			 */
  744|    642|			if (p->data_length > 14 &&
  ------------------
  |  Branch (744:8): [True: 534, False: 108]
  ------------------
  745|    642|				vips_isprefix("ICC_PROFILE",
  ------------------
  |  Branch (745:5): [True: 209, False: 325]
  ------------------
  746|    534|					(char *) p->data)) {
  747|       |				/* cur_marker numbers from 1, according to
  748|       |				 * spec.
  749|       |				 */
  750|    209|				int cur_marker = p->data[12] - 1;
  751|       |
  752|    209|				if (cur_marker >= 0 &&
  ------------------
  |  Branch (752:9): [True: 139, False: 70]
  ------------------
  753|    209|					cur_marker < MAX_APP2_SECTIONS) {
  ------------------
  |  |  564|    139|#define MAX_APP2_SECTIONS (100)
  ------------------
  |  Branch (753:6): [True: 54, False: 85]
  ------------------
  754|     54|					app2_data[cur_marker] = p->data + 14;
  755|     54|					app2_data_length[cur_marker] =
  756|     54|						p->data_length - 14;
  757|     54|				}
  758|    209|			}
  759|    642|			break;
  760|       |
  761|    228|		case JPEG_APP0 + 13:
  ------------------
  |  | 1168|    228|#define JPEG_APP0       0xE0    /* APP0 marker code */
  ------------------
  |  Branch (761:3): [True: 228, False: 6.34k]
  ------------------
  762|       |			/* Possible IPTC data block.
  763|       |			 */
  764|    228|			if (p->data_length > 5 &&
  ------------------
  |  Branch (764:8): [True: 77, False: 151]
  ------------------
  765|    228|				vips_isprefix("Photo", (char *) p->data)) {
  ------------------
  |  Branch (765:5): [True: 1, False: 76]
  ------------------
  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|    228|			break;
  779|       |
  780|  1.59k|		case JPEG_APP0 + 14:
  ------------------
  |  | 1168|  1.59k|#define JPEG_APP0       0xE0    /* APP0 marker code */
  ------------------
  |  Branch (780:3): [True: 1.59k, False: 4.97k]
  ------------------
  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|  1.59k|			if (p->data_length >= 12 &&
  ------------------
  |  Branch (796:8): [True: 1.43k, False: 158]
  ------------------
  797|  1.59k|				vips_isprefix("Adobe", (char *) p->data)) {
  ------------------
  |  Branch (797:5): [True: 277, False: 1.16k]
  ------------------
  798|    277|				if (p->data[11] == 0) {
  ------------------
  |  Branch (798:9): [True: 214, False: 63]
  ------------------
  799|       |#ifdef DEBUG
  800|       |					printf("complete Adobe block, not YCCK image\n");
  801|       |#endif				/*DEBUG*/
  802|       |					// jpeg->invert_pels = FALSE;
  803|    214|				}
  804|    277|			}
  805|  1.59k|			break;
  806|       |
  807|      0|		default:
  ------------------
  |  Branch (807:3): [True: 0, False: 6.57k]
  ------------------
  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|  6.57k|		}
  815|  6.57k|	}
  816|       |
  817|       |	/* Assemble ICC sections.
  818|       |	 */
  819|  9.98k|	data_length = 0;
  820|  10.0k|	for (i = 0; i < MAX_APP2_SECTIONS && app2_data[i]; i++)
  ------------------
  |  |  564|  20.0k|#define MAX_APP2_SECTIONS (100)
  ------------------
  |  Branch (820:14): [True: 10.0k, False: 0]
  |  Branch (820:39): [True: 19, False: 9.98k]
  ------------------
  821|     19|		data_length += app2_data_length[i];
  822|  9.98k|	if (data_length) {
  ------------------
  |  Branch (822:6): [True: 16, False: 9.97k]
  ------------------
  823|     16|		unsigned char *data;
  824|     16|		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|     16|		if (!(data = vips_malloc(NULL, data_length)))
  ------------------
  |  Branch (831:7): [True: 0, False: 16]
  ------------------
  832|      0|			return -1;
  833|       |
  834|     16|		p = 0;
  835|     35|		for (i = 0; i < MAX_APP2_SECTIONS && app2_data[i]; i++) {
  ------------------
  |  |  564|     70|#define MAX_APP2_SECTIONS (100)
  ------------------
  |  Branch (835:15): [True: 35, False: 0]
  |  Branch (835:40): [True: 19, False: 16]
  ------------------
  836|     19|			memcpy(data + p, app2_data[i], app2_data_length[i]);
  837|     19|			p += app2_data_length[i];
  838|     19|		}
  839|       |
  840|     16|		vips_image_set_blob(out, VIPS_META_ICC_NAME,
  ------------------
  |  |   78|     16|#define VIPS_META_ICC_NAME "icc-profile-data"
  ------------------
  841|     16|			(VipsCallbackFn) vips_area_free_cb, data, data_length);
  842|     16|	}
  843|       |
  844|  9.98k|	return 0;
  845|  9.98k|}
jpeg2vips.c:find_chroma_subsample:
  495|  9.98k|{
  496|       |	/* libjpeg only uses 4:4:4 and 4:2:0, confusingly.
  497|       |	 *
  498|       |	 * http://poynton.ca/PDFs/Chroma_subsampling_notation.pdf
  499|       |	 */
  500|  9.98k|	gboolean has_subsample = cinfo->max_h_samp_factor > 1 ||
  ------------------
  |  Branch (500:27): [True: 7.10k, False: 2.87k]
  ------------------
  501|  9.98k|		cinfo->max_v_samp_factor > 1;
  ------------------
  |  Branch (501:3): [True: 1.38k, False: 1.49k]
  ------------------
  502|  9.98k|	gboolean is_cmyk = cinfo->num_components > 3;
  503|       |
  504|  9.98k|	return is_cmyk
  ------------------
  |  Branch (504:9): [True: 1.36k, False: 8.62k]
  ------------------
  505|  9.98k|		? (has_subsample ? "4:2:0:4" : "4:4:4:4")
  ------------------
  |  Branch (505:6): [True: 453, False: 911]
  ------------------
  506|  9.98k|		: (has_subsample ? "4:2:0" : "4:4:4");
  ------------------
  |  Branch (506:6): [True: 8.03k, False: 588]
  ------------------
  507|  9.98k|}
jpeg2vips.c:attach_blob:
  511|  3.22k|{
  512|       |	/* Only use the first one.
  513|       |	 */
  514|  3.22k|	if (vips_image_get_typeof(im, field)) {
  ------------------
  |  Branch (514:6): [True: 1.23k, False: 1.98k]
  ------------------
  515|       |#ifdef DEBUG
  516|       |		printf("attach_blob: second %s block, ignoring\n", field);
  517|       |#endif /*DEBUG*/
  518|       |
  519|  1.23k|		return 0;
  520|  1.23k|	}
  521|       |
  522|       |#ifdef DEBUG
  523|       |	printf("attach_blob: attaching %zd bytes of %s\n",
  524|       |		data_length, field);
  525|       |#endif /*DEBUG*/
  526|       |
  527|  1.98k|	vips_image_set_blob_copy(im, field, data, data_length);
  528|       |
  529|  1.98k|	return 0;
  530|  3.22k|}
jpeg2vips.c:attach_xmp_blob:
  538|  1.22k|{
  539|  1.22k|	char *p = (char *) data;
  540|  1.22k|	int i;
  541|       |
  542|  1.22k|	if (data_length < 4 ||
  ------------------
  |  Branch (542:6): [True: 0, False: 1.22k]
  ------------------
  543|  1.22k|		!vips_isprefix("http", p))
  ------------------
  |  Branch (543:3): [True: 0, False: 1.22k]
  ------------------
  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|  12.0k|	for (i = 0; i < VIPS_MIN(80, data_length - 2); i++)
  ------------------
  |  |   55|  12.0k|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 29, False: 12.0k]
  |  |  ------------------
  ------------------
  |  Branch (551:14): [True: 11.8k, False: 231]
  ------------------
  552|  11.8k|		if (!p[i])
  ------------------
  |  Branch (552:7): [True: 997, False: 10.8k]
  ------------------
  553|    997|			break;
  554|  1.22k|	if (p[i])
  ------------------
  |  Branch (554:6): [True: 231, False: 997]
  ------------------
  555|    231|		return 0;
  556|       |
  557|    997|	return attach_blob(im, VIPS_META_XMP_NAME,
  ------------------
  |  |   53|    997|#define VIPS_META_XMP_NAME "xmp-data"
  ------------------
  558|    997|		p + i + 1, data_length - i - 1);
  559|  1.22k|}
jpeg2vips.c:read_jpeg_image:
  941|  4.56k|{
  942|  4.56k|	struct jpeg_decompress_struct *cinfo = &jpeg->cinfo;
  943|  4.56k|	VipsImage **t = (VipsImage **)
  944|  4.56k|		vips_object_local_array(VIPS_OBJECT(out), 5);
  ------------------
  |  |  433|  4.56k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  4.56k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  4.56k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  945|       |
  946|  4.56k|	VipsImage *im;
  947|       |
  948|       |	/* Here for longjmp() from vips__new_error_exit() during
  949|       |	 * jpeg_read_header() or jpeg_start_decompress().
  950|       |	 */
  951|  4.56k|	if (setjmp(jpeg->eman.jmp))
  952|  1.70k|		return -1;
  953|       |
  954|  2.86k|	t[0] = vips_image_new();
  955|  2.86k|	if (read_jpeg_header(jpeg, t[0]))
  ------------------
  |  Branch (955:6): [True: 0, False: 2.86k]
  ------------------
  956|      0|		return -1;
  957|       |
  958|       |	/* Switch to pixel decode.
  959|       |	 */
  960|  2.86k|	if (vips_source_decode(jpeg->source))
  ------------------
  |  Branch (960:6): [True: 0, False: 2.86k]
  ------------------
  961|      0|		return -1;
  962|       |
  963|  2.86k|	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.86k|	if (vips_image_generate(t[0],
  ------------------
  |  Branch (972:6): [True: 0, False: 2.86k]
  ------------------
  973|  2.86k|			NULL, read_jpeg_generate, NULL,
  974|  2.86k|			jpeg, NULL) ||
  975|  2.86k|		vips_sequential(t[0], &t[1],
  ------------------
  |  Branch (975:3): [True: 0, False: 2.86k]
  ------------------
  976|  2.86k|			"tile_height", 8,
  977|  2.86k|			NULL) ||
  978|  2.86k|		vips_extract_area(t[1], &t[2],
  ------------------
  |  Branch (978:3): [True: 0, False: 2.86k]
  ------------------
  979|  2.86k|			0, 0, jpeg->output_width, jpeg->output_height, NULL))
  980|      0|		return -1;
  981|  2.86k|	im = t[2];
  982|       |
  983|  2.86k|	if (jpeg->autorotate &&
  ------------------
  |  Branch (983:6): [True: 0, False: 2.86k]
  ------------------
  984|  2.86k|		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.86k|	if (vips_image_write(im, out))
  ------------------
  |  Branch (994:6): [True: 1.09k, False: 1.77k]
  ------------------
  995|  1.09k|		return -1;
  996|       |
  997|  1.77k|	return 0;
  998|  2.86k|}
jpeg2vips.c:read_jpeg_generate:
  850|  17.2k|{
  851|  17.2k|	VipsRect *r = &out_region->valid;
  852|  17.2k|	ReadJpeg *jpeg = (ReadJpeg *) a;
  853|  17.2k|	struct jpeg_decompress_struct *cinfo = &jpeg->cinfo;
  854|  17.2k|	int sz = cinfo->output_width * cinfo->output_components;
  855|       |
  856|  17.2k|	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|  17.2k|	VIPS_GATE_START("read_jpeg_generate: work");
  ------------------
  |  |   41|  17.2k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  17.2k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  17.2k|	{ \
  |  |   43|  17.2k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 17.2k]
  |  |  ------------------
  |  |   44|  17.2k|			vips__thread_gate_start(NAME); \
  |  |   45|  17.2k|	} \
  |  |   46|  17.2k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  17.2k|#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|  17.2k|	g_assert(r->left == 0);
  ------------------
  |  |  166|  17.2k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  17.2k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  17.2k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  869|  17.2k|	g_assert(r->width == out_region->im->Xsize);
  ------------------
  |  |  166|  17.2k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  17.2k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  17.2k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  870|  17.2k|	g_assert(VIPS_RECT_BOTTOM(r) <= out_region->im->Ysize);
  ------------------
  |  |  166|  17.2k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  17.2k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  17.2k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  871|       |
  872|       |	/* Tiles should always be on a 8-pixel boundary.
  873|       |	 */
  874|  17.2k|	g_assert(r->top % 8 == 0);
  ------------------
  |  |  166|  17.2k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  17.2k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  17.2k|#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|  17.2k|	g_assert(r->height == VIPS_MIN(8, out_region->im->Ysize - r->top));
  ------------------
  |  |  166|  17.2k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  17.2k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  17.2k|#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|  17.2k|	if (r->top != cinfo->output_scanline) {
  ------------------
  |  Branch (884:6): [True: 0, False: 17.2k]
  ------------------
  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|  17.2k|	if (setjmp(jpeg->eman.jmp)) {
  896|  1.09k|		VIPS_GATE_STOP("read_jpeg_generate: work");
  ------------------
  |  |   49|  1.09k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.09k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  1.09k|	{ \
  |  |   51|  1.09k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 1.09k]
  |  |  ------------------
  |  |   52|  1.09k|			vips__thread_gate_stop(NAME); \
  |  |   53|  1.09k|	} \
  |  |   54|  1.09k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.09k|#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|  1.09k|		return -1;
  903|  1.09k|	}
  904|       |
  905|  16.1k|	if (jpeg->eman.pub.num_warnings > 0 &&
  ------------------
  |  Branch (905:6): [True: 17.1k, False: 18.4E]
  ------------------
  906|  17.1k|		jpeg->fail_on >= VIPS_FAIL_ON_WARNING) {
  ------------------
  |  Branch (906:3): [True: 0, False: 17.1k]
  ------------------
  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|   140k|	for (y = 0; y < r->height; y++) {
  ------------------
  |  Branch (916:14): [True: 124k, False: 16.1k]
  ------------------
  917|   124k|		JSAMPROW row_pointer[1];
  918|       |
  919|   124k|		row_pointer[0] = (JSAMPLE *)
  920|   124k|			VIPS_REGION_ADDR(out_region, 0, r->top + y);
  ------------------
  |  |  227|   124k|	((R)->data + \
  |  |  228|   124k|		((Y) - (R)->valid.top) * VIPS_REGION_LSKIP(R) + \
  |  |  ------------------
  |  |  |  |  195|   124k|	((size_t) ((R)->bpl))
  |  |  ------------------
  |  |  229|   124k|		((X) - (R)->valid.left) * VIPS_REGION_SIZEOF_PEL(R))
  |  |  ------------------
  |  |  |  |  201|   124k|	(VIPS_IMAGE_SIZEOF_PEL((R)->im))
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   124k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   124k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  921|       |
  922|   124k|		jpeg_read_scanlines(cinfo, &row_pointer[0], 1);
  923|       |
  924|   124k|		if (jpeg->invert_pels) {
  ------------------
  |  Branch (924:7): [True: 35.0k, False: 89.1k]
  ------------------
  925|  35.0k|			int x;
  926|       |
  927|  12.6M|			for (x = 0; x < sz; x++)
  ------------------
  |  Branch (927:16): [True: 12.5M, False: 35.0k]
  ------------------
  928|  12.5M|				row_pointer[0][x] = 255 - row_pointer[0][x];
  929|  35.0k|		}
  930|   124k|	}
  931|       |
  932|  16.1k|	VIPS_GATE_STOP("read_jpeg_generate: work");
  ------------------
  |  |   49|  16.1k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  16.1k|#define G_STMT_START  do
  |  |  ------------------
  |  |   50|  16.1k|	{ \
  |  |   51|  16.1k|		if (vips__thread_profile) \
  |  |  ------------------
  |  |  |  Branch (51:7): [True: 0, False: 16.1k]
  |  |  ------------------
  |  |   52|  16.1k|			vips__thread_gate_stop(NAME); \
  |  |   53|  16.1k|	} \
  |  |   54|  16.1k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  16.1k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  933|       |
  934|  16.1k|	return 0;
  935|  16.1k|}

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

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

lzw_context_create:
  101|    715|{
  102|    715|	struct lzw_ctx *c = malloc(sizeof(*c));
  103|    715|	if (c == NULL) {
  ------------------
  |  Branch (103:6): [True: 0, False: 715]
  ------------------
  104|      0|		return LZW_NO_MEM;
  105|      0|	}
  106|       |
  107|    715|	*ctx = c;
  108|    715|	return LZW_OK;
  109|    715|}
lzw_context_destroy:
  113|    754|{
  114|    754|	free(ctx);
  115|    754|}
lzw_decode_init:
  265|    378|{
  266|    378|	struct lzw_table_entry *table = ctx->table;
  267|    378|	lzw_result res;
  268|    378|	uint16_t code;
  269|       |
  270|    378|	if (minimum_code_size >= LZW_CODE_MAX) {
  ------------------
  |  |   21|    378|#define LZW_CODE_MAX 12
  ------------------
  |  Branch (270:6): [True: 0, False: 378]
  ------------------
  271|      0|		return LZW_BAD_ICODE;
  272|      0|	}
  273|       |
  274|       |	/* Initialise the input reading context */
  275|    378|	ctx->input.data = input_data;
  276|    378|	ctx->input.data_len = input_length;
  277|    378|	ctx->input.data_sb_next = input_pos;
  278|       |
  279|    378|	ctx->input.sb_bit = 0;
  280|    378|	ctx->input.sb_bit_count = 0;
  281|       |
  282|       |	/* Initialise the table building context */
  283|    378|	ctx->initial_code_size = minimum_code_size + 1;
  284|       |
  285|    378|	ctx->clear_code = (1 << minimum_code_size) + 0;
  286|    378|	ctx->eoi_code   = (1 << minimum_code_size) + 1;
  287|       |
  288|    378|	ctx->output_left = 0;
  289|       |
  290|       |	/* Initialise the standard table entries */
  291|  55.6k|	for (uint16_t i = 0; i < ctx->clear_code; i++) {
  ------------------
  |  Branch (291:23): [True: 55.2k, False: 378]
  ------------------
  292|  55.2k|		table[i].first = i;
  293|  55.2k|		table[i].value = i;
  294|  55.2k|		table[i].count = 1;
  295|  55.2k|	}
  296|       |
  297|    378|	res = lzw__handle_clear(ctx, &code);
  298|    378|	if (res != LZW_OK) {
  ------------------
  |  Branch (298:6): [True: 51, False: 327]
  ------------------
  299|     51|		return res;
  300|     51|	}
  301|       |
  302|       |	/* Store details of this code as "previous code" to the context. */
  303|    327|	ctx->prev_code_first = ctx->table[code].first;
  304|    327|	ctx->prev_code_count = ctx->table[code].count;
  305|    327|	ctx->prev_code = code;
  306|       |
  307|       |	/* Add code to context for immediate output. */
  308|    327|	ctx->output_code = code;
  309|    327|	ctx->output_left = 1;
  310|       |
  311|    327|	ctx->has_transparency = false;
  312|    327|	ctx->transparency_idx = 0;
  313|    327|	ctx->colour_map = NULL;
  314|       |
  315|    327|	return LZW_OK;
  316|    378|}
lzw_decode_init_map:
  327|    159|{
  328|    159|	lzw_result res;
  329|       |
  330|    159|	if (colour_table == NULL) {
  ------------------
  |  Branch (330:6): [True: 0, False: 159]
  ------------------
  331|      0|		return LZW_BAD_PARAM;
  332|      0|	}
  333|       |
  334|    159|	res = lzw_decode_init(ctx, minimum_code_size,
  335|    159|			input_data, input_length, input_pos);
  336|    159|	if (res != LZW_OK) {
  ------------------
  |  Branch (336:6): [True: 19, False: 140]
  ------------------
  337|     19|		return res;
  338|     19|	}
  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|    159|}
lzw_decode:
  499|    203|{
  500|    203|	const uint32_t output_length = sizeof(ctx->stack_base);
  501|       |
  502|    203|	*output_written = 0;
  503|    203|	*output_data = ctx->stack_base;
  504|       |
  505|    203|	if (ctx->output_left != 0) {
  ------------------
  |  Branch (505:6): [True: 197, False: 6]
  ------------------
  506|    197|		*output_written += lzw__write_fn(ctx,
  507|    197|				ctx->stack_base, output_length, *output_written,
  508|    197|				ctx->output_code, ctx->output_left);
  509|    197|	}
  510|       |
  511|  41.7k|	while (*output_written != output_length) {
  ------------------
  |  Branch (511:9): [True: 41.7k, False: 17]
  ------------------
  512|  41.7k|		lzw_result res = lzw__decode(ctx, lzw__write_fn,
  513|  41.7k|				ctx->stack_base, output_length, output_written);
  514|  41.7k|		if (res != LZW_OK) {
  ------------------
  |  Branch (514:7): [True: 186, False: 41.5k]
  ------------------
  515|    186|			return res;
  516|    186|		}
  517|  41.7k|	}
  518|       |
  519|     17|	return LZW_OK;
  520|    203|}
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|  7.11k|	while (*output_written != output_length) {
  ------------------
  |  Branch (604:9): [True: 7.09k, False: 18]
  ------------------
  605|  7.09k|		lzw_result res = lzw__decode(ctx, lzw__map_write_fn,
  606|  7.09k|				output_data, output_length, output_written);
  607|  7.09k|		if (res != LZW_OK) {
  ------------------
  |  Branch (607:7): [True: 122, False: 6.97k]
  ------------------
  608|    122|			return res;
  609|    122|		}
  610|  7.09k|	}
  611|       |
  612|     18|	return LZW_OK;
  613|    140|}
lzw.c:lzw__handle_clear:
  232|  8.21k|{
  233|  8.21k|	uint16_t code;
  234|       |
  235|       |	/* Reset table building context */
  236|  8.21k|	ctx->code_size = ctx->initial_code_size;
  237|  8.21k|	ctx->code_max = (1 << ctx->initial_code_size) - 1;
  238|  8.21k|	ctx->table_size = ctx->eoi_code + 1;
  239|       |
  240|       |	/* There might be a sequence of clear codes, so process them all */
  241|  16.4k|	do {
  242|  16.4k|		lzw_result res = lzw__read_code(&ctx->input,
  243|  16.4k|				ctx->code_size, &code);
  244|  16.4k|		if (res != LZW_OK) {
  ------------------
  |  Branch (244:7): [True: 77, False: 16.3k]
  ------------------
  245|     77|			return res;
  246|     77|		}
  247|  16.4k|	} while (code == ctx->clear_code);
  ------------------
  |  Branch (247:11): [True: 8.26k, False: 8.13k]
  ------------------
  248|       |
  249|       |	/* The initial code must be from the initial table. */
  250|  8.13k|	if (code > ctx->clear_code) {
  ------------------
  |  Branch (250:6): [True: 17, False: 8.11k]
  ------------------
  251|     17|		return LZW_BAD_ICODE;
  252|     17|	}
  253|       |
  254|  8.11k|	*code_out = code;
  255|  8.11k|	return LZW_OK;
  256|  8.13k|}
lzw.c:lzw__read_code:
  167|  65.2k|{
  168|  65.2k|	uint32_t code = 0;
  169|  65.2k|	uint32_t current_bit = ctx->sb_bit & 0x7;
  170|       |
  171|  65.2k|	if (ctx->sb_bit + 24 <= ctx->sb_bit_count) {
  ------------------
  |  Branch (171:6): [True: 56.5k, False: 8.76k]
  ------------------
  172|       |		/* Fast path: read three bytes from this sub-block */
  173|  56.5k|		const uint8_t *data = ctx->sb_data + (ctx->sb_bit >> 3);
  174|  56.5k|		code |= *data++ <<  0;
  175|  56.5k|		code |= *data++ <<  8;
  176|  56.5k|		code |= *data   << 16;
  177|  56.5k|		ctx->sb_bit += code_size;
  178|  56.5k|	} else {
  179|       |		/* Slow path: code spans sub-blocks */
  180|  8.76k|		uint8_t byte_advance = (current_bit + code_size) >> 3;
  181|  8.76k|		uint8_t byte = 0;
  182|  8.76k|		uint8_t bits_remaining_0 = (code_size < (8u - current_bit)) ?
  ------------------
  |  Branch (182:30): [True: 6.03k, False: 2.73k]
  ------------------
  183|  6.03k|				code_size : (8u - current_bit);
  184|  8.76k|		uint8_t bits_remaining_1 = code_size - bits_remaining_0;
  185|  8.76k|		uint8_t bits_used[3] = {
  186|  8.76k|			[0] = bits_remaining_0,
  187|  8.76k|			[1] = bits_remaining_1 < 8 ? bits_remaining_1 : 8,
  ------------------
  |  Branch (187:10): [True: 7.56k, False: 1.20k]
  ------------------
  188|  8.76k|			[2] = bits_remaining_1 - 8,
  189|  8.76k|		};
  190|       |
  191|  8.76k|		assert(byte_advance <= 2);
  192|       |
  193|  10.7k|		while (true) {
  194|  10.7k|			const uint8_t *data = ctx->sb_data;
  195|  10.7k|			lzw_result res;
  196|       |
  197|       |			/* Get any data from end of this sub-block */
  198|  23.2k|			while (byte <= byte_advance &&
  ------------------
  |  Branch (198:11): [True: 14.6k, False: 8.54k]
  ------------------
  199|  23.2k|					ctx->sb_bit < ctx->sb_bit_count) {
  ------------------
  |  Branch (199:6): [True: 12.4k, False: 2.22k]
  ------------------
  200|  12.4k|				code |= data[ctx->sb_bit >> 3] << (byte << 3);
  201|  12.4k|				ctx->sb_bit += bits_used[byte];
  202|  12.4k|				byte++;
  203|  12.4k|			}
  204|       |
  205|       |			/* Check if we have all we need */
  206|  10.7k|			if (byte > byte_advance) {
  ------------------
  |  Branch (206:8): [True: 8.54k, False: 2.22k]
  ------------------
  207|  8.54k|				break;
  208|  8.54k|			}
  209|       |
  210|       |			/* Move to next sub-block */
  211|  2.22k|			res = lzw__block_advance(ctx);
  212|  2.22k|			if (res != LZW_OK) {
  ------------------
  |  Branch (212:8): [True: 223, False: 2.00k]
  ------------------
  213|    223|				return res;
  214|    223|			}
  215|  2.22k|		}
  216|  8.76k|	}
  217|       |
  218|  65.0k|	*code_out = (code >> current_bit) & ((1 << code_size) - 1);
  219|  65.0k|	return LZW_OK;
  220|  65.2k|}
lzw.c:lzw__block_advance:
  124|  2.22k|{
  125|  2.22k|	size_t block_size;
  126|  2.22k|	size_t next_block_pos = ctx->data_sb_next;
  127|  2.22k|	const uint8_t *data_next = ctx->data + next_block_pos;
  128|       |
  129|  2.22k|	if (next_block_pos >= ctx->data_len) {
  ------------------
  |  Branch (129:6): [True: 35, False: 2.19k]
  ------------------
  130|     35|		return LZW_NO_DATA;
  131|     35|	}
  132|       |
  133|  2.19k|	block_size = *data_next;
  134|       |
  135|  2.19k|	if ((next_block_pos + block_size) >= ctx->data_len) {
  ------------------
  |  Branch (135:6): [True: 112, False: 2.08k]
  ------------------
  136|    112|		return LZW_NO_DATA;
  137|    112|	}
  138|       |
  139|  2.08k|	ctx->sb_bit = 0;
  140|  2.08k|	ctx->sb_bit_count = block_size * 8;
  141|       |
  142|  2.08k|	if (block_size == 0) {
  ------------------
  |  Branch (142:6): [True: 76, False: 2.00k]
  ------------------
  143|     76|		ctx->data_sb_next += 1;
  144|     76|		return LZW_OK_EOD;
  145|     76|	}
  146|       |
  147|  2.00k|	ctx->sb_data = data_next + 1;
  148|  2.00k|	ctx->data_sb_next += block_size + 1;
  149|       |
  150|  2.00k|	return LZW_OK;
  151|  2.08k|}
lzw.c:lzw__write_fn:
  463|  41.7k|{
  464|  41.7k|	uint8_t *restrict output_pos = (uint8_t *)output_data + output_used;
  465|  41.7k|	const struct lzw_table_entry * const table = ctx->table;
  466|  41.7k|	uint32_t space = output_length - output_used;
  467|  41.7k|	uint16_t count = left;
  468|       |
  469|  41.7k|	if (count > space) {
  ------------------
  |  Branch (469:6): [True: 10, False: 41.7k]
  ------------------
  470|     10|		left = count - space;
  471|     10|		count = space;
  472|  41.7k|	} else {
  473|  41.7k|		left = 0;
  474|  41.7k|	}
  475|       |
  476|  41.7k|	ctx->output_code = code;
  477|  41.7k|	ctx->output_left = left;
  478|       |
  479|       |	/* Skip over any values we don't have space for. */
  480|  41.8k|	for (unsigned i = left; i != 0; i--) {
  ------------------
  |  Branch (480:26): [True: 122, False: 41.7k]
  ------------------
  481|    122|		const struct lzw_table_entry *entry = table + code;
  482|    122|		code = entry->extends;
  483|    122|	}
  484|       |
  485|  41.7k|	output_pos += count;
  486|   141k|	for (unsigned i = count; i != 0; i--) {
  ------------------
  |  Branch (486:27): [True: 100k, False: 41.7k]
  ------------------
  487|   100k|		const struct lzw_table_entry *entry = table + code;
  488|   100k|		*--output_pos = entry->value;
  489|   100k|		code = entry->extends;
  490|   100k|	}
  491|       |
  492|  41.7k|	return count;
  493|  41.7k|}
lzw.c:lzw__decode:
  391|  48.8k|{
  392|  48.8k|	lzw_result res;
  393|  48.8k|	uint16_t code;
  394|       |
  395|       |	/* Get a new code from the input */
  396|  48.8k|	res = lzw__read_code(&ctx->input, ctx->code_size, &code);
  397|  48.8k|	if (res != LZW_OK) {
  ------------------
  |  Branch (397:6): [True: 146, False: 48.6k]
  ------------------
  398|    146|		return res;
  399|    146|	}
  400|       |
  401|       |	/* Handle the new code */
  402|  48.6k|	if (code == ctx->eoi_code) {
  ------------------
  |  Branch (402:6): [True: 57, False: 48.5k]
  ------------------
  403|       |		/* Got End of Information code */
  404|     57|		return LZW_EOI_CODE;
  405|       |
  406|  48.5k|	} else if (code > ctx->table_size) {
  ------------------
  |  Branch (406:13): [True: 62, False: 48.5k]
  ------------------
  407|       |		/* Code is invalid */
  408|     62|		return LZW_BAD_CODE;
  409|       |
  410|  48.5k|	} else if (code == ctx->clear_code) {
  ------------------
  |  Branch (410:13): [True: 7.83k, False: 40.7k]
  ------------------
  411|  7.83k|		res = lzw__handle_clear(ctx, &code);
  412|  7.83k|		if (res != LZW_OK) {
  ------------------
  |  Branch (412:7): [True: 43, False: 7.79k]
  ------------------
  413|     43|			return res;
  414|     43|		}
  415|       |
  416|  40.7k|	} else if (ctx->table_size < LZW_TABLE_ENTRY_MAX) {
  ------------------
  |  |   25|  40.7k|#define LZW_TABLE_ENTRY_MAX (1u << LZW_CODE_MAX)
  |  |  ------------------
  |  |  |  |   21|  40.7k|#define LZW_CODE_MAX 12
  |  |  ------------------
  ------------------
  |  Branch (416:13): [True: 40.6k, False: 16]
  ------------------
  417|  40.6k|		uint16_t size = ctx->table_size;
  418|  40.6k|		lzw__table_add_entry(ctx, (code < size) ?
  ------------------
  |  Branch (418:29): [True: 39.8k, False: 830]
  ------------------
  419|  39.8k|				ctx->table[code].first :
  420|  40.6k|				ctx->prev_code_first);
  421|       |
  422|       |		/* Ensure code size is increased, if needed. */
  423|  40.6k|		if (size == ctx->code_max && ctx->code_size < LZW_CODE_MAX) {
  ------------------
  |  |   21|    677|#define LZW_CODE_MAX 12
  ------------------
  |  Branch (423:7): [True: 677, False: 40.0k]
  |  Branch (423:32): [True: 676, False: 1]
  ------------------
  424|    676|			ctx->code_size++;
  425|    676|			ctx->code_max = (1 << ctx->code_size) - 1;
  426|    676|		}
  427|  40.6k|	}
  428|       |
  429|  48.4k|	*output_written += write_fn(ctx,
  430|  48.4k|			output_data, output_length, *output_written,
  431|  48.4k|			code, ctx->table[code].count);
  432|       |
  433|       |	/* Store details of this code as "previous code" to the context. */
  434|  48.4k|	ctx->prev_code_first = ctx->table[code].first;
  435|  48.4k|	ctx->prev_code_count = ctx->table[code].count;
  436|  48.4k|	ctx->prev_code = code;
  437|       |
  438|  48.4k|	return LZW_OK;
  439|  48.6k|}
lzw.c:lzw__table_add_entry:
  356|  40.6k|{
  357|  40.6k|	struct lzw_table_entry *entry = &ctx->table[ctx->table_size];
  358|       |
  359|  40.6k|	entry->value = code;
  360|  40.6k|	entry->first = ctx->prev_code_first;
  361|  40.6k|	entry->count = ctx->prev_code_count + 1;
  362|  40.6k|	entry->extends = ctx->prev_code;
  363|       |
  364|  40.6k|	ctx->table_size++;
  365|  40.6k|}
lzw.c:lzw__map_write_fn:
  544|  7.11k|{
  545|  7.11k|	uint32_t *restrict output_pos = (uint32_t *)output_data + output_used;
  546|  7.11k|	const struct lzw_table_entry * const table = ctx->table;
  547|  7.11k|	uint32_t space = output_length - output_used;
  548|  7.11k|	uint16_t count = left;
  549|       |
  550|  7.11k|	if (count > space) {
  ------------------
  |  Branch (550:6): [True: 8, False: 7.10k]
  ------------------
  551|      8|		left = count - space;
  552|      8|		count = space;
  553|  7.10k|	} else {
  554|  7.10k|		left = 0;
  555|  7.10k|	}
  556|       |
  557|  7.11k|	ctx->output_code = code;
  558|  7.11k|	ctx->output_left = left;
  559|       |
  560|  7.22k|	for (unsigned i = left; i != 0; i--) {
  ------------------
  |  Branch (560:26): [True: 114, False: 7.11k]
  ------------------
  561|    114|		const struct lzw_table_entry *entry = table + code;
  562|    114|		code = entry->extends;
  563|    114|	}
  564|       |
  565|  7.11k|	output_pos += count;
  566|  7.11k|	if (ctx->has_transparency) {
  ------------------
  |  Branch (566:6): [True: 2.55k, False: 4.55k]
  ------------------
  567|  17.3k|		for (unsigned i = count; i != 0; i--) {
  ------------------
  |  Branch (567:28): [True: 14.7k, False: 2.55k]
  ------------------
  568|  14.7k|			const struct lzw_table_entry *entry = table + code;
  569|  14.7k|			--output_pos;
  570|  14.7k|			if (entry->value != ctx->transparency_idx) {
  ------------------
  |  Branch (570:8): [True: 13.7k, False: 998]
  ------------------
  571|  13.7k|				*output_pos = ctx->colour_map[entry->value];
  572|  13.7k|			}
  573|  14.7k|			code = entry->extends;
  574|  14.7k|		}
  575|  4.55k|	} else {
  576|  13.8k|		for (unsigned i = count; i != 0; i--) {
  ------------------
  |  Branch (576:28): [True: 9.24k, False: 4.55k]
  ------------------
  577|  9.24k|			const struct lzw_table_entry *entry = table + code;
  578|  9.24k|			*--output_pos = ctx->colour_map[entry->value];
  579|  9.24k|			code = entry->extends;
  580|  9.24k|		}
  581|  4.55k|	}
  582|       |
  583|  7.11k|	return count;
  584|  7.11k|}

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

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

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

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

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.7k|vips__tiff_init(void) {}
vips__tiff_openin_source:
  168|  47.7k|{
  169|  47.7k|	TIFF *tiff;
  170|       |
  171|       |#ifdef DEBUG
  172|       |	printf("vips__tiff_openin_source:\n");
  173|       |#endif /*DEBUG*/
  174|       |
  175|  47.7k|	if (vips_source_rewind(source))
  ------------------
  |  Branch (175:6): [True: 0, False: 47.7k]
  ------------------
  176|      0|		return NULL;
  177|       |
  178|       |	/* Disable memory mapped input -- it chews up VM and the performance
  179|       |	 * gain is very small.
  180|       |	 *
  181|       |	 * C enables strip chopping: very large uncompressed strips are
  182|       |	 * chopped into c. 8kb chunks. This can reduce peak memory use for
  183|       |	 * this type of file.
  184|       |	 */
  185|       |
  186|  47.7k|#ifdef HAVE_TIFF_OPEN_OPTIONS
  187|  47.7k|	TIFFOpenOptions *opts = TIFFOpenOptionsAlloc();
  188|  47.7k|	TIFFOpenOptionsSetErrorHandlerExtR(opts, error_fn, user_data);
  189|  47.7k|	TIFFOpenOptionsSetWarningHandlerExtR(opts, warning_fn, user_data);
  190|  47.7k|#ifdef HAVE_TIFF_OPEN_OPTIONS_SET_MAX_CUMULATED_MEM_ALLOC
  191|  47.7k|	if (!unlimited) {
  ------------------
  |  Branch (191:6): [True: 47.7k, False: 0]
  ------------------
  192|  47.7k|		TIFFOpenOptionsSetMaxCumulatedMemAlloc(opts, 20 * 1024 * 1024);
  193|  47.7k|	}
  194|  47.7k|#endif /*HAVE_TIFF_OPEN_OPTIONS_SET_MAX_CUMULATED_MEM_ALLOC*/
  195|  47.7k|	if (!(tiff = TIFFClientOpenExt("source input", "rmC",
  ------------------
  |  Branch (195:6): [True: 8.48k, False: 39.2k]
  ------------------
  196|  47.7k|			  (thandle_t) source,
  197|  47.7k|			  openin_source_read,
  198|  47.7k|			  openin_source_write,
  199|  47.7k|			  openin_source_seek,
  200|  47.7k|			  openin_source_close,
  201|  47.7k|			  openin_source_length,
  202|  47.7k|			  openin_source_map,
  203|  47.7k|			  openin_source_unmap,
  204|  47.7k|			  opts))) {
  205|  8.48k|	    TIFFOpenOptionsFree(opts);
  206|  8.48k|		vips_error("vips__tiff_openin_source", "%s",
  207|  8.48k|			_("unable to open source for input"));
  ------------------
  |  |   30|  8.48k|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|  8.48k|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  208|  8.48k|		return NULL;
  209|  8.48k|	}
  210|  39.2k|	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|  39.2k|	g_object_ref(source);
  230|       |
  231|  39.2k|	return tiff;
  232|  47.7k|}
tiff.c:openin_source_read:
  104|   625k|{
  105|   625k|	VipsSource *source = VIPS_SOURCE(st);
  ------------------
  |  |  106|   625k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   625k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   625k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  107|   625k|		VIPS_TYPE_SOURCE, VipsSource))
  ------------------
  106|       |
  107|   625k|	return vips_source_read(source, data, size);
  108|   625k|}
tiff.c:openin_source_seek:
  120|   466k|{
  121|   466k|	VipsSource *source = VIPS_SOURCE(st);
  ------------------
  |  |  106|   466k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   466k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   466k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  107|   466k|		VIPS_TYPE_SOURCE, VipsSource))
  ------------------
  122|       |
  123|   466k|	return (toff_t) vips_source_seek(source, offset, whence);
  124|   466k|}
tiff.c:openin_source_close:
  128|  39.2k|{
  129|  39.2k|	VipsSource *source = VIPS_SOURCE(st);
  ------------------
  |  |  106|  39.2k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  39.2k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  39.2k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  107|  39.2k|		VIPS_TYPE_SOURCE, VipsSource))
  ------------------
  130|       |
  131|  39.2k|	VIPS_UNREF(source);
  ------------------
  |  |   57|  39.2k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|  39.2k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  39.2k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  39.2k|	{ \
  |  |  |  |   43|  39.2k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 39.2k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  39.2k|			(void) F((S)); \
  |  |  |  |   45|  39.2k|			(S) = 0; \
  |  |  |  |   46|  39.2k|		} \
  |  |  |  |   47|  39.2k|	} \
  |  |  |  |   48|  39.2k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  39.2k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  132|       |
  133|  39.2k|	return 0;
  134|  39.2k|}
tiff.c:openin_source_length:
  138|  64.7k|{
  139|  64.7k|	VipsSource *source = VIPS_SOURCE(st);
  ------------------
  |  |  106|  64.7k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  64.7k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  64.7k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  107|  64.7k|		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|  64.7k|	return (toff_t) vips_source_length(source);
  147|  64.7k|}

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

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

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

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

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

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

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

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

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

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

vips_error_buffer:
  179|  10.7k|{
  180|  10.7k|	const char *msg;
  181|       |
  182|  10.7k|	g_mutex_lock(&vips__global_lock);
  183|  10.7k|	msg = vips_buf_all(&vips_error_buf);
  184|  10.7k|	g_mutex_unlock(&vips__global_lock);
  185|       |
  186|  10.7k|	return msg;
  187|  10.7k|}
vips_verror:
  230|  2.04M|{
  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.04M|	g_mutex_lock(&vips__global_lock);
  246|  2.04M|	g_assert(vips_error_freeze_count >= 0);
  ------------------
  |  |  166|  2.04M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  2.04M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.04M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  247|  2.04M|	if (!vips_error_freeze_count) {
  ------------------
  |  Branch (247:6): [True: 2.04M, False: 0]
  ------------------
  248|  2.04M|		if (domain)
  ------------------
  |  Branch (248:7): [True: 2.04M, False: 0]
  ------------------
  249|  2.04M|			vips_buf_appendf(&vips_error_buf, "%s: ", domain);
  250|  2.04M|		vips_buf_vappendf(&vips_error_buf, fmt, ap);
  251|  2.04M|		vips_buf_appends(&vips_error_buf, "\n");
  252|  2.04M|	}
  253|  2.04M|	g_mutex_unlock(&vips__global_lock);
  254|       |
  255|  2.04M|	if (vips__fatal)
  ------------------
  |  Branch (255:6): [True: 0, False: 2.04M]
  ------------------
  256|      0|		vips_error_exit("vips__fatal");
  257|  2.04M|}
vips_error:
  271|   176k|{
  272|   176k|	va_list ap;
  273|       |
  274|   176k|	va_start(ap, fmt);
  275|   176k|	vips_verror(domain, fmt, ap);
  276|   176k|	va_end(ap);
  277|   176k|}
vips_error_clear:
  381|  8.48k|{
  382|  8.48k|	g_mutex_lock(&vips__global_lock);
  383|  8.48k|	vips_buf_rewind(&vips_error_buf);
  384|  8.48k|	g_mutex_unlock(&vips__global_lock);
  385|  8.48k|}
vips_check_uncoded:
  441|  15.5k|{
  442|  15.5k|	if (im->Coding != VIPS_CODING_NONE) {
  ------------------
  |  Branch (442:6): [True: 0, False: 15.5k]
  ------------------
  443|      0|		vips_error(domain, "%s", _("image must be uncoded"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  444|      0|		return -1;
  445|      0|	}
  446|       |
  447|  15.5k|	return 0;
  448|  15.5k|}
vips_check_coding_known:
  493|  2.86k|{
  494|       |	/* These all have codings that extract/ifthenelse/etc can ignore.
  495|       |	 */
  496|  2.86k|	if (im->Coding != VIPS_CODING_NONE &&
  ------------------
  |  Branch (496:6): [True: 0, False: 2.86k]
  ------------------
  497|  2.86k|		im->Coding != VIPS_CODING_LABQ &&
  ------------------
  |  Branch (497:3): [True: 0, False: 0]
  ------------------
  498|  2.86k|		im->Coding != VIPS_CODING_RAD) {
  ------------------
  |  Branch (498:3): [True: 0, False: 0]
  ------------------
  499|      0|		vips_error(domain, "%s", _("unknown image coding"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  500|      0|		return -1;
  501|      0|	}
  502|       |
  503|  2.86k|	return 0;
  504|  2.86k|}
vips_check_coding:
  522|  32.7k|{
  523|  32.7k|	if (im->Coding != coding) {
  ------------------
  |  Branch (523:6): [True: 0, False: 32.7k]
  ------------------
  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|  32.7k|	return 0;
  530|  32.7k|}
vips_check_bands_atleast:
  622|   136k|{
  623|   136k|	if (im->Bands < bands) {
  ------------------
  |  Branch (623:6): [True: 0, False: 136k]
  ------------------
  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|   136k|	return 0;
  630|   136k|}
vips_check_noncomplex:
  702|  3.61k|{
  703|  3.61k|	if (vips_band_format_iscomplex(im->BandFmt)) {
  ------------------
  |  Branch (703:6): [True: 0, False: 3.61k]
  ------------------
  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|  3.61k|	return 0;
  709|  3.61k|}
vips_check_vector:
 1142|    196|{
 1143|       |	/* Here it's clearer to list the cases that are OK.
 1144|       |	 */
 1145|    196|	if (n == im->Bands)
  ------------------
  |  Branch (1145:6): [True: 0, False: 196]
  ------------------
 1146|      0|		return 0;
 1147|    196|	if (n == 1)
  ------------------
  |  Branch (1147:6): [True: 196, False: 0]
  ------------------
 1148|    196|		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|   109k|{
 1218|   109k|	VipsImage *t;
 1219|       |
 1220|   109k|	*out = NULL;
 1221|       |
 1222|   109k|	if (im->Xsize > 100000 ||
  ------------------
  |  Branch (1222:6): [True: 0, False: 109k]
  ------------------
 1223|   109k|		im->Ysize > 100000) {
  ------------------
  |  Branch (1223:3): [True: 0, False: 109k]
  ------------------
 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|   109k|	if (im->Bands != 1) {
  ------------------
  |  Branch (1227:6): [True: 0, False: 109k]
  ------------------
 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|   109k|	if (vips_cast(im, &t, VIPS_FORMAT_DOUBLE, NULL))
  ------------------
  |  Branch (1233:6): [True: 0, False: 109k]
  ------------------
 1234|      0|		return -1;
 1235|   109k|	if (!(*out = vips_image_copy_memory(t))) {
  ------------------
  |  Branch (1235:6): [True: 0, False: 109k]
  ------------------
 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|   109k|	VIPS_UNREF(t);
  ------------------
  |  |   57|   109k|#define VIPS_UNREF(X) VIPS_FREEF(g_object_unref, (X))
  |  |  ------------------
  |  |  |  |   41|   109k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   109k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|   109k|	{ \
  |  |  |  |   43|   109k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 109k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|   109k|			(void) F((S)); \
  |  |  |  |   45|   109k|			(S) = 0; \
  |  |  |  |   46|   109k|		} \
  |  |  |  |   47|   109k|	} \
  |  |  |  |   48|   109k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   109k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1240|       |
 1241|   109k|	return 0;
 1242|   109k|}
vips_check_separable:
 1259|  15.5k|{
 1260|  15.5k|	if (im->Xsize != 1 &&
  ------------------
  |  Branch (1260:6): [True: 15.5k, False: 0]
  ------------------
 1261|  15.5k|		im->Ysize != 1) {
  ------------------
  |  Branch (1261:3): [True: 0, False: 15.5k]
  ------------------
 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|  15.5k|	return 0;
 1268|  15.5k|}

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

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

vips_format_sizeof:
  212|  1.23M|{
  213|  1.23M|	format = VIPS_CLIP(0, format, VIPS_FORMAT_DPCOMPLEX);
  ------------------
  |  |   57|  1.23M|#define VIPS_CLIP(A, V, B) VIPS_MAX((A), VIPS_MIN((B), (V)))
  |  |  ------------------
  |  |  |  |   54|  2.47M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (54:25): [True: 0, False: 1.23M]
  |  |  |  |  |  Branch (54:32): [True: 0, False: 1.23M]
  |  |  |  |  |  Branch (54:44): [True: 0, False: 1.23M]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  214|       |
  215|  1.23M|	return vips__image_sizeof_bandformat[format];
  216|  1.23M|}
vips_format_sizeof_unsafe:
  229|  33.5M|{
  230|  33.5M|	g_assert(0 <= format && format <= VIPS_FORMAT_DPCOMPLEX);
  ------------------
  |  |  166|  33.5M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  33.5M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  33.5M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  231|       |
  232|  33.5M|	return vips__image_sizeof_bandformat[format];
  233|  33.5M|}
vips_interpretation_max_alpha:
  243|    998|{
  244|    998|	switch (interpretation) {
  245|     74|	case VIPS_INTERPRETATION_GREY16:
  ------------------
  |  Branch (245:2): [True: 74, False: 924]
  ------------------
  246|    120|	case VIPS_INTERPRETATION_RGB16:
  ------------------
  |  Branch (246:2): [True: 46, False: 952]
  ------------------
  247|    120|		return 65535.0;
  248|      7|	case VIPS_INTERPRETATION_scRGB:
  ------------------
  |  Branch (248:2): [True: 7, False: 991]
  ------------------
  249|      7|		return 1.0;
  250|    871|	default:
  ------------------
  |  Branch (250:2): [True: 871, False: 127]
  ------------------
  251|    871|		return 255.0;
  252|    998|	}
  253|    998|}
vips__meta_destroy:
  375|  1.11M|{
  376|  1.11M|	VIPS_FREEF(g_hash_table_destroy, image->meta);
  ------------------
  |  |   41|  1.11M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.11M|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  1.11M|	{ \
  |  |   43|  1.11M|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 1.09M, False: 15.1k]
  |  |  ------------------
  |  |   44|  1.09M|			(void) F((S)); \
  |  |   45|  1.09M|			(S) = 0; \
  |  |   46|  1.09M|		} \
  |  |   47|  1.11M|	} \
  |  |   48|  1.11M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.11M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  377|  1.11M|	g_assert(!image->meta_traverse);
  ------------------
  |  |  166|  1.11M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  1.11M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.11M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  378|  1.11M|}
vips_image_get_width:
  398|  9.08k|{
  399|  9.08k|	return image->Xsize;
  400|  9.08k|}
vips_image_get_height:
  410|  9.08k|{
  411|  9.08k|	return image->Ysize;
  412|  9.08k|}
vips_image_get_bands:
  422|   487k|{
  423|   487k|	return image->Bands;
  424|   487k|}
vips_image_get_format:
  434|   478k|{
  435|   478k|	return image->BandFmt;
  436|   478k|}
vips_image_guess_format:
  492|  4.91k|{
  493|  4.91k|	VipsBandFormat format;
  494|       |
  495|       |	/* Stop a compiler warning.
  496|       |	 */
  497|  4.91k|	format = VIPS_FORMAT_UCHAR;
  498|       |
  499|  4.91k|	switch (image->Type) {
  500|      0|	case VIPS_INTERPRETATION_B_W:
  ------------------
  |  Branch (500:2): [True: 0, False: 4.91k]
  ------------------
  501|      0|	case VIPS_INTERPRETATION_HISTOGRAM:
  ------------------
  |  Branch (501:2): [True: 0, False: 4.91k]
  ------------------
  502|      0|	case VIPS_INTERPRETATION_MULTIBAND:
  ------------------
  |  Branch (502:2): [True: 0, False: 4.91k]
  ------------------
  503|      0|		format = image->BandFmt;
  504|      0|		break;
  505|       |
  506|      0|	case VIPS_INTERPRETATION_FOURIER:
  ------------------
  |  Branch (506:2): [True: 0, False: 4.91k]
  ------------------
  507|      0|		if (image->BandFmt == VIPS_FORMAT_DOUBLE ||
  ------------------
  |  Branch (507:7): [True: 0, False: 0]
  ------------------
  508|      0|			image->BandFmt == VIPS_FORMAT_DPCOMPLEX)
  ------------------
  |  Branch (508:4): [True: 0, False: 0]
  ------------------
  509|      0|			format = VIPS_FORMAT_DPCOMPLEX;
  510|      0|		else
  511|      0|			format = VIPS_FORMAT_COMPLEX;
  512|      0|		break;
  513|       |
  514|      0|	case VIPS_INTERPRETATION_sRGB:
  ------------------
  |  Branch (514:2): [True: 0, False: 4.91k]
  ------------------
  515|      0|	case VIPS_INTERPRETATION_RGB:
  ------------------
  |  Branch (515:2): [True: 0, False: 4.91k]
  ------------------
  516|      0|		format = VIPS_FORMAT_UCHAR;
  517|      0|		break;
  518|       |
  519|      0|	case VIPS_INTERPRETATION_XYZ:
  ------------------
  |  Branch (519:2): [True: 0, False: 4.91k]
  ------------------
  520|  4.91k|	case VIPS_INTERPRETATION_LAB:
  ------------------
  |  Branch (520:2): [True: 4.91k, False: 0]
  ------------------
  521|  4.91k|	case VIPS_INTERPRETATION_CMC:
  ------------------
  |  Branch (521:2): [True: 0, False: 4.91k]
  ------------------
  522|  4.91k|	case VIPS_INTERPRETATION_LCH:
  ------------------
  |  Branch (522:2): [True: 0, False: 4.91k]
  ------------------
  523|  4.91k|	case VIPS_INTERPRETATION_HSV:
  ------------------
  |  Branch (523:2): [True: 0, False: 4.91k]
  ------------------
  524|  4.91k|	case VIPS_INTERPRETATION_scRGB:
  ------------------
  |  Branch (524:2): [True: 0, False: 4.91k]
  ------------------
  525|  4.91k|	case VIPS_INTERPRETATION_YXY:
  ------------------
  |  Branch (525:2): [True: 0, False: 4.91k]
  ------------------
  526|  4.91k|		format = VIPS_FORMAT_FLOAT;
  527|  4.91k|		break;
  528|       |
  529|      0|	case VIPS_INTERPRETATION_CMYK:
  ------------------
  |  Branch (529:2): [True: 0, False: 4.91k]
  ------------------
  530|      0|		if (image->BandFmt == VIPS_FORMAT_USHORT)
  ------------------
  |  Branch (530:7): [True: 0, False: 0]
  ------------------
  531|      0|			format = VIPS_FORMAT_USHORT;
  532|      0|		else
  533|      0|			format = VIPS_FORMAT_UCHAR;
  534|      0|		break;
  535|       |
  536|      0|	case VIPS_INTERPRETATION_LABQ:
  ------------------
  |  Branch (536:2): [True: 0, False: 4.91k]
  ------------------
  537|      0|		format = VIPS_FORMAT_UCHAR;
  538|      0|		break;
  539|       |
  540|      0|	case VIPS_INTERPRETATION_LABS:
  ------------------
  |  Branch (540:2): [True: 0, False: 4.91k]
  ------------------
  541|      0|		format = VIPS_FORMAT_SHORT;
  542|      0|		break;
  543|       |
  544|      0|	case VIPS_INTERPRETATION_GREY16:
  ------------------
  |  Branch (544:2): [True: 0, False: 4.91k]
  ------------------
  545|      0|	case VIPS_INTERPRETATION_RGB16:
  ------------------
  |  Branch (545:2): [True: 0, False: 4.91k]
  ------------------
  546|      0|		format = VIPS_FORMAT_USHORT;
  547|      0|		break;
  548|       |
  549|      0|	case VIPS_INTERPRETATION_MATRIX:
  ------------------
  |  Branch (549:2): [True: 0, False: 4.91k]
  ------------------
  550|      0|		if (image->BandFmt == VIPS_FORMAT_DOUBLE)
  ------------------
  |  Branch (550:7): [True: 0, False: 0]
  ------------------
  551|      0|			format = VIPS_FORMAT_DOUBLE;
  552|      0|		else
  553|      0|			format = VIPS_FORMAT_FLOAT;
  554|      0|		break;
  555|       |
  556|      0|	default:
  ------------------
  |  Branch (556:2): [True: 0, False: 4.91k]
  ------------------
  557|      0|		format = VIPS_FORMAT_NOTSET;
  558|      0|		break;
  559|  4.91k|	}
  560|       |
  561|  4.91k|	return format;
  562|  4.91k|}
vips_image_get_interpretation:
  587|  30.9k|{
  588|  30.9k|	return image->Type;
  589|  30.9k|}
vips_image_guess_interpretation:
  674|  31.1k|{
  675|  31.1k|	gboolean sane;
  676|       |
  677|  31.1k|	sane = TRUE;
  ------------------
  |  |  798|  31.1k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  31.1k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  678|       |
  679|       |	/* Coding overrides interpretation.
  680|       |	 */
  681|  31.1k|	switch (image->Coding) {
  682|      0|	case VIPS_CODING_ERROR:
  ------------------
  |  Branch (682:2): [True: 0, False: 31.1k]
  ------------------
  683|      0|		sane = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  684|      0|		break;
  685|       |
  686|     25|	case VIPS_CODING_LABQ:
  ------------------
  |  Branch (686:2): [True: 25, False: 31.1k]
  ------------------
  687|     25|		if (image->Type != VIPS_INTERPRETATION_LABQ)
  ------------------
  |  Branch (687:7): [True: 25, False: 0]
  ------------------
  688|     25|			sane = FALSE;
  ------------------
  |  |  794|     25|#define	FALSE	(0)
  ------------------
  689|     25|		break;
  690|       |
  691|      0|	case VIPS_CODING_RAD:
  ------------------
  |  Branch (691:2): [True: 0, False: 31.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|  31.1k|	default:
  ------------------
  |  Branch (696:2): [True: 31.1k, False: 25]
  ------------------
  697|  31.1k|		break;
  698|  31.1k|	}
  699|       |
  700|  31.1k|	switch (image->Type) {
  701|      0|	case VIPS_INTERPRETATION_ERROR:
  ------------------
  |  Branch (701:2): [True: 0, False: 31.1k]
  ------------------
  702|      0|		sane = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  703|      0|		break;
  704|       |
  705|     26|	case VIPS_INTERPRETATION_MULTIBAND:
  ------------------
  |  Branch (705:2): [True: 26, False: 31.1k]
  ------------------
  706|       |		/* This is a pretty useless generic tag. Always reset it.
  707|       |		 */
  708|     26|		sane = FALSE;
  ------------------
  |  |  794|     26|#define	FALSE	(0)
  ------------------
  709|     26|		break;
  710|       |
  711|  5.20k|	case VIPS_INTERPRETATION_B_W:
  ------------------
  |  Branch (711:2): [True: 5.20k, False: 25.9k]
  ------------------
  712|       |		/* Don't test bands, we allow bands after the first to be
  713|       |		 * unused extras, like alpha.
  714|       |		 */
  715|  5.20k|		break;
  716|       |
  717|      0|	case VIPS_INTERPRETATION_HISTOGRAM:
  ------------------
  |  Branch (717:2): [True: 0, False: 31.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: 31.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|    247|	case VIPS_INTERPRETATION_XYZ:
  ------------------
  |  Branch (727:2): [True: 247, False: 30.9k]
  ------------------
  728|    288|	case VIPS_INTERPRETATION_LAB:
  ------------------
  |  Branch (728:2): [True: 41, False: 31.1k]
  ------------------
  729|    288|	case VIPS_INTERPRETATION_RGB:
  ------------------
  |  Branch (729:2): [True: 0, False: 31.1k]
  ------------------
  730|    288|	case VIPS_INTERPRETATION_CMC:
  ------------------
  |  Branch (730:2): [True: 0, False: 31.1k]
  ------------------
  731|    288|	case VIPS_INTERPRETATION_LCH:
  ------------------
  |  Branch (731:2): [True: 0, False: 31.1k]
  ------------------
  732|  8.11k|	case VIPS_INTERPRETATION_sRGB:
  ------------------
  |  Branch (732:2): [True: 7.83k, False: 23.3k]
  ------------------
  733|  8.11k|	case VIPS_INTERPRETATION_HSV:
  ------------------
  |  Branch (733:2): [True: 0, False: 31.1k]
  ------------------
  734|  8.11k|		if (image->Bands < 3)
  ------------------
  |  Branch (734:7): [True: 212, False: 7.90k]
  ------------------
  735|    212|			sane = FALSE;
  ------------------
  |  |  794|    212|#define	FALSE	(0)
  ------------------
  736|  8.11k|		break;
  737|       |
  738|    352|	case VIPS_INTERPRETATION_scRGB:
  ------------------
  |  Branch (738:2): [True: 352, False: 30.8k]
  ------------------
  739|    352|	case VIPS_INTERPRETATION_YXY:
  ------------------
  |  Branch (739:2): [True: 0, False: 31.1k]
  ------------------
  740|       |		/* Need float values in 0 - 1.
  741|       |		 */
  742|    352|		if (!vips_band_format_isfloat(image->BandFmt) ||
  ------------------
  |  Branch (742:7): [True: 0, False: 352]
  ------------------
  743|    352|			image->Bands < 3)
  ------------------
  |  Branch (743:4): [True: 0, False: 352]
  ------------------
  744|      0|			sane = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  745|    352|		break;
  746|       |
  747|    743|	case VIPS_INTERPRETATION_CMYK:
  ------------------
  |  Branch (747:2): [True: 743, False: 30.4k]
  ------------------
  748|    743|		if (image->Bands < 4)
  ------------------
  |  Branch (748:7): [True: 0, False: 743]
  ------------------
  749|      0|			sane = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  750|    743|		break;
  751|       |
  752|      0|	case VIPS_INTERPRETATION_LABQ:
  ------------------
  |  Branch (752:2): [True: 0, False: 31.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|  15.6k|	case VIPS_INTERPRETATION_LABS:
  ------------------
  |  Branch (757:2): [True: 15.6k, False: 15.5k]
  ------------------
  758|       |		/* Needs to be able to express +/- 32767
  759|       |		 */
  760|  15.6k|		if (vips_band_format_isuint(image->BandFmt) ||
  ------------------
  |  Branch (760:7): [True: 0, False: 15.6k]
  ------------------
  761|  15.6k|			vips_band_format_is8bit(image->BandFmt) ||
  ------------------
  |  Branch (761:4): [True: 0, False: 15.6k]
  ------------------
  762|  15.6k|			image->Bands < 3)
  ------------------
  |  Branch (762:4): [True: 0, False: 15.6k]
  ------------------
  763|      0|			sane = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  764|  15.6k|		break;
  765|       |
  766|    626|	case VIPS_INTERPRETATION_RGB16:
  ------------------
  |  Branch (766:2): [True: 626, False: 30.5k]
  ------------------
  767|    626|		if (vips_band_format_is8bit(image->BandFmt) ||
  ------------------
  |  Branch (767:7): [True: 0, False: 626]
  ------------------
  768|    626|			image->Bands < 3)
  ------------------
  |  Branch (768:4): [True: 0, False: 626]
  ------------------
  769|      0|			sane = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  770|    626|		break;
  771|       |
  772|    437|	case VIPS_INTERPRETATION_GREY16:
  ------------------
  |  Branch (772:2): [True: 437, False: 30.7k]
  ------------------
  773|    437|		if (vips_band_format_is8bit(image->BandFmt))
  ------------------
  |  Branch (773:7): [True: 0, False: 437]
  ------------------
  774|      0|			sane = FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  775|    437|		break;
  776|       |
  777|      0|	case VIPS_INTERPRETATION_MATRIX:
  ------------------
  |  Branch (777:2): [True: 0, False: 31.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: 31.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|  31.1k|	}
  785|       |
  786|  31.1k|	if (sane)
  ------------------
  |  Branch (786:6): [True: 30.9k, False: 263]
  ------------------
  787|  30.9k|		return vips_image_get_interpretation(image);
  788|    263|	else
  789|    263|		return vips_image_default_interpretation(image);
  790|  31.1k|}
vips_image_get_scale:
  879|  93.4k|{
  880|  93.4k|	double scale;
  881|       |
  882|  93.4k|	scale = 1.0;
  883|  93.4k|	if (vips_image_get_typeof(image, "scale"))
  ------------------
  |  Branch (883:6): [True: 93.4k, False: 0]
  ------------------
  884|  93.4k|		vips_image_get_double(image, "scale", &scale);
  885|       |
  886|  93.4k|	return scale;
  887|  93.4k|}
vips_image_get_offset:
  900|  62.3k|{
  901|  62.3k|	double offset;
  902|       |
  903|  62.3k|	offset = 0.0;
  904|  62.3k|	if (vips_image_get_typeof(image, "offset"))
  ------------------
  |  Branch (904:6): [True: 62.3k, False: 0]
  ------------------
  905|  62.3k|		vips_image_get_double(image, "offset", &offset);
  906|       |
  907|  62.3k|	return offset;
  908|  62.3k|}
vips_image_get_concurrency:
  972|   272k|{
  973|   272k|	int concurrency;
  974|       |
  975|   272k|	if (vips_image_get_typeof(image, VIPS_META_CONCURRENCY) &&
  ------------------
  |  |  179|   272k|#define VIPS_META_CONCURRENCY "concurrency"
  ------------------
  |  Branch (975:6): [True: 0, False: 272k]
  ------------------
  976|   272k|		!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|   272k|		concurrency >= 1 &&
  ------------------
  |  Branch (978:3): [True: 0, False: 0]
  ------------------
  979|   272k|		concurrency < 100)
  ------------------
  |  Branch (979:3): [True: 0, False: 0]
  ------------------
  980|      0|		return concurrency;
  981|       |
  982|   272k|	return default_concurrency;
  983|   272k|}
vips_image_init_fields:
 1100|  21.8k|{
 1101|  21.8k|	g_object_set(image,
 1102|  21.8k|		"width", xsize,
 1103|  21.8k|		"height", ysize,
 1104|  21.8k|		"bands", bands,
 1105|  21.8k|		"format", format,
 1106|  21.8k|		NULL);
 1107|       |
 1108|  21.8k|	image->Coding = coding;
 1109|  21.8k|	image->Type = interpretation;
 1110|  21.8k|	image->Xres = VIPS_MAX(0, xres);
  ------------------
  |  |   54|  21.8k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 21.8k]
  |  |  ------------------
  ------------------
 1111|  21.8k|	image->Yres = VIPS_MAX(0, yres);
  ------------------
  |  |   54|  21.8k|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 21.8k]
  |  |  ------------------
  ------------------
 1112|  21.8k|}
vips__image_meta_copy:
 1141|  1.10M|{
 1142|  1.10M|	if (src->meta) {
  ------------------
  |  Branch (1142:6): [True: 1.09M, False: 5.88k]
  ------------------
 1143|       |		/* We lock with vips_image_set() to stop races in highly-
 1144|       |		 * threaded applications.
 1145|       |		 */
 1146|  1.09M|		g_mutex_lock(&vips__meta_lock);
 1147|  1.09M|		meta_init(dst);
 1148|  1.09M|		vips_slist_map2(src->meta_traverse,
 1149|  1.09M|			(VipsSListMap2Fn) meta_cp_field, dst, NULL);
 1150|  1.09M|		g_mutex_unlock(&vips__meta_lock);
 1151|  1.09M|	}
 1152|       |
 1153|  1.10M|	return 0;
 1154|  1.10M|}
vips__image_copy_fields_array:
 1161|  1.04M|{
 1162|  1.04M|	int i;
 1163|  1.04M|	int ni;
 1164|       |
 1165|  1.04M|	g_assert(in[0]);
  ------------------
  |  |  166|  1.04M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  1.04M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.04M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1166|       |
 1167|       |	/* Copy magic too, handy for knowing the original image's byte order.
 1168|       |	 */
 1169|  1.04M|	out->magic = in[0]->magic;
 1170|       |
 1171|  1.04M|	out->Xsize = in[0]->Xsize;
 1172|  1.04M|	out->Ysize = in[0]->Ysize;
 1173|  1.04M|	out->Bands = in[0]->Bands;
 1174|  1.04M|	out->Bbits = in[0]->Bbits;
 1175|  1.04M|	out->BandFmt = in[0]->BandFmt;
 1176|  1.04M|	out->Type = in[0]->Type;
 1177|  1.04M|	out->Coding = in[0]->Coding;
 1178|  1.04M|	out->Xres = in[0]->Xres;
 1179|  1.04M|	out->Yres = in[0]->Yres;
 1180|  1.04M|	out->Xoffset = in[0]->Xoffset;
 1181|  1.04M|	out->Yoffset = in[0]->Yoffset;
 1182|       |
 1183|       |	/* Count number of images.
 1184|       |	 */
 1185|  2.14M|	for (ni = 0; in[ni]; ni++)
  ------------------
  |  Branch (1185:15): [True: 1.10M, False: 1.04M]
  ------------------
 1186|  1.10M|		;
 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|  2.14M|	for (i = ni - 1; i >= 0; i--)
  ------------------
  |  Branch (1195:19): [True: 1.10M, False: 1.04M]
  ------------------
 1196|  1.10M|		if (vips__image_meta_copy(out, in[i]))
  ------------------
  |  Branch (1196:7): [True: 0, False: 1.10M]
  ------------------
 1197|      0|			return -1;
 1198|       |
 1199|       |	/* Merge hists first to last.
 1200|       |	 */
 1201|  2.14M|	for (i = 0; in[i]; i++)
  ------------------
  |  Branch (1201:14): [True: 1.10M, False: 1.04M]
  ------------------
 1202|  1.10M|		out->history_list = vips__gslist_gvalue_merge(
 1203|  1.10M|			out->history_list, in[i]->history_list);
 1204|       |
 1205|  1.04M|	return 0;
 1206|  1.04M|}
vips_image_set:
 1234|   229k|{
 1235|   229k|	g_assert(name);
  ------------------
  |  |  166|   229k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   229k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   229k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1236|   229k|	g_assert(value);
  ------------------
  |  |  166|   229k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   229k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   229k|#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|   229k|	g_mutex_lock(&vips__meta_lock);
 1246|   229k|	meta_init(image);
 1247|   229k|	(void) meta_new(image, name, value);
 1248|   229k|	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|   229k|	if (strcmp(name, VIPS_META_EXIF_NAME) == 0)
  ------------------
  |  |   46|   229k|#define VIPS_META_EXIF_NAME "exif-data"
  ------------------
  |  Branch (1256:6): [True: 1.91k, False: 227k]
  ------------------
 1257|  1.91k|		if (vips__exif_parse(image))
  ------------------
  |  Branch (1257:7): [True: 0, False: 1.91k]
  ------------------
 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|   229k|}
vips_image_get:
 1337|   163k|{
 1338|   163k|	int i;
 1339|   163k|	VipsMeta *meta;
 1340|       |
 1341|   163k|	g_assert(name);
  ------------------
  |  |  166|   163k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   163k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   163k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1342|   163k|	g_assert(value_copy);
  ------------------
  |  |  166|   163k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   163k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   163k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1343|       |
 1344|  1.92M|	for (i = 0; i < VIPS_NUMBER(vips_header_fields); i++) {
  ------------------
  |  |   60|  1.92M|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (1344:14): [True: 1.76M, False: 157k]
  ------------------
 1345|  1.76M|		HeaderField *field = &vips_header_fields[i];
 1346|       |
 1347|  1.76M|		if (strcmp(field->name, name) == 0) {
  ------------------
  |  Branch (1347:7): [True: 5.28k, False: 1.76M]
  ------------------
 1348|  5.28k|			GType gtype = g_type_from_name(field->type);
 1349|       |
 1350|  5.28k|			g_value_init(value_copy, gtype);
 1351|  5.28k|			vips_set_value_from_pointer(value_copy,
 1352|  5.28k|				G_STRUCT_MEMBER_P(image, field->offset));
  ------------------
  |  |  840|  5.28k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  ------------------
 1353|       |
 1354|  5.28k|			return 0;
 1355|  5.28k|		}
 1356|  1.76M|	}
 1357|       |
 1358|  1.89M|	for (i = 0; i < VIPS_NUMBER(vips_header_fields_old); i++) {
  ------------------
  |  |   60|  1.89M|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (1358:14): [True: 1.73M, False: 157k]
  ------------------
 1359|  1.73M|		HeaderField *field = &vips_header_fields_old[i];
 1360|       |
 1361|  1.73M|		if (strcmp(field->name, name) == 0) {
  ------------------
  |  Branch (1361:7): [True: 0, False: 1.73M]
  ------------------
 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|  1.73M|	}
 1371|       |
 1372|   157k|	if (image->meta &&
  ------------------
  |  Branch (1372:6): [True: 157k, False: 0]
  ------------------
 1373|   157k|		(meta = g_hash_table_lookup(image->meta, name))) {
  ------------------
  |  Branch (1373:3): [True: 157k, False: 0]
  ------------------
 1374|   157k|		g_value_init(value_copy, G_VALUE_TYPE(&meta->value));
  ------------------
  |  |   59|   157k|#define	G_VALUE_TYPE(value)		(((GValue*) (value))->g_type)
  ------------------
 1375|   157k|		g_value_copy(&meta->value, value_copy);
 1376|       |
 1377|   157k|		return 0;
 1378|   157k|	}
 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|   157k|}
vips_image_get_typeof:
 1400|   609k|{
 1401|   609k|	int i;
 1402|   609k|	VipsMeta *meta;
 1403|       |
 1404|   609k|	g_assert(name);
  ------------------
  |  |  166|   609k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   609k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   609k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1405|       |
 1406|  7.30M|	for (i = 0; i < VIPS_NUMBER(vips_header_fields); i++) {
  ------------------
  |  |   60|  7.30M|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (1406:14): [True: 6.69M, False: 609k]
  ------------------
 1407|  6.69M|		HeaderField *field = &vips_header_fields[i];
 1408|       |
 1409|  6.69M|		if (strcmp(field->name, name) == 0)
  ------------------
  |  Branch (1409:7): [True: 0, False: 6.69M]
  ------------------
 1410|      0|			return g_type_from_name(field->type);
 1411|  6.69M|	}
 1412|       |
 1413|  7.30M|	for (i = 0; i < VIPS_NUMBER(vips_header_fields_old); i++) {
  ------------------
  |  |   60|  7.30M|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (1413:14): [True: 6.69M, False: 609k]
  ------------------
 1414|  6.69M|		HeaderField *field = &vips_header_fields_old[i];
 1415|       |
 1416|  6.69M|		if (strcmp(field->name, name) == 0)
  ------------------
  |  Branch (1416:7): [True: 0, False: 6.69M]
  ------------------
 1417|      0|			return g_type_from_name(field->type);
 1418|  6.69M|	}
 1419|       |
 1420|   609k|	if (image->meta &&
  ------------------
  |  Branch (1420:6): [True: 599k, False: 9.28k]
  ------------------
 1421|   609k|		(meta = g_hash_table_lookup(image->meta, name)))
  ------------------
  |  Branch (1421:3): [True: 159k, False: 440k]
  ------------------
 1422|   159k|		return G_VALUE_TYPE(&meta->value);
  ------------------
  |  |   59|   159k|#define	G_VALUE_TYPE(value)		(((GValue*) (value))->g_type)
  ------------------
 1423|       |
 1424|   609k|	VIPS_DEBUG_MSG("vips_image_get_typeof: unknown field %s\n", name);
  ------------------
  |  |   47|   449k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   449k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   449k|	{ \
  |  |   49|   449k|		; \
  |  |   50|   449k|	} \
  |  |   51|   609k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   609k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1425|       |
 1426|   449k|	return 0;
 1427|   609k|}
vips_image_remove:
 1443|  23.0k|{
 1444|  23.0k|	gboolean result;
 1445|       |
 1446|  23.0k|	result = FALSE;
  ------------------
  |  |  794|  23.0k|#define	FALSE	(0)
  ------------------
 1447|       |
 1448|  23.0k|	if (image->meta) {
  ------------------
  |  Branch (1448:6): [True: 22.8k, False: 231]
  ------------------
 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.8k|		g_mutex_lock(&vips__meta_lock);
 1457|  22.8k|		result = g_hash_table_remove(image->meta, name);
 1458|  22.8k|		g_mutex_unlock(&vips__meta_lock);
 1459|  22.8k|	}
 1460|       |
 1461|  23.0k|	return result;
 1462|  23.0k|}
vips_image_map:
 1506|    480|{
 1507|    480|	int i;
 1508|    480|	GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|    480|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 1509|    480|	void *result;
 1510|       |
 1511|  5.76k|	for (i = 0; i < VIPS_NUMBER(vips_header_fields); i++) {
  ------------------
  |  |   60|  5.76k|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (1511:14): [True: 5.28k, False: 480]
  ------------------
 1512|  5.28k|		HeaderField *field = &vips_header_fields[i];
 1513|       |
 1514|  5.28k|		(void) vips_image_get(image, field->name, &value);
 1515|  5.28k|		result = fn(image, field->name, &value, a);
 1516|  5.28k|		g_value_unset(&value);
 1517|       |
 1518|  5.28k|		if (result)
  ------------------
  |  Branch (1518:7): [True: 0, False: 5.28k]
  ------------------
 1519|      0|			return result;
 1520|  5.28k|	}
 1521|       |
 1522|    480|	if (image->meta_traverse &&
  ------------------
  |  Branch (1522:6): [True: 249, False: 231]
  ------------------
 1523|    480|		(result = vips_slist_map2(image->meta_traverse,
  ------------------
  |  Branch (1523:3): [True: 0, False: 249]
  ------------------
 1524|    249|			 (VipsSListMap2Fn) vips_image_map_fn, fn, a)))
 1525|      0|		return result;
 1526|       |
 1527|    480|	return NULL;
 1528|    480|}
vips_image_set_blob:
 1673|  3.00k|{
 1674|  3.00k|	GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|  3.00k|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 1675|       |
 1676|  3.00k|	g_value_init(&value, VIPS_TYPE_BLOB);
  ------------------
  |  |  177|  3.00k|#define VIPS_TYPE_BLOB (vips_blob_get_type())
  ------------------
 1677|  3.00k|	vips_value_set_blob(&value, free_fn, data, size);
 1678|  3.00k|	vips_image_set(image, name, &value);
 1679|  3.00k|	g_value_unset(&value);
 1680|  3.00k|}
vips_image_set_blob_copy:
 1697|  4.06k|{
 1698|  4.06k|	void *data_copy;
 1699|       |
 1700|       |	/* Cap at 100mb for sanity.
 1701|       |	 */
 1702|  4.06k|	if (!data ||
  ------------------
  |  Branch (1702:6): [True: 1.81k, False: 2.24k]
  ------------------
 1703|  4.06k|		length == 0 ||
  ------------------
  |  Branch (1703:3): [True: 0, False: 2.24k]
  ------------------
 1704|  4.06k|		length > 100 * 1024 * 1024)
  ------------------
  |  Branch (1704:3): [True: 0, False: 2.24k]
  ------------------
 1705|  1.81k|		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|  2.24k|	if (!(data_copy = vips_malloc(NULL, length + 1)))
  ------------------
  |  Branch (1711:6): [True: 0, False: 2.24k]
  ------------------
 1712|      0|		return;
 1713|  2.24k|	memcpy(data_copy, data, length);
 1714|  2.24k|	((unsigned char *) data_copy)[length] = '\0';
 1715|       |
 1716|  2.24k|	vips_image_set_blob(image,
 1717|  2.24k|		name, (VipsCallbackFn) vips_area_free_cb, data_copy, length);
 1718|  2.24k|}
vips_image_get_blob:
 1738|  1.91k|{
 1739|  1.91k|	GValue value_copy = G_VALUE_INIT;
  ------------------
  |  |  191|  1.91k|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 1740|       |
 1741|  1.91k|	if (!meta_get_value(image, name, VIPS_TYPE_BLOB, &value_copy)) {
  ------------------
  |  |  177|  1.91k|#define VIPS_TYPE_BLOB (vips_blob_get_type())
  ------------------
  |  Branch (1741:6): [True: 1.91k, False: 0]
  ------------------
 1742|  1.91k|		*data = vips_value_get_blob(&value_copy, length);
 1743|  1.91k|		g_value_unset(&value_copy);
 1744|  1.91k|		return 0;
 1745|  1.91k|	}
 1746|       |
 1747|      0|	return -1;
 1748|  1.91k|}
vips_image_set_int:
 1791|  77.3k|{
 1792|  77.3k|	GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|  77.3k|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 1793|       |
 1794|  77.3k|	g_value_init(&value, G_TYPE_INT);
  ------------------
  |  |   94|  77.3k|#define G_TYPE_INT			G_TYPE_MAKE_FUNDAMENTAL (6)
  |  |  ------------------
  |  |  |  |  221|  77.3k|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|  77.3k|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1795|  77.3k|	g_value_set_int(&value, i);
 1796|  77.3k|	vips_image_set(image, name, &value);
 1797|  77.3k|	g_value_unset(&value);
 1798|  77.3k|}
vips_image_get_double:
 1816|   155k|{
 1817|   155k|	GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|   155k|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 1818|       |
 1819|   155k|	if (meta_get_value(image, name, G_TYPE_DOUBLE, &value))
  ------------------
  |  |  148|   155k|#define G_TYPE_DOUBLE			G_TYPE_MAKE_FUNDAMENTAL (15)
  |  |  ------------------
  |  |  |  |  221|   155k|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|   155k|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1819:6): [True: 0, False: 155k]
  ------------------
 1820|      0|		return -1;
 1821|   155k|	*out = g_value_get_double(&value);
 1822|   155k|	g_value_unset(&value);
 1823|       |
 1824|   155k|	return 0;
 1825|   155k|}
vips_image_set_double:
 1841|  86.5k|{
 1842|  86.5k|	GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|  86.5k|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 1843|       |
 1844|  86.5k|	g_value_init(&value, G_TYPE_DOUBLE);
  ------------------
  |  |  148|  86.5k|#define G_TYPE_DOUBLE			G_TYPE_MAKE_FUNDAMENTAL (15)
  |  |  ------------------
  |  |  |  |  221|  86.5k|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|  86.5k|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1845|  86.5k|	g_value_set_double(&value, d);
 1846|  86.5k|	vips_image_set(image, name, &value);
 1847|  86.5k|	g_value_unset(&value);
 1848|  86.5k|}
vips_image_get_string:
 1871|    186|{
 1872|    186|	GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|    186|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 1873|       |
 1874|    186|	if (vips_image_get(image, name, &value))
  ------------------
  |  Branch (1874:6): [True: 0, False: 186]
  ------------------
 1875|      0|		return -1;
 1876|       |
 1877|    186|	if (G_VALUE_TYPE(&value) == VIPS_TYPE_REF_STRING) {
  ------------------
  |  |   59|    186|#define	G_VALUE_TYPE(value)		(((GValue*) (value))->g_type)
  ------------------
              	if (G_VALUE_TYPE(&value) == VIPS_TYPE_REF_STRING) {
  ------------------
  |  |  159|    186|#define VIPS_TYPE_REF_STRING (vips_ref_string_get_type())
  ------------------
  |  Branch (1877:6): [True: 186, False: 0]
  ------------------
 1878|    186|		VipsArea *area;
 1879|       |
 1880|    186|		area = g_value_get_boxed(&value);
 1881|    186|		*out = area->data;
 1882|    186|	}
 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|    186|	g_value_unset(&value);
 1897|       |
 1898|    186|	return 0;
 1899|    186|}
vips_image_set_string:
 1915|  59.0k|{
 1916|  59.0k|	GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|  59.0k|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 1917|       |
 1918|  59.0k|	g_value_init(&value, VIPS_TYPE_REF_STRING);
  ------------------
  |  |  159|  59.0k|#define VIPS_TYPE_REF_STRING (vips_ref_string_get_type())
  ------------------
 1919|  59.0k|	vips_value_set_ref_string(&value, str);
 1920|  59.0k|	vips_image_set(image, name, &value);
 1921|  59.0k|	g_value_unset(&value);
 1922|  59.0k|}
vips_image_set_array_int:
 2096|  1.71k|{
 2097|  1.71k|	GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|  1.71k|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 2098|       |
 2099|  1.71k|	g_value_init(&value, VIPS_TYPE_ARRAY_INT);
  ------------------
  |  |  221|  1.71k|#define VIPS_TYPE_ARRAY_INT (vips_array_int_get_type())
  ------------------
 2100|  1.71k|	vips_value_set_array_int(&value, array, n);
 2101|  1.71k|	vips_image_set(image, name, &value);
 2102|  1.71k|	g_value_unset(&value);
 2103|  1.71k|}
vips_image_set_array_double:
 2154|    961|{
 2155|    961|	GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|    961|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 2156|       |
 2157|    961|	g_value_init(&value, VIPS_TYPE_ARRAY_DOUBLE);
  ------------------
  |  |  201|    961|#define VIPS_TYPE_ARRAY_DOUBLE (vips_array_double_get_type())
  ------------------
 2158|    961|	vips_value_set_array_double(&value, array, n);
 2159|    961|	vips_image_set(image, name, &value);
 2160|    961|	g_value_unset(&value);
 2161|    961|}
header.c:vips_image_default_interpretation:
  595|    263|{
  596|    263|	switch (image->Coding) {
  597|     25|	case VIPS_CODING_LABQ:
  ------------------
  |  Branch (597:2): [True: 25, False: 238]
  ------------------
  598|     25|		return VIPS_INTERPRETATION_LABQ;
  599|      0|	case VIPS_CODING_RAD:
  ------------------
  |  Branch (599:2): [True: 0, False: 263]
  ------------------
  600|      0|		return VIPS_INTERPRETATION_sRGB;
  601|    238|	default:
  ------------------
  |  Branch (601:2): [True: 238, False: 25]
  ------------------
  602|    238|		break;
  603|    263|	}
  604|       |
  605|    238|	switch (image->BandFmt) {
  606|    214|	case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (606:2): [True: 214, False: 24]
  ------------------
  607|    216|	case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (607:2): [True: 2, False: 236]
  ------------------
  608|    225|	case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (608:2): [True: 9, False: 229]
  ------------------
  609|    226|	case VIPS_FORMAT_INT:
  ------------------
  |  Branch (609:2): [True: 1, False: 237]
  ------------------
  610|    228|	case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (610:2): [True: 2, False: 236]
  ------------------
  611|    228|	case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (611:2): [True: 0, False: 238]
  ------------------
  612|    228|		switch (image->Bands) {
  613|      5|		case 1:
  ------------------
  |  Branch (613:3): [True: 5, False: 223]
  ------------------
  614|    218|		case 2:
  ------------------
  |  Branch (614:3): [True: 213, False: 15]
  ------------------
  615|    218|			return VIPS_INTERPRETATION_B_W;
  616|       |
  617|      3|		case 3:
  ------------------
  |  Branch (617:3): [True: 3, False: 225]
  ------------------
  618|     10|		case 4:
  ------------------
  |  Branch (618:3): [True: 7, False: 221]
  ------------------
  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|     10|			return VIPS_INTERPRETATION_sRGB;
  626|       |
  627|      0|		default:
  ------------------
  |  Branch (627:3): [True: 0, False: 228]
  ------------------
  628|      0|			return VIPS_INTERPRETATION_MULTIBAND;
  629|    228|		}
  630|       |
  631|      2|	case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (631:2): [True: 2, False: 236]
  ------------------
  632|      2|		switch (image->Bands) {
  633|      1|		case 1:
  ------------------
  |  Branch (633:3): [True: 1, False: 1]
  ------------------
  634|      1|			return VIPS_INTERPRETATION_MATRIX;
  635|       |
  636|      1|		default:
  ------------------
  |  Branch (636:3): [True: 1, False: 1]
  ------------------
  637|      1|			return VIPS_INTERPRETATION_MULTIBAND;
  638|      2|		}
  639|       |
  640|      8|	case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (640:2): [True: 8, False: 230]
  ------------------
  641|      8|		switch (image->Bands) {
  642|      3|		case 1:
  ------------------
  |  Branch (642:3): [True: 3, False: 5]
  ------------------
  643|      4|		case 2:
  ------------------
  |  Branch (643:3): [True: 1, False: 7]
  ------------------
  644|      4|			return VIPS_INTERPRETATION_GREY16;
  645|       |
  646|      2|		case 3:
  ------------------
  |  Branch (646:3): [True: 2, False: 6]
  ------------------
  647|      4|		case 4:
  ------------------
  |  Branch (647:3): [True: 2, False: 6]
  ------------------
  648|      4|			return VIPS_INTERPRETATION_RGB16;
  649|       |
  650|      0|		default:
  ------------------
  |  Branch (650:3): [True: 0, False: 8]
  ------------------
  651|      0|			return VIPS_INTERPRETATION_MULTIBAND;
  652|      8|		}
  653|       |
  654|      0|	case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (654:2): [True: 0, False: 238]
  ------------------
  655|      0|	case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (655:2): [True: 0, False: 238]
  ------------------
  656|      0|		return VIPS_INTERPRETATION_FOURIER;
  657|       |
  658|      0|	default:
  ------------------
  |  Branch (658:2): [True: 0, False: 238]
  ------------------
  659|      0|		return VIPS_INTERPRETATION_MULTIBAND;
  660|    238|	}
  661|    238|}
header.c:meta_init:
  382|  1.32M|{
  383|  1.32M|	if (!im->meta) {
  ------------------
  |  Branch (383:6): [True: 1.09M, False: 232k]
  ------------------
  384|  1.09M|		g_assert(!im->meta_traverse);
  ------------------
  |  |  166|  1.09M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  1.09M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.09M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  385|  1.09M|		im->meta = g_hash_table_new_full(g_str_hash, g_str_equal,
  386|  1.09M|			NULL, (GDestroyNotify) meta_free);
  387|  1.09M|	}
  388|  1.32M|}
header.c:meta_free:
  307|  4.51M|{
  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|  4.51M|	if (meta->im)
  ------------------
  |  Branch (319:6): [True: 4.51M, False: 0]
  ------------------
  320|  4.51M|		meta->im->meta_traverse =
  321|  4.51M|			g_slist_remove(meta->im->meta_traverse, meta);
  322|       |
  323|  4.51M|	g_value_unset(&meta->value);
  324|  4.51M|	g_free(meta->name);
  325|  4.51M|	g_free(meta);
  326|  4.51M|}
header.c:meta_cp_field:
 1116|  4.29M|{
 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|  4.29M|	(void) meta_new(dst, meta->name, &meta->value);
 1129|       |
 1130|       |#ifdef DEBUG
 1131|       |	meta_sanity(dst);
 1132|       |#endif /*DEBUG*/
 1133|       |
 1134|  4.29M|	return NULL;
 1135|  4.29M|}
header.c:meta_new:
  330|  4.52M|{
  331|  4.52M|	VipsMeta *meta;
  332|       |
  333|  4.52M|	meta = g_new(VipsMeta, 1);
  ------------------
  |  |  282|  4.52M|#define g_new(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc)
  |  |  ------------------
  |  |  |  |  227|  4.52M|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|  4.52M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|  4.52M|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|  4.52M|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|  4.52M|	  gpointer __p;						\
  |  |  |  |  231|  4.52M|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 4.52M]
  |  |  |  |  ------------------
  |  |  |  |  232|  4.52M|	    __p = g_##func (__n);				\
  |  |  |  |  233|  4.52M|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 4.52M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|  4.52M|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 4.52M]
  |  |  |  |  |  Branch (234:26): [True: 4.52M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|  4.52M|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|  4.52M|	  else							\
  |  |  |  |  237|  4.52M|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|  4.52M|	  __p;							\
  |  |  |  |  239|  4.52M|	}))
  |  |  ------------------
  ------------------
  334|  4.52M|	meta->im = image;
  335|  4.52M|	meta->name = NULL;
  336|  4.52M|	memset(&meta->value, 0, sizeof(GValue));
  337|  4.52M|	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|  4.52M|	if (G_VALUE_TYPE(value) == G_TYPE_STRING)
  ------------------
  |  |   59|  4.52M|#define	G_VALUE_TYPE(value)		(((GValue*) (value))->g_type)
  ------------------
              	if (G_VALUE_TYPE(value) == G_TYPE_STRING)
  ------------------
  |  |  154|  4.52M|#define G_TYPE_STRING			G_TYPE_MAKE_FUNDAMENTAL (16)
  |  |  ------------------
  |  |  |  |  221|  4.52M|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|  4.52M|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (346:6): [True: 0, False: 4.52M]
  ------------------
  347|      0|		g_value_init(&meta->value, VIPS_TYPE_REF_STRING);
  ------------------
  |  |  159|      0|#define VIPS_TYPE_REF_STRING (vips_ref_string_get_type())
  ------------------
  348|  4.52M|	else
  349|  4.52M|		g_value_init(&meta->value, G_VALUE_TYPE(value));
  ------------------
  |  |   59|  4.52M|#define	G_VALUE_TYPE(value)		(((GValue*) (value))->g_type)
  ------------------
  350|       |
  351|       |	/* We don't do any conversions that can fail.
  352|       |	 */
  353|  4.52M|	(void) g_value_transform(value, &meta->value);
  354|       |
  355|  4.52M|	image->meta_traverse = g_slist_append(image->meta_traverse, meta);
  356|  4.52M|	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|  4.52M|	return meta;
  369|  4.52M|}
header.c:vips_set_value_from_pointer:
 1270|  5.28k|{
 1271|  5.28k|	GType type = G_VALUE_TYPE(value);
  ------------------
  |  |   59|  5.28k|#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|  5.28k|	GType fundamental = G_TYPE_FUNDAMENTAL(type);
  ------------------
  |  |   38|  5.28k|#define G_TYPE_FUNDAMENTAL(type)	(g_type_fundamental (type))
  ------------------
 1277|       |
 1278|  5.28k|	if (fundamental == G_TYPE_INT)
  ------------------
  |  |   94|  5.28k|#define G_TYPE_INT			G_TYPE_MAKE_FUNDAMENTAL (6)
  |  |  ------------------
  |  |  |  |  221|  5.28k|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|  5.28k|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1278:6): [True: 2.40k, False: 2.88k]
  ------------------
 1279|  2.40k|		g_value_set_int(value, *((int *) data));
 1280|  2.88k|	else if (fundamental == G_TYPE_DOUBLE)
  ------------------
  |  |  148|  2.88k|#define G_TYPE_DOUBLE			G_TYPE_MAKE_FUNDAMENTAL (15)
  |  |  ------------------
  |  |  |  |  221|  2.88k|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|  2.88k|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1280:11): [True: 960, False: 1.92k]
  ------------------
 1281|    960|		g_value_set_double(value, *((double *) data));
 1282|  1.92k|	else if (fundamental == G_TYPE_ENUM)
  ------------------
  |  |  130|  1.92k|#define G_TYPE_ENUM			G_TYPE_MAKE_FUNDAMENTAL (12)
  |  |  ------------------
  |  |  |  |  221|  1.92k|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|  1.92k|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1282:11): [True: 1.44k, False: 480]
  ------------------
 1283|  1.44k|		g_value_set_enum(value, *((int *) data));
 1284|    480|	else if (fundamental == G_TYPE_STRING)
  ------------------
  |  |  154|    480|#define G_TYPE_STRING			G_TYPE_MAKE_FUNDAMENTAL (16)
  |  |  ------------------
  |  |  |  |  221|    480|#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
  |  |  |  |  ------------------
  |  |  |  |  |  |  210|    480|#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1284:11): [True: 480, 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|    480|		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|  5.28k|			G_STRLOC,
 1292|  5.28k|			g_type_name(type));
 1293|  5.28k|}
header.c:vips_image_map_fn:
 1476|    249|{
 1477|    249|	int i;
 1478|       |
 1479|       |	/* Hide deprecated fields.
 1480|       |	 */
 1481|  1.49k|	for (i = 0; i < VIPS_NUMBER(vips_image_header_deprecated); i++)
  ------------------
  |  |   60|  1.49k|#define VIPS_NUMBER(R) ((int) (sizeof(R) / sizeof(R[0])))
  ------------------
  |  Branch (1481:14): [True: 1.24k, False: 249]
  ------------------
 1482|  1.24k|		if (strcmp(meta->name, vips_image_header_deprecated[i]) == 0)
  ------------------
  |  Branch (1482:7): [True: 0, False: 1.24k]
  ------------------
 1483|      0|			return NULL;
 1484|       |
 1485|    249|	return fn(meta->im, meta->name, &meta->value, a);
 1486|    249|}
header.c:meta_get_value:
 1606|   157k|{
 1607|   157k|	GValue value = G_VALUE_INIT;
  ------------------
  |  |  191|   157k|#define G_VALUE_INIT  { 0, { { 0 } } }
  ------------------
 1608|       |
 1609|   157k|	if (vips_image_get(image, name, &value))
  ------------------
  |  Branch (1609:6): [True: 0, False: 157k]
  ------------------
 1610|      0|		return -1;
 1611|   157k|	g_value_init(value_copy, type);
 1612|   157k|	if (!g_value_transform(&value, value_copy)) {
  ------------------
  |  Branch (1612:6): [True: 0, False: 157k]
  ------------------
 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|   157k|	g_value_unset(&value);
 1623|       |
 1624|   157k|	return 0;
 1625|   157k|}

vips_image_written:
 1364|  1.05M|{
 1365|  1.05M|	int result;
 1366|       |
 1367|  1.05M|	VIPS_DEBUG_MSG("vips_image_written: %p\n", image);
  ------------------
  |  |   47|  1.05M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.05M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  1.05M|	{ \
  |  |   49|  1.05M|		; \
  |  |   50|  1.05M|	} \
  |  |   51|  1.05M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.05M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1368|       |
 1369|  1.05M|	result = 0;
 1370|  1.05M|	g_signal_emit(image, vips_image_signals[SIG_WRITTEN], 0, &result);
 1371|       |
 1372|  1.05M|	return result;
 1373|  1.05M|}
vips_image_minimise_all:
 1443|   272k|{
 1444|       |	/* Minimisation will modify things like sources, so we can't run it
 1445|       |	 * from many threads.
 1446|       |	 */
 1447|   272k|	g_mutex_lock(&vips__minimise_lock);
 1448|       |
 1449|   272k|	(void) vips__link_map(image, TRUE,
  ------------------
  |  |  798|   272k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|   272k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 1450|   272k|		(VipsSListMap2Fn) vips_image_minimise_all_cb, NULL, NULL);
 1451|       |
 1452|   272k|	g_mutex_unlock(&vips__minimise_lock);
 1453|   272k|}
vips_image_preeval:
 1524|   136k|{
 1525|   136k|	if (image->progress_signal) {
  ------------------
  |  Branch (1525:6): [True: 11.4k, False: 124k]
  ------------------
 1526|  11.4k|		VIPS_DEBUG_MSG("vips_image_preeval: %p\n", image);
  ------------------
  |  |   47|  11.4k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  11.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  11.4k|	{ \
  |  |   49|  11.4k|		; \
  |  |   50|  11.4k|	} \
  |  |   51|  11.4k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  11.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1527|       |
 1528|  11.4k|		g_assert(vips_object_sanity(
  ------------------
  |  |  166|  11.4k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  11.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  11.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1529|  11.4k|			VIPS_OBJECT(image->progress_signal)));
 1530|       |
 1531|  11.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|  11.4k|		(void) vips_progress_add(image->progress_signal);
 1538|       |
 1539|  11.4k|		if (!vips_image_get_typeof(image, "hide-progress"))
  ------------------
  |  Branch (1539:7): [True: 11.4k, False: 0]
  ------------------
 1540|  11.4k|			g_signal_emit(image->progress_signal,
 1541|  11.4k|				vips_image_signals[SIG_PREEVAL], 0,
 1542|  11.4k|				image->time);
 1543|  11.4k|	}
 1544|   136k|}
vips_image_eval:
 1550|  12.0k|{
 1551|  12.0k|	if (image->progress_signal &&
  ------------------
  |  Branch (1551:6): [True: 12.0k, False: 18]
  ------------------
 1552|  12.0k|		image->time) {
  ------------------
  |  Branch (1552:3): [True: 12.0k, False: 0]
  ------------------
 1553|  12.0k|		VIPS_DEBUG_MSG("vips_image_eval: %p\n", image);
  ------------------
  |  |   47|  12.0k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  12.0k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  12.0k|	{ \
  |  |   49|  12.0k|		; \
  |  |   50|  12.0k|	} \
  |  |   51|  12.0k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  12.0k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1554|       |
 1555|  12.0k|		g_assert(vips_object_sanity(
  ------------------
  |  |  166|  12.0k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  12.0k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  12.0k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1556|  12.0k|			VIPS_OBJECT(image->progress_signal)));
 1557|       |
 1558|  12.0k|		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|  12.0k|		if (image->progress_signal->time != image->time)
  ------------------
  |  Branch (1564:7): [True: 12.0k, False: 0]
  ------------------
 1565|  12.0k|			vips_progress_update(image->progress_signal->time,
 1566|  12.0k|				processed);
 1567|       |
 1568|  12.0k|		if (!vips_image_get_typeof(image, "hide-progress"))
  ------------------
  |  Branch (1568:7): [True: 12.0k, False: 0]
  ------------------
 1569|  12.0k|			g_signal_emit(image->progress_signal,
 1570|  12.0k|				vips_image_signals[SIG_EVAL], 0,
 1571|  12.0k|				image->time);
 1572|  12.0k|	}
 1573|  12.0k|}
vips_image_posteval:
 1577|   136k|{
 1578|   136k|	if (image->progress_signal &&
  ------------------
  |  Branch (1578:6): [True: 11.4k, False: 124k]
  ------------------
 1579|   136k|		image->progress_signal->time) {
  ------------------
  |  Branch (1579:3): [True: 11.4k, False: 0]
  ------------------
 1580|  11.4k|		gint64 processed;
 1581|       |
 1582|  11.4k|		VIPS_DEBUG_MSG("vips_image_posteval: %p\n", image);
  ------------------
  |  |   47|  11.4k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  11.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  11.4k|	{ \
  |  |   49|  11.4k|		; \
  |  |   50|  11.4k|	} \
  |  |   51|  11.4k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  11.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1583|       |
 1584|  11.4k|		g_assert(vips_object_sanity(
  ------------------
  |  |  166|  11.4k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  11.4k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  11.4k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1585|  11.4k|			VIPS_OBJECT(image->progress_signal)));
 1586|       |
 1587|       |		/* Make sure posteval sees a finished progress.
 1588|       |		 */
 1589|  11.4k|		processed = image->time->tpels;
 1590|  11.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|  11.4k|		if (image->progress_signal->time != image->time)
  ------------------
  |  Branch (1596:7): [True: 11.4k, False: 0]
  ------------------
 1597|  11.4k|			vips_progress_update(image->progress_signal->time,
 1598|  11.4k|				processed);
 1599|       |
 1600|  11.4k|		if (!vips_image_get_typeof(image, "hide-progress"))
  ------------------
  |  Branch (1600:7): [True: 11.4k, False: 0]
  ------------------
 1601|  11.4k|			g_signal_emit(image->progress_signal,
 1602|  11.4k|				vips_image_signals[SIG_POSTEVAL], 0,
 1603|  11.4k|				image->time);
 1604|  11.4k|	}
 1605|   136k|}
vips_image_iskilled:
 1645|  1.36M|{
 1646|  1.36M|	gboolean kill;
 1647|       |
 1648|  1.36M|	kill = image->kill;
 1649|       |
 1650|       |	// check the image we are signalling progress on too
 1651|  1.36M|	if (image->progress_signal)
  ------------------
  |  Branch (1651:6): [True: 72.1k, False: 1.29M]
  ------------------
 1652|  72.1k|		kill |= image->progress_signal->kill;
 1653|       |
 1654|       |	/* Has kill been set for this image? If yes, abort evaluation.
 1655|       |	 */
 1656|  1.36M|	if (kill) {
  ------------------
  |  Branch (1656:6): [True: 0, False: 1.36M]
  ------------------
 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|  1.36M|	return kill;
 1669|  1.36M|}
vips_image_set_kill:
 1683|   136k|{
 1684|   136k|	if (image->kill != kill)
  ------------------
  |  Branch (1684:6): [True: 0, False: 136k]
  ------------------
 1685|   136k|		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|   136k|			image->filename, image, kill);
 1687|       |
 1688|   136k|	image->kill = kill;
 1689|       |
 1690|       |	// set here too
 1691|   136k|	if (image->progress_signal)
  ------------------
  |  Branch (1691:6): [True: 11.4k, False: 124k]
  ------------------
 1692|  11.4k|		image->progress_signal->kill = kill;
 1693|   136k|}
vips_image_new:
 1723|   952k|{
 1724|   952k|	VipsImage *image;
 1725|   952k|	char filename[26];
 1726|       |
 1727|   952k|	vips_check_init();
 1728|       |
 1729|   952k|	vips_image_temp_name(filename, sizeof(filename));
 1730|       |
 1731|   952k|	image = VIPS_IMAGE(g_object_new(VIPS_TYPE_IMAGE, NULL));
  ------------------
  |  |  171|   952k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   952k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   952k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  172|   952k|		VIPS_TYPE_IMAGE, VipsImage))
  ------------------
 1732|   952k|	g_object_set(image,
 1733|   952k|		"filename", filename,
 1734|   952k|		"mode", "p",
 1735|   952k|		NULL);
 1736|   952k|	if (vips_object_build(VIPS_OBJECT(image))) {
  ------------------
  |  |  433|   952k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|   952k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   952k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1736:6): [True: 0, False: 952k]
  ------------------
 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|   952k|	return image;
 1742|   952k|}
vips_image_new_mode:
 1746|   127k|{
 1747|   127k|	VipsImage *image;
 1748|       |
 1749|   127k|	g_assert(filename);
  ------------------
  |  |  166|   127k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   127k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   127k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1750|   127k|	g_assert(mode);
  ------------------
  |  |  166|   127k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   127k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   127k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1751|       |
 1752|   127k|	vips_check_init();
 1753|       |
 1754|   127k|	image = VIPS_IMAGE(g_object_new(VIPS_TYPE_IMAGE, NULL));
  ------------------
  |  |  171|   127k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|   127k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   127k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  172|   127k|		VIPS_TYPE_IMAGE, VipsImage))
  ------------------
 1755|   127k|	g_object_set(image,
 1756|   127k|		"filename", filename,
 1757|   127k|		"mode", mode,
 1758|   127k|		NULL);
 1759|   127k|	if (vips_object_build(VIPS_OBJECT(image))) {
  ------------------
  |  |  433|   127k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|   127k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   127k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1759:6): [True: 0, False: 127k]
  ------------------
 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|   127k|	return image;
 1765|   127k|}
vips_image_new_memory:
 1779|   127k|{
 1780|   127k|	char filename[26];
 1781|       |
 1782|   127k|	vips_image_temp_name(filename, sizeof(filename));
 1783|   127k|	return vips_image_new_mode(filename, "t");
 1784|   127k|}
vips_image_new_from_buffer:
 2153|  31.1k|{
 2154|  31.1k|	const char *operation_name;
 2155|  31.1k|	va_list ap;
 2156|  31.1k|	int result;
 2157|  31.1k|	VipsImage *out;
 2158|  31.1k|	VipsBlob *blob;
 2159|       |
 2160|  31.1k|	vips_check_init();
 2161|       |
 2162|  31.1k|	if (!(operation_name = vips_foreign_find_load_buffer(buf, len)))
  ------------------
  |  Branch (2162:6): [True: 5.95k, False: 25.1k]
  ------------------
 2163|  5.95k|		return NULL;
 2164|       |
 2165|       |	/* We don't take a copy of the data or free it.
 2166|       |	 */
 2167|  25.1k|	blob = vips_blob_new(NULL, buf, len);
 2168|       |
 2169|  25.1k|	va_start(ap, option_string);
 2170|  25.1k|	result = vips_call_split_option_string(operation_name,
 2171|  25.1k|		option_string, ap, blob, &out);
 2172|  25.1k|	va_end(ap);
 2173|       |
 2174|  25.1k|	vips_area_unref(VIPS_AREA(blob));
  ------------------
  |  |  137|  25.1k|#define VIPS_AREA(X) ((VipsArea *) (X))
  ------------------
 2175|       |
 2176|  25.1k|	if (result)
  ------------------
  |  Branch (2176:6): [True: 7.95k, False: 17.1k]
  ------------------
 2177|  7.95k|		return NULL;
 2178|       |
 2179|  17.1k|	return out;
 2180|  25.1k|}
vips_image_new_matrix:
 2286|  31.1k|{
 2287|  31.1k|	VipsImage *image;
 2288|       |
 2289|  31.1k|	vips_check_init();
 2290|       |
 2291|  31.1k|	image = VIPS_IMAGE(g_object_new(VIPS_TYPE_IMAGE, NULL));
  ------------------
  |  |  171|  31.1k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  31.1k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  31.1k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  172|  31.1k|		VIPS_TYPE_IMAGE, VipsImage))
  ------------------
 2292|  31.1k|	g_object_set(image,
 2293|  31.1k|		"filename", "vips_image_new_matrix",
 2294|  31.1k|		"mode", "t",
 2295|  31.1k|		"width", width,
 2296|  31.1k|		"height", height,
 2297|  31.1k|		"bands", 1,
 2298|  31.1k|		"format", VIPS_FORMAT_DOUBLE,
 2299|  31.1k|		"interpretation", VIPS_INTERPRETATION_MATRIX,
 2300|  31.1k|		NULL);
 2301|  31.1k|	if (vips_object_build(VIPS_OBJECT(image))) {
  ------------------
  |  |  433|  31.1k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  31.1k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  31.1k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2301:6): [True: 0, False: 31.1k]
  ------------------
 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|  31.1k|	if (vips_image_write_prepare(image)) {
  ------------------
  |  Branch (2306:6): [True: 0, False: 31.1k]
  ------------------
 2307|      0|		g_object_unref(image);
 2308|      0|		return NULL;
 2309|      0|	}
 2310|       |
 2311|  31.1k|	return image;
 2312|  31.1k|}
vips_get_disc_threshold:
 2517|  15.5k|{
 2518|  15.5k|	static gboolean done = FALSE;
  ------------------
  |  |  794|  15.5k|#define	FALSE	(0)
  ------------------
 2519|  15.5k|	static guint64 threshold;
 2520|       |
 2521|  15.5k|	if (!done) {
  ------------------
  |  Branch (2521:6): [True: 1, False: 15.5k]
  ------------------
 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|  15.5k|	return threshold;
 2546|  15.5k|}
vips_image_write:
 2625|   401k|{
 2626|       |	/* image needs to stay alive for this call. It can be unreffed during
 2627|       |	 * the generate.
 2628|       |	 */
 2629|   401k|	g_object_ref(image);
 2630|       |
 2631|   401k|	if (vips_image_pio_input(image) ||
  ------------------
  |  Branch (2631:6): [True: 0, False: 401k]
  ------------------
 2632|   401k|		vips_image_pipelinev(out,
  ------------------
  |  Branch (2632:3): [True: 0, False: 401k]
  ------------------
 2633|   401k|			VIPS_DEMAND_STYLE_THINSTRIP, image, NULL)) {
 2634|      0|		g_object_unref(image);
 2635|      0|		return -1;
 2636|      0|	}
 2637|       |
 2638|   401k|	if (vips_image_generate(out,
  ------------------
  |  Branch (2638:6): [True: 4.30k, False: 397k]
  ------------------
 2639|   401k|			vips_start_one, vips_image_write_gen, vips_stop_one,
 2640|   401k|			image, NULL)) {
 2641|  4.30k|		g_object_unref(image);
 2642|  4.30k|		return -1;
 2643|  4.30k|	}
 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|   397k|	if (vips_image_ispartial(out)) {
  ------------------
  |  Branch (2652:6): [True: 280k, False: 116k]
  ------------------
 2653|   280k|		vips_object_local(out, image);
  ------------------
  |  |  698|   280k|	(g_signal_connect(V, "close", G_CALLBACK(vips_object_local_cb), G))
  |  |  ------------------
  |  |  |  |  491|   280k|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  |  |  ------------------
  ------------------
 2654|   280k|	}
 2655|   116k|	else {
 2656|   116k|		vips__reorder_clear(out);
 2657|   116k|		vips__link_break_all(out);
 2658|   116k|		g_object_unref(image);
 2659|   116k|	}
 2660|       |
 2661|   397k|	return 0;
 2662|   401k|}
vips_image_decode:
 2925|   222k|{
 2926|       |	/* Keep in sync with vips__vector_to_ink().
 2927|       |	 */
 2928|   222k|	if (in->Coding == VIPS_CODING_LABQ) {
  ------------------
  |  Branch (2928:6): [True: 10, False: 222k]
  ------------------
 2929|     10|		if (vips_LabQ2Lab(in, out, NULL))
  ------------------
  |  Branch (2929:7): [True: 0, False: 10]
  ------------------
 2930|      0|			return -1;
 2931|     10|	}
 2932|   222k|	else if (in->Coding == VIPS_CODING_RAD) {
  ------------------
  |  Branch (2932:11): [True: 0, False: 222k]
  ------------------
 2933|      0|		if (vips_rad2float(in, out, NULL))
  ------------------
  |  Branch (2933:7): [True: 0, False: 0]
  ------------------
 2934|      0|			return -1;
 2935|      0|	}
 2936|   222k|	else {
 2937|   222k|		if (vips_copy(in, out, NULL))
  ------------------
  |  Branch (2937:7): [True: 0, False: 222k]
  ------------------
 2938|      0|			return -1;
 2939|   222k|	}
 2940|       |
 2941|   222k|	return 0;
 2942|   222k|}
vips_image_decode_predict:
 2958|  72.9k|{
 2959|  72.9k|	VipsBandFormat format;
 2960|  72.9k|	int bands;
 2961|       |
 2962|  72.9k|	if (in->Coding == VIPS_CODING_LABQ) {
  ------------------
  |  Branch (2962:6): [True: 0, False: 72.9k]
  ------------------
 2963|      0|		bands = 3;
 2964|      0|		format = VIPS_FORMAT_FLOAT;
 2965|      0|	}
 2966|  72.9k|	else if (in->Coding == VIPS_CODING_RAD) {
  ------------------
  |  Branch (2966:11): [True: 0, False: 72.9k]
  ------------------
 2967|      0|		bands = 3;
 2968|      0|		format = VIPS_FORMAT_FLOAT;
 2969|      0|	}
 2970|  72.9k|	else {
 2971|  72.9k|		bands = in->Bands;
 2972|  72.9k|		format = in->BandFmt;
 2973|  72.9k|	}
 2974|       |
 2975|  72.9k|	if (out_bands)
  ------------------
  |  Branch (2975:6): [True: 72.9k, False: 0]
  ------------------
 2976|  72.9k|		*out_bands = bands;
 2977|  72.9k|	if (out_format)
  ------------------
  |  Branch (2977:6): [True: 98, False: 72.8k]
  ------------------
 2978|     98|		*out_format = format;
 2979|       |
 2980|  72.9k|	return 0;
 2981|  72.9k|}
vips_image_encode:
 2998|     98|{
 2999|     98|	if (coding == VIPS_CODING_LABQ) {
  ------------------
  |  Branch (2999:6): [True: 0, False: 98]
  ------------------
 3000|      0|		if (vips_Lab2LabQ(in, out, NULL))
  ------------------
  |  Branch (3000:7): [True: 0, False: 0]
  ------------------
 3001|      0|			return -1;
 3002|      0|	}
 3003|     98|	else if (coding == VIPS_CODING_RAD) {
  ------------------
  |  Branch (3003:11): [True: 0, False: 98]
  ------------------
 3004|      0|		if (vips_float2rad(in, out, NULL))
  ------------------
  |  Branch (3004:7): [True: 0, False: 0]
  ------------------
 3005|      0|			return -1;
 3006|      0|	}
 3007|     98|	else {
 3008|     98|		if (vips_copy(in, out, NULL))
  ------------------
  |  Branch (3008:7): [True: 0, False: 98]
  ------------------
 3009|      0|			return -1;
 3010|     98|	}
 3011|       |
 3012|     98|	return 0;
 3013|     98|}
vips_image_ispartial:
 3068|   397k|{
 3069|   397k|	if (image->dtype == VIPS_IMAGE_PARTIAL)
  ------------------
  |  Branch (3069:6): [True: 280k, False: 116k]
  ------------------
 3070|   280k|		return 1;
 3071|   116k|	else
 3072|   116k|		return 0;
 3073|   397k|}
vips_image_write_prepare:
 3137|   157k|{
 3138|   157k|	g_assert(vips_object_sanity(VIPS_OBJECT(image)));
  ------------------
  |  |  166|   157k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   157k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   157k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3139|       |
 3140|   157k|	if (image->Xsize <= 0 ||
  ------------------
  |  Branch (3140:6): [True: 0, False: 157k]
  ------------------
 3141|   157k|		image->Ysize <= 0 ||
  ------------------
  |  Branch (3141:3): [True: 0, False: 157k]
  ------------------
 3142|   157k|		image->Bands <= 0) {
  ------------------
  |  Branch (3142:3): [True: 0, False: 157k]
  ------------------
 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|   157k|	image->Bbits = vips_format_sizeof(image->BandFmt) << 3;
 3151|       |
 3152|   157k|	if (image->dtype == VIPS_IMAGE_PARTIAL) {
  ------------------
  |  Branch (3152:6): [True: 40, False: 157k]
  ------------------
 3153|     40|		VIPS_DEBUG_MSG("vips_image_write_prepare: old-style output for %s\n",
  ------------------
  |  |   47|     40|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|     40|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|     40|	{ \
  |  |   49|     40|		; \
  |  |   50|     40|	} \
  |  |   51|     40|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|     40|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3154|     40|			image->filename);
 3155|       |
 3156|     40|		image->dtype = VIPS_IMAGE_SETBUF;
 3157|     40|	}
 3158|       |
 3159|   157k|	switch (image->dtype) {
 3160|      0|	case VIPS_IMAGE_MMAPINRW:
  ------------------
  |  Branch (3160:2): [True: 0, False: 157k]
  ------------------
 3161|      0|	case VIPS_IMAGE_SETBUF_FOREIGN:
  ------------------
  |  Branch (3161:2): [True: 0, False: 157k]
  ------------------
 3162|      0|		break;
 3163|       |
 3164|   157k|	case VIPS_IMAGE_SETBUF:
  ------------------
  |  Branch (3164:2): [True: 157k, False: 0]
  ------------------
 3165|   157k|		if (!image->data &&
  ------------------
  |  Branch (3165:7): [True: 157k, False: 0]
  ------------------
 3166|   157k|			!(image->data = vips_tracked_malloc(
  ------------------
  |  Branch (3166:4): [True: 0, False: 157k]
  ------------------
 3167|   157k|				  VIPS_IMAGE_SIZEOF_IMAGE(image))))
  ------------------
  |  |  388|   157k|	(VIPS_IMAGE_SIZEOF_LINE(I) * (I)->Ysize)
  |  |  ------------------
  |  |  |  |  386|   157k|	(VIPS_IMAGE_SIZEOF_PEL(I) * (I)->Xsize)
  |  |  |  |  ------------------
  |  |  |  |  |  |  384|   157k|	(VIPS_IMAGE_SIZEOF_ELEMENT(I) * (I)->Bands)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  382|   157k|	(vips_format_sizeof_unsafe((I)->BandFmt))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3168|      0|			return -1;
 3169|       |
 3170|   157k|		break;
 3171|       |
 3172|   157k|	case VIPS_IMAGE_OPENOUT:
  ------------------
  |  Branch (3172:2): [True: 0, False: 157k]
  ------------------
 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: 157k]
  ------------------
 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|   157k|	}
 3182|       |
 3183|   157k|	return 0;
 3184|   157k|}
vips_image_copy_memory:
 3346|   109k|{
 3347|   109k|	VipsImage *new;
 3348|       |
 3349|   109k|	switch (image->dtype) {
 3350|      0|	case VIPS_IMAGE_SETBUF:
  ------------------
  |  Branch (3350:2): [True: 0, False: 109k]
  ------------------
 3351|      0|	case VIPS_IMAGE_SETBUF_FOREIGN:
  ------------------
  |  Branch (3351:2): [True: 0, False: 109k]
  ------------------
 3352|      0|	case VIPS_IMAGE_MMAPIN:
  ------------------
  |  Branch (3352:2): [True: 0, False: 109k]
  ------------------
 3353|      0|	case VIPS_IMAGE_MMAPINRW:
  ------------------
  |  Branch (3353:2): [True: 0, False: 109k]
  ------------------
 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: 109k]
  ------------------
 3361|      0|	case VIPS_IMAGE_OPENIN:
  ------------------
  |  Branch (3361:2): [True: 0, False: 109k]
  ------------------
 3362|   109k|	case VIPS_IMAGE_PARTIAL:
  ------------------
  |  Branch (3362:2): [True: 109k, False: 0]
  ------------------
 3363|   109k|		new = vips_image_new_memory();
 3364|   109k|		if (vips_image_write(image, new)) {
  ------------------
  |  Branch (3364:7): [True: 0, False: 109k]
  ------------------
 3365|      0|			g_object_unref(new);
 3366|      0|			return NULL;
 3367|      0|		}
 3368|   109k|		break;
 3369|       |
 3370|   109k|	default:
  ------------------
  |  Branch (3370:2): [True: 0, False: 109k]
  ------------------
 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|   109k|	}
 3375|       |
 3376|   109k|	return new;
 3377|   109k|}
vips_image_pio_input:
 3628|   883k|{
 3629|   883k|	g_assert(vips_object_sanity(VIPS_OBJECT(image)));
  ------------------
  |  |  166|   883k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   883k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   883k|#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|   883k|	switch (image->dtype) {
 3637|   217k|	case VIPS_IMAGE_SETBUF:
  ------------------
  |  Branch (3637:2): [True: 217k, False: 666k]
  ------------------
 3638|   217k|	case VIPS_IMAGE_SETBUF_FOREIGN:
  ------------------
  |  Branch (3638:2): [True: 0, False: 883k]
  ------------------
 3639|       |		/* Should have been written to.
 3640|       |		 */
 3641|   217k|		if (!image->data) {
  ------------------
  |  Branch (3641:7): [True: 0, False: 217k]
  ------------------
 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|   217k|		image->start_fn = NULL;
 3650|   217k|		image->generate_fn = NULL;
 3651|   217k|		image->stop_fn = NULL;
 3652|       |
 3653|   217k|		break;
 3654|       |
 3655|   666k|	case VIPS_IMAGE_PARTIAL:
  ------------------
  |  Branch (3655:2): [True: 666k, False: 217k]
  ------------------
 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|   666k|		break;
 3661|       |
 3662|      0|	case VIPS_IMAGE_MMAPIN:
  ------------------
  |  Branch (3662:2): [True: 0, False: 883k]
  ------------------
 3663|      0|	case VIPS_IMAGE_MMAPINRW:
  ------------------
  |  Branch (3663:2): [True: 0, False: 883k]
  ------------------
 3664|      0|	case VIPS_IMAGE_OPENIN:
  ------------------
  |  Branch (3664:2): [True: 0, False: 883k]
  ------------------
 3665|      0|		break;
 3666|       |
 3667|      0|	case VIPS_IMAGE_OPENOUT:
  ------------------
  |  Branch (3667:2): [True: 0, False: 883k]
  ------------------
 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: 883k]
  ------------------
 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|   883k|	}
 3682|       |
 3683|   883k|	return 0;
 3684|   883k|}
vips_band_format_isint:
 3745|  41.5k|{
 3746|  41.5k|	switch (format) {
 3747|  22.5k|	case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (3747:2): [True: 22.5k, False: 18.9k]
  ------------------
 3748|  22.5k|	case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (3748:2): [True: 12, False: 41.4k]
  ------------------
 3749|  26.4k|	case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (3749:2): [True: 3.92k, False: 37.5k]
  ------------------
 3750|  36.4k|	case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (3750:2): [True: 9.93k, False: 31.5k]
  ------------------
 3751|  36.4k|	case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (3751:2): [True: 18, False: 41.4k]
  ------------------
 3752|  36.4k|	case VIPS_FORMAT_INT:
  ------------------
  |  Branch (3752:2): [True: 5, False: 41.4k]
  ------------------
 3753|  36.4k|		return TRUE;
  ------------------
  |  |  798|  36.4k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  36.4k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 3754|       |
 3755|  5.07k|	case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (3755:2): [True: 5.07k, False: 36.4k]
  ------------------
 3756|  5.07k|	case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (3756:2): [True: 0, False: 41.5k]
  ------------------
 3757|  5.07k|	case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (3757:2): [True: 0, False: 41.5k]
  ------------------
 3758|  5.07k|	case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (3758:2): [True: 0, False: 41.5k]
  ------------------
 3759|  5.07k|		return FALSE;
  ------------------
  |  |  794|  5.07k|#define	FALSE	(0)
  ------------------
 3760|       |
 3761|      0|	default:
  ------------------
  |  Branch (3761:2): [True: 0, False: 41.5k]
  ------------------
 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|  41.5k|	}
 3765|  41.5k|}
vips_band_format_isuint:
 3775|  24.4k|{
 3776|  24.4k|	switch (format) {
 3777|  1.81k|	case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (3777:2): [True: 1.81k, False: 22.6k]
  ------------------
 3778|  4.01k|	case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (3778:2): [True: 2.20k, False: 22.2k]
  ------------------
 3779|  5.79k|	case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (3779:2): [True: 1.78k, False: 22.6k]
  ------------------
 3780|  5.79k|		return TRUE;
  ------------------
  |  |  798|  5.79k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  5.79k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 3781|       |
 3782|    635|	case VIPS_FORMAT_INT:
  ------------------
  |  Branch (3782:2): [True: 635, False: 23.8k]
  ------------------
 3783|  16.4k|	case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (3783:2): [True: 15.7k, False: 8.68k]
  ------------------
 3784|  17.7k|	case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (3784:2): [True: 1.36k, False: 23.1k]
  ------------------
 3785|  18.6k|	case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (3785:2): [True: 892, False: 23.5k]
  ------------------
 3786|  18.6k|	case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (3786:2): [True: 0, False: 24.4k]
  ------------------
 3787|  18.6k|	case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (3787:2): [True: 0, False: 24.4k]
  ------------------
 3788|  18.6k|	case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (3788:2): [True: 0, False: 24.4k]
  ------------------
 3789|  18.6k|		return FALSE;
  ------------------
  |  |  794|  18.6k|#define	FALSE	(0)
  ------------------
 3790|       |
 3791|      0|	default:
  ------------------
  |  Branch (3791:2): [True: 0, False: 24.4k]
  ------------------
 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|  24.4k|	}
 3795|  24.4k|}
vips_band_format_is8bit:
 3805|  16.7k|{
 3806|  16.7k|	switch (format) {
 3807|      0|	case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (3807:2): [True: 0, False: 16.7k]
  ------------------
 3808|      0|	case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (3808:2): [True: 0, False: 16.7k]
  ------------------
 3809|      0|		return TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 3810|       |
 3811|    958|	case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (3811:2): [True: 958, False: 15.7k]
  ------------------
 3812|  16.6k|	case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (3812:2): [True: 15.7k, False: 1.01k]
  ------------------
 3813|  16.6k|	case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (3813:2): [True: 0, False: 16.7k]
  ------------------
 3814|  16.6k|	case VIPS_FORMAT_INT:
  ------------------
  |  Branch (3814:2): [True: 0, False: 16.7k]
  ------------------
 3815|  16.7k|	case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (3815:2): [True: 59, False: 16.6k]
  ------------------
 3816|  16.7k|	case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (3816:2): [True: 0, False: 16.7k]
  ------------------
 3817|  16.7k|	case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (3817:2): [True: 0, False: 16.7k]
  ------------------
 3818|  16.7k|	case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (3818:2): [True: 0, False: 16.7k]
  ------------------
 3819|  16.7k|		return FALSE;
  ------------------
  |  |  794|  16.7k|#define	FALSE	(0)
  ------------------
 3820|       |
 3821|      0|	default:
  ------------------
  |  Branch (3821:2): [True: 0, False: 16.7k]
  ------------------
 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|  16.7k|	}
 3825|  16.7k|}
vips_band_format_isfloat:
 3835|  81.2k|{
 3836|  81.2k|	switch (format) {
 3837|  15.5k|	case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (3837:2): [True: 15.5k, False: 65.7k]
  ------------------
 3838|  15.5k|	case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (3838:2): [True: 0, False: 81.2k]
  ------------------
 3839|  15.5k|		return TRUE;
  ------------------
  |  |  798|  15.5k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  15.5k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 3840|       |
 3841|  20.1k|	case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (3841:2): [True: 20.1k, False: 61.1k]
  ------------------
 3842|  20.6k|	case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (3842:2): [True: 524, False: 80.7k]
  ------------------
 3843|  22.3k|	case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (3843:2): [True: 1.67k, False: 79.6k]
  ------------------
 3844|  63.6k|	case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (3844:2): [True: 41.2k, False: 40.0k]
  ------------------
 3845|  64.7k|	case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (3845:2): [True: 1.12k, False: 80.1k]
  ------------------
 3846|  65.7k|	case VIPS_FORMAT_INT:
  ------------------
  |  Branch (3846:2): [True: 970, False: 80.3k]
  ------------------
 3847|  65.7k|	case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (3847:2): [True: 0, False: 81.2k]
  ------------------
 3848|  65.7k|	case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (3848:2): [True: 0, False: 81.2k]
  ------------------
 3849|  65.7k|		return FALSE;
  ------------------
  |  |  794|  65.7k|#define	FALSE	(0)
  ------------------
 3850|       |
 3851|      0|	default:
  ------------------
  |  Branch (3851:2): [True: 0, False: 81.2k]
  ------------------
 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|  81.2k|	}
 3855|  81.2k|}
vips_band_format_iscomplex:
 3865|   130k|{
 3866|   130k|	switch (format) {
 3867|      0|	case VIPS_FORMAT_COMPLEX:
  ------------------
  |  Branch (3867:2): [True: 0, False: 130k]
  ------------------
 3868|      0|	case VIPS_FORMAT_DPCOMPLEX:
  ------------------
  |  Branch (3868:2): [True: 0, False: 130k]
  ------------------
 3869|      0|		return TRUE;
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 3870|       |
 3871|  21.0k|	case VIPS_FORMAT_UCHAR:
  ------------------
  |  Branch (3871:2): [True: 21.0k, False: 109k]
  ------------------
 3872|  21.8k|	case VIPS_FORMAT_CHAR:
  ------------------
  |  Branch (3872:2): [True: 781, False: 130k]
  ------------------
 3873|  24.2k|	case VIPS_FORMAT_USHORT:
  ------------------
  |  Branch (3873:2): [True: 2.41k, False: 128k]
  ------------------
 3874|  96.8k|	case VIPS_FORMAT_SHORT:
  ------------------
  |  Branch (3874:2): [True: 72.5k, False: 58.3k]
  ------------------
 3875|  98.4k|	case VIPS_FORMAT_UINT:
  ------------------
  |  Branch (3875:2): [True: 1.62k, False: 129k]
  ------------------
 3876|  99.9k|	case VIPS_FORMAT_INT:
  ------------------
  |  Branch (3876:2): [True: 1.45k, False: 129k]
  ------------------
 3877|   130k|	case VIPS_FORMAT_FLOAT:
  ------------------
  |  Branch (3877:2): [True: 31.0k, False: 99.9k]
  ------------------
 3878|   130k|	case VIPS_FORMAT_DOUBLE:
  ------------------
  |  Branch (3878:2): [True: 0, False: 130k]
  ------------------
 3879|   130k|		return FALSE;
  ------------------
  |  |  794|   130k|#define	FALSE	(0)
  ------------------
 3880|       |
 3881|      0|	default:
  ------------------
  |  Branch (3881:2): [True: 0, False: 130k]
  ------------------
 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|   130k|	}
 3885|   130k|}
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|  1.11M|{
  428|  1.11M|	VipsImage *image = VIPS_IMAGE(gobject);
  ------------------
  |  |  171|  1.11M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  1.11M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.11M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  172|  1.11M|		VIPS_TYPE_IMAGE, VipsImage))
  ------------------
  429|       |
  430|  1.11M|	VIPS_DEBUG_MSG("vips_image_finalize: %p\n", gobject);
  ------------------
  |  |   47|  1.11M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.11M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  1.11M|	{ \
  |  |   49|  1.11M|		; \
  |  |   50|  1.11M|	} \
  |  |   51|  1.11M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.11M|#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|  1.11M|	g_assert(!image->regions);
  ------------------
  |  |  166|  1.11M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  1.11M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.11M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  436|       |
  437|       |	/* Therefore there should be no windows.
  438|       |	 */
  439|  1.11M|	g_assert(!image->windows);
  ------------------
  |  |  166|  1.11M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  1.11M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.11M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  440|       |
  441|       |	/* Junk generate functions.
  442|       |	 */
  443|  1.11M|	image->start_fn = NULL;
  444|  1.11M|	image->generate_fn = NULL;
  445|  1.11M|	image->stop_fn = NULL;
  446|  1.11M|	image->client1 = NULL;
  447|  1.11M|	image->client2 = NULL;
  448|       |
  449|       |	/* No more upstream/downstream links.
  450|       |	 */
  451|  1.11M|	vips__link_break_all(image);
  452|       |
  453|  1.11M|	if (image->time) {
  ------------------
  |  Branch (453:6): [True: 22.8k, False: 1.08M]
  ------------------
  454|  22.8k|		VIPS_FREEF(g_timer_destroy, image->time->start);
  ------------------
  |  |   41|  22.8k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  22.8k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  22.8k|	{ \
  |  |   43|  22.8k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 22.8k, False: 0]
  |  |  ------------------
  |  |   44|  22.8k|			(void) F((S)); \
  |  |   45|  22.8k|			(S) = 0; \
  |  |   46|  22.8k|		} \
  |  |   47|  22.8k|	} \
  |  |   48|  22.8k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  22.8k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  455|  22.8k|		VIPS_FREE(image->time);
  ------------------
  |  |   50|  22.8k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  22.8k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  22.8k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  22.8k|	{ \
  |  |  |  |   43|  22.8k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 22.8k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   44|  22.8k|			(void) F((S)); \
  |  |  |  |   45|  22.8k|			(S) = 0; \
  |  |  |  |   46|  22.8k|		} \
  |  |  |  |   47|  22.8k|	} \
  |  |  |  |   48|  22.8k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  22.8k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  456|  22.8k|	}
  457|       |
  458|       |	/* Free attached memory.
  459|       |	 */
  460|  1.11M|	if (image->data) {
  ------------------
  |  Branch (460:6): [True: 157k, False: 953k]
  ------------------
  461|   157k|		if (image->dtype == VIPS_IMAGE_SETBUF) {
  ------------------
  |  Branch (461:7): [True: 157k, False: 0]
  ------------------
  462|   157k|			VIPS_DEBUG_MSG("vips_image_finalize: freeing buffer\n");
  ------------------
  |  |   47|   157k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   157k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   157k|	{ \
  |  |   49|   157k|		; \
  |  |   50|   157k|	} \
  |  |   51|   157k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   157k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  463|   157k|			vips_tracked_free(image->data);
  464|   157k|			image->dtype = VIPS_IMAGE_NONE;
  465|   157k|		}
  466|       |
  467|   157k|		image->data = NULL;
  468|   157k|	}
  469|       |
  470|       |	/* Delete associated files.
  471|       |	 */
  472|  1.11M|	vips_image_delete(image);
  473|       |
  474|  1.11M|	VIPS_FREEF(vips_g_mutex_free, image->sslock);
  ------------------
  |  |   41|  1.11M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.11M|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  1.11M|	{ \
  |  |   43|  1.11M|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 1.11M, False: 0]
  |  |  ------------------
  |  |   44|  1.11M|			(void) F((S)); \
  |  |   45|  1.11M|			(S) = 0; \
  |  |   46|  1.11M|		} \
  |  |   47|  1.11M|	} \
  |  |   48|  1.11M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.11M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  475|       |
  476|  1.11M|	VIPS_FREE(image->Hist);
  ------------------
  |  |   50|  1.11M|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|  1.11M|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|  1.11M|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|  1.11M|	{ \
  |  |  |  |   43|  1.11M|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 0, False: 1.11M]
  |  |  |  |  ------------------
  |  |  |  |   44|      0|			(void) F((S)); \
  |  |  |  |   45|      0|			(S) = 0; \
  |  |  |  |   46|      0|		} \
  |  |  |  |   47|  1.11M|	} \
  |  |  |  |   48|  1.11M|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|  1.11M|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  477|  1.11M|	VIPS_FREEF(vips__gslist_gvalue_free, image->history_list);
  ------------------
  |  |   41|  1.11M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.11M|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  1.11M|	{ \
  |  |   43|  1.11M|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 0, False: 1.11M]
  |  |  ------------------
  |  |   44|      0|			(void) F((S)); \
  |  |   45|      0|			(S) = 0; \
  |  |   46|      0|		} \
  |  |   47|  1.11M|	} \
  |  |   48|  1.11M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.11M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  478|  1.11M|	vips__meta_destroy(image);
  479|       |
  480|  1.11M|	G_OBJECT_CLASS(vips_image_parent_class)->finalize(gobject);
  ------------------
  |  |   58|  1.11M|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  1.11M|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  1.11M|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  481|  1.11M|}
image.c:vips_image_delete:
  413|  1.11M|{
  414|  1.11M|	if (image->delete_on_close) {
  ------------------
  |  Branch (414:6): [True: 0, False: 1.11M]
  ------------------
  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|  1.11M|}
image.c:vips_image_dispose:
  485|  1.11M|{
  486|  1.11M|	VipsImage *image = VIPS_IMAGE(gobject);
  ------------------
  |  |  171|  1.11M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  1.11M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.11M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  172|  1.11M|		VIPS_TYPE_IMAGE, VipsImage))
  ------------------
  487|       |
  488|  1.11M|	VIPS_DEBUG_MSG("vips_image_dispose: %p\n", gobject);
  ------------------
  |  |   47|  1.11M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.11M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  1.11M|	{ \
  |  |   49|  1.11M|		; \
  |  |   50|  1.11M|	} \
  |  |   51|  1.11M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.11M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  489|       |
  490|  1.11M|#ifdef DEBUG_LEAK
  491|  1.11M|	{
  492|  1.11M|		VipsImagePixels *pixels = g_object_get_qdata(G_OBJECT(image),
  ------------------
  |  |   51|  1.11M|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|  1.11M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.11M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  493|  1.11M|			vips__image_pixels_quark);
  494|       |
  495|  1.11M|		if (pixels &&
  ------------------
  |  Branch (495:7): [True: 1.11M, False: 0]
  ------------------
  496|  1.11M|			pixels->tpels) {
  ------------------
  |  Branch (496:4): [True: 55.2k, False: 1.05M]
  ------------------
  497|  55.2k|			int compute_percent = 100.0 * pixels->npels / pixels->tpels;
  498|       |
  499|  55.2k|			if (compute_percent > 100)
  ------------------
  |  Branch (499:8): [True: 0, False: 55.2k]
  ------------------
  500|      0|				printf("vips_image_dispose: %s %s computed %d%%\n",
  501|      0|					image->filename,
  502|      0|					pixels->nickname,
  503|      0|					compute_percent);
  504|  55.2k|		}
  505|  1.11M|	}
  506|  1.11M|#endif /*DEBUG_LEAK*/
  507|       |
  508|  1.11M|	vips_object_preclose(VIPS_OBJECT(gobject));
  ------------------
  |  |  433|  1.11M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  1.11M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.11M|#  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|  1.11M|	if (image->baseaddr) {
  ------------------
  |  Branch (517:6): [True: 0, False: 1.11M]
  ------------------
  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|  1.11M|	if (image->fd != -1) {
  ------------------
  |  Branch (534:6): [True: 0, False: 1.11M]
  ------------------
  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|  1.11M|	G_OBJECT_CLASS(vips_image_parent_class)->dispose(gobject);
  ------------------
  |  |   58|  1.11M|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  1.11M|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  1.11M|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  544|  1.11M|}
image.c:vips_image_build:
  833|  1.11M|{
  834|  1.11M|	VipsImage *image = VIPS_IMAGE(object);
  ------------------
  |  |  171|  1.11M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), \
  |  |  ------------------
  |  |  |  |  484|  1.11M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.11M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  172|  1.11M|		VIPS_TYPE_IMAGE, VipsImage))
  ------------------
  835|  1.11M|	const char *filename = image->filename;
  836|  1.11M|	const char *mode = image->mode;
  837|       |
  838|  1.11M|	guint32 magic;
  839|  1.11M|	guint64 sizeof_image;
  840|       |
  841|  1.11M|	VIPS_DEBUG_MSG("vips_image_build: %p\n", image);
  ------------------
  |  |   47|  1.11M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.11M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  1.11M|	{ \
  |  |   49|  1.11M|		; \
  |  |   50|  1.11M|	} \
  |  |   51|  1.11M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.11M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  842|       |
  843|  1.11M|	if (VIPS_OBJECT_CLASS(vips_image_parent_class)->build(object))
  ------------------
  |  |  435|  1.11M|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  1.11M|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  1.11M|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (843:6): [True: 0, False: 1.11M]
  ------------------
  844|      0|		return -1;
  845|       |
  846|       |	/* Parse the mode string.
  847|       |	 */
  848|  1.11M|	switch (mode[0]) {
  849|      0|	case 'v':
  ------------------
  |  Branch (849:2): [True: 0, False: 1.11M]
  ------------------
  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: 1.11M]
  ------------------
  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: 1.11M]
  ------------------
  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|   158k|	case 't':
  ------------------
  |  Branch (942:2): [True: 158k, False: 952k]
  ------------------
  943|   158k|		image->dtype = VIPS_IMAGE_SETBUF;
  944|   158k|		image->dhint = VIPS_DEMAND_STYLE_ANY;
  945|   158k|		break;
  946|       |
  947|   952k|	case 'p':
  ------------------
  |  Branch (947:2): [True: 952k, False: 158k]
  ------------------
  948|   952k|		image->dtype = VIPS_IMAGE_PARTIAL;
  949|   952k|		break;
  950|       |
  951|      0|	case 'a':
  ------------------
  |  Branch (951:2): [True: 0, False: 1.11M]
  ------------------
  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: 1.11M]
  ------------------
  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: 1.11M]
  ------------------
 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|  1.11M|	}
 1007|       |
 1008|  1.11M|	vips_image_add_progress(image);
 1009|       |
 1010|  1.11M|	return 0;
 1011|  1.11M|}
image.c:vips_image_add_progress:
  803|  1.11M|{
  804|  1.11M|	if (vips__progress ||
  ------------------
  |  Branch (804:6): [True: 0, False: 1.11M]
  ------------------
  805|  1.11M|		g_getenv("VIPS_PROGRESS")
  ------------------
  |  Branch (805:3): [True: 0, False: 1.11M]
  ------------------
  806|       |#if ENABLE_DEPRECATED
  807|       |		|| g_getenv("IM_PROGRESS")
  808|       |#endif
  809|  1.11M|	) {
  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|  1.11M|}
image.c:vips_image_real_written:
 1046|  1.05M|{
 1047|  1.05M|	VIPS_DEBUG_MSG("vips_image_real_written: %p\n", image);
  ------------------
  |  |   47|  1.05M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.05M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  1.05M|	{ \
  |  |   49|  1.05M|		; \
  |  |   50|  1.05M|	} \
  |  |   51|  1.05M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.05M|#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|  1.05M|	if (image->dtype == VIPS_IMAGE_OPENOUT &&
  ------------------
  |  Branch (1051:6): [True: 0, False: 1.05M]
  ------------------
 1052|  1.05M|		vips__writehist(image))
  ------------------
  |  Branch (1052:3): [True: 0, False: 0]
  ------------------
 1053|      0|		*result = -1;
 1054|  1.05M|}
image.c:vips_image_real_minimise:
 1040|  2.35M|{
 1041|  2.35M|	VIPS_DEBUG_MSG("vips_image_real_minimise: %p\n", image);
  ------------------
  |  |   47|  2.35M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.35M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  2.35M|	{ \
  |  |   49|  2.35M|		; \
  |  |   50|  2.35M|	} \
  |  |   51|  2.35M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.35M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1042|  2.35M|}
image.c:vips_image_init:
 1333|  1.11M|{
 1334|  1.11M|	VIPS_DEBUG_MSG("vips_image_init: %p\n", image);
  ------------------
  |  |   47|  1.11M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.11M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  1.11M|	{ \
  |  |   49|  1.11M|		; \
  |  |   50|  1.11M|	} \
  |  |   51|  1.11M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.11M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1335|       |
 1336|       |	/* Default to native order.
 1337|       |	 */
 1338|  1.11M|	image->magic = vips_amiMSBfirst()
  ------------------
  |  Branch (1338:17): [True: 0, False: 1.11M]
  ------------------
 1339|  1.11M|		? VIPS_MAGIC_SPARC
  ------------------
  |  |   55|      0|#define VIPS_MAGIC_SPARC (0x08f2a6b6U)
  ------------------
 1340|  1.11M|		: VIPS_MAGIC_INTEL;
  ------------------
  |  |   54|  2.22M|#define VIPS_MAGIC_INTEL (0xb6a6f208U)
  ------------------
 1341|       |
 1342|  1.11M|	image->Xsize = 1;
 1343|  1.11M|	image->Ysize = 1;
 1344|  1.11M|	image->Bands = 1;
 1345|       |
 1346|  1.11M|	image->Xres = 1.0;
 1347|  1.11M|	image->Yres = 1.0;
 1348|       |
 1349|  1.11M|	image->fd = -1; /* since 0 is stdout */
 1350|  1.11M|	image->sslock = vips_g_mutex_new();
 1351|       |
 1352|  1.11M|	image->sizeof_header = VIPS_SIZEOF_HEADER;
  ------------------
  |  |   57|  1.11M|#define VIPS_SIZEOF_HEADER (64)
  ------------------
 1353|       |
 1354|  1.11M|	image->mode = g_strdup("p");
 1355|       |
 1356|  1.11M|#ifdef DEBUG_LEAK
 1357|  1.11M|	g_object_set_qdata_full(G_OBJECT(image), vips__image_pixels_quark,
  ------------------
  |  |   51|  1.11M|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|  1.11M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  1.11M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1358|  1.11M|		g_new0(VipsImagePixels, 1), (GDestroyNotify) g_free);
  ------------------
  |  |  299|  1.11M|#define g_new0(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc0)
  |  |  ------------------
  |  |  |  |  227|  1.11M|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|  1.11M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|  1.11M|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|  1.11M|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|  1.11M|	  gpointer __p;						\
  |  |  |  |  231|  1.11M|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 1.11M]
  |  |  |  |  ------------------
  |  |  |  |  232|  1.11M|	    __p = g_##func (__n);				\
  |  |  |  |  233|  1.11M|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 1.11M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|  1.11M|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 1.11M]
  |  |  |  |  |  Branch (234:26): [True: 1.11M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|  1.11M|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|  1.11M|	  else							\
  |  |  |  |  237|  1.11M|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|  1.11M|	  __p;							\
  |  |  |  |  239|  1.11M|	}))
  |  |  ------------------
  ------------------
 1359|  1.11M|#endif /*DEBUG_LEAK*/
 1360|  1.11M|}
image.c:vips_image_minimise_all_cb:
 1425|  2.35M|{
 1426|  2.35M|	vips_image_minimise(image);
 1427|       |
 1428|  2.35M|	return NULL;
 1429|  2.35M|}
image.c:vips_image_minimise:
 1417|  2.35M|{
 1418|  2.35M|	VIPS_DEBUG_MSG("vips_image_minimise: %p\n", image);
  ------------------
  |  |   47|  2.35M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.35M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  2.35M|	{ \
  |  |   49|  2.35M|		; \
  |  |   50|  2.35M|	} \
  |  |   51|  2.35M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.35M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1419|       |
 1420|  2.35M|	g_signal_emit(image, vips_image_signals[SIG_MINIMISE], 0);
 1421|  2.35M|}
image.c:vips_progress_add:
 1475|  22.8k|{
 1476|  22.8k|	VipsProgress *progress;
 1477|       |
 1478|  22.8k|	VIPS_DEBUG_MSG("vips_progress_add: %p\n", image);
  ------------------
  |  |   47|  22.8k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  22.8k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  22.8k|	{ \
  |  |   49|  22.8k|		; \
  |  |   50|  22.8k|	} \
  |  |   51|  22.8k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  22.8k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1479|       |
 1480|  22.8k|	if (!(progress = image->time)) {
  ------------------
  |  Branch (1480:6): [True: 22.8k, False: 0]
  ------------------
 1481|  22.8k|		if (!(image->time = VIPS_NEW(NULL, VipsProgress)))
  ------------------
  |  |   70|  22.8k|	((T *) VIPS_MALLOC(OBJ, sizeof(T)))
  |  |  ------------------
  |  |  |  |   68|  22.8k|	(vips_malloc(VIPS_OBJECT(OBJ), S))
  |  |  |  |  ------------------
  |  |  |  |  |  |  433|  22.8k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  484|  22.8k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 2305|  22.8k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (1481:7): [True: 0, False: 22.8k]
  ------------------
 1482|      0|			return -1;
 1483|  22.8k|		progress = image->time;
 1484|       |
 1485|  22.8k|		progress->im = image;
 1486|  22.8k|		progress->start = NULL;
 1487|  22.8k|	}
 1488|       |
 1489|  22.8k|	if (!progress->start)
  ------------------
  |  Branch (1489:6): [True: 22.8k, False: 0]
  ------------------
 1490|  22.8k|		progress->start = g_timer_new();
 1491|       |
 1492|  22.8k|	g_timer_start(progress->start);
 1493|  22.8k|	progress->run = 0;
 1494|  22.8k|	progress->eta = 0;
 1495|  22.8k|	progress->tpels = VIPS_IMAGE_N_PELS(image);
  ------------------
  |  |  392|  22.8k|	((guint64) (I)->Xsize * (I)->Ysize)
  ------------------
 1496|  22.8k|	progress->npels = 0;
 1497|  22.8k|	progress->percent = 0;
 1498|       |
 1499|  22.8k|	return 0;
 1500|  22.8k|}
image.c:vips_progress_update:
 1504|  47.0k|{
 1505|  47.0k|	float prop;
 1506|       |
 1507|  47.0k|	VIPS_DEBUG_MSG("vips_progress_update: %p\n", progress);
  ------------------
  |  |   47|  47.0k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  47.0k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  47.0k|	{ \
  |  |   49|  47.0k|		; \
  |  |   50|  47.0k|	} \
  |  |   51|  47.0k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  47.0k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1508|       |
 1509|  47.0k|	g_assert(progress);
  ------------------
  |  |  166|  47.0k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  47.0k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  47.0k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1510|       |
 1511|  47.0k|	progress->run = g_timer_elapsed(progress->start, NULL);
 1512|  47.0k|	progress->npels = processed;
 1513|  47.0k|	prop = (float) progress->npels / (float) progress->tpels;
 1514|  47.0k|	progress->percent = 100 * prop;
 1515|       |
 1516|       |	/* Don't estimate eta until we are 10% in.
 1517|       |	 */
 1518|  47.0k|	if (prop > 0.1)
  ------------------
  |  Branch (1518:6): [True: 47.0k, False: 0]
  ------------------
 1519|  47.0k|		progress->eta = (1.0 / prop) * progress->run - progress->run;
 1520|  47.0k|}
image.c:vips_image_temp_name:
 1700|  1.07M|{
 1701|  1.07M|	static int global_serial = 0;
 1702|       |
 1703|  1.07M|	int serial = g_atomic_int_add(&global_serial, 1);
  ------------------
  |  |  162|  1.07M|  (G_GNUC_EXTENSION ({                                                       \
  |  |  ------------------
  |  |  |  |   54|  1.07M|#define G_GNUC_EXTENSION __extension__
  |  |  ------------------
  |  |  163|  1.07M|    G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint));                     \
  |  |  ------------------
  |  |  |  |  745|  1.07M|#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
  |  |  ------------------
  |  |  164|  1.07M|    (void) (0 ? *(atomic) ^ (val) : 1);                                      \
  |  |  ------------------
  |  |  |  Branch (164:13): [Folded - Ignored]
  |  |  ------------------
  |  |  165|  1.07M|    (gint) __atomic_fetch_add ((atomic), (val), __ATOMIC_SEQ_CST);           \
  |  |  166|  1.07M|  }))
  ------------------
 1704|       |
 1705|  1.07M|	g_snprintf(name, size, "temp-%d", serial);
 1706|  1.07M|}
image.c:vips_image_write_gen:
 2591|   451k|{
 2592|   451k|	VipsRegion *ir = (VipsRegion *) seq;
 2593|   451k|	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|   451k|	if (vips_region_prepare(ir, r) ||
  ------------------
  |  Branch (2604:6): [True: 75.2k, False: 376k]
  ------------------
 2605|   451k|		vips_region_region(out_region, ir, r, r->left, r->top))
  ------------------
  |  Branch (2605:3): [True: 0, False: 376k]
  ------------------
 2606|  75.2k|		return -1;
 2607|       |
 2608|   376k|	return 0;
 2609|   451k|}

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

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|  6.42M|{
  271|  6.42M|	if (!object->preclose) {
  ------------------
  |  Branch (271:6): [True: 3.83M, False: 2.58M]
  ------------------
  272|  3.83M|		object->preclose = TRUE;
  ------------------
  |  |  798|  3.83M|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  3.83M|#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|  3.83M|		g_signal_emit(object, vips_object_signals[SIG_PRECLOSE], 0);
  281|  3.83M|	}
  282|  6.42M|}
vips_object_build:
  356|  3.80M|{
  357|  3.80M|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  3.80M|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  3.80M|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  3.80M|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  358|       |
  359|       |	/* Input and output args must both be set.
  360|       |	 */
  361|  3.80M|	VipsArgumentFlags iomask = VIPS_ARGUMENT_INPUT | VIPS_ARGUMENT_OUTPUT;
  362|       |
  363|  3.80M|	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|  3.80M|	if (class->build(object))
  ------------------
  |  Branch (371:6): [True: 14.4k, False: 3.79M]
  ------------------
  372|  14.4k|		return -1;
  373|       |
  374|       |	/* Check all required arguments have been supplied, don't stop on 1st
  375|       |	 * error.
  376|       |	 */
  377|  3.79M|	result = 0;
  378|  3.79M|	(void) vips_argument_map(object,
  379|  3.79M|		vips_object_check_required, &result, &iomask);
  380|       |
  381|       |	/* ... more checks go here.
  382|       |	 */
  383|  3.79M|	object->constructed = TRUE;
  ------------------
  |  |  798|  3.79M|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  3.79M|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  384|       |
  385|       |	/* Only postbuild on success.
  386|       |	 */
  387|  3.79M|	if (!result)
  ------------------
  |  Branch (387:6): [True: 3.79M, False: 0]
  ------------------
  388|  3.79M|		result = vips_object_postbuild(object);
  389|       |
  390|  3.79M|	return result;
  391|  3.80M|}
vips__argument_table_lookup:
  558|   290M|{
  559|   290M|	VipsArgument *argument;
  560|       |
  561|   290M|	g_mutex_lock(&vips__global_lock);
  562|   290M|	argument = (VipsArgument *) g_hash_table_lookup(table, pspec);
  563|   290M|	g_mutex_unlock(&vips__global_lock);
  564|       |
  565|   290M|	return argument;
  566|   290M|}
vips_argument_map:
  596|  19.2M|{
  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|  19.2M|	g_object_ref(object);
  601|       |
  602|   158M|	VIPS_ARGUMENT_FOR_ALL(object,
  ------------------
  |  |  358|  19.2M|	{ \
  |  |  359|  19.2M|		VipsObjectClass *object_class = VIPS_OBJECT_GET_CLASS(OBJECT); \
  |  |  ------------------
  |  |  |  |  441|  19.2M|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  527|  19.2M|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2310|  19.2M|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  360|  19.2M|		GSList *p; \
  |  |  361|  19.2M|\
  |  |  362|   177M|		for (p = object_class->argument_table_traverse; p; p = p->next) { \
  |  |  ------------------
  |  |  |  Branch (362:51): [True: 158M, False: 19.2M]
  |  |  ------------------
  |  |  363|   158M|			VipsArgumentClass *ARG_CLASS = \
  |  |  364|   158M|				(VipsArgumentClass *) p->data; \
  |  |  365|   158M|			VipsArgument *argument = (VipsArgument *) argument_class; \
  |  |  366|   158M|			GParamSpec *PSPEC = argument->pspec; \
  |  |  367|   158M|			VipsArgumentInstance *ARG_INSTANCE G_GNUC_UNUSED = \
  |  |  368|   158M|				vips__argument_get_instance(argument_class, \
  |  |  369|   158M|					VIPS_OBJECT(OBJECT));
  |  |  ------------------
  |  |  |  |  433|   158M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|   158M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|   158M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  603|   158M|		pspec, argument_class, argument_instance)
  604|   158M|	{
  605|   158M|		void *result;
  606|       |
  607|       |		/* argument_instance should not be NULL.
  608|       |		 */
  609|   158M|		g_assert(argument_instance);
  ------------------
  |  |  166|   158M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   158M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   158M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  610|       |
  611|   158M|		if ((result = fn(object, pspec,
  ------------------
  |  Branch (611:7): [True: 28.2k, False: 158M]
  ------------------
  612|   158M|				 argument_class, argument_instance, a, b))) {
  613|  28.2k|			g_object_unref(object);
  614|  28.2k|			return result;
  615|  28.2k|		}
  616|   158M|	}
  617|   158M|	VIPS_ARGUMENT_FOR_ALL_END
  ------------------
  |  |  372|   158M|	} \
  |  |  373|  19.2M|	}
  ------------------
  618|       |
  619|  19.2M|	g_object_unref(object);
  620|       |
  621|  19.2M|	return NULL;
  622|  19.2M|}
vips__argument_get_instance:
  750|   248M|{
  751|       |	/* Make sure the instance args are built.
  752|       |	 */
  753|   248M|	vips_argument_init(object);
  754|       |
  755|   248M|	return (VipsArgumentInstance *)
  756|   248M|		vips__argument_table_lookup(object->argument_table,
  757|   248M|			((VipsArgument *) argument_class)->pspec);
  758|   248M|}
vips_object_get_argument:
  777|  4.01M|{
  778|  4.01M|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  4.01M|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  4.01M|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  4.01M|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  779|       |
  780|  4.01M|	if (!(*pspec = g_object_class_find_property(G_OBJECT_CLASS(class), name))) {
  ------------------
  |  |   58|  4.01M|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  4.01M|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  4.01M|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (780:6): [True: 0, False: 4.01M]
  ------------------
  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|  4.01M|	if (!(*argument_class = (VipsArgumentClass *)
  ------------------
  |  Branch (785:6): [True: 0, False: 4.01M]
  ------------------
  786|  4.01M|			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|  4.01M|	if (!(*argument_instance = vips__argument_get_instance(
  ------------------
  |  Branch (791:6): [True: 0, False: 4.01M]
  ------------------
  792|  4.01M|		  *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|  4.01M|	return 0;
  798|  4.01M|}
vips_object_argument_isset:
  811|   814k|{
  812|   814k|	GParamSpec *pspec;
  813|   814k|	VipsArgumentClass *argument_class;
  814|   814k|	VipsArgumentInstance *argument_instance;
  815|       |
  816|   814k|	if (vips_object_get_argument(object, name,
  ------------------
  |  Branch (816:6): [True: 0, False: 814k]
  ------------------
  817|   814k|			&pspec, &argument_class, &argument_instance))
  818|      0|		return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  819|       |
  820|   814k|	return argument_instance->assigned;
  821|   814k|}
vips__object_set_member:
 1088|  4.64M|{
 1089|  4.64M|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  4.64M|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  4.64M|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  4.64M|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1090|  4.64M|	VipsArgumentClass *argument_class = (VipsArgumentClass *)
 1091|  4.64M|		vips__argument_table_lookup(class->argument_table, pspec);
 1092|  4.64M|	VipsArgumentInstance *argument_instance =
 1093|  4.64M|		vips__argument_get_instance(argument_class, object);
 1094|  4.64M|	GType otype = G_PARAM_SPEC_VALUE_TYPE(pspec);
  ------------------
  |  |  103|  4.64M|#define	G_PARAM_SPEC_VALUE_TYPE(pspec)	(G_PARAM_SPEC (pspec)->value_type)
  |  |  ------------------
  |  |  |  |   45|  4.64M|#define G_PARAM_SPEC(pspec)		(G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM, GParamSpec))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|  4.64M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|  4.64M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1095|       |
 1096|  4.64M|	g_assert(argument_instance);
  ------------------
  |  |  166|  4.64M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  4.64M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  4.64M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1097|       |
 1098|  4.64M|	vips_object_clear_member(argument_instance);
 1099|       |
 1100|  4.64M|	g_assert(!*member);
  ------------------
  |  |  166|  4.64M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  4.64M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  4.64M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1101|  4.64M|	*member = argument;
 1102|       |
 1103|  4.64M|	if (*member) {
  ------------------
  |  Branch (1103:6): [True: 1.85M, False: 2.78M]
  ------------------
 1104|  1.85M|		if (argument_class->flags & VIPS_ARGUMENT_INPUT) {
  ------------------
  |  Branch (1104:7): [True: 952k, False: 902k]
  ------------------
 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|   952k|			g_object_ref(*member);
 1116|   952k|		}
 1117|   902k|		else if (argument_class->flags & VIPS_ARGUMENT_OUTPUT) {
  ------------------
  |  Branch (1117:12): [True: 902k, 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|   902k|			g_object_ref(object);
 1129|   902k|		}
 1130|  1.85M|	}
 1131|       |
 1132|  4.64M|	if (*member &&
  ------------------
  |  Branch (1132:6): [True: 1.85M, False: 2.78M]
  ------------------
 1133|  4.64M|		g_type_is_a(otype, VIPS_TYPE_IMAGE)) {
  ------------------
  |  |  169|  1.85M|#define VIPS_TYPE_IMAGE (vips_image_get_type())
  ------------------
  |  Branch (1133:3): [True: 1.84M, False: 7.60k]
  ------------------
 1134|  1.84M|		if (argument_class->flags & VIPS_ARGUMENT_INPUT) {
  ------------------
  |  Branch (1134:7): [True: 945k, False: 902k]
  ------------------
 1135|   945k|			g_assert(!argument_instance->invalidate_id);
  ------------------
  |  |  166|   945k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   945k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   945k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1136|       |
 1137|   945k|			argument_instance->invalidate_id =
 1138|   945k|				g_signal_connect(*member, "invalidate",
  ------------------
  |  |  491|   945k|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
 1139|   945k|					G_CALLBACK(vips_object_arg_invalidate),
 1140|   945k|					argument_instance);
 1141|   945k|		}
 1142|   902k|		else if (argument_class->flags & VIPS_ARGUMENT_OUTPUT) {
  ------------------
  |  Branch (1142:12): [True: 902k, False: 0]
  ------------------
 1143|   902k|			g_assert(!argument_instance->close_id);
  ------------------
  |  |  166|   902k|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|   902k|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   902k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1144|       |
 1145|   902k|			argument_instance->close_id =
 1146|   902k|				g_signal_connect(*member, "close",
  ------------------
  |  |  491|   902k|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
 1147|   902k|					G_CALLBACK(vips_object_arg_close),
 1148|   902k|					argument_instance);
 1149|   902k|		}
 1150|  1.84M|	}
 1151|  4.64M|}
vips_value_is_null:
 1159|  15.2M|{
 1160|  15.2M|	if (G_IS_PARAM_SPEC_STRING(pspec) &&
  ------------------
  |  |  370|  30.4M|#define G_IS_PARAM_SPEC_STRING(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_STRING))
  |  |  ------------------
  |  |  |  |  497|  15.2M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  15.2M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  15.2M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  15.2M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  15.2M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 15.2M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  15.2M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  15.2M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 15.2M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 12.2M, False: 3.00M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  15.2M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  12.2M|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  12.2M|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  15.2M|  else \
  |  |  |  |  |  | 2321|  15.2M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  15.2M|  __r; \
  |  |  |  |  |  | 2323|  15.2M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (370:44): [True: 12.2M, False: 3.00M]
  |  |  ------------------
  ------------------
 1161|  15.2M|		!g_value_get_string(value))
  ------------------
  |  Branch (1161:3): [True: 12.2M, False: 0]
  ------------------
 1162|  12.2M|		return TRUE;
  ------------------
  |  |  798|  12.2M|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  12.2M|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 1163|  3.00M|	if (G_IS_PARAM_SPEC_OBJECT(pspec) &&
  ------------------
  |  |  491|  6.01M|#define G_IS_PARAM_SPEC_OBJECT(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OBJECT))
  |  |  ------------------
  |  |  |  |  497|  3.00M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  3.00M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  3.00M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  3.00M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  3.00M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 3.00M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  3.00M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  3.00M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 3.00M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 2.72M, False: 284k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  3.00M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  2.72M|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  2.72M|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  3.00M|  else \
  |  |  |  |  |  | 2321|  3.00M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  3.00M|  __r; \
  |  |  |  |  |  | 2323|  3.00M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (491:44): [True: 2.72M, False: 284k]
  |  |  ------------------
  ------------------
 1164|  3.00M|		!g_value_get_object(value))
  ------------------
  |  Branch (1164:3): [True: 2.72M, False: 0]
  ------------------
 1165|  2.72M|		return TRUE;
  ------------------
  |  |  798|  2.72M|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  2.72M|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 1166|   284k|	if (G_IS_PARAM_SPEC_POINTER(pspec) &&
  ------------------
  |  |  439|   568k|#define G_IS_PARAM_SPEC_POINTER(pspec)     (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_POINTER))
  |  |  ------------------
  |  |  |  |  497|   284k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   284k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   284k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   284k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   284k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 284k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   284k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   284k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 284k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 0, False: 284k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   284k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   284k|  else \
  |  |  |  |  |  | 2321|   284k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   284k|  __r; \
  |  |  |  |  |  | 2323|   284k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (439:44): [True: 0, False: 284k]
  |  |  ------------------
  ------------------
 1167|   284k|		!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|   284k|	if (G_IS_PARAM_SPEC_BOXED(pspec) &&
  ------------------
  |  |  416|   568k|#define G_IS_PARAM_SPEC_BOXED(pspec)       (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOXED))
  |  |  ------------------
  |  |  |  |  497|   284k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   284k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   284k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   284k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   284k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 284k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   284k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   284k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 284k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 284k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   284k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|   284k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|   284k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   284k|  else \
  |  |  |  |  |  | 2321|   284k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   284k|  __r; \
  |  |  |  |  |  | 2323|   284k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (416:44): [True: 284k, False: 0]
  |  |  ------------------
  ------------------
 1170|   284k|		!g_value_get_boxed(value))
  ------------------
  |  Branch (1170:3): [True: 284k, False: 0]
  ------------------
 1171|   284k|		return TRUE;
  ------------------
  |  |  798|   284k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|   284k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 1172|       |
 1173|      0|	return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
 1174|   284k|}
vips_object_set_property:
 1181|  26.1M|{
 1182|  26.1M|	VipsObject *object = VIPS_OBJECT(gobject);
  ------------------
  |  |  433|  26.1M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  26.1M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  26.1M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1183|  26.1M|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(gobject);
  ------------------
  |  |  441|  26.1M|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  26.1M|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  26.1M|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1184|  26.1M|	VipsArgumentClass *argument_class = (VipsArgumentClass *)
 1185|  26.1M|		vips__argument_table_lookup(class->argument_table, pspec);
 1186|  26.1M|	VipsArgumentInstance *argument_instance =
 1187|  26.1M|		vips__argument_get_instance(argument_class, object);
 1188|       |
 1189|  26.1M|	g_assert(argument_instance);
  ------------------
  |  |  166|  26.1M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  26.1M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  26.1M|#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|  26.1M|	g_assert(((VipsArgument *) argument_class)->pspec == pspec);
  ------------------
  |  |  166|  26.1M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  26.1M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  26.1M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1209|  26.1M|	g_assert(((VipsArgument *) argument_instance)->pspec == pspec);
  ------------------
  |  |  166|  26.1M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  26.1M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  26.1M|#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|  26.1M|	if (argument_class->flags & VIPS_ARGUMENT_CONSTRUCT &&
  ------------------
  |  Branch (1214:6): [True: 10.5M, False: 15.5M]
  ------------------
 1215|  26.1M|		object->constructed &&
  ------------------
  |  Branch (1215:3): [True: 5.39M, False: 5.19M]
  ------------------
 1216|  26.1M|		!vips_value_is_null(pspec, value)) {
  ------------------
  |  Branch (1216:3): [True: 0, False: 5.39M]
  ------------------
 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|  26.1M|	if (argument_class->flags & VIPS_ARGUMENT_SET_ONCE &&
  ------------------
  |  Branch (1226:6): [True: 19.7M, False: 6.38M]
  ------------------
 1227|  26.1M|		argument_instance->assigned &&
  ------------------
  |  Branch (1227:3): [True: 9.83M, False: 9.90M]
  ------------------
 1228|  26.1M|		!vips_value_is_null(pspec, value)) {
  ------------------
  |  Branch (1228:3): [True: 0, False: 9.83M]
  ------------------
 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|  26.1M|	if (G_IS_PARAM_SPEC_STRING(pspec)) {
  ------------------
  |  |  370|  26.1M|#define G_IS_PARAM_SPEC_STRING(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_STRING))
  |  |  ------------------
  |  |  |  |  497|  26.1M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  26.1M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  26.1M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  26.1M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  26.1M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 26.1M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  26.1M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  26.1M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 26.1M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 19.9M, False: 6.21M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  26.1M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  19.9M|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  19.9M|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  26.1M|  else \
  |  |  |  |  |  | 2321|  26.1M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  26.1M|  __r; \
  |  |  |  |  |  | 2323|  26.1M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (370:44): [True: 19.9M, False: 6.21M]
  |  |  ------------------
  ------------------
 1240|  19.9M|		char **member = &G_STRUCT_MEMBER(char *, object,
  ------------------
  |  |  842|  19.9M|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|  19.9M|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1241|  19.9M|			argument_class->offset);
 1242|       |
 1243|  19.9M|		if (*member)
  ------------------
  |  Branch (1243:7): [True: 10.9M, False: 8.98M]
  ------------------
 1244|  10.9M|			g_free(*member);
 1245|  19.9M|		*member = g_value_dup_string(value);
 1246|  19.9M|	}
 1247|  6.21M|	else if (G_IS_PARAM_SPEC_OBJECT(pspec)) {
  ------------------
  |  |  491|  6.21M|#define G_IS_PARAM_SPEC_OBJECT(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OBJECT))
  |  |  ------------------
  |  |  |  |  497|  6.21M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  6.21M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  6.21M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  6.21M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  6.21M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 6.21M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  6.21M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  6.21M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 6.21M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 4.64M, False: 1.57M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  6.21M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  4.64M|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  4.64M|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  6.21M|  else \
  |  |  |  |  |  | 2321|  6.21M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  6.21M|  __r; \
  |  |  |  |  |  | 2323|  6.21M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (491:44): [True: 4.64M, False: 1.57M]
  |  |  ------------------
  ------------------
 1248|  4.64M|		GObject **member = &G_STRUCT_MEMBER(GObject *, object,
  ------------------
  |  |  842|  4.64M|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|  4.64M|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1249|  4.64M|			argument_class->offset);
 1250|       |
 1251|  4.64M|		vips__object_set_member(object, pspec, member,
 1252|  4.64M|			g_value_get_object(value));
 1253|  4.64M|	}
 1254|  1.57M|	else if (G_IS_PARAM_SPEC_INT(pspec)) {
  ------------------
  |  |  117|  1.57M|#define G_IS_PARAM_SPEC_INT(pspec)         (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_INT))
  |  |  ------------------
  |  |  |  |  497|  1.57M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  1.57M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  1.57M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  1.57M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  1.57M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 1.57M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  1.57M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  1.57M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 1.57M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 517k, False: 1.05M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  1.57M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|   517k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|   517k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  1.57M|  else \
  |  |  |  |  |  | 2321|  1.57M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  1.57M|  __r; \
  |  |  |  |  |  | 2323|  1.57M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (117:44): [True: 517k, False: 1.05M]
  |  |  ------------------
  ------------------
 1255|   517k|		int *member = &G_STRUCT_MEMBER(int, object,
  ------------------
  |  |  842|   517k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|   517k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1256|   517k|			argument_class->offset);
 1257|       |
 1258|   517k|		*member = g_value_get_int(value);
 1259|   517k|	}
 1260|  1.05M|	else if (G_IS_PARAM_SPEC_UINT64(pspec)) {
  ------------------
  |  |  232|  1.05M|#define G_IS_PARAM_SPEC_UINT64(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_UINT64))
  |  |  ------------------
  |  |  |  |  497|  1.05M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  1.05M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  1.05M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  1.05M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  1.05M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 1.05M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  1.05M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  1.05M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 1.05M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 0, False: 1.05M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  1.05M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  1.05M|  else \
  |  |  |  |  |  | 2321|  1.05M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  1.05M|  __r; \
  |  |  |  |  |  | 2323|  1.05M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (232:44): [True: 0, False: 1.05M]
  |  |  ------------------
  ------------------
 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|  1.05M|	else if (G_IS_PARAM_SPEC_BOOLEAN(pspec)) {
  ------------------
  |  |   94|  1.05M|#define G_IS_PARAM_SPEC_BOOLEAN(pspec)     (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOOLEAN))
  |  |  ------------------
  |  |  |  |  497|  1.05M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  1.05M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  1.05M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  1.05M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  1.05M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 1.05M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  1.05M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  1.05M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 1.05M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 38.0k, False: 1.02M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  1.05M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  38.0k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  38.0k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  1.05M|  else \
  |  |  |  |  |  | 2321|  1.05M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  1.05M|  __r; \
  |  |  |  |  |  | 2323|  1.05M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (94:44): [True: 38.0k, False: 1.02M]
  |  |  ------------------
  ------------------
 1267|  38.0k|		gboolean *member = &G_STRUCT_MEMBER(gboolean, object,
  ------------------
  |  |  842|  38.0k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|  38.0k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1268|  38.0k|			argument_class->offset);
 1269|       |
 1270|  38.0k|		*member = g_value_get_boolean(value);
 1271|  38.0k|	}
 1272|  1.02M|	else if (G_IS_PARAM_SPEC_ENUM(pspec)) {
  ------------------
  |  |  278|  1.02M|#define G_IS_PARAM_SPEC_ENUM(pspec)        (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_ENUM))
  |  |  ------------------
  |  |  |  |  497|  1.02M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  1.02M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  1.02M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  1.02M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  1.02M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 1.02M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  1.02M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  1.02M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 1.02M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 432k, False: 587k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  1.02M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|   432k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|   432k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  1.02M|  else \
  |  |  |  |  |  | 2321|  1.02M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  1.02M|  __r; \
  |  |  |  |  |  | 2323|  1.02M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (278:44): [True: 432k, False: 587k]
  |  |  ------------------
  ------------------
 1273|   432k|		int *member = &G_STRUCT_MEMBER(int, object,
  ------------------
  |  |  842|   432k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|   432k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1274|   432k|			argument_class->offset);
 1275|       |
 1276|   432k|		*member = g_value_get_enum(value);
 1277|   432k|	}
 1278|   587k|	else if (G_IS_PARAM_SPEC_FLAGS(pspec)) {
  ------------------
  |  |  301|   587k|#define G_IS_PARAM_SPEC_FLAGS(pspec)       (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_FLAGS))
  |  |  ------------------
  |  |  |  |  497|   587k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   587k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   587k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   587k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   587k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 587k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   587k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   587k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 587k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 23.6k, False: 563k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   587k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  23.6k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  23.6k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   587k|  else \
  |  |  |  |  |  | 2321|   587k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   587k|  __r; \
  |  |  |  |  |  | 2323|   587k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (301:44): [True: 23.6k, False: 563k]
  |  |  ------------------
  ------------------
 1279|  23.6k|		int *member = &G_STRUCT_MEMBER(int, object,
  ------------------
  |  |  842|  23.6k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|  23.6k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1280|  23.6k|			argument_class->offset);
 1281|       |
 1282|  23.6k|		*member = g_value_get_flags(value);
 1283|  23.6k|	}
 1284|   563k|	else if (G_IS_PARAM_SPEC_POINTER(pspec)) {
  ------------------
  |  |  439|   563k|#define G_IS_PARAM_SPEC_POINTER(pspec)     (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_POINTER))
  |  |  ------------------
  |  |  |  |  497|   563k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   563k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   563k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   563k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   563k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 563k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   563k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   563k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 563k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 0, False: 563k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   563k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   563k|  else \
  |  |  |  |  |  | 2321|   563k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   563k|  __r; \
  |  |  |  |  |  | 2323|   563k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (439:44): [True: 0, False: 563k]
  |  |  ------------------
  ------------------
 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|   563k|	else if (G_IS_PARAM_SPEC_DOUBLE(pspec)) {
  ------------------
  |  |  347|   563k|#define G_IS_PARAM_SPEC_DOUBLE(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_DOUBLE))
  |  |  ------------------
  |  |  |  |  497|   563k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   563k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   563k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   563k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   563k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 563k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   563k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   563k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 563k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 40.2k, False: 523k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   563k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  40.2k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  40.2k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   563k|  else \
  |  |  |  |  |  | 2321|   563k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   563k|  __r; \
  |  |  |  |  |  | 2323|   563k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (347:44): [True: 40.2k, False: 523k]
  |  |  ------------------
  ------------------
 1291|  40.2k|		double *member = &G_STRUCT_MEMBER(double, object,
  ------------------
  |  |  842|  40.2k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|  40.2k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1292|  40.2k|			argument_class->offset);
 1293|       |
 1294|  40.2k|		*member = g_value_get_double(value);
 1295|  40.2k|	}
 1296|   523k|	else if (G_IS_PARAM_SPEC_BOXED(pspec)) {
  ------------------
  |  |  416|   523k|#define G_IS_PARAM_SPEC_BOXED(pspec)       (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOXED))
  |  |  ------------------
  |  |  |  |  497|   523k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   523k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   523k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   523k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   523k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 523k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   523k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   523k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 523k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 523k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   523k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|   523k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|   523k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   523k|  else \
  |  |  |  |  |  | 2321|   523k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   523k|  __r; \
  |  |  |  |  |  | 2323|   523k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (416:44): [True: 523k, False: 0]
  |  |  ------------------
  ------------------
 1297|   523k|		gpointer *member = &G_STRUCT_MEMBER(gpointer, object,
  ------------------
  |  |  842|   523k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|   523k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1298|   523k|			argument_class->offset);
 1299|       |
 1300|   523k|		if (*member) {
  ------------------
  |  Branch (1300:7): [True: 261k, False: 262k]
  ------------------
 1301|   261k|			g_boxed_free(G_PARAM_SPEC_VALUE_TYPE(pspec),
  ------------------
  |  |  103|   261k|#define	G_PARAM_SPEC_VALUE_TYPE(pspec)	(G_PARAM_SPEC (pspec)->value_type)
  |  |  ------------------
  |  |  |  |   45|   261k|#define G_PARAM_SPEC(pspec)		(G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM, GParamSpec))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|   261k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|   261k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1302|   261k|				*member);
 1303|   261k|			*member = NULL;
 1304|   261k|		}
 1305|       |
 1306|       |		/* Copy the boxed into our pointer (will use eg.
 1307|       |		 * vips__object_vector_dup()).
 1308|       |		 */
 1309|   523k|		*member = g_value_dup_boxed(value);
 1310|   523k|	}
 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|  26.1M|	argument_instance->assigned = TRUE;
  ------------------
  |  |  798|  26.1M|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  26.1M|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 1322|  26.1M|}
vips_object_get_property:
 1329|  6.79M|{
 1330|  6.79M|	VipsObject *object = VIPS_OBJECT(gobject);
  ------------------
  |  |  433|  6.79M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  6.79M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  6.79M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1331|  6.79M|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(gobject);
  ------------------
  |  |  441|  6.79M|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  6.79M|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  6.79M|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1332|  6.79M|	VipsArgumentClass *argument_class = (VipsArgumentClass *)
 1333|  6.79M|		vips__argument_table_lookup(class->argument_table, pspec);
 1334|  6.79M|	VipsArgumentInstance *argument_instance =
 1335|  6.79M|		vips__argument_get_instance(argument_class, object);
 1336|       |
 1337|  6.79M|	g_assert(((VipsArgument *) argument_class)->pspec == pspec);
  ------------------
  |  |  166|  6.79M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  6.79M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  6.79M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1338|       |
 1339|  6.79M|	if (!argument_instance->assigned) {
  ------------------
  |  Branch (1339:6): [True: 0, False: 6.79M]
  ------------------
 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|  6.79M|	if (G_IS_PARAM_SPEC_STRING(pspec)) {
  ------------------
  |  |  370|  6.79M|#define G_IS_PARAM_SPEC_STRING(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_STRING))
  |  |  ------------------
  |  |  |  |  497|  6.79M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  6.79M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  6.79M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  6.79M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  6.79M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 6.79M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  6.79M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  6.79M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 6.79M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 10.8k, False: 6.78M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  6.79M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  10.8k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  10.8k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  6.79M|  else \
  |  |  |  |  |  | 2321|  6.79M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  6.79M|  __r; \
  |  |  |  |  |  | 2323|  6.79M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (370:44): [True: 10.8k, False: 6.78M]
  |  |  ------------------
  ------------------
 1350|  10.8k|		char *member = G_STRUCT_MEMBER(char *, object,
  ------------------
  |  |  842|  10.8k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|  10.8k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1351|  10.8k|			argument_class->offset);
 1352|       |
 1353|  10.8k|		g_value_set_string(value, member);
 1354|  10.8k|	}
 1355|  6.78M|	else if (G_IS_PARAM_SPEC_OBJECT(pspec)) {
  ------------------
  |  |  491|  6.78M|#define G_IS_PARAM_SPEC_OBJECT(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OBJECT))
  |  |  ------------------
  |  |  |  |  497|  6.78M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  6.78M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  6.78M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  6.78M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  6.78M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 6.78M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  6.78M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  6.78M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 6.78M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 4.88M, False: 1.90M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  6.78M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  4.88M|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  4.88M|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  6.78M|  else \
  |  |  |  |  |  | 2321|  6.78M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  6.78M|  __r; \
  |  |  |  |  |  | 2323|  6.78M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (491:44): [True: 4.88M, False: 1.90M]
  |  |  ------------------
  ------------------
 1356|  4.88M|		GObject **member = &G_STRUCT_MEMBER(GObject *, object,
  ------------------
  |  |  842|  4.88M|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|  4.88M|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1357|  4.88M|			argument_class->offset);
 1358|       |
 1359|  4.88M|		g_value_set_object(value, *member);
 1360|  4.88M|	}
 1361|  1.90M|	else if (G_IS_PARAM_SPEC_INT(pspec)) {
  ------------------
  |  |  117|  1.90M|#define G_IS_PARAM_SPEC_INT(pspec)         (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_INT))
  |  |  ------------------
  |  |  |  |  497|  1.90M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  1.90M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  1.90M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  1.90M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  1.90M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 1.90M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  1.90M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  1.90M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 1.90M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 774k, False: 1.12M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  1.90M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|   774k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|   774k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  1.90M|  else \
  |  |  |  |  |  | 2321|  1.90M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  1.90M|  __r; \
  |  |  |  |  |  | 2323|  1.90M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (117:44): [True: 774k, False: 1.12M]
  |  |  ------------------
  ------------------
 1362|   774k|		int *member = &G_STRUCT_MEMBER(int, object,
  ------------------
  |  |  842|   774k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|   774k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1363|   774k|			argument_class->offset);
 1364|       |
 1365|   774k|		g_value_set_int(value, *member);
 1366|   774k|	}
 1367|  1.12M|	else if (G_IS_PARAM_SPEC_UINT64(pspec)) {
  ------------------
  |  |  232|  1.12M|#define G_IS_PARAM_SPEC_UINT64(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_UINT64))
  |  |  ------------------
  |  |  |  |  497|  1.12M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  1.12M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  1.12M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  1.12M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  1.12M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 1.12M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  1.12M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  1.12M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 1.12M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 0, False: 1.12M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  1.12M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  1.12M|  else \
  |  |  |  |  |  | 2321|  1.12M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  1.12M|  __r; \
  |  |  |  |  |  | 2323|  1.12M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (232:44): [True: 0, False: 1.12M]
  |  |  ------------------
  ------------------
 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|  1.12M|	else if (G_IS_PARAM_SPEC_BOOLEAN(pspec)) {
  ------------------
  |  |   94|  1.12M|#define G_IS_PARAM_SPEC_BOOLEAN(pspec)     (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOOLEAN))
  |  |  ------------------
  |  |  |  |  497|  1.12M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  1.12M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  1.12M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  1.12M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  1.12M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 1.12M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  1.12M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  1.12M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 1.12M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 107k, False: 1.02M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  1.12M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|   107k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|   107k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  1.12M|  else \
  |  |  |  |  |  | 2321|  1.12M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  1.12M|  __r; \
  |  |  |  |  |  | 2323|  1.12M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (94:44): [True: 107k, False: 1.02M]
  |  |  ------------------
  ------------------
 1374|   107k|		gboolean *member = &G_STRUCT_MEMBER(gboolean, object,
  ------------------
  |  |  842|   107k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|   107k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1375|   107k|			argument_class->offset);
 1376|       |
 1377|   107k|		g_value_set_boolean(value, *member);
 1378|   107k|	}
 1379|  1.02M|	else if (G_IS_PARAM_SPEC_ENUM(pspec)) {
  ------------------
  |  |  278|  1.02M|#define G_IS_PARAM_SPEC_ENUM(pspec)        (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_ENUM))
  |  |  ------------------
  |  |  |  |  497|  1.02M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  1.02M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  1.02M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  1.02M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  1.02M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 1.02M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  1.02M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  1.02M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 1.02M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 759k, False: 263k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  1.02M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|   759k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|   759k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  1.02M|  else \
  |  |  |  |  |  | 2321|  1.02M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  1.02M|  __r; \
  |  |  |  |  |  | 2323|  1.02M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (278:44): [True: 759k, False: 263k]
  |  |  ------------------
  ------------------
 1380|   759k|		int *member = &G_STRUCT_MEMBER(int, object,
  ------------------
  |  |  842|   759k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|   759k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1381|   759k|			argument_class->offset);
 1382|       |
 1383|   759k|		g_value_set_enum(value, *member);
 1384|   759k|	}
 1385|   263k|	else if (G_IS_PARAM_SPEC_FLAGS(pspec)) {
  ------------------
  |  |  301|   263k|#define G_IS_PARAM_SPEC_FLAGS(pspec)       (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_FLAGS))
  |  |  ------------------
  |  |  |  |  497|   263k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   263k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   263k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   263k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   263k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 263k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   263k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   263k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 263k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 0, False: 263k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   263k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   263k|  else \
  |  |  |  |  |  | 2321|   263k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   263k|  __r; \
  |  |  |  |  |  | 2323|   263k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (301:44): [True: 0, False: 263k]
  |  |  ------------------
  ------------------
 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|   263k|	else if (G_IS_PARAM_SPEC_POINTER(pspec)) {
  ------------------
  |  |  439|   263k|#define G_IS_PARAM_SPEC_POINTER(pspec)     (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_POINTER))
  |  |  ------------------
  |  |  |  |  497|   263k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   263k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   263k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   263k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   263k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 263k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   263k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   263k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 263k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 0, False: 263k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   263k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   263k|  else \
  |  |  |  |  |  | 2321|   263k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   263k|  __r; \
  |  |  |  |  |  | 2323|   263k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (439:44): [True: 0, False: 263k]
  |  |  ------------------
  ------------------
 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|   263k|	else if (G_IS_PARAM_SPEC_DOUBLE(pspec)) {
  ------------------
  |  |  347|   263k|#define G_IS_PARAM_SPEC_DOUBLE(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_DOUBLE))
  |  |  ------------------
  |  |  |  |  497|   263k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   263k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   263k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   263k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   263k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 263k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   263k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   263k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 263k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 133k, False: 129k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   263k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|   133k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|   133k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   263k|  else \
  |  |  |  |  |  | 2321|   263k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   263k|  __r; \
  |  |  |  |  |  | 2323|   263k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (347:44): [True: 133k, False: 129k]
  |  |  ------------------
  ------------------
 1398|   133k|		double *member = &G_STRUCT_MEMBER(double, object,
  ------------------
  |  |  842|   133k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|   133k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1399|   133k|			argument_class->offset);
 1400|       |
 1401|   133k|		g_value_set_double(value, *member);
 1402|   133k|	}
 1403|   129k|	else if (G_IS_PARAM_SPEC_BOXED(pspec)) {
  ------------------
  |  |  416|   129k|#define G_IS_PARAM_SPEC_BOXED(pspec)       (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOXED))
  |  |  ------------------
  |  |  |  |  497|   129k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|   129k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   129k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|   129k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|   129k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 129k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|   129k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|   129k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 129k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 129k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|   129k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|   129k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|   129k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|   129k|  else \
  |  |  |  |  |  | 2321|   129k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|   129k|  __r; \
  |  |  |  |  |  | 2323|   129k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (416:44): [True: 129k, False: 0]
  |  |  ------------------
  ------------------
 1404|   129k|		gpointer *member = &G_STRUCT_MEMBER(gpointer, object,
  ------------------
  |  |  842|   129k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|   129k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
 1405|   129k|			argument_class->offset);
 1406|       |
 1407|       |		/* Copy the boxed into our pointer (will use eg.
 1408|       |		 * vips__object_vector_dup ()).
 1409|       |		 */
 1410|   129k|		g_value_set_boxed(value, *member);
 1411|   129k|	}
 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|  6.79M|}
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|   136k|{
 2362|   136k|	VipsObject *object;
 2363|       |
 2364|   136k|	vips_check_init();
 2365|       |
 2366|   136k|	object = VIPS_OBJECT(g_object_new(type, NULL));
  ------------------
  |  |  433|   136k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|   136k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   136k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2367|       |
 2368|   136k|	if (set && set(object, a, b)) {
  ------------------
  |  Branch (2368:6): [True: 136k, False: 0]
  |  Branch (2368:13): [True: 0, False: 136k]
  ------------------
 2369|      0|		g_object_unref(object);
 2370|      0|		return NULL;
 2371|      0|	}
 2372|       |
 2373|   136k|	if (vips_object_build(object)) {
  ------------------
  |  Branch (2373:6): [True: 0, False: 136k]
  ------------------
 2374|      0|		g_object_unref(object);
 2375|      0|		return NULL;
 2376|      0|	}
 2377|       |
 2378|   136k|	return object;
 2379|   136k|}
vips_object_set_valist:
 2392|   952k|{
 2393|   952k|	char *name;
 2394|       |
 2395|   952k|	VIPS_DEBUG_MSG("vips_object_set_valist:\n");
  ------------------
  |  |   47|   952k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   952k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   952k|	{ \
  |  |   49|   952k|		; \
  |  |   50|   952k|	} \
  |  |   51|   952k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   952k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2396|       |
 2397|  1.24M|	for (name = va_arg(ap, char *); name; name = va_arg(ap, char *)) {
  ------------------
  |  Branch (2397:34): [True: 294k, False: 952k]
  ------------------
 2398|   294k|		GParamSpec *pspec;
 2399|   294k|		VipsArgumentClass *argument_class;
 2400|   294k|		VipsArgumentInstance *argument_instance;
 2401|       |
 2402|   294k|		VIPS_DEBUG_MSG("\tname = '%s' (%p)\n", name, name);
  ------------------
  |  |   47|   294k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   294k|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|   294k|	{ \
  |  |   49|   294k|		; \
  |  |   50|   294k|	} \
  |  |   51|   294k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   294k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2403|       |
 2404|   294k|		if (vips_object_get_argument(VIPS_OBJECT(object), name,
  ------------------
  |  |  433|   294k|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|   294k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   294k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2404:7): [True: 0, False: 294k]
  ------------------
 2405|   294k|				&pspec, &argument_class, &argument_instance))
 2406|      0|			return -1;
 2407|       |
 2408|   589k|		VIPS_ARGUMENT_COLLECT_SET(pspec, argument_class, ap);
  ------------------
  |  |  399|   294k|	if ((ARG_CLASS->flags & VIPS_ARGUMENT_INPUT)) { \
  |  |  ------------------
  |  |  |  Branch (399:6): [True: 294k, False: 0]
  |  |  ------------------
  |  |  400|   294k|		GValue value = G_VALUE_INIT; \
  |  |  ------------------
  |  |  |  |  191|   294k|#define G_VALUE_INIT  { 0, { { 0 } } }
  |  |  ------------------
  |  |  401|   294k|		gchar *error = NULL; \
  |  |  402|   294k|\
  |  |  403|   294k|		/* Input args are given inline, eg. ("factor", 12.0) \
  |  |  404|   294k|		 * and must be collected. \
  |  |  405|   294k|		 */ \
  |  |  406|   294k|		G_VALUE_COLLECT_INIT(&value, \
  |  |  ------------------
  |  |  |  |   88|   294k|#define G_VALUE_COLLECT_INIT(value, _value_type, var_args, flags, __error)		\
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   294k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   89|   294k|G_STMT_START {										\
  |  |  |  |   90|   294k|  GValue *g_vci_val = (value);								\
  |  |  |  |   91|   294k|  guint g_vci_flags = (flags);								\
  |  |  |  |   92|   294k|  GTypeValueTable *g_vci_vtab = g_type_value_table_peek (_value_type);			\
  |  |  |  |   93|   294k|  const gchar *g_vci_collect_format = g_vci_vtab->collect_format;					\
  |  |  |  |   94|   294k|  GTypeCValue g_vci_cvalues[G_VALUE_COLLECT_FORMAT_MAX_LENGTH] = { { 0, }, };		\
  |  |  |  |   95|   294k|  guint g_vci_n_values = 0;									\
  |  |  |  |   96|   294k|                                                                                        \
  |  |  |  |   97|   294k|  g_vci_val->g_type = _value_type;		/* value_meminit() from gvalue.c */		\
  |  |  |  |   98|   589k|  while (*g_vci_collect_format)								\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (98:10): [True: 294k, False: 294k]
  |  |  |  |  ------------------
  |  |  |  |   99|   294k|    {											\
  |  |  |  |  100|   294k|      GTypeCValue *g_vci_cvalue = g_vci_cvalues + g_vci_n_values++;					\
  |  |  |  |  101|   294k|                                                                                        \
  |  |  |  |  102|   294k|      switch (*g_vci_collect_format++)							\
  |  |  |  |  103|   294k|	{										\
  |  |  |  |  104|   293k|	case G_VALUE_COLLECT_INT:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (104:2): [True: 293k, False: 1.48k]
  |  |  |  |  ------------------
  |  |  |  |  105|   293k|	  g_vci_cvalue->v_int = va_arg ((var_args), gint);					\
  |  |  |  |  106|   293k|	  break;									\
  |  |  |  |  107|      0|	case G_VALUE_COLLECT_LONG:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (107:2): [True: 0, False: 294k]
  |  |  |  |  ------------------
  |  |  |  |  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: 294k]
  |  |  |  |  ------------------
  |  |  |  |  111|      0|	  g_vci_cvalue->v_int64 = va_arg ((var_args), gint64);				\
  |  |  |  |  112|      0|	  break;									\
  |  |  |  |  113|      0|	case G_VALUE_COLLECT_DOUBLE:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (113:2): [True: 0, False: 294k]
  |  |  |  |  ------------------
  |  |  |  |  114|      0|	  g_vci_cvalue->v_double = va_arg ((var_args), gdouble);				\
  |  |  |  |  115|      0|	  break;									\
  |  |  |  |  116|  1.48k|	case G_VALUE_COLLECT_POINTER:							\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (116:2): [True: 1.48k, False: 293k]
  |  |  |  |  ------------------
  |  |  |  |  117|  1.48k|	  g_vci_cvalue->v_pointer = va_arg ((var_args), gpointer);				\
  |  |  |  |  118|  1.48k|	  break;									\
  |  |  |  |  119|      0|	default:									\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (119:2): [True: 0, False: 294k]
  |  |  |  |  ------------------
  |  |  |  |  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|   294k|	}										\
  |  |  |  |  122|   294k|    }											\
  |  |  |  |  123|   294k|  *(__error) = g_vci_vtab->collect_value (g_vci_val,						\
  |  |  |  |  124|   294k|				       g_vci_n_values,					\
  |  |  |  |  125|   294k|				       g_vci_cvalues,					\
  |  |  |  |  126|   294k|				       g_vci_flags);						\
  |  |  |  |  127|   294k|} G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   294k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  407|   294k|			G_PARAM_SPEC_VALUE_TYPE(PSPEC), AP, 0, &error); \
  |  |  408|   294k|\
  |  |  409|   294k|		/* Don't bother with the error message. \
  |  |  410|   294k|		 */ \
  |  |  411|   294k|		if (error) { \
  |  |  ------------------
  |  |  |  Branch (411:7): [True: 0, False: 294k]
  |  |  ------------------
  |  |  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|   589k|		g_object_set_property(G_OBJECT(object), name, &value);
  ------------------
  |  |   51|   294k|#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
  |  |  ------------------
  |  |  |  |  484|   294k|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|   294k|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2411|       |
 2412|   589k|		VIPS_ARGUMENT_COLLECT_GET(pspec, argument_class, ap);
  ------------------
  |  |  417|   294k|	g_value_unset(&value); \
  |  |  418|   294k|	} \
  |  |  419|   294k|	else if ((ARG_CLASS->flags & VIPS_ARGUMENT_OUTPUT)) \
  |  |  ------------------
  |  |  |  Branch (419:11): [True: 0, False: 0]
  |  |  ------------------
  |  |  420|      0|	{ \
  |  |  421|      0|		void **arg G_GNUC_UNUSED; \
  |  |  422|      0|\
  |  |  423|      0|		/* Output args are a pointer to where to send the \
  |  |  424|      0|		 * result. \
  |  |  425|      0|		 */ \
  |  |  426|      0|		arg = va_arg(AP, void **);
  ------------------
 2413|       |
 2414|      0|		VIPS_ARGUMENT_COLLECT_END
  ------------------
  |  |  429|      0|	}
  ------------------
 2415|   294k|	}
 2416|       |
 2417|   952k|	return 0;
 2418|   952k|}
vips_object_set_from_string:
 2569|  25.1k|{
 2570|  25.1k|	const char *q;
 2571|  25.1k|	VipsToken token;
 2572|  25.1k|	char buffer[VIPS_PATH_MAX];
 2573|  25.1k|	char str[VIPS_PATH_MAX];
 2574|       |
 2575|  25.1k|	g_strlcpy(buffer, string, VIPS_PATH_MAX);
  ------------------
  |  |  245|  25.1k|#define VIPS_PATH_MAX (4096)
  ------------------
 2576|       |
 2577|       |	/* Does string start with a bracket? If it doesn't, enclose the whole
 2578|       |	 * thing in [].
 2579|       |	 */
 2580|  25.1k|	if (!(q = vips__token_get(buffer, &token, str, VIPS_PATH_MAX)) ||
  ------------------
  |  |  245|  25.1k|#define VIPS_PATH_MAX (4096)
  ------------------
  |  Branch (2580:6): [True: 25.1k, False: 0]
  ------------------
 2581|  25.1k|		token != VIPS_TOKEN_LEFT)
  ------------------
  |  Branch (2581:3): [True: 0, False: 0]
  ------------------
 2582|  25.1k|		g_snprintf(buffer, VIPS_PATH_MAX, "[%s]", string);
  ------------------
  |  |  245|  25.1k|#define VIPS_PATH_MAX (4096)
  ------------------
 2583|      0|	else
 2584|      0|		g_strlcpy(buffer, string, VIPS_PATH_MAX);
  ------------------
  |  |  245|      0|#define VIPS_PATH_MAX (4096)
  ------------------
 2585|       |
 2586|  25.1k|	return vips_object_set_args(object, buffer);
 2587|  25.1k|}
vips_type_map:
 2768|  5.87M|{
 2769|  5.87M|	GType *child;
 2770|  5.87M|	guint n_children;
 2771|  5.87M|	unsigned int i;
 2772|  5.87M|	void *result;
 2773|       |
 2774|  5.87M|	child = g_type_children(base, &n_children);
 2775|  5.87M|	result = NULL;
 2776|  11.7M|	for (i = 0; i < n_children && !result; i++)
  ------------------
  |  Branch (2776:14): [True: 5.95M, False: 5.77M]
  |  Branch (2776:32): [True: 5.84M, False: 104k]
  ------------------
 2777|  5.84M|		result = fn(child[i], a, b);
 2778|  5.87M|	g_free(child);
 2779|       |
 2780|  5.87M|	return result;
 2781|  5.87M|}
vips_class_map_all:
 2822|  5.90M|{
 2823|  5.90M|	void *result;
 2824|       |
 2825|       |	/* Avoid abstract classes. Use type_map_all for them.
 2826|       |	 */
 2827|  5.90M|	if (!G_TYPE_IS_ABSTRACT(type)) {
  ------------------
  |  |  343|  5.90M|#define G_TYPE_IS_ABSTRACT(type)                (g_type_test_flags ((type), G_TYPE_FLAG_ABSTRACT))
  ------------------
  |  Branch (2827:6): [True: 4.77M, False: 1.13M]
  ------------------
 2828|       |		/* We never unref this ref, but we never unload classes
 2829|       |		 * anyway, so so what.
 2830|       |		 */
 2831|  4.77M|		if ((result = fn(
  ------------------
  |  Branch (2831:7): [True: 28.0k, False: 4.74M]
  ------------------
 2832|  4.77M|				 VIPS_OBJECT_CLASS(g_type_class_ref(type)), a)))
  ------------------
  |  |  435|  4.77M|	(G_TYPE_CHECK_CLASS_CAST((klass), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  553|  4.77M|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  4.77M|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2833|  28.0k|			return result;
 2834|  4.77M|	}
 2835|       |
 2836|  5.87M|	if ((result = vips_type_map(type,
  ------------------
  |  Branch (2836:6): [True: 106k, False: 5.77M]
  ------------------
 2837|  5.87M|			 (VipsTypeMap2Fn) vips_class_map_all, fn, a)))
 2838|   106k|		return result;
 2839|       |
 2840|  5.77M|	return NULL;
 2841|  5.87M|}
vips_class_find:
 2886|  28.0k|{
 2887|  28.0k|	const char *classname = basename ? basename : "VipsObject";
  ------------------
  |  Branch (2887:26): [True: 28.0k, False: 0]
  ------------------
 2888|       |
 2889|  28.0k|	VipsObjectClass *class;
 2890|  28.0k|	GType base;
 2891|       |
 2892|  28.0k|	if (!(base = g_type_from_name(classname)))
  ------------------
  |  Branch (2892:6): [True: 0, False: 28.0k]
  ------------------
 2893|      0|		return NULL;
 2894|  28.0k|	class = vips_class_map_all(base,
 2895|  28.0k|		(VipsClassMapFn) test_name, (void *) nickname);
 2896|       |
 2897|  28.0k|	return class;
 2898|  28.0k|}
vips_type_find:
 2968|   952k|{
 2969|   952k|	static GOnce once = G_ONCE_INIT;
  ------------------
  |  |  102|   952k|#define G_ONCE_INIT { G_ONCE_STATUS_NOTCALLED, NULL }
  ------------------
 2970|       |
 2971|   952k|	const char *classname = basename ? basename : "VipsObject";
  ------------------
  |  Branch (2971:26): [True: 952k, False: 0]
  ------------------
 2972|       |
 2973|   952k|	NicknameGType *hit;
 2974|   952k|	GType base;
 2975|   952k|	GType type;
 2976|       |
 2977|   952k|	VIPS_ONCE(&once, vips_class_build_hash_cb, NULL);
  ------------------
  |  |   93|   952k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   952k|#define G_STMT_START  do
  |  |  ------------------
  |  |   94|   952k|	{ \
  |  |   95|   952k|		if (G_UNLIKELY((ONCE)->status != G_ONCE_STATUS_READY)) \
  |  |  ------------------
  |  |  |  |  935|   952k|#define G_UNLIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 0))
  |  |  |  |  ------------------
  |  |  |  |  |  |  926|   952k| G_GNUC_EXTENSION ({                            \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|   952k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  927|   952k|   int _g_boolean_var_;                         \
  |  |  |  |  |  |  928|   952k|   if (expr)                                    \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (928:8): [True: 1, False: 952k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  929|   952k|      _g_boolean_var_ = 1;                      \
  |  |  |  |  |  |  930|   952k|   else                                         \
  |  |  |  |  |  |  931|   952k|      _g_boolean_var_ = 0;                      \
  |  |  |  |  |  |  932|   952k|   _g_boolean_var_;                             \
  |  |  |  |  |  |  933|   952k|})
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (935:26): [True: 1, False: 952k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   96|   952k|			(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|   952k|	} \
  |  |   98|   952k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   952k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2978|       |
 2979|   952k|	hit = (NicknameGType *)
 2980|   952k|		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|   952k|	if (!(base = g_type_from_name(classname)))
  ------------------
  |  Branch (2985:6): [True: 0, False: 952k]
  ------------------
 2986|      0|		return 0;
 2987|   952k|	if (hit &&
  ------------------
  |  Branch (2987:6): [True: 927k, False: 25.1k]
  ------------------
 2988|   952k|		!hit->duplicate &&
  ------------------
  |  Branch (2988:3): [True: 924k, False: 2.86k]
  ------------------
 2989|   952k|		g_type_is_a(hit->type, base))
  ------------------
  |  Branch (2989:3): [True: 924k, False: 0]
  ------------------
 2990|   924k|		type = hit->type;
 2991|  28.0k|	else {
 2992|  28.0k|		const VipsObjectClass *class;
 2993|       |
 2994|  28.0k|		if (!(class = vips_class_find(basename, nickname)))
  ------------------
  |  Branch (2994:7): [True: 0, False: 28.0k]
  ------------------
 2995|      0|			return 0;
 2996|       |
 2997|  28.0k|		type = G_OBJECT_CLASS_TYPE(class);
  ------------------
  |  |  114|  28.0k|#define G_OBJECT_CLASS_TYPE(class)  (G_TYPE_FROM_CLASS (class))
  |  |  ------------------
  |  |  |  |  613|  28.0k|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  |  |  ------------------
  ------------------
 2998|  28.0k|	}
 2999|       |
 3000|   952k|	return type;
 3001|   952k|}
vips_object_local_cb:
 3030|   292k|{
 3031|   292k|	VIPS_FREEF(g_object_unref, gobject);
  ------------------
  |  |   41|   292k|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|   292k|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|   292k|	{ \
  |  |   43|   292k|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 292k, False: 0]
  |  |  ------------------
  |  |   44|   292k|			(void) F((S)); \
  |  |   45|   292k|			(S) = 0; \
  |  |   46|   292k|		} \
  |  |   47|   292k|	} \
  |  |   48|   292k|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|   292k|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3032|   292k|}
vips_object_local_array:
 3082|  1.08M|{
 3083|  1.08M|	VipsObjectLocal *local;
 3084|       |
 3085|  1.08M|	local = g_new(VipsObjectLocal, 1);
  ------------------
  |  |  282|  1.08M|#define g_new(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc)
  |  |  ------------------
  |  |  |  |  227|  1.08M|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|  1.08M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|  1.08M|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|  1.08M|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|  1.08M|	  gpointer __p;						\
  |  |  |  |  231|  1.08M|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 1.08M]
  |  |  |  |  ------------------
  |  |  |  |  232|  1.08M|	    __p = g_##func (__n);				\
  |  |  |  |  233|  1.08M|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 1.08M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|  1.08M|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 1.08M]
  |  |  |  |  |  Branch (234:26): [True: 1.08M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|  1.08M|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|  1.08M|	  else							\
  |  |  |  |  237|  1.08M|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|  1.08M|	  __p;							\
  |  |  |  |  239|  1.08M|	}))
  |  |  ------------------
  ------------------
 3086|  1.08M|	local->n = n;
 3087|       |	/* Make the array 1 too long so we can be sure there's a NULL
 3088|       |	 * terminator.
 3089|       |	 */
 3090|  1.08M|	local->array = g_new0(VipsObject *, n + 1);
  ------------------
  |  |  299|  1.08M|#define g_new0(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc0)
  |  |  ------------------
  |  |  |  |  227|  1.08M|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|  1.08M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|  1.08M|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|  1.08M|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|  1.08M|	  gpointer __p;						\
  |  |  |  |  231|  1.08M|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 1.08M]
  |  |  |  |  ------------------
  |  |  |  |  232|  1.08M|	    __p = g_##func (__n);				\
  |  |  |  |  233|  1.08M|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 0, False: 1.08M]
  |  |  |  |  ------------------
  |  |  |  |  234|  1.08M|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 0]
  |  |  |  |  |  Branch (234:26): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|  1.08M|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|  1.08M|	  else							\
  |  |  |  |  237|  1.08M|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|  1.08M|	  __p;							\
  |  |  |  |  239|  1.08M|	}))
  |  |  ------------------
  ------------------
 3091|       |
 3092|  1.08M|	g_signal_connect(parent, "close",
  ------------------
  |  |  491|  1.08M|    g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
  ------------------
 3093|  1.08M|		G_CALLBACK(vips_object_local_array_cb), local);
 3094|       |
 3095|  1.08M|	return local->array;
 3096|  1.08M|}
vips_object_unref_outputs:
 3233|  14.4k|{
 3234|  14.4k|	(void) vips_argument_map(object,
 3235|  14.4k|		vips_object_unref_outputs_sub, NULL, NULL);
 3236|  14.4k|}
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|  3.83M|{
 1001|  3.83M|	VipsObject *object = VIPS_OBJECT(gobject);
  ------------------
  |  |  433|  3.83M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  3.83M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  3.83M|#  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|  3.83M|	vips_object_preclose(object);
 1017|       |
 1018|       |	/* Clear all our arguments: they may be holding resources we should
 1019|       |	 * drop.
 1020|       |	 */
 1021|  3.83M|	vips_argument_dispose_all(object);
 1022|       |
 1023|  3.83M|	vips_object_close(object);
 1024|       |
 1025|  3.83M|	vips_object_postclose(object);
 1026|       |
 1027|  3.83M|	vips_argument_free_all(object);
 1028|       |
 1029|  3.83M|	VIPS_FREEF(vips_argument_table_destroy, object->argument_table);
  ------------------
  |  |   41|  3.83M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  3.83M|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  3.83M|	{ \
  |  |   43|  3.83M|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 3.83M, False: 0]
  |  |  ------------------
  |  |   44|  3.83M|			(void) F((S)); \
  |  |   45|  3.83M|			(S) = 0; \
  |  |   46|  3.83M|		} \
  |  |   47|  3.83M|	} \
  |  |   48|  3.83M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  3.83M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1030|       |
 1031|  3.83M|	G_OBJECT_CLASS(vips_object_parent_class)->dispose(gobject);
  ------------------
  |  |   58|  3.83M|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  3.83M|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  3.83M|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1032|  3.83M|}
object.c:vips_argument_dispose_all:
  947|  3.83M|{
  948|       |#ifdef DEBUG
  949|       |	printf("vips_argument_dispose_all: ");
  950|       |	vips_object_print_name(object);
  951|       |	printf("\n");
  952|       |#endif /*DEBUG*/
  953|       |
  954|  3.83M|	vips_argument_map(object, vips_object_dispose_argument, NULL, NULL);
  955|  3.83M|}
object.c:vips_object_dispose_argument:
  916|  32.3M|{
  917|  32.3M|	g_assert(((VipsArgument *) argument_class)->pspec == pspec);
  ------------------
  |  |  166|  32.3M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  32.3M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  32.3M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  918|  32.3M|	g_assert(((VipsArgument *) argument_instance)->pspec == pspec);
  ------------------
  |  |  166|  32.3M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  32.3M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  32.3M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  919|       |
  920|  32.3M|	if (G_IS_PARAM_SPEC_OBJECT(pspec) ||
  ------------------
  |  |  491|  64.6M|#define G_IS_PARAM_SPEC_OBJECT(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OBJECT))
  |  |  ------------------
  |  |  |  |  497|  32.3M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  32.3M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  32.3M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  32.3M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  32.3M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 32.3M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  32.3M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  32.3M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 32.3M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 1.88M, False: 30.4M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  32.3M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  1.88M|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  1.88M|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  32.3M|  else \
  |  |  |  |  |  | 2321|  32.3M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  32.3M|  __r; \
  |  |  |  |  |  | 2323|  32.3M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (491:44): [True: 1.88M, False: 30.4M]
  |  |  ------------------
  ------------------
  921|  32.3M|		G_IS_PARAM_SPEC_BOXED(pspec)) {
  ------------------
  |  |  416|  30.4M|#define G_IS_PARAM_SPEC_BOXED(pspec)       (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOXED))
  |  |  ------------------
  |  |  |  |  497|  30.4M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  30.4M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  30.4M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  30.4M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  30.4M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 30.4M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  30.4M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  30.4M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 30.4M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 293k, False: 30.1M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  30.4M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|   293k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|   293k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  30.4M|  else \
  |  |  |  |  |  | 2321|  30.4M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  30.4M|  __r; \
  |  |  |  |  |  | 2323|  30.4M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (416:44): [True: 293k, False: 30.1M]
  |  |  ------------------
  ------------------
  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|  2.18M|		g_object_set(object,
  929|  2.18M|			g_param_spec_get_name(pspec), NULL,
  930|  2.18M|			NULL);
  931|  2.18M|	}
  932|       |
  933|  32.3M|	return NULL;
  934|  32.3M|}
object.c:vips_object_close:
  286|  3.83M|{
  287|  3.83M|	if (!object->close) {
  ------------------
  |  Branch (287:6): [True: 3.83M, False: 0]
  ------------------
  288|  3.83M|		object->close = TRUE;
  ------------------
  |  |  798|  3.83M|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  3.83M|#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|  3.83M|		g_signal_emit(object, vips_object_signals[SIG_CLOSE], 0);
  297|  3.83M|	}
  298|  3.83M|}
object.c:vips_object_postclose:
  302|  3.83M|{
  303|  3.83M|	if (!object->postclose) {
  ------------------
  |  Branch (303:6): [True: 3.83M, False: 0]
  ------------------
  304|  3.83M|		object->postclose = TRUE;
  ------------------
  |  |  798|  3.83M|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  3.83M|#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|  3.83M|		g_signal_emit(object, vips_object_signals[SIG_POSTCLOSE], 0);
  313|  3.83M|	}
  314|  3.83M|}
object.c:vips_argument_free_all:
  988|  3.83M|{
  989|       |#ifdef DEBUG
  990|       |	printf("vips_argument_free_all: ");
  991|       |	vips_object_print_name(object);
  992|       |	printf("\n");
  993|       |#endif /*DEBUG*/
  994|       |
  995|  3.83M|	vips_argument_map(object, vips_object_free_argument, NULL, NULL);
  996|  3.83M|}
object.c:vips_object_free_argument:
  964|  32.3M|{
  965|  32.3M|	g_assert(((VipsArgument *) argument_class)->pspec == pspec);
  ------------------
  |  |  166|  32.3M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  32.3M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  32.3M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  966|  32.3M|	g_assert(((VipsArgument *) argument_instance)->pspec == pspec);
  ------------------
  |  |  166|  32.3M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  32.3M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  32.3M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  967|       |
  968|  32.3M|	if (G_IS_PARAM_SPEC_STRING(pspec)) {
  ------------------
  |  |  370|  32.3M|#define G_IS_PARAM_SPEC_STRING(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_STRING))
  |  |  ------------------
  |  |  |  |  497|  32.3M|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  32.3M|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  32.3M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  32.3M|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  32.3M|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 32.3M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  32.3M|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  32.3M|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 32.3M, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 10.0M, False: 22.2M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  32.3M|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  10.0M|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  10.0M|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  32.3M|  else \
  |  |  |  |  |  | 2321|  32.3M|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  32.3M|  __r; \
  |  |  |  |  |  | 2323|  32.3M|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (370:44): [True: 10.0M, False: 22.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|  10.0M|		g_object_set(object,
  976|  10.0M|			g_param_spec_get_name(pspec), NULL,
  977|  10.0M|			NULL);
  978|  10.0M|	}
  979|       |
  980|  32.3M|	return NULL;
  981|  32.3M|}
object.c:vips_argument_table_destroy:
  576|  3.83M|{
  577|  3.83M|	g_hash_table_destroy(table);
  578|  3.83M|}
object.c:vips_object_finalize:
 1036|  3.83M|{
 1037|  3.83M|	VipsObject *object = VIPS_OBJECT(gobject);
  ------------------
  |  |  433|  3.83M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  ------------------
  |  |  |  |  484|  3.83M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2305|  3.83M|#  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|  3.83M|	g_mutex_lock(&vips__object_all_lock);
 1050|  3.83M|	g_hash_table_remove(vips__object_all, object);
 1051|  3.83M|	g_mutex_unlock(&vips__object_all_lock);
 1052|       |
 1053|  3.83M|	G_OBJECT_CLASS(vips_object_parent_class)->finalize(gobject);
  ------------------
  |  |   58|  3.83M|#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  553|  3.83M|#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2306|  3.83M|#  define _G_TYPE_CCC(cp, gt, ct)       ((ct*) cp)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1054|  3.83M|}
object.c:vips_object_real_build:
 1423|  3.80M|{
 1424|  3.80M|	VipsObjectClass *object_class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  3.80M|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  3.80M|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  3.80M|#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|  3.80M|	VipsArgumentFlags iomask = VIPS_ARGUMENT_INPUT;
 1430|       |
 1431|  3.80M|	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|  3.80M|	g_assert(!object->constructed);
  ------------------
  |  |  166|  3.80M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  3.80M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  3.80M|#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|  3.80M|	g_object_set(object,
 1446|  3.80M|		"nickname", object_class->nickname,
 1447|  3.80M|		"description", object_class->description, NULL);
 1448|       |
 1449|       |	/* Check all required input arguments have been supplied, don't stop
 1450|       |	 * on 1st error.
 1451|       |	 */
 1452|  3.80M|	result = 0;
 1453|  3.80M|	(void) vips_argument_map(object,
 1454|  3.80M|		vips_object_check_required, &result, &iomask);
 1455|       |
 1456|  3.80M|	return result;
 1457|  3.80M|}
object.c:vips_object_real_postbuild:
 1461|  3.79M|{
 1462|       |#ifdef DEBUG
 1463|       |	printf("vips_object_real_postbuild: ");
 1464|       |	vips_object_print_name(object);
 1465|       |	printf("\n");
 1466|       |#endif /*DEBUG*/
 1467|       |
 1468|  3.79M|	g_assert(object->constructed);
  ------------------
  |  |  166|  3.79M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  3.79M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  3.79M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1469|       |
 1470|  3.79M|	return 0;
 1471|  3.79M|}
object.c:vips_object_init:
 1674|  3.83M|{
 1675|       |#ifdef DEBUG
 1676|       |	printf("vips_object_init: ");
 1677|       |	vips_object_print_name(object);
 1678|       |	printf("\n");
 1679|       |#endif /*DEBUG*/
 1680|       |
 1681|  3.83M|	g_mutex_lock(&vips__object_all_lock);
 1682|  3.83M|	g_hash_table_insert(vips__object_all, object, object);
 1683|  3.83M|	g_mutex_unlock(&vips__object_all_lock);
 1684|  3.83M|}
object.c:vips_object_check_required:
  321|  64.0M|{
  322|  64.0M|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  64.0M|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  64.0M|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  64.0M|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  323|       |
  324|  64.0M|	int *result = (int *) a;
  325|  64.0M|	VipsArgumentFlags *iomask = (VipsArgumentFlags *) b;
  326|       |
  327|  64.0M|	VIPS_DEBUG_MSG("vips_object_check_required: %s\n",
  ------------------
  |  |   47|  64.0M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  64.0M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  64.0M|	{ \
  |  |   49|  64.0M|		; \
  |  |   50|  64.0M|	} \
  |  |   51|  64.0M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  64.0M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  328|  64.0M|		g_param_spec_get_name(pspec));
  329|  64.0M|	VIPS_DEBUG_MSG("\trequired: %d\n",
  ------------------
  |  |   47|  64.0M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  64.0M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  64.0M|	{ \
  |  |   49|  64.0M|		; \
  |  |   50|  64.0M|	} \
  |  |   51|  64.0M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  64.0M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  330|  64.0M|		argument_class->flags & VIPS_ARGUMENT_REQUIRED);
  331|  64.0M|	VIPS_DEBUG_MSG("\tconstruct: %d\n",
  ------------------
  |  |   47|  64.0M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  64.0M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  64.0M|	{ \
  |  |   49|  64.0M|		; \
  |  |   50|  64.0M|	} \
  |  |   51|  64.0M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  64.0M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  332|  64.0M|		argument_class->flags & VIPS_ARGUMENT_CONSTRUCT);
  333|  64.0M|	VIPS_DEBUG_MSG("\tinput: %d\n",
  ------------------
  |  |   47|  64.0M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  64.0M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  64.0M|	{ \
  |  |   49|  64.0M|		; \
  |  |   50|  64.0M|	} \
  |  |   51|  64.0M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  64.0M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  334|  64.0M|		argument_class->flags & VIPS_ARGUMENT_INPUT);
  335|  64.0M|	VIPS_DEBUG_MSG("\toutput: %d\n",
  ------------------
  |  |   47|  64.0M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  64.0M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  64.0M|	{ \
  |  |   49|  64.0M|		; \
  |  |   50|  64.0M|	} \
  |  |   51|  64.0M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  64.0M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  336|  64.0M|		argument_class->flags & VIPS_ARGUMENT_OUTPUT);
  337|  64.0M|	VIPS_DEBUG_MSG("\tassigned: %d\n",
  ------------------
  |  |   47|  64.0M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  64.0M|#define G_STMT_START  do
  |  |  ------------------
  |  |   48|  64.0M|	{ \
  |  |   49|  64.0M|		; \
  |  |   50|  64.0M|	} \
  |  |   51|  64.0M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  64.0M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  338|  64.0M|		argument_instance->assigned);
  339|       |
  340|  64.0M|	if ((argument_class->flags & VIPS_ARGUMENT_REQUIRED) &&
  ------------------
  |  Branch (340:6): [True: 4.68M, False: 59.3M]
  ------------------
  341|  64.0M|		(argument_class->flags & VIPS_ARGUMENT_CONSTRUCT) &&
  ------------------
  |  Branch (341:3): [True: 4.68M, False: 0]
  ------------------
  342|  64.0M|		!(argument_class->flags & VIPS_ARGUMENT_DEPRECATED) &&
  ------------------
  |  Branch (342:3): [True: 4.68M, False: 0]
  ------------------
  343|  64.0M|		(argument_class->flags & *iomask) &&
  ------------------
  |  Branch (343:3): [True: 3.77M, False: 918k]
  ------------------
  344|  64.0M|		!argument_instance->assigned) {
  ------------------
  |  Branch (344:3): [True: 0, False: 3.77M]
  ------------------
  345|      0|		vips_error(class->nickname,
  346|      0|			_("parameter %s not set"),
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
  347|      0|			g_param_spec_get_name(pspec));
  348|      0|		*result = -1;
  349|      0|	}
  350|       |
  351|  64.0M|	return NULL;
  352|  64.0M|}
object.c:vips_object_postbuild:
  254|  3.79M|{
  255|  3.79M|	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|  3.79M|	g_signal_emit(object, vips_object_signals[SIG_POSTBUILD], 0, &result);
  264|       |
  265|  3.79M|	return result;
  266|  3.79M|}
object.c:vips_argument_init:
  692|   248M|{
  693|   248M|	if (!object->argument_table) {
  ------------------
  |  Branch (693:6): [True: 3.83M, False: 244M]
  ------------------
  694|       |#ifdef DEBUG
  695|       |		printf("vips_argument_init: ");
  696|       |		vips_object_print_name(object);
  697|       |		printf("\n");
  698|       |#endif /*DEBUG*/
  699|       |
  700|  3.83M|		object->argument_table = g_hash_table_new_full(g_direct_hash,
  701|  3.83M|			g_direct_equal, NULL,
  702|  3.83M|			(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|  32.3M|		VIPS_ARGUMENT_FOR_ALL(object,
  ------------------
  |  |  358|  3.83M|	{ \
  |  |  359|  3.83M|		VipsObjectClass *object_class = VIPS_OBJECT_GET_CLASS(OBJECT); \
  |  |  ------------------
  |  |  |  |  441|  3.83M|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  |  |  ------------------
  |  |  |  |  |  |  527|  3.83M|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2310|  3.83M|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  360|  3.83M|		GSList *p; \
  |  |  361|  3.83M|\
  |  |  362|  36.1M|		for (p = object_class->argument_table_traverse; p; p = p->next) { \
  |  |  ------------------
  |  |  |  Branch (362:51): [True: 32.3M, False: 3.83M]
  |  |  ------------------
  |  |  363|  32.3M|			VipsArgumentClass *ARG_CLASS = \
  |  |  364|  32.3M|				(VipsArgumentClass *) p->data; \
  |  |  365|  32.3M|			VipsArgument *argument = (VipsArgument *) argument_class; \
  |  |  366|  32.3M|			GParamSpec *PSPEC = argument->pspec; \
  |  |  367|  32.3M|			VipsArgumentInstance *ARG_INSTANCE G_GNUC_UNUSED = \
  |  |  368|  32.3M|				vips__argument_get_instance(argument_class, \
  |  |  369|  32.3M|					VIPS_OBJECT(OBJECT));
  |  |  ------------------
  |  |  |  |  433|  32.3M|	(G_TYPE_CHECK_INSTANCE_CAST((obj), VIPS_TYPE_OBJECT, VipsObject))
  |  |  |  |  ------------------
  |  |  |  |  |  |  484|  32.3M|#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 2305|  32.3M|#  define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  710|  32.3M|			pspec, argument_class, argument_instance)
  711|  32.3M|		{
  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|  32.3M|			g_assert(argument_instance == NULL);
  ------------------
  |  |  166|  32.3M|#define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  854|  32.3M|#define G_STMT_START  do
  |  |  ------------------
  |  |               #define g_assert(expr)                  G_STMT_START { (void) 0; } G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  32.3M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  721|       |
  722|  32.3M|			argument_instance = g_new(VipsArgumentInstance, 1);
  ------------------
  |  |  282|  32.3M|#define g_new(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc)
  |  |  ------------------
  |  |  |  |  227|  32.3M|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|  32.3M|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|  32.3M|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|  32.3M|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|  32.3M|	  gpointer __p;						\
  |  |  |  |  231|  32.3M|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 32.3M]
  |  |  |  |  ------------------
  |  |  |  |  232|  32.3M|	    __p = g_##func (__n);				\
  |  |  |  |  233|  32.3M|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 32.3M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|  32.3M|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 32.3M]
  |  |  |  |  |  Branch (234:26): [True: 32.3M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|  32.3M|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|  32.3M|	  else							\
  |  |  |  |  237|  32.3M|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|  32.3M|	  __p;							\
  |  |  |  |  239|  32.3M|	}))
  |  |  ------------------
  ------------------
  723|       |
  724|  32.3M|			((VipsArgument *) argument_instance)->pspec = pspec;
  725|  32.3M|			argument_instance->argument_class = argument_class;
  726|  32.3M|			argument_instance->object = object;
  727|       |			/* SET_ALWAYS args default to assigned.
  728|       |			 */
  729|  32.3M|			argument_instance->assigned =
  730|  32.3M|				argument_class->flags &
  731|  32.3M|				VIPS_ARGUMENT_SET_ALWAYS;
  732|  32.3M|			argument_instance->close_id = 0;
  733|  32.3M|			argument_instance->invalidate_id = 0;
  734|       |
  735|  32.3M|			vips_argument_table_replace(object->argument_table,
  736|  32.3M|				(VipsArgument *) argument_instance);
  737|  32.3M|		}
  738|  32.3M|		VIPS_ARGUMENT_FOR_ALL_END
  ------------------
  |  |  372|  32.3M|	} \
  |  |  373|  3.83M|	}
  ------------------
  739|  3.83M|	}
  740|   248M|}
object.c:vips_argument_instance_free:
  551|  32.3M|{
  552|  32.3M|	vips_argument_instance_detach(argument_instance);
  553|  32.3M|	g_free(argument_instance);
  554|  32.3M|}
object.c:vips_argument_instance_detach:
  517|  36.9M|{
  518|  36.9M|	VipsObject *object = argument_instance->object;
  519|  36.9M|	VipsArgumentClass *argument_class = argument_instance->argument_class;
  520|       |
  521|  36.9M|	if (argument_instance->close_id) {
  ------------------
  |  Branch (521:6): [True: 901k, False: 36.0M]
  ------------------
  522|       |		/* If close_id is set, the argument must be a gobject of some
  523|       |		 * sort, so we can fetch it.
  524|       |		 */
  525|   901k|		GObject *member = G_STRUCT_MEMBER(GObject *, object,
  ------------------
  |  |  842|   901k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|   901k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
  526|   901k|			argument_class->offset);
  527|       |
  528|   901k|		if (g_signal_handler_is_connected(member,
  ------------------
  |  Branch (528:7): [True: 901k, False: 0]
  ------------------
  529|   901k|				argument_instance->close_id))
  530|   901k|			g_signal_handler_disconnect(member,
  531|   901k|				argument_instance->close_id);
  532|   901k|		argument_instance->close_id = 0;
  533|   901k|	}
  534|       |
  535|  36.9M|	if (argument_instance->invalidate_id) {
  ------------------
  |  Branch (535:6): [True: 945k, False: 36.0M]
  ------------------
  536|   945k|		GObject *member = G_STRUCT_MEMBER(GObject *, object,
  ------------------
  |  |  842|   945k|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|   945k|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
  537|   945k|			argument_class->offset);
  538|       |
  539|   945k|		if (g_signal_handler_is_connected(member,
  ------------------
  |  Branch (539:7): [True: 945k, False: 0]
  ------------------
  540|   945k|				argument_instance->invalidate_id))
  541|   945k|			g_signal_handler_disconnect(member,
  542|   945k|				argument_instance->invalidate_id);
  543|   945k|		argument_instance->invalidate_id = 0;
  544|   945k|	}
  545|  36.9M|}
object.c:vips_object_clear_member:
  871|  4.64M|{
  872|  4.64M|	VipsObject *object = argument_instance->object;
  873|  4.64M|	VipsArgumentClass *argument_class = argument_instance->argument_class;
  874|  4.64M|	GObject **member = &G_STRUCT_MEMBER(GObject *, object,
  ------------------
  |  |  842|  4.64M|    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  |  |  ------------------
  |  |  |  |  840|  4.64M|    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  |  |  ------------------
  ------------------
  875|  4.64M|		argument_class->offset);
  876|       |
  877|  4.64M|	vips_argument_instance_detach(argument_instance);
  878|       |
  879|  4.64M|	if (*member) {
  ------------------
  |  Branch (879:6): [True: 1.85M, False: 2.78M]
  ------------------
  880|  1.85M|		if (argument_class->flags & VIPS_ARGUMENT_INPUT) {
  ------------------
  |  Branch (880:7): [True: 952k, False: 901k]
  ------------------
  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|   952k|			g_object_unref(*member);
  892|   952k|		}
  893|   901k|		else if (argument_class->flags & VIPS_ARGUMENT_OUTPUT) {
  ------------------
  |  Branch (893:12): [True: 901k, 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|   901k|			g_object_unref(object);
  903|   901k|		}
  904|       |
  905|  1.85M|		*member = NULL;
  906|  1.85M|	}
  907|  4.64M|}
object.c:vips_object_arg_close:
 1070|   901k|{
 1071|   901k|	VipsObject *object = argument_instance->object;
 1072|   901k|	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|   901k|	g_object_set(object,
 1078|   901k|		g_param_spec_get_name(pspec), NULL,
 1079|   901k|		NULL);
 1080|   901k|}
object.c:vips_argument_table_replace:
  570|  32.3M|{
  571|  32.3M|	g_hash_table_replace(table, argument->pspec, argument);
  572|  32.3M|}
object.c:traverse_find_required_priority:
 1688|  2.58k|{
 1689|  2.58k|	VipsArgumentClass *argument_class = (VipsArgumentClass *) data;
 1690|  2.58k|	int priority = GPOINTER_TO_INT(a);
 1691|       |
 1692|  2.58k|	if ((argument_class->flags & VIPS_ARGUMENT_REQUIRED) &&
  ------------------
  |  Branch (1692:6): [True: 805, False: 1.78k]
  ------------------
 1693|  2.58k|		!(argument_class->flags & VIPS_ARGUMENT_DEPRECATED) &&
  ------------------
  |  Branch (1693:3): [True: 805, False: 0]
  ------------------
 1694|  2.58k|		argument_class->priority == priority)
  ------------------
  |  Branch (1694:3): [True: 0, False: 805]
  ------------------
 1695|      0|		return argument_class;
 1696|       |
 1697|  2.58k|	return NULL;
 1698|  2.58k|}
object.c:traverse_sort:
 1703|  13.9k|{
 1704|  13.9k|	return class1->priority - class2->priority;
 1705|  13.9k|}
object.c:vips_object_set_args:
 2459|  25.1k|{
 2460|  25.1k|	VipsObjectClass *class = VIPS_OBJECT_GET_CLASS(object);
  ------------------
  |  |  441|  25.1k|	(G_TYPE_INSTANCE_GET_CLASS((obj), VIPS_TYPE_OBJECT, VipsObjectClass))
  |  |  ------------------
  |  |  |  |  527|  25.1k|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|  25.1k|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2461|       |
 2462|  25.1k|	VipsToken token;
 2463|  25.1k|	char string[VIPS_PATH_MAX];
 2464|  25.1k|	char string2[VIPS_PATH_MAX];
 2465|  25.1k|	GParamSpec *pspec;
 2466|  25.1k|	VipsArgumentClass *argument_class;
 2467|  25.1k|	VipsArgumentInstance *argument_instance;
 2468|       |
 2469|  25.1k|	if (!(p = vips__token_need(p, VIPS_TOKEN_LEFT,
  ------------------
  |  Branch (2469:6): [True: 0, False: 25.1k]
  ------------------
 2470|  25.1k|			  string, VIPS_PATH_MAX)))
  ------------------
  |  |  245|  25.1k|#define VIPS_PATH_MAX (4096)
  ------------------
 2471|      0|		return -1;
 2472|       |
 2473|  25.1k|	if (!(p = vips__token_segment(p, &token, string, VIPS_PATH_MAX)))
  ------------------
  |  |  245|  25.1k|#define VIPS_PATH_MAX (4096)
  ------------------
  |  Branch (2473:6): [True: 0, False: 25.1k]
  ------------------
 2474|      0|		return -1;
 2475|       |
 2476|  25.1k|	for (;;) {
 2477|  25.1k|		if (token == VIPS_TOKEN_RIGHT)
  ------------------
  |  Branch (2477:7): [True: 25.1k, False: 0]
  ------------------
 2478|  25.1k|			break;
 2479|      0|		if (token != VIPS_TOKEN_STRING) {
  ------------------
  |  Branch (2479:7): [True: 0, False: 0]
  ------------------
 2480|      0|			vips_error(class->nickname,
 2481|      0|				_("expected string or ), saw %s"),
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 2482|      0|				vips_enum_nick(VIPS_TYPE_TOKEN, token));
  ------------------
  |  |  178|      0|#define VIPS_TYPE_TOKEN (vips_token_get_type())
  ------------------
 2483|      0|			return -1;
 2484|      0|		}
 2485|       |
 2486|       |		/* We have to look for a '=', ']' or a ',' to see if string is
 2487|       |		 * a param name or a value.
 2488|       |		 */
 2489|      0|		if (!(p = vips__token_segment(p, &token,
  ------------------
  |  Branch (2489:7): [True: 0, False: 0]
  ------------------
 2490|      0|				  string2, VIPS_PATH_MAX)))
  ------------------
  |  |  245|      0|#define VIPS_PATH_MAX (4096)
  ------------------
 2491|      0|			return -1;
 2492|      0|		if (token == VIPS_TOKEN_EQUALS) {
  ------------------
  |  Branch (2492:7): [True: 0, False: 0]
  ------------------
 2493|      0|			if (!(p = vips__token_segment_need(p, VIPS_TOKEN_STRING,
  ------------------
  |  Branch (2493:8): [True: 0, False: 0]
  ------------------
 2494|      0|					  string2, VIPS_PATH_MAX)))
  ------------------
  |  |  245|      0|#define VIPS_PATH_MAX (4096)
  ------------------
 2495|      0|				return -1;
 2496|      0|			if (vips_object_set_argument_from_string(object,
  ------------------
  |  Branch (2496:8): [True: 0, False: 0]
  ------------------
 2497|      0|					string, string2))
 2498|      0|				return -1;
 2499|       |
 2500|      0|			if (!(p = vips__token_must(p, &token,
  ------------------
  |  Branch (2500:8): [True: 0, False: 0]
  ------------------
 2501|      0|					  string2, VIPS_PATH_MAX)))
  ------------------
  |  |  245|      0|#define VIPS_PATH_MAX (4096)
  ------------------
 2502|      0|				return -1;
 2503|      0|		}
 2504|      0|		else if (g_object_class_find_property(
  ------------------
  |  Branch (2504:12): [True: 0, False: 0]
  ------------------
 2505|      0|					 G_OBJECT_GET_CLASS(object), string) &&
  ------------------
  |  |   86|      0|#define G_OBJECT_GET_CLASS(object)  (G_TYPE_INSTANCE_GET_CLASS ((object), G_TYPE_OBJECT, GObjectClass))
  |  |  ------------------
  |  |  |  |  527|      0|#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2310|      0|#define _G_TYPE_IGC(ip, gt, ct)         ((ct*) (((GTypeInstance*) ip)->g_class))
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2506|      0|			!vips_object_get_argument(object, string,
  ------------------
  |  Branch (2506:4): [True: 0, False: 0]
  ------------------
 2507|      0|				&pspec, &argument_class, &argument_instance) &&
 2508|      0|			(argument_class->flags & VIPS_ARGUMENT_CONSTRUCT) &&
  ------------------
  |  Branch (2508:4): [True: 0, False: 0]
  ------------------
 2509|      0|			(argument_class->flags & VIPS_ARGUMENT_INPUT) &&
  ------------------
  |  Branch (2509:4): [True: 0, False: 0]
  ------------------
 2510|      0|			G_IS_PARAM_SPEC_BOOLEAN(pspec)) {
  ------------------
  |  |   94|      0|#define G_IS_PARAM_SPEC_BOOLEAN(pspec)     (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOOLEAN))
  |  |  ------------------
  |  |  |  |  497|      0|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|      0|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|      0|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|      0|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|      0|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|      0|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|      0|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|      0|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|      0|  else \
  |  |  |  |  |  | 2321|      0|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|      0|  __r; \
  |  |  |  |  |  | 2323|      0|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (94:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2511|       |			/* The string is the name of an optional
 2512|       |			 * input boolean ... set it!
 2513|       |			 */
 2514|      0|			if (!argument_instance->assigned)
  ------------------
  |  Branch (2514:8): [True: 0, False: 0]
  ------------------
 2515|      0|				g_object_set(object, string, TRUE, NULL);
  ------------------
  |  |  798|      0|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  ------------------
  ------------------
 2516|      0|		}
 2517|      0|		else if ((pspec = vips_object_find_required(object))) {
  ------------------
  |  Branch (2517:12): [True: 0, False: 0]
  ------------------
 2518|      0|			if (vips_object_set_argument_from_string(object,
  ------------------
  |  Branch (2518:8): [True: 0, False: 0]
  ------------------
 2519|      0|					g_param_spec_get_name(pspec), string))
 2520|      0|				return -1;
 2521|      0|		}
 2522|      0|		else {
 2523|      0|			vips_error(class->nickname,
 2524|      0|				_("unable to set '%s'"), string);
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 2525|      0|			return -1;
 2526|      0|		}
 2527|       |
 2528|       |		/* Now must be a , or a ).
 2529|       |		 */
 2530|      0|		if (token == VIPS_TOKEN_COMMA) {
  ------------------
  |  Branch (2530:7): [True: 0, False: 0]
  ------------------
 2531|      0|			if (!(p = vips__token_must(p, &token,
  ------------------
  |  Branch (2531:8): [True: 0, False: 0]
  ------------------
 2532|      0|					  string, VIPS_PATH_MAX)))
  ------------------
  |  |  245|      0|#define VIPS_PATH_MAX (4096)
  ------------------
 2533|      0|				return -1;
 2534|      0|		}
 2535|      0|		else if (token != VIPS_TOKEN_RIGHT) {
  ------------------
  |  Branch (2535:12): [True: 0, False: 0]
  ------------------
 2536|      0|			vips_error(class->nickname,
 2537|      0|				"%s", _("not , or ) after parameter"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 2538|      0|			return -1;
 2539|      0|		}
 2540|      0|	}
 2541|       |
 2542|  25.1k|	if ((p = vips__token_get(p, &token, string, VIPS_PATH_MAX))) {
  ------------------
  |  |  245|  25.1k|#define VIPS_PATH_MAX (4096)
  ------------------
  |  Branch (2542:6): [True: 0, False: 25.1k]
  ------------------
 2543|      0|		vips_error(class->nickname,
 2544|      0|			"%s", _("extra tokens after ')'"));
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 2545|      0|		return -1;
 2546|      0|	}
 2547|       |
 2548|  25.1k|	return 0;
 2549|  25.1k|}
object.c:test_name:
 2860|  3.71M|{
 2861|  3.71M|	if (g_ascii_strcasecmp(class->nickname, nickname) == 0)
  ------------------
  |  Branch (2861:6): [True: 2.86k, False: 3.71M]
  ------------------
 2862|  2.86k|		return class;
 2863|       |
 2864|       |	/* Check the class name too, why not.
 2865|       |	 */
 2866|  3.71M|	if (g_ascii_strcasecmp(G_OBJECT_CLASS_NAME(class), nickname) == 0)
  ------------------
  |  |  124|  3.71M|#define G_OBJECT_CLASS_NAME(class)  (g_type_name (G_OBJECT_CLASS_TYPE (class)))
  |  |  ------------------
  |  |  |  |  114|  3.71M|#define G_OBJECT_CLASS_TYPE(class)  (G_TYPE_FROM_CLASS (class))
  |  |  |  |  ------------------
  |  |  |  |  |  |  613|  3.71M|#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  |  Branch (2866:6): [True: 25.1k, False: 3.68M]
  ------------------
 2867|  25.1k|		return class;
 2868|       |
 2869|  3.68M|	return NULL;
 2870|  3.71M|}
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|  1.08M|{
 3042|  1.08M|	int i;
 3043|       |
 3044|  3.68M|	for (i = 0; i < local->n; i++)
  ------------------
  |  Branch (3044:14): [True: 2.60M, False: 1.08M]
  ------------------
 3045|  2.60M|		VIPS_FREEF(g_object_unref, local->array[i]);
  ------------------
  |  |   41|  2.60M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  2.60M|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  2.60M|	{ \
  |  |   43|  2.60M|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 1.27M, False: 1.32M]
  |  |  ------------------
  |  |   44|  1.27M|			(void) F((S)); \
  |  |   45|  1.27M|			(S) = 0; \
  |  |   46|  1.27M|		} \
  |  |   47|  2.60M|	} \
  |  |   48|  2.60M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  2.60M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3046|       |
 3047|  1.08M|	VIPS_FREEF(g_free, local->array);
  ------------------
  |  |   41|  1.08M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.08M|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  1.08M|	{ \
  |  |   43|  1.08M|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 1.08M, False: 0]
  |  |  ------------------
  |  |   44|  1.08M|			(void) F((S)); \
  |  |   45|  1.08M|			(S) = 0; \
  |  |   46|  1.08M|		} \
  |  |   47|  1.08M|	} \
  |  |   48|  1.08M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.08M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3048|  1.08M|	VIPS_FREEF(g_free, local);
  ------------------
  |  |   41|  1.08M|	G_STMT_START \
  |  |  ------------------
  |  |  |  |  854|  1.08M|#define G_STMT_START  do
  |  |  ------------------
  |  |   42|  1.08M|	{ \
  |  |   43|  1.08M|		if (S) { \
  |  |  ------------------
  |  |  |  Branch (43:7): [True: 1.08M, False: 0]
  |  |  ------------------
  |  |   44|  1.08M|			(void) F((S)); \
  |  |   45|  1.08M|			(S) = 0; \
  |  |   46|  1.08M|		} \
  |  |   47|  1.08M|	} \
  |  |   48|  1.08M|	G_STMT_END
  |  |  ------------------
  |  |  |  |  862|  1.08M|#define G_STMT_END    while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3049|  1.08M|}
object.c:vips_object_unref_outputs_sub:
 3199|   141k|{
 3200|   141k|	if ((argument_class->flags & VIPS_ARGUMENT_OUTPUT) &&
  ------------------
  |  Branch (3200:6): [True: 22.4k, False: 118k]
  ------------------
 3201|   141k|		G_IS_PARAM_SPEC_OBJECT(pspec) &&
  ------------------
  |  |  491|   163k|#define G_IS_PARAM_SPEC_OBJECT(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OBJECT))
  |  |  ------------------
  |  |  |  |  497|  22.4k|#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
  |  |  |  |  ------------------
  |  |  |  |  |  | 2314|  22.4k|#  define _G_TYPE_CIT(ip, gt)             (G_GNUC_EXTENSION ({ \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   54|  22.4k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2315|  22.4k|  GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
  |  |  |  |  |  | 2316|  22.4k|  if (!__inst) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2316:7): [True: 0, False: 22.4k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2317|  22.4k|    __r = FALSE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  794|      0|#define	FALSE	(0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2318|  22.4k|  else if (__inst->g_class && __inst->g_class->g_type == __t) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (2318:12): [True: 22.4k, False: 0]
  |  |  |  |  |  |  |  Branch (2318:31): [True: 8.00k, False: 14.4k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2319|  22.4k|    __r = TRUE; \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  798|  8.00k|#define	TRUE	(!FALSE)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  794|  8.00k|#define	FALSE	(0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 2320|  22.4k|  else \
  |  |  |  |  |  | 2321|  22.4k|    __r = g_type_check_instance_is_a (__inst, __t); \
  |  |  |  |  |  | 2322|  22.4k|  __r; \
  |  |  |  |  |  | 2323|  22.4k|}))
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (491:44): [True: 8.00k, False: 14.4k]
  |  |  ------------------
  ------------------
 3202|   141k|		argument_instance->assigned) {
  ------------------
  |  Branch (3202:3): [True: 6.49k, False: 1.51k]
  ------------------
 3203|  6.49k|		GObject *value;
 3204|       |
 3205|  6.49k|		g_object_get(object,
 3206|  6.49k|			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|  6.49k|		g_object_unref(value);
 3212|  6.49k|		g_object_unref(value);
 3213|  6.49k|	}
 3214|       |
 3215|   141k|	return NULL;
 3216|   141k|}

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

vips_rect_isempty:
   97|  2.83M|{
   98|  2.83M|	return r->width <= 0 || r->height <= 0;
  ------------------
  |  Branch (98:9): [True: 54.4k, False: 2.78M]
  |  Branch (98:26): [True: 54.4k, False: 2.72M]
  ------------------
   99|  2.83M|}
vips_rect_includesrect:
  112|  1.17M|{
  113|  1.17M|	return r1->left <= r2->left &&
  ------------------
  |  Branch (113:9): [True: 1.16M, False: 15.5k]
  ------------------
  114|  1.17M|		r1->top <= r2->top &&
  ------------------
  |  Branch (114:3): [True: 1.14M, False: 15.5k]
  ------------------
  115|  1.17M|		r1->left + r1->width >= r2->left + r2->width &&
  ------------------
  |  Branch (115:3): [True: 1.14M, False: 0]
  ------------------
  116|  1.17M|		r1->top + r1->height >= r2->top + r2->height;
  ------------------
  |  Branch (116:3): [True: 1.12M, False: 24.1k]
  ------------------
  117|  1.17M|}
vips_rect_marginadjust:
  163|  36.3k|{
  164|  36.3k|	r->left -= n;
  165|  36.3k|	r->top -= n;
  166|  36.3k|	r->width += 2 * n;
  167|  36.3k|	r->height += 2 * n;
  168|  36.3k|}
vips_rect_intersectrect:
  180|  5.59M|{
  181|  5.59M|	int left = VIPS_MAX(r1->left, r2->left);
  ------------------
  |  |   54|  5.59M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 183k, False: 5.41M]
  |  |  ------------------
  ------------------
  182|  5.59M|	int top = VIPS_MAX(r1->top, r2->top);
  ------------------
  |  |   54|  5.59M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 721k, False: 4.87M]
  |  |  ------------------
  ------------------
  183|  5.59M|	int right = VIPS_MIN(VIPS_RECT_RIGHT(r1), VIPS_RECT_RIGHT(r2));
  ------------------
  |  |   55|  5.59M|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 251k, False: 5.34M]
  |  |  ------------------
  ------------------
  184|  5.59M|	int bottom = VIPS_MIN(VIPS_RECT_BOTTOM(r1), VIPS_RECT_BOTTOM(r2));
  ------------------
  |  |   55|  5.59M|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 1.04M, False: 4.54M]
  |  |  ------------------
  ------------------
  185|  5.59M|	int width = VIPS_MAX(0, right - left);
  ------------------
  |  |   54|  5.59M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 5.59M]
  |  |  ------------------
  ------------------
  186|  5.59M|	int height = VIPS_MAX(0, bottom - top);
  ------------------
  |  |   54|  5.59M|#define VIPS_MAX(A, B) ((A) > (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (54:25): [True: 0, False: 5.59M]
  |  |  ------------------
  ------------------
  187|       |
  188|  5.59M|	out->left = left;
  189|  5.59M|	out->top = top;
  190|  5.59M|	out->width = width;
  191|  5.59M|	out->height = height;
  192|  5.59M|}

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

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

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

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

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

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

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

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

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|   136k|{
  304|   136k|	VipsThreadExec *task;
  305|       |
  306|   136k|	g_async_queue_lock(set->queue);
  307|       |
  308|       |	/* Create a new thread if there are no waiting threads in the queue.
  309|       |	 */
  310|   136k|	if (g_async_queue_length_unlocked(set->queue) >= 0)
  ------------------
  |  Branch (310:6): [True: 4, False: 136k]
  ------------------
  311|      4|		if (!vips_threadset_add_thread(set)) {
  ------------------
  |  Branch (311:7): [True: 0, False: 4]
  ------------------
  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|   136k|	task = g_new0(VipsThreadExec, 1);
  ------------------
  |  |  299|   136k|#define g_new0(struct_type, n_structs)			_G_NEW (struct_type, n_structs, malloc0)
  |  |  ------------------
  |  |  |  |  227|   136k|	(struct_type *) (G_GNUC_EXTENSION ({			\
  |  |  |  |  ------------------
  |  |  |  |  |  |   54|   136k|#define G_GNUC_EXTENSION __extension__
  |  |  |  |  ------------------
  |  |  |  |  228|   136k|	  gsize __n = (gsize) (n_structs);			\
  |  |  |  |  229|   136k|	  gsize __s = sizeof (struct_type);			\
  |  |  |  |  230|   136k|	  gpointer __p;						\
  |  |  |  |  231|   136k|	  if (__s == 1)						\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (231:8): [True: 0, False: 136k]
  |  |  |  |  ------------------
  |  |  |  |  232|   136k|	    __p = g_##func (__n);				\
  |  |  |  |  233|   136k|	  else if (__builtin_constant_p (__n) &&		\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (233:13): [True: 136k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  234|   136k|	           (__s == 0 || __n <= G_MAXSIZE / __s))	\
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (234:14): [True: 0, False: 136k]
  |  |  |  |  |  Branch (234:26): [True: 136k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  235|   136k|	    __p = g_##func (__n * __s);				\
  |  |  |  |  236|   136k|	  else							\
  |  |  |  |  237|   136k|	    __p = g_##func##_n (__n, __s);			\
  |  |  |  |  238|   136k|	  __p;							\
  |  |  |  |  239|   136k|	}))
  |  |  ------------------
  ------------------
  322|   136k|	task->domain = domain;
  323|   136k|	task->func = func;
  324|   136k|	task->data = data;
  325|       |
  326|   136k|	g_async_queue_push_unlocked(set->queue, task);
  327|   136k|	g_async_queue_unlock(set->queue);
  328|       |
  329|   136k|	return 0;
  330|   136k|}
threadset.c:vips_threadset_add_thread:
  212|      4|{
  213|      4|	gboolean reused = FALSE;
  ------------------
  |  |  794|      4|#define	FALSE	(0)
  ------------------
  214|       |
  215|       |	/* There are already sufficient threads running.
  216|       |	 */
  217|      4|	if (set->max_threads > 0 &&
  ------------------
  |  Branch (217:6): [True: 0, False: 4]
  ------------------
  218|      4|		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|      4|	if (set->n_idle_threads > 0) {
  ------------------
  |  Branch (221:6): [True: 2, False: 2]
  ------------------
  222|      2|		vips_semaphore_up(&set->idle);
  223|       |
  224|      2|		set->n_idle_threads--;
  225|      2|		reused = TRUE;
  ------------------
  |  |  798|      2|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      2|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  226|      2|	}
  227|       |
  228|      4|	if (!reused) {
  ------------------
  |  Branch (228:6): [True: 2, False: 2]
  ------------------
  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|      4|	return TRUE;
  ------------------
  |  |  798|      4|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|      4|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  247|      4|}
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|   136k|	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|   136k|		VipsThreadExec *task = set->max_threads > 0
  ------------------
  |  Branch (146:26): [True: 0, False: 136k]
  ------------------
  147|   136k|			? g_async_queue_pop_unlocked(set->queue)
  148|   136k|			: g_async_queue_timeout_pop_unlocked(set->queue,
  149|   136k|				  G_USEC_PER_SEC / 2);
  ------------------
  |  |   42|   136k|#define G_USEC_PER_SEC 1000000
  ------------------
  150|       |
  151|       |		/* Request to exit? Leave this thread.
  152|       |		 */
  153|   136k|		if (set->exit) {
  ------------------
  |  Branch (153:7): [True: 0, False: 136k]
  ------------------
  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|   136k|		if (task == NULL) {
  ------------------
  |  Branch (162:7): [True: 2, False: 136k]
  ------------------
  163|      2|			if (!vips_threadset_reuse_wait(set)) {
  ------------------
  |  Branch (163:8): [True: 0, False: 2]
  ------------------
  164|      0|				set->n_idle_threads--;
  165|      0|				break;
  166|      0|			}
  167|       |
  168|      2|			continue;
  169|      2|		}
  170|       |
  171|       |		/* A task was received and there was no request to exit.
  172|       |		 */
  173|   136k|		g_async_queue_unlock(set->queue);
  174|       |
  175|       |		/* If we're profiling, attach a prof struct to this thread.
  176|       |		 */
  177|   136k|		if (vips__thread_profile)
  ------------------
  |  Branch (177:7): [True: 0, False: 136k]
  ------------------
  178|      0|			vips__thread_profile_attach(task->domain);
  179|       |
  180|       |		/* Execute the task.
  181|       |		 */
  182|   136k|		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|   136k|		vips_thread_shutdown();
  188|   136k|		VIPS_FREE(task);
  ------------------
  |  |   50|   136k|#define VIPS_FREE(S) VIPS_FREEF(g_free, (S));
  |  |  ------------------
  |  |  |  |   41|   136k|	G_STMT_START \
  |  |  |  |  ------------------
  |  |  |  |  |  |  854|   136k|#define G_STMT_START  do
  |  |  |  |  ------------------
  |  |  |  |   42|   136k|	{ \
  |  |  |  |   43|   136k|		if (S) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (43:7): [True: 136k, False: 2]
  |  |  |  |  ------------------
  |  |  |  |   44|   136k|			(void) F((S)); \
  |  |  |  |   45|   136k|			(S) = 0; \
  |  |  |  |   46|   136k|		} \
  |  |  |  |   47|   136k|	} \
  |  |  |  |   48|   136k|	G_STMT_END
  |  |  |  |  ------------------
  |  |  |  |  |  |  862|   136k|#define G_STMT_END    while (0)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (862:30): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  189|       |
  190|   136k|		g_async_queue_lock(set->queue);
  191|   136k|	}
  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|      2|{
  103|      2|	int result;
  104|       |
  105|       |	/* A superfluous thread? Leave this thread.
  106|       |	 */
  107|      2|	if (++set->n_idle_threads > max_idle_threads)
  ------------------
  |  Branch (107:6): [True: 0, False: 2]
  ------------------
  108|      0|		return FALSE;
  ------------------
  |  |  794|      0|#define	FALSE	(0)
  ------------------
  109|       |
  110|      2|	g_async_queue_unlock(set->queue);
  111|       |
  112|       |	/* Wait for at least 15 seconds before leaving this thread.
  113|       |	 */
  114|      2|	result = vips_semaphore_down_timeout(&set->idle, max_idle_time);
  115|       |
  116|      2|	g_async_queue_lock(set->queue);
  117|       |
  118|      2|	return result != -1;
  119|      2|}

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

vips_slist_map2:
   94|  17.3M|{
   95|  17.3M|	GSList *copy;
   96|  17.3M|	GSList *i;
   97|  17.3M|	void *result;
   98|       |
   99|  17.3M|	copy = g_slist_copy(list);
  100|  17.3M|	result = NULL;
  101|  49.1M|	for (i = copy; i && !(result = fn(i->data, a, b)); i = i->next)
  ------------------
  |  Branch (101:17): [True: 31.8M, False: 17.3M]
  |  Branch (101:22): [True: 31.7M, False: 25.1k]
  ------------------
  102|  31.7M|		;
  103|  17.3M|	g_slist_free(copy);
  104|       |
  105|  17.3M|	return result;
  106|  17.3M|}
vips_isprefix:
  269|  13.9M|{
  270|  13.9M|	int i;
  271|       |
  272|  14.3M|	for (i = 0; a[i] && b[i]; i++)
  ------------------
  |  Branch (272:14): [True: 14.3M, False: 42.5k]
  |  Branch (272:22): [True: 8.36M, False: 5.99M]
  ------------------
  273|  8.36M|		if (a[i] != b[i])
  ------------------
  |  Branch (273:7): [True: 7.88M, False: 479k]
  ------------------
  274|  7.88M|			return FALSE;
  ------------------
  |  |  794|  7.88M|#define	FALSE	(0)
  ------------------
  275|       |
  276|       |	/* If there's stuff left in a but b has finished, we must have a
  277|       |	 * mismatch.
  278|       |	 */
  279|  6.03M|	if (a[i] && !b[i])
  ------------------
  |  Branch (279:6): [True: 5.99M, False: 42.5k]
  |  Branch (279:14): [True: 5.99M, False: 0]
  ------------------
  280|  5.99M|		return FALSE;
  ------------------
  |  |  794|  5.99M|#define	FALSE	(0)
  ------------------
  281|       |
  282|  42.5k|	return TRUE;
  ------------------
  |  |  798|  42.5k|#define	TRUE	(!FALSE)
  |  |  ------------------
  |  |  |  |  794|  42.5k|#define	FALSE	(0)
  |  |  ------------------
  ------------------
  283|  6.03M|}
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|  1.10M|{
  888|  1.10M|	const GSList *i, *j;
  889|  1.10M|	GSList *tail;
  890|       |
  891|  1.10M|	tail = NULL;
  892|       |
  893|  1.10M|	for (i = b; i; i = i->next) {
  ------------------
  |  Branch (893:14): [True: 0, False: 1.10M]
  ------------------
  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|  1.10M|	a = g_slist_concat(a, g_slist_reverse(tail));
  918|       |
  919|  1.10M|	return a;
  920|  1.10M|}
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|   100k|{
 1157|   100k|	const char *q;
 1158|   100k|	int ch;
 1159|   100k|	int n;
 1160|       |
 1161|       |	/* string return defaults to "".
 1162|       |	 */
 1163|   100k|	if (size > 0)
  ------------------
  |  Branch (1163:6): [True: 100k, False: 0]
  ------------------
 1164|   100k|		string[0] = '\0';
 1165|       |
 1166|       |	/* Parse this token with p.
 1167|       |	 */
 1168|   100k|	if (!p)
  ------------------
  |  Branch (1168:6): [True: 0, False: 100k]
  ------------------
 1169|      0|		return NULL;
 1170|       |
 1171|       |	/* Skip initial whitespace.
 1172|       |	 */
 1173|   100k|	p += strspn(p, " \t\n\r");
 1174|   100k|	if (!p[0])
  ------------------
  |  Branch (1174:6): [True: 50.3k, False: 50.3k]
  ------------------
 1175|  50.3k|		return NULL;
 1176|       |
 1177|  50.3k|	switch ((ch = p[0])) {
 1178|  25.1k|	case '[':
  ------------------
  |  Branch (1178:2): [True: 25.1k, False: 25.1k]
  ------------------
 1179|  25.1k|		*token = VIPS_TOKEN_LEFT;
 1180|  25.1k|		p += 1;
 1181|  25.1k|		break;
 1182|       |
 1183|  25.1k|	case ']':
  ------------------
  |  Branch (1183:2): [True: 25.1k, False: 25.1k]
  ------------------
 1184|  25.1k|		*token = VIPS_TOKEN_RIGHT;
 1185|  25.1k|		p += 1;
 1186|  25.1k|		break;
 1187|       |
 1188|      0|	case '=':
  ------------------
  |  Branch (1188:2): [True: 0, False: 50.3k]
  ------------------
 1189|      0|		*token = VIPS_TOKEN_EQUALS;
 1190|      0|		p += 1;
 1191|      0|		break;
 1192|       |
 1193|      0|	case ',':
  ------------------
  |  Branch (1193:2): [True: 0, False: 50.3k]
  ------------------
 1194|      0|		*token = VIPS_TOKEN_COMMA;
 1195|      0|		p += 1;
 1196|      0|		break;
 1197|       |
 1198|      0|	case '"':
  ------------------
  |  Branch (1198:2): [True: 0, False: 50.3k]
  ------------------
 1199|      0|	case '\'':
  ------------------
  |  Branch (1199:2): [True: 0, False: 50.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: 50.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|  50.3k|	}
 1255|       |
 1256|  50.3k|	return p;
 1257|  50.3k|}
vips__token_must:
 1264|  50.3k|{
 1265|  50.3k|	if (!(p = vips__token_get(p, token, string, size))) {
  ------------------
  |  Branch (1265:6): [True: 0, False: 50.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|  50.3k|	return p;
 1272|  50.3k|}
vips__token_need:
 1279|  25.1k|{
 1280|  25.1k|	VipsToken token;
 1281|       |
 1282|  25.1k|	if (!(p = vips__token_must(p, &token, string, size)))
  ------------------
  |  Branch (1282:6): [True: 0, False: 25.1k]
  ------------------
 1283|      0|		return NULL;
 1284|  25.1k|	if (token != need_token) {
  ------------------
  |  Branch (1284:6): [True: 0, False: 25.1k]
  ------------------
 1285|      0|		vips_error("get_token", _("expected %s, saw %s"),
  ------------------
  |  |   30|      0|#define  _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String))
  |  |  ------------------
  |  |  |  |   10|      0|#define GETTEXT_PACKAGE "vips8.17"
  |  |  ------------------
  ------------------
 1286|      0|			vips_enum_nick(VIPS_TYPE_TOKEN, need_token),
  ------------------
  |  |  178|      0|#define VIPS_TYPE_TOKEN (vips_token_get_type())
  ------------------
 1287|      0|			vips_enum_nick(VIPS_TYPE_TOKEN, token));
  ------------------
  |  |  178|      0|#define VIPS_TYPE_TOKEN (vips_token_get_type())
  ------------------
 1288|      0|		return NULL;
 1289|      0|	}
 1290|       |
 1291|  25.1k|	return p;
 1292|  25.1k|}
vips__token_segment:
 1302|  25.1k|{
 1303|  25.1k|	const char *q;
 1304|       |
 1305|  25.1k|	if (!(q = vips__token_must(p, token, string, size)))
  ------------------
  |  Branch (1305:6): [True: 0, False: 25.1k]
  ------------------
 1306|      0|		return NULL;
 1307|       |
 1308|       |	/* If we stopped on [, read up to the matching ].
 1309|       |	 */
 1310|  25.1k|	if (*token == VIPS_TOKEN_STRING &&
  ------------------
  |  Branch (1310:6): [True: 0, False: 25.1k]
  ------------------
 1311|  25.1k|		q[0] == '[') {
  ------------------
  |  Branch (1311:3): [True: 0, False: 0]
  ------------------
 1312|      0|		VipsToken sub_token;
 1313|      0|		char sub_string[VIPS_PATH_MAX];
 1314|      0|		int depth;
 1315|      0|		int i;
 1316|       |
 1317|      0|		depth = 0;
 1318|      0|		do {
 1319|      0|			if (!(q = vips__token_must(q, &sub_token,
  ------------------
  |  Branch (1319:8): [True: 0, False: 0]
  ------------------
 1320|      0|					  sub_string, VIPS_PATH_MAX)))
  ------------------
  |  |  245|      0|#define VIPS_PATH_MAX (4096)
  ------------------
 1321|      0|				return NULL;
 1322|       |
 1323|      0|			switch (sub_token) {
 1324|      0|			case VIPS_TOKEN_LEFT:
  ------------------
  |  Branch (1324:4): [True: 0, False: 0]
  ------------------
 1325|      0|				depth += 1;
 1326|      0|				break;
 1327|       |
 1328|      0|			case VIPS_TOKEN_RIGHT:
  ------------------
  |  Branch (1328:4): [True: 0, False: 0]
  ------------------
 1329|      0|				depth -= 1;
 1330|      0|				break;
 1331|       |
 1332|      0|			default:
  ------------------
  |  Branch (1332:4): [True: 0, False: 0]
  ------------------
 1333|      0|				break;
 1334|      0|			}
 1335|      0|		} while (!(sub_token == VIPS_TOKEN_RIGHT && depth == 0));
  ------------------
  |  Branch (1335:14): [True: 0, False: 0]
  |  Branch (1335:47): [True: 0, False: 0]
  ------------------
 1336|       |
 1337|      0|		i = VIPS_MIN(q - p, size);
  ------------------
  |  |   55|      0|#define VIPS_MIN(A, B) ((A) < (B) ? (A) : (B))
  |  |  ------------------
  |  |  |  Branch (55:25): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1338|      0|		g_strlcpy(string, p, i + 1);
 1339|      0|	}
 1340|       |
 1341|  25.1k|	return q;
 1342|  25.1k|}
vips_amiMSBfirst:
 1482|  1.11M|{
 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|  1.11M|}
vips_enum_nick:
 1644|    532|{
 1645|    532|	GEnumValue *value;
 1646|       |
 1647|    532|	if (!(value = g_enum_get_value(g_type_class_ref(enm), v)))
  ------------------
  |  Branch (1647:6): [True: 0, False: 532]
  ------------------
 1648|      0|		return "(null)";
 1649|       |
 1650|    532|	return value->value_nick;
 1651|    532|}
util.c:strcspne:
  292|     10|{
  293|     10|	size_t skip;
  294|       |
  295|       |	/* If \ is one of the reject chars, no need for any looping.
  296|       |	 */
  297|     10|	if (strchr(reject, '\\'))
  ------------------
  |  Branch (297:6): [True: 0, False: 10]
  ------------------
  298|      0|		return strcspn(s, reject);
  299|       |
  300|     10|	skip = 0;
  301|     10|	for (;;) {
  302|     10|		skip += strcspn(s + skip, reject);
  303|       |
  304|       |		/* s[skip] is at the start of the string, or the end, or on a
  305|       |		 * break character.
  306|       |		 */
  307|     10|		if (skip == 0 ||
  ------------------
  |  Branch (307:7): [True: 0, False: 10]
  ------------------
  308|     10|			!s[skip] ||
  ------------------
  |  Branch (308:4): [True: 1, False: 9]
  ------------------
  309|     10|			s[skip - 1] != '\\')
  ------------------
  |  Branch (309:4): [True: 9, False: 0]
  ------------------
  310|     10|			break;
  311|       |
  312|       |		/* So skip points at break char and we have a '\' in the char
  313|       |		 * before. Step over the break.
  314|       |		 */
  315|      0|		skip += 1;
  316|      0|	}
  317|       |
  318|     10|	return skip;
  319|     10|}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

