def apply_filter_to_image(self, in_image): width = len(in_image[0]) height = len(in_image) in_image_ctypes = image_data() out_image_ctypes = image_data() in_image_ctypes.width = ctypes.c_int16(width) in_image_ctypes.height = ctypes.c_int16(height) in_image_ctypes.data = ctypes.cast( ctypes.pointer((ctypes.c_int16 * (width * height))(*self.matrix_to_array(in_image))), ctypes.POINTER(ctypes.c_int16) ) self.__apply_filter_to_image__( ctypes.pointer(in_image_ctypes), ctypes.pointer(out_image_ctypes), self.__filter_edge_detection__ ) return self.array_to_matrix( ctypes.cast(out_image_ctypes.data, ctypes.POINTER(ctypes.c_int16 * (width * height))).contents[:], width, height )
def square_int_array(self, in_array): in_array_p = ctypes.cast( ctypes.pointer((ctypes.c_int16 * len(in_array))(*in_array)), ctypes.POINTER(ctypes.c_int16)) out_array_p = ctypes.pointer(ctypes.c_void_p()) self.__square_int_array__(in_array_p, out_array_p, ctypes.c_int16(len(in_array))) return ctypes.cast(out_array_p.contents, ctypes.POINTER(ctypes.c_int16 * len(in_array))).contents[:]
def gauss_elimination(self, A): N = 3 if len(A) != N or len(A[0]) != N + 1: raise # TODO x = [0 for eq in range(N)] _A = (ctypes.c_float * (N + 1) * N)(*(tuple(eq) for eq in A)) _x = (ctypes.c_float * N)(*tuple(x)) self.__gauss_elimination__(ctypes.pointer(_A), ctypes.pointer(_x)) for index, eq in enumerate(A): eq[:] = _A[index][:] x[:] = _x[:] return x
def bubblesort(self, values): ctypes_float_values = ((ctypes.c_float) * len(values))(*values) ctypes_float_pointer_firstelement = ctypes.cast( ctypes.pointer(ctypes_float_values), ctypes.POINTER(ctypes.c_float)) self.__bubblesort__(ctypes_float_pointer_firstelement, len(values)) values[:] = ctypes_float_values[:]
def bubblesort_segments(self, values, number_of_segments, elements_per_segment): ctypes_float_values = ((ctypes.c_float)*len(values))(*values) ctypes_float_pointer_firstelement = ctypes.cast( ctypes.pointer(ctypes_float_values), ctypes.POINTER(ctypes.c_float) ) self.__bubblesort_segments__(ctypes_float_pointer_firstelement, number_of_segments, elements_per_segment) values[:] = ctypes_float_values[:]
def mix_rgb_colors(self, color_a, color_b): color_type = ctypes.c_ubyte * 3 ctypes_color_a = color_type(*tuple(color_a)) ctypes_color_b = color_type(*tuple(color_b)) mixed_color = color_type() self.__mix_rgb_colors__(ctypes_color_a, ctypes_color_b, ctypes.pointer(mixed_color)) return mixed_color[:]
def tag_string(self, in_string): in_buffer = ctypes.create_string_buffer(in_string.encode('utf-8')) out_buffer = ctypes.pointer(ctypes.c_void_p()) self.__tag_string__(in_buffer, out_buffer) return ctypes.cast( out_buffer.contents, ctypes.POINTER(ctypes.c_char * (len(in_buffer) + 2)) ).contents[:].decode('utf-8').rstrip('\0')
def square_int_array_with_struct(self, in_array): in_array_obj = int_array_data() out_array_obj = int_array_data() in_array_obj.data = ctypes.cast( ctypes.pointer((ctypes.c_int16 * len(in_array))(*in_array)), ctypes.POINTER(ctypes.c_int16)) in_array_obj.len = len(in_array) self.__square_int_array_with_struct__(in_array_obj, out_array_obj) return ctypes.cast(out_array_obj.data, ctypes.POINTER(ctypes.c_int16 * len(in_array))).contents[:]
def vector3d_add_array(self, v): length = len(v) def dict_from_struct(in_struct): return { key: getattr(in_struct.contents, key) for key in ['x', 'y', 'z'] } v_ctypes = (vector3d * length)() for i in range(length): for key in v[i].keys(): setattr(v_ctypes[i], key, v[i][key]) return dict_from_struct( self.__vector3d_add_array__( ctypes.cast(ctypes.pointer(v_ctypes), ctypes.POINTER(vector3d)), length))