Skip to content

Commit

Permalink
Merge pull request #1781 from axpoems/refactor-cathash
Browse files Browse the repository at this point in the history
Refactor Cathash encoding
  • Loading branch information
alvasw authored Mar 13, 2024
2 parents a7b2e4d + d228125 commit ea07c85
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 48 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,7 @@
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Optional;

@Slf4j
public class BucketConfig {
Expand All @@ -39,8 +38,6 @@ public class BucketConfig {
private static final Bucket EYES = new Bucket(16, 7);
private static final Bucket NOSE = new Bucket(6, 8);
private static final Bucket WHISKERS = new Bucket(7, 9);

// Shape picker
private static final Bucket BODY_SHAPE = new Bucket(2, 10);
private static final Bucket CHEST_SHAPE = new Bucket(2, 11);
private static final Bucket EARS_SHAPE = new Bucket(2, 12);
Expand All @@ -63,31 +60,24 @@ public class BucketConfig {
FACE_SHAPE.getCount()
};

private static final Map<String, PathTemplateEncoding> PATH_TEMPLATES_WITH_ENCODING;
private static final PathDetails[] PATH_TEMPLATES;

static {
String postFix = ".png";
PATH_TEMPLATES_WITH_ENCODING = new LinkedHashMap<>();

PATH_TEMPLATES_WITH_ENCODING.put("bg/bg_0/" + DIGIT + postFix, new PathTemplateEncoding(BG.getIdx()));
PATH_TEMPLATES_WITH_ENCODING.put("bg/bg_1/" + DIGIT + postFix, new PathTemplateEncoding(BG_OVERLAY.getIdx()));
PATH_TEMPLATES_WITH_ENCODING.put("body/body" + SHAPE_NUMBER + "/" + DIGIT + postFix,
new PathTemplateEncoding(BODY_AND_FACE.getIdx(), BODY_SHAPE.getIdx()));
PATH_TEMPLATES_WITH_ENCODING.put("chest/chest" + SHAPE_NUMBER + "_0/" + DIGIT + postFix,
new PathTemplateEncoding(CHEST_AND_EARS.getIdx(), CHEST_SHAPE.getIdx()));
PATH_TEMPLATES_WITH_ENCODING.put("chest/chest" + SHAPE_NUMBER + "_1/" + DIGIT + postFix,
new PathTemplateEncoding(CHEST_OVERLAY.getIdx(), CHEST_SHAPE.getIdx()));
PATH_TEMPLATES_WITH_ENCODING.put("ears/ears" + SHAPE_NUMBER + "_0/" + DIGIT + postFix,
new PathTemplateEncoding(CHEST_AND_EARS.getIdx(), EARS_SHAPE.getIdx()));
PATH_TEMPLATES_WITH_ENCODING.put("ears/ears" + SHAPE_NUMBER + "_1/" + DIGIT + postFix,
new PathTemplateEncoding(EARS_OVERLAY.getIdx(), EARS_SHAPE.getIdx()));
PATH_TEMPLATES_WITH_ENCODING.put("face/face" + SHAPE_NUMBER + "_0/" + DIGIT + postFix,
new PathTemplateEncoding(BODY_AND_FACE.getIdx(), FACE_SHAPE.getIdx()));
PATH_TEMPLATES_WITH_ENCODING.put("face/face" + SHAPE_NUMBER + "_1/" + DIGIT + postFix,
new PathTemplateEncoding(FACE_OVERLAY.getIdx(), FACE_SHAPE.getIdx()));
PATH_TEMPLATES_WITH_ENCODING.put("eyes/" + DIGIT + postFix, new PathTemplateEncoding(EYES.getIdx()));
PATH_TEMPLATES_WITH_ENCODING.put("nose/" + DIGIT + postFix, new PathTemplateEncoding(NOSE.getIdx()));
PATH_TEMPLATES_WITH_ENCODING.put("whiskers/" + DIGIT + postFix, new PathTemplateEncoding(WHISKERS.getIdx()));
PATH_TEMPLATES = new PathDetails[]{
new PathDetails("bg/bg_0/" + DIGIT + postFix, BG.getIdx()),
new PathDetails("bg/bg_1/" + DIGIT + postFix, BG_OVERLAY.getIdx()),
new PathDetails("body/body" + SHAPE_NUMBER + "/" + DIGIT + postFix, BODY_AND_FACE.getIdx(), BODY_SHAPE.getIdx()),
new PathDetails("chest/chest" + SHAPE_NUMBER + "_0/" + DIGIT + postFix, CHEST_AND_EARS.getIdx(), CHEST_SHAPE.getIdx()),
new PathDetails("chest/chest" + SHAPE_NUMBER + "_1/" + DIGIT + postFix, CHEST_OVERLAY.getIdx(), CHEST_SHAPE.getIdx()),
new PathDetails("ears/ears" + SHAPE_NUMBER + "_0/" + DIGIT + postFix, CHEST_AND_EARS.getIdx(), EARS_SHAPE.getIdx()),
new PathDetails("ears/ears" + SHAPE_NUMBER + "_1/" + DIGIT + postFix, EARS_OVERLAY.getIdx(), EARS_SHAPE.getIdx()),
new PathDetails("face/face" + SHAPE_NUMBER + "_0/" + DIGIT + postFix, BODY_AND_FACE.getIdx(), FACE_SHAPE.getIdx()),
new PathDetails("face/face" + SHAPE_NUMBER + "_1/" + DIGIT + postFix, FACE_OVERLAY.getIdx(), FACE_SHAPE.getIdx()),
new PathDetails("eyes/" + DIGIT + postFix, EYES.getIdx()),
new PathDetails("nose/" + DIGIT + postFix, NOSE.getIdx()),
new PathDetails("whiskers/" + DIGIT + postFix, WHISKERS.getIdx())
};

long numCombinations = getNumCombinations();
log.info("Number of combinations: 2^{} = {}", MathUtils.getLog2(numCombinations), numCombinations);
Expand All @@ -97,8 +87,8 @@ static int[] getBucketSizes() {
return BUCKET_SIZES;
}

static Map<String, PathTemplateEncoding> getPathTemplatesWithEncoding() {
return PATH_TEMPLATES_WITH_ENCODING;
static PathDetails[] getPathTemplates() {
return PATH_TEMPLATES;
}

static long getNumCombinations() {
Expand All @@ -121,17 +111,19 @@ public Bucket(int count, int idx) {
}

@Getter
static class PathTemplateEncoding {
Integer itemIdx;
Integer shapeIdx;
static class PathDetails {
String path;
int itemIdx;
Optional<Integer> shapeIdx;

public PathTemplateEncoding(Integer itemIdx) {
this(itemIdx, null);
public PathDetails(String path, Integer itemIdx) {
this(path, itemIdx, null);
}

public PathTemplateEncoding(Integer itemIdx, Integer shapeIdx) {
public PathDetails(String path, Integer itemIdx, Integer shapeIdx) {
this.path = path;
this.itemIdx = itemIdx;
this.shapeIdx = shapeIdx;
this.shapeIdx = Optional.ofNullable(shapeIdx);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,7 @@
package bisq.desktop.components.cathash;

import java.math.BigInteger;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.Optional;

public class BucketEncoder {
/**
Expand All @@ -40,16 +39,15 @@ static int[] encode(BigInteger input, int[] bucketSizes) {
return result;
}

static String[] toPaths(int[] buckets, Map<String, BucketConfig.PathTemplateEncoding> pathTemplatesWithEncoding) {
String[] paths = new String[pathTemplatesWithEncoding.size()];
AtomicInteger idx = new AtomicInteger(0);
pathTemplatesWithEncoding.forEach((path, encoding) -> {
Integer shapeNumber = encoding.shapeIdx != null ? buckets[encoding.shapeIdx] : null;
int itemNumber = buckets[encoding.itemIdx];
paths[idx.getAndIncrement()] = shapeNumber != null
? generatePath(path, shapeNumber, itemNumber)
: generatePath(path, itemNumber);
});
static String[] toPaths(int[] buckets, BucketConfig.PathDetails[] pathTemplates) {
String[] paths = new String[pathTemplates.length];
for (int i = 0; i < paths.length; ++i) {
String path = pathTemplates[i].getPath();
Optional<Integer> shapeIdx = pathTemplates[i].getShapeIdx();
int itemIdx = pathTemplates[i].getItemIdx();
paths[i] = shapeIdx.map(idx -> generatePath(path, buckets[idx], buckets[itemIdx]))
.orElseGet(() -> generatePath(path, buckets[itemIdx]));
}
return paths;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public static Image getImage(byte[] pubKeyHash, byte[] powSolution, boolean useC
}

int[] buckets = BucketEncoder.encode(input, BucketConfig.getBucketSizes());
String[] paths = BucketEncoder.toPaths(buckets, BucketConfig.getPathTemplatesWithEncoding());
String[] paths = BucketEncoder.toPaths(buckets, BucketConfig.getPathTemplates());
Image image = ImageUtil.composeImage(paths, SIZE, SIZE);
if (useCache && CACHE.size() < MAX_CACHE_SIZE) {
CACHE.put(input, image);
Expand Down

0 comments on commit ea07c85

Please sign in to comment.