88#include <config_auto.h>
91#include "allheaders.h"
132l_int32 width, height;
136 return (
PIXTILING *)ERROR_PTR(
"pixs not defined", __func__, NULL);
138 return (
PIXTILING *)ERROR_PTR(
"invalid width spec", __func__, NULL);
140 return (
PIXTILING *)ERROR_PTR(
"invalid height spec", __func__, NULL);
146 pixGetDimensions(pixs, &width, &height, NULL);
148 nx = L_MAX(1, width / w);
151 ny = L_MAX(1, height / h);
153 if (xoverlap > w || yoverlap > h) {
154 L_INFO(
"tile width = %d, tile height = %d\n", __func__, w, h);
155 return (
PIXTILING *)ERROR_PTR(
"overlap too large", __func__, NULL);
159 pt->
pix = pixClone(pixs);
183 L_WARNING(
"ptr address is null!\n", __func__);
187 if ((pt = *ppt) == NULL)
190 pixDestroy(&pt->
pix);
210 return ERROR_INT(
"pt not defined", __func__, 1);
211 if (pnx) *pnx = pt->
nx;
212 if (pny) *pny = pt->
ny;
231 return ERROR_INT(
"pt not defined", __func__, 1);
252l_int32 wpix, hpix, wt, ht, nx, ny;
253l_int32 xoverlap, yoverlap, wtlast, htlast;
254l_int32 left, top, xtraleft, xtraright, xtratop, xtrabot, width, height;
256PIX *pixs, *pixt, *pixd;
259 return (
PIX *)ERROR_PTR(
"pt not defined", __func__, NULL);
260 if ((pixs = pt->
pix) == NULL)
261 return (
PIX *)ERROR_PTR(
"pix not found", __func__, NULL);
263 if (i < 0 || i >= ny)
264 return (
PIX *)ERROR_PTR(
"invalid row index i", __func__, NULL);
265 if (j < 0 || j >= nx)
266 return (
PIX *)ERROR_PTR(
"invalid column index j", __func__, NULL);
270 pixGetDimensions(pixs, &wpix, &hpix, NULL);
274 wtlast = wpix - wt * (nx - 1);
275 htlast = hpix - ht * (ny - 1);
276 left = L_MAX(0, j * wt - xoverlap);
277 top = L_MAX(0, i * ht - yoverlap);
284 width = wt + xoverlap;
285 else if (j == nx - 1)
286 width = wtlast + xoverlap;
288 width = wt + 2 * xoverlap;
293 height = ht + yoverlap;
294 else if (i == ny - 1)
295 height = htlast + yoverlap;
297 height = ht + 2 * yoverlap;
298 box = boxCreate(left, top, width, height);
299 pixt = pixClipRectangle(pixs, box, NULL);
303 if (xoverlap == 0 && yoverlap == 0)
310 xtratop = xtrabot = xtraleft = xtraright = 0;
312 xtraleft = xtraright = xoverlap;
314 xtratop = xtrabot = yoverlap;
315 if (i == 0 && j == 0)
316 pixd = pixAddMirroredBorder(pixt, xoverlap, xtraright,
318 else if (i == 0 && j == nx - 1)
319 pixd = pixAddMirroredBorder(pixt, xtraleft, xoverlap,
321 else if (i == ny - 1 && j == 0)
322 pixd = pixAddMirroredBorder(pixt, xoverlap, xtraright,
324 else if (i == ny - 1 && j == nx - 1)
325 pixd = pixAddMirroredBorder(pixt, xtraleft, xoverlap,
328 pixd = pixAddMirroredBorder(pixt, 0, 0, yoverlap, xtrabot);
329 else if (i == ny - 1)
330 pixd = pixAddMirroredBorder(pixt, 0, 0, xtratop, yoverlap);
332 pixd = pixAddMirroredBorder(pixt, xoverlap, xtraright, 0, 0);
333 else if (j == nx - 1)
334 pixd = pixAddMirroredBorder(pixt, xtraleft, xoverlap, 0, 0);
336 pixd = pixClone(pixt);
362 return ERROR_INT(
"pt not defined", __func__, 1);
388 return ERROR_INT(
"pixd not defined", __func__, 1);
390 return ERROR_INT(
"pixs not defined", __func__, 1);
392 return ERROR_INT(
"pt not defined", __func__, 1);
393 if (i < 0 || i >= pt->
ny)
394 return ERROR_INT(
"invalid row index i", __func__, 1);
395 if (j < 0 || j >= pt->
nx)
396 return ERROR_INT(
"invalid column index j", __func__, 1);
399 pixGetDimensions(pixs, &w, &h, NULL);
400 if (pt->
strip == TRUE) {
401 pixRasterop(pixd, j * pt->
w, i * pt->
h,
405 pixRasterop(pixd, j * pt->
w, i * pt->
h, w, h,
PIX_SRC, pixs, 0, 0);
l_ok pixTilingNoStripOnPaint(PIXTILING *pt)
pixTilingNoStripOnPaint()
l_ok pixTilingGetCount(PIXTILING *pt, l_int32 *pnx, l_int32 *pny)
pixTilingGetCount()
l_ok pixTilingGetSize(PIXTILING *pt, l_int32 *pw, l_int32 *ph)
pixTilingGetSize()
PIXTILING * pixTilingCreate(PIX *pixs, l_int32 nx, l_int32 ny, l_int32 w, l_int32 h, l_int32 xoverlap, l_int32 yoverlap)
pixTilingCreate()
void pixTilingDestroy(PIXTILING **ppt)
pixTilingDestroy()
l_ok pixTilingPaintTile(PIX *pixd, l_int32 i, l_int32 j, PIX *pixs, PIXTILING *pt)
pixTilingPaintTile()
PIX * pixTilingGetTile(PIXTILING *pt, l_int32 i, l_int32 j)
pixTilingGetTile()