void gs_matrix_scale3f(float x, float y, float z) { struct matrix3 *top_mat = top_matrix(thread_graphics); struct vec3 p; vec3_set(&p, x, y, z); matrix3_scale(top_mat, top_mat, &p); }
/* dng_color_spec::SetWhiteXY */ static void set_white_xy(RSDcp *dcp, const RS_xy_COORD *xy) { RS_MATRIX3 color_matrix; RS_MATRIX3 forward_matrix; dcp->white_xy = *xy; color_matrix = find_xyz_to_camera(dcp, xy, &forward_matrix); RS_XYZ_VECTOR white = xy_to_XYZ(xy); dcp->camera_white = vector3_multiply_matrix(&white, &color_matrix); gfloat white_scale = 1.0 / vector3_max(&dcp->camera_white); dcp->camera_white.x = CLAMP(0.001, white_scale * dcp->camera_white.x, 1.0); dcp->camera_white.y = CLAMP(0.001, white_scale * dcp->camera_white.y, 1.0); dcp->camera_white.z = CLAMP(0.001, white_scale * dcp->camera_white.z, 1.0); if (dcp->has_forward_matrix1 || dcp->has_forward_matrix2) { /* verified by DNG SDK */ RS_MATRIX3 refCameraWhite_diagonal = vector3_as_diagonal(&dcp->camera_white); RS_MATRIX3 refCameraWhite_diagonal_inv = matrix3_invert(&refCameraWhite_diagonal); /* D */ matrix3_multiply(&forward_matrix, &refCameraWhite_diagonal_inv, &dcp->camera_to_pcs); } else { /* FIXME: test this */ RS_xy_COORD PCStoXY = {0.3457, 0.3585}; RS_MATRIX3 map = rs_calculate_map_white_matrix(&PCStoXY, xy); /* or &white?! */ RS_MATRIX3 pcs_to_camera; matrix3_multiply(&color_matrix, &map, &pcs_to_camera); RS_VECTOR3 tmp = vector3_multiply_matrix(&XYZ_WP_D50, &pcs_to_camera); gfloat scale = vector3_max(&tmp); matrix3_scale(&pcs_to_camera, 1.0 / scale, &pcs_to_camera); dcp->camera_to_pcs = matrix3_invert(&pcs_to_camera); } }
void gs_matrix_scale(const struct vec3 *scale) { struct matrix3 *top_mat = top_matrix(thread_graphics); matrix3_scale(top_mat, top_mat, scale); }