Skip to content

Commit feeb650

Browse files
sfreilichcopybara-github
authored andcommitted
Internal change only
PiperOrigin-RevId: 731351972
1 parent d687836 commit feeb650

16 files changed

+489
-177
lines changed

ink/brush/brush_paint.cc

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -225,12 +225,7 @@ absl::Status ValidateBrushPaintTextureLayer(
225225
return absl::OkStatus();
226226
}
227227

228-
absl::Status ValidateBrushPaint(const BrushPaint& paint) {
229-
for (const BrushPaint::TextureLayer& layer : paint.texture_layers) {
230-
if (auto status = ValidateBrushPaintTextureLayer(layer); !status.ok()) {
231-
return status;
232-
}
233-
}
228+
absl::Status ValidateBrushPaintTopLevel(const BrushPaint& paint) {
234229
if (!paint.texture_layers.empty()) {
235230
int first_animation_frames = paint.texture_layers[0].animation_frames;
236231
BrushPaint::TextureMapping first_mapping = paint.texture_layers[0].mapping;
@@ -254,6 +249,19 @@ absl::Status ValidateBrushPaint(const BrushPaint& paint) {
254249
return absl::OkStatus();
255250
}
256251

252+
absl::Status ValidateBrushPaint(const BrushPaint& paint) {
253+
for (const BrushPaint::TextureLayer& layer : paint.texture_layers) {
254+
if (absl::Status status = ValidateBrushPaintTextureLayer(layer);
255+
!status.ok()) {
256+
return status;
257+
}
258+
}
259+
if (absl::Status status = ValidateBrushPaintTopLevel(paint); !status.ok()) {
260+
return status;
261+
}
262+
return absl::OkStatus();
263+
}
264+
257265
std::string ToFormattedString(BrushPaint::TextureMapping texture_mapping) {
258266
switch (texture_mapping) {
259267
case BrushPaint::TextureMapping::kTiling:

ink/brush/brush_paint.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,9 @@ namespace brush_internal {
291291
// Determines whether the given `BrushPaint` struct is valid to be used in a
292292
// `BrushFamily`, and returns an error if not.
293293
absl::Status ValidateBrushPaint(const BrushPaint& paint);
294+
// Determines whether the given `BrushPaint` struct is valid to be used in a
295+
// `BrushFamily` assuming that the `BrushPaint::TextureLayer`s are valid.
296+
absl::Status ValidateBrushPaintTopLevel(const BrushPaint& paint);
294297
// Determines whether the given `BrushPaint::TextureLayer` struct is valid to be
295298
// used in a `BrushPaint`, and returns an error if not.
296299
absl::Status ValidateBrushPaintTextureLayer(

ink/brush/internal/jni/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ cc_library(
6363
srcs = ["brush_tip_jni.cc"],
6464
deps = [
6565
":brush_behavior_jni",
66+
":brush_jni_helper",
6667
"//ink/brush",
6768
"//ink/brush:brush_behavior",
6869
"//ink/brush:brush_tip",

ink/brush/internal/jni/brush_coat_jni.cc

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,37 +24,65 @@
2424
#include "ink/brush/internal/jni/brush_jni_helper.h"
2525
#include "ink/jni/internal/jni_defines.h"
2626

27+
namespace {
28+
29+
using ::ink::BrushCoat;
30+
using ::ink::BrushPaint;
31+
using ::ink::BrushTip;
32+
using ::ink::jni::CastToBrushCoat;
33+
using ::ink::jni::CastToBrushPaint;
34+
using ::ink::jni::CastToBrushTip;
35+
36+
} // namespace
37+
2738
extern "C" {
2839

2940
// Construct a native BrushCoat and return a pointer to it as a long.
30-
JNI_METHOD(brush, BrushCoat, jlong, nativeCreateBrushCoat)
41+
JNI_METHOD(brush, BrushCoatNative, jlong, create)
3142
(JNIEnv* env, jobject thiz, jlongArray tip_native_pointer_array,
3243
jlong paint_native_pointer) {
33-
std::vector<ink::BrushTip> tips;
44+
std::vector<BrushTip> tips;
3445
const jsize num_tips = env->GetArrayLength(tip_native_pointer_array);
3546
tips.reserve(num_tips);
3647
jlong* tip_pointers =
3748
env->GetLongArrayElements(tip_native_pointer_array, nullptr);
3849
ABSL_CHECK(tip_pointers != nullptr);
3950
for (jsize i = 0; i < num_tips; ++i) {
40-
tips.push_back(ink::CastToBrushTip(tip_pointers[i]));
51+
tips.push_back(CastToBrushTip(tip_pointers[i]));
4152
}
4253
env->ReleaseLongArrayElements(
4354
tip_native_pointer_array, tip_pointers,
4455
// No need to copy back the array, which is not modified.
4556
JNI_ABORT);
4657

47-
const ink::BrushPaint& paint = ink::CastToBrushPaint(paint_native_pointer);
58+
const BrushPaint& paint = CastToBrushPaint(paint_native_pointer);
4859

49-
return reinterpret_cast<jlong>(new ink::BrushCoat{
60+
return reinterpret_cast<jlong>(new BrushCoat{
5061
.tips = std::move(tips),
5162
.paint = paint,
5263
});
5364
}
5465

55-
JNI_METHOD(brush, BrushCoat, void, nativeFreeBrushCoat)
66+
JNI_METHOD(brush, BrushCoatNative, void, free)
67+
(JNIEnv* env, jobject thiz, jlong native_pointer) {
68+
delete reinterpret_cast<BrushCoat*>(native_pointer);
69+
}
70+
71+
JNI_METHOD(brush, BrushCoatNative, jint, getBrushTipCount)
72+
(JNIEnv* env, jobject thiz, jlong native_pointer) {
73+
return CastToBrushCoat(native_pointer).tips.size();
74+
}
75+
76+
JNI_METHOD(brush, BrushCoatNative, jlong, newCopyOfBrushTip)
77+
(JNIEnv* env, jobject thiz, jlong native_pointer, jint tip_index) {
78+
const BrushCoat& coat = CastToBrushCoat(native_pointer);
79+
return reinterpret_cast<jlong>(new BrushTip(coat.tips[tip_index]));
80+
}
81+
82+
JNI_METHOD(brush, BrushCoatNative, jlong, newCopyOfBrushPaint)
5683
(JNIEnv* env, jobject thiz, jlong native_pointer) {
57-
delete reinterpret_cast<ink::BrushCoat*>(native_pointer);
84+
const BrushCoat& coat = CastToBrushCoat(native_pointer);
85+
return reinterpret_cast<jlong>(new BrushPaint(coat.paint));
5886
}
5987

6088
} // extern "C"

ink/brush/internal/jni/brush_family_jni.cc

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ namespace {
3232

3333
using ::ink::BrushCoat;
3434
using ::ink::BrushFamily;
35-
using ::ink::CastToBrushCoat;
36-
using ::ink::CastToBrushFamily;
35+
using ::ink::jni::CastToBrushCoat;
36+
using ::ink::jni::CastToBrushFamily;
3737
using ::ink::jni::JStringView;
3838
using ::ink::jni::ThrowExceptionFromStatus;
3939

@@ -94,4 +94,16 @@ JNI_METHOD(brush, BrushFamilyNative, jboolean, usesSpringModelV2)
9494
brush_family.GetInputModel());
9595
}
9696

97+
JNI_METHOD(brush, BrushFamilyNative, jlong, getBrushCoatCount)
98+
(JNIEnv* env, jobject object, jlong native_pointer) {
99+
const BrushFamily& brush_family = CastToBrushFamily(native_pointer);
100+
return brush_family.GetCoats().size();
101+
}
102+
103+
JNI_METHOD(brush, BrushFamilyNative, jlong, newCopyOfBrushCoat)
104+
(JNIEnv* env, jobject object, jlong native_pointer, jint index) {
105+
const BrushFamily& brush_family = CastToBrushFamily(native_pointer);
106+
return reinterpret_cast<jlong>(new BrushCoat(brush_family.GetCoats()[index]));
107+
}
108+
97109
} // extern "C"

ink/brush/internal/jni/brush_jni.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2024 Google LLC
1+
// Copyright 2024-2025 Google LLC
22
//
33
// Licensed under the Apache License, Version 2.0 (the "License");
44
// you may not use this file except in compliance with the License.
@@ -30,11 +30,11 @@ namespace {
3030

3131
using ::ink::Brush;
3232
using ::ink::BrushFamily;
33-
using ::ink::CastToBrush;
34-
using ::ink::CastToBrushFamily;
3533
using ::ink::Color;
3634
using ::ink::ColorSpace;
3735
using ::ink::Color::Format::kGammaEncoded;
36+
using ::ink::jni::CastToBrush;
37+
using ::ink::jni::CastToBrushFamily;
3838
using ::ink::jni::ColorSpaceIsSupportedInJetpack;
3939
using ::ink::jni::ColorSpaceToJInt;
4040
using ::ink::jni::JIntToColorSpace;
Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2024 Google LLC
1+
// Copyright 2024-2025 Google LLC
22
//
33
// Licensed under the Apache License, Version 2.0 (the "License");
44
// you may not use this file except in compliance with the License.
@@ -17,56 +17,62 @@
1717

1818
#include <jni.h>
1919

20-
#include <string>
21-
2220
#include "ink/brush/brush.h"
2321
#include "ink/brush/brush_behavior.h"
2422
#include "ink/brush/brush_coat.h"
2523
#include "ink/brush/brush_family.h"
2624
#include "ink/brush/brush_paint.h"
2725
#include "ink/brush/brush_tip.h"
2826

29-
namespace ink {
27+
namespace ink::jni {
3028

3129
// Casts a Kotlin Brush.nativePointer to a C++ Brush. The returned
32-
// Brush is a const ref as the kotlin Brush is immutable.
33-
inline const ink::Brush& CastToBrush(jlong brush_native_pointer) {
34-
return *reinterpret_cast<ink::Brush*>(brush_native_pointer);
30+
// Brush is a const ref as the Kotlin Brush is immutable.
31+
inline const Brush& CastToBrush(jlong brush_native_pointer) {
32+
return *reinterpret_cast<Brush*>(brush_native_pointer);
3533
}
3634

3735
// Casts a Kotlin BrushFamily.nativePointer to a C++ BrushFamily. The returned
38-
// BrushFamily is a const ref as the kotlin BrushFamily is immutable.
39-
inline const ink::BrushFamily& CastToBrushFamily(
40-
jlong brush_family_native_pointer) {
41-
return *reinterpret_cast<ink::BrushFamily*>(brush_family_native_pointer);
36+
// BrushFamily is a const ref as the Kotlin BrushFamily is immutable.
37+
inline const BrushFamily& CastToBrushFamily(jlong brush_family_native_pointer) {
38+
return *reinterpret_cast<BrushFamily*>(brush_family_native_pointer);
4239
}
4340

4441
// Casts a Kotlin BrushCoat.nativePointer to a C++ BrushCoat. The returned
45-
// BrushCoat is a const ref as the kotlin BrushCoat is immutable.
46-
inline const ink::BrushCoat& CastToBrushCoat(jlong brush_coat_native_pointer) {
47-
return *reinterpret_cast<ink::BrushCoat*>(brush_coat_native_pointer);
42+
// BrushCoat is a const ref as the Kotlin BrushCoat is immutable.
43+
inline const BrushCoat& CastToBrushCoat(jlong brush_coat_native_pointer) {
44+
return *reinterpret_cast<BrushCoat*>(brush_coat_native_pointer);
4845
}
4946

5047
// Casts a Kotlin BrushPaint.nativePointer to a C++ BrushPaint. The returned
51-
// BrushPaint is a const ref as the kotlin BrushPaint is immutable.
52-
inline const ink::BrushPaint& CastToBrushPaint(
53-
jlong brush_paint_native_pointer) {
54-
return *reinterpret_cast<ink::BrushPaint*>(brush_paint_native_pointer);
48+
// BrushPaint is a const ref as the Kotlin BrushPaint is immutable.
49+
inline const BrushPaint& CastToBrushPaint(jlong brush_paint_native_pointer) {
50+
return *reinterpret_cast<BrushPaint*>(brush_paint_native_pointer);
51+
}
52+
53+
// Casts a Kotlin BrushBehavior.nativePointer to a C++ BrushPaint::TextureLayer.
54+
// The returned TextureLayer is a const ref as the Kotlin BrushPaint is
55+
// immutable.
56+
inline const BrushPaint::TextureLayer& CastToTextureLayer(
57+
jlong texture_layer_native_pointer) {
58+
return *reinterpret_cast<BrushPaint::TextureLayer*>(
59+
texture_layer_native_pointer);
5560
}
5661

5762
// Casts a Kotlin BrushTip.nativePointer to a C++ BrushTip. The returned
58-
// BrushTip is a const ref as the kotlin BrushTip is immutable.
59-
inline const ink::BrushTip& CastToBrushTip(jlong brush_tip_native_pointer) {
60-
return *reinterpret_cast<ink::BrushTip*>(brush_tip_native_pointer);
63+
// BrushTip is a const ref as the Kotlin BrushTip is immutable.
64+
inline const BrushTip& CastToBrushTip(jlong brush_tip_native_pointer) {
65+
return *reinterpret_cast<BrushTip*>(brush_tip_native_pointer);
6166
}
6267

6368
// Casts a Kotlin BrushBehavior.nativePointer to a C++ BrushBehavior. The
64-
// returned BrushBehavior is a const ref as the kotlin BrushBehavior is
69+
// returned BrushBehavior is a const ref as the Kotlin BrushBehavior is
6570
// immutable.
66-
inline const ink::BrushBehavior& CastToBrushBehavior(
71+
inline const BrushBehavior& CastToBrushBehavior(
6772
jlong brush_behavior_native_pointer) {
68-
return *reinterpret_cast<ink::BrushBehavior*>(brush_behavior_native_pointer);
73+
return *reinterpret_cast<BrushBehavior*>(brush_behavior_native_pointer);
6974
}
7075

71-
} // namespace ink
76+
} // namespace ink::jni
77+
7278
#endif // INK_STROKES_BRUSH_INTERNAL_JNI_BRUSH_JNI_HELPER_H_

0 commit comments

Comments
 (0)