Merge
Reviewed-by: djelinski, dholmes
This commit is contained in:
commit
d90c20c0c7
src
hotspot/share
c1
classfile
oops
opto
utilities
java.desktop/share
classes/sun/java2d
native/libawt/java2d
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -483,14 +483,14 @@ void RangeCheckEliminator::in_block_motion(BlockBegin *block, AccessIndexedList
|
||||
|
||||
if (c) {
|
||||
jint value = c->type()->as_IntConstant()->value();
|
||||
if (value != min_jint) {
|
||||
if (ao->op() == Bytecodes::_isub) {
|
||||
value = -value;
|
||||
}
|
||||
if (ao->op() == Bytecodes::_iadd) {
|
||||
base = java_add(base, value);
|
||||
last_integer = base;
|
||||
last_instruction = other;
|
||||
} else {
|
||||
assert(ao->op() == Bytecodes::_isub, "unexpected bytecode");
|
||||
base = java_subtract(base, value);
|
||||
}
|
||||
last_integer = base;
|
||||
last_instruction = other;
|
||||
index = other;
|
||||
} else {
|
||||
break;
|
||||
|
@ -344,8 +344,23 @@ Symbol* SymbolTable::lookup_common(const char* name,
|
||||
return sym;
|
||||
}
|
||||
|
||||
// Symbols should represent entities from the constant pool that are
|
||||
// limited to <64K in length, but usage errors creep in allowing Symbols
|
||||
// to be used for arbitrary strings. For debug builds we will assert if
|
||||
// a string is too long, whereas product builds will truncate it.
|
||||
static int check_length(const char* name, int len) {
|
||||
assert(len <= Symbol::max_length(),
|
||||
"String length %d exceeds the maximum Symbol length of %d", len, Symbol::max_length());
|
||||
if (len > Symbol::max_length()) {
|
||||
warning("A string \"%.80s ... %.80s\" exceeds the maximum Symbol "
|
||||
"length of %d and has been truncated", name, (name + len - 80), Symbol::max_length());
|
||||
len = Symbol::max_length();
|
||||
}
|
||||
return len;
|
||||
}
|
||||
|
||||
Symbol* SymbolTable::new_symbol(const char* name, int len) {
|
||||
assert(len <= Symbol::max_length(), "sanity");
|
||||
len = check_length(name, len);
|
||||
unsigned int hash = hash_symbol(name, len, _alt_hash);
|
||||
Symbol* sym = lookup_common(name, len, hash);
|
||||
if (sym == nullptr) {
|
||||
@ -485,6 +500,7 @@ void SymbolTable::new_symbols(ClassLoaderData* loader_data, const constantPoolHa
|
||||
for (int i = 0; i < names_count; i++) {
|
||||
const char *name = names[i];
|
||||
int len = lengths[i];
|
||||
assert(len <= Symbol::max_length(), "must be - these come from the constant pool");
|
||||
unsigned int hash = hashValues[i];
|
||||
assert(lookup_shared(name, len, hash) == nullptr, "must have checked already");
|
||||
Symbol* sym = do_add_if_needed(name, len, hash, is_permanent);
|
||||
@ -494,6 +510,7 @@ void SymbolTable::new_symbols(ClassLoaderData* loader_data, const constantPoolHa
|
||||
}
|
||||
|
||||
Symbol* SymbolTable::do_add_if_needed(const char* name, int len, uintx hash, bool is_permanent) {
|
||||
assert(len <= Symbol::max_length(), "caller should have ensured this");
|
||||
SymbolTableLookup lookup(name, len, hash);
|
||||
SymbolTableGet stg;
|
||||
bool clean_hint = false;
|
||||
@ -542,7 +559,7 @@ Symbol* SymbolTable::do_add_if_needed(const char* name, int len, uintx hash, boo
|
||||
|
||||
Symbol* SymbolTable::new_permanent_symbol(const char* name) {
|
||||
unsigned int hash = 0;
|
||||
int len = (int)strlen(name);
|
||||
int len = check_length(name, (int)strlen(name));
|
||||
Symbol* sym = SymbolTable::lookup_only(name, len, hash);
|
||||
if (sym == nullptr) {
|
||||
sym = do_add_if_needed(name, len, hash, /* is_permanent */ true);
|
||||
|
@ -54,6 +54,7 @@ uint32_t Symbol::pack_hash_and_refcount(short hash, int refcount) {
|
||||
}
|
||||
|
||||
Symbol::Symbol(const u1* name, int length, int refcount) {
|
||||
assert(length <= max_length(), "SymbolTable should have caught this!");
|
||||
_hash_and_refcount = pack_hash_and_refcount((short)os::random(), refcount);
|
||||
_length = (u2)length;
|
||||
// _body[0..1] are allocated in the header just by coincidence in the current
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -130,6 +130,7 @@ class Symbol : public MetaspaceObj {
|
||||
return (int)heap_word_size(byte_size(length));
|
||||
}
|
||||
|
||||
// Constructor is private for use only by SymbolTable.
|
||||
Symbol(const u1* name, int length, int refcount);
|
||||
|
||||
static short extract_hash(uint32_t value) { return (short)(value >> 16); }
|
||||
|
@ -773,6 +773,7 @@ bool IfNode::cmpi_folds(PhaseIterGVN* igvn, bool fold_ne) {
|
||||
bool IfNode::is_ctrl_folds(Node* ctrl, PhaseIterGVN* igvn) {
|
||||
return ctrl != nullptr &&
|
||||
ctrl->is_Proj() &&
|
||||
ctrl->outcnt() == 1 && // No side-effects
|
||||
ctrl->in(0) != nullptr &&
|
||||
ctrl->in(0)->Opcode() == Op_If &&
|
||||
ctrl->in(0)->outcnt() == 2 &&
|
||||
@ -1346,7 +1347,7 @@ Node* IfNode::fold_compares(PhaseIterGVN* igvn) {
|
||||
|
||||
if (cmpi_folds(igvn)) {
|
||||
Node* ctrl = in(0);
|
||||
if (is_ctrl_folds(ctrl, igvn) && ctrl->outcnt() == 1) {
|
||||
if (is_ctrl_folds(ctrl, igvn)) {
|
||||
// A integer comparison immediately dominated by another integer
|
||||
// comparison
|
||||
ProjNode* success = nullptr;
|
||||
|
@ -2954,27 +2954,55 @@ void VTransform::adjust_pre_loop_limit_to_align_main_loop_vectors() {
|
||||
TRACE_ALIGN_VECTOR_NODE(mask_AW);
|
||||
TRACE_ALIGN_VECTOR_NODE(adjust_pre_iter);
|
||||
|
||||
// 4: Compute (3a, b):
|
||||
// 4: The computation of the new pre-loop limit could overflow (for 3a) or
|
||||
// underflow (for 3b) the int range. This is problematic in combination
|
||||
// with Range Check Elimination (RCE), which determines a "safe" range
|
||||
// where a RangeCheck will always succeed. RCE adjusts the pre-loop limit
|
||||
// such that we only enter the main-loop once we have reached the "safe"
|
||||
// range, and adjusts the main-loop limit so that we exit the main-loop
|
||||
// before we leave the "safe" range. After RCE, the range of the main-loop
|
||||
// can only be safely narrowed, and should never be widened. Hence, the
|
||||
// pre-loop limit can only be increased (for stride > 0), but an add
|
||||
// overflow might decrease it, or decreased (for stride < 0), but a sub
|
||||
// underflow might increase it. To prevent that, we perform the Sub / Add
|
||||
// and Max / Min with long operations.
|
||||
old_limit = new ConvI2LNode(old_limit);
|
||||
orig_limit = new ConvI2LNode(orig_limit);
|
||||
adjust_pre_iter = new ConvI2LNode(adjust_pre_iter);
|
||||
phase()->register_new_node(old_limit, pre_ctrl);
|
||||
phase()->register_new_node(orig_limit, pre_ctrl);
|
||||
phase()->register_new_node(adjust_pre_iter, pre_ctrl);
|
||||
TRACE_ALIGN_VECTOR_NODE(old_limit);
|
||||
TRACE_ALIGN_VECTOR_NODE(orig_limit);
|
||||
TRACE_ALIGN_VECTOR_NODE(adjust_pre_iter);
|
||||
|
||||
// 5: Compute (3a, b):
|
||||
// new_limit = old_limit + adjust_pre_iter (stride > 0)
|
||||
// new_limit = old_limit - adjust_pre_iter (stride < 0)
|
||||
//
|
||||
Node* new_limit = nullptr;
|
||||
if (stride < 0) {
|
||||
new_limit = new SubINode(old_limit, adjust_pre_iter);
|
||||
new_limit = new SubLNode(old_limit, adjust_pre_iter);
|
||||
} else {
|
||||
new_limit = new AddINode(old_limit, adjust_pre_iter);
|
||||
new_limit = new AddLNode(old_limit, adjust_pre_iter);
|
||||
}
|
||||
phase()->register_new_node(new_limit, pre_ctrl);
|
||||
TRACE_ALIGN_VECTOR_NODE(new_limit);
|
||||
|
||||
// 5: Compute (15a, b):
|
||||
// 6: Compute (15a, b):
|
||||
// Prevent pre-loop from going past the original limit of the loop.
|
||||
Node* constrained_limit =
|
||||
(stride > 0) ? (Node*) new MinINode(new_limit, orig_limit)
|
||||
: (Node*) new MaxINode(new_limit, orig_limit);
|
||||
(stride > 0) ? (Node*) new MinLNode(phase()->C, new_limit, orig_limit)
|
||||
: (Node*) new MaxLNode(phase()->C, new_limit, orig_limit);
|
||||
phase()->register_new_node(constrained_limit, pre_ctrl);
|
||||
TRACE_ALIGN_VECTOR_NODE(constrained_limit);
|
||||
|
||||
// 6: Hack the pre-loop limit
|
||||
// 7: We know that the result is in the int range, there is never truncation
|
||||
constrained_limit = new ConvL2INode(constrained_limit);
|
||||
phase()->register_new_node(constrained_limit, pre_ctrl);
|
||||
TRACE_ALIGN_VECTOR_NODE(constrained_limit);
|
||||
|
||||
// 8: Hack the pre-loop limit
|
||||
igvn().replace_input_of(pre_opaq, 1, constrained_limit);
|
||||
}
|
||||
|
||||
|
@ -44,6 +44,9 @@
|
||||
#include "utilities/events.hpp"
|
||||
#include "utilities/exceptions.hpp"
|
||||
|
||||
// Limit exception message components to 64K (the same max as Symbols)
|
||||
#define MAX_LEN 65535
|
||||
|
||||
// Implementation of ThreadShadow
|
||||
void check_ThreadShadow() {
|
||||
const ByteSize offset1 = byte_offset_of(ThreadShadow, _pending_exception);
|
||||
@ -114,10 +117,11 @@ bool Exceptions::special_exception(JavaThread* thread, const char* file, int lin
|
||||
if (h_exception.is_null() && !thread->can_call_java()) {
|
||||
ResourceMark rm(thread);
|
||||
const char* exc_value = h_name != nullptr ? h_name->as_C_string() : "null";
|
||||
log_info(exceptions)("Thread cannot call Java so instead of throwing exception <%s%s%s> (" PTR_FORMAT ") \n"
|
||||
log_info(exceptions)("Thread cannot call Java so instead of throwing exception <%.*s%s%.*s> (" PTR_FORMAT ") \n"
|
||||
"at [%s, line %d]\nfor thread " PTR_FORMAT ",\n"
|
||||
"throwing pre-allocated exception: %s",
|
||||
exc_value, message ? ": " : "", message ? message : "",
|
||||
MAX_LEN, exc_value, message ? ": " : "",
|
||||
MAX_LEN, message ? message : "",
|
||||
p2i(h_exception()), file, line, p2i(thread),
|
||||
Universe::vm_exception()->print_value_string());
|
||||
// We do not care what kind of exception we get for a thread which
|
||||
@ -143,10 +147,11 @@ void Exceptions::_throw(JavaThread* thread, const char* file, int line, Handle h
|
||||
|
||||
// tracing (do this up front - so it works during boot strapping)
|
||||
// Note, the print_value_string() argument is not called unless logging is enabled!
|
||||
log_info(exceptions)("Exception <%s%s%s> (" PTR_FORMAT ") \n"
|
||||
log_info(exceptions)("Exception <%.*s%s%.*s> (" PTR_FORMAT ") \n"
|
||||
"thrown [%s, line %d]\nfor thread " PTR_FORMAT,
|
||||
h_exception->print_value_string(),
|
||||
message ? ": " : "", message ? message : "",
|
||||
MAX_LEN, h_exception->print_value_string(),
|
||||
message ? ": " : "",
|
||||
MAX_LEN, message ? message : "",
|
||||
p2i(h_exception()), file, line, p2i(thread));
|
||||
|
||||
// for AbortVMOnException flag
|
||||
@ -566,13 +571,13 @@ void Exceptions::log_exception(Handle exception, const char* message) {
|
||||
ResourceMark rm;
|
||||
const char* detail_message = java_lang_Throwable::message_as_utf8(exception());
|
||||
if (detail_message != nullptr) {
|
||||
log_info(exceptions)("Exception <%s: %s>\n thrown in %s",
|
||||
exception->print_value_string(),
|
||||
detail_message,
|
||||
message);
|
||||
log_info(exceptions)("Exception <%.*s: %.*s>\n thrown in %.*s",
|
||||
MAX_LEN, exception->print_value_string(),
|
||||
MAX_LEN, detail_message,
|
||||
MAX_LEN, message);
|
||||
} else {
|
||||
log_info(exceptions)("Exception <%s>\n thrown in %s",
|
||||
exception->print_value_string(),
|
||||
message);
|
||||
log_info(exceptions)("Exception <%.*s>\n thrown in %.*s",
|
||||
MAX_LEN, exception->print_value_string(),
|
||||
MAX_LEN, message);
|
||||
}
|
||||
}
|
||||
|
@ -24,6 +24,7 @@
|
||||
|
||||
#include "precompiled.hpp"
|
||||
#include "memory/allocation.hpp"
|
||||
#include "utilities/checkedCast.hpp"
|
||||
#include "utilities/debug.hpp"
|
||||
#include "utilities/globalDefinitions.hpp"
|
||||
#include "utilities/utf8.hpp"
|
||||
@ -431,12 +432,16 @@ int UNICODE::utf8_size(jbyte c) {
|
||||
|
||||
template<typename T>
|
||||
int UNICODE::utf8_length(const T* base, int length) {
|
||||
int result = 0;
|
||||
size_t result = 0;
|
||||
for (int index = 0; index < length; index++) {
|
||||
T c = base[index];
|
||||
result += utf8_size(c);
|
||||
int sz = utf8_size(c);
|
||||
if (result + sz > INT_MAX-1) {
|
||||
break;
|
||||
}
|
||||
result += sz;
|
||||
}
|
||||
return result;
|
||||
return checked_cast<int>(result);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1996, 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1996, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -2150,27 +2150,33 @@ public final class SunGraphics2D
|
||||
}
|
||||
|
||||
Blit ob = lastCAblit;
|
||||
if (dy == 0 && dx > 0 && dx < w) {
|
||||
while (w > 0) {
|
||||
int partW = Math.min(w, dx);
|
||||
w -= partW;
|
||||
int sx = x + w;
|
||||
ob.Blit(theData, theData, comp, clip,
|
||||
sx, y, sx+dx, y+dy, partW, h);
|
||||
try {
|
||||
if (dy == 0 && dx > 0 && dx < w) {
|
||||
while (w > 0) {
|
||||
int partW = Math.min(w, dx);
|
||||
w -= partW;
|
||||
int sx = Math.addExact(x, w);
|
||||
ob.Blit(theData, theData, comp, clip,
|
||||
sx, y, sx+dx, y+dy, partW, h);
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (dy > 0 && dy < h && dx > -w && dx < w) {
|
||||
while (h > 0) {
|
||||
int partH = Math.min(h, dy);
|
||||
h -= partH;
|
||||
int sy = Math.addExact(y, h);
|
||||
ob.Blit(theData, theData, comp, clip,
|
||||
x, sy, Math.addExact(x, dx), sy+dy, w, partH);
|
||||
}
|
||||
return;
|
||||
}
|
||||
ob.Blit(theData, theData, comp, clip, x, y,
|
||||
Math.addExact(x, dx), Math.addExact(y, dy), w, h);
|
||||
} catch (ArithmeticException ex) {
|
||||
// We are hitting integer overflow in Math.addExact()
|
||||
return;
|
||||
}
|
||||
if (dy > 0 && dy < h && dx > -w && dx < w) {
|
||||
while (h > 0) {
|
||||
int partH = Math.min(h, dy);
|
||||
h -= partH;
|
||||
int sy = y + h;
|
||||
ob.Blit(theData, theData, comp, clip,
|
||||
x, sy, x+dx, sy+dy, w, partH);
|
||||
}
|
||||
return;
|
||||
}
|
||||
ob.Blit(theData, theData, comp, clip, x, y, x+dx, y+dy, w, h);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2001, 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2001, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -369,6 +369,13 @@ public class DrawImage implements DrawImagePipe
|
||||
final AffineTransform itx;
|
||||
try {
|
||||
itx = tx.createInverse();
|
||||
double[] mat = new double[6];
|
||||
itx.getMatrix(mat);
|
||||
for (double d : mat) {
|
||||
if (!Double.isFinite(d)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
} catch (final NoninvertibleTransformException ignored) {
|
||||
// Non-invertible transform means no output
|
||||
return;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -32,6 +32,7 @@
|
||||
#define _Included_SurfaceData
|
||||
|
||||
#include <jni.h>
|
||||
#include <limits.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@ -53,6 +54,14 @@ typedef struct {
|
||||
|
||||
#define SD_RASINFO_PRIVATE_SIZE 64
|
||||
|
||||
#define UNSAFE_TO_ADD(a, b) \
|
||||
(((a >= 0) && (b >= 0) && (a > (INT_MAX - b))) || \
|
||||
((a < 0) && (b < 0) && (a < (INT_MIN - b)))) \
|
||||
|
||||
#define UNSAFE_TO_SUB(a, b) \
|
||||
(((b >= 0) && (a < 0) && (a < (INT_MIN + b))) || \
|
||||
((b < 0) && (a >= 0) && (-b > (INT_MAX - a)))) \
|
||||
|
||||
/*
|
||||
* The SurfaceDataRasInfo structure is used to pass in and return various
|
||||
* pieces of information about the destination drawable. In particular:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -68,14 +68,28 @@ Java_sun_java2d_loops_MaskBlit_MaskBlit
|
||||
return;
|
||||
}
|
||||
|
||||
if (width <= 0 || height <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
srcInfo.bounds.x1 = srcx;
|
||||
srcInfo.bounds.y1 = srcy;
|
||||
if (UNSAFE_TO_ADD(srcx, width) ||
|
||||
UNSAFE_TO_ADD(srcy, height) ||
|
||||
UNSAFE_TO_ADD(dstx, width) ||
|
||||
UNSAFE_TO_ADD(dsty, height)) {
|
||||
return;
|
||||
}
|
||||
srcInfo.bounds.x2 = srcx + width;
|
||||
srcInfo.bounds.y2 = srcy + height;
|
||||
dstInfo.bounds.x1 = dstx;
|
||||
dstInfo.bounds.y1 = dsty;
|
||||
dstInfo.bounds.x2 = dstx + width;
|
||||
dstInfo.bounds.y2 = dsty + height;
|
||||
if (UNSAFE_TO_SUB(srcx, dstx) ||
|
||||
UNSAFE_TO_SUB(srcy, dsty)) {
|
||||
return;
|
||||
}
|
||||
srcx -= dstx;
|
||||
srcy -= dsty;
|
||||
SurfaceData_IntersectBounds(&dstInfo.bounds, &clipInfo.bounds);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -467,7 +467,7 @@ storePgram(EdgeInfo *pLeftEdge, EdgeInfo *pRightEdge,
|
||||
#define INSERT_ACCUM(pACCUM, IMIN, IMAX, X0, Y0, X1, Y1, CX1, CX2, MULT) \
|
||||
do { \
|
||||
jdouble xmid = ((X0) + (X1)) * 0.5; \
|
||||
if (xmid <= (CX2)) { \
|
||||
if (xmid < (CX2)) { \
|
||||
jdouble sliceh = ((Y1) - (Y0)); \
|
||||
jdouble slicearea; \
|
||||
jint i; \
|
||||
@ -556,7 +556,7 @@ fillAAPgram(NativePrimitive *pPrim, SurfaceDataRasInfo *pRasInfo,
|
||||
jint cy2 = pRasInfo->bounds.y2;
|
||||
jint width = cx2 - cx1;
|
||||
EdgeInfo edges[4];
|
||||
jfloat localaccum[MASK_BUF_LEN + 1];
|
||||
jfloat localaccum[MASK_BUF_LEN + 2];
|
||||
jfloat *pAccum;
|
||||
|
||||
if (!storePgram(edges + 0, edges + 2,
|
||||
@ -568,12 +568,12 @@ fillAAPgram(NativePrimitive *pPrim, SurfaceDataRasInfo *pRasInfo,
|
||||
}
|
||||
|
||||
pAccum = ((width > MASK_BUF_LEN)
|
||||
? malloc((width + 1) * sizeof(jfloat))
|
||||
? malloc((width + 2) * sizeof(jfloat))
|
||||
: localaccum);
|
||||
if (pAccum == NULL) {
|
||||
return;
|
||||
}
|
||||
memset(pAccum, 0, (width+1) * sizeof(jfloat));
|
||||
memset(pAccum, 0, (width + 2) * sizeof(jfloat));
|
||||
|
||||
while (cy1 < cy2) {
|
||||
jint lmin, lmax, rmin, rmax;
|
||||
@ -794,7 +794,7 @@ drawAAPgram(NativePrimitive *pPrim, SurfaceDataRasInfo *pRasInfo,
|
||||
jint cy2 = pRasInfo->bounds.y2;
|
||||
jint width = cx2 - cx1;
|
||||
EdgeInfo edges[8];
|
||||
jfloat localaccum[MASK_BUF_LEN + 1];
|
||||
jfloat localaccum[MASK_BUF_LEN + 2];
|
||||
jfloat *pAccum;
|
||||
|
||||
if (!storePgram(edges + 0, edges + 6,
|
||||
@ -815,12 +815,12 @@ drawAAPgram(NativePrimitive *pPrim, SurfaceDataRasInfo *pRasInfo,
|
||||
JNI_TRUE);
|
||||
|
||||
pAccum = ((width > MASK_BUF_LEN)
|
||||
? malloc((width + 1) * sizeof(jfloat))
|
||||
? malloc((width + 2) * sizeof(jfloat))
|
||||
: localaccum);
|
||||
if (pAccum == NULL) {
|
||||
return;
|
||||
}
|
||||
memset(pAccum, 0, (width+1) * sizeof(jfloat));
|
||||
memset(pAccum, 0, (width + 2) * sizeof(jfloat));
|
||||
|
||||
while (cy1 < cy2) {
|
||||
jint lmin, lmax, rmin, rmax;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2004, 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -120,7 +120,7 @@ TransformInterpFunc *pBicubicFunc = BicubicInterp;
|
||||
/* We reject coordinates not less than 1<<30 so that the distance between */
|
||||
/* any 2 of them is less than 1<<31 which would overflow into the sign */
|
||||
/* bit of a signed long value used to represent fixed point coordinates. */
|
||||
#define TX_FIXED_UNSAFE(v) (fabs(v) >= (1<<30))
|
||||
#define TX_FIXED_UNSAFE(v) (isinf(v) || isnan(v) || fabs(v) >= (1<<30))
|
||||
static jboolean
|
||||
checkOverflow(jint dxoff, jint dyoff,
|
||||
SurfaceDataBounds *pBounds,
|
||||
|
Loading…
x
Reference in New Issue
Block a user