42 bool find(uint16_t _width, uint16_t _height,
Pack2D& _pack)
44 uint16_t
width = bx::min<uint16_t>(64, (_width + m_bw - 1) / m_bw);
45 uint16_t
height = bx::min<uint16_t>(numBlocks, (_height + m_bh - 1) / m_bh);
46 uint16_t numx = 64-
width;
47 uint16_t numy = numBlocks-
height;
49 const uint64_t scan =
width == 64 ? UINT64_MAX : (UINT64_C(1)<<
width)-1;
51 for (uint16_t starty = 0; starty <= numy; ++starty)
53 uint64_t mem = m_mem[starty];
54 uint16_t ntz = bx::countTrailingZeros(mem);
55 uint64_t mask = scan<<ntz;
57 for (uint16_t xx = ntz; xx <= numx; ++xx, mask <<= 1)
60 if ( (mem&mask) == mask)
62 uint16_t endy = starty +
height;
63 while (yy < endy && (m_mem[yy]&mask) == mask)
70 uint64_t cmask = ~mask;
71 for (yy = starty; yy < endy; ++yy)
76 _pack.
m_x = xx * m_bw;
77 _pack.
m_y = starty * m_bh;
91 uint16_t startx = bx::min<uint16_t>(63, _pack.
m_x / m_bw);
92 uint16_t starty = bx::min<uint16_t>(numBlocks-1, _pack.
m_y / m_bh);
93 uint16_t endx = bx::min<uint16_t>(64, (_pack.
m_width + m_bw - 1) / m_bw + startx);
94 uint16_t endy = bx::min<uint16_t>(numBlocks, (_pack.
m_height + m_bh - 1) / m_bh + starty);
95 uint16_t
width = endx - startx;
97 const uint64_t mask = (
width == 64 ? UINT64_MAX : (UINT64_C(1)<<
width)-1 )<<startx;
99 for (uint16_t yy = starty; yy < endy; ++yy)