void f2(void) { float array_of_mat[NUM_MATS][VECTOR_SIZE][VECTOR_SIZE]; float mat_sum[VECTOR_SIZE][VECTOR_SIZE]; memset(mat_sum, 0, sizeof(mat_sum)); int i; #pragma omp parallel for reduction(add_mat : mat_sum) for (i = 0; i < NUM_MATS; i++) { add_mat(VECTOR_SIZE, VECTOR_SIZE, &mat_sum[0][0], &array_of_mat[i][0][0]); } }
// Emit: // clip // matrix // Simple case - the clip isn't effect by the matrix static void emit_clip_and_mat(SkCanvas* canvas, MatType mat, ClipType clip, DrawOpType draw, SkTDArray<DrawType>* expected, int accumulatedClips) { emit_clip(canvas, clip); emit_mat(canvas, mat); if (kNone_DrawOpType == draw) { return; } for (int i = 0; i < accumulatedClips; ++i) { add_clip(clip, mat, expected); } add_mat(mat, expected); }
// Emit: // matrix // clip // Emitting the matrix first is more challenging since the matrix has to be // pushed across (i.e., applied to) the clip. static void emit_mat_and_clip(SkCanvas* canvas, MatType mat, ClipType clip, DrawOpType draw, SkTDArray<DrawType>* expected, int accumulatedClips) { emit_mat(canvas, mat); emit_clip(canvas, clip); if (kNone_DrawOpType == draw) { return; } // the matrix & clip order will be reversed once collapsed! for (int i = 0; i < accumulatedClips; ++i) { add_clip(clip, mat, expected); } add_mat(mat, expected); }