BlockMap BlockMap_Construct(const Size *pixelSize, int maxBlockSize) { BlockMap bm; bm.pixelCount = *pixelSize; bm.blockCount = Size_Construct(Calc_DivRoundUp(bm.pixelCount.width, maxBlockSize), Calc_DivRoundUp(bm.pixelCount.height, maxBlockSize)); bm.cornerCount = BlockToCornerCount(&bm.blockCount); bm.allBlocks = RectangleC_ConstructFromSize(&bm.blockCount); bm.allCorners = RectangleC_ConstructFromSize(&bm.cornerCount); bm.corners = InitCorners(&bm); bm.blockAreas = RectangleGrid_Construct(&bm.corners); bm.blockCenters = InitBlockCenters(&bm); bm.cornerAreas = InitCornerAreas(&bm); return bm; }
static RectangleGrid InitCornerAreas(const BlockMap *me) { Size s = Size_Construct(me->cornerCount.width + 1, me->cornerCount.height + 1); PointGrid grid = PointGrid_Construct(&s); grid.allY.data[0] = 0; for (int y = 0; y < me->blockCount.height; ++y) { Point p = PointGrid_GetPointFromCoordinates(&me->blockCenters, y, 0); grid.allY.data[y + 1] = p.y; } grid.allY.data[me->blockCount.height] = me->pixelCount.height; grid.allX.data[0] = 0; for (int x = 0; x < me->blockCount.width; ++x) { Point p = PointGrid_GetPointFromCoordinates(&me->blockCenters, 0, x); grid.allX.data[x + 1] = p.x; } grid.allX.data[me->blockCount.width] = me->pixelCount.width; return RectangleGrid_Construct(&grid); }
Size RectangleC_GetSize(const RectangleC *me) { return Size_Construct(me->width, me->height); }
static Size BlockToCornerCount(const Size *blockCount) { return Size_Construct(blockCount->width + 1, blockCount->height + 1); }