1d578543aSAxel Dörfler/*
20ba36860SAxel Dörfler * Copyright 2007-2012, Axel D��rfler, axeld@pinc-software.de.
3d578543aSAxel Dörfler * Distributed under the terms of the MIT License.
4d578543aSAxel Dörfler */
5d578543aSAxel Dörfler
6d578543aSAxel Dörfler
7d578543aSAxel Dörfler#include "SudokuField.h"
8d578543aSAxel Dörfler
9d578543aSAxel Dörfler#include <new>
10d578543aSAxel Dörfler#include <stdio.h>
117bd1d755SAxel Dörfler#include <string.h>
12d578543aSAxel Dörfler
13d578543aSAxel Dörfler#include <Message.h>
14d578543aSAxel Dörfler#include <OS.h>
15d578543aSAxel Dörfler
16d578543aSAxel Dörfler
17d578543aSAxel Dörflerconst char*
18d578543aSAxel Dörflermask(uint32 set)
19d578543aSAxel Dörfler{
20d578543aSAxel Dörfler	static char text[64];
21d578543aSAxel Dörfler	uint32 i = 0;
22d578543aSAxel Dörfler	for (int32 number = 9; number > 0; number--) {
23d578543aSAxel Dörfler		text[i++] = set & (1UL << (number - 1)) ? number + '0' : '-';
24d578543aSAxel Dörfler	}
25d578543aSAxel Dörfler
26d578543aSAxel Dörfler	text[i] = '\0';
27d578543aSAxel Dörfler	return text;
28d578543aSAxel Dörfler}
29d578543aSAxel Dörfler
30d578543aSAxel Dörfler
31d578543aSAxel Dörfler//	#pragma mark -
32d578543aSAxel Dörfler
33d578543aSAxel Dörfler
34d578543aSAxel DörflerSudokuField::field::field()
35d578543aSAxel Dörfler	:
36d578543aSAxel Dörfler	hint_mask(0),
37d578543aSAxel Dörfler	valid_mask(~0),
38d578543aSAxel Dörfler	flags(0),
39d578543aSAxel Dörfler	value(0)
40d578543aSAxel Dörfler{
41d578543aSAxel Dörfler}
42d578543aSAxel Dörfler
43d578543aSAxel Dörfler
44d578543aSAxel Dörfler//	#pragma mark -
45d578543aSAxel Dörfler
46d578543aSAxel Dörfler
47d578543aSAxel DörflerSudokuField::SudokuField(uint32 size)
48d578543aSAxel Dörfler	:
49d578543aSAxel Dörfler	fSize(size * size),
50d578543aSAxel Dörfler	fBlockSize(size)
51d578543aSAxel Dörfler{
52d578543aSAxel Dörfler	fFields = new (std::nothrow) field[fSize * fSize];
53d578543aSAxel Dörfler	fMaxMask = (1UL << fSize) - 1;
54d578543aSAxel Dörfler}
55d578543aSAxel Dörfler
56d578543aSAxel Dörfler
57d578543aSAxel DörflerSudokuField::SudokuField(const BMessage* archive)
58d578543aSAxel Dörfler{
59d578543aSAxel Dörfler	if (archive->FindInt32("block size", (int32*)&fBlockSize) != B_OK)
60d578543aSAxel Dörfler		return;
61d578543aSAxel Dörfler
62d578543aSAxel Dörfler	fSize = fBlockSize * fBlockSize;
63d578543aSAxel Dörfler	fMaxMask = (1UL << fSize) - 1;
64d578543aSAxel Dörfler
65d578543aSAxel Dörfler	uint32 count = fSize * fSize;
66d578543aSAxel Dörfler	fFields = new (std::nothrow) field[count];
67d578543aSAxel Dörfler	if (fFields == NULL)
68d578543aSAxel Dörfler		return;
69d578543aSAxel Dörfler
70d578543aSAxel Dörfler	for (uint32 i = 0; i < count; i++) {
71d578543aSAxel Dörfler		struct field& field = fFields[i];
72d578543aSAxel Dörfler
73d578543aSAxel Dörfler		if (archive->FindInt32("value", i, (int32*)&field.value) != B_OK
74d578543aSAxel Dörfler			|| archive->FindInt32("valid mask", i,
75d578543aSAxel Dörfler					(int32*)&field.valid_mask) != B_OK
76d578543aSAxel Dörfler			|| archive->FindInt32("hint mask", i,
77d578543aSAxel Dörfler					(int32*)&field.hint_mask) != B_OK
78d578543aSAxel Dörfler			|| archive->FindInt32("flags", i, (int32*)&field.flags) != B_OK)
79d578543aSAxel Dörfler			break;
80d578543aSAxel Dörfler	}
81d578543aSAxel Dörfler}
82d578543aSAxel Dörfler
83d578543aSAxel Dörfler
84d578543aSAxel DörflerSudokuField::SudokuField(const SudokuField& other)
85d578543aSAxel Dörfler	: BArchivable(other)
86d578543aSAxel Dörfler{
87d578543aSAxel Dörfler	fSize = other.fSize;
88d578543aSAxel Dörfler	fBlockSize = other.fBlockSize;
89d578543aSAxel Dörfler	fMaxMask = other.fMaxMask;
90d578543aSAxel Dörfler
91d578543aSAxel Dörfler	fFields = new (std::nothrow) field[fSize * fSize];
92d578543aSAxel Dörfler	if (fFields != NULL)
93d578543aSAxel Dörfler		memcpy(fFields, other.fFields, sizeof(field) * fSize * fSize);
94d578543aSAxel Dörfler}
95d578543aSAxel Dörfler
96d578543aSAxel Dörfler
97d578543aSAxel DörflerSudokuField::~SudokuField()
98d578543aSAxel Dörfler{
99d578543aSAxel Dörfler	delete[] fFields;
100d578543aSAxel Dörfler}
101d578543aSAxel Dörfler
102d578543aSAxel Dörfler
103d578543aSAxel Dörflerstatus_t
104d578543aSAxel DörflerSudokuField::InitCheck()
105d578543aSAxel Dörfler{
106d578543aSAxel Dörfler	if (fBlockSize == 0)
107d578543aSAxel Dörfler		return B_BAD_VALUE;
108d578543aSAxel Dörfler	return fFields == NULL ? B_NO_MEMORY : B_OK;
109d578543aSAxel Dörfler}
110d578543aSAxel Dörfler
111d578543aSAxel Dörfler
112d578543aSAxel Dörflerstatus_t
113d578543aSAxel DörflerSudokuField::Archive(BMessage* archive, bool deep) const
114d578543aSAxel Dörfler{
115d578543aSAxel Dörfler	status_t status = BArchivable::Archive(archive, deep);
116d578543aSAxel Dörfler	if (status == B_OK)
117d578543aSAxel Dörfler		archive->AddInt32("block size", fBlockSize);
118d578543aSAxel Dörfler	if (status < B_OK)
119d578543aSAxel Dörfler		return status;
120d578543aSAxel Dörfler
121d578543aSAxel Dörfler	uint32 count = fSize * fSize;
122d578543aSAxel Dörfler	for (uint32 i = 0; i < count && status == B_OK; i++) {
123d578543aSAxel Dörfler		struct field& field = fFields[i];
124d578543aSAxel Dörfler		status = archive->AddInt32("value", field.value);
125d578543aSAxel Dörfler		if (status == B_OK)
126d578543aSAxel Dörfler			status = archive->AddInt32("valid mask", field.valid_mask);
127d578543aSAxel Dörfler		if (status == B_OK)
128d578543aSAxel Dörfler			status = archive->AddInt32("hint mask", field.hint_mask);
129d578543aSAxel Dörfler		if (status == B_OK)
130d578543aSAxel Dörfler			status = archive->AddInt32("flags", field.flags);
131d578543aSAxel Dörfler	}
132d578543aSAxel Dörfler
133d578543aSAxel Dörfler	return status;
134d578543aSAxel Dörfler}
135d578543aSAxel Dörfler
136d578543aSAxel Dörfler
137d578543aSAxel Dörfler/*static*/ SudokuField*
138d578543aSAxel DörflerSudokuField::Instantiate(BMessage* archive)
139d578543aSAxel Dörfler{
140d578543aSAxel Dörfler	if (!validate_instantiation(archive, "SudokuField"))
141d578543aSAxel Dörfler		return NULL;
142d578543aSAxel Dörfler
143d578543aSAxel Dörfler	return new SudokuField(archive);
144d578543aSAxel Dörfler}
145d578543aSAxel Dörfler
146d578543aSAxel Dörfler
147d578543aSAxel Dörflervoid
148d578543aSAxel DörflerSudokuField::Reset()
149d578543aSAxel Dörfler{
150d578543aSAxel Dörfler	for (uint32 y = 0; y < fSize; y++) {
151d578543aSAxel Dörfler		for (uint32 x = 0; x < fSize; x++) {
152d578543aSAxel Dörfler			struct field& field = _FieldAt(x, y);
153d578543aSAxel Dörfler			field.value = 0;
154d578543aSAxel Dörfler			field.flags = 0;
155d578543aSAxel Dörfler			field.hint_mask = 0;
156d578543aSAxel Dörfler			field.valid_mask = fMaxMask;
157d578543aSAxel Dörfler		}
158d578543aSAxel Dörfler	}
159d578543aSAxel Dörfler}
160d578543aSAxel Dörfler
161d578543aSAxel Dörfler
162d578543aSAxel Dörflerstatus_t
163d578543aSAxel DörflerSudokuField::SetTo(char base, const char* data)
164d578543aSAxel Dörfler{
165d578543aSAxel Dörfler	if (data != NULL && strlen(data) < fSize * fSize)
166d578543aSAxel Dörfler		return B_BAD_VALUE;
167d578543aSAxel Dörfler
168d578543aSAxel Dörfler	Reset();
169d578543aSAxel Dörfler
170d578543aSAxel Dörfler	if (data == NULL)
171d578543aSAxel Dörfler		return B_OK;
172d578543aSAxel Dörfler
173d578543aSAxel Dörfler	uint32 i = 0;
174d578543aSAxel Dörfler
175d578543aSAxel Dörfler	for (uint32 y = 0; y < fSize; y++) {
176d578543aSAxel Dörfler		for (uint32 x = 0; x < fSize; x++) {
177d578543aSAxel Dörfler			uint32 value = data[i++] - base;
178d578543aSAxel Dörfler			if (value) {
179d578543aSAxel Dörfler				struct field& field = _FieldAt(x, y);
180d578543aSAxel Dörfler				field.value = value;
181d578543aSAxel Dörfler				field.flags = kInitialValue;
182d578543aSAxel Dörfler			}
183d578543aSAxel Dörfler		}
184d578543aSAxel Dörfler	}
185d578543aSAxel Dörfler
186d578543aSAxel Dörfler	for (uint32 y = 0; y < fSize; y++) {
187d578543aSAxel Dörfler		for (uint32 x = 0; x < fSize; x++) {
188d578543aSAxel Dörfler			_ComputeValidMask(x, y, false);
189d578543aSAxel Dörfler		}
190d578543aSAxel Dörfler	}
191d578543aSAxel Dörfler
192d578543aSAxel Dörfler	return B_OK;
193d578543aSAxel Dörfler}
194d578543aSAxel Dörfler
195d578543aSAxel Dörfler
196d578543aSAxel Dörflervoid
197d578543aSAxel DörflerSudokuField::SetTo(const SudokuField* field)
198d578543aSAxel Dörfler{
199d578543aSAxel Dörfler	if (field == NULL) {
200d578543aSAxel Dörfler		Reset();
201d578543aSAxel Dörfler		return;
202d578543aSAxel Dörfler	}
203d578543aSAxel Dörfler
204d578543aSAxel Dörfler	for (uint32 y = 0; y < fSize; y++) {
205d578543aSAxel Dörfler		for (uint32 x = 0; x < fSize; x++) {
206d578543aSAxel Dörfler			_FieldAt(x, y) = field->_FieldAt(x, y);
207d578543aSAxel Dörfler		}
208d578543aSAxel Dörfler	}
209d578543aSAxel Dörfler}
210d578543aSAxel Dörfler
211d578543aSAxel Dörfler
212d578543aSAxel Dörflervoid
213d578543aSAxel DörflerSudokuField::Dump()
214d578543aSAxel Dörfler{
215d578543aSAxel Dörfler	for (uint32 y = 0; y < fSize; y++) {
216d578543aSAxel Dörfler		for (uint32 x = 0; x < fSize; x++) {
217d578543aSAxel Dörfler			if (x != 0 && x % fBlockSize == 0)
218d578543aSAxel Dörfler				putchar(' ');
219332cc6bcSAxel Dörfler			printf("%" B_PRIu32, ValueAt(x, y));
220d578543aSAxel Dörfler		}
221d578543aSAxel Dörfler		putchar('\n');
222d578543aSAxel Dörfler	}
223d578543aSAxel Dörfler}
224d578543aSAxel Dörfler
225d578543aSAxel Dörfler
226d578543aSAxel Dörflerbool
2272b9ec0a9SAxel DörflerSudokuField::IsSolved() const
228d578543aSAxel Dörfler{
229d578543aSAxel Dörfler	for (uint32 y = 0; y < fSize; y++) {
230d578543aSAxel Dörfler		for (uint32 x = 0; x < fSize; x++) {
231d578543aSAxel Dörfler			if (!_ValidValueAt(x, y))
232d578543aSAxel Dörfler				return false;
233d578543aSAxel Dörfler		}
234d578543aSAxel Dörfler	}
235d578543aSAxel Dörfler
236d578543aSAxel Dörfler	return true;
237d578543aSAxel Dörfler}
238d578543aSAxel Dörfler
239d578543aSAxel Dörfler
2402b9ec0a9SAxel Dörflerbool
2412b9ec0a9SAxel DörflerSudokuField::IsEmpty() const
2422b9ec0a9SAxel Dörfler{
2432b9ec0a9SAxel Dörfler	for (uint32 y = 0; y < fSize; y++) {
2442b9ec0a9SAxel Dörfler		for (uint32 x = 0; x < fSize; x++) {
2452b9ec0a9SAxel Dörfler			if (ValueAt(x, y) != 0)
2462b9ec0a9SAxel Dörfler				return false;
2472b9ec0a9SAxel Dörfler		}
2482b9ec0a9SAxel Dörfler	}
2492b9ec0a9SAxel Dörfler
2502b9ec0a9SAxel Dörfler	return true;
2512b9ec0a9SAxel Dörfler}
2522b9ec0a9SAxel Dörfler
2532b9ec0a9SAxel Dörfler
254d6e44c9cSAxel Dörflerbool
255d6e44c9cSAxel DörflerSudokuField::IsValueCompleted(uint32 value) const
256d6e44c9cSAxel Dörfler{
257d6e44c9cSAxel Dörfler	uint32 count = 0;
258d6e44c9cSAxel Dörfler	for (uint32 y = 0; y < fSize; y++) {
259d6e44c9cSAxel Dörfler		for (uint32 x = 0; x < fSize; x++) {
260d6e44c9cSAxel Dörfler			if (ValueAt(x, y) == value)
261d6e44c9cSAxel Dörfler				count++;
262d6e44c9cSAxel Dörfler		}
263d6e44c9cSAxel Dörfler	}
264d6e44c9cSAxel Dörfler
265d6e44c9cSAxel Dörfler	return count == Size();
266d6e44c9cSAxel Dörfler}
267d6e44c9cSAxel Dörfler
268d6e44c9cSAxel Dörfler
269d578543aSAxel Dörflervoid
270d578543aSAxel DörflerSudokuField::SetHintMaskAt(uint32 x, uint32 y, uint32 hintMask)
271d578543aSAxel Dörfler{
272d578543aSAxel Dörfler	_FieldAt(x, y).hint_mask = hintMask;
273d578543aSAxel Dörfler}
274d578543aSAxel Dörfler
275d578543aSAxel Dörfler
276d578543aSAxel Dörfleruint32
277d578543aSAxel DörflerSudokuField::HintMaskAt(uint32 x, uint32 y) const
278d578543aSAxel Dörfler{
279d578543aSAxel Dörfler	return _FieldAt(x, y).hint_mask;
280d578543aSAxel Dörfler}
281d578543aSAxel Dörfler
282d578543aSAxel Dörfler
2830ba36860SAxel Dörflerbool
2840ba36860SAxel DörflerSudokuField::HasHint(uint32 x, uint32 y, uint32 value) const
2850ba36860SAxel Dörfler{
2860ba36860SAxel Dörfler	return (_FieldAt(x, y).hint_mask & (1UL << (value - 1))) != 0;
2870ba36860SAxel Dörfler}
2880ba36860SAxel Dörfler
2890ba36860SAxel Dörfler
290d578543aSAxel Dörflervoid
291d578543aSAxel DörflerSudokuField::SetValidMaskAt(uint32 x, uint32 y, uint32 validMask)
292d578543aSAxel Dörfler{
293d578543aSAxel Dörfler	_FieldAt(x, y).valid_mask = validMask & fMaxMask;
294d578543aSAxel Dörfler}
295d578543aSAxel Dörfler
296d578543aSAxel Dörfler
297d578543aSAxel Dörfleruint32
298d578543aSAxel DörflerSudokuField::ValidMaskAt(uint32 x, uint32 y) const
299d578543aSAxel Dörfler{
300d578543aSAxel Dörfler	return _FieldAt(x, y).valid_mask;
301d578543aSAxel Dörfler}
302d578543aSAxel Dörfler
303d578543aSAxel Dörfler
3040ba36860SAxel Dörflerbool
3050ba36860SAxel DörflerSudokuField::IsValid(uint32 x, uint32 y, uint32 value) const
3060ba36860SAxel Dörfler{
3070ba36860SAxel Dörfler	return (_FieldAt(x, y).valid_mask & (1UL << (value - 1))) != 0;
3080ba36860SAxel Dörfler}
3090ba36860SAxel Dörfler
3100ba36860SAxel Dörfler
311d578543aSAxel Dörflervoid
312d578543aSAxel DörflerSudokuField::SetFlagsAt(uint32 x, uint32 y, uint32 flags)
313d578543aSAxel Dörfler{
314d578543aSAxel Dörfler	_FieldAt(x, y).flags = flags;
315d578543aSAxel Dörfler}
316d578543aSAxel Dörfler
317d578543aSAxel Dörfler
318d578543aSAxel Dörfleruint32
319d578543aSAxel DörflerSudokuField::FlagsAt(uint32 x, uint32 y) const
320d578543aSAxel Dörfler{
321d578543aSAxel Dörfler	return _FieldAt(x, y).flags;
322d578543aSAxel Dörfler}
323d578543aSAxel Dörfler
324d578543aSAxel Dörfler
3250ba36860SAxel Dörflerbool
3260ba36860SAxel DörflerSudokuField::IsInitialValue(uint32 x, uint32 y) const
3270ba36860SAxel Dörfler{
3280ba36860SAxel Dörfler	return (_FieldAt(x, y).flags & kInitialValue) != 0;
3290ba36860SAxel Dörfler}
3300ba36860SAxel Dörfler
3310ba36860SAxel Dörfler
332d578543aSAxel Dörflervoid
333d578543aSAxel DörflerSudokuField::SetValueAt(uint32 x, uint32 y, uint32 value, bool setSolved)
334d578543aSAxel Dörfler{
335d578543aSAxel Dörfler	_FieldAt(x, y).value = value;
336d578543aSAxel Dörfler	_FieldAt(x, y).hint_mask = 0;
337d578543aSAxel Dörfler	_UpdateValidMaskChanged(x, y, setSolved);
338d578543aSAxel Dörfler}
339d578543aSAxel Dörfler
340d578543aSAxel Dörfler
341d578543aSAxel Dörfleruint32
342d578543aSAxel DörflerSudokuField::ValueAt(uint32 x, uint32 y) const
343d578543aSAxel Dörfler{
344d578543aSAxel Dörfler	return _FieldAt(x, y).value;
345d578543aSAxel Dörfler}
346d578543aSAxel Dörfler
347d578543aSAxel Dörfler
348d578543aSAxel Dörflerbool
349d578543aSAxel DörflerSudokuField::_ValidValueAt(uint32 x, uint32 y) const
350d578543aSAxel Dörfler{
351d578543aSAxel Dörfler	uint32 value = _FieldAt(x, y).value;
352d578543aSAxel Dörfler	if (!value)
353d578543aSAxel Dörfler		return false;
354d578543aSAxel Dörfler
355d578543aSAxel Dörfler	value = 1UL << (value - 1);
356d578543aSAxel Dörfler	return (_FieldAt(x, y).valid_mask & value) != 0;
357d578543aSAxel Dörfler}
358d578543aSAxel Dörfler
359d578543aSAxel Dörfler
360d578543aSAxel Dörflervoid
361d578543aSAxel DörflerSudokuField::_ComputeValidMask(uint32 x, uint32 y, bool setSolved)
362d578543aSAxel Dörfler{
363d578543aSAxel Dörfler	if (ValueAt(x, y))
364d578543aSAxel Dörfler		return;
365d578543aSAxel Dörfler
366d578543aSAxel Dörfler	// check row
367d578543aSAxel Dörfler
368d578543aSAxel Dörfler	uint32 foundMask = 0;
369d578543aSAxel Dörfler	for (uint32 i = 0; i < fSize; i++) {
370d578543aSAxel Dörfler		uint32 value = ValueAt(i, y);
371d578543aSAxel Dörfler		if (value && _ValidValueAt(i, y))
372d578543aSAxel Dörfler			foundMask |= 1UL << (value - 1);
373d578543aSAxel Dörfler	}
374d578543aSAxel Dörfler
375d578543aSAxel Dörfler	// check column
376d578543aSAxel Dörfler
377d578543aSAxel Dörfler	for (uint32 i = 0; i < fSize; i++) {
378d578543aSAxel Dörfler		uint32 value = ValueAt(x, i);
379d578543aSAxel Dörfler		if (value && _ValidValueAt(x, i))
380d578543aSAxel Dörfler			foundMask |= 1UL << (value - 1);
381d578543aSAxel Dörfler	}
382d578543aSAxel Dörfler
383d578543aSAxel Dörfler	// check block
384d578543aSAxel Dörfler
385d578543aSAxel Dörfler	uint32 offsetX = x / fBlockSize * fBlockSize;
386d578543aSAxel Dörfler	uint32 offsetY = y / fBlockSize * fBlockSize;
387d578543aSAxel Dörfler
388d578543aSAxel Dörfler	for (uint32 partY = 0; partY < fBlockSize; partY++) {
389d578543aSAxel Dörfler		for (uint32 partX = 0; partX < fBlockSize; partX++) {
390d578543aSAxel Dörfler			uint32 value = ValueAt(partX + offsetX, partY + offsetY);
391d578543aSAxel Dörfler			if (value && _ValidValueAt(partX + offsetX, partY + offsetY))
392d578543aSAxel Dörfler				foundMask |= 1UL << (value - 1);
393d578543aSAxel Dörfler		}
394d578543aSAxel Dörfler	}
395d578543aSAxel Dörfler
396d578543aSAxel Dörfler	SetValidMaskAt(x, y, ~foundMask);
397d578543aSAxel Dörfler
398d578543aSAxel Dörfler	if (setSolved) {
399d578543aSAxel Dörfler		// find the one set bit, if not more
400d578543aSAxel Dörfler		uint32 value = 0;
401d578543aSAxel Dörfler		for (uint32 i = 0; i < fSize; i++) {
402d578543aSAxel Dörfler			if ((foundMask & (1UL << i)) == 0) {
403d578543aSAxel Dörfler				if (value != 0) {
404d578543aSAxel Dörfler					value = 0;
405d578543aSAxel Dörfler					break;
406d578543aSAxel Dörfler				}
407d578543aSAxel Dörfler
408d578543aSAxel Dörfler				value = i + 1;
409d578543aSAxel Dörfler			}
410d578543aSAxel Dörfler		}
411d578543aSAxel Dörfler		if (value != 0)
412d578543aSAxel Dörfler			SetValueAt(x, y, value, true);
413d578543aSAxel Dörfler	}
414d578543aSAxel Dörfler}
415d578543aSAxel Dörfler
416d578543aSAxel Dörfler
417d578543aSAxel Dörflervoid
418d578543aSAxel DörflerSudokuField::_UpdateValidMaskChanged(uint32 x, uint32 y, bool setSolved)
419d578543aSAxel Dörfler{
420d578543aSAxel Dörfler	// update row
421d578543aSAxel Dörfler
422d578543aSAxel Dörfler	for (uint32 i = 0; i < fSize; i++) {
423d578543aSAxel Dörfler		_ComputeValidMask(i, y, setSolved);
424d578543aSAxel Dörfler	}
425d578543aSAxel Dörfler
426d578543aSAxel Dörfler	// update column
427d578543aSAxel Dörfler
428d578543aSAxel Dörfler	for (uint32 i = 0; i < fSize; i++) {
429d578543aSAxel Dörfler		if (i == y)
430d578543aSAxel Dörfler			continue;
431d578543aSAxel Dörfler
432d578543aSAxel Dörfler		_ComputeValidMask(x, i, setSolved);
433d578543aSAxel Dörfler	}
434d578543aSAxel Dörfler
435d578543aSAxel Dörfler	// update block
436d578543aSAxel Dörfler
437d578543aSAxel Dörfler	uint32 offsetX = x / fBlockSize * fBlockSize;
438d578543aSAxel Dörfler	uint32 offsetY = y / fBlockSize * fBlockSize;
439d578543aSAxel Dörfler
440