75 lines
2.1 KiB
C++
75 lines
2.1 KiB
C++
// File: crn_arealist.h - 2D shape algebra
|
|
// See Copyright Notice and license at the end of inc/crnlib.h
|
|
#pragma once
|
|
|
|
namespace crnlib
|
|
{
|
|
struct Area
|
|
{
|
|
struct Area *Pprev, *Pnext;
|
|
|
|
int x1, y1, x2, y2;
|
|
|
|
uint get_width() const { return x2 - x1 + 1; }
|
|
uint get_height() const { return y2 - y1 + 1; }
|
|
uint get_area() const { return get_width() * get_height(); }
|
|
};
|
|
|
|
typedef Area * Area_Ptr;
|
|
|
|
struct Area_List
|
|
{
|
|
int total_areas;
|
|
int next_free;
|
|
|
|
Area *Phead, *Ptail, *Pfree;
|
|
};
|
|
|
|
typedef Area_List * Area_List_Ptr;
|
|
|
|
Area_List * Area_List_init(int max_areas);
|
|
void Area_List_deinit(Area_List* Pobj_base);
|
|
|
|
void Area_List_print(Area_List *Plist);
|
|
|
|
Area_List * Area_List_dup_new(Area_List *Plist,
|
|
int x_ofs, int y_ofs);
|
|
|
|
uint Area_List_get_num(Area_List* Plist);
|
|
|
|
// src and dst area lists must have the same number of total areas.
|
|
void Area_List_dup(Area_List *Psrc_list,
|
|
Area_List *Pdst_list,
|
|
int x_ofs, int y_ofs);
|
|
|
|
void Area_List_copy(Area_List *Psrc_list,
|
|
Area_List *Pdst_list,
|
|
int x_ofs, int y_ofs);
|
|
|
|
void Area_List_clear(Area_List *Plist);
|
|
|
|
void Area_List_set(Area_List *Plist,
|
|
int x1, int y1, int x2, int y2);
|
|
|
|
// logical: x and (not y)
|
|
void Area_List_remove(Area_List *Plist,
|
|
int x1, int y1, int x2, int y2);
|
|
|
|
// logical: x or y
|
|
void Area_List_insert(Area_List *Plist,
|
|
int x1, int y1, int x2, int y2,
|
|
bool combine);
|
|
|
|
// logical: x and y
|
|
void Area_List_intersect_area(Area_List *Plist,
|
|
int x1, int y1, int x2, int y2);
|
|
|
|
// logical: x and y
|
|
void Area_List_intersect_Area_List(Area_List *Pouter_list,
|
|
Area_List *Pinner_list,
|
|
Area_List *Pdst_list);
|
|
|
|
Area_List_Ptr Area_List_create_optimal(Area_List_Ptr Plist);
|
|
|
|
} // namespace crnlib
|