30 : m_source(source), m_tile_manager(tile_manager) {}
42 return "BufferedImage(" + m_source->getRepr() +
")";
47 assert(
x >= 0 &&
y >= 0 && x < m_source->getWidth() && y < m_source->getHeight());
49 if (m_current_tile ==
nullptr || !m_current_tile->isPixelInTile(
x,
y)) {
50 m_current_tile = m_tile_manager->getTileForPixel(
x,
y, m_source);
53 return m_current_tile->getValue<T>(
x,
y);
59 return m_source->getWidth();
65 return m_source->getHeight();
71 int tile_width = m_tile_manager->getTileWidth();
72 int tile_height = m_tile_manager->getTileHeight();
73 int tile_offset_x =
x % tile_width;
74 int tile_offset_y =
y % tile_height;
77 if (tile_offset_x + width <= tile_width && tile_offset_y + height <= tile_height) {
81 auto tile = m_tile_manager->getTileForPixel(
x,
y, m_source);
84 auto image = tile->getImage<T>();
85 const T *data_start = &(image->getData()[tile_offset_x +
86 tile_offset_y * image->getWidth()]);
95 int tile_w = m_tile_manager->getTileWidth();
96 int tile_h = m_tile_manager->getTileHeight();
98 int tile_start_x =
x / tile_w * tile_w;
99 int tile_start_y =
y / tile_h * tile_h;
100 int tile_end_x = (
x + width - 1) / tile_w * tile_w;
101 int tile_end_y = (
y + height - 1) / tile_h * tile_h;
103 for (
int iy = tile_start_y; iy <= tile_end_y; iy += tile_h) {
104 for (
int ix = tile_start_x; ix <= tile_end_x; ix += tile_w) {
105 auto tile = m_tile_manager->getTileForPixel(ix, iy, m_source);
106 copyOverlappingPixels(*tile, data,
x,
y, width, height, tile_w, tile_h);
117 int x,
int y,
int w,
int h,
118 int tile_w,
int tile_h)
const {
123 int off_x = start_x -
x;
124 int off_y = start_y -
y;
126 for (
int data_y = off_y, img_y = start_y; img_y < end_y; ++data_y, ++img_y) {
127 for (
int data_x = off_x, img_x = start_x; img_x < end_x; ++data_x, ++img_x) {
128 output[data_x + data_y * w] = tile.
getValue<T>(img_x, img_y);