diff --git a/.hgtags b/.hgtags index fc041e46921..f2f9fa39a3c 100644 --- a/.hgtags +++ b/.hgtags @@ -18,3 +18,8 @@ a2879b2837f5a4c87e9542efe69ef138194af8ff jdk7-b38 3cb2a607c347934f8e7e86f840a094c28b08d9ea jdk7-b41 caf58ffa084568990cbb3441f9ae188e36b31770 jdk7-b42 41bd0a702bc8ec6feebd725a63e7c3227f82ab11 jdk7-b43 +5843778bda89b1d5ac8e1aa05e26930ac90b3145 jdk7-b44 +54dffad0bf066791a2793305875250c395011d5f jdk7-b45 +04b2620edc72de93671646e4720c5992c74ac8b5 jdk7-b46 +0c4657194eec95c08ba478aee9cfc3c295e41657 jdk7-b47 +1bf51a4c2627c2f0e0cbcc2cf0421bdb37f1f2b2 jdk7-b48 diff --git a/.hgtags-top-repo b/.hgtags-top-repo index 20804800c15..7e83ea737e8 100644 --- a/.hgtags-top-repo +++ b/.hgtags-top-repo @@ -18,3 +18,8 @@ ab523b49de1fc73fefe6855ce1e0349bdbd7af29 jdk7-b39 541bdc5ad32fc33255944d0a044ad992f3d915e8 jdk7-b41 94052b87287303527125026fe4b2698cf867ea83 jdk7-b42 848e684279d2ba42577d9621d5b2e5af3823d12d jdk7-b43 +a395e3aac4744cc9033fcd819fad1239a45add52 jdk7-b44 +99846f001ca214015578d593802d26e27246a802 jdk7-b45 +e8a2a4d187773a62f3309b0fa265c13425bc2258 jdk7-b46 +d7744e86dedc21a8ecf6bdb73eb191b8eaf5b0da jdk7-b47 +4ae9f4bfdb98f65bd957e3fe72471b320150b38e jdk7-b48 diff --git a/corba/.hgtags b/corba/.hgtags index 35249197029..c1c59cf6a3c 100644 --- a/corba/.hgtags +++ b/corba/.hgtags @@ -18,3 +18,8 @@ ef6af34d75a7b44e77083f1d4ee47631fa09d3b4 jdk7-b31 c90eeda9594ed2983403e2049aed8d503126c62e jdk7-b41 ccd6a16502e0650d91d85c4b86be05cbcd461a87 jdk7-b42 9cd740d48a4855321d69f137a7109c00bcda76be jdk7-b43 +9803dac7254041b30ca65e3852d4c566b9757c3b jdk7-b44 +68814aa5b44b1f16931a97e7cd4028c70eb9586b jdk7-b45 +1691dbfc08f8ee3f4e23a1ff30cdff920718696c jdk7-b46 +167ad0164301f318b069a947e1c9c07ed667748a jdk7-b47 +0be222241fd405e48915647facfaa176621b39b9 jdk7-b48 diff --git a/hotspot/.hgtags b/hotspot/.hgtags index 6cc68b5d373..95ce2df1f90 100644 --- a/hotspot/.hgtags +++ b/hotspot/.hgtags @@ -18,3 +18,8 @@ d9bc824aa078573829bb66572af847e26e1bd12e jdk7-b38 f9d938ede1960d18cb7cf23c645b026519c1a678 jdk7-b41 ad8c8ca4ab0f4c86e74c061958f44a8f4a930f2c jdk7-b42 fc6a5ae3fef5ebacfa896dbb3ae37715e388e282 jdk7-b43 +809e899c638bd9b21836abf9d09ab2a30ff3900b jdk7-b44 +945bf754069766e76873c53102fae48abf04cf5b jdk7-b45 +16bb38eeda35b46268eefa4c1f829eb086e0ca46 jdk7-b46 +fcb923bad68e2b10380a030ea83a723f4dc3d4d6 jdk7-b47 +bcb33806d186561c781992e5f4d8a90bb033f9f0 jdk7-b48 diff --git a/hotspot/agent/src/os/linux/ps_core.c b/hotspot/agent/src/os/linux/ps_core.c index 3562f2d31f6..a6156f0a8d4 100644 --- a/hotspot/agent/src/os/linux/ps_core.c +++ b/hotspot/agent/src/os/linux/ps_core.c @@ -238,8 +238,8 @@ struct FileMapHeader { // Ignore the rest of the FileMapHeader. We don't need those fields here. }; -static bool read_int(struct ps_prochandle* ph, uintptr_t addr, int* pvalue) { - int i; +static bool read_jboolean(struct ps_prochandle* ph, uintptr_t addr, jboolean* pvalue) { + jboolean i; if (ps_pdread(ph, (psaddr_t) addr, &i, sizeof(i)) == PS_OK) { *pvalue = i; return true; @@ -295,7 +295,7 @@ static bool init_classsharing_workaround(struct ps_prochandle* ph) { int fd = -1, m = 0; uintptr_t base = 0, useSharedSpacesAddr = 0; uintptr_t sharedArchivePathAddrAddr = 0, sharedArchivePathAddr = 0; - int useSharedSpaces = 0; + jboolean useSharedSpaces = 0; map_info* mi = 0; memset(classes_jsa, 0, sizeof(classes_jsa)); @@ -306,12 +306,15 @@ static bool init_classsharing_workaround(struct ps_prochandle* ph) { return false; } - if (read_int(ph, useSharedSpacesAddr, &useSharedSpaces) != true) { + // Hotspot vm types are not exported to build this library. So + // using equivalent type jboolean to read the value of + // UseSharedSpaces which is same as hotspot type "bool". + if (read_jboolean(ph, useSharedSpacesAddr, &useSharedSpaces) != true) { print_debug("can't read the value of 'UseSharedSpaces' flag\n"); return false; } - if (useSharedSpaces == 0) { + if ((int)useSharedSpaces == 0) { print_debug("UseSharedSpaces is false, assuming -Xshare:off!\n"); return true; } diff --git a/hotspot/agent/src/os/solaris/proc/saproc.cpp b/hotspot/agent/src/os/solaris/proc/saproc.cpp index 231773c5647..415e28af658 100644 --- a/hotspot/agent/src/os/solaris/proc/saproc.cpp +++ b/hotspot/agent/src/os/solaris/proc/saproc.cpp @@ -502,8 +502,8 @@ struct FileMapHeader { }; static bool -read_int(struct ps_prochandle* ph, psaddr_t addr, int* pvalue) { - int i; +read_jboolean(struct ps_prochandle* ph, psaddr_t addr, jboolean* pvalue) { + jboolean i; if (ps_pread(ph, addr, &i, sizeof(i)) == PS_OK) { *pvalue = i; return true; @@ -575,10 +575,13 @@ init_classsharing_workaround(void *cd, const prmap_t* pmap, const char* obj_name } // read the value of the flag "UseSharedSpaces" - int value = 0; - if (read_int(ph, useSharedSpacesAddr, &value) != true) { + // Since hotspot types are not available to build this library. So + // equivalent type "jboolean" is used to read the value of "UseSharedSpaces" + // which is same as hotspot type "bool". + jboolean value = 0; + if (read_jboolean(ph, useSharedSpacesAddr, &value) != true) { THROW_NEW_DEBUGGER_EXCEPTION_("can't read 'UseSharedSpaces' flag", 1); - } else if (value == 0) { + } else if ((int)value == 0) { print_debug("UseSharedSpaces is false, assuming -Xshare:off!\n"); return 1; } diff --git a/hotspot/make/hotspot_version b/hotspot/make/hotspot_version index 4454f180b5b..eea8597c7cf 100644 --- a/hotspot/make/hotspot_version +++ b/hotspot/make/hotspot_version @@ -33,9 +33,9 @@ # Don't put quotes (fail windows build). HOTSPOT_VM_COPYRIGHT=Copyright 2008 -HS_MAJOR_VER=14 +HS_MAJOR_VER=15 HS_MINOR_VER=0 -HS_BUILD_NUMBER=10 +HS_BUILD_NUMBER=02 JDK_MAJOR_VER=1 JDK_MINOR_VER=7 diff --git a/hotspot/src/cpu/sparc/vm/jni_sparc.h b/hotspot/src/cpu/sparc/vm/jni_sparc.h index 7d2845e0162..33a494b6066 100644 --- a/hotspot/src/cpu/sparc/vm/jni_sparc.h +++ b/hotspot/src/cpu/sparc/vm/jni_sparc.h @@ -28,5 +28,11 @@ #define JNICALL typedef int jint; -typedef long long jlong; + +#ifdef _LP64 + typedef long jlong; +#else + typedef long long jlong; +#endif + typedef signed char jbyte; diff --git a/hotspot/src/cpu/sparc/vm/sparc.ad b/hotspot/src/cpu/sparc/vm/sparc.ad index 06af021d1fd..b4a94ac240a 100644 --- a/hotspot/src/cpu/sparc/vm/sparc.ad +++ b/hotspot/src/cpu/sparc/vm/sparc.ad @@ -762,7 +762,7 @@ void emit_form3_mem_reg(CodeBuffer &cbuf, const MachNode* n, int primary, int te case Assembler::stdf_op3: st_op = Op_StoreD; break; case Assembler::ldsb_op3: ld_op = Op_LoadB; break; - case Assembler::lduh_op3: ld_op = Op_LoadC; break; + case Assembler::lduh_op3: ld_op = Op_LoadUS; break; case Assembler::ldsh_op3: ld_op = Op_LoadS; break; case Assembler::ldx_op3: // may become LoadP or stay LoadI case Assembler::ldsw_op3: // may become LoadP or stay LoadI @@ -3869,6 +3869,8 @@ operand regD() %{ constraint(ALLOC_IN_RC(dflt_reg)); match(RegD); + match(regD_low); + format %{ %} interface(REG_INTER); %} @@ -3883,7 +3885,7 @@ operand regF() %{ operand regD_low() %{ constraint(ALLOC_IN_RC(dflt_low_reg)); - match(RegD); + match(regD); format %{ %} interface(REG_INTER); @@ -5314,9 +5316,9 @@ instruct loadUBL(iRegL dst, memory mem, immL_FF bytemask) %{ ins_pipe(iload_mask_mem); %} -// Load Char (16bit UNsigned) into a Long Register -instruct loadUCL(iRegL dst, memory mem, immL_FFFF bytemask) %{ - match(Set dst (AndL (ConvI2L (LoadC mem)) bytemask)); +// Load Unsigned Short/Char (16bit UNsigned) into a Long Register +instruct loadUS2L(iRegL dst, memory mem, immL_FFFF bytemask) %{ + match(Set dst (AndL (ConvI2L (LoadUS mem)) bytemask)); ins_cost(MEMORY_REF_COST); size(4); @@ -5326,9 +5328,9 @@ instruct loadUCL(iRegL dst, memory mem, immL_FFFF bytemask) %{ ins_pipe(iload_mask_mem); %} -// Load Char (16bit unsigned) -instruct loadC(iRegI dst, memory mem) %{ - match(Set dst (LoadC mem)); +// Load Unsigned Short/Char (16bit unsigned) +instruct loadUS(iRegI dst, memory mem) %{ + match(Set dst (LoadUS mem)); ins_cost(MEMORY_REF_COST); size(4); diff --git a/hotspot/src/cpu/x86/vm/assembler_x86.cpp b/hotspot/src/cpu/x86/vm/assembler_x86.cpp index edf0d3dbcaf..d6433f0e176 100644 --- a/hotspot/src/cpu/x86/vm/assembler_x86.cpp +++ b/hotspot/src/cpu/x86/vm/assembler_x86.cpp @@ -5212,15 +5212,15 @@ void MacroAssembler::pushptr(AddressLiteral src) { void MacroAssembler::reset_last_Java_frame(bool clear_fp, bool clear_pc) { // we must set sp to zero to clear frame - movptr(Address(r15_thread, JavaThread::last_Java_sp_offset()), (int32_t)NULL_WORD); + movptr(Address(r15_thread, JavaThread::last_Java_sp_offset()), NULL_WORD); // must clear fp, so that compiled frames are not confused; it is // possible that we need it only for debugging if (clear_fp) { - movptr(Address(r15_thread, JavaThread::last_Java_fp_offset()), (int32_t)NULL_WORD); + movptr(Address(r15_thread, JavaThread::last_Java_fp_offset()), NULL_WORD); } if (clear_pc) { - movptr(Address(r15_thread, JavaThread::last_Java_pc_offset()), (int32_t)NULL_WORD); + movptr(Address(r15_thread, JavaThread::last_Java_pc_offset()), NULL_WORD); } } @@ -5670,7 +5670,7 @@ void MacroAssembler::call_VM_base(Register oop_result, // get oop result if there is one and reset the value in the thread if (oop_result->is_valid()) { movptr(oop_result, Address(java_thread, JavaThread::vm_result_offset())); - movptr(Address(java_thread, JavaThread::vm_result_offset()), (int32_t)NULL_WORD); + movptr(Address(java_thread, JavaThread::vm_result_offset()), NULL_WORD); verify_oop(oop_result, "broken oop in call_VM_base"); } } @@ -6426,13 +6426,13 @@ void MacroAssembler::reset_last_Java_frame(Register java_thread, bool clear_fp, get_thread(java_thread); } // we must set sp to zero to clear frame - movptr(Address(java_thread, JavaThread::last_Java_sp_offset()), (int32_t)NULL_WORD); + movptr(Address(java_thread, JavaThread::last_Java_sp_offset()), NULL_WORD); if (clear_fp) { - movptr(Address(java_thread, JavaThread::last_Java_fp_offset()), (int32_t)NULL_WORD); + movptr(Address(java_thread, JavaThread::last_Java_fp_offset()), NULL_WORD); } if (clear_pc) - movptr(Address(java_thread, JavaThread::last_Java_pc_offset()), (int32_t)NULL_WORD); + movptr(Address(java_thread, JavaThread::last_Java_pc_offset()), NULL_WORD); } @@ -6943,29 +6943,32 @@ void MacroAssembler::trigfunc(char trig, int num_fpu_regs_in_use) { Label slow_case, done; - // x ?<= pi/4 - fld_d(ExternalAddress((address)&pi_4)); - fld_s(1); // Stack: X PI/4 X - fabs(); // Stack: |X| PI/4 X - fcmp(tmp); - jcc(Assembler::above, slow_case); + ExternalAddress pi4_adr = (address)&pi_4; + if (reachable(pi4_adr)) { + // x ?<= pi/4 + fld_d(pi4_adr); + fld_s(1); // Stack: X PI/4 X + fabs(); // Stack: |X| PI/4 X + fcmp(tmp); + jcc(Assembler::above, slow_case); - // fastest case: -pi/4 <= x <= pi/4 - switch(trig) { - case 's': - fsin(); - break; - case 'c': - fcos(); - break; - case 't': - ftan(); - break; - default: - assert(false, "bad intrinsic"); - break; + // fastest case: -pi/4 <= x <= pi/4 + switch(trig) { + case 's': + fsin(); + break; + case 'c': + fcos(); + break; + case 't': + ftan(); + break; + default: + assert(false, "bad intrinsic"); + break; + } + jmp(done); } - jmp(done); // slow case: runtime call bind(slow_case); diff --git a/hotspot/src/cpu/x86/vm/bytecodeInterpreter_x86.inline.hpp b/hotspot/src/cpu/x86/vm/bytecodeInterpreter_x86.inline.hpp index 0e41dbc4a21..f66bfd4d309 100644 --- a/hotspot/src/cpu/x86/vm/bytecodeInterpreter_x86.inline.hpp +++ b/hotspot/src/cpu/x86/vm/bytecodeInterpreter_x86.inline.hpp @@ -213,7 +213,7 @@ inline jint BytecodeInterpreter::VMintAnd(jint op1, jint op2) { inline jint BytecodeInterpreter::VMintDiv(jint op1, jint op2) { /* it's possible we could catch this special case implicitly */ - if (op1 == 0x80000000 && op2 == -1) return op1; + if ((juint)op1 == 0x80000000 && op2 == -1) return op1; else return op1 / op2; } @@ -231,7 +231,7 @@ inline jint BytecodeInterpreter::VMintOr(jint op1, jint op2) { inline jint BytecodeInterpreter::VMintRem(jint op1, jint op2) { /* it's possible we could catch this special case implicitly */ - if (op1 == 0x80000000 && op2 == -1) return 0; + if ((juint)op1 == 0x80000000 && op2 == -1) return 0; else return op1 % op2; } diff --git a/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp b/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp index 4300d196c28..cdf508fab01 100644 --- a/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp +++ b/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp @@ -779,7 +779,7 @@ void LIR_Assembler::const2mem(LIR_Opr src, LIR_Opr dest, BasicType type, CodeEmi case T_OBJECT: // fall through case T_ARRAY: if (c->as_jobject() == NULL) { - __ movptr(as_Address(addr), (int32_t)NULL_WORD); + __ movptr(as_Address(addr), NULL_WORD); } else { if (is_literal_address(addr)) { ShouldNotReachHere(); diff --git a/hotspot/src/cpu/x86/vm/c1_Runtime1_x86.cpp b/hotspot/src/cpu/x86/vm/c1_Runtime1_x86.cpp index eed2ad68de4..12aea3fde07 100644 --- a/hotspot/src/cpu/x86/vm/c1_Runtime1_x86.cpp +++ b/hotspot/src/cpu/x86/vm/c1_Runtime1_x86.cpp @@ -78,10 +78,10 @@ int StubAssembler::call_RT(Register oop_result1, Register oop_result2, address e movptr(rax, Address(thread, Thread::pending_exception_offset())); // make sure that the vm_results are cleared if (oop_result1->is_valid()) { - movptr(Address(thread, JavaThread::vm_result_offset()), (int32_t)NULL_WORD); + movptr(Address(thread, JavaThread::vm_result_offset()), NULL_WORD); } if (oop_result2->is_valid()) { - movptr(Address(thread, JavaThread::vm_result_2_offset()), (int32_t)NULL_WORD); + movptr(Address(thread, JavaThread::vm_result_2_offset()), NULL_WORD); } if (frame_size() == no_frame_size) { leave(); @@ -96,12 +96,12 @@ int StubAssembler::call_RT(Register oop_result1, Register oop_result2, address e // get oop results if there are any and reset the values in the thread if (oop_result1->is_valid()) { movptr(oop_result1, Address(thread, JavaThread::vm_result_offset())); - movptr(Address(thread, JavaThread::vm_result_offset()), (int32_t)NULL_WORD); + movptr(Address(thread, JavaThread::vm_result_offset()), NULL_WORD); verify_oop(oop_result1); } if (oop_result2->is_valid()) { movptr(oop_result2, Address(thread, JavaThread::vm_result_2_offset())); - movptr(Address(thread, JavaThread::vm_result_2_offset()), (int32_t)NULL_WORD); + movptr(Address(thread, JavaThread::vm_result_2_offset()), NULL_WORD); verify_oop(oop_result2); } return call_offset; @@ -728,8 +728,8 @@ void Runtime1::generate_handle_exception(StubAssembler *sasm, OopMapSet* oop_map // clear exception fields in JavaThread because they are no longer needed // (fields must be cleared because they are processed by GC otherwise) - __ movptr(Address(thread, JavaThread::exception_oop_offset()), (int32_t)NULL_WORD); - __ movptr(Address(thread, JavaThread::exception_pc_offset()), (int32_t)NULL_WORD); + __ movptr(Address(thread, JavaThread::exception_oop_offset()), NULL_WORD); + __ movptr(Address(thread, JavaThread::exception_pc_offset()), NULL_WORD); // pop the stub frame off __ leave(); @@ -878,7 +878,7 @@ OopMapSet* Runtime1::generate_patching(StubAssembler* sasm, address target) { // load and clear pending exception __ movptr(rax, Address(thread, Thread::pending_exception_offset())); - __ movptr(Address(thread, Thread::pending_exception_offset()), (int32_t)NULL_WORD); + __ movptr(Address(thread, Thread::pending_exception_offset()), NULL_WORD); // check that there is really a valid exception __ verify_not_null_oop(rax); @@ -971,14 +971,14 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) { // load pending exception oop into rax, __ movptr(exception_oop, Address(thread, Thread::pending_exception_offset())); // clear pending exception - __ movptr(Address(thread, Thread::pending_exception_offset()), (int32_t)NULL_WORD); + __ movptr(Address(thread, Thread::pending_exception_offset()), NULL_WORD); // load issuing PC (the return address for this stub) into rdx __ movptr(exception_pc, Address(rbp, 1*BytesPerWord)); // make sure that the vm_results are cleared (may be unnecessary) - __ movptr(Address(thread, JavaThread::vm_result_offset()), (int32_t)NULL_WORD); - __ movptr(Address(thread, JavaThread::vm_result_2_offset()), (int32_t)NULL_WORD); + __ movptr(Address(thread, JavaThread::vm_result_offset()), NULL_WORD); + __ movptr(Address(thread, JavaThread::vm_result_2_offset()), NULL_WORD); // verify that that there is really a valid exception in rax, __ verify_not_null_oop(exception_oop); @@ -1393,7 +1393,7 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) { __ ret(0); __ bind(miss); - __ movptr(Address(rsp, (super_off) * VMRegImpl::stack_slot_size), 0); // result + __ movptr(Address(rsp, (super_off) * VMRegImpl::stack_slot_size), NULL_WORD); // result __ pop(rax); __ pop(rcx); __ pop(rsi); diff --git a/hotspot/src/cpu/x86/vm/cppInterpreter_x86.cpp b/hotspot/src/cpu/x86/vm/cppInterpreter_x86.cpp index ecaa3ec21af..a3621ad886c 100644 --- a/hotspot/src/cpu/x86/vm/cppInterpreter_x86.cpp +++ b/hotspot/src/cpu/x86/vm/cppInterpreter_x86.cpp @@ -594,7 +594,7 @@ void InterpreterGenerator::generate_counter_overflow(Label* do_continue) { __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::frequency_counter_overflow), rax); // for c++ interpreter can rsi really be munged? - __ lea(state, Address(rbp, -sizeof(BytecodeInterpreter))); // restore state + __ lea(state, Address(rbp, -(int)sizeof(BytecodeInterpreter))); // restore state __ movptr(rbx, Address(state, byte_offset_of(BytecodeInterpreter, _method))); // restore method __ movptr(rdi, Address(state, byte_offset_of(BytecodeInterpreter, _locals))); // get locals pointer @@ -658,7 +658,7 @@ void InterpreterGenerator::generate_stack_overflow_check(void) { const Address size_of_stack (rbx, methodOopDesc::max_stack_offset()); // Always give one monitor to allow us to start interp if sync method. // Any additional monitors need a check when moving the expression stack - const one_monitor = frame::interpreter_frame_monitor_size() * wordSize; + const int one_monitor = frame::interpreter_frame_monitor_size() * wordSize; __ load_unsigned_word(rax, size_of_stack); // get size of expression stack in words __ lea(rax, Address(noreg, rax, Interpreter::stackElementScale(), one_monitor)); __ lea(rax, Address(rax, rdx, Interpreter::stackElementScale(), overhead_size)); @@ -1829,7 +1829,7 @@ address InterpreterGenerator::generate_normal_entry(bool synchronized) { Label unwind_and_forward; // restore state pointer. - __ lea(state, Address(rbp, -sizeof(BytecodeInterpreter))); + __ lea(state, Address(rbp, -(int)sizeof(BytecodeInterpreter))); __ movptr(rbx, STATE(_method)); // get method #ifdef _LP64 @@ -1877,14 +1877,14 @@ address InterpreterGenerator::generate_normal_entry(bool synchronized) { // The FPU stack is clean if UseSSE >= 2 but must be cleaned in other cases if (UseSSE < 2) { - __ lea(state, Address(rbp, -sizeof(BytecodeInterpreter))); + __ lea(state, Address(rbp, -(int)sizeof(BytecodeInterpreter))); __ movptr(rbx, STATE(_result._to_call._callee)); // get method just executed __ movl(rcx, Address(rbx, methodOopDesc::result_index_offset())); __ cmpl(rcx, AbstractInterpreter::BasicType_as_index(T_FLOAT)); // Result stub address array index __ jcc(Assembler::equal, do_float); __ cmpl(rcx, AbstractInterpreter::BasicType_as_index(T_DOUBLE)); // Result stub address array index __ jcc(Assembler::equal, do_double); -#ifdef COMPILER2 +#if !defined(_LP64) || defined(COMPILER1) || !defined(COMPILER2) __ empty_FPU_stack(); #endif // COMPILER2 __ jmp(done_conv); @@ -1928,7 +1928,7 @@ address InterpreterGenerator::generate_normal_entry(bool synchronized) { // Restore rsi/r13 as compiled code may not preserve it - __ lea(state, Address(rbp, -sizeof(BytecodeInterpreter))); + __ lea(state, Address(rbp, -(int)sizeof(BytecodeInterpreter))); // restore stack to what we had when we left (in case i2c extended it) @@ -1942,7 +1942,7 @@ address InterpreterGenerator::generate_normal_entry(bool synchronized) { #else __ movptr(rcx, STATE(_thread)); // get thread __ cmpptr(Address(rcx, Thread::pending_exception_offset()), (int32_t)NULL_WORD); -#endif / __LP64 +#endif // _LP64 __ jcc(Assembler::notZero, return_with_exception); // get method just executed diff --git a/hotspot/src/cpu/x86/vm/frame_x86.inline.hpp b/hotspot/src/cpu/x86/vm/frame_x86.inline.hpp index f06b40de350..82c37fd41da 100644 --- a/hotspot/src/cpu/x86/vm/frame_x86.inline.hpp +++ b/hotspot/src/cpu/x86/vm/frame_x86.inline.hpp @@ -139,7 +139,7 @@ inline address* frame::native_param_addr(int idx) const { return (address*) addr #ifdef CC_INTERP inline interpreterState frame::get_interpreterState() const { - return ((interpreterState)addr_at( -sizeof(BytecodeInterpreter)/wordSize )); + return ((interpreterState)addr_at( -((int)sizeof(BytecodeInterpreter))/wordSize )); } inline intptr_t* frame::sender_sp() const { diff --git a/hotspot/src/cpu/x86/vm/interp_masm_x86_32.cpp b/hotspot/src/cpu/x86/vm/interp_masm_x86_32.cpp index 78f0f123833..c11c3bc5404 100644 --- a/hotspot/src/cpu/x86/vm/interp_masm_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/interp_masm_x86_32.cpp @@ -133,7 +133,7 @@ void InterpreterMacroAssembler::load_earlyret_value(TosState state) { + in_ByteSize(wordSize)); switch (state) { case atos: movptr(rax, oop_addr); - movptr(oop_addr, (int32_t)NULL_WORD); + movptr(oop_addr, NULL_WORD); verify_oop(rax, state); break; case ltos: movl(rdx, val_addr1); // fall through @@ -148,8 +148,8 @@ void InterpreterMacroAssembler::load_earlyret_value(TosState state) { } // Clean up tos value in the thread object movl(tos_addr, (int32_t) ilgl); - movptr(val_addr, (int32_t)NULL_WORD); - NOT_LP64(movl(val_addr1, (int32_t)NULL_WORD)); + movptr(val_addr, NULL_WORD); + NOT_LP64(movptr(val_addr1, NULL_WORD)); } @@ -944,7 +944,7 @@ void InterpreterMacroAssembler::unlock_object(Register lock_reg) { movptr(obj_reg, Address(lock_reg, BasicObjectLock::obj_offset_in_bytes ())); // Free entry - movptr(Address(lock_reg, BasicObjectLock::obj_offset_in_bytes()), (int32_t)NULL_WORD); + movptr(Address(lock_reg, BasicObjectLock::obj_offset_in_bytes()), NULL_WORD); if (UseBiasedLocking) { biased_locking_exit(obj_reg, header_reg, done); diff --git a/hotspot/src/cpu/x86/vm/interp_masm_x86_32.hpp b/hotspot/src/cpu/x86/vm/interp_masm_x86_32.hpp index 247f4ec3b47..57cd7f325fe 100644 --- a/hotspot/src/cpu/x86/vm/interp_masm_x86_32.hpp +++ b/hotspot/src/cpu/x86/vm/interp_masm_x86_32.hpp @@ -120,7 +120,7 @@ class InterpreterMacroAssembler: public MacroAssembler { void empty_expression_stack() { movptr(rsp, Address(rbp, frame::interpreter_frame_monitor_block_top_offset * wordSize)); // NULL last_sp until next java call - movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), (int32_t)NULL_WORD); + movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), NULL_WORD); } // Tagged stack helpers for swap and dup diff --git a/hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp b/hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp index 9809649d37e..ebcac0fddf9 100644 --- a/hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp @@ -30,7 +30,7 @@ #ifdef CC_INTERP void InterpreterMacroAssembler::get_method(Register reg) { - movptr(reg, Address(rbp, -(sizeof(BytecodeInterpreter) + 2 * wordSize))); + movptr(reg, Address(rbp, -((int)sizeof(BytecodeInterpreter) + 2 * wordSize))); movptr(reg, Address(reg, byte_offset_of(BytecodeInterpreter, _method))); } #endif // CC_INTERP diff --git a/hotspot/src/cpu/x86/vm/interpreterRT_x86_32.cpp b/hotspot/src/cpu/x86/vm/interpreterRT_x86_32.cpp index 96a1c3073d4..60af2f45735 100644 --- a/hotspot/src/cpu/x86/vm/interpreterRT_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/interpreterRT_x86_32.cpp @@ -54,7 +54,7 @@ void InterpreterRuntime::SignatureHandlerGenerator::box(int from_offset, int to_ __ cmpptr(Address(from(), Interpreter::local_offset_in_bytes(from_offset)), (int32_t)NULL_WORD); // do not use temp() to avoid AGI Label L; __ jcc(Assembler::notZero, L); - __ movptr(temp(), ((int32_t)NULL_WORD)); + __ movptr(temp(), NULL_WORD); __ bind(L); __ movptr(Address(to(), to_offset * wordSize), temp()); } @@ -110,7 +110,7 @@ class SlowSignatureHandler: public NativeSignatureIterator { virtual void pass_object() { // pass address of from intptr_t from_addr = (intptr_t)(_from + Interpreter::local_offset_in_bytes(0)); - *_to++ = (*(intptr_t*)from_addr == 0) ? NULL : from_addr; + *_to++ = (*(intptr_t*)from_addr == 0) ? NULL_WORD : from_addr; debug_only(verify_tag(frame::TagReference)); _from -= Interpreter::stackElementSize(); } diff --git a/hotspot/src/cpu/x86/vm/jni_x86.h b/hotspot/src/cpu/x86/vm/jni_x86.h index 89f95e35749..625562bb3f2 100644 --- a/hotspot/src/cpu/x86/vm/jni_x86.h +++ b/hotspot/src/cpu/x86/vm/jni_x86.h @@ -32,7 +32,13 @@ #define JNICALL typedef int jint; + +#ifdef _LP64 + typedef long jlong; +#else typedef long long jlong; +#endif + #else #define JNIEXPORT __declspec(dllexport) #define JNIIMPORT __declspec(dllimport) diff --git a/hotspot/src/cpu/x86/vm/runtime_x86_32.cpp b/hotspot/src/cpu/x86/vm/runtime_x86_32.cpp index 72870e11e07..6a92a2c053e 100644 --- a/hotspot/src/cpu/x86/vm/runtime_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/runtime_x86_32.cpp @@ -129,11 +129,11 @@ void OptoRuntime::generate_exception_blob() { // Get the exception pc in case we are deoptimized __ movptr(rdx, Address(rcx, JavaThread::exception_pc_offset())); #ifdef ASSERT - __ movptr(Address(rcx, JavaThread::exception_handler_pc_offset()), (int32_t)NULL_WORD); - __ movptr(Address(rcx, JavaThread::exception_pc_offset()), (int32_t)NULL_WORD); + __ movptr(Address(rcx, JavaThread::exception_handler_pc_offset()), NULL_WORD); + __ movptr(Address(rcx, JavaThread::exception_pc_offset()), NULL_WORD); #endif // Clear the exception oop so GC no longer processes it as a root. - __ movptr(Address(rcx, JavaThread::exception_oop_offset()), (int32_t)NULL_WORD); + __ movptr(Address(rcx, JavaThread::exception_oop_offset()), NULL_WORD); __ pop(rcx); diff --git a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp index 7c0aa6bf556..3cf22d7fa05 100644 --- a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp @@ -39,6 +39,8 @@ RuntimeStub* SharedRuntime::_resolve_opt_virtual_call_blob; RuntimeStub* SharedRuntime::_resolve_virtual_call_blob; RuntimeStub* SharedRuntime::_resolve_static_call_blob; +const int StackAlignmentInSlots = StackAlignmentInBytes / VMRegImpl::stack_slot_size; + class RegisterSaver { enum { FPU_regs_live = 8 /*for the FPU stack*/+8/*eight more for XMM registers*/ }; // Capture info about frame layout @@ -1299,7 +1301,7 @@ nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm, // Now compute actual number of stack words we need rounding to make // stack properly aligned. - stack_slots = round_to(stack_slots, 2 * VMRegImpl::slots_per_word); + stack_slots = round_to(stack_slots, StackAlignmentInSlots); int stack_size = stack_slots * VMRegImpl::stack_slot_size; @@ -1793,7 +1795,7 @@ nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm, // reset handle block __ movptr(rcx, Address(thread, JavaThread::active_handles_offset())); - __ movptr(Address(rcx, JNIHandleBlock::top_offset_in_bytes()), (int32_t)NULL_WORD); + __ movptr(Address(rcx, JNIHandleBlock::top_offset_in_bytes()), NULL_WORD); // Any exception pending? __ cmpptr(Address(thread, in_bytes(Thread::pending_exception_offset())), (int32_t)NULL_WORD); @@ -1865,7 +1867,7 @@ nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm, // Save pending exception around call to VM (which contains an EXCEPTION_MARK) __ pushptr(Address(thread, in_bytes(Thread::pending_exception_offset()))); - __ movptr(Address(thread, in_bytes(Thread::pending_exception_offset())), (int32_t)NULL_WORD); + __ movptr(Address(thread, in_bytes(Thread::pending_exception_offset())), NULL_WORD); // should be a peal @@ -2431,7 +2433,7 @@ void SharedRuntime::generate_deopt_blob() { __ get_thread(rdi); __ movptr(rdx, Address(rdi, JavaThread::exception_pc_offset())); __ movptr(Address(rbp, wordSize), rdx); - __ movptr(Address(rdi, JavaThread::exception_pc_offset()), (int32_t)NULL_WORD); + __ movptr(Address(rdi, JavaThread::exception_pc_offset()), NULL_WORD); #ifdef ASSERT // verify that there is really an exception oop in JavaThread @@ -2489,8 +2491,8 @@ void SharedRuntime::generate_deopt_blob() { __ jcc(Assembler::notEqual, noException); __ movptr(rax, Address(rcx, JavaThread::exception_oop_offset())); __ movptr(rdx, Address(rcx, JavaThread::exception_pc_offset())); - __ movptr(Address(rcx, JavaThread::exception_oop_offset()), (int32_t)NULL_WORD); - __ movptr(Address(rcx, JavaThread::exception_pc_offset()), (int32_t)NULL_WORD); + __ movptr(Address(rcx, JavaThread::exception_oop_offset()), NULL_WORD); + __ movptr(Address(rcx, JavaThread::exception_pc_offset()), NULL_WORD); __ verify_oop(rax); @@ -2582,7 +2584,7 @@ void SharedRuntime::generate_deopt_blob() { rbx); // Make it walkable #else /* CC_INTERP */ // This value is corrected by layout_activation_impl - __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), (int32_t)NULL_WORD ); + __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), NULL_WORD); __ movptr(Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize), rbx); // Make it walkable #endif /* CC_INTERP */ __ movptr(sp_temp, rsp); // pass to next frame @@ -2802,7 +2804,7 @@ void SharedRuntime::generate_uncommon_trap_blob() { rbx); // Make it walkable #else /* CC_INTERP */ // This value is corrected by layout_activation_impl - __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), (int32_t)NULL_WORD ); + __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), NULL_WORD ); __ movptr(Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize), rbx); // Make it walkable #endif /* CC_INTERP */ __ movptr(sp_temp, rsp); // pass to next frame @@ -3020,7 +3022,7 @@ static RuntimeStub* generate_resolve_blob(address destination, const char* name) // exception pending => remove activation and forward to exception handler __ get_thread(thread); - __ movptr(Address(thread, JavaThread::vm_result_offset()), (int32_t)NULL_WORD); + __ movptr(Address(thread, JavaThread::vm_result_offset()), NULL_WORD); __ movptr(rax, Address(thread, Thread::pending_exception_offset())); __ jump(RuntimeAddress(StubRoutines::forward_exception_entry())); diff --git a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp index 26e7e148968..7fc2b6685e4 100644 --- a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp @@ -39,6 +39,8 @@ RuntimeStub* SharedRuntime::_resolve_opt_virtual_call_blob; RuntimeStub* SharedRuntime::_resolve_virtual_call_blob; RuntimeStub* SharedRuntime::_resolve_static_call_blob; +const int StackAlignmentInSlots = StackAlignmentInBytes / VMRegImpl::stack_slot_size; + #define __ masm-> class SimpleRuntimeFrame { @@ -1286,7 +1288,7 @@ nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm, // Now compute actual number of stack words we need rounding to make // stack properly aligned. - stack_slots = round_to(stack_slots, 4 * VMRegImpl::slots_per_word); + stack_slots = round_to(stack_slots, StackAlignmentInSlots); int stack_size = stack_slots * VMRegImpl::stack_slot_size; @@ -2954,10 +2956,16 @@ void SharedRuntime::generate_uncommon_trap_blob() { __ pushptr(Address(rcx, 0)); // Save return address __ enter(); // Save old & set new rbp __ subptr(rsp, rbx); // Prolog +#ifdef CC_INTERP + __ movptr(Address(rbp, + -(sizeof(BytecodeInterpreter)) + in_bytes(byte_offset_of(BytecodeInterpreter, _sender_sp))), + sender_sp); // Make it walkable +#else // CC_INTERP __ movptr(Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize), sender_sp); // Make it walkable // This value is corrected by layout_activation_impl __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), (int32_t)NULL_WORD ); +#endif // CC_INTERP __ mov(sender_sp, rsp); // Pass sender_sp to next frame __ addptr(rsi, wordSize); // Bump array pointer (sizes) __ addptr(rcx, wordSize); // Bump array pointer (pcs) diff --git a/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp b/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp index 06435cb0005..9b220e20449 100644 --- a/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp @@ -407,7 +407,7 @@ class StubGenerator: public StubCodeGenerator { __ get_thread(rcx); __ pop(rdx); __ movptr(rax, Address(rcx, Thread::pending_exception_offset())); - __ movptr(Address(rcx, Thread::pending_exception_offset()), (int32_t)NULL_WORD); + __ movptr(Address(rcx, Thread::pending_exception_offset()), NULL_WORD); #ifdef ASSERT // make sure exception is set diff --git a/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp b/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp index 33f6e88ee6d..6c2fb5694e8 100644 --- a/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp @@ -472,7 +472,7 @@ class StubGenerator: public StubCodeGenerator { // setup rax & rdx, remove return address & clear pending exception __ pop(rdx); __ movptr(rax, Address(r15_thread, Thread::pending_exception_offset())); - __ movptr(Address(r15_thread, Thread::pending_exception_offset()), (int)NULL_WORD); + __ movptr(Address(r15_thread, Thread::pending_exception_offset()), (int32_t)NULL_WORD); #ifdef ASSERT // make sure exception is set @@ -954,9 +954,9 @@ class StubGenerator: public StubCodeGenerator { __ jcc(Assembler::zero, exit); // if obj is NULL it is OK // Check if the oop is in the right area of memory __ movptr(c_rarg2, rax); - __ movptr(c_rarg3, (int64_t) Universe::verify_oop_mask()); + __ movptr(c_rarg3, (intptr_t) Universe::verify_oop_mask()); __ andptr(c_rarg2, c_rarg3); - __ movptr(c_rarg3, (int64_t) Universe::verify_oop_bits()); + __ movptr(c_rarg3, (intptr_t) Universe::verify_oop_bits()); __ cmpptr(c_rarg2, c_rarg3); __ jcc(Assembler::notZero, error); @@ -969,9 +969,9 @@ class StubGenerator: public StubCodeGenerator { __ jcc(Assembler::zero, error); // if klass is NULL it is broken // Check if the klass is in the right area of memory __ mov(c_rarg2, rax); - __ movptr(c_rarg3, (int64_t) Universe::verify_klass_mask()); + __ movptr(c_rarg3, (intptr_t) Universe::verify_klass_mask()); __ andptr(c_rarg2, c_rarg3); - __ movptr(c_rarg3, (int64_t) Universe::verify_klass_bits()); + __ movptr(c_rarg3, (intptr_t) Universe::verify_klass_bits()); __ cmpptr(c_rarg2, c_rarg3); __ jcc(Assembler::notZero, error); @@ -980,9 +980,9 @@ class StubGenerator: public StubCodeGenerator { __ testptr(rax, rax); __ jcc(Assembler::zero, error); // if klass' klass is NULL it is broken // Check if the klass' klass is in the right area of memory - __ movptr(c_rarg3, (int64_t) Universe::verify_klass_mask()); + __ movptr(c_rarg3, (intptr_t) Universe::verify_klass_mask()); __ andptr(rax, c_rarg3); - __ movptr(c_rarg3, (int64_t) Universe::verify_klass_bits()); + __ movptr(c_rarg3, (intptr_t) Universe::verify_klass_bits()); __ cmpptr(rax, c_rarg3); __ jcc(Assembler::notZero, error); diff --git a/hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp b/hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp index ca186af69a1..ed40fb70124 100644 --- a/hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp @@ -110,7 +110,7 @@ address TemplateInterpreterGenerator::generate_exception_handler_common(const ch if (message != NULL) { __ lea(rbx, ExternalAddress((address)message)); } else { - __ movptr(rbx, (int32_t)NULL_WORD); + __ movptr(rbx, NULL_WORD); } __ call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::create_exception), rax, rbx); } @@ -123,7 +123,7 @@ address TemplateInterpreterGenerator::generate_exception_handler_common(const ch address TemplateInterpreterGenerator::generate_continuation_for(TosState state) { address entry = __ pc(); // NULL last_sp until next java call - __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), (int32_t)NULL_WORD); + __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), NULL_WORD); __ dispatch_next(state); return entry; } @@ -176,7 +176,7 @@ address TemplateInterpreterGenerator::generate_return_entry_for(TosState state, // Restore stack bottom in case i2c adjusted stack __ movptr(rsp, Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize)); // and NULL it as marker that rsp is now tos until next java call - __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), (int32_t)NULL_WORD); + __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), NULL_WORD); __ restore_bcp(); __ restore_locals(); @@ -211,7 +211,7 @@ address TemplateInterpreterGenerator::generate_deopt_entry_for(TosState state, i // The stack is not extended by deopt but we must NULL last_sp as this // entry is like a "return". - __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), (int32_t)NULL_WORD); + __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), NULL_WORD); __ restore_bcp(); __ restore_locals(); // handle exceptions @@ -382,7 +382,7 @@ void InterpreterGenerator::generate_counter_overflow(Label* do_continue) { // indicating if the counter overflow occurs at a backwards branch (non-NULL bcp). // The call returns the address of the verified entry point for the method or NULL // if the compilation did not complete (either went background or bailed out). - __ movptr(rax, (int32_t)false); + __ movptr(rax, (intptr_t)false); __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::frequency_counter_overflow), rax); __ movptr(rbx, Address(rbp, method_offset)); // restore methodOop @@ -1028,7 +1028,7 @@ address InterpreterGenerator::generate_native_entry(bool synchronized) { // reset handle block __ movptr(t, Address(thread, JavaThread::active_handles_offset())); - __ movptr(Address(t, JNIHandleBlock::top_offset_in_bytes()), (int32_t)NULL_WORD); + __ movptr(Address(t, JNIHandleBlock::top_offset_in_bytes()), NULL_WORD); // If result was an oop then unbox and save it in the frame { Label L; @@ -1488,7 +1488,7 @@ void TemplateInterpreterGenerator::generate_throw_exception() { // Restore sp to interpreter_frame_last_sp even though we are going // to empty the expression stack for the exception processing. - __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), (int32_t)NULL_WORD); + __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), NULL_WORD); // rax,: exception // rdx: return address/pc that threw exception __ restore_bcp(); // rsi points to call/send @@ -1608,7 +1608,7 @@ void TemplateInterpreterGenerator::generate_throw_exception() { __ reset_last_Java_frame(rcx, true, true); // Restore the last_sp and null it out __ movptr(rsp, Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize)); - __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), (int32_t)NULL_WORD); + __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), NULL_WORD); __ restore_bcp(); __ restore_locals(); @@ -1636,7 +1636,7 @@ void TemplateInterpreterGenerator::generate_throw_exception() { // restore exception __ get_thread(rcx); __ movptr(rax, Address(rcx, JavaThread::vm_result_offset())); - __ movptr(Address(rcx, JavaThread::vm_result_offset()), (int32_t)NULL_WORD); + __ movptr(Address(rcx, JavaThread::vm_result_offset()), NULL_WORD); __ verify_oop(rax); // Inbetween activations - previous activation type unknown yet diff --git a/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp b/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp index 5acd696b2b0..13242651c7e 100644 --- a/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp @@ -137,7 +137,7 @@ static void do_oop_store(InterpreterMacroAssembler* _masm, // Do the actual store // noreg means NULL if (val == noreg) { - __ movl(Address(rdx, 0), NULL_WORD); + __ movptr(Address(rdx, 0), NULL_WORD); // No post barrier for NULL } else { __ movl(Address(rdx, 0), val); @@ -152,7 +152,7 @@ static void do_oop_store(InterpreterMacroAssembler* _masm, case BarrierSet::CardTableExtension: { if (val == noreg) { - __ movl(obj, NULL_WORD); + __ movptr(obj, NULL_WORD); } else { __ movl(obj, val); // flatten object address if needed @@ -168,7 +168,7 @@ static void do_oop_store(InterpreterMacroAssembler* _masm, case BarrierSet::ModRef: case BarrierSet::Other: if (val == noreg) { - __ movl(obj, NULL_WORD); + __ movptr(obj, NULL_WORD); } else { __ movl(obj, val); } diff --git a/hotspot/src/cpu/x86/vm/x86_32.ad b/hotspot/src/cpu/x86/vm/x86_32.ad index 5f6f8724adb..edc6a63e79f 100644 --- a/hotspot/src/cpu/x86/vm/x86_32.ad +++ b/hotspot/src/cpu/x86/vm/x86_32.ad @@ -3371,7 +3371,7 @@ encode %{ masm.movptr(Address(boxReg, 0), 3) ; // results in ST-before-CAS penalty masm.get_thread (scrReg) ; masm.movptr(boxReg, tmpReg); // consider: LEA box, [tmp-2] - masm.movptr(tmpReg, 0); // consider: xor vs mov + masm.movptr(tmpReg, NULL_WORD); // consider: xor vs mov if (os::is_MP()) { masm.lock(); } masm.cmpxchgptr(scrReg, Address(boxReg, ObjectMonitor::owner_offset_in_bytes()-2)) ; } else @@ -3387,7 +3387,7 @@ encode %{ if ((EmitSync & 64) == 0) { // Optimistic form: consider XORL tmpReg,tmpReg - masm.movptr(tmpReg, 0 ) ; + masm.movptr(tmpReg, NULL_WORD) ; } else { // Can suffer RTS->RTO upgrades on shared or cold $ lines // Test-And-CAS instead of CAS @@ -3587,7 +3587,7 @@ encode %{ masm.orptr(boxReg, Address (tmpReg, ObjectMonitor::EntryList_offset_in_bytes()-2)) ; masm.orptr(boxReg, Address (tmpReg, ObjectMonitor::cxq_offset_in_bytes()-2)) ; masm.jccb (Assembler::notZero, DONE_LABEL) ; - masm.movptr(Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2), 0) ; + masm.movptr(Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2), NULL_WORD) ; masm.jmpb (DONE_LABEL) ; } else { masm.xorptr(boxReg, Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2)) ; @@ -3596,7 +3596,7 @@ encode %{ masm.movptr(boxReg, Address (tmpReg, ObjectMonitor::EntryList_offset_in_bytes()-2)) ; masm.orptr(boxReg, Address (tmpReg, ObjectMonitor::cxq_offset_in_bytes()-2)) ; masm.jccb (Assembler::notZero, CheckSucc) ; - masm.movptr(Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2), 0) ; + masm.movptr(Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2), NULL_WORD) ; masm.jmpb (DONE_LABEL) ; } @@ -3644,7 +3644,7 @@ encode %{ // We currently use (3), although it's likely that switching to (2) // is correct for the future. - masm.movptr(Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2), 0) ; + masm.movptr(Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2), NULL_WORD) ; if (os::is_MP()) { if (VM_Version::supports_sse2() && 1 == FenceInstruction) { masm.mfence(); @@ -6413,9 +6413,9 @@ instruct loadUB(xRegI dst, memory mem, immI_255 bytemask) %{ ins_pipe( ialu_reg_mem ); %} -// Load Char (16bit unsigned) -instruct loadC(eRegI dst, memory mem) %{ - match(Set dst (LoadC mem)); +// Load Unsigned Short/Char (16bit unsigned) +instruct loadUS(eRegI dst, memory mem) %{ + match(Set dst (LoadUS mem)); ins_cost(125); format %{ "MOVZX $dst,$mem" %} diff --git a/hotspot/src/cpu/x86/vm/x86_64.ad b/hotspot/src/cpu/x86/vm/x86_64.ad index 9b5621f3903..ad4f03b23a3 100644 --- a/hotspot/src/cpu/x86/vm/x86_64.ad +++ b/hotspot/src/cpu/x86/vm/x86_64.ad @@ -6096,25 +6096,25 @@ instruct loadS(rRegI dst, memory mem) // ins_pipe(ialu_reg_mem); // %} -// Load Char (16 bit UNsigned) -instruct loadC(rRegI dst, memory mem) +// Load Unsigned Short/Char (16 bit UNsigned) +instruct loadUS(rRegI dst, memory mem) %{ - match(Set dst (LoadC mem)); + match(Set dst (LoadUS mem)); ins_cost(125); - format %{ "movzwl $dst, $mem\t# char" %} + format %{ "movzwl $dst, $mem\t# ushort/char" %} opcode(0x0F, 0xB7); ins_encode(REX_reg_mem(dst, mem), OpcP, OpcS, reg_mem(dst, mem)); ins_pipe(ialu_reg_mem); %} -// Load Char (16 bit UNsigned) into long -// instruct loadC2L(rRegL dst, memory mem) +// Load Unsigned Short/Char (16 bit UNsigned) into long +// instruct loadUS2L(rRegL dst, memory mem) // %{ -// match(Set dst (ConvI2L (LoadC mem))); +// match(Set dst (ConvI2L (LoadUS mem))); // ins_cost(125); -// format %{ "movzwl $dst, $mem\t# char -> long" %} +// format %{ "movzwl $dst, $mem\t# ushort/char -> long" %} // opcode(0x0F, 0xB7); // ins_encode(REX_reg_mem(dst, mem), OpcP, OpcS, reg_mem(dst, mem)); // ins_pipe(ialu_reg_mem); @@ -9490,14 +9490,14 @@ instruct andL_rReg_imm255(rRegL dst, immL_255 src) %{ match(Set dst (AndL dst src)); - format %{ "movzbq $dst, $src\t# long & 0xFF" %} + format %{ "movzbq $dst, $dst\t# long & 0xFF" %} opcode(0x0F, 0xB6); ins_encode(REX_reg_reg_wide(dst, dst), OpcP, OpcS, reg_reg(dst, dst)); ins_pipe(ialu_reg); %} // And Register with Immediate 65535 -instruct andL_rReg_imm65535(rRegI dst, immL_65535 src) +instruct andL_rReg_imm65535(rRegL dst, immL_65535 src) %{ match(Set dst (AndL dst src)); diff --git a/hotspot/src/os/linux/vm/os_linux.cpp b/hotspot/src/os/linux/vm/os_linux.cpp index 3b8c0b4dc03..846906951d4 100644 --- a/hotspot/src/os/linux/vm/os_linux.cpp +++ b/hotspot/src/os/linux/vm/os_linux.cpp @@ -279,7 +279,11 @@ void os::init_system_properties_values() { * ... * 7: The default directories, normally /lib and /usr/lib. */ +#if defined(AMD64) || defined(_LP64) && (defined(SPARC) || defined(PPC) || defined(S390)) +#define DEFAULT_LIBPATH "/usr/lib64:/lib64:/lib:/usr/lib" +#else #define DEFAULT_LIBPATH "/lib:/usr/lib" +#endif #define EXTENSIONS_DIR "/lib/ext" #define ENDORSED_DIR "/lib/endorsed" @@ -1160,7 +1164,10 @@ void os::Linux::capture_initial_stack(size_t max_size) { /* 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 */ /* 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 */ - i = sscanf(s, "%c %d %d %d %d %d %lu %lu %lu %lu %lu %lu %lu %ld %ld %ld %ld %ld %ld %lu %lu %ld %lu %lu %lu %lu", + i = sscanf(s, "%c %d %d %d %d %d %lu %lu %lu %lu %lu %lu %lu %ld %ld %ld %ld %ld %ld " + UINTX_FORMAT UINTX_FORMAT UINTX_FORMAT + " %lu " + UINTX_FORMAT UINTX_FORMAT UINTX_FORMAT, &state, /* 3 %c */ &ppid, /* 4 %d */ &pgrp, /* 5 %d */ @@ -1180,13 +1187,13 @@ void os::Linux::capture_initial_stack(size_t max_size) { &nice, /* 19 %ld */ &junk, /* 20 %ld */ &it_real, /* 21 %ld */ - &start, /* 22 %lu */ - &vsize, /* 23 %lu */ - &rss, /* 24 %ld */ + &start, /* 22 UINTX_FORMAT */ + &vsize, /* 23 UINTX_FORMAT */ + &rss, /* 24 UINTX_FORMAT */ &rsslim, /* 25 %lu */ - &scodes, /* 26 %lu */ - &ecode, /* 27 %lu */ - &stack_start); /* 28 %lu */ + &scodes, /* 26 UINTX_FORMAT */ + &ecode, /* 27 UINTX_FORMAT */ + &stack_start); /* 28 UINTX_FORMAT */ } if (i != 28 - 2) { @@ -1425,6 +1432,10 @@ char * os::local_time_string(char *buf, size_t buflen) { return buf; } +struct tm* os::localtime_pd(const time_t* clock, struct tm* res) { + return localtime_r(clock, res); +} + //////////////////////////////////////////////////////////////////////////////// // runtime exit support @@ -2024,7 +2035,8 @@ void os::jvm_path(char *buf, jint len) { CAST_FROM_FN_PTR(address, os::jvm_path), dli_fname, sizeof(dli_fname), NULL); assert(ret != 0, "cannot locate libjvm"); - realpath(dli_fname, buf); + if (realpath(dli_fname, buf) == NULL) + return; if (strcmp(Arguments::sun_java_launcher(), "gamma") == 0) { // Support for the gamma launcher. Typical value for buf is @@ -2048,7 +2060,8 @@ void os::jvm_path(char *buf, jint len) { assert(strstr(p, "/libjvm") == p, "invalid library name"); p = strstr(p, "_g") ? "_g" : ""; - realpath(java_home_var, buf); + if (realpath(java_home_var, buf) == NULL) + return; sprintf(buf + strlen(buf), "/jre/lib/%s", cpu_arch); if (0 == access(buf, F_OK)) { // Use current module name "libjvm[_g].so" instead of @@ -2059,7 +2072,8 @@ void os::jvm_path(char *buf, jint len) { sprintf(buf + strlen(buf), "/hotspot/libjvm%s.so", p); } else { // Go back to path of .so - realpath(dli_fname, buf); + if (realpath(dli_fname, buf) == NULL) + return; } } } @@ -4184,11 +4198,11 @@ static jlong slow_thread_cpu_time(Thread *thread, bool user_sys_cpu_time) { // Skip blank chars do s++; while (isspace(*s)); - count = sscanf(s,"%c %d %d %d %d %d %lu %lu %lu %lu %lu %lu %lu", - &idummy, &idummy, &idummy, &idummy, &idummy, &idummy, + count = sscanf(s,"%*c %d %d %d %d %d %lu %lu %lu %lu %lu %lu %lu", + &idummy, &idummy, &idummy, &idummy, &idummy, &ldummy, &ldummy, &ldummy, &ldummy, &ldummy, &user_time, &sys_time); - if ( count != 13 ) return -1; + if ( count != 12 ) return -1; if (user_sys_cpu_time) { return ((jlong)sys_time + (jlong)user_time) * (1000000000 / clock_tics_per_sec); } else { diff --git a/hotspot/src/os/solaris/vm/os_solaris.cpp b/hotspot/src/os/solaris/vm/os_solaris.cpp index f74967ab079..c5c83883f48 100644 --- a/hotspot/src/os/solaris/vm/os_solaris.cpp +++ b/hotspot/src/os/solaris/vm/os_solaris.cpp @@ -323,6 +323,10 @@ size_t os::current_stack_size() { return (size_t)(base - bottom); } +struct tm* os::localtime_pd(const time_t* clock, struct tm* res) { + return localtime_r(clock, res); +} + // interruptible infrastructure // setup_interruptible saves the thread state before going into an diff --git a/hotspot/src/os/windows/vm/os_windows.cpp b/hotspot/src/os/windows/vm/os_windows.cpp index d674d434b90..dce602e8ecb 100644 --- a/hotspot/src/os/windows/vm/os_windows.cpp +++ b/hotspot/src/os/windows/vm/os_windows.cpp @@ -327,6 +327,14 @@ size_t os::current_stack_size() { return sz; } +struct tm* os::localtime_pd(const time_t* clock, struct tm* res) { + const struct tm* time_struct_ptr = localtime(clock); + if (time_struct_ptr != NULL) { + *res = *time_struct_ptr; + return res; + } + return NULL; +} LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo); diff --git a/hotspot/src/share/vm/adlc/dict2.cpp b/hotspot/src/share/vm/adlc/dict2.cpp index 640fad4af11..f46693fd06c 100644 --- a/hotspot/src/share/vm/adlc/dict2.cpp +++ b/hotspot/src/share/vm/adlc/dict2.cpp @@ -316,9 +316,12 @@ int cmpstr(const void *k1, const void *k2) { return strcmp((const char *)k1,(const char *)k2); } -// Slimey cheap key comparator. +// Cheap key comparator. int cmpkey(const void *key1, const void *key2) { - return (int)((intptr_t)key1 - (intptr_t)key2); + if (key1 == key2) return 0; + intptr_t delta = (intptr_t)key1 - (intptr_t)key2; + if (delta > 0) return 1; + return -1; } //============================================================================= diff --git a/hotspot/src/share/vm/adlc/forms.cpp b/hotspot/src/share/vm/adlc/forms.cpp index e2083c68259..cfcfd0a36d8 100644 --- a/hotspot/src/share/vm/adlc/forms.cpp +++ b/hotspot/src/share/vm/adlc/forms.cpp @@ -248,7 +248,7 @@ Form::DataType Form::ideal_to_Reg_type(const char *name) const { // True if 'opType', an ideal name, loads or stores. Form::DataType Form::is_load_from_memory(const char *opType) const { if( strcmp(opType,"LoadB")==0 ) return Form::idealB; - if( strcmp(opType,"LoadC")==0 ) return Form::idealC; + if( strcmp(opType,"LoadUS")==0 ) return Form::idealC; if( strcmp(opType,"LoadD")==0 ) return Form::idealD; if( strcmp(opType,"LoadD_unaligned")==0 ) return Form::idealD; if( strcmp(opType,"LoadF")==0 ) return Form::idealF; diff --git a/hotspot/src/share/vm/adlc/formssel.cpp b/hotspot/src/share/vm/adlc/formssel.cpp index 65b511bcdb1..c265c1d04c7 100644 --- a/hotspot/src/share/vm/adlc/formssel.cpp +++ b/hotspot/src/share/vm/adlc/formssel.cpp @@ -3314,7 +3314,7 @@ int MatchNode::needs_ideal_memory_edge(FormDict &globals) const { "StoreI","StoreL","StoreP","StoreN","StoreD","StoreF" , "StoreB","StoreC","Store" ,"StoreFP", "LoadI" ,"LoadL", "LoadP" ,"LoadN", "LoadD" ,"LoadF" , - "LoadB" ,"LoadC" ,"LoadS" ,"Load" , + "LoadB" ,"LoadUS" ,"LoadS" ,"Load" , "Store4I","Store2I","Store2L","Store2D","Store4F","Store2F","Store16B", "Store8B","Store4B","Store8C","Store4C","Store2C", "Load4I" ,"Load2I" ,"Load2L" ,"Load2D" ,"Load4F" ,"Load2F" ,"Load16B" , diff --git a/hotspot/src/share/vm/asm/codeBuffer.cpp b/hotspot/src/share/vm/asm/codeBuffer.cpp index cbd16d3e8b3..7ae4a13232a 100644 --- a/hotspot/src/share/vm/asm/codeBuffer.cpp +++ b/hotspot/src/share/vm/asm/codeBuffer.cpp @@ -123,6 +123,10 @@ CodeBuffer::~CodeBuffer() { // addresses constructed before expansions will not be confused. cb->free_blob(); } + + // free any overflow storage + delete _overflow_arena; + #ifdef ASSERT Copy::fill_to_bytes(this, sizeof(*this), badResourceValue); #endif diff --git a/hotspot/src/share/vm/classfile/classFileParser.cpp b/hotspot/src/share/vm/classfile/classFileParser.cpp index 703217f9255..4f8ec88f866 100644 --- a/hotspot/src/share/vm/classfile/classFileParser.cpp +++ b/hotspot/src/share/vm/classfile/classFileParser.cpp @@ -232,7 +232,9 @@ constantPoolHandle ClassFileParser::parse_constant_pool(TRAPS) { length >= 1, "Illegal constant pool size %u in class file %s", length, CHECK_(nullHandle)); constantPoolOop constant_pool = - oopFactory::new_constantPool(length, CHECK_(nullHandle)); + oopFactory::new_constantPool(length, + methodOopDesc::IsSafeConc, + CHECK_(nullHandle)); constantPoolHandle cp (THREAD, constant_pool); cp->set_partially_loaded(); // Enables heap verify to work on partial constantPoolOops @@ -1675,7 +1677,8 @@ methodHandle ClassFileParser::parse_method(constantPoolHandle cp, bool is_interf // All sizing information for a methodOop is finally available, now create it methodOop m_oop = oopFactory::new_method( code_length, access_flags, linenumber_table_length, - total_lvt_length, checked_exceptions_length, CHECK_(nullHandle)); + total_lvt_length, checked_exceptions_length, + methodOopDesc::IsSafeConc, CHECK_(nullHandle)); methodHandle m (THREAD, m_oop); ClassLoadingService::add_class_method_size(m_oop->size()*HeapWordSize); diff --git a/hotspot/src/share/vm/classfile/javaClasses.cpp b/hotspot/src/share/vm/classfile/javaClasses.cpp index ea68a366740..385e6a16e7f 100644 --- a/hotspot/src/share/vm/classfile/javaClasses.cpp +++ b/hotspot/src/share/vm/classfile/javaClasses.cpp @@ -441,6 +441,7 @@ oop java_lang_Class::primitive_mirror(BasicType t) { bool java_lang_Class::offsets_computed = false; int java_lang_Class::classRedefinedCount_offset = -1; +int java_lang_Class::parallelCapable_offset = -1; void java_lang_Class::compute_offsets() { assert(!offsets_computed, "offsets should be initialized only once"); @@ -451,6 +452,23 @@ void java_lang_Class::compute_offsets() { // so don't go fatal. compute_optional_offset(classRedefinedCount_offset, k, vmSymbols::classRedefinedCount_name(), vmSymbols::int_signature()); + + // The field indicating parallelCapable (parallelLockMap) is only present starting in 7, + klassOop k1 = SystemDictionary::classloader_klass(); + compute_optional_offset(parallelCapable_offset, + k1, vmSymbols::parallelCapable_name(), vmSymbols::concurrenthashmap_signature()); +} + +// For class loader classes, parallelCapable defined +// based on non-null field +// Written to by java.lang.ClassLoader, vm only reads this field, doesn't set it +bool java_lang_Class::parallelCapable(oop class_loader) { + if (!JDK_Version::is_gte_jdk17x_version() + || parallelCapable_offset == -1) { + // Default for backward compatibility is false + return false; + } + return (class_loader->obj_field(parallelCapable_offset) != NULL); } int java_lang_Class::classRedefinedCount(oop the_class_mirror) { @@ -866,7 +884,7 @@ char* java_lang_Throwable::print_stack_element_to_buffer(methodOop method, int b } nmethod* nm = method->code(); if (WizardMode && nm != NULL) { - sprintf(buf + (int)strlen(buf), "(nmethod %#x)", nm); + sprintf(buf + (int)strlen(buf), "(nmethod " PTR_FORMAT ")", (intptr_t)nm); } } diff --git a/hotspot/src/share/vm/classfile/javaClasses.hpp b/hotspot/src/share/vm/classfile/javaClasses.hpp index 933d5b82d83..612a0013562 100644 --- a/hotspot/src/share/vm/classfile/javaClasses.hpp +++ b/hotspot/src/share/vm/classfile/javaClasses.hpp @@ -141,6 +141,7 @@ class java_lang_Class : AllStatic { static void compute_offsets(); static bool offsets_computed; static int classRedefinedCount_offset; + static int parallelCapable_offset; public: // Instance creation @@ -168,6 +169,8 @@ class java_lang_Class : AllStatic { // Support for classRedefinedCount field static int classRedefinedCount(oop the_class_mirror); static void set_classRedefinedCount(oop the_class_mirror, int value); + // Support for parallelCapable field + static bool parallelCapable(oop the_class_mirror); // Debugging friend class JavaClasses; friend class instanceKlass; // verification code accesses offsets diff --git a/hotspot/src/share/vm/classfile/systemDictionary.cpp b/hotspot/src/share/vm/classfile/systemDictionary.cpp index 0908e1c8785..9ab749afb3e 100644 --- a/hotspot/src/share/vm/classfile/systemDictionary.cpp +++ b/hotspot/src/share/vm/classfile/systemDictionary.cpp @@ -89,6 +89,14 @@ bool SystemDictionary::is_internal_format(symbolHandle class_name) { #endif +// ---------------------------------------------------------------------------- +// Parallel class loading check + +bool SystemDictionary::is_parallelCapable(Handle class_loader) { + if (UnsyncloadClass || class_loader.is_null()) return true; + if (AlwaysLockClassLoader) return false; + return java_lang_Class::parallelCapable(class_loader()); +} // ---------------------------------------------------------------------------- // Resolving of classes @@ -196,7 +204,8 @@ klassOop SystemDictionary::resolve_array_class_or_null(symbolHandle class_name, // super-class callers: // ClassFileParser - for defineClass & jvmtiRedefineClasses // load_shared_class - while loading a class from shared archive -// resolve_instance_class_or_fail: +// resolve_instance_class_or_null: +// via: handle_parallel_super_load // when resolving a class that has an existing placeholder with // a saved superclass [i.e. a defineClass is currently in progress] // if another thread is trying to resolve the class, it must do @@ -283,12 +292,9 @@ klassOop SystemDictionary::resolve_super_or_fail(symbolHandle child_name, if (probe && probe->check_seen_thread(THREAD, PlaceholderTable::LOAD_SUPER)) { throw_circularity_error = true; } - - // add placeholder entry even if error - callers will remove on error + } + if (!throw_circularity_error) { PlaceholderEntry* newprobe = placeholders()->find_and_add(p_index, p_hash, child_name, class_loader, PlaceholderTable::LOAD_SUPER, class_name, THREAD); - if (throw_circularity_error) { - newprobe->remove_seen_thread(THREAD, PlaceholderTable::LOAD_SUPER); - } } } if (throw_circularity_error) { @@ -325,7 +331,6 @@ klassOop SystemDictionary::resolve_super_or_fail(symbolHandle child_name, return superk_h(); } - void SystemDictionary::validate_protection_domain(instanceKlassHandle klass, Handle class_loader, Handle protection_domain, @@ -421,7 +426,7 @@ void SystemDictionary::double_lock_wait(Handle lockObject, TRAPS) { bool calledholdinglock = ObjectSynchronizer::current_thread_holds_lock((JavaThread*)THREAD, lockObject); assert(calledholdinglock,"must hold lock for notify"); - assert(!UnsyncloadClass, "unexpected double_lock_wait"); + assert((!(lockObject() == _system_loader_lock_obj) && !is_parallelCapable(lockObject)), "unexpected double_lock_wait"); ObjectSynchronizer::notifyall(lockObject, THREAD); intptr_t recursions = ObjectSynchronizer::complete_exit(lockObject, THREAD); SystemDictionary_lock->wait(); @@ -439,7 +444,7 @@ void SystemDictionary::double_lock_wait(Handle lockObject, TRAPS) { // even in non-circularity situations. // Note: only one thread can define the class, but multiple can resolve // Note: must call resolve_super_or_fail even if null super - -// to force placeholder entry creation for this class +// to force placeholder entry creation for this class for circularity detection // Caller must check for pending exception // Returns non-null klassOop if other thread has completed load // and we are done, @@ -477,9 +482,9 @@ instanceKlassHandle SystemDictionary::handle_parallel_super_load( SystemDictionary_lock->notify_all(); } - // UnsyncloadClass does NOT wait for parallel superclass loads to complete - // Bootstrap classloader does wait for parallel superclass loads - if (UnsyncloadClass) { + // parallelCapable class loaders do NOT wait for parallel superclass loads to complete + // Serial class loaders and bootstrap classloader do wait for superclass loads + if (!class_loader.is_null() && is_parallelCapable(class_loader)) { MutexLocker mu(SystemDictionary_lock, THREAD); // Check if classloading completed while we were loading superclass or waiting klassOop check = find_class(d_index, d_hash, name, class_loader); @@ -566,10 +571,10 @@ klassOop SystemDictionary::resolve_instance_class_or_null(symbolHandle class_nam // This lock must be acquired here so the waiter will find // any successful result in the SystemDictionary and not attempt // the define - // Classloaders that support parallelism, e.g. bootstrap classloader, + // ParallelCapable Classloaders and the bootstrap classloader, // or all classloaders with UnsyncloadClass do not acquire lock here bool DoObjectLock = true; - if (UnsyncloadClass || (class_loader.is_null())) { + if (is_parallelCapable(class_loader)) { DoObjectLock = false; } @@ -627,6 +632,9 @@ klassOop SystemDictionary::resolve_instance_class_or_null(symbolHandle class_nam // Five cases: // All cases need to prevent modifying bootclasssearchpath // in parallel with a classload of same classname + // Redefineclasses uses existence of the placeholder for the duration + // of the class load to prevent concurrent redefinition of not completely + // defined classes. // case 1. traditional classloaders that rely on the classloader object lock // - no other need for LOAD_INSTANCE // case 2. traditional classloaders that break the classloader object lock @@ -642,12 +650,13 @@ klassOop SystemDictionary::resolve_instance_class_or_null(symbolHandle class_nam // This classloader supports parallelism at the classloader level, // but only allows a single load of a class/classloader pair. // No performance benefit and no deadlock issues. - // case 5. Future: parallel user level classloaders - without objectLocker + // case 5. parallelCapable user level classloaders - without objectLocker + // Allow parallel classloading of a class/classloader pair symbolHandle nullsymbolHandle; bool throw_circularity_error = false; { MutexLocker mu(SystemDictionary_lock, THREAD); - if (!UnsyncloadClass) { + if (class_loader.is_null() || !is_parallelCapable(class_loader)) { PlaceholderEntry* oldprobe = placeholders()->get_entry(p_index, p_hash, name, class_loader); if (oldprobe) { // only need check_seen_thread once, not on each loop @@ -681,25 +690,25 @@ klassOop SystemDictionary::resolve_instance_class_or_null(symbolHandle class_nam } } // All cases: add LOAD_INSTANCE - // case 3: UnsyncloadClass: allow competing threads to try + // case 3: UnsyncloadClass || case 5: parallelCapable: allow competing threads to try // LOAD_INSTANCE in parallel // add placeholder entry even if error - callers will remove on error - if (!class_has_been_loaded) { + if (!throw_circularity_error && !class_has_been_loaded) { PlaceholderEntry* newprobe = placeholders()->find_and_add(p_index, p_hash, name, class_loader, PlaceholderTable::LOAD_INSTANCE, nullsymbolHandle, THREAD); - if (throw_circularity_error) { - newprobe->remove_seen_thread(THREAD, PlaceholderTable::LOAD_INSTANCE); - } // For class loaders that do not acquire the classloader object lock, // if they did not catch another thread holding LOAD_INSTANCE, // need a check analogous to the acquire ObjectLocker/find_class // i.e. now that we hold the LOAD_INSTANCE token on loading this class/CL // one final check if the load has already completed + // class loaders holding the ObjectLock shouldn't find the class here klassOop check = find_class(d_index, d_hash, name, class_loader); if (check != NULL) { // Klass is already loaded, so just return it k = instanceKlassHandle(THREAD, check); class_has_been_loaded = true; newprobe->remove_seen_thread(THREAD, PlaceholderTable::LOAD_INSTANCE); + placeholders()->find_and_remove(p_index, p_hash, name, class_loader, THREAD); + SystemDictionary_lock->notify_all(); } } } @@ -714,18 +723,14 @@ klassOop SystemDictionary::resolve_instance_class_or_null(symbolHandle class_nam // Do actual loading k = load_instance_class(name, class_loader, THREAD); - // In custom class loaders, the usual findClass calls - // findLoadedClass, which directly searches the SystemDictionary, then - // defineClass. If these are not atomic with respect to other threads, - // the findLoadedClass can fail, but the defineClass can get a - // LinkageError:: duplicate class definition. + // For UnsyncloadClass and AllowParallelDefineClass only: // If they got a linkageError, check if a parallel class load succeeded. // If it did, then for bytecode resolution the specification requires // that we return the same result we did for the other thread, i.e. the // successfully loaded instanceKlass - // Note: Class can not be unloaded as long as any classloader refs exist // Should not get here for classloaders that support parallelism - // with the new cleaner mechanism, e.g. bootstrap classloader + // with the new cleaner mechanism + // Bootstrap goes through here to allow for an extra guarantee check if (UnsyncloadClass || (class_loader.is_null())) { if (k.is_null() && HAS_PENDING_EXCEPTION && PENDING_EXCEPTION->is_a(SystemDictionary::linkageError_klass())) { @@ -841,6 +846,12 @@ klassOop SystemDictionary::find(symbolHandle class_name, Handle protection_domain, TRAPS) { + // UseNewReflection + // The result of this call should be consistent with the result + // of the call to resolve_instance_class_or_null(). + // See evaluation 6790209 and 4474172 for more details. + class_loader = Handle(THREAD, java_lang_ClassLoader::non_reflection_class_loader(class_loader())); + unsigned int d_hash = dictionary()->compute_hash(class_name, class_loader); int d_index = dictionary()->hash_to_index(d_hash); @@ -955,10 +966,10 @@ klassOop SystemDictionary::parse_stream(symbolHandle class_name, instanceKlassHandle k = ClassFileParser(st).parseClassFile(class_name, class_loader, protection_domain, - cp_patches, parsed_name, THREAD); + // We don't redefine the class, so we just need to clean up whether there // was an error or not (don't want to modify any system dictionary // data structures). @@ -1013,11 +1024,17 @@ klassOop SystemDictionary::resolve_from_stream(symbolHandle class_name, ClassFileStream* st, TRAPS) { - // Make sure we are synchronized on the class loader before we initiate - // loading. + // Classloaders that support parallelism, e.g. bootstrap classloader, + // or all classloaders with UnsyncloadClass do not acquire lock here + bool DoObjectLock = true; + if (is_parallelCapable(class_loader)) { + DoObjectLock = false; + } + + // Make sure we are synchronized on the class loader before we proceed Handle lockObject = compute_loader_lock_object(class_loader, THREAD); check_loader_lock_contention(lockObject, THREAD); - ObjectLocker ol(lockObject, THREAD); + ObjectLocker ol(lockObject, THREAD, DoObjectLock); symbolHandle parsed_name; @@ -1069,7 +1086,13 @@ klassOop SystemDictionary::resolve_from_stream(symbolHandle class_name, "external class name format used internally"); // Add class just loaded - define_instance_class(k, THREAD); + // If a class loader supports parallel classloading handle parallel define requests + // find_or_define_instance_class may return a different instanceKlass + if (is_parallelCapable(class_loader)) { + k = find_or_define_instance_class(class_name, class_loader, k, THREAD); + } else { + define_instance_class(k, THREAD); + } } // If parsing the class file or define_instance_class failed, we @@ -1299,7 +1322,7 @@ instanceKlassHandle SystemDictionary::load_instance_class(symbolHandle class_nam } #endif // KERNEL - // find_or_define_instance_class may return a different k + // find_or_define_instance_class may return a different instanceKlass if (!k.is_null()) { k = find_or_define_instance_class(class_name, class_loader, k, CHECK_(nh)); } @@ -1316,14 +1339,24 @@ instanceKlassHandle SystemDictionary::load_instance_class(symbolHandle class_nam KlassHandle spec_klass (THREAD, SystemDictionary::classloader_klass()); - // UnsyncloadClass option means don't synchronize loadClass() calls. - // loadClassInternal() is synchronized and public loadClass(String) is not. - // This flag is for diagnostic purposes only. It is risky to call + // Call public unsynchronized loadClass(String) directly for all class loaders + // for parallelCapable class loaders. JDK >=7, loadClass(String, boolean) will + // acquire a class-name based lock rather than the class loader object lock. + // JDK < 7 already acquire the class loader lock in loadClass(String, boolean), + // so the call to loadClassInternal() was not required. + // + // UnsyncloadClass flag means both call loadClass(String) and do + // not acquire the class loader lock even for class loaders that are + // not parallelCapable. This was a risky transitional + // flag for diagnostic purposes only. It is risky to call // custom class loaders without synchronization. // WARNING If a custom class loader does NOT synchronizer findClass, or callers of - // findClass, this flag risks unexpected timing bugs in the field. + // findClass, the UnsyncloadClass flag risks unexpected timing bugs in the field. // Do NOT assume this will be supported in future releases. - if (!UnsyncloadClass && has_loadClassInternal()) { + // + // Added MustCallLoadClassInternal in case we discover in the field + // a customer that counts on this call + if (MustCallLoadClassInternal && has_loadClassInternal()) { JavaCalls::call_special(&result, class_loader, spec_klass, @@ -1365,14 +1398,17 @@ void SystemDictionary::define_instance_class(instanceKlassHandle k, TRAPS) { Handle class_loader_h(THREAD, k->class_loader()); - // for bootstrap classloader don't acquire lock - if (!class_loader_h.is_null()) { + // for bootstrap and other parallel classloaders don't acquire lock, + // use placeholder token + // If a parallelCapable class loader calls define_instance_class instead of + // find_or_define_instance_class to get here, we have a timing + // hole with systemDictionary updates and check_constraints + if (!class_loader_h.is_null() && !is_parallelCapable(class_loader_h)) { assert(ObjectSynchronizer::current_thread_holds_lock((JavaThread*)THREAD, compute_loader_lock_object(class_loader_h, THREAD)), "define called without lock"); } - // Check class-loading constraints. Throw exception if violation is detected. // Grabs and releases SystemDictionary_lock // The check_constraints/find_class call and update_dictionary sequence @@ -1427,59 +1463,63 @@ void SystemDictionary::define_instance_class(instanceKlassHandle k, TRAPS) { // Support parallel classloading // Initial implementation for bootstrap classloader -// For future: // For custom class loaders that support parallel classloading, -// in case they do not synchronize around -// FindLoadedClass/DefineClass calls, we check for parallel +// With AllowParallelDefine flag==true, in case they do not synchronize around +// FindLoadedClass/DefineClass, calls, we check for parallel // loading for them, wait if a defineClass is in progress // and return the initial requestor's results +// With AllowParallelDefine flag==false, call through to define_instance_class +// which will throw LinkageError: duplicate class definition. // For better performance, the class loaders should synchronize -// findClass(), i.e. FindLoadedClass/DefineClass or they +// findClass(), i.e. FindLoadedClass/DefineClassIfAbsent or they // potentially waste time reading and parsing the bytestream. // Note: VM callers should ensure consistency of k/class_name,class_loader instanceKlassHandle SystemDictionary::find_or_define_instance_class(symbolHandle class_name, Handle class_loader, instanceKlassHandle k, TRAPS) { instanceKlassHandle nh = instanceKlassHandle(); // null Handle + symbolHandle name_h(THREAD, k->name()); // passed in class_name may be null - unsigned int d_hash = dictionary()->compute_hash(class_name, class_loader); + unsigned int d_hash = dictionary()->compute_hash(name_h, class_loader); int d_index = dictionary()->hash_to_index(d_hash); // Hold SD lock around find_class and placeholder creation for DEFINE_CLASS - unsigned int p_hash = placeholders()->compute_hash(class_name, class_loader); + unsigned int p_hash = placeholders()->compute_hash(name_h, class_loader); int p_index = placeholders()->hash_to_index(p_hash); PlaceholderEntry* probe; { MutexLocker mu(SystemDictionary_lock, THREAD); // First check if class already defined - klassOop check = find_class(d_index, d_hash, class_name, class_loader); + klassOop check = find_class(d_index, d_hash, name_h, class_loader); if (check != NULL) { return(instanceKlassHandle(THREAD, check)); } // Acquire define token for this class/classloader symbolHandle nullsymbolHandle; - probe = placeholders()->find_and_add(p_index, p_hash, class_name, class_loader, PlaceholderTable::DEFINE_CLASS, nullsymbolHandle, THREAD); - // Check if another thread defining in parallel - if (probe->definer() == NULL) { - // Thread will define the class - probe->set_definer(THREAD); - } else { - // Wait for defining thread to finish and return results - while (probe->definer() != NULL) { - SystemDictionary_lock->wait(); - } - if (probe->instanceKlass() != NULL) { + probe = placeholders()->find_and_add(p_index, p_hash, name_h, class_loader, PlaceholderTable::DEFINE_CLASS, nullsymbolHandle, THREAD); + // Wait if another thread defining in parallel + // All threads wait - even those that will throw duplicate class: otherwise + // caller is surprised by LinkageError: duplicate, but findLoadedClass fails + // if other thread has not finished updating dictionary + while (probe->definer() != NULL) { + SystemDictionary_lock->wait(); + } + // Only special cases allow parallel defines and can use other thread's results + // Other cases fall through, and may run into duplicate defines + // caught by finding an entry in the SystemDictionary + if ((UnsyncloadClass || AllowParallelDefineClass) && (probe->instanceKlass() != NULL)) { probe->remove_seen_thread(THREAD, PlaceholderTable::DEFINE_CLASS); - return(instanceKlassHandle(THREAD, probe->instanceKlass())); - } else { - // If definer had an error, try again as any new thread would - probe->set_definer(THREAD); + placeholders()->find_and_remove(p_index, p_hash, name_h, class_loader, THREAD); + SystemDictionary_lock->notify_all(); #ifdef ASSERT - klassOop check = find_class(d_index, d_hash, class_name, class_loader); - assert(check == NULL, "definer missed recording success"); + klassOop check = find_class(d_index, d_hash, name_h, class_loader); + assert(check != NULL, "definer missed recording success"); #endif - } + return(instanceKlassHandle(THREAD, probe->instanceKlass())); + } else { + // This thread will define the class (even if earlier thread tried and had an error) + probe->set_definer(THREAD); } } @@ -1490,7 +1530,7 @@ instanceKlassHandle SystemDictionary::find_or_define_instance_class(symbolHandle // definer must notify any waiting threads { MutexLocker mu(SystemDictionary_lock, THREAD); - PlaceholderEntry* probe = placeholders()->get_entry(p_index, p_hash, class_name, class_loader); + PlaceholderEntry* probe = placeholders()->get_entry(p_index, p_hash, name_h, class_loader); assert(probe != NULL, "DEFINE_CLASS placeholder lost?"); if (probe != NULL) { if (HAS_PENDING_EXCEPTION) { @@ -1501,6 +1541,7 @@ instanceKlassHandle SystemDictionary::find_or_define_instance_class(symbolHandle } probe->set_definer(NULL); probe->remove_seen_thread(THREAD, PlaceholderTable::DEFINE_CLASS); + placeholders()->find_and_remove(p_index, p_hash, name_h, class_loader, THREAD); SystemDictionary_lock->notify_all(); } } @@ -1512,7 +1553,6 @@ instanceKlassHandle SystemDictionary::find_or_define_instance_class(symbolHandle return k; } - Handle SystemDictionary::compute_loader_lock_object(Handle class_loader, TRAPS) { // If class_loader is NULL we synchronize on _system_loader_lock_obj if (class_loader.is_null()) { @@ -1902,11 +1942,11 @@ void SystemDictionary::initialize_preloaded_classes(TRAPS) { warning("Cannot find sun/jkernel/DownloadManager"); } #endif // KERNEL + { // Compute whether we should use loadClass or loadClassInternal when loading classes. methodOop method = instanceKlass::cast(classloader_klass())->find_method(vmSymbols::loadClassInternal_name(), vmSymbols::string_class_signature()); _has_loadClassInternal = (method != NULL); } - { // Compute whether we should use checkPackageAccess or NOT methodOop method = instanceKlass::cast(classloader_klass())->find_method(vmSymbols::checkPackageAccess_name(), vmSymbols::class_protectiondomain_signature()); _has_checkPackageAccess = (method != NULL); diff --git a/hotspot/src/share/vm/classfile/systemDictionary.hpp b/hotspot/src/share/vm/classfile/systemDictionary.hpp index beade180fcd..38abf2d3c0a 100644 --- a/hotspot/src/share/vm/classfile/systemDictionary.hpp +++ b/hotspot/src/share/vm/classfile/systemDictionary.hpp @@ -526,6 +526,7 @@ private: static instanceKlassHandle load_instance_class(symbolHandle class_name, Handle class_loader, TRAPS); static Handle compute_loader_lock_object(Handle class_loader, TRAPS); static void check_loader_lock_contention(Handle loader_lock, TRAPS); + static bool is_parallelCapable(Handle class_loader); static klassOop find_shared_class(symbolHandle class_name); diff --git a/hotspot/src/share/vm/classfile/vmSymbols.hpp b/hotspot/src/share/vm/classfile/vmSymbols.hpp index 6a5a796d010..8379af9c414 100644 --- a/hotspot/src/share/vm/classfile/vmSymbols.hpp +++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp @@ -362,6 +362,7 @@ template(class_signature, "Ljava/lang/Class;") \ template(string_signature, "Ljava/lang/String;") \ template(reference_signature, "Ljava/lang/ref/Reference;") \ + template(concurrenthashmap_signature, "Ljava/util/concurrent/ConcurrentHashMap;") \ /* signature symbols needed by intrinsics */ \ VM_INTRINSICS_DO(VM_INTRINSIC_IGNORE, VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, template, VM_ALIAS_IGNORE) \ \ @@ -374,6 +375,9 @@ /* used by ClassFormatError when class name is not known yet */ \ template(unknown_class_name, "") \ \ + /* used to identify class loaders handling parallel class loading */ \ + template(parallelCapable_name, "parallelLockMap;") \ + \ /* JVM monitoring and management support */ \ template(java_lang_StackTraceElement_array, "[Ljava/lang/StackTraceElement;") \ template(java_lang_management_ThreadState, "java/lang/management/ThreadState") \ diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp index 4b1fecd7cb3..6c6272a2f84 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp @@ -706,6 +706,30 @@ void CompactibleFreeListSpace::object_iterate(ObjectClosure* blk) { } } +// Apply the given closure to each live object in the space +// The usage of CompactibleFreeListSpace +// by the ConcurrentMarkSweepGeneration for concurrent GC's allows +// objects in the space with references to objects that are no longer +// valid. For example, an object may reference another object +// that has already been sweep up (collected). This method uses +// obj_is_alive() to determine whether it is safe to apply the closure to +// an object. See obj_is_alive() for details on how liveness of an +// object is decided. + +void CompactibleFreeListSpace::safe_object_iterate(ObjectClosure* blk) { + assert_lock_strong(freelistLock()); + NOT_PRODUCT(verify_objects_initialized()); + HeapWord *cur, *limit; + size_t curSize; + for (cur = bottom(), limit = end(); cur < limit; + cur += curSize) { + curSize = block_size(cur); + if (block_is_obj(cur) && obj_is_alive(cur)) { + blk->do_object(oop(cur)); + } + } +} + void CompactibleFreeListSpace::object_iterate_mem(MemRegion mr, UpwardsObjectClosure* cl) { assert_locked(); @@ -861,7 +885,9 @@ const { } else { // must read from what 'p' points to in each loop. klassOop k = ((volatile oopDesc*)p)->klass_or_null(); - if (k != NULL && ((oopDesc*)p)->is_parsable()) { + if (k != NULL && + ((oopDesc*)p)->is_parsable() && + ((oopDesc*)p)->is_conc_safe()) { assert(k->is_oop(), "Should really be klass oop."); oop o = (oop)p; assert(o->is_oop(), "Should be an oop"); diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp index 5306a8f3085..e0c48a1b79a 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp @@ -481,6 +481,15 @@ class CompactibleFreeListSpace: public CompactibleSpace { void oop_iterate(OopClosure* cl); void object_iterate(ObjectClosure* blk); + // Apply the closure to each object in the space whose references + // point to objects in the heap. The usage of CompactibleFreeListSpace + // by the ConcurrentMarkSweepGeneration for concurrent GC's allows + // objects in the space with references to objects that are no longer + // valid. For example, an object may reference another object + // that has already been sweep up (collected). This method uses + // obj_is_alive() to determine whether it is safe to iterate of + // an object. + void safe_object_iterate(ObjectClosure* blk); void object_iterate_mem(MemRegion mr, UpwardsObjectClosure* cl); // Requires that "mr" be entirely within the space. diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp index e8344107659..d716797bab4 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp @@ -3017,6 +3017,16 @@ ConcurrentMarkSweepGeneration::object_iterate(ObjectClosure* cl) { } } +void +ConcurrentMarkSweepGeneration::safe_object_iterate(ObjectClosure* cl) { + if (freelistLock()->owned_by_self()) { + Generation::safe_object_iterate(cl); + } else { + MutexLockerEx x(freelistLock(), Mutex::_no_safepoint_check_flag); + Generation::safe_object_iterate(cl); + } +} + void ConcurrentMarkSweepGeneration::pre_adjust_pointers() { } @@ -6623,7 +6633,11 @@ size_t ScanMarkedObjectsAgainCarefullyClosure::do_object_careful_m( if (_bitMap->isMarked(addr)) { // it's marked; is it potentially uninitialized? if (p->klass_or_null() != NULL) { - if (CMSPermGenPrecleaningEnabled && !p->is_parsable()) { + // If is_conc_safe is false, the object may be undergoing + // change by the VM outside a safepoint. Don't try to + // scan it, but rather leave it for the remark phase. + if (CMSPermGenPrecleaningEnabled && + (!p->is_conc_safe() || !p->is_parsable())) { // Signal precleaning to redirty the card since // the klass pointer is already installed. assert(size == 0, "Initial value"); @@ -7001,7 +7015,6 @@ void MarkFromRootsClosure::scanOopsInOop(HeapWord* ptr) { _mut->clear_range(mr); } DEBUG_ONLY(}) - // Note: the finger doesn't advance while we drain // the stack below. PushOrMarkClosure pushOrMarkClosure(_collector, @@ -8062,9 +8075,13 @@ size_t SweepClosure::doLiveChunk(FreeChunk* fc) { #ifdef DEBUG if (oop(addr)->klass_or_null() != NULL && ( !_collector->should_unload_classes() - || oop(addr)->is_parsable())) { + || (oop(addr)->is_parsable()) && + oop(addr)->is_conc_safe())) { // Ignore mark word because we are running concurrent with mutators assert(oop(addr)->is_oop(true), "live block should be an oop"); + // is_conc_safe is checked before performing this assertion + // because an object that is not is_conc_safe may yet have + // the return from size() correct. assert(size == CompactibleFreeListSpace::adjustObjectSize(oop(addr)->size()), "P-mark and computed size do not agree"); @@ -8077,6 +8094,13 @@ size_t SweepClosure::doLiveChunk(FreeChunk* fc) { (!_collector->should_unload_classes() || oop(addr)->is_parsable()), "Should be an initialized object"); + // Note that there are objects used during class redefinition + // (e.g., merge_cp in VM_RedefineClasses::merge_cp_and_rewrite() + // which are discarded with their is_conc_safe state still + // false. These object may be floating garbage so may be + // seen here. If they are floating garbage their size + // should be attainable from their klass. Do not that + // is_conc_safe() is true for oop(addr). // Ignore mark word because we are running concurrent with mutators assert(oop(addr)->is_oop(true), "live block should be an oop"); // Verify that the bit map has no bits marked between @@ -8484,7 +8508,7 @@ bool CMSCollector::take_from_overflow_list(size_t num, CMSMarkStack* stack) { size_t i = num; oop cur = _overflow_list; const markOop proto = markOopDesc::prototype(); - NOT_PRODUCT(size_t n = 0;) + NOT_PRODUCT(ssize_t n = 0;) for (oop next; i > 0 && cur != NULL; cur = next, i--) { next = oop(cur->mark()); cur->set_mark(proto); // until proven otherwise @@ -8501,45 +8525,131 @@ bool CMSCollector::take_from_overflow_list(size_t num, CMSMarkStack* stack) { return !stack->isEmpty(); } -// Multi-threaded; use CAS to break off a prefix +#define BUSY (oop(0x1aff1aff)) +// (MT-safe) Get a prefix of at most "num" from the list. +// The overflow list is chained through the mark word of +// each object in the list. We fetch the entire list, +// break off a prefix of the right size and return the +// remainder. If other threads try to take objects from +// the overflow list at that time, they will wait for +// some time to see if data becomes available. If (and +// only if) another thread places one or more object(s) +// on the global list before we have returned the suffix +// to the global list, we will walk down our local list +// to find its end and append the global list to +// our suffix before returning it. This suffix walk can +// prove to be expensive (quadratic in the amount of traffic) +// when there are many objects in the overflow list and +// there is much producer-consumer contention on the list. +// *NOTE*: The overflow list manipulation code here and +// in ParNewGeneration:: are very similar in shape, +// except that in the ParNew case we use the old (from/eden) +// copy of the object to thread the list via its klass word. +// Because of the common code, if you make any changes in +// the code below, please check the ParNew version to see if +// similar changes might be needed. +// CR 6797058 has been filed to consolidate the common code. bool CMSCollector::par_take_from_overflow_list(size_t num, OopTaskQueue* work_q) { - assert(work_q->size() == 0, "That's the current policy"); + assert(work_q->size() == 0, "First empty local work queue"); assert(num < work_q->max_elems(), "Can't bite more than we can chew"); if (_overflow_list == NULL) { return false; } // Grab the entire list; we'll put back a suffix - oop prefix = (oop)Atomic::xchg_ptr(NULL, &_overflow_list); - if (prefix == NULL) { // someone grabbed it before we did ... - // ... we could spin for a short while, but for now we don't - return false; + oop prefix = (oop)Atomic::xchg_ptr(BUSY, &_overflow_list); + Thread* tid = Thread::current(); + size_t CMSOverflowSpinCount = (size_t)ParallelGCThreads; + size_t sleep_time_millis = MAX2((size_t)1, num/100); + // If the list is busy, we spin for a short while, + // sleeping between attempts to get the list. + for (size_t spin = 0; prefix == BUSY && spin < CMSOverflowSpinCount; spin++) { + os::sleep(tid, sleep_time_millis, false); + if (_overflow_list == NULL) { + // Nothing left to take + return false; + } else if (_overflow_list != BUSY) { + // Try and grab the prefix + prefix = (oop)Atomic::xchg_ptr(BUSY, &_overflow_list); + } } + // If the list was found to be empty, or we spun long + // enough, we give up and return empty-handed. If we leave + // the list in the BUSY state below, it must be the case that + // some other thread holds the overflow list and will set it + // to a non-BUSY state in the future. + if (prefix == NULL || prefix == BUSY) { + // Nothing to take or waited long enough + if (prefix == NULL) { + // Write back the NULL in case we overwrote it with BUSY above + // and it is still the same value. + (void) Atomic::cmpxchg_ptr(NULL, &_overflow_list, BUSY); + } + return false; + } + assert(prefix != NULL && prefix != BUSY, "Error"); size_t i = num; oop cur = prefix; + // Walk down the first "num" objects, unless we reach the end. for (; i > 1 && cur->mark() != NULL; cur = oop(cur->mark()), i--); - if (cur->mark() != NULL) { + if (cur->mark() == NULL) { + // We have "num" or fewer elements in the list, so there + // is nothing to return to the global list. + // Write back the NULL in lieu of the BUSY we wrote + // above, if it is still the same value. + if (_overflow_list == BUSY) { + (void) Atomic::cmpxchg_ptr(NULL, &_overflow_list, BUSY); + } + } else { + // Chop off the suffix and rerturn it to the global list. + assert(cur->mark() != BUSY, "Error"); oop suffix_head = cur->mark(); // suffix will be put back on global list cur->set_mark(NULL); // break off suffix - // Find tail of suffix so we can prepend suffix to global list - for (cur = suffix_head; cur->mark() != NULL; cur = (oop)(cur->mark())); - oop suffix_tail = cur; - assert(suffix_tail != NULL && suffix_tail->mark() == NULL, - "Tautology"); + // It's possible that the list is still in the empty(busy) state + // we left it in a short while ago; in that case we may be + // able to place back the suffix without incurring the cost + // of a walk down the list. oop observed_overflow_list = _overflow_list; - do { - cur = observed_overflow_list; - suffix_tail->set_mark(markOop(cur)); + oop cur_overflow_list = observed_overflow_list; + bool attached = false; + while (observed_overflow_list == BUSY || observed_overflow_list == NULL) { observed_overflow_list = - (oop) Atomic::cmpxchg_ptr(suffix_head, &_overflow_list, cur); - } while (cur != observed_overflow_list); + (oop) Atomic::cmpxchg_ptr(suffix_head, &_overflow_list, cur_overflow_list); + if (cur_overflow_list == observed_overflow_list) { + attached = true; + break; + } else cur_overflow_list = observed_overflow_list; + } + if (!attached) { + // Too bad, someone else sneaked in (at least) an element; we'll need + // to do a splice. Find tail of suffix so we can prepend suffix to global + // list. + for (cur = suffix_head; cur->mark() != NULL; cur = (oop)(cur->mark())); + oop suffix_tail = cur; + assert(suffix_tail != NULL && suffix_tail->mark() == NULL, + "Tautology"); + observed_overflow_list = _overflow_list; + do { + cur_overflow_list = observed_overflow_list; + if (cur_overflow_list != BUSY) { + // Do the splice ... + suffix_tail->set_mark(markOop(cur_overflow_list)); + } else { // cur_overflow_list == BUSY + suffix_tail->set_mark(NULL); + } + // ... and try to place spliced list back on overflow_list ... + observed_overflow_list = + (oop) Atomic::cmpxchg_ptr(suffix_head, &_overflow_list, cur_overflow_list); + } while (cur_overflow_list != observed_overflow_list); + // ... until we have succeeded in doing so. + } } // Push the prefix elements on work_q assert(prefix != NULL, "control point invariant"); const markOop proto = markOopDesc::prototype(); oop next; - NOT_PRODUCT(size_t n = 0;) + NOT_PRODUCT(ssize_t n = 0;) for (cur = prefix; cur != NULL; cur = next) { next = oop(cur->mark()); cur->set_mark(proto); // until proven otherwise @@ -8573,11 +8683,16 @@ void CMSCollector::par_push_on_overflow_list(oop p) { oop cur_overflow_list; do { cur_overflow_list = observed_overflow_list; - p->set_mark(markOop(cur_overflow_list)); + if (cur_overflow_list != BUSY) { + p->set_mark(markOop(cur_overflow_list)); + } else { + p->set_mark(NULL); + } observed_overflow_list = (oop) Atomic::cmpxchg_ptr(p, &_overflow_list, cur_overflow_list); } while (cur_overflow_list != observed_overflow_list); } +#undef BUSY // Single threaded // General Note on GrowableArray: pushes may silently fail @@ -8586,7 +8701,7 @@ void CMSCollector::par_push_on_overflow_list(oop p) { // a lot of code in the JVM. The prudent thing for GrowableArray // to do (for now) is to exit with an error. However, that may // be too draconian in some cases because the caller may be -// able to recover without much harm. For suych cases, we +// able to recover without much harm. For such cases, we // should probably introduce a "soft_push" method which returns // an indication of success or failure with the assumption that // the caller may be able to recover from a failure; code in @@ -8594,8 +8709,6 @@ void CMSCollector::par_push_on_overflow_list(oop p) { // failures where possible, thus, incrementally hardening the VM // in such low resource situations. void CMSCollector::preserve_mark_work(oop p, markOop m) { - int PreserveMarkStackSize = 128; - if (_preserved_oop_stack == NULL) { assert(_preserved_mark_stack == NULL, "bijection with preserved_oop_stack"); diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp index 44ef14e8db3..d36c6fc47df 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp @@ -595,7 +595,7 @@ class CMSCollector: public CHeapObj { size_t _ser_kac_preclean_ovflw; size_t _ser_kac_ovflw; size_t _par_kac_ovflw; - NOT_PRODUCT(size_t _num_par_pushes;) + NOT_PRODUCT(ssize_t _num_par_pushes;) // ("Weak") Reference processing support ReferenceProcessor* _ref_processor; @@ -1212,6 +1212,7 @@ class ConcurrentMarkSweepGeneration: public CardGeneration { // More iteration support virtual void oop_iterate(MemRegion mr, OopClosure* cl); virtual void oop_iterate(OopClosure* cl); + virtual void safe_object_iterate(ObjectClosure* cl); virtual void object_iterate(ObjectClosure* cl); // Need to declare the full complement of closures, whether we'll diff --git a/hotspot/src/share/vm/gc_implementation/g1/collectionSetChooser.hpp b/hotspot/src/share/vm/gc_implementation/g1/collectionSetChooser.hpp index 60d8bf2057e..2c23680ced6 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/collectionSetChooser.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/collectionSetChooser.hpp @@ -24,7 +24,7 @@ // We need to sort heap regions by collection desirability. -class CSetChooserCache { +class CSetChooserCache VALUE_OBJ_CLASS_SPEC { private: enum { CacheLength = 16 diff --git a/hotspot/src/share/vm/gc_implementation/g1/concurrentG1Refine.hpp b/hotspot/src/share/vm/gc_implementation/g1/concurrentG1Refine.hpp index ea9a997d7a6..1436e5a1c52 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/concurrentG1Refine.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentG1Refine.hpp @@ -33,7 +33,7 @@ enum PostYieldAction { PYA_cancel // It's been completed by somebody else: cancel. }; -class ConcurrentG1Refine { +class ConcurrentG1Refine: public CHeapObj { ConcurrentG1RefineThread* _cg1rThread; volatile jint _pya; diff --git a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp index a572f74f3a7..db4b4dfb834 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp @@ -30,7 +30,7 @@ typedef GenericTaskQueueSet CMTaskQueueSet; // A generic CM bit map. This is essentially a wrapper around the BitMap // class, with one bit per (1<<_shifter) HeapWords. -class CMBitMapRO { +class CMBitMapRO VALUE_OBJ_CLASS_SPEC { protected: HeapWord* _bmStartWord; // base address of range covered by map size_t _bmWordSize; // map size (in #HeapWords covered) @@ -139,7 +139,7 @@ class CMBitMap : public CMBitMapRO { // Represents a marking stack used by the CM collector. // Ideally this should be GrowableArray<> just like MSC's marking stack(s). -class CMMarkStack { +class CMMarkStack VALUE_OBJ_CLASS_SPEC { ConcurrentMark* _cm; oop* _base; // bottom of stack jint _index; // one more than last occupied index @@ -237,7 +237,7 @@ class CMMarkStack { void oops_do(OopClosure* f); }; -class CMRegionStack { +class CMRegionStack VALUE_OBJ_CLASS_SPEC { MemRegion* _base; jint _capacity; jint _index; @@ -312,7 +312,7 @@ typedef enum { class ConcurrentMarkThread; -class ConcurrentMark { +class ConcurrentMark: public CHeapObj { friend class ConcurrentMarkThread; friend class CMTask; friend class CMBitMapClosure; diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp index 3aa19ccb85d..1c6766b9947 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp @@ -141,7 +141,7 @@ YoungList::YoungList(G1CollectedHeap* g1h) _scan_only_head(NULL), _scan_only_tail(NULL), _curr_scan_only(NULL), _length(0), _scan_only_length(0), _last_sampled_rs_lengths(0), - _survivor_head(NULL), _survivors_tail(NULL), _survivor_length(0) + _survivor_head(NULL), _survivor_tail(NULL), _survivor_length(0) { guarantee( check_list_empty(false), "just making sure..." ); } @@ -159,16 +159,15 @@ void YoungList::push_region(HeapRegion *hr) { } void YoungList::add_survivor_region(HeapRegion* hr) { - assert(!hr->is_survivor(), "should not already be for survived"); + assert(hr->is_survivor(), "should be flagged as survivor region"); assert(hr->get_next_young_region() == NULL, "cause it should!"); hr->set_next_young_region(_survivor_head); if (_survivor_head == NULL) { - _survivors_tail = hr; + _survivor_tail = hr; } _survivor_head = hr; - hr->set_survivor(); ++_survivor_length; } @@ -239,7 +238,7 @@ void YoungList::empty_list() { empty_list(_survivor_head); _survivor_head = NULL; - _survivors_tail = NULL; + _survivor_tail = NULL; _survivor_length = 0; _last_sampled_rs_lengths = 0; @@ -391,6 +390,7 @@ YoungList::reset_auxilary_lists() { // Add survivor regions to SurvRateGroup. _g1h->g1_policy()->note_start_adding_survivor_regions(); + _g1h->g1_policy()->finished_recalculating_age_indexes(true /* is_survivors */); for (HeapRegion* curr = _survivor_head; curr != NULL; curr = curr->get_next_young_region()) { @@ -401,7 +401,7 @@ YoungList::reset_auxilary_lists() { if (_survivor_head != NULL) { _head = _survivor_head; _length = _survivor_length + _scan_only_length; - _survivors_tail->set_next_young_region(_scan_only_head); + _survivor_tail->set_next_young_region(_scan_only_head); } else { _head = _scan_only_head; _length = _scan_only_length; @@ -418,9 +418,9 @@ YoungList::reset_auxilary_lists() { _curr_scan_only = NULL; _survivor_head = NULL; - _survivors_tail = NULL; + _survivor_tail = NULL; _survivor_length = 0; - _g1h->g1_policy()->finished_recalculating_age_indexes(); + _g1h->g1_policy()->finished_recalculating_age_indexes(false /* is_survivors */); assert(check_list_well_formed(), "young list should be well formed"); } @@ -553,7 +553,7 @@ HeapRegion* G1CollectedHeap::newAllocRegionWithExpansion(int purpose, if (_gc_alloc_region_counts[purpose] < g1_policy()->max_regions(purpose)) { alloc_region = newAllocRegion_work(word_size, true, zero_filled); if (purpose == GCAllocForSurvived && alloc_region != NULL) { - _young_list->add_survivor_region(alloc_region); + alloc_region->set_survivor(); } ++_gc_alloc_region_counts[purpose]; } else { @@ -949,6 +949,10 @@ void G1CollectedHeap::do_collection(bool full, bool clear_all_soft_refs, GCOverheadReporter::recordSTWEnd(end); g1_policy()->record_full_collection_end(); +#ifdef TRACESPINNING + ParallelTaskTerminator::print_termination_counts(); +#endif + gc_epilogue(true); // Abandon concurrent refinement. This must happen last: in the @@ -1285,7 +1289,9 @@ G1CollectedHeap::G1CollectedHeap(G1CollectorPolicy* policy_) : _unclean_regions_coming(false), _young_list(new YoungList(this)), _gc_time_stamp(0), - _surviving_young_words(NULL) + _surviving_young_words(NULL), + _in_cset_fast_test(NULL), + _in_cset_fast_test_base(NULL) { _g1h = this; // To catch bugs. if (_process_strong_tasks == NULL || !_process_strong_tasks->valid()) { @@ -2485,6 +2491,19 @@ G1CollectedHeap::do_collection_pause_at_safepoint(HeapRegion* popular_region) { g1_policy()->record_collection_pause_start(start_time_sec, start_used_bytes); + guarantee(_in_cset_fast_test == NULL, "invariant"); + guarantee(_in_cset_fast_test_base == NULL, "invariant"); + _in_cset_fast_test_length = n_regions(); + _in_cset_fast_test_base = + NEW_C_HEAP_ARRAY(bool, _in_cset_fast_test_length); + memset(_in_cset_fast_test_base, false, + _in_cset_fast_test_length * sizeof(bool)); + // We're biasing _in_cset_fast_test to avoid subtracting the + // beginning of the heap every time we want to index; basically + // it's the same with what we do with the card table. + _in_cset_fast_test = _in_cset_fast_test_base - + ((size_t) _g1_reserved.start() >> HeapRegion::LogOfHRGrainBytes); + #if SCAN_ONLY_VERBOSE _young_list->print(); #endif // SCAN_ONLY_VERBOSE @@ -2553,6 +2572,12 @@ G1CollectedHeap::do_collection_pause_at_safepoint(HeapRegion* popular_region) { free_collection_set(g1_policy()->collection_set()); g1_policy()->clear_collection_set(); + FREE_C_HEAP_ARRAY(bool, _in_cset_fast_test_base); + // this is more for peace of mind; we're nulling them here and + // we're expecting them to be null at the beginning of the next GC + _in_cset_fast_test = NULL; + _in_cset_fast_test_base = NULL; + if (popular_region != NULL) { // We have to wait until now, because we don't want the region to // be rescheduled for pop-evac during RS update. @@ -2572,6 +2597,9 @@ G1CollectedHeap::do_collection_pause_at_safepoint(HeapRegion* popular_region) { _young_list->print(); #endif // SCAN_ONLY_VERBOSE + g1_policy()->record_survivor_regions(_young_list->survivor_length(), + _young_list->first_survivor_region(), + _young_list->last_survivor_region()); _young_list->reset_auxilary_lists(); } } else { @@ -2598,7 +2626,9 @@ G1CollectedHeap::do_collection_pause_at_safepoint(HeapRegion* popular_region) { #endif // SCAN_ONLY_VERBOSE double end_time_sec = os::elapsedTime(); - g1_policy()->record_pause_time((end_time_sec - start_time_sec)*1000.0); + if (!evacuation_failed()) { + g1_policy()->record_pause_time((end_time_sec - start_time_sec)*1000.0); + } GCOverheadReporter::recordSTWEnd(end_time_sec); g1_policy()->record_collection_pause_end(popular_region != NULL, abandoned); @@ -2621,8 +2651,13 @@ G1CollectedHeap::do_collection_pause_at_safepoint(HeapRegion* popular_region) { } } - if (mark_in_progress()) + if (mark_in_progress()) { concurrent_mark()->update_g1_committed(); + } + +#ifdef TRACESPINNING + ParallelTaskTerminator::print_termination_counts(); +#endif gc_epilogue(false); } @@ -2733,6 +2768,13 @@ void G1CollectedHeap::forget_alloc_region_list() { _gc_alloc_region_list = r->next_gc_alloc_region(); r->set_next_gc_alloc_region(NULL); r->set_is_gc_alloc_region(false); + if (r->is_survivor()) { + if (r->is_empty()) { + r->set_not_young(); + } else { + _young_list->add_survivor_region(r); + } + } if (r->is_empty()) { ++_free_regions; } @@ -3129,6 +3171,20 @@ HeapWord* G1CollectedHeap::par_allocate_during_gc(GCAllocPurpose purpose, return block; } +void G1CollectedHeap::retire_alloc_region(HeapRegion* alloc_region, + bool par) { + // Another thread might have obtained alloc_region for the given + // purpose, and might be attempting to allocate in it, and might + // succeed. Therefore, we can't do the "finalization" stuff on the + // region below until we're sure the last allocation has happened. + // We ensure this by allocating the remaining space with a garbage + // object. + if (par) par_allocate_remaining_space(alloc_region); + // Now we can do the post-GC stuff on the region. + alloc_region->note_end_of_copying(); + g1_policy()->record_after_bytes(alloc_region->used()); +} + HeapWord* G1CollectedHeap::allocate_during_gc_slow(GCAllocPurpose purpose, HeapRegion* alloc_region, @@ -3146,16 +3202,7 @@ G1CollectedHeap::allocate_during_gc_slow(GCAllocPurpose purpose, // Otherwise, continue; this new region is empty, too. } assert(alloc_region != NULL, "We better have an allocation region"); - // Another thread might have obtained alloc_region for the given - // purpose, and might be attempting to allocate in it, and might - // succeed. Therefore, we can't do the "finalization" stuff on the - // region below until we're sure the last allocation has happened. - // We ensure this by allocating the remaining space with a garbage - // object. - if (par) par_allocate_remaining_space(alloc_region); - // Now we can do the post-GC stuff on the region. - alloc_region->note_end_of_copying(); - g1_policy()->record_after_bytes(alloc_region->used()); + retire_alloc_region(alloc_region, par); if (_gc_alloc_region_counts[purpose] >= g1_policy()->max_regions(purpose)) { // Cannot allocate more regions for the given purpose. @@ -3164,7 +3211,7 @@ G1CollectedHeap::allocate_during_gc_slow(GCAllocPurpose purpose, if (purpose != alt_purpose) { HeapRegion* alt_region = _gc_alloc_regions[alt_purpose]; // Has not the alternative region been aliased? - if (alloc_region != alt_region) { + if (alloc_region != alt_region && alt_region != NULL) { // Try to allocate in the alternative region. if (par) { block = alt_region->par_allocate(word_size); @@ -3173,9 +3220,10 @@ G1CollectedHeap::allocate_during_gc_slow(GCAllocPurpose purpose, } // Make an alias. _gc_alloc_regions[purpose] = _gc_alloc_regions[alt_purpose]; - } - if (block != NULL) { - return block; + if (block != NULL) { + return block; + } + retire_alloc_region(alt_region, par); } // Both the allocation region and the alternative one are full // and aliased, replace them with a new allocation region. @@ -3476,6 +3524,7 @@ protected: OverflowQueue* _overflowed_refs; G1ParGCAllocBuffer _alloc_buffers[GCAllocPurposeCount]; + ageTable _age_table; size_t _alloc_buffer_waste; size_t _undo_waste; @@ -3517,6 +3566,7 @@ public: _refs(g1h->task_queue(queue_num)), _hash_seed(17), _queue_num(queue_num), _term_attempts(0), + _age_table(false), #if G1_DETAILED_STATS _pushes(0), _pops(0), _steals(0), _steal_attempts(0), _overflow_pushes(0), @@ -3551,8 +3601,9 @@ public: RefToScanQueue* refs() { return _refs; } OverflowQueue* overflowed_refs() { return _overflowed_refs; } + ageTable* age_table() { return &_age_table; } - inline G1ParGCAllocBuffer* alloc_buffer(GCAllocPurpose purpose) { + G1ParGCAllocBuffer* alloc_buffer(GCAllocPurpose purpose) { return &_alloc_buffers[purpose]; } @@ -3560,6 +3611,9 @@ public: size_t undo_waste() { return _undo_waste; } void push_on_queue(oop* ref) { + assert(ref != NULL, "invariant"); + assert(has_partial_array_mask(ref) || _g1h->obj_in_cs(*ref), "invariant"); + if (!refs()->push(ref)) { overflowed_refs()->push(ref); IF_G1_DETAILED_STATS(note_overflow_push()); @@ -3572,6 +3626,10 @@ public: if (!refs()->pop_local(ref)) { ref = NULL; } else { + assert(ref != NULL, "invariant"); + assert(has_partial_array_mask(ref) || _g1h->obj_in_cs(*ref), + "invariant"); + IF_G1_DETAILED_STATS(note_pop()); } } @@ -3601,8 +3659,7 @@ public: obj = alloc_buf->allocate(word_sz); assert(obj != NULL, "buffer was definitely big enough..."); - } - else { + } else { obj = _g1h->par_allocate_during_gc(purpose, word_sz); } return obj; @@ -3695,24 +3752,57 @@ public: } } +private: + void deal_with_reference(oop* ref_to_scan) { + if (has_partial_array_mask(ref_to_scan)) { + _partial_scan_cl->do_oop_nv(ref_to_scan); + } else { + // Note: we can use "raw" versions of "region_containing" because + // "obj_to_scan" is definitely in the heap, and is not in a + // humongous region. + HeapRegion* r = _g1h->heap_region_containing_raw(ref_to_scan); + _evac_cl->set_region(r); + _evac_cl->do_oop_nv(ref_to_scan); + } + } + +public: void trim_queue() { + // I've replicated the loop twice, first to drain the overflow + // queue, second to drain the task queue. This is better than + // having a single loop, which checks both conditions and, inside + // it, either pops the overflow queue or the task queue, as each + // loop is tighter. Also, the decision to drain the overflow queue + // first is not arbitrary, as the overflow queue is not visible + // to the other workers, whereas the task queue is. So, we want to + // drain the "invisible" entries first, while allowing the other + // workers to potentially steal the "visible" entries. + while (refs_to_scan() > 0 || overflowed_refs_to_scan() > 0) { - oop *ref_to_scan = NULL; - if (overflowed_refs_to_scan() == 0) { - pop_from_queue(ref_to_scan); - } else { + while (overflowed_refs_to_scan() > 0) { + oop *ref_to_scan = NULL; pop_from_overflow_queue(ref_to_scan); + assert(ref_to_scan != NULL, "invariant"); + // We shouldn't have pushed it on the queue if it was not + // pointing into the CSet. + assert(ref_to_scan != NULL, "sanity"); + assert(has_partial_array_mask(ref_to_scan) || + _g1h->obj_in_cs(*ref_to_scan), "sanity"); + + deal_with_reference(ref_to_scan); } - if (ref_to_scan != NULL) { - if ((intptr_t)ref_to_scan & G1_PARTIAL_ARRAY_MASK) { - _partial_scan_cl->do_oop_nv(ref_to_scan); - } else { - // Note: we can use "raw" versions of "region_containing" because - // "obj_to_scan" is definitely in the heap, and is not in a - // humongous region. - HeapRegion* r = _g1h->heap_region_containing_raw(ref_to_scan); - _evac_cl->set_region(r); - _evac_cl->do_oop_nv(ref_to_scan); + + while (refs_to_scan() > 0) { + oop *ref_to_scan = NULL; + pop_from_queue(ref_to_scan); + + if (ref_to_scan != NULL) { + // We shouldn't have pushed it on the queue if it was not + // pointing into the CSet. + assert(has_partial_array_mask(ref_to_scan) || + _g1h->obj_in_cs(*ref_to_scan), "sanity"); + + deal_with_reference(ref_to_scan); } } } @@ -3728,16 +3818,25 @@ G1ParClosureSuper::G1ParClosureSuper(G1CollectedHeap* g1, G1ParScanThreadState* // Should probably be made inline and moved in g1OopClosures.inline.hpp. void G1ParScanClosure::do_oop_nv(oop* p) { oop obj = *p; + if (obj != NULL) { - if (_g1->obj_in_cs(obj)) { - if (obj->is_forwarded()) { - *p = obj->forwardee(); - } else { - _par_scan_state->push_on_queue(p); - return; - } + if (_g1->in_cset_fast_test(obj)) { + // We're not going to even bother checking whether the object is + // already forwarded or not, as this usually causes an immediate + // stall. We'll try to prefetch the object (for write, given that + // we might need to install the forwarding reference) and we'll + // get back to it when pop it from the queue + Prefetch::write(obj->mark_addr(), 0); + Prefetch::read(obj->mark_addr(), (HeapWordSize*2)); + + // slightly paranoid test; I'm trying to catch potential + // problems before we go into push_on_queue to know where the + // problem is coming from + assert(obj == *p, "the value of *p should not have changed"); + _par_scan_state->push_on_queue(p); + } else { + _g1_rem->par_write_ref(_from, p, _par_scan_state->queue_num()); } - _g1_rem->par_write_ref(_from, p, _par_scan_state->queue_num()); } } @@ -3765,7 +3864,9 @@ oop G1ParCopyHelper::copy_to_survivor_space(oop old) { (!from_region->is_young() && young_index == 0), "invariant" ); G1CollectorPolicy* g1p = _g1->g1_policy(); markOop m = old->mark(); - GCAllocPurpose alloc_purpose = g1p->evacuation_destination(from_region, m->age(), + int age = m->has_displaced_mark_helper() ? m->displaced_mark_helper()->age() + : m->age(); + GCAllocPurpose alloc_purpose = g1p->evacuation_destination(from_region, age, word_sz); HeapWord* obj_ptr = _par_scan_state->allocate(alloc_purpose, word_sz); oop obj = oop(obj_ptr); @@ -3777,13 +3878,39 @@ oop G1ParCopyHelper::copy_to_survivor_space(oop old) { return _g1->handle_evacuation_failure_par(cl, old); } + // We're going to allocate linearly, so might as well prefetch ahead. + Prefetch::write(obj_ptr, PrefetchCopyIntervalInBytes); + oop forward_ptr = old->forward_to_atomic(obj); if (forward_ptr == NULL) { Copy::aligned_disjoint_words((HeapWord*) old, obj_ptr, word_sz); - obj->set_mark(m); if (g1p->track_object_age(alloc_purpose)) { - obj->incr_age(); + // We could simply do obj->incr_age(). However, this causes a + // performance issue. obj->incr_age() will first check whether + // the object has a displaced mark by checking its mark word; + // getting the mark word from the new location of the object + // stalls. So, given that we already have the mark word and we + // are about to install it anyway, it's better to increase the + // age on the mark word, when the object does not have a + // displaced mark word. We're not expecting many objects to have + // a displaced marked word, so that case is not optimized + // further (it could be...) and we simply call obj->incr_age(). + + if (m->has_displaced_mark_helper()) { + // in this case, we have to install the mark word first, + // otherwise obj looks to be forwarded (the old mark word, + // which contains the forward pointer, was copied) + obj->set_mark(m); + obj->incr_age(); + } else { + m = m->incr_age(); + obj->set_mark(m); + } + _par_scan_state->age_table()->add(obj, word_sz); + } else { + obj->set_mark(m); } + // preserve "next" mark bit if (_g1->mark_in_progress() && !_g1->is_obj_ill(old)) { if (!use_local_bitmaps || @@ -3805,9 +3932,11 @@ oop G1ParCopyHelper::copy_to_survivor_space(oop old) { if (obj->is_objArray() && arrayOop(obj)->length() >= ParGCArrayScanChunk) { arrayOop(old)->set_length(0); - _par_scan_state->push_on_queue((oop*) ((intptr_t)old | G1_PARTIAL_ARRAY_MASK)); + _par_scan_state->push_on_queue(set_partial_array_mask(old)); } else { - _scanner->set_region(_g1->heap_region_containing(obj)); + // No point in using the slower heap_region_containing() method, + // given that we know obj is in the heap. + _scanner->set_region(_g1->heap_region_containing_raw(obj)); obj->oop_iterate_backwards(_scanner); } } else { @@ -3817,47 +3946,55 @@ oop G1ParCopyHelper::copy_to_survivor_space(oop old) { return obj; } -template -void G1ParCopyClosure::do_oop_work(oop* p) { +template +void G1ParCopyClosure::do_oop_work(oop* p) { oop obj = *p; assert(barrier != G1BarrierRS || obj != NULL, "Precondition: G1BarrierRS implies obj is nonNull"); - if (obj != NULL) { - if (_g1->obj_in_cs(obj)) { + // The only time we skip the cset test is when we're scanning + // references popped from the queue. And we only push on the queue + // references that we know point into the cset, so no point in + // checking again. But we'll leave an assert here for peace of mind. + assert(!skip_cset_test || _g1->obj_in_cs(obj), "invariant"); + + // here the null check is implicit in the cset_fast_test() test + if (skip_cset_test || _g1->in_cset_fast_test(obj)) { #if G1_REM_SET_LOGGING - gclog_or_tty->print_cr("Loc "PTR_FORMAT" contains pointer "PTR_FORMAT" into CS.", - p, (void*) obj); + gclog_or_tty->print_cr("Loc "PTR_FORMAT" contains pointer "PTR_FORMAT" " + "into CS.", p, (void*) obj); #endif - if (obj->is_forwarded()) { - *p = obj->forwardee(); - } else { - *p = copy_to_survivor_space(obj); - } - // When scanning the RS, we only care about objs in CS. - if (barrier == G1BarrierRS) { - _g1_rem->par_write_ref(_from, p, _par_scan_state->queue_num()); - } + if (obj->is_forwarded()) { + *p = obj->forwardee(); + } else { + *p = copy_to_survivor_space(obj); } - // When scanning moved objs, must look at all oops. - if (barrier == G1BarrierEvac) { + // When scanning the RS, we only care about objs in CS. + if (barrier == G1BarrierRS) { _g1_rem->par_write_ref(_from, p, _par_scan_state->queue_num()); } + } - if (do_gen_barrier) { - par_do_barrier(p); - } + // When scanning moved objs, must look at all oops. + if (barrier == G1BarrierEvac && obj != NULL) { + _g1_rem->par_write_ref(_from, p, _par_scan_state->queue_num()); + } + + if (do_gen_barrier && obj != NULL) { + par_do_barrier(p); } } -template void G1ParCopyClosure::do_oop_work(oop* p); +template void G1ParCopyClosure::do_oop_work(oop* p); -template void G1ParScanPartialArrayClosure::process_array_chunk( +template void G1ParScanPartialArrayClosure::process_array_chunk( oop obj, int start, int end) { // process our set of indices (include header in first chunk) assert(start < end, "invariant"); T* const base = (T*)objArrayOop(obj)->base(); - T* const start_addr = base + start; + T* const start_addr = (start == 0) ? (T*) obj : base + start; T* const end_addr = base + end; MemRegion mr((HeapWord*)start_addr, (HeapWord*)end_addr); _scanner.set_region(_g1->heap_region_containing(obj)); @@ -3866,7 +4003,8 @@ template void G1ParScanPartialArrayClosure::process_array_chunk( void G1ParScanPartialArrayClosure::do_oop_nv(oop* p) { assert(!UseCompressedOops, "Needs to be fixed to work with compressed oops"); - oop old = oop((intptr_t)p & ~G1_PARTIAL_ARRAY_MASK); + assert(has_partial_array_mask(p), "invariant"); + oop old = clear_partial_array_mask(p); assert(old->is_objArray(), "must be obj array"); assert(old->is_forwarded(), "must be forwarded"); assert(Universe::heap()->is_in_reserved(old), "must be in heap."); @@ -3884,7 +4022,7 @@ void G1ParScanPartialArrayClosure::do_oop_nv(oop* p) { end = start + ParGCArrayScanChunk; arrayOop(old)->set_length(end); // Push remainder. - _par_scan_state->push_on_queue((oop*) ((intptr_t) old | G1_PARTIAL_ARRAY_MASK)); + _par_scan_state->push_on_queue(set_partial_array_mask(old)); } else { // Restore length so that the heap remains parsable in // case of evacuation failure. @@ -3893,11 +4031,6 @@ void G1ParScanPartialArrayClosure::do_oop_nv(oop* p) { // process our set of indices (include header in first chunk) process_array_chunk(obj, start, end); - oop* start_addr = start == 0 ? (oop*)obj : obj->obj_at_addr(start); - oop* end_addr = (oop*)(obj->base()) + end; // obj_at_addr(end) asserts end < length - MemRegion mr((HeapWord*)start_addr, (HeapWord*)end_addr); - _scanner.set_region(_g1->heap_region_containing(obj)); - obj->oop_iterate(&_scanner, mr); } int G1ScanAndBalanceClosure::_nq = 0; @@ -3931,6 +4064,13 @@ public: pss->hash_seed(), ref_to_scan)) { IF_G1_DETAILED_STATS(pss->note_steal()); + + // slightly paranoid tests; I'm trying to catch potential + // problems before we go into push_on_queue to know where the + // problem is coming from + assert(ref_to_scan != NULL, "invariant"); + assert(has_partial_array_mask(ref_to_scan) || + _g1h->obj_in_cs(*ref_to_scan), "invariant"); pss->push_on_queue(ref_to_scan); continue; } @@ -3976,10 +4116,10 @@ public: ResourceMark rm; HandleMark hm; - G1ParScanThreadState pss(_g1h, i); - G1ParScanHeapEvacClosure scan_evac_cl(_g1h, &pss); - G1ParScanHeapEvacClosure evac_failure_cl(_g1h, &pss); - G1ParScanPartialArrayClosure partial_scan_cl(_g1h, &pss); + G1ParScanThreadState pss(_g1h, i); + G1ParScanHeapEvacClosure scan_evac_cl(_g1h, &pss); + G1ParScanHeapEvacFailureClosure evac_failure_cl(_g1h, &pss); + G1ParScanPartialArrayClosure partial_scan_cl(_g1h, &pss); pss.set_evac_closure(&scan_evac_cl); pss.set_evac_failure_closure(&evac_failure_cl); @@ -4024,6 +4164,9 @@ public: _g1h->g1_policy()->record_obj_copy_time(i, elapsed_ms-term_ms); _g1h->g1_policy()->record_termination_time(i, term_ms); } + if (G1UseSurvivorSpace) { + _g1h->g1_policy()->record_thread_age_table(pss.age_table()); + } _g1h->update_surviving_young_words(pss.surviving_young_words()+1); // Clean up any par-expanded rem sets. @@ -4263,7 +4406,7 @@ void G1CollectedHeap::evacuate_collection_set() { // Is this the right thing to do here? We don't save marks // on individual heap regions when we allocate from // them in parallel, so this seems like the correct place for this. - all_alloc_regions_note_end_of_copying(); + retire_all_alloc_regions(); { G1IsAliveClosure is_alive(this); G1KeepAliveClosure keep_alive(this); @@ -4903,7 +5046,7 @@ bool G1CollectedHeap::all_alloc_regions_no_allocs_since_save_marks() { return no_allocs; } -void G1CollectedHeap::all_alloc_regions_note_end_of_copying() { +void G1CollectedHeap::retire_all_alloc_regions() { for (int ap = 0; ap < GCAllocPurposeCount; ++ap) { HeapRegion* r = _gc_alloc_regions[ap]; if (r != NULL) { @@ -4916,8 +5059,7 @@ void G1CollectedHeap::all_alloc_regions_note_end_of_copying() { } } if (!has_processed_alias) { - r->note_end_of_copying(); - g1_policy()->record_after_bytes(r->used()); + retire_alloc_region(r, false /* par */); } } } diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp index e83b1a7de1c..2e139b7f2d2 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp @@ -90,7 +90,7 @@ private: HeapRegion* _curr_scan_only; HeapRegion* _survivor_head; - HeapRegion* _survivors_tail; + HeapRegion* _survivor_tail; size_t _survivor_length; void empty_list(HeapRegion* list); @@ -105,6 +105,7 @@ public: bool is_empty() { return _length == 0; } size_t length() { return _length; } size_t scan_only_length() { return _scan_only_length; } + size_t survivor_length() { return _survivor_length; } void rs_length_sampling_init(); bool rs_length_sampling_more(); @@ -120,6 +121,7 @@ public: HeapRegion* first_region() { return _head; } HeapRegion* first_scan_only_region() { return _scan_only_head; } HeapRegion* first_survivor_region() { return _survivor_head; } + HeapRegion* last_survivor_region() { return _survivor_tail; } HeapRegion* par_get_next_scan_only_region() { MutexLockerEx x(ParGCRareEvent_lock, Mutex::_no_safepoint_check_flag); HeapRegion* ret = _curr_scan_only; @@ -219,7 +221,7 @@ private: // The to-space memory regions into which objects are being copied during // a GC. HeapRegion* _gc_alloc_regions[GCAllocPurposeCount]; - uint _gc_alloc_region_counts[GCAllocPurposeCount]; + size_t _gc_alloc_region_counts[GCAllocPurposeCount]; // A list of the regions that have been set to be alloc regions in the // current collection. @@ -247,6 +249,27 @@ private: NumberSeq _pop_obj_rc_at_copy; void print_popularity_summary_info() const; + // This is used for a quick test on whether a reference points into + // the collection set or not. Basically, we have an array, with one + // byte per region, and that byte denotes whether the corresponding + // region is in the collection set or not. The entry corresponding + // the bottom of the heap, i.e., region 0, is pointed to by + // _in_cset_fast_test_base. The _in_cset_fast_test field has been + // biased so that it actually points to address 0 of the address + // space, to make the test as fast as possible (we can simply shift + // the address to address into it, instead of having to subtract the + // bottom of the heap from the address before shifting it; basically + // it works in the same way the card table works). + bool* _in_cset_fast_test; + + // The allocated array used for the fast test on whether a reference + // points into the collection set or not. This field is also used to + // free the array. + bool* _in_cset_fast_test_base; + + // The length of the _in_cset_fast_test_base array. + size_t _in_cset_fast_test_length; + volatile unsigned _gc_time_stamp; size_t* _surviving_young_words; @@ -260,8 +283,8 @@ protected: // Returns "true" iff none of the gc alloc regions have any allocations // since the last call to "save_marks". bool all_alloc_regions_no_allocs_since_save_marks(); - // Calls "note_end_of_copying on all gc alloc_regions. - void all_alloc_regions_note_end_of_copying(); + // Perform finalization stuff on all allocation regions. + void retire_all_alloc_regions(); // The number of regions allocated to hold humongous objects. int _num_humongous_regions; @@ -330,6 +353,10 @@ protected: // that parallel threads might be attempting allocations. void par_allocate_remaining_space(HeapRegion* r); + // Retires an allocation region when it is full or at the end of a + // GC pause. + void retire_alloc_region(HeapRegion* alloc_region, bool par); + // Helper function for two callbacks below. // "full", if true, indicates that the GC is for a System.gc() request, // and should collect the entire heap. If "clear_all_soft_refs" is true, @@ -368,6 +395,38 @@ public: virtual void gc_prologue(bool full); virtual void gc_epilogue(bool full); + // We register a region with the fast "in collection set" test. We + // simply set to true the array slot corresponding to this region. + void register_region_with_in_cset_fast_test(HeapRegion* r) { + assert(_in_cset_fast_test_base != NULL, "sanity"); + assert(r->in_collection_set(), "invariant"); + int index = r->hrs_index(); + assert(0 <= (size_t) index && (size_t) index < _in_cset_fast_test_length, + "invariant"); + assert(!_in_cset_fast_test_base[index], "invariant"); + _in_cset_fast_test_base[index] = true; + } + + // This is a fast test on whether a reference points into the + // collection set or not. It does not assume that the reference + // points into the heap; if it doesn't, it will return false. + bool in_cset_fast_test(oop obj) { + assert(_in_cset_fast_test != NULL, "sanity"); + if (_g1_committed.contains((HeapWord*) obj)) { + // no need to subtract the bottom of the heap from obj, + // _in_cset_fast_test is biased + size_t index = ((size_t) obj) >> HeapRegion::LogOfHRGrainBytes; + bool ret = _in_cset_fast_test[index]; + // let's make sure the result is consistent with what the slower + // test returns + assert( ret || !obj_in_cs(obj), "sanity"); + assert(!ret || obj_in_cs(obj), "sanity"); + return ret; + } else { + return false; + } + } + protected: // Shrink the garbage-first heap by at most the given size (in bytes!). @@ -850,6 +909,7 @@ public: // Iterate over all objects, calling "cl.do_object" on each. virtual void object_iterate(ObjectClosure* cl); + virtual void safe_object_iterate(ObjectClosure* cl) { object_iterate(cl); } // Iterate over all objects allocated since the last collection, calling // "cl.do_object" on each. The heap must have been initialized properly diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp index 8cafe3d9885..4d88ee4cbb6 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp @@ -36,8 +36,11 @@ G1CollectedHeap::heap_region_containing(const void* addr) const { inline HeapRegion* G1CollectedHeap::heap_region_containing_raw(const void* addr) const { - HeapRegion* res = _hrs->addr_to_region(addr); - assert(res != NULL, "addr outside of heap?"); + assert(_g1_reserved.contains(addr), "invariant"); + size_t index = ((intptr_t) addr - (intptr_t) _g1_reserved.start()) + >> HeapRegion::LogOfHRGrainBytes; + HeapRegion* res = _hrs->at(index); + assert(res == _hrs->addr_to_region(addr), "sanity"); return res; } diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp index a5d0165bb4d..949e3f99700 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp @@ -196,8 +196,13 @@ G1CollectorPolicy::G1CollectorPolicy() : _short_lived_surv_rate_group(new SurvRateGroup(this, "Short Lived", G1YoungSurvRateNumRegionsSummary)), _survivor_surv_rate_group(new SurvRateGroup(this, "Survivor", - G1YoungSurvRateNumRegionsSummary)) + G1YoungSurvRateNumRegionsSummary)), // add here any more surv rate groups + _recorded_survivor_regions(0), + _recorded_survivor_head(NULL), + _recorded_survivor_tail(NULL), + _survivors_age_table(true) + { _recent_prev_end_times_for_all_gcs_sec->add(os::elapsedTime()); _prev_collection_pause_end_ms = os::elapsedTime() * 1000.0; @@ -272,6 +277,15 @@ G1CollectorPolicy::G1CollectorPolicy() : _concurrent_mark_cleanup_times_ms->add(0.20); _tenuring_threshold = MaxTenuringThreshold; + if (G1UseSurvivorSpace) { + // if G1FixedSurvivorSpaceSize is 0 which means the size is not + // fixed, then _max_survivor_regions will be calculated at + // calculate_young_list_target_config during initialization + _max_survivor_regions = G1FixedSurvivorSpaceSize / HeapRegion::GrainBytes; + } else { + _max_survivor_regions = 0; + } + initialize_all(); } @@ -283,6 +297,9 @@ static void inc_mod(int& i, int len) { void G1CollectorPolicy::initialize_flags() { set_min_alignment(HeapRegion::GrainBytes); set_max_alignment(GenRemSet::max_alignment_constraint(rem_set_name())); + if (SurvivorRatio < 1) { + vm_exit_during_initialization("Invalid survivor ratio specified"); + } CollectorPolicy::initialize_flags(); } @@ -301,6 +318,8 @@ void G1CollectorPolicy::init() { "-XX:+UseConcMarkSweepGC."); } + initialize_gc_policy_counters(); + if (G1Gen) { _in_young_gc_mode = true; @@ -322,6 +341,12 @@ void G1CollectorPolicy::init() { } } +// Create the jstat counters for the policy. +void G1CollectorPolicy::initialize_gc_policy_counters() +{ + _gc_policy_counters = new GCPolicyCounters("GarbageFirst", 1, 2 + G1Gen); +} + void G1CollectorPolicy::calculate_young_list_min_length() { _young_list_min_length = 0; @@ -352,6 +377,7 @@ void G1CollectorPolicy::calculate_young_list_target_config() { guarantee( so_length < _young_list_target_length, "invariant" ); _young_list_so_prefix_length = so_length; } + calculate_survivors_policy(); } // This method calculate the optimal scan-only set for a fixed young @@ -448,6 +474,9 @@ void G1CollectorPolicy::calculate_young_list_target_config(size_t rs_lengths) { if (full_young_gcs() && _free_regions_at_end_of_collection > 0) { // we are in fully-young mode and there are free regions in the heap + double survivor_regions_evac_time = + predict_survivor_regions_evac_time(); + size_t min_so_length = 0; size_t max_so_length = 0; @@ -497,9 +526,8 @@ void G1CollectorPolicy::calculate_young_list_target_config(size_t rs_lengths) { scanned_cards = predict_non_young_card_num(adj_rs_lengths); // calculate this once, so that we don't have to recalculate it in // the innermost loop - double base_time_ms = predict_base_elapsed_time_ms(pending_cards, - scanned_cards); - + double base_time_ms = predict_base_elapsed_time_ms(pending_cards, scanned_cards) + + survivor_regions_evac_time; // the result size_t final_young_length = 0; size_t final_so_length = 0; @@ -548,14 +576,14 @@ void G1CollectorPolicy::calculate_young_list_target_config(size_t rs_lengths) { bool done = false; // this is the outermost loop while (!done) { -#if 0 +#ifdef TRACE_CALC_YOUNG_CONFIG // leave this in for debugging, just in case gclog_or_tty->print_cr("searching between " SIZE_FORMAT " and " SIZE_FORMAT ", incr " SIZE_FORMAT ", pass %s", from_so_length, to_so_length, so_length_incr, (pass == pass_type_coarse) ? "coarse" : (pass == pass_type_fine) ? "fine" : "final"); -#endif // 0 +#endif // TRACE_CALC_YOUNG_CONFIG size_t so_length = from_so_length; size_t init_free_regions = @@ -651,11 +679,11 @@ void G1CollectorPolicy::calculate_young_list_target_config(size_t rs_lengths) { guarantee( so_length_incr == so_coarse_increments, "invariant" ); guarantee( final_so_length >= min_so_length, "invariant" ); -#if 0 +#ifdef TRACE_CALC_YOUNG_CONFIG // leave this in for debugging, just in case gclog_or_tty->print_cr(" coarse pass: SO length " SIZE_FORMAT, final_so_length); -#endif // 0 +#endif // TRACE_CALC_YOUNG_CONFIG from_so_length = (final_so_length - min_so_length > so_coarse_increments) ? @@ -687,12 +715,12 @@ void G1CollectorPolicy::calculate_young_list_target_config(size_t rs_lengths) { // of the optimal size_t new_so_length = 950 * final_so_length / 1000; -#if 0 +#ifdef TRACE_CALC_YOUNG_CONFIG // leave this in for debugging, just in case gclog_or_tty->print_cr(" fine pass: SO length " SIZE_FORMAT ", setting it to " SIZE_FORMAT, final_so_length, new_so_length); -#endif // 0 +#endif // TRACE_CALC_YOUNG_CONFIG from_so_length = new_so_length; to_so_length = new_so_length; @@ -719,7 +747,8 @@ void G1CollectorPolicy::calculate_young_list_target_config(size_t rs_lengths) { } // we should have at least one region in the target young length - _young_list_target_length = MAX2((size_t) 1, final_young_length); + _young_list_target_length = + MAX2((size_t) 1, final_young_length + _recorded_survivor_regions); if (final_so_length >= final_young_length) // and we need to ensure that the S-O length is not greater than // the target young length (this is being a bit careful) @@ -734,7 +763,7 @@ void G1CollectorPolicy::calculate_young_list_target_config(size_t rs_lengths) { double end_time_sec = os::elapsedTime(); double elapsed_time_ms = (end_time_sec - start_time_sec) * 1000.0; -#if 0 +#ifdef TRACE_CALC_YOUNG_CONFIG // leave this in for debugging, just in case gclog_or_tty->print_cr("target = %1.1lf ms, young = " SIZE_FORMAT ", SO = " SIZE_FORMAT ", " @@ -747,9 +776,9 @@ void G1CollectorPolicy::calculate_young_list_target_config(size_t rs_lengths) { calculations, full_young_gcs() ? "full" : "partial", should_initiate_conc_mark() ? " i-m" : "", - in_marking_window(), - in_marking_window_im()); -#endif // 0 + _in_marking_window, + _in_marking_window_im); +#endif // TRACE_CALC_YOUNG_CONFIG if (_young_list_target_length < _young_list_min_length) { // bummer; this means that, if we do a pause when the optimal @@ -768,14 +797,14 @@ void G1CollectorPolicy::calculate_young_list_target_config(size_t rs_lengths) { // S-O length so_length = calculate_optimal_so_length(_young_list_min_length); -#if 0 +#ifdef TRACE_CALC_YOUNG_CONFIG // leave this in for debugging, just in case gclog_or_tty->print_cr("adjusted target length from " SIZE_FORMAT " to " SIZE_FORMAT ", SO " SIZE_FORMAT, _young_list_target_length, _young_list_min_length, so_length); -#endif // 0 +#endif // TRACE_CALC_YOUNG_CONFIG _young_list_target_length = MAX2(_young_list_min_length, (size_t)1); @@ -785,12 +814,12 @@ void G1CollectorPolicy::calculate_young_list_target_config(size_t rs_lengths) { // we are in a partially-young mode or we've run out of regions (due // to evacuation failure) -#if 0 +#ifdef TRACE_CALC_YOUNG_CONFIG // leave this in for debugging, just in case gclog_or_tty->print_cr("(partial) setting target to " SIZE_FORMAT ", SO " SIZE_FORMAT, _young_list_min_length, 0); -#endif // 0 +#endif // TRACE_CALC_YOUNG_CONFIG // we'll do the pause as soon as possible and with no S-O prefix // (see above for the reasons behind the latter) @@ -884,6 +913,16 @@ G1CollectorPolicy::predict_gc_eff(size_t young_length, return true; } +double G1CollectorPolicy::predict_survivor_regions_evac_time() { + double survivor_regions_evac_time = 0.0; + for (HeapRegion * r = _recorded_survivor_head; + r != NULL && r != _recorded_survivor_tail->get_next_young_region(); + r = r->get_next_young_region()) { + survivor_regions_evac_time += predict_region_elapsed_time_ms(r, true); + } + return survivor_regions_evac_time; +} + void G1CollectorPolicy::check_prediction_validity() { guarantee( adaptive_young_list_length(), "should not call this otherwise" ); @@ -995,11 +1034,15 @@ void G1CollectorPolicy::record_full_collection_end() { _short_lived_surv_rate_group->start_adding_regions(); // also call this on any additional surv rate groups + record_survivor_regions(0, NULL, NULL); + _prev_region_num_young = _region_num_young; _prev_region_num_tenured = _region_num_tenured; _free_regions_at_end_of_collection = _g1->free_regions(); _scan_only_regions_at_end_of_collection = 0; + // Reset survivors SurvRateGroup. + _survivor_surv_rate_group->reset(); calculate_young_list_min_length(); calculate_young_list_target_config(); } @@ -1104,6 +1147,10 @@ void G1CollectorPolicy::record_collection_pause_start(double start_time_sec, _short_lived_surv_rate_group->record_scan_only_prefix(short_lived_so_length); tag_scan_only(short_lived_so_length); + if (G1UseSurvivorSpace) { + _survivors_age_table.clear(); + } + assert( verify_young_ages(), "region age verification" ); } @@ -1965,9 +2012,6 @@ void G1CollectorPolicy::record_collection_pause_end(bool popular, // _target_pause_time_ms = -1.0; - - // TODO: calculate tenuring threshold - _tenuring_threshold = MaxTenuringThreshold; } // @@ -2058,7 +2102,7 @@ G1CollectorPolicy::predict_bytes_to_copy(HeapRegion* hr) { guarantee( hr->is_young() && hr->age_in_surv_rate_group() != -1, "invariant" ); int age = hr->age_in_surv_rate_group(); - double yg_surv_rate = predict_yg_surv_rate(age); + double yg_surv_rate = predict_yg_surv_rate(age, hr->surv_rate_group()); bytes_to_copy = (size_t) ((double) hr->used() * yg_surv_rate); } @@ -2091,7 +2135,7 @@ G1CollectorPolicy::record_cset_region(HeapRegion* hr, bool young) { } #if PREDICTIONS_VERBOSE if (young) { - _recorded_young_bytes += hr->asSpace()->used(); + _recorded_young_bytes += hr->used(); } else { _recorded_marked_bytes += hr->max_live_bytes(); } @@ -2119,11 +2163,6 @@ G1CollectorPolicy::end_recording_regions() { predict_non_young_card_num(_predicted_rs_lengths); _recorded_region_num = _recorded_young_regions + _recorded_non_young_regions; - _predicted_young_survival_ratio = 0.0; - for (int i = 0; i < _recorded_young_regions; ++i) - _predicted_young_survival_ratio += predict_yg_surv_rate(i); - _predicted_young_survival_ratio /= (double) _recorded_young_regions; - _predicted_scan_only_scan_time_ms = predict_scan_only_time_ms(_recorded_scan_only_regions); _predicted_rs_update_time_ms = @@ -2673,8 +2712,11 @@ G1CollectorPolicy::should_add_next_region_to_young_list() { assert(in_young_gc_mode(), "should be in young GC mode"); bool ret; size_t young_list_length = _g1->young_list_length(); - - if (young_list_length < _young_list_target_length) { + size_t young_list_max_length = _young_list_target_length; + if (G1FixedEdenSize) { + young_list_max_length -= _max_survivor_regions; + } + if (young_list_length < young_list_max_length) { ret = true; ++_region_num_young; } else { @@ -2710,17 +2752,39 @@ G1CollectorPolicy::checkpoint_conc_overhead() { } -uint G1CollectorPolicy::max_regions(int purpose) { +size_t G1CollectorPolicy::max_regions(int purpose) { switch (purpose) { case GCAllocForSurvived: - return G1MaxSurvivorRegions; + return _max_survivor_regions; case GCAllocForTenured: - return UINT_MAX; + return REGIONS_UNLIMITED; default: - return UINT_MAX; + ShouldNotReachHere(); + return REGIONS_UNLIMITED; }; } +// Calculates survivor space parameters. +void G1CollectorPolicy::calculate_survivors_policy() +{ + if (!G1UseSurvivorSpace) { + return; + } + if (G1FixedSurvivorSpaceSize == 0) { + _max_survivor_regions = _young_list_target_length / SurvivorRatio; + } else { + _max_survivor_regions = G1FixedSurvivorSpaceSize / HeapRegion::GrainBytes; + } + + if (G1FixedTenuringThreshold) { + _tenuring_threshold = MaxTenuringThreshold; + } else { + _tenuring_threshold = _survivors_age_table.compute_tenuring_threshold( + HeapRegion::GrainWords * _max_survivor_regions); + } +} + + void G1CollectorPolicy_BestRegionsFirst:: set_single_region_collection_set(HeapRegion* hr) { @@ -2743,7 +2807,11 @@ G1CollectorPolicy_BestRegionsFirst::should_do_collection_pause(size_t double max_pause_time_ms = _mmu_tracker->max_gc_time() * 1000.0; size_t young_list_length = _g1->young_list_length(); - bool reached_target_length = young_list_length >= _young_list_target_length; + size_t young_list_max_length = _young_list_target_length; + if (G1FixedEdenSize) { + young_list_max_length -= _max_survivor_regions; + } + bool reached_target_length = young_list_length >= young_list_max_length; if (in_young_gc_mode()) { if (reached_target_length) { @@ -2985,6 +3053,7 @@ add_to_collection_set(HeapRegion* hr) { _collection_set = hr; _collection_set_size++; _collection_set_bytes_used_before += hr->used(); + _g1->register_region_with_in_cset_fast_test(hr); } void diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp index 110f81fef0e..1649584cd31 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp @@ -49,7 +49,7 @@ public: \ class MainBodySummary; class PopPreambleSummary; -class PauseSummary { +class PauseSummary: public CHeapObj { define_num_seq(total) define_num_seq(other) @@ -58,7 +58,7 @@ public: virtual PopPreambleSummary* pop_preamble_summary() { return NULL; } }; -class MainBodySummary { +class MainBodySummary: public CHeapObj { define_num_seq(satb_drain) // optional define_num_seq(parallel) // parallel only define_num_seq(ext_root_scan) @@ -75,7 +75,7 @@ class MainBodySummary { define_num_seq(clear_ct) // parallel only }; -class PopPreambleSummary { +class PopPreambleSummary: public CHeapObj { define_num_seq(pop_preamble) define_num_seq(pop_update_rs) define_num_seq(pop_scan_rs) @@ -557,6 +557,8 @@ public: return get_new_neg_prediction(_young_gc_eff_seq); } + double predict_survivor_regions_evac_time(); + // public: @@ -599,8 +601,8 @@ public: // Returns an estimate of the survival rate of the region at yg-age // "yg_age". - double predict_yg_surv_rate(int age) { - TruncatedSeq* seq = _short_lived_surv_rate_group->get_seq(age); + double predict_yg_surv_rate(int age, SurvRateGroup* surv_rate_group) { + TruncatedSeq* seq = surv_rate_group->get_seq(age); if (seq->num() == 0) gclog_or_tty->print("BARF! age is %d", age); guarantee( seq->num() > 0, "invariant" ); @@ -610,6 +612,10 @@ public: return pred; } + double predict_yg_surv_rate(int age) { + return predict_yg_surv_rate(age, _short_lived_surv_rate_group); + } + double accum_yg_surv_rate_pred(int age) { return _short_lived_surv_rate_group->accum_surv_rate_pred(age); } @@ -822,6 +828,9 @@ public: virtual void init(); + // Create jstat counters for the policy. + virtual void initialize_gc_policy_counters(); + virtual HeapWord* mem_allocate_work(size_t size, bool is_tlab, bool* gc_overhead_limit_was_exceeded); @@ -1047,8 +1056,12 @@ public: // Print stats on young survival ratio void print_yg_surv_rate_info() const; - void finished_recalculating_age_indexes() { - _short_lived_surv_rate_group->finished_recalculating_age_indexes(); + void finished_recalculating_age_indexes(bool is_survivors) { + if (is_survivors) { + _survivor_surv_rate_group->finished_recalculating_age_indexes(); + } else { + _short_lived_surv_rate_group->finished_recalculating_age_indexes(); + } // do that for any other surv rate groups } @@ -1097,6 +1110,17 @@ protected: // maximum amount of suvivors regions. int _tenuring_threshold; + // The limit on the number of regions allocated for survivors. + size_t _max_survivor_regions; + + // The amount of survor regions after a collection. + size_t _recorded_survivor_regions; + // List of survivor regions. + HeapRegion* _recorded_survivor_head; + HeapRegion* _recorded_survivor_tail; + + ageTable _survivors_age_table; + public: inline GCAllocPurpose @@ -1116,7 +1140,9 @@ public: return GCAllocForTenured; } - uint max_regions(int purpose); + static const size_t REGIONS_UNLIMITED = ~(size_t)0; + + size_t max_regions(int purpose); // The limit on regions for a particular purpose is reached. void note_alloc_region_limit_reached(int purpose) { @@ -1132,6 +1158,23 @@ public: void note_stop_adding_survivor_regions() { _survivor_surv_rate_group->stop_adding_regions(); } + + void record_survivor_regions(size_t regions, + HeapRegion* head, + HeapRegion* tail) { + _recorded_survivor_regions = regions; + _recorded_survivor_head = head; + _recorded_survivor_tail = tail; + } + + void record_thread_age_table(ageTable* age_table) + { + _survivors_age_table.merge_par(age_table); + } + + // Calculates survivor space parameters. + void calculate_survivors_policy(); + }; // This encapsulates a particular strategy for a g1 Collector. diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1MMUTracker.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1MMUTracker.hpp index 88a3707626b..8eb83a8bef6 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1MMUTracker.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1MMUTracker.hpp @@ -28,7 +28,7 @@ /***** ALL TIMES ARE IN SECS!!!!!!! *****/ // this is the "interface" -class G1MMUTracker { +class G1MMUTracker: public CHeapObj { protected: double _time_slice; double _max_gc_time; // this is per time slice @@ -67,7 +67,7 @@ public: } }; -class G1MMUTrackerQueueElem { +class G1MMUTrackerQueueElem VALUE_OBJ_CLASS_SPEC { private: double _start_time; double _end_time; diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp index 58653196a36..2791bf6ee6b 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp @@ -77,6 +77,18 @@ public: #define G1_PARTIAL_ARRAY_MASK 1 +inline bool has_partial_array_mask(oop* ref) { + return (intptr_t) ref & G1_PARTIAL_ARRAY_MASK; +} + +inline oop* set_partial_array_mask(oop obj) { + return (oop*) ((intptr_t) obj | G1_PARTIAL_ARRAY_MASK); +} + +inline oop clear_partial_array_mask(oop* ref) { + return oop((intptr_t) ref & ~G1_PARTIAL_ARRAY_MASK); +} + class G1ParScanPartialArrayClosure : public G1ParClosureSuper { G1ParScanClosure _scanner; template void process_array_chunk(oop obj, int start, int end); @@ -101,7 +113,8 @@ public: G1ParClosureSuper(g1, par_scan_state), _scanner(scanner) { } }; -template +template class G1ParCopyClosure : public G1ParCopyHelper { G1ParScanClosure _scanner; void do_oop_work(oop* p); @@ -119,14 +132,22 @@ public: virtual void do_oop(narrowOop* p) { do_oop_nv(p); } }; -typedef G1ParCopyClosure G1ParScanExtRootClosure; -typedef G1ParCopyClosure G1ParScanPermClosure; -typedef G1ParCopyClosure G1ParScanAndMarkExtRootClosure; -typedef G1ParCopyClosure G1ParScanAndMarkPermClosure; -typedef G1ParCopyClosure G1ParScanHeapRSClosure; -typedef G1ParCopyClosure G1ParScanAndMarkHeapRSClosure; -typedef G1ParCopyClosure G1ParScanHeapEvacClosure; - +typedef G1ParCopyClosure G1ParScanExtRootClosure; +typedef G1ParCopyClosure G1ParScanPermClosure; +typedef G1ParCopyClosure G1ParScanAndMarkExtRootClosure; +typedef G1ParCopyClosure G1ParScanAndMarkPermClosure; +typedef G1ParCopyClosure G1ParScanHeapRSClosure; +typedef G1ParCopyClosure G1ParScanAndMarkHeapRSClosure; +// This is the only case when we set skip_cset_test. Basically, this +// closure is (should?) only be called directly while we're draining +// the overflow and task queues. In that case we know that the +// reference in question points into the collection set, otherwise we +// would not have pushed it on the queue. +typedef G1ParCopyClosure G1ParScanHeapEvacClosure; +// We need a separate closure to handle references during evacuation +// failure processing, as it cannot asume that the reference already + // points to the collection set (like G1ParScanHeapEvacClosure does). +typedef G1ParCopyClosure G1ParScanHeapEvacFailureClosure; class FilterIntoCSClosure: public OopClosure { G1CollectedHeap* _g1; diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp index 462be9a689e..7946c41ff79 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp @@ -572,6 +572,9 @@ prepare_for_oops_into_collection_set_do() { } guarantee( _cards_scanned == NULL, "invariant" ); _cards_scanned = NEW_C_HEAP_ARRAY(size_t, n_workers()); + for (uint i = 0; i < n_workers(); ++i) { + _cards_scanned[i] = 0; + } _total_cards_scanned = 0; } diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.hpp index a07ba882a2c..9f03d394db2 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.hpp @@ -30,7 +30,7 @@ class CardTableModRefBarrierSet; class HRInto_G1RemSet; class ConcurrentG1Refine; -class G1RemSet { +class G1RemSet: public CHeapObj { protected: G1CollectedHeap* _g1; diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp index 72a684812d5..43b1d59c852 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp @@ -28,7 +28,7 @@ #define G1_FLAGS(develop, develop_pd, product, product_pd, diagnostic, experimental, notproduct, manageable, product_rw) \ \ - product(intx, ParallelGCG1AllocBufferSize, 4*K, \ + product(intx, ParallelGCG1AllocBufferSize, 8*K, \ "Size of parallel G1 allocation buffers in to-space.") \ \ product(intx, G1TimeSliceMS, 500, \ @@ -281,7 +281,17 @@ develop(bool, G1HRRSFlushLogBuffersOnVerify, false, \ "Forces flushing of log buffers before verification.") \ \ - product(intx, G1MaxSurvivorRegions, 0, \ - "The maximum number of survivor regions") + product(bool, G1UseSurvivorSpace, true, \ + "When true, use survivor space.") \ + \ + product(bool, G1FixedTenuringThreshold, false, \ + "When set, G1 will not adjust the tenuring threshold") \ + \ + product(bool, G1FixedEdenSize, false, \ + "When set, G1 will not allocate unused survivor space regions") \ + \ + product(uintx, G1FixedSurvivorSpaceSize, 0, \ + "If non-0 is the size of the G1 survivor space, " \ + "otherwise SurvivorRatio is used to determine the size") G1_FLAGS(DECLARE_DEVELOPER_FLAG, DECLARE_PD_DEVELOPER_FLAG, DECLARE_PRODUCT_FLAG, DECLARE_PD_PRODUCT_FLAG, DECLARE_DIAGNOSTIC_FLAG, DECLARE_EXPERIMENTAL_FLAG, DECLARE_NOTPRODUCT_FLAG, DECLARE_MANAGEABLE_FLAG, DECLARE_PRODUCT_RW_FLAG) diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1_specialized_oop_closures.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1_specialized_oop_closures.hpp index 39f72a616b7..4cfb76464e4 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1_specialized_oop_closures.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1_specialized_oop_closures.hpp @@ -32,11 +32,13 @@ enum G1Barrier { G1BarrierNone, G1BarrierRS, G1BarrierEvac }; -template +template class G1ParCopyClosure; class G1ParScanClosure; -typedef G1ParCopyClosure G1ParScanHeapEvacClosure; +typedef G1ParCopyClosure + G1ParScanHeapEvacClosure; class FilterIntoCSClosure; class FilterOutOfRegionClosure; diff --git a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp index 5c8d02f045d..10ed5a7d19b 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp @@ -566,7 +566,11 @@ class HeapRegion: public G1OffsetTableContigSpace { void note_end_of_copying() { assert(top() >= _next_top_at_mark_start, "Increase only"); - _next_top_at_mark_start = top(); + // Survivor regions will be scanned on the start of concurrent + // marking. + if (!is_survivor()) { + _next_top_at_mark_start = top(); + } } // Returns "false" iff no object in the region was allocated when the @@ -829,7 +833,7 @@ class HeapRegionClosure : public StackObj { // A linked lists of heap regions. It leaves the "next" field // unspecified; that's up to subtypes. -class RegionList { +class RegionList VALUE_OBJ_CLASS_SPEC { protected: virtual HeapRegion* get_next(HeapRegion* chr) = 0; virtual void set_next(HeapRegion* chr, diff --git a/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp b/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp index e2b15ca37c9..5e54b091976 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp @@ -65,9 +65,11 @@ protected: // We need access in order to union things into the base table. BitMap* bm() { return &_bm; } +#if PRT_COUNT_OCCUPIED void recount_occupied() { _occupied = (jint) bm()->count_one_bits(); } +#endif PerRegionTable(HeapRegion* hr) : _hr(hr), @@ -1144,7 +1146,9 @@ void HeapRegionRemSet::clear_outgoing_entries() { size_t i = _outgoing_region_map.get_next_one_offset(0); while (i < _outgoing_region_map.size()) { HeapRegion* to_region = g1h->region_at(i); - to_region->rem_set()->clear_incoming_entry(hr()); + if (!to_region->in_collection_set()) { + to_region->rem_set()->clear_incoming_entry(hr()); + } i = _outgoing_region_map.get_next_one_offset(i+1); } } diff --git a/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp b/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp index bad558a6c46..e5a713109f9 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp @@ -58,7 +58,7 @@ class SparsePRT; // is represented. If a deleted PRT is re-used, a thread adding a bit, // thinking the PRT is for a different region, does no harm. -class OtherRegionsTable: public CHeapObj { +class OtherRegionsTable VALUE_OBJ_CLASS_SPEC { friend class HeapRegionRemSetIterator; G1CollectedHeap* _g1h; diff --git a/hotspot/src/share/vm/gc_implementation/g1/ptrQueue.hpp b/hotspot/src/share/vm/gc_implementation/g1/ptrQueue.hpp index 029aac48c2f..df5557c29a6 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/ptrQueue.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/ptrQueue.hpp @@ -29,7 +29,7 @@ class PtrQueueSet; -class PtrQueue: public CHeapObj { +class PtrQueue VALUE_OBJ_CLASS_SPEC { protected: // The ptr queue set to which this queue belongs. @@ -130,7 +130,7 @@ public: // In particular, the individual queues allocate buffers from this shared // set, and return completed buffers to the set. // All these variables are are protected by the TLOQ_CBL_mon. XXX ??? -class PtrQueueSet: public CHeapObj { +class PtrQueueSet VALUE_OBJ_CLASS_SPEC { protected: diff --git a/hotspot/src/share/vm/gc_implementation/g1/sparsePRT.hpp b/hotspot/src/share/vm/gc_implementation/g1/sparsePRT.hpp index e8fa9b00be1..7c914c7f65c 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/sparsePRT.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/sparsePRT.hpp @@ -33,7 +33,7 @@ // old versions synchronously. -class SparsePRTEntry { +class SparsePRTEntry: public CHeapObj { public: enum SomePublicConstants { CardsPerEntry = (short)4, @@ -167,7 +167,7 @@ public: }; // ValueObj because will be embedded in HRRS iterator. -class RSHashTableIter: public CHeapObj { +class RSHashTableIter VALUE_OBJ_CLASS_SPEC { short _tbl_ind; short _bl_ind; short _card_ind; @@ -213,7 +213,7 @@ class RSHashTableIter: public CHeapObj { class SparsePRTIter; -class SparsePRT : public CHeapObj { +class SparsePRT VALUE_OBJ_CLASS_SPEC { // Iterations are done on the _cur hash table, since they only need to // see entries visible at the start of a collection pause. // All other operations are done using the _next hash table. diff --git a/hotspot/src/share/vm/gc_implementation/g1/survRateGroup.cpp b/hotspot/src/share/vm/gc_implementation/g1/survRateGroup.cpp index 0f2a5c95bc1..dbd709a95f4 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/survRateGroup.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/survRateGroup.cpp @@ -29,23 +29,14 @@ SurvRateGroup::SurvRateGroup(G1CollectorPolicy* g1p, const char* name, size_t summary_surv_rates_len) : _g1p(g1p), _name(name), - _all_regions_allocated(0), - _curr_length(0), _scan_only_prefix(0), _setup_seq_num(0), - _array_length(0), _surv_rate(NULL), _accum_surv_rate_pred(NULL), - _accum_surv_rate(0.0), _surv_rate_pred(NULL), _last_pred(0.0), _summary_surv_rates_len(summary_surv_rates_len), _summary_surv_rates_max_len(0), - _summary_surv_rates(NULL) { - - // the following will set up the arrays with length 1 - _curr_length = 1; - stop_adding_regions(); - guarantee( _array_length == 1, "invariant" ); - guarantee( _surv_rate_pred[0] != NULL, "invariant" ); - _surv_rate_pred[0]->add(0.4); - all_surviving_words_recorded(false); - _curr_length = 0; - + _summary_surv_rates(NULL), + _surv_rate(NULL), + _accum_surv_rate_pred(NULL), + _surv_rate_pred(NULL) +{ + reset(); if (summary_surv_rates_len > 0) { size_t length = summary_surv_rates_len; _summary_surv_rates = NEW_C_HEAP_ARRAY(NumberSeq*, length); @@ -60,61 +51,80 @@ SurvRateGroup::SurvRateGroup(G1CollectorPolicy* g1p, start_adding_regions(); } + +void SurvRateGroup::reset() +{ + _all_regions_allocated = 0; + _scan_only_prefix = 0; + _setup_seq_num = 0; + _stats_arrays_length = 0; + _accum_surv_rate = 0.0; + _last_pred = 0.0; + // the following will set up the arrays with length 1 + _region_num = 1; + stop_adding_regions(); + guarantee( _stats_arrays_length == 1, "invariant" ); + guarantee( _surv_rate_pred[0] != NULL, "invariant" ); + _surv_rate_pred[0]->add(0.4); + all_surviving_words_recorded(false); + _region_num = 0; +} + + void SurvRateGroup::start_adding_regions() { - _setup_seq_num = _array_length; - _curr_length = _scan_only_prefix; + _setup_seq_num = _stats_arrays_length; + _region_num = _scan_only_prefix; _accum_surv_rate = 0.0; #if 0 - gclog_or_tty->print_cr("start adding regions, seq num %d, length %d", - _setup_seq_num, _curr_length); + gclog_or_tty->print_cr("[%s] start adding regions, seq num %d, length %d", + _name, _setup_seq_num, _region_num); #endif // 0 } void SurvRateGroup::stop_adding_regions() { - size_t length = _curr_length; #if 0 - gclog_or_tty->print_cr("stop adding regions, length %d", length); + gclog_or_tty->print_cr("[%s] stop adding regions, length %d", _name, _region_num); #endif // 0 - if (length > _array_length) { + if (_region_num > _stats_arrays_length) { double* old_surv_rate = _surv_rate; double* old_accum_surv_rate_pred = _accum_surv_rate_pred; TruncatedSeq** old_surv_rate_pred = _surv_rate_pred; - _surv_rate = NEW_C_HEAP_ARRAY(double, length); + _surv_rate = NEW_C_HEAP_ARRAY(double, _region_num); if (_surv_rate == NULL) { - vm_exit_out_of_memory(sizeof(double) * length, + vm_exit_out_of_memory(sizeof(double) * _region_num, "Not enough space for surv rate array."); } - _accum_surv_rate_pred = NEW_C_HEAP_ARRAY(double, length); + _accum_surv_rate_pred = NEW_C_HEAP_ARRAY(double, _region_num); if (_accum_surv_rate_pred == NULL) { - vm_exit_out_of_memory(sizeof(double) * length, + vm_exit_out_of_memory(sizeof(double) * _region_num, "Not enough space for accum surv rate pred array."); } - _surv_rate_pred = NEW_C_HEAP_ARRAY(TruncatedSeq*, length); + _surv_rate_pred = NEW_C_HEAP_ARRAY(TruncatedSeq*, _region_num); if (_surv_rate == NULL) { - vm_exit_out_of_memory(sizeof(TruncatedSeq*) * length, + vm_exit_out_of_memory(sizeof(TruncatedSeq*) * _region_num, "Not enough space for surv rate pred array."); } - for (size_t i = 0; i < _array_length; ++i) + for (size_t i = 0; i < _stats_arrays_length; ++i) _surv_rate_pred[i] = old_surv_rate_pred[i]; #if 0 - gclog_or_tty->print_cr("stop adding regions, new seqs %d to %d", - _array_length, length - 1); + gclog_or_tty->print_cr("[%s] stop adding regions, new seqs %d to %d", + _name, _array_length, _region_num - 1); #endif // 0 - for (size_t i = _array_length; i < length; ++i) { + for (size_t i = _stats_arrays_length; i < _region_num; ++i) { _surv_rate_pred[i] = new TruncatedSeq(10); // _surv_rate_pred[i]->add(last_pred); } - _array_length = length; + _stats_arrays_length = _region_num; if (old_surv_rate != NULL) FREE_C_HEAP_ARRAY(double, old_surv_rate); @@ -124,7 +134,7 @@ SurvRateGroup::stop_adding_regions() { FREE_C_HEAP_ARRAY(NumberSeq*, old_surv_rate_pred); } - for (size_t i = 0; i < _array_length; ++i) + for (size_t i = 0; i < _stats_arrays_length; ++i) _surv_rate[i] = 0.0; } @@ -135,7 +145,7 @@ SurvRateGroup::accum_surv_rate(size_t adjustment) { double ret = _accum_surv_rate; if (adjustment > 0) { - TruncatedSeq* seq = get_seq(_curr_length+1); + TruncatedSeq* seq = get_seq(_region_num+1); double surv_rate = _g1p->get_new_prediction(seq); ret += surv_rate; } @@ -145,23 +155,23 @@ SurvRateGroup::accum_surv_rate(size_t adjustment) { int SurvRateGroup::next_age_index() { - TruncatedSeq* seq = get_seq(_curr_length); + TruncatedSeq* seq = get_seq(_region_num); double surv_rate = _g1p->get_new_prediction(seq); _accum_surv_rate += surv_rate; - ++_curr_length; + ++_region_num; return (int) ++_all_regions_allocated; } void SurvRateGroup::record_scan_only_prefix(size_t scan_only_prefix) { - guarantee( scan_only_prefix <= _curr_length, "pre-condition" ); + guarantee( scan_only_prefix <= _region_num, "pre-condition" ); _scan_only_prefix = scan_only_prefix; } void SurvRateGroup::record_surviving_words(int age_in_group, size_t surv_words) { - guarantee( 0 <= age_in_group && (size_t) age_in_group < _curr_length, + guarantee( 0 <= age_in_group && (size_t) age_in_group < _region_num, "pre-condition" ); guarantee( _surv_rate[age_in_group] <= 0.00001, "should only update each slot once" ); @@ -178,15 +188,15 @@ SurvRateGroup::record_surviving_words(int age_in_group, size_t surv_words) { void SurvRateGroup::all_surviving_words_recorded(bool propagate) { - if (propagate && _curr_length > 0) { // conservative - double surv_rate = _surv_rate_pred[_curr_length-1]->last(); + if (propagate && _region_num > 0) { // conservative + double surv_rate = _surv_rate_pred[_region_num-1]->last(); #if 0 gclog_or_tty->print_cr("propagating %1.2lf from %d to %d", surv_rate, _curr_length, _array_length - 1); #endif // 0 - for (size_t i = _curr_length; i < _array_length; ++i) { + for (size_t i = _region_num; i < _stats_arrays_length; ++i) { guarantee( _surv_rate[i] <= 0.00001, "the slot should not have been updated" ); _surv_rate_pred[i]->add(surv_rate); @@ -195,7 +205,7 @@ SurvRateGroup::all_surviving_words_recorded(bool propagate) { double accum = 0.0; double pred = 0.0; - for (size_t i = 0; i < _array_length; ++i) { + for (size_t i = 0; i < _stats_arrays_length; ++i) { pred = _g1p->get_new_prediction(_surv_rate_pred[i]); if (pred > 1.0) pred = 1.0; accum += pred; @@ -209,8 +219,8 @@ SurvRateGroup::all_surviving_words_recorded(bool propagate) { void SurvRateGroup::print() { gclog_or_tty->print_cr("Surv Rate Group: %s (%d entries, %d scan-only)", - _name, _curr_length, _scan_only_prefix); - for (size_t i = 0; i < _curr_length; ++i) { + _name, _region_num, _scan_only_prefix); + for (size_t i = 0; i < _region_num; ++i) { gclog_or_tty->print_cr(" age %4d surv rate %6.2lf %% pred %6.2lf %%%s", i, _surv_rate[i] * 100.0, _g1p->get_new_prediction(_surv_rate_pred[i]) * 100.0, diff --git a/hotspot/src/share/vm/gc_implementation/g1/survRateGroup.hpp b/hotspot/src/share/vm/gc_implementation/g1/survRateGroup.hpp index ce69e65f08f..1f5aa2c8bee 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/survRateGroup.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/survRateGroup.hpp @@ -29,7 +29,7 @@ private: G1CollectorPolicy* _g1p; const char* _name; - size_t _array_length; + size_t _stats_arrays_length; double* _surv_rate; double* _accum_surv_rate_pred; double _last_pred; @@ -40,7 +40,7 @@ private: size_t _summary_surv_rates_max_len; int _all_regions_allocated; - size_t _curr_length; + size_t _region_num; size_t _scan_only_prefix; size_t _setup_seq_num; @@ -48,6 +48,7 @@ public: SurvRateGroup(G1CollectorPolicy* g1p, const char* name, size_t summary_surv_rates_len); + void reset(); void start_adding_regions(); void stop_adding_regions(); void record_scan_only_prefix(size_t scan_only_prefix); @@ -55,22 +56,21 @@ public: void all_surviving_words_recorded(bool propagate); const char* name() { return _name; } - size_t region_num() { return _curr_length; } + size_t region_num() { return _region_num; } size_t scan_only_length() { return _scan_only_prefix; } double accum_surv_rate_pred(int age) { assert(age >= 0, "must be"); - if ((size_t)age < _array_length) + if ((size_t)age < _stats_arrays_length) return _accum_surv_rate_pred[age]; else { - double diff = (double) (age - _array_length + 1); - return _accum_surv_rate_pred[_array_length-1] + diff * _last_pred; + double diff = (double) (age - _stats_arrays_length + 1); + return _accum_surv_rate_pred[_stats_arrays_length-1] + diff * _last_pred; } } double accum_surv_rate(size_t adjustment); TruncatedSeq* get_seq(size_t age) { - guarantee( 0 <= age, "pre-condition" ); if (age >= _setup_seq_num) { guarantee( _setup_seq_num > 0, "invariant" ); age = _setup_seq_num-1; diff --git a/hotspot/src/share/vm/gc_implementation/includeDB_gc_concurrentMarkSweep b/hotspot/src/share/vm/gc_implementation/includeDB_gc_concurrentMarkSweep index d751d2d1f6a..ac88dc1752b 100644 --- a/hotspot/src/share/vm/gc_implementation/includeDB_gc_concurrentMarkSweep +++ b/hotspot/src/share/vm/gc_implementation/includeDB_gc_concurrentMarkSweep @@ -28,6 +28,7 @@ binaryTreeDictionary.cpp allocationStats.hpp binaryTreeDictionary.cpp binaryTreeDictionary.hpp binaryTreeDictionary.cpp globals.hpp binaryTreeDictionary.cpp ostream.hpp +binaryTreeDictionary.cpp space.inline.hpp binaryTreeDictionary.cpp spaceDecorator.hpp binaryTreeDictionary.hpp freeBlockDictionary.hpp diff --git a/hotspot/src/share/vm/gc_implementation/includeDB_gc_g1 b/hotspot/src/share/vm/gc_implementation/includeDB_gc_g1 index 536a3704fe6..84942954651 100644 --- a/hotspot/src/share/vm/gc_implementation/includeDB_gc_g1 +++ b/hotspot/src/share/vm/gc_implementation/includeDB_gc_g1 @@ -31,9 +31,10 @@ bufferingOopClosure.hpp os.hpp cardTableRS.cpp concurrentMark.hpp cardTableRS.cpp g1SATBCardTableModRefBS.hpp -collectionSetChooser.cpp g1CollectedHeap.hpp +collectionSetChooser.cpp g1CollectedHeap.inline.hpp collectionSetChooser.cpp g1CollectorPolicy.hpp collectionSetChooser.cpp collectionSetChooser.hpp +collectionSetChooser.cpp space.inline.hpp collectionSetChooser.hpp heapRegion.hpp collectionSetChooser.hpp growableArray.hpp @@ -42,14 +43,16 @@ concurrentG1Refine.cpp atomic.hpp concurrentG1Refine.cpp concurrentG1Refine.hpp concurrentG1Refine.cpp concurrentG1RefineThread.hpp concurrentG1Refine.cpp copy.hpp -concurrentG1Refine.cpp g1CollectedHeap.hpp +concurrentG1Refine.cpp g1CollectedHeap.inline.hpp concurrentG1Refine.cpp g1RemSet.hpp +concurrentG1Refine.cpp space.inline.hpp concurrentG1Refine.hpp globalDefinitions.hpp +concurrentG1Refine.hpp allocation.hpp concurrentG1RefineThread.cpp concurrentG1Refine.hpp concurrentG1RefineThread.cpp concurrentG1RefineThread.hpp -concurrentG1RefineThread.cpp g1CollectedHeap.hpp +concurrentG1RefineThread.cpp g1CollectedHeap.inline.hpp concurrentG1RefineThread.cpp g1CollectorPolicy.hpp concurrentG1RefineThread.cpp handles.inline.hpp concurrentG1RefineThread.cpp mutexLocker.hpp @@ -166,10 +169,11 @@ g1CollectorPolicy.cpp concurrentMark.hpp g1CollectorPolicy.cpp concurrentMarkThread.inline.hpp g1CollectorPolicy.cpp debug.hpp g1CollectorPolicy.cpp java.hpp -g1CollectorPolicy.cpp g1CollectedHeap.hpp +g1CollectorPolicy.cpp g1CollectedHeap.inline.hpp g1CollectorPolicy.cpp g1CollectorPolicy.hpp g1CollectorPolicy.cpp heapRegionRemSet.hpp g1CollectorPolicy.cpp mutexLocker.hpp +g1CollectorPolicy.cpp gcPolicyCounters.hpp g1CollectorPolicy.hpp collectorPolicy.hpp g1CollectorPolicy.hpp collectionSetChooser.hpp @@ -187,7 +191,7 @@ g1MarkSweep.cpp biasedLocking.hpp g1MarkSweep.cpp codeCache.hpp g1MarkSweep.cpp events.hpp g1MarkSweep.cpp fprofiler.hpp -g1MarkSweep.hpp g1CollectedHeap.hpp +g1MarkSweep.hpp g1CollectedHeap.inline.hpp g1MarkSweep.cpp g1MarkSweep.hpp g1MarkSweep.cpp gcLocker.hpp g1MarkSweep.cpp genCollectedHeap.hpp @@ -226,7 +230,7 @@ g1MMUTracker.cpp ostream.hpp g1MMUTracker.cpp mutexLocker.hpp g1MMUTracker.hpp debug.hpp - +g1MMUTracker.hpp allocation.hpp g1RemSet.cpp bufferingOopClosure.hpp g1RemSet.cpp concurrentG1Refine.hpp g1RemSet.cpp concurrentG1RefineThread.hpp @@ -264,12 +268,13 @@ heapRegion.cpp heapRegionSeq.inline.hpp heapRegion.cpp iterator.hpp heapRegion.cpp oop.inline.hpp -heapRegion.hpp space.hpp +heapRegion.hpp space.inline.hpp heapRegion.hpp spaceDecorator.hpp heapRegion.hpp g1BlockOffsetTable.inline.hpp heapRegion.hpp watermark.hpp heapRegion.hpp g1_specialized_oop_closures.hpp heapRegion.hpp survRateGroup.hpp +heapRegion.hpp ageTable.hpp heapRegionRemSet.hpp sparsePRT.hpp @@ -283,7 +288,7 @@ heapRegionRemSet.cpp globalDefinitions.hpp heapRegionRemSet.cpp space.inline.hpp heapRegionSeq.cpp allocation.hpp -heapRegionSeq.cpp g1CollectedHeap.hpp +heapRegionSeq.cpp g1CollectedHeap.inline.hpp heapRegionSeq.cpp heapRegionSeq.hpp heapRegionSeq.hpp growableArray.hpp @@ -334,18 +339,18 @@ specialized_oop_closures.hpp g1_specialized_oop_closures.hpp survRateGroup.hpp numberSeq.hpp survRateGroup.cpp allocation.hpp -survRateGroup.cpp g1CollectedHeap.hpp +survRateGroup.cpp g1CollectedHeap.inline.hpp survRateGroup.cpp g1CollectorPolicy.hpp survRateGroup.cpp heapRegion.hpp survRateGroup.cpp survRateGroup.hpp thread.cpp concurrentMarkThread.inline.hpp -universe.cpp g1CollectedHeap.hpp +universe.cpp g1CollectedHeap.inline.hpp universe.cpp g1CollectorPolicy.hpp vm_operations_g1.hpp vmGCOperations.hpp vm_operations_g1.cpp vm_operations_g1.hpp -vm_operations_g1.cpp g1CollectedHeap.hpp +vm_operations_g1.cpp g1CollectedHeap.inline.hpp vm_operations_g1.cpp isGCActiveMark.hpp diff --git a/hotspot/src/share/vm/gc_implementation/includeDB_gc_parNew b/hotspot/src/share/vm/gc_implementation/includeDB_gc_parNew index e5e5bc17b7c..0d8160ffa38 100644 --- a/hotspot/src/share/vm/gc_implementation/includeDB_gc_parNew +++ b/hotspot/src/share/vm/gc_implementation/includeDB_gc_parNew @@ -29,6 +29,8 @@ asParNewGeneration.cpp asParNewGeneration.hpp asParNewGeneration.cpp cmsAdaptiveSizePolicy.hpp asParNewGeneration.cpp cmsGCAdaptivePolicyCounters.hpp asParNewGeneration.cpp defNewGeneration.inline.hpp +asParNewGeneration.cpp markOop.inline.hpp +asParNewGeneration.cpp markSweep.inline.hpp asParNewGeneration.cpp oop.pcgc.inline.hpp asParNewGeneration.cpp parNewGeneration.hpp asParNewGeneration.cpp referencePolicy.hpp @@ -40,7 +42,7 @@ parCardTableModRefBS.cpp cardTableRS.hpp parCardTableModRefBS.cpp java.hpp parCardTableModRefBS.cpp mutexLocker.hpp parCardTableModRefBS.cpp sharedHeap.hpp -parCardTableModRefBS.cpp space.hpp +parCardTableModRefBS.cpp space.inline.hpp parCardTableModRefBS.cpp universe.hpp parCardTableModRefBS.cpp virtualspace.hpp @@ -77,6 +79,7 @@ parNewGeneration.cpp resourceArea.hpp parNewGeneration.cpp sharedHeap.hpp parNewGeneration.cpp space.hpp parNewGeneration.cpp spaceDecorator.hpp +parNewGeneration.cpp thread.hpp parNewGeneration.cpp workgroup.hpp parNewGeneration.hpp defNewGeneration.hpp diff --git a/hotspot/src/share/vm/gc_implementation/includeDB_gc_parallelScavenge b/hotspot/src/share/vm/gc_implementation/includeDB_gc_parallelScavenge index 13ba87c8391..0e0ae1a1e0e 100644 --- a/hotspot/src/share/vm/gc_implementation/includeDB_gc_parallelScavenge +++ b/hotspot/src/share/vm/gc_implementation/includeDB_gc_parallelScavenge @@ -302,6 +302,8 @@ psOldGen.hpp safepoint.hpp psOldGen.hpp spaceCounters.hpp psPermGen.cpp gcUtil.hpp +psPermGen.cpp markOop.inline.hpp +psPermGen.cpp markSweep.inline.hpp psPermGen.cpp parallelScavengeHeap.hpp psPermGen.cpp psMarkSweepDecorator.hpp psPermGen.cpp psParallelCompact.hpp diff --git a/hotspot/src/share/vm/gc_implementation/includeDB_gc_shared b/hotspot/src/share/vm/gc_implementation/includeDB_gc_shared index 7ea2265898d..99ce759a474 100644 --- a/hotspot/src/share/vm/gc_implementation/includeDB_gc_shared +++ b/hotspot/src/share/vm/gc_implementation/includeDB_gc_shared @@ -100,4 +100,4 @@ spaceCounters.hpp mutableSpace.hpp spaceCounters.hpp perfData.hpp spaceCounters.hpp generationCounters.hpp -vmGCOperations.cpp g1CollectedHeap.hpp +vmGCOperations.cpp g1CollectedHeap.inline.hpp diff --git a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp index a2b7607bb79..a5010925b00 100644 --- a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp +++ b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp @@ -404,6 +404,8 @@ void ParEvacuateFollowersClosure::do_void() { if (terminator()->offer_termination()) break; par_scan_state()->end_term_time(); } + assert(par_gen()->_overflow_list == NULL && par_gen()->_num_par_pushes == 0, + "Broken overflow list?"); // Finish the last termination pause. par_scan_state()->end_term_time(); } @@ -456,6 +458,8 @@ ParNewGeneration(ReservedSpace rs, size_t initial_byte_size, int level) _is_alive_closure(this), _plab_stats(YoungPLABSize, PLABWeight) { + NOT_PRODUCT(_overflow_counter = ParGCWorkQueueOverflowInterval;) + NOT_PRODUCT(_num_par_pushes = 0;) _task_queues = new ObjToScanQueueSet(ParallelGCThreads); guarantee(_task_queues != NULL, "task_queues allocation failure."); @@ -993,12 +997,19 @@ oop ParNewGeneration::copy_to_survivor_space_avoiding_promotion_undo( "push forwarded object"); } // Push it on one of the queues of to-be-scanned objects. - if (!par_scan_state->work_queue()->push(obj_to_push)) { + bool simulate_overflow = false; + NOT_PRODUCT( + if (ParGCWorkQueueOverflowALot && should_simulate_overflow()) { + // simulate a stack overflow + simulate_overflow = true; + } + ) + if (simulate_overflow || !par_scan_state->work_queue()->push(obj_to_push)) { // Add stats for overflow pushes. if (Verbose && PrintGCDetails) { gclog_or_tty->print("queue overflow!\n"); } - push_on_overflow_list(old); + push_on_overflow_list(old, par_scan_state); par_scan_state->note_overflow_push(); } par_scan_state->note_push(); @@ -1110,9 +1121,16 @@ oop ParNewGeneration::copy_to_survivor_space_with_undo( "push forwarded object"); } // Push it on one of the queues of to-be-scanned objects. - if (!par_scan_state->work_queue()->push(obj_to_push)) { + bool simulate_overflow = false; + NOT_PRODUCT( + if (ParGCWorkQueueOverflowALot && should_simulate_overflow()) { + // simulate a stack overflow + simulate_overflow = true; + } + ) + if (simulate_overflow || !par_scan_state->work_queue()->push(obj_to_push)) { // Add stats for overflow pushes. - push_on_overflow_list(old); + push_on_overflow_list(old, par_scan_state); par_scan_state->note_overflow_push(); } par_scan_state->note_push(); @@ -1135,89 +1153,190 @@ oop ParNewGeneration::copy_to_survivor_space_with_undo( return forward_ptr; } -void ParNewGeneration::push_on_overflow_list(oop from_space_obj) { - oop cur_overflow_list = _overflow_list; +#ifndef PRODUCT +// It's OK to call this multi-threaded; the worst thing +// that can happen is that we'll get a bunch of closely +// spaced simulated oveflows, but that's OK, in fact +// probably good as it would exercise the overflow code +// under contention. +bool ParNewGeneration::should_simulate_overflow() { + if (_overflow_counter-- <= 0) { // just being defensive + _overflow_counter = ParGCWorkQueueOverflowInterval; + return true; + } else { + return false; + } +} +#endif + +#define BUSY (oop(0x1aff1aff)) +void ParNewGeneration::push_on_overflow_list(oop from_space_obj, ParScanThreadState* par_scan_state) { // if the object has been forwarded to itself, then we cannot // use the klass pointer for the linked list. Instead we have // to allocate an oopDesc in the C-Heap and use that for the linked list. + // XXX This is horribly inefficient when a promotion failure occurs + // and should be fixed. XXX FIX ME !!! +#ifndef PRODUCT + Atomic::inc_ptr(&_num_par_pushes); + assert(_num_par_pushes > 0, "Tautology"); +#endif if (from_space_obj->forwardee() == from_space_obj) { oopDesc* listhead = NEW_C_HEAP_ARRAY(oopDesc, 1); listhead->forward_to(from_space_obj); from_space_obj = listhead; } - while (true) { - from_space_obj->set_klass_to_list_ptr(cur_overflow_list); - oop observed_overflow_list = - (oop)Atomic::cmpxchg_ptr(from_space_obj, &_overflow_list, cur_overflow_list); - if (observed_overflow_list == cur_overflow_list) break; - // Otherwise... + oop observed_overflow_list = _overflow_list; + oop cur_overflow_list; + do { cur_overflow_list = observed_overflow_list; - } + if (cur_overflow_list != BUSY) { + from_space_obj->set_klass_to_list_ptr(cur_overflow_list); + } else { + from_space_obj->set_klass_to_list_ptr(NULL); + } + observed_overflow_list = + (oop)Atomic::cmpxchg_ptr(from_space_obj, &_overflow_list, cur_overflow_list); + } while (cur_overflow_list != observed_overflow_list); } +// *NOTE*: The overflow list manipulation code here and +// in CMSCollector:: are very similar in shape, +// except that in the CMS case we thread the objects +// directly into the list via their mark word, and do +// not need to deal with special cases below related +// to chunking of object arrays and promotion failure +// handling. +// CR 6797058 has been filed to attempt consolidation of +// the common code. +// Because of the common code, if you make any changes in +// the code below, please check the CMS version to see if +// similar changes might be needed. +// See CMSCollector::par_take_from_overflow_list() for +// more extensive documentation comments. bool ParNewGeneration::take_from_overflow_list(ParScanThreadState* par_scan_state) { ObjToScanQueue* work_q = par_scan_state->work_queue(); + assert(work_q->size() == 0, "Should first empty local work queue"); // How many to take? - int objsFromOverflow = MIN2(work_q->max_elems()/4, - (juint)ParGCDesiredObjsFromOverflowList); + size_t objsFromOverflow = MIN2((size_t)work_q->max_elems()/4, + (size_t)ParGCDesiredObjsFromOverflowList); if (_overflow_list == NULL) return false; // Otherwise, there was something there; try claiming the list. - oop prefix = (oop)Atomic::xchg_ptr(NULL, &_overflow_list); - - if (prefix == NULL) { - return false; - } + oop prefix = (oop)Atomic::xchg_ptr(BUSY, &_overflow_list); // Trim off a prefix of at most objsFromOverflow items - int i = 1; + Thread* tid = Thread::current(); + size_t spin_count = (size_t)ParallelGCThreads; + size_t sleep_time_millis = MAX2((size_t)1, objsFromOverflow/100); + for (size_t spin = 0; prefix == BUSY && spin < spin_count; spin++) { + // someone grabbed it before we did ... + // ... we spin for a short while... + os::sleep(tid, sleep_time_millis, false); + if (_overflow_list == NULL) { + // nothing left to take + return false; + } else if (_overflow_list != BUSY) { + // try and grab the prefix + prefix = (oop)Atomic::xchg_ptr(BUSY, &_overflow_list); + } + } + if (prefix == NULL || prefix == BUSY) { + // Nothing to take or waited long enough + if (prefix == NULL) { + // Write back the NULL in case we overwrote it with BUSY above + // and it is still the same value. + (void) Atomic::cmpxchg_ptr(NULL, &_overflow_list, BUSY); + } + return false; + } + assert(prefix != NULL && prefix != BUSY, "Error"); + size_t i = 1; oop cur = prefix; while (i < objsFromOverflow && cur->klass_or_null() != NULL) { i++; cur = oop(cur->klass()); } // Reattach remaining (suffix) to overflow list - if (cur->klass_or_null() != NULL) { - oop suffix = oop(cur->klass()); - cur->set_klass_to_list_ptr(NULL); - - // Find last item of suffix list - oop last = suffix; - while (last->klass_or_null() != NULL) { - last = oop(last->klass()); + if (cur->klass_or_null() == NULL) { + // Write back the NULL in lieu of the BUSY we wrote + // above and it is still the same value. + if (_overflow_list == BUSY) { + (void) Atomic::cmpxchg_ptr(NULL, &_overflow_list, BUSY); } - // Atomically prepend suffix to current overflow list - oop cur_overflow_list = _overflow_list; - while (true) { - last->set_klass_to_list_ptr(cur_overflow_list); - oop observed_overflow_list = - (oop)Atomic::cmpxchg_ptr(suffix, &_overflow_list, cur_overflow_list); - if (observed_overflow_list == cur_overflow_list) break; - // Otherwise... - cur_overflow_list = observed_overflow_list; + } else { + assert(cur->klass_or_null() != BUSY, "Error"); + oop suffix = oop(cur->klass()); // suffix will be put back on global list + cur->set_klass_to_list_ptr(NULL); // break off suffix + // It's possible that the list is still in the empty(busy) state + // we left it in a short while ago; in that case we may be + // able to place back the suffix. + oop observed_overflow_list = _overflow_list; + oop cur_overflow_list = observed_overflow_list; + bool attached = false; + while (observed_overflow_list == BUSY || observed_overflow_list == NULL) { + observed_overflow_list = + (oop) Atomic::cmpxchg_ptr(suffix, &_overflow_list, cur_overflow_list); + if (cur_overflow_list == observed_overflow_list) { + attached = true; + break; + } else cur_overflow_list = observed_overflow_list; + } + if (!attached) { + // Too bad, someone else got in in between; we'll need to do a splice. + // Find the last item of suffix list + oop last = suffix; + while (last->klass_or_null() != NULL) { + last = oop(last->klass()); + } + // Atomically prepend suffix to current overflow list + observed_overflow_list = _overflow_list; + do { + cur_overflow_list = observed_overflow_list; + if (cur_overflow_list != BUSY) { + // Do the splice ... + last->set_klass_to_list_ptr(cur_overflow_list); + } else { // cur_overflow_list == BUSY + last->set_klass_to_list_ptr(NULL); + } + observed_overflow_list = + (oop)Atomic::cmpxchg_ptr(suffix, &_overflow_list, cur_overflow_list); + } while (cur_overflow_list != observed_overflow_list); } } // Push objects on prefix list onto this thread's work queue - assert(cur != NULL, "program logic"); + assert(prefix != NULL && prefix != BUSY, "program logic"); cur = prefix; - int n = 0; + ssize_t n = 0; while (cur != NULL) { oop obj_to_push = cur->forwardee(); oop next = oop(cur->klass_or_null()); cur->set_klass(obj_to_push->klass()); - if (par_scan_state->should_be_partially_scanned(obj_to_push, cur)) { - obj_to_push = cur; + // This may be an array object that is self-forwarded. In that case, the list pointer + // space, cur, is not in the Java heap, but rather in the C-heap and should be freed. + if (!is_in_reserved(cur)) { + // This can become a scaling bottleneck when there is work queue overflow coincident + // with promotion failure. + oopDesc* f = cur; + FREE_C_HEAP_ARRAY(oopDesc, f); + } else if (par_scan_state->should_be_partially_scanned(obj_to_push, cur)) { assert(arrayOop(cur)->length() == 0, "entire array remaining to be scanned"); + obj_to_push = cur; } - work_q->push(obj_to_push); + bool ok = work_q->push(obj_to_push); + assert(ok, "Should have succeeded"); cur = next; n++; } par_scan_state->note_overflow_refill(n); +#ifndef PRODUCT + assert(_num_par_pushes >= n, "Too many pops?"); + Atomic::add_ptr(-(intptr_t)n, &_num_par_pushes); +#endif return true; } +#undef BUSY void ParNewGeneration::ref_processor_init() { diff --git a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.hpp b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.hpp index a9e2d199f6c..b8de0b1e7ac 100644 --- a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.hpp +++ b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.hpp @@ -278,6 +278,7 @@ class ParNewGeneration: public DefNewGeneration { friend class ParNewRefProcTask; friend class ParNewRefProcTaskExecutor; friend class ParScanThreadStateSet; + friend class ParEvacuateFollowersClosure; private: // XXX use a global constant instead of 64! @@ -296,6 +297,7 @@ class ParNewGeneration: public DefNewGeneration { // klass-pointers (klass information already copied to the forwarded // image.) Manipulated with CAS. oop _overflow_list; + NOT_PRODUCT(ssize_t _num_par_pushes;) // If true, older generation does not support promotion undo, so avoid. static bool _avoid_promotion_undo; @@ -372,8 +374,12 @@ class ParNewGeneration: public DefNewGeneration { oop copy_to_survivor_space_with_undo(ParScanThreadState* par_scan_state, oop obj, size_t obj_sz, markOop m); + // in support of testing overflow code + NOT_PRODUCT(int _overflow_counter;) + NOT_PRODUCT(bool should_simulate_overflow();) + // Push the given (from-space) object on the global overflow list. - void push_on_overflow_list(oop from_space_obj); + void push_on_overflow_list(oop from_space_obj, ParScanThreadState* par_scan_state); // If the global overflow list is non-empty, move some tasks from it // onto "work_q" (which must be empty). No more than 1/4 of the diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.hpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.hpp index 087cdf93c01..c268b6a2f86 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.hpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.hpp @@ -200,6 +200,7 @@ class ParallelScavengeHeap : public CollectedHeap { void oop_iterate(OopClosure* cl); void object_iterate(ObjectClosure* cl); + void safe_object_iterate(ObjectClosure* cl) { object_iterate(cl); } void permanent_oop_iterate(OopClosure* cl); void permanent_object_iterate(ObjectClosure* cl); diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp index 829403f5128..608eedb8fb1 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp @@ -362,6 +362,10 @@ void PSMarkSweep::invoke_no_policy(bool clear_all_softrefs) { if (PrintHeapAtGC) { Universe::print_heap_after_gc(); } + +#ifdef TRACESPINNING + ParallelTaskTerminator::print_termination_counts(); +#endif } bool PSMarkSweep::absorb_live_data_from_eden(PSAdaptiveSizePolicy* size_policy, diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psOldGen.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psOldGen.cpp index 2335a20e183..2d31e5d72a0 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psOldGen.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psOldGen.cpp @@ -116,7 +116,7 @@ void PSOldGen::initialize_work(const char* perf_data_name, int level) { // ObjectSpace stuff // - _object_space = new MutableSpace(); + _object_space = new MutableSpace(virtual_space()->alignment()); if (_object_space == NULL) vm_exit_during_initialization("Could not allocate an old gen space"); @@ -385,10 +385,10 @@ void PSOldGen::post_resize() { start_array()->set_covered_region(new_memregion); Universe::heap()->barrier_set()->resize_covered_region(new_memregion); - HeapWord* const virtual_space_high = (HeapWord*) virtual_space()->high(); - // ALWAYS do this last!! - object_space()->set_end(virtual_space_high); + object_space()->initialize(new_memregion, + SpaceDecorator::DontClear, + SpaceDecorator::DontMangle); assert(new_word_size == heap_word_size(object_space()->capacity_in_bytes()), "Sanity"); diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp index 5d693905c98..686c65b2c53 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp @@ -2203,6 +2203,10 @@ void PSParallelCompact::invoke_no_policy(bool maximum_heap_compaction) { collection_exit.ticks()); gc_task_manager()->print_task_time_stamps(); } + +#ifdef TRACESPINNING + ParallelTaskTerminator::print_termination_counts(); +#endif } bool PSParallelCompact::absorb_live_data_from_eden(PSAdaptiveSizePolicy* size_policy, diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp index 6357362b0f7..f0bc6a85e8b 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp @@ -615,6 +615,10 @@ bool PSScavenge::invoke_no_policy() { gc_task_manager()->print_task_time_stamps(); } +#ifdef TRACESPINNING + ParallelTaskTerminator::print_termination_counts(); +#endif + return !promotion_failure_occurred; } diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.cpp index 523103f6c6f..4003e19c614 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.cpp @@ -78,7 +78,7 @@ void PSVirtualSpace::release() { _special = false; } -bool PSVirtualSpace::expand_by(size_t bytes, bool pre_touch) { +bool PSVirtualSpace::expand_by(size_t bytes) { assert(is_aligned(bytes), "arg not aligned"); DEBUG_ONLY(PSVirtualSpaceVerifier this_verifier(this)); @@ -92,15 +92,6 @@ bool PSVirtualSpace::expand_by(size_t bytes, bool pre_touch) { _committed_high_addr += bytes; } - if (pre_touch || AlwaysPreTouch) { - for (char* curr = base_addr; - curr < _committed_high_addr; - curr += os::vm_page_size()) { - char tmp = *curr; - *curr = 0; - } - } - return result; } @@ -255,7 +246,7 @@ PSVirtualSpaceHighToLow::PSVirtualSpaceHighToLow(ReservedSpace rs) { DEBUG_ONLY(verify()); } -bool PSVirtualSpaceHighToLow::expand_by(size_t bytes, bool pre_touch) { +bool PSVirtualSpaceHighToLow::expand_by(size_t bytes) { assert(is_aligned(bytes), "arg not aligned"); DEBUG_ONLY(PSVirtualSpaceVerifier this_verifier(this)); @@ -269,15 +260,6 @@ bool PSVirtualSpaceHighToLow::expand_by(size_t bytes, bool pre_touch) { _committed_low_addr -= bytes; } - if (pre_touch || AlwaysPreTouch) { - for (char* curr = base_addr; - curr < _committed_high_addr; - curr += os::vm_page_size()) { - char tmp = *curr; - *curr = 0; - } - } - return result; } diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.hpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.hpp index 8e1e03679e6..c3c1035998a 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.hpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.hpp @@ -80,7 +80,7 @@ class PSVirtualSpace : public CHeapObj { inline void set_reserved(char* low_addr, char* high_addr, bool special); inline void set_reserved(ReservedSpace rs); inline void set_committed(char* low_addr, char* high_addr); - virtual bool expand_by(size_t bytes, bool pre_touch = false); + virtual bool expand_by(size_t bytes); virtual bool shrink_by(size_t bytes); virtual size_t expand_into(PSVirtualSpace* space, size_t bytes); void release(); @@ -127,7 +127,7 @@ class PSVirtualSpaceHighToLow : public PSVirtualSpace { PSVirtualSpaceHighToLow(ReservedSpace rs, size_t alignment); PSVirtualSpaceHighToLow(ReservedSpace rs); - virtual bool expand_by(size_t bytes, bool pre_touch = false); + virtual bool expand_by(size_t bytes); virtual bool shrink_by(size_t bytes); virtual size_t expand_into(PSVirtualSpace* space, size_t bytes); diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psYoungGen.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psYoungGen.cpp index bfbffcba0dc..1b12c6bf802 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psYoungGen.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psYoungGen.cpp @@ -64,12 +64,12 @@ void PSYoungGen::initialize_work() { } if (UseNUMA) { - _eden_space = new MutableNUMASpace(); + _eden_space = new MutableNUMASpace(virtual_space()->alignment()); } else { - _eden_space = new MutableSpace(); + _eden_space = new MutableSpace(virtual_space()->alignment()); } - _from_space = new MutableSpace(); - _to_space = new MutableSpace(); + _from_space = new MutableSpace(virtual_space()->alignment()); + _to_space = new MutableSpace(virtual_space()->alignment()); if (_eden_space == NULL || _from_space == NULL || _to_space == NULL) { vm_exit_during_initialization("Could not allocate a young gen space"); diff --git a/hotspot/src/share/vm/gc_implementation/shared/ageTable.cpp b/hotspot/src/share/vm/gc_implementation/shared/ageTable.cpp index 73197bbb1bf..64fe87f7ca9 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/ageTable.cpp +++ b/hotspot/src/share/vm/gc_implementation/shared/ageTable.cpp @@ -67,6 +67,12 @@ void ageTable::merge(ageTable* subTable) { } } +void ageTable::merge_par(ageTable* subTable) { + for (int i = 0; i < table_size; i++) { + Atomic::add_ptr(subTable->sizes[i], &sizes[i]); + } +} + int ageTable::compute_tenuring_threshold(size_t survivor_capacity) { size_t desired_survivor_size = (size_t)((((double) survivor_capacity)*TargetSurvivorRatio)/100); size_t total = 0; diff --git a/hotspot/src/share/vm/gc_implementation/shared/ageTable.hpp b/hotspot/src/share/vm/gc_implementation/shared/ageTable.hpp index 932b792b914..fffef2af1ad 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/ageTable.hpp +++ b/hotspot/src/share/vm/gc_implementation/shared/ageTable.hpp @@ -56,6 +56,7 @@ class ageTable VALUE_OBJ_CLASS_SPEC { // Merge another age table with the current one. Used // for parallel young generation gc. void merge(ageTable* subTable); + void merge_par(ageTable* subTable); // calculate new tenuring threshold based on age information int compute_tenuring_threshold(size_t survivor_capacity); diff --git a/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp b/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp index c639bbf3f96..a3787c8cd29 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp +++ b/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp @@ -27,7 +27,7 @@ # include "incls/_mutableNUMASpace.cpp.incl" -MutableNUMASpace::MutableNUMASpace() { +MutableNUMASpace::MutableNUMASpace(size_t alignment) : MutableSpace(alignment) { _lgrp_spaces = new (ResourceObj::C_HEAP) GrowableArray(0, true); _page_size = os::vm_page_size(); _adaptation_cycles = 0; @@ -221,7 +221,7 @@ bool MutableNUMASpace::update_layout(bool force) { } } if (!found) { - lgrp_spaces()->append(new LGRPSpace(lgrp_ids[i])); + lgrp_spaces()->append(new LGRPSpace(lgrp_ids[i], alignment())); } } @@ -443,10 +443,10 @@ void MutableNUMASpace::select_tails(MemRegion new_region, MemRegion intersection // Is there bottom? if (new_region.start() < intersection.start()) { // Yes // Try to coalesce small pages into a large one. - if (UseLargePages && page_size() >= os::large_page_size()) { - HeapWord* p = (HeapWord*)round_to((intptr_t) intersection.start(), os::large_page_size()); + if (UseLargePages && page_size() >= alignment()) { + HeapWord* p = (HeapWord*)round_to((intptr_t) intersection.start(), alignment()); if (new_region.contains(p) - && pointer_delta(p, new_region.start(), sizeof(char)) >= os::large_page_size()) { + && pointer_delta(p, new_region.start(), sizeof(char)) >= alignment()) { if (intersection.contains(p)) { intersection = MemRegion(p, intersection.end()); } else { @@ -462,10 +462,10 @@ void MutableNUMASpace::select_tails(MemRegion new_region, MemRegion intersection // Is there top? if (intersection.end() < new_region.end()) { // Yes // Try to coalesce small pages into a large one. - if (UseLargePages && page_size() >= os::large_page_size()) { - HeapWord* p = (HeapWord*)round_down((intptr_t) intersection.end(), os::large_page_size()); + if (UseLargePages && page_size() >= alignment()) { + HeapWord* p = (HeapWord*)round_down((intptr_t) intersection.end(), alignment()); if (new_region.contains(p) - && pointer_delta(new_region.end(), p, sizeof(char)) >= os::large_page_size()) { + && pointer_delta(new_region.end(), p, sizeof(char)) >= alignment()) { if (intersection.contains(p)) { intersection = MemRegion(intersection.start(), p); } else { @@ -504,12 +504,12 @@ void MutableNUMASpace::merge_regions(MemRegion new_region, MemRegion* intersecti // That's the only case we have to make an additional bias_region() call. HeapWord* start = invalid_region->start(); HeapWord* end = invalid_region->end(); - if (UseLargePages && page_size() >= os::large_page_size()) { - HeapWord *p = (HeapWord*)round_down((intptr_t) start, os::large_page_size()); + if (UseLargePages && page_size() >= alignment()) { + HeapWord *p = (HeapWord*)round_down((intptr_t) start, alignment()); if (new_region.contains(p)) { start = p; } - p = (HeapWord*)round_to((intptr_t) end, os::large_page_size()); + p = (HeapWord*)round_to((intptr_t) end, alignment()); if (new_region.contains(end)) { end = p; } @@ -526,7 +526,8 @@ void MutableNUMASpace::merge_regions(MemRegion new_region, MemRegion* intersecti void MutableNUMASpace::initialize(MemRegion mr, bool clear_space, - bool mangle_space) { + bool mangle_space, + bool setup_pages) { assert(clear_space, "Reallocation will destory data!"); assert(lgrp_spaces()->length() > 0, "There should be at least one space"); @@ -538,7 +539,7 @@ void MutableNUMASpace::initialize(MemRegion mr, // Compute chunk sizes size_t prev_page_size = page_size(); - set_page_size(UseLargePages ? os::large_page_size() : os::vm_page_size()); + set_page_size(UseLargePages ? alignment() : os::vm_page_size()); HeapWord* rounded_bottom = (HeapWord*)round_to((intptr_t) bottom(), page_size()); HeapWord* rounded_end = (HeapWord*)round_down((intptr_t) end(), page_size()); size_t base_space_size_pages = pointer_delta(rounded_end, rounded_bottom, sizeof(char)) / page_size(); @@ -666,7 +667,7 @@ void MutableNUMASpace::initialize(MemRegion mr, } // Clear space (set top = bottom) but never mangle. - s->initialize(new_region, SpaceDecorator::Clear, SpaceDecorator::DontMangle); + s->initialize(new_region, SpaceDecorator::Clear, SpaceDecorator::DontMangle, MutableSpace::DontSetupPages); set_adaptation_cycles(samples_count()); } diff --git a/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.hpp b/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.hpp index f7ca2462545..128db555b58 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.hpp +++ b/hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.hpp @@ -82,8 +82,8 @@ class MutableNUMASpace : public MutableSpace { char* last_page_scanned() { return _last_page_scanned; } void set_last_page_scanned(char* p) { _last_page_scanned = p; } public: - LGRPSpace(int l) : _lgrp_id(l), _last_page_scanned(NULL), _allocation_failed(false) { - _space = new MutableSpace(); + LGRPSpace(int l, size_t alignment) : _lgrp_id(l), _last_page_scanned(NULL), _allocation_failed(false) { + _space = new MutableSpace(alignment); _alloc_rate = new AdaptiveWeightedAverage(NUMAChunkResizeWeight); } ~LGRPSpace() { @@ -183,10 +183,10 @@ class MutableNUMASpace : public MutableSpace { public: GrowableArray* lgrp_spaces() const { return _lgrp_spaces; } - MutableNUMASpace(); + MutableNUMASpace(size_t alignment); virtual ~MutableNUMASpace(); // Space initialization. - virtual void initialize(MemRegion mr, bool clear_space, bool mangle_space); + virtual void initialize(MemRegion mr, bool clear_space, bool mangle_space, bool setup_pages = SetupPages); // Update space layout if necessary. Do all adaptive resizing job. virtual void update(); // Update allocation rate averages. diff --git a/hotspot/src/share/vm/gc_implementation/shared/mutableSpace.cpp b/hotspot/src/share/vm/gc_implementation/shared/mutableSpace.cpp index 65c6d34cde8..90e1d3ca2ca 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/mutableSpace.cpp +++ b/hotspot/src/share/vm/gc_implementation/shared/mutableSpace.cpp @@ -25,7 +25,10 @@ # include "incls/_precompiled.incl" # include "incls/_mutableSpace.cpp.incl" -MutableSpace::MutableSpace(): ImmutableSpace(), _top(NULL) { +MutableSpace::MutableSpace(size_t alignment): ImmutableSpace(), _top(NULL), _alignment(alignment) { + assert(MutableSpace::alignment() >= 0 && + MutableSpace::alignment() % os::vm_page_size() == 0, + "Space should be aligned"); _mangler = new MutableSpaceMangler(this); } @@ -33,16 +36,88 @@ MutableSpace::~MutableSpace() { delete _mangler; } +void MutableSpace::numa_setup_pages(MemRegion mr, bool clear_space) { + if (!mr.is_empty()) { + size_t page_size = UseLargePages ? alignment() : os::vm_page_size(); + HeapWord *start = (HeapWord*)round_to((intptr_t) mr.start(), page_size); + HeapWord *end = (HeapWord*)round_down((intptr_t) mr.end(), page_size); + if (end > start) { + size_t size = pointer_delta(end, start, sizeof(char)); + if (clear_space) { + // Prefer page reallocation to migration. + os::free_memory((char*)start, size); + } + os::numa_make_global((char*)start, size); + } + } +} + +void MutableSpace::pretouch_pages(MemRegion mr) { + for (volatile char *p = (char*)mr.start(); p < (char*)mr.end(); p += os::vm_page_size()) { + char t = *p; *p = t; + } +} + void MutableSpace::initialize(MemRegion mr, bool clear_space, - bool mangle_space) { - HeapWord* bottom = mr.start(); - HeapWord* end = mr.end(); + bool mangle_space, + bool setup_pages) { - assert(Universe::on_page_boundary(bottom) && Universe::on_page_boundary(end), + assert(Universe::on_page_boundary(mr.start()) && Universe::on_page_boundary(mr.end()), "invalid space boundaries"); - set_bottom(bottom); - set_end(end); + + if (setup_pages && (UseNUMA || AlwaysPreTouch)) { + // The space may move left and right or expand/shrink. + // We'd like to enforce the desired page placement. + MemRegion head, tail; + if (last_setup_region().is_empty()) { + // If it's the first initialization don't limit the amount of work. + head = mr; + tail = MemRegion(mr.end(), mr.end()); + } else { + // Is there an intersection with the address space? + MemRegion intersection = last_setup_region().intersection(mr); + if (intersection.is_empty()) { + intersection = MemRegion(mr.end(), mr.end()); + } + // All the sizes below are in words. + size_t head_size = 0, tail_size = 0; + if (mr.start() <= intersection.start()) { + head_size = pointer_delta(intersection.start(), mr.start()); + } + if(intersection.end() <= mr.end()) { + tail_size = pointer_delta(mr.end(), intersection.end()); + } + // Limit the amount of page manipulation if necessary. + if (NUMASpaceResizeRate > 0 && !AlwaysPreTouch) { + const size_t change_size = head_size + tail_size; + const float setup_rate_words = NUMASpaceResizeRate >> LogBytesPerWord; + head_size = MIN2((size_t)(setup_rate_words * head_size / change_size), + head_size); + tail_size = MIN2((size_t)(setup_rate_words * tail_size / change_size), + tail_size); + } + head = MemRegion(intersection.start() - head_size, intersection.start()); + tail = MemRegion(intersection.end(), intersection.end() + tail_size); + } + assert(mr.contains(head) && mr.contains(tail), "Sanity"); + + if (UseNUMA) { + numa_setup_pages(head, clear_space); + numa_setup_pages(tail, clear_space); + } + + if (AlwaysPreTouch) { + pretouch_pages(head); + pretouch_pages(tail); + } + + // Remember where we stopped so that we can continue later. + set_last_setup_region(MemRegion(head.start(), tail.end())); + } + + set_bottom(mr.start()); + set_end(mr.end()); if (clear_space) { clear(mangle_space); diff --git a/hotspot/src/share/vm/gc_implementation/shared/mutableSpace.hpp b/hotspot/src/share/vm/gc_implementation/shared/mutableSpace.hpp index b55da4c8459..98382d6c410 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/mutableSpace.hpp +++ b/hotspot/src/share/vm/gc_implementation/shared/mutableSpace.hpp @@ -25,7 +25,10 @@ // A MutableSpace is a subtype of ImmutableSpace that supports the // concept of allocation. This includes the concepts that a space may // be only partially full, and the querry methods that go with such -// an assumption. +// an assumption. MutableSpace is also responsible for minimizing the +// page allocation time by having the memory pretouched (with +// AlwaysPretouch) and for optimizing page placement on NUMA systems +// by make the underlying region interleaved (with UseNUMA). // // Invariant: (ImmutableSpace +) bottom() <= top() <= end() // top() is inclusive and end() is exclusive. @@ -37,15 +40,23 @@ class MutableSpace: public ImmutableSpace { // Helper for mangling unused space in debug builds MutableSpaceMangler* _mangler; - + // The last region which page had been setup to be interleaved. + MemRegion _last_setup_region; + size_t _alignment; protected: HeapWord* _top; MutableSpaceMangler* mangler() { return _mangler; } + void numa_setup_pages(MemRegion mr, bool clear_space); + void pretouch_pages(MemRegion mr); + + void set_last_setup_region(MemRegion mr) { _last_setup_region = mr; } + MemRegion last_setup_region() const { return _last_setup_region; } + public: virtual ~MutableSpace(); - MutableSpace(); + MutableSpace(size_t page_size); // Accessors HeapWord* top() const { return _top; } @@ -57,13 +68,20 @@ class MutableSpace: public ImmutableSpace { virtual void set_bottom(HeapWord* value) { _bottom = value; } virtual void set_end(HeapWord* value) { _end = value; } + size_t alignment() { return _alignment; } + // Returns a subregion containing all objects in this space. MemRegion used_region() { return MemRegion(bottom(), top()); } + static const bool SetupPages = true; + static const bool DontSetupPages = false; + // Initialization virtual void initialize(MemRegion mr, bool clear_space, - bool mangle_space); + bool mangle_space, + bool setup_pages = SetupPages); + virtual void clear(bool mangle_space); // Does the usual initialization but optionally resets top to bottom. #if 0 // MANGLE_SPACE diff --git a/hotspot/src/share/vm/gc_interface/collectedHeap.hpp b/hotspot/src/share/vm/gc_interface/collectedHeap.hpp index 13d30c70b6d..210e6b32b90 100644 --- a/hotspot/src/share/vm/gc_interface/collectedHeap.hpp +++ b/hotspot/src/share/vm/gc_interface/collectedHeap.hpp @@ -42,6 +42,7 @@ class Thread; class CollectedHeap : public CHeapObj { friend class VMStructs; friend class IsGCActiveMark; // Block structured external access to _is_gc_active + friend class constantPoolCacheKlass; // allocate() method inserts is_conc_safe #ifdef ASSERT static int _fire_out_of_memory_count; @@ -82,8 +83,6 @@ class CollectedHeap : public CHeapObj { // Reinitialize tlabs before resuming mutators. virtual void resize_all_tlabs(); - debug_only(static void check_for_valid_allocation_state();) - protected: // Allocate from the current thread's TLAB, with broken-out slow path. inline static HeapWord* allocate_from_tlab(Thread* thread, size_t size); @@ -142,6 +141,7 @@ class CollectedHeap : public CHeapObj { PRODUCT_RETURN; virtual void check_for_non_bad_heap_word_value(HeapWord* addr, size_t size) PRODUCT_RETURN; + debug_only(static void check_for_valid_allocation_state();) public: enum Name { @@ -466,6 +466,10 @@ class CollectedHeap : public CHeapObj { // This includes objects in permanent memory. virtual void object_iterate(ObjectClosure* cl) = 0; + // Similar to object_iterate() except iterates only + // over live objects. + virtual void safe_object_iterate(ObjectClosure* cl) = 0; + // Behaves the same as oop_iterate, except only traverses // interior pointers contained in permanent memory. If there // is no permanent memory, does nothing. diff --git a/hotspot/src/share/vm/includeDB_compiler2 b/hotspot/src/share/vm/includeDB_compiler2 index ea3b88cc172..bf84589334c 100644 --- a/hotspot/src/share/vm/includeDB_compiler2 +++ b/hotspot/src/share/vm/includeDB_compiler2 @@ -140,6 +140,7 @@ c2_globals_.hpp globalDefinitions.hpp c2_globals_.hpp macros.hpp c2_init_.cpp compile.hpp +c2_init_.cpp node.hpp c2compiler.cpp ad_.hpp c2compiler.cpp c2compiler.hpp @@ -839,6 +840,7 @@ parseHelper.cpp systemDictionary.hpp phase.cpp compile.hpp phase.cpp compileBroker.hpp phase.cpp nmethod.hpp +phase.cpp node.hpp phase.cpp phase.hpp phase.hpp port.hpp diff --git a/hotspot/src/share/vm/includeDB_core b/hotspot/src/share/vm/includeDB_core index 7ca1fcabef5..8d39f327758 100644 --- a/hotspot/src/share/vm/includeDB_core +++ b/hotspot/src/share/vm/includeDB_core @@ -1311,6 +1311,7 @@ cppInterpreter_.cpp bytecodeHistogram.hpp cppInterpreter_.cpp debug.hpp cppInterpreter_.cpp deoptimization.hpp cppInterpreter_.cpp frame.inline.hpp +cppInterpreter_.cpp interfaceSupport.hpp cppInterpreter_.cpp interpreterRuntime.hpp cppInterpreter_.cpp interpreter.hpp cppInterpreter_.cpp interpreterGenerator.hpp @@ -2014,7 +2015,7 @@ instanceKlass.cpp verifier.hpp instanceKlass.cpp vmSymbols.hpp instanceKlass.hpp accessFlags.hpp -instanceKlass.hpp bitMap.hpp +instanceKlass.hpp bitMap.inline.hpp instanceKlass.hpp constMethodOop.hpp instanceKlass.hpp constantPoolOop.hpp instanceKlass.hpp handles.hpp @@ -3771,6 +3772,7 @@ spaceDecorator.hpp space.hpp spaceDecorator.cpp copy.hpp spaceDecorator.cpp spaceDecorator.hpp +spaceDecorator.cpp space.inline.hpp specialized_oop_closures.cpp ostream.hpp specialized_oop_closures.cpp specialized_oop_closures.hpp diff --git a/hotspot/src/share/vm/includeDB_features b/hotspot/src/share/vm/includeDB_features index d783a04e55b..e136dfe784a 100644 --- a/hotspot/src/share/vm/includeDB_features +++ b/hotspot/src/share/vm/includeDB_features @@ -59,6 +59,8 @@ dump.cpp vm_operations.hpp dump_.cpp assembler_.inline.hpp dump_.cpp compactingPermGenGen.hpp +dump_.cpp generation.inline.hpp +dump_.cpp space.inline.hpp forte.cpp collectedHeap.inline.hpp forte.cpp debugInfoRec.hpp diff --git a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp index b4204414a94..351d29cc9cc 100644 --- a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp +++ b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp @@ -163,7 +163,7 @@ #ifdef USELABELS // Have to do this dispatch this way in C++ because otherwise gcc complains about crossing an // initialization (which is is the initialization of the table pointer...) -#define DISPATCH(opcode) goto *dispatch_table[opcode] +#define DISPATCH(opcode) goto *(void*)dispatch_table[opcode] #define CONTINUE { \ opcode = *pc; \ DO_UPDATE_INSTRUCTION_COUNT(opcode); \ @@ -341,7 +341,7 @@ */ #undef CHECK_NULL #define CHECK_NULL(obj_) \ - if ((obj_) == 0) { \ + if ((obj_) == NULL) { \ VM_JAVA_ERROR(vmSymbols::java_lang_NullPointerException(), ""); \ } @@ -1362,7 +1362,7 @@ run: #define NULL_COMPARISON_NOT_OP(name) \ CASE(_if##name): { \ - int skip = (!(STACK_OBJECT(-1) == 0)) \ + int skip = (!(STACK_OBJECT(-1) == NULL)) \ ? (int16_t)Bytes::get_Java_u2(pc + 1) : 3; \ address branch_pc = pc; \ UPDATE_PC_AND_TOS(skip, -1); \ @@ -1372,7 +1372,7 @@ run: #define NULL_COMPARISON_OP(name) \ CASE(_if##name): { \ - int skip = ((STACK_OBJECT(-1) == 0)) \ + int skip = ((STACK_OBJECT(-1) == NULL)) \ ? (int16_t)Bytes::get_Java_u2(pc + 1) : 3; \ address branch_pc = pc; \ UPDATE_PC_AND_TOS(skip, -1); \ diff --git a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.hpp b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.hpp index 715acf671a2..a1504851a38 100644 --- a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.hpp +++ b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.hpp @@ -66,7 +66,6 @@ friend class CppInterpreterGenerator; friend class InterpreterGenerator; friend class InterpreterMacroAssembler; friend class frame; -friend class SharedRuntime; friend class VMStructs; public: diff --git a/hotspot/src/share/vm/interpreter/rewriter.cpp b/hotspot/src/share/vm/interpreter/rewriter.cpp index d000012b5cb..323ea8f9a28 100644 --- a/hotspot/src/share/vm/interpreter/rewriter.cpp +++ b/hotspot/src/share/vm/interpreter/rewriter.cpp @@ -48,9 +48,14 @@ void Rewriter::compute_index_maps(constantPoolHandle pool, intArray*& index_map, // Creates a constant pool cache given an inverse_index_map +// This creates the constant pool cache initially in a state +// that is unsafe for concurrent GC processing but sets it to +// a safe mode before the constant pool cache is returned. constantPoolCacheHandle Rewriter::new_constant_pool_cache(intArray& inverse_index_map, TRAPS) { const int length = inverse_index_map.length(); - constantPoolCacheOop cache = oopFactory::new_constantPoolCache(length, CHECK_(constantPoolCacheHandle())); + constantPoolCacheOop cache = oopFactory::new_constantPoolCache(length, + methodOopDesc::IsUnsafeConc, + CHECK_(constantPoolCacheHandle())); cache->initialize(inverse_index_map); return constantPoolCacheHandle(THREAD, cache); } diff --git a/hotspot/src/share/vm/libadt/dict.cpp b/hotspot/src/share/vm/libadt/dict.cpp index 3ac20d6c29e..003dd6a4f05 100644 --- a/hotspot/src/share/vm/libadt/dict.cpp +++ b/hotspot/src/share/vm/libadt/dict.cpp @@ -346,9 +346,12 @@ int32 cmpstr(const void *k1, const void *k2) { return strcmp((const char *)k1,(const char *)k2); } -// Slimey cheap key comparator. +// Cheap key comparator. int32 cmpkey(const void *key1, const void *key2) { - return (int32)((intptr_t)key1 - (intptr_t)key2); + if (key1 == key2) return 0; + intptr_t delta = (intptr_t)key1 - (intptr_t)key2; + if (delta > 0) return 1; + return -1; } //============================================================================= diff --git a/hotspot/src/share/vm/libadt/port.hpp b/hotspot/src/share/vm/libadt/port.hpp index 70034d09bbd..68a84f1a4ce 100644 --- a/hotspot/src/share/vm/libadt/port.hpp +++ b/hotspot/src/share/vm/libadt/port.hpp @@ -34,17 +34,6 @@ #include #include #include -#undef bzero -inline void bzero(void *b, int len) { memset(b,0,len); } -#undef bcopy -inline void bcopy(const void *s, void *d, size_t len) { memmove(d,s,len); } -#undef bcmp -inline int bcmp(const void *s,const void *t,int len) { return memcmp(s,t,len);} -extern "C" unsigned long strtoul(const char *s, char **end, int base); - -// Definition for sys_errlist varies from Sun 4.1 & Solaris. -// We use the new Solaris definition. -#include // Access to the C++ class virtual function pointer // Put the class in the macro diff --git a/hotspot/src/share/vm/memory/genCollectedHeap.cpp b/hotspot/src/share/vm/memory/genCollectedHeap.cpp index 832a3331e19..5bb817f0280 100644 --- a/hotspot/src/share/vm/memory/genCollectedHeap.cpp +++ b/hotspot/src/share/vm/memory/genCollectedHeap.cpp @@ -610,6 +610,10 @@ void GenCollectedHeap::do_collection(bool full, Universe::print_heap_after_gc(); } +#ifdef TRACESPINNING + ParallelTaskTerminator::print_termination_counts(); +#endif + if (ExitAfterGCNum > 0 && total_collections() == ExitAfterGCNum) { tty->print_cr("Stopping after GC #%d", ExitAfterGCNum); vm_exit(-1); @@ -910,6 +914,13 @@ void GenCollectedHeap::object_iterate(ObjectClosure* cl) { perm_gen()->object_iterate(cl); } +void GenCollectedHeap::safe_object_iterate(ObjectClosure* cl) { + for (int i = 0; i < _n_gens; i++) { + _gens[i]->safe_object_iterate(cl); + } + perm_gen()->safe_object_iterate(cl); +} + void GenCollectedHeap::object_iterate_since_last_GC(ObjectClosure* cl) { for (int i = 0; i < _n_gens; i++) { _gens[i]->object_iterate_since_last_GC(cl); diff --git a/hotspot/src/share/vm/memory/genCollectedHeap.hpp b/hotspot/src/share/vm/memory/genCollectedHeap.hpp index f9a4d508753..3ab20cfd19f 100644 --- a/hotspot/src/share/vm/memory/genCollectedHeap.hpp +++ b/hotspot/src/share/vm/memory/genCollectedHeap.hpp @@ -215,6 +215,7 @@ public: void oop_iterate(OopClosure* cl); void oop_iterate(MemRegion mr, OopClosure* cl); void object_iterate(ObjectClosure* cl); + void safe_object_iterate(ObjectClosure* cl); void object_iterate_since_last_GC(ObjectClosure* cl); Space* space_containing(const void* addr) const; diff --git a/hotspot/src/share/vm/memory/generation.cpp b/hotspot/src/share/vm/memory/generation.cpp index 5167db243b6..d7b1d9f871d 100644 --- a/hotspot/src/share/vm/memory/generation.cpp +++ b/hotspot/src/share/vm/memory/generation.cpp @@ -319,6 +319,21 @@ void Generation::object_iterate(ObjectClosure* cl) { space_iterate(&blk); } +class GenerationSafeObjIterateClosure : public SpaceClosure { + private: + ObjectClosure* _cl; + public: + virtual void do_space(Space* s) { + s->safe_object_iterate(_cl); + } + GenerationSafeObjIterateClosure(ObjectClosure* cl) : _cl(cl) {} +}; + +void Generation::safe_object_iterate(ObjectClosure* cl) { + GenerationSafeObjIterateClosure blk(cl); + space_iterate(&blk); +} + void Generation::prepare_for_compaction(CompactPoint* cp) { // Generic implementation, can be specialized CompactibleSpace* space = first_compaction_space(); diff --git a/hotspot/src/share/vm/memory/generation.hpp b/hotspot/src/share/vm/memory/generation.hpp index 0f0e74e4794..206949901e4 100644 --- a/hotspot/src/share/vm/memory/generation.hpp +++ b/hotspot/src/share/vm/memory/generation.hpp @@ -518,6 +518,11 @@ class Generation: public CHeapObj { // each. virtual void object_iterate(ObjectClosure* cl); + // Iterate over all safe objects in the generation, calling "cl.do_object" on + // each. An object is safe if its references point to other objects in + // the heap. This defaults to object_iterate() unless overridden. + virtual void safe_object_iterate(ObjectClosure* cl); + // Iterate over all objects allocated in the generation since the last // collection, calling "cl.do_object" on each. The generation must have // been initialized properly to support this function, or else this call diff --git a/hotspot/src/share/vm/memory/heapInspection.cpp b/hotspot/src/share/vm/memory/heapInspection.cpp index e3d6fbd7b5a..3bc17bea600 100644 --- a/hotspot/src/share/vm/memory/heapInspection.cpp +++ b/hotspot/src/share/vm/memory/heapInspection.cpp @@ -263,6 +263,9 @@ void HeapInspection::heap_inspection(outputStream* st) { if (!cit.allocation_failed()) { // Iterate over objects in the heap RecordInstanceClosure ric(&cit); + // If this operation encounters a bad object when using CMS, + // consider using safe_object_iterate() which avoids perm gen + // objects that may contain bad references. Universe::heap()->object_iterate(&ric); // Report if certain classes are not counted because of @@ -317,5 +320,8 @@ void HeapInspection::find_instances_at_safepoint(klassOop k, GrowableArray* // Iterate over objects in the heap FindInstanceClosure fic(k, result); + // If this operation encounters a bad object when using CMS, + // consider using safe_object_iterate() which avoids perm gen + // objects that may contain bad references. Universe::heap()->object_iterate(&fic); } diff --git a/hotspot/src/share/vm/memory/oopFactory.cpp b/hotspot/src/share/vm/memory/oopFactory.cpp index e9ea08d3b23..32bd1f82236 100644 --- a/hotspot/src/share/vm/memory/oopFactory.cpp +++ b/hotspot/src/share/vm/memory/oopFactory.cpp @@ -82,15 +82,19 @@ objArrayOop oopFactory::new_system_objArray(int length, TRAPS) { } -constantPoolOop oopFactory::new_constantPool(int length, TRAPS) { +constantPoolOop oopFactory::new_constantPool(int length, + bool is_conc_safe, + TRAPS) { constantPoolKlass* ck = constantPoolKlass::cast(Universe::constantPoolKlassObj()); - return ck->allocate(length, CHECK_NULL); + return ck->allocate(length, is_conc_safe, CHECK_NULL); } -constantPoolCacheOop oopFactory::new_constantPoolCache(int length, TRAPS) { +constantPoolCacheOop oopFactory::new_constantPoolCache(int length, + bool is_conc_safe, + TRAPS) { constantPoolCacheKlass* ck = constantPoolCacheKlass::cast(Universe::constantPoolCacheKlassObj()); - return ck->allocate(length, CHECK_NULL); + return ck->allocate(length, is_conc_safe, CHECK_NULL); } @@ -105,11 +109,13 @@ constMethodOop oopFactory::new_constMethod(int byte_code_size, int compressed_line_number_size, int localvariable_table_length, int checked_exceptions_length, + bool is_conc_safe, TRAPS) { klassOop cmkObj = Universe::constMethodKlassObj(); constMethodKlass* cmk = constMethodKlass::cast(cmkObj); return cmk->allocate(byte_code_size, compressed_line_number_size, localvariable_table_length, checked_exceptions_length, + is_conc_safe, CHECK_NULL); } @@ -117,14 +123,17 @@ constMethodOop oopFactory::new_constMethod(int byte_code_size, methodOop oopFactory::new_method(int byte_code_size, AccessFlags access_flags, int compressed_line_number_size, int localvariable_table_length, - int checked_exceptions_length, TRAPS) { + int checked_exceptions_length, + bool is_conc_safe, + TRAPS) { methodKlass* mk = methodKlass::cast(Universe::methodKlassObj()); assert(!access_flags.is_native() || byte_code_size == 0, "native methods should not contain byte codes"); constMethodOop cm = new_constMethod(byte_code_size, compressed_line_number_size, localvariable_table_length, - checked_exceptions_length, CHECK_NULL); + checked_exceptions_length, + is_conc_safe, CHECK_NULL); constMethodHandle rw(THREAD, cm); return mk->allocate(rw, access_flags, CHECK_NULL); } diff --git a/hotspot/src/share/vm/memory/oopFactory.hpp b/hotspot/src/share/vm/memory/oopFactory.hpp index 855e0fcf43e..a0db0f52172 100644 --- a/hotspot/src/share/vm/memory/oopFactory.hpp +++ b/hotspot/src/share/vm/memory/oopFactory.hpp @@ -81,8 +81,12 @@ class oopFactory: AllStatic { static symbolHandle new_symbol_handle(const char* name, TRAPS) { return new_symbol_handle(name, (int)strlen(name), CHECK_(symbolHandle())); } // Constant pools - static constantPoolOop new_constantPool (int length, TRAPS); - static constantPoolCacheOop new_constantPoolCache(int length, TRAPS); + static constantPoolOop new_constantPool (int length, + bool is_conc_safe, + TRAPS); + static constantPoolCacheOop new_constantPoolCache(int length, + bool is_conc_safe, + TRAPS); // Instance classes static klassOop new_instanceKlass(int vtable_len, int itable_len, int static_field_size, @@ -93,9 +97,20 @@ private: static constMethodOop new_constMethod(int byte_code_size, int compressed_line_number_size, int localvariable_table_length, - int checked_exceptions_length, TRAPS); + int checked_exceptions_length, + bool is_conc_safe, + TRAPS); public: - static methodOop new_method(int byte_code_size, AccessFlags access_flags, int compressed_line_number_size, int localvariable_table_length, int checked_exceptions_length, TRAPS); + // Set is_conc_safe for methods which cannot safely be + // processed by concurrent GC even after the return of + // the method. + static methodOop new_method(int byte_code_size, + AccessFlags access_flags, + int compressed_line_number_size, + int localvariable_table_length, + int checked_exceptions_length, + bool is_conc_safe, + TRAPS); // Method Data containers static methodDataOop new_methodData(methodHandle method, TRAPS); diff --git a/hotspot/src/share/vm/memory/referenceProcessor.cpp b/hotspot/src/share/vm/memory/referenceProcessor.cpp index 073886f2f93..ac6f4777e5f 100644 --- a/hotspot/src/share/vm/memory/referenceProcessor.cpp +++ b/hotspot/src/share/vm/memory/referenceProcessor.cpp @@ -721,12 +721,6 @@ ReferenceProcessor::process_phase3(DiscoveredList& refs_list, iter.obj(), iter.obj()->blueprint()->internal_name()); } assert(iter.obj()->is_oop(UseConcMarkSweepGC), "Adding a bad reference"); - // If discovery is concurrent, we may have objects with null referents, - // being those that were concurrently cleared after they were discovered - // (and not subsequently precleaned). - assert( (discovery_is_atomic() && iter.referent()->is_oop()) - || (!discovery_is_atomic() && iter.referent()->is_oop_or_null(UseConcMarkSweepGC)), - "Adding a bad referent"); iter.next(); } // Remember to keep sentinel pointer around diff --git a/hotspot/src/share/vm/memory/space.cpp b/hotspot/src/share/vm/memory/space.cpp index 652d585bb8f..00f97001384 100644 --- a/hotspot/src/share/vm/memory/space.cpp +++ b/hotspot/src/share/vm/memory/space.cpp @@ -569,7 +569,15 @@ void Space::object_iterate_mem(MemRegion mr, UpwardsObjectClosure* cl) { if (prev > mr.start()) { region_start_addr = prev; blk_start_addr = prev; - assert(blk_start_addr == block_start(region_start_addr), "invariant"); + // The previous invocation may have pushed "prev" beyond the + // last allocated block yet there may be still be blocks + // in this region due to a particular coalescing policy. + // Relax the assertion so that the case where the unallocated + // block is maintained and "prev" is beyond the unallocated + // block does not cause the assertion to fire. + assert((BlockOffsetArrayUseUnallocatedBlock && + (!is_in(prev))) || + (blk_start_addr == block_start(region_start_addr)), "invariant"); } else { region_start_addr = mr.start(); blk_start_addr = block_start(region_start_addr); @@ -705,6 +713,12 @@ void ContiguousSpace::object_iterate(ObjectClosure* blk) { object_iterate_from(bm, blk); } +// For a continguous space object_iterate() and safe_object_iterate() +// are the same. +void ContiguousSpace::safe_object_iterate(ObjectClosure* blk) { + object_iterate(blk); +} + void ContiguousSpace::object_iterate_from(WaterMark mark, ObjectClosure* blk) { assert(mark.space() == this, "Mark does not match space"); HeapWord* p = mark.point(); diff --git a/hotspot/src/share/vm/memory/space.hpp b/hotspot/src/share/vm/memory/space.hpp index a102c5f220c..f055638e8dd 100644 --- a/hotspot/src/share/vm/memory/space.hpp +++ b/hotspot/src/share/vm/memory/space.hpp @@ -193,6 +193,9 @@ class Space: public CHeapObj { // each. Objects allocated by applications of the closure are not // included in the iteration. virtual void object_iterate(ObjectClosure* blk) = 0; + // Similar to object_iterate() except only iterates over + // objects whose internal references point to objects in the space. + virtual void safe_object_iterate(ObjectClosure* blk) = 0; // Iterate over all objects that intersect with mr, calling "cl->do_object" // on each. There is an exception to this: if this closure has already @@ -843,6 +846,9 @@ class ContiguousSpace: public CompactibleSpace { void oop_iterate(OopClosure* cl); void oop_iterate(MemRegion mr, OopClosure* cl); void object_iterate(ObjectClosure* blk); + // For contiguous spaces this method will iterate safely over objects + // in the space (i.e., between bottom and top) when at a safepoint. + void safe_object_iterate(ObjectClosure* blk); void object_iterate_mem(MemRegion mr, UpwardsObjectClosure* cl); // iterates on objects up to the safe limit HeapWord* object_iterate_careful(ObjectClosureCareful* cl); diff --git a/hotspot/src/share/vm/oops/constMethodKlass.cpp b/hotspot/src/share/vm/oops/constMethodKlass.cpp index 802c4430afa..f2fe1706a16 100644 --- a/hotspot/src/share/vm/oops/constMethodKlass.cpp +++ b/hotspot/src/share/vm/oops/constMethodKlass.cpp @@ -49,10 +49,16 @@ bool constMethodKlass::oop_is_parsable(oop obj) const { return constMethodOop(obj)->object_is_parsable(); } +bool constMethodKlass::oop_is_conc_safe(oop obj) const { + assert(obj->is_constMethod(), "must be constMethod oop"); + return constMethodOop(obj)->is_conc_safe(); +} + constMethodOop constMethodKlass::allocate(int byte_code_size, int compressed_line_number_size, int localvariable_table_length, int checked_exceptions_length, + bool is_conc_safe, TRAPS) { int size = constMethodOopDesc::object_size(byte_code_size, @@ -75,6 +81,7 @@ constMethodOop constMethodKlass::allocate(int byte_code_size, compressed_line_number_size, localvariable_table_length); assert(cm->size() == size, "wrong size for object"); + cm->set_is_conc_safe(is_conc_safe); cm->set_partially_loaded(); assert(cm->is_parsable(), "Is safely parsable by gc"); return cm; diff --git a/hotspot/src/share/vm/oops/constMethodKlass.hpp b/hotspot/src/share/vm/oops/constMethodKlass.hpp index 87fc9c3156d..a3f7d9710f7 100644 --- a/hotspot/src/share/vm/oops/constMethodKlass.hpp +++ b/hotspot/src/share/vm/oops/constMethodKlass.hpp @@ -32,12 +32,16 @@ public: // Testing bool oop_is_constMethod() const { return true; } virtual bool oop_is_parsable(oop obj) const; + virtual bool oop_is_conc_safe(oop obj) const; + // Allocation DEFINE_ALLOCATE_PERMANENT(constMethodKlass); constMethodOop allocate(int byte_code_size, int compressed_line_number_size, int localvariable_table_length, - int checked_exceptions_length, TRAPS); + int checked_exceptions_length, + bool is_conc_safe, + TRAPS); static klassOop create_klass(TRAPS); // Sizing diff --git a/hotspot/src/share/vm/oops/constMethodOop.hpp b/hotspot/src/share/vm/oops/constMethodOop.hpp index e9ffa4b66bc..4669e6a852f 100644 --- a/hotspot/src/share/vm/oops/constMethodOop.hpp +++ b/hotspot/src/share/vm/oops/constMethodOop.hpp @@ -104,6 +104,7 @@ private: // loads and stores. This value may updated and read without a lock by // multiple threads, so is volatile. volatile uint64_t _fingerprint; + volatile bool _is_conc_safe; // if true, safe for concurrent GC processing public: oop* oop_block_beg() const { return adr_method(); } @@ -273,6 +274,8 @@ public: oop* adr_method() const { return (oop*)&_method; } oop* adr_stackmap_data() const { return (oop*)&_stackmap_data; } oop* adr_exception_table() const { return (oop*)&_exception_table; } + bool is_conc_safe() { return _is_conc_safe; } + void set_is_conc_safe(bool v) { _is_conc_safe = v; } // Unique id for the method static const u2 MAX_IDNUM; diff --git a/hotspot/src/share/vm/oops/constantPoolKlass.cpp b/hotspot/src/share/vm/oops/constantPoolKlass.cpp index 593b74668ff..2a17c00e1ce 100644 --- a/hotspot/src/share/vm/oops/constantPoolKlass.cpp +++ b/hotspot/src/share/vm/oops/constantPoolKlass.cpp @@ -25,7 +25,7 @@ # include "incls/_precompiled.incl" # include "incls/_constantPoolKlass.cpp.incl" -constantPoolOop constantPoolKlass::allocate(int length, TRAPS) { +constantPoolOop constantPoolKlass::allocate(int length, bool is_conc_safe, TRAPS) { int size = constantPoolOopDesc::object_size(length); KlassHandle klass (THREAD, as_klassOop()); constantPoolOop c = @@ -38,6 +38,9 @@ constantPoolOop constantPoolKlass::allocate(int length, TRAPS) { c->set_flags(0); // only set to non-zero if constant pool is merged by RedefineClasses c->set_orig_length(0); + // if constant pool may change during RedefineClasses, it is created + // unsafe for GC concurrent processing. + c->set_is_conc_safe(is_conc_safe); // all fields are initialized; needed for GC // initialize tag array @@ -207,6 +210,11 @@ int constantPoolKlass::oop_oop_iterate_m(oop obj, OopClosure* blk, MemRegion mr) return size; } +bool constantPoolKlass::oop_is_conc_safe(oop obj) const { + assert(obj->is_constantPool(), "must be constantPool"); + return constantPoolOop(obj)->is_conc_safe(); +} + #ifndef SERIALGC int constantPoolKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) { assert (obj->is_constantPool(), "obj must be constant pool"); diff --git a/hotspot/src/share/vm/oops/constantPoolKlass.hpp b/hotspot/src/share/vm/oops/constantPoolKlass.hpp index 324efbec023..2f9efc285ef 100644 --- a/hotspot/src/share/vm/oops/constantPoolKlass.hpp +++ b/hotspot/src/share/vm/oops/constantPoolKlass.hpp @@ -34,7 +34,7 @@ class constantPoolKlass : public Klass { // Allocation DEFINE_ALLOCATE_PERMANENT(constantPoolKlass); - constantPoolOop allocate(int length, TRAPS); + constantPoolOop allocate(int length, bool is_conc_safe, TRAPS); static klassOop create_klass(TRAPS); // Casting from klassOop @@ -48,6 +48,8 @@ class constantPoolKlass : public Klass { int object_size() const { return align_object_size(header_size()); } // Garbage collection + // Returns true is the object is safe for GC concurrent processing. + virtual bool oop_is_conc_safe(oop obj) const; void oop_follow_contents(oop obj); int oop_adjust_pointers(oop obj); diff --git a/hotspot/src/share/vm/oops/constantPoolOop.cpp b/hotspot/src/share/vm/oops/constantPoolOop.cpp index 842f8067934..e90bda568e9 100644 --- a/hotspot/src/share/vm/oops/constantPoolOop.cpp +++ b/hotspot/src/share/vm/oops/constantPoolOop.cpp @@ -962,7 +962,7 @@ static void print_cpool_bytes(jint cnt, u1 *bytes) { } case JVM_CONSTANT_Long: { u8 val = Bytes::get_Java_u8(bytes); - printf("long %lldl", *(jlong *) &val); + printf("long "INT64_FORMAT, *(jlong *) &val); ent_size = 8; idx++; // Long takes two cpool slots break; diff --git a/hotspot/src/share/vm/oops/constantPoolOop.hpp b/hotspot/src/share/vm/oops/constantPoolOop.hpp index 5627059091f..fd2264c1eab 100644 --- a/hotspot/src/share/vm/oops/constantPoolOop.hpp +++ b/hotspot/src/share/vm/oops/constantPoolOop.hpp @@ -43,6 +43,8 @@ class constantPoolOopDesc : public oopDesc { klassOop _pool_holder; // the corresponding class int _flags; // a few header bits to describe contents for GC int _length; // number of elements in the array + volatile bool _is_conc_safe; // if true, safe for concurrent + // GC processing // only set to non-zero if constant pool is merged by RedefineClasses int _orig_length; @@ -379,6 +381,9 @@ class constantPoolOopDesc : public oopDesc { static int object_size(int length) { return align_object_size(header_size() + length); } int object_size() { return object_size(length()); } + bool is_conc_safe() { return _is_conc_safe; } + void set_is_conc_safe(bool v) { _is_conc_safe = v; } + friend class constantPoolKlass; friend class ClassFileParser; friend class SystemDictionary; diff --git a/hotspot/src/share/vm/oops/cpCacheKlass.cpp b/hotspot/src/share/vm/oops/cpCacheKlass.cpp index 241914dca65..95fd11ded28 100644 --- a/hotspot/src/share/vm/oops/cpCacheKlass.cpp +++ b/hotspot/src/share/vm/oops/cpCacheKlass.cpp @@ -32,13 +32,43 @@ int constantPoolCacheKlass::oop_size(oop obj) const { } -constantPoolCacheOop constantPoolCacheKlass::allocate(int length, TRAPS) { +constantPoolCacheOop constantPoolCacheKlass::allocate(int length, + bool is_conc_safe, + TRAPS) { // allocate memory int size = constantPoolCacheOopDesc::object_size(length); + KlassHandle klass (THREAD, as_klassOop()); - constantPoolCacheOop cache = (constantPoolCacheOop) - CollectedHeap::permanent_obj_allocate(klass, size, CHECK_NULL); + + // This is the original code. The code from permanent_obj_allocate() + // was in-lined to allow the setting of is_conc_safe before the klass + // is installed. + // constantPoolCacheOop cache = (constantPoolCacheOop) + // CollectedHeap::permanent_obj_allocate(klass, size, CHECK_NULL); + + oop obj = CollectedHeap::permanent_obj_allocate_no_klass_install(klass, size, CHECK_NULL); + constantPoolCacheOop cache = (constantPoolCacheOop) obj; + cache->set_is_conc_safe(is_conc_safe); + // The store to is_conc_safe must be visible before the klass + // is set. This should be done safely because _is_conc_safe has + // been declared volatile. If there are any problems, consider adding + // OrderAccess::storestore(); + CollectedHeap::post_allocation_install_obj_klass(klass, obj, size); + NOT_PRODUCT(Universe::heap()->check_for_bad_heap_word_value((HeapWord*) obj, + size)); + + // The length field affects the size of the object. The allocation + // above allocates the correct size (see calculation of "size") but + // the size() method of the constant pool cache oop will not reflect + // that size until the correct length is set. cache->set_length(length); + + // The store of the length must be visible before is_conc_safe is + // set to a safe state. + // This should be done safely because _is_conc_safe has + // been declared volatile. If there are any problems, consider adding + // OrderAccess::storestore(); + cache->set_is_conc_safe(methodOopDesc::IsSafeConc); cache->set_constant_pool(NULL); return cache; } @@ -114,7 +144,6 @@ int constantPoolCacheKlass::oop_oop_iterate_m(oop obj, OopClosure* blk, MemRegio return size; } - int constantPoolCacheKlass::oop_adjust_pointers(oop obj) { assert(obj->is_constantPoolCache(), "obj must be constant pool cache"); constantPoolCacheOop cache = (constantPoolCacheOop)obj; @@ -131,6 +160,11 @@ int constantPoolCacheKlass::oop_adjust_pointers(oop obj) { return size; } +bool constantPoolCacheKlass::oop_is_conc_safe(oop obj) const { + assert(obj->is_constantPoolCache(), "should be constant pool"); + return constantPoolCacheOop(obj)->is_conc_safe(); +} + #ifndef SERIALGC void constantPoolCacheKlass::oop_copy_contents(PSPromotionManager* pm, oop obj) { diff --git a/hotspot/src/share/vm/oops/cpCacheKlass.hpp b/hotspot/src/share/vm/oops/cpCacheKlass.hpp index ea826671dbc..299910052ae 100644 --- a/hotspot/src/share/vm/oops/cpCacheKlass.hpp +++ b/hotspot/src/share/vm/oops/cpCacheKlass.hpp @@ -32,7 +32,7 @@ class constantPoolCacheKlass: public Klass { // Allocation DEFINE_ALLOCATE_PERMANENT(constantPoolCacheKlass); - constantPoolCacheOop allocate(int length, TRAPS); + constantPoolCacheOop allocate(int length, bool is_conc_safe, TRAPS); static klassOop create_klass(TRAPS); // Casting from klassOop @@ -48,6 +48,7 @@ class constantPoolCacheKlass: public Klass { // Garbage collection void oop_follow_contents(oop obj); int oop_adjust_pointers(oop obj); + virtual bool oop_is_conc_safe(oop obj) const; // Parallel Scavenge and Parallel Old PARALLEL_GC_DECLS diff --git a/hotspot/src/share/vm/oops/cpCacheOop.hpp b/hotspot/src/share/vm/oops/cpCacheOop.hpp index ccdb4472e2c..c5ba6052191 100644 --- a/hotspot/src/share/vm/oops/cpCacheOop.hpp +++ b/hotspot/src/share/vm/oops/cpCacheOop.hpp @@ -291,6 +291,9 @@ class constantPoolCacheOopDesc: public oopDesc { private: int _length; constantPoolOop _constant_pool; // the corresponding constant pool + // If true, safe for concurrent GC processing, + // Set unconditionally in constantPoolCacheKlass::allocate() + volatile bool _is_conc_safe; // Sizing debug_only(friend class ClassVerifier;) @@ -316,6 +319,12 @@ class constantPoolCacheOopDesc: public oopDesc { constantPoolOop constant_pool() const { return _constant_pool; } ConstantPoolCacheEntry* entry_at(int i) const { assert(0 <= i && i < length(), "index out of bounds"); return base() + i; } + // GC support + // If the _length field has not been set, the size of the + // constantPoolCache cannot be correctly calculated. + bool is_conc_safe() { return _is_conc_safe; } + void set_is_conc_safe(bool v) { _is_conc_safe = v; } + // Code generation static ByteSize base_offset() { return in_ByteSize(sizeof(constantPoolCacheOopDesc)); } diff --git a/hotspot/src/share/vm/oops/klass.hpp b/hotspot/src/share/vm/oops/klass.hpp index 46852c02ee1..881da970d03 100644 --- a/hotspot/src/share/vm/oops/klass.hpp +++ b/hotspot/src/share/vm/oops/klass.hpp @@ -606,8 +606,19 @@ class Klass : public Klass_vtbl { #undef assert_same_query // Unless overridden, oop is parsable if it has a klass pointer. + // Parsability of an object is object specific. virtual bool oop_is_parsable(oop obj) const { return true; } + // Unless overridden, oop is safe for concurrent GC processing + // after its allocation is complete. The exception to + // this is the case where objects are changed after allocation. + // Class redefinition is one of the known exceptions. During + // class redefinition, an allocated class can changed in order + // order to create a merged class (the combiniation of the + // old class definition that has to be perserved and the new class + // definition which is being created. + virtual bool oop_is_conc_safe(oop obj) const { return true; } + // Access flags AccessFlags access_flags() const { return _access_flags; } void set_access_flags(AccessFlags flags) { _access_flags = flags; } diff --git a/hotspot/src/share/vm/oops/methodOop.cpp b/hotspot/src/share/vm/oops/methodOop.cpp index 8a5507cbac8..c239ccf1a2c 100644 --- a/hotspot/src/share/vm/oops/methodOop.cpp +++ b/hotspot/src/share/vm/oops/methodOop.cpp @@ -792,15 +792,34 @@ methodHandle methodOopDesc:: clone_with_new_data(methodHandle m, u_char* new_cod AccessFlags flags = m->access_flags(); int checked_exceptions_len = m->checked_exceptions_length(); int localvariable_len = m->localvariable_table_length(); - methodOop newm_oop = oopFactory::new_method(new_code_length, flags, new_compressed_linenumber_size, localvariable_len, checked_exceptions_len, CHECK_(methodHandle())); + // Allocate newm_oop with the is_conc_safe parameter set + // to IsUnsafeConc to indicate that newm_oop is not yet + // safe for concurrent processing by a GC. + methodOop newm_oop = oopFactory::new_method(new_code_length, + flags, + new_compressed_linenumber_size, + localvariable_len, + checked_exceptions_len, + IsUnsafeConc, + CHECK_(methodHandle())); methodHandle newm (THREAD, newm_oop); int new_method_size = newm->method_size(); // Create a shallow copy of methodOopDesc part, but be careful to preserve the new constMethodOop constMethodOop newcm = newm->constMethod(); int new_const_method_size = newm->constMethod()->object_size(); + memcpy(newm(), m(), sizeof(methodOopDesc)); // Create shallow copy of constMethodOopDesc, but be careful to preserve the methodOop + // is_conc_safe is set to false because that is the value of + // is_conc_safe initialzied into newcm and the copy should + // not overwrite that value. During the window during which it is + // tagged as unsafe, some extra work could be needed during precleaning + // or concurrent marking but those phases will be correct. Setting and + // resetting is done in preference to a careful copying into newcm to + // avoid having to know the precise layout of a constMethodOop. + m->constMethod()->set_is_conc_safe(false); memcpy(newcm, m->constMethod(), sizeof(constMethodOopDesc)); + m->constMethod()->set_is_conc_safe(true); // Reset correct method/const method, method size, and parameter info newcm->set_method(newm()); newm->set_constMethod(newcm); @@ -831,6 +850,10 @@ methodHandle methodOopDesc:: clone_with_new_data(methodHandle m, u_char* new_cod m->localvariable_table_start(), localvariable_len * sizeof(LocalVariableTableElement)); } + + // Only set is_conc_safe to true when changes to newcm are + // complete. + newcm->set_is_conc_safe(true); return newm; } diff --git a/hotspot/src/share/vm/oops/methodOop.hpp b/hotspot/src/share/vm/oops/methodOop.hpp index 965181c664d..8b03a68380a 100644 --- a/hotspot/src/share/vm/oops/methodOop.hpp +++ b/hotspot/src/share/vm/oops/methodOop.hpp @@ -129,6 +129,10 @@ class methodOopDesc : public oopDesc { volatile address _from_interpreted_entry; // Cache of _code ? _adapter->i2c_entry() : _i2i_entry public: + + static const bool IsUnsafeConc = false; + static const bool IsSafeConc = true; + // accessors for instance variables constMethodOop constMethod() const { return _constMethod; } void set_constMethod(constMethodOop xconst) { oop_store_without_check((oop*)&_constMethod, (oop)xconst); } diff --git a/hotspot/src/share/vm/oops/oop.hpp b/hotspot/src/share/vm/oops/oop.hpp index 07c2ba5ac52..ba13ca63c44 100644 --- a/hotspot/src/share/vm/oops/oop.hpp +++ b/hotspot/src/share/vm/oops/oop.hpp @@ -108,6 +108,13 @@ class oopDesc { // installation of their klass pointer. bool is_parsable(); + // Some perm gen objects that have been allocated and initialized + // can be changed by the VM when not at a safe point (class rededfinition + // is an example). Such objects should not be examined by the + // concurrent processing of a garbage collector if is_conc_safe() + // returns false. + bool is_conc_safe(); + // type test operations (inlined in oop.inline.h) bool is_instance() const; bool is_instanceRef() const; diff --git a/hotspot/src/share/vm/oops/oop.inline.hpp b/hotspot/src/share/vm/oops/oop.inline.hpp index 0c7a3967f48..9161310de60 100644 --- a/hotspot/src/share/vm/oops/oop.inline.hpp +++ b/hotspot/src/share/vm/oops/oop.inline.hpp @@ -435,6 +435,10 @@ inline bool oopDesc::is_parsable() { return blueprint()->oop_is_parsable(this); } +inline bool oopDesc::is_conc_safe() { + return blueprint()->oop_is_conc_safe(this); +} + inline void update_barrier_set(void* p, oop v) { assert(oopDesc::bs() != NULL, "Uninitialized bs in oop!"); oopDesc::bs()->write_ref_field(p, v); diff --git a/hotspot/src/share/vm/oops/oopsHierarchy.hpp b/hotspot/src/share/vm/oops/oopsHierarchy.hpp index 597dafe3de8..06c64d0e46f 100644 --- a/hotspot/src/share/vm/oops/oopsHierarchy.hpp +++ b/hotspot/src/share/vm/oops/oopsHierarchy.hpp @@ -126,8 +126,11 @@ public: operator jobject () const { return (jobject)obj(); } // from javaClasses.cpp operator JavaThread* () const { return (JavaThread*)obj(); } + +#ifndef _LP64 // from jvm.cpp operator jlong* () const { return (jlong*)obj(); } +#endif // from parNewGeneration and other things that want to get to the end of // an oop for stuff (like constMethodKlass.cpp, objArrayKlass.cpp) diff --git a/hotspot/src/share/vm/opto/block.cpp b/hotspot/src/share/vm/opto/block.cpp index 1de186518d9..cf15fa7c4fb 100644 --- a/hotspot/src/share/vm/opto/block.cpp +++ b/hotspot/src/share/vm/opto/block.cpp @@ -880,6 +880,7 @@ void PhaseCFG::dump_headers() { } void PhaseCFG::verify( ) const { +#ifdef ASSERT // Verify sane CFG for( uint i = 0; i < _num_blocks; i++ ) { Block *b = _blocks[i]; @@ -894,10 +895,20 @@ void PhaseCFG::verify( ) const { "CreateEx must be first instruction in block" ); } for( uint k = 0; k < n->req(); k++ ) { - Node *use = n->in(k); - if( use && use != n ) { - assert( _bbs[use->_idx] || use->is_Con(), + Node *def = n->in(k); + if( def && def != n ) { + assert( _bbs[def->_idx] || def->is_Con(), "must have block; constants for debug info ok" ); + // Verify that instructions in the block is in correct order. + // Uses must follow their definition if they are at the same block. + // Mostly done to check that MachSpillCopy nodes are placed correctly + // when CreateEx node is moved in build_ifg_physical(). + if( _bbs[def->_idx] == b && + !(b->head()->is_Loop() && n->is_Phi()) && + // See (+++) comment in reg_split.cpp + !(n->jvms() != NULL && n->jvms()->is_monitor_use(k)) ) { + assert( b->find_node(def) < j, "uses must follow definitions" ); + } } } } @@ -914,6 +925,7 @@ void PhaseCFG::verify( ) const { assert( b->_num_succs == 2, "Conditional branch must have two targets"); } } +#endif } #endif diff --git a/hotspot/src/share/vm/opto/c2_globals.hpp b/hotspot/src/share/vm/opto/c2_globals.hpp index 844d637e519..3a516ab98bd 100644 --- a/hotspot/src/share/vm/opto/c2_globals.hpp +++ b/hotspot/src/share/vm/opto/c2_globals.hpp @@ -191,6 +191,9 @@ notproduct(bool, VerifyHashTableKeys, true, \ "Verify the immutability of keys in the VN hash tables") \ \ + notproduct(bool, VerifyRegisterAllocator , false, \ + "Verify Register Allocator") \ + \ develop_pd(intx, FLOATPRESSURE, \ "Number of float LRG's that constitute high register pressure") \ \ diff --git a/hotspot/src/share/vm/opto/cfgnode.cpp b/hotspot/src/share/vm/opto/cfgnode.cpp index fdee151f1e9..e29cc0d58e3 100644 --- a/hotspot/src/share/vm/opto/cfgnode.cpp +++ b/hotspot/src/share/vm/opto/cfgnode.cpp @@ -858,12 +858,18 @@ const Type *PhiNode::Value( PhaseTransform *phase ) const { // convert the one to the other. const TypePtr* ttp = _type->make_ptr(); const TypeInstPtr* ttip = (ttp != NULL) ? ttp->isa_instptr() : NULL; + const TypeKlassPtr* ttkp = (ttp != NULL) ? ttp->isa_klassptr() : NULL; bool is_intf = false; if (ttip != NULL) { ciKlass* k = ttip->klass(); if (k->is_loaded() && k->is_interface()) is_intf = true; } + if (ttkp != NULL) { + ciKlass* k = ttkp->klass(); + if (k->is_loaded() && k->is_interface()) + is_intf = true; + } // Default case: merge all inputs const Type *t = Type::TOP; // Merged type starting value @@ -921,6 +927,8 @@ const Type *PhiNode::Value( PhaseTransform *phase ) const { // uplift the type. if( !t->empty() && ttip && ttip->is_loaded() && ttip->klass()->is_interface() ) { assert(ft == _type, ""); } // Uplift to interface + else if( !t->empty() && ttkp && ttkp->is_loaded() && ttkp->klass()->is_interface() ) + { assert(ft == _type, ""); } // Uplift to interface // Otherwise it's something stupid like non-overlapping int ranges // found on dying counted loops. else @@ -936,6 +944,7 @@ const Type *PhiNode::Value( PhaseTransform *phase ) const { // because the type system doesn't interact well with interfaces. const TypePtr *jtp = jt->make_ptr(); const TypeInstPtr *jtip = (jtp != NULL) ? jtp->isa_instptr() : NULL; + const TypeKlassPtr *jtkp = (jtp != NULL) ? jtp->isa_klassptr() : NULL; if( jtip && ttip ) { if( jtip->is_loaded() && jtip->klass()->is_interface() && ttip->is_loaded() && !ttip->klass()->is_interface() ) { @@ -945,6 +954,14 @@ const Type *PhiNode::Value( PhaseTransform *phase ) const { jt = ft; } } + if( jtkp && ttkp ) { + if( jtkp->is_loaded() && jtkp->klass()->is_interface() && + ttkp->is_loaded() && !ttkp->klass()->is_interface() ) { + assert(ft == ttkp->cast_to_ptr_type(jtkp->ptr()) || + ft->isa_narrowoop() && ft->make_ptr() == ttkp->cast_to_ptr_type(jtkp->ptr()), ""); + jt = ft; + } + } if (jt != ft && jt->base() == ft->base()) { if (jt->isa_int() && jt->is_int()->_lo == ft->is_int()->_lo && diff --git a/hotspot/src/share/vm/opto/chaitin.cpp b/hotspot/src/share/vm/opto/chaitin.cpp index 0456db5dc11..82558d8f577 100644 --- a/hotspot/src/share/vm/opto/chaitin.cpp +++ b/hotspot/src/share/vm/opto/chaitin.cpp @@ -228,6 +228,11 @@ void PhaseChaitin::Register_Allocate() { // them for real. de_ssa(); +#ifdef ASSERT + // Veify the graph before RA. + verify(&live_arena); +#endif + { NOT_PRODUCT( Compile::TracePhase t3("computeLive", &_t_computeLive, TimeCompiler); ) _live = NULL; // Mark live as being not available @@ -306,12 +311,6 @@ void PhaseChaitin::Register_Allocate() { C->check_node_count(2*NodeLimitFudgeFactor, "out of nodes after physical split"); if (C->failing()) return; -#ifdef ASSERT - if( VerifyOpto ) { - _cfg.verify(); - verify_base_ptrs(&live_arena); - } -#endif NOT_PRODUCT( C->verify_graph_edges(); ) compact(); // Compact LRGs; return new lower max lrg @@ -340,7 +339,7 @@ void PhaseChaitin::Register_Allocate() { compress_uf_map_for_nodes(); #ifdef ASSERT - if( VerifyOpto ) _ifg->verify(this); + verify(&live_arena, true); #endif } else { ifg.SquareUp(); @@ -376,12 +375,6 @@ void PhaseChaitin::Register_Allocate() { // Bail out if unique gets too large (ie - unique > MaxNodeLimit - 2*NodeLimitFudgeFactor) C->check_node_count(2*NodeLimitFudgeFactor, "out of nodes after split"); if (C->failing()) return; -#ifdef ASSERT - if( VerifyOpto ) { - _cfg.verify(); - verify_base_ptrs(&live_arena); - } -#endif compact(); // Compact LRGs; return new lower max lrg @@ -412,7 +405,7 @@ void PhaseChaitin::Register_Allocate() { } compress_uf_map_for_nodes(); #ifdef ASSERT - if( VerifyOpto ) _ifg->verify(this); + verify(&live_arena, true); #endif cache_lrg_info(); // Count degree of LRGs @@ -432,6 +425,11 @@ void PhaseChaitin::Register_Allocate() { // Peephole remove copies post_allocate_copy_removal(); +#ifdef ASSERT + // Veify the graph after RA. + verify(&live_arena); +#endif + // max_reg is past the largest *register* used. // Convert that to a frame_slot number. if( _max_reg <= _matcher._new_SP ) @@ -956,7 +954,7 @@ void PhaseChaitin::Simplify( ) { while ((neighbor = elements.next()) != 0) { LRG *n = &lrgs(neighbor); #ifdef ASSERT - if( VerifyOpto ) { + if( VerifyOpto || VerifyRegisterAllocator ) { assert( _ifg->effective_degree(neighbor) == n->degree(), "" ); } #endif diff --git a/hotspot/src/share/vm/opto/chaitin.hpp b/hotspot/src/share/vm/opto/chaitin.hpp index 9c7cc593e40..307d6110c04 100644 --- a/hotspot/src/share/vm/opto/chaitin.hpp +++ b/hotspot/src/share/vm/opto/chaitin.hpp @@ -491,6 +491,8 @@ private: // Verify that base pointers and derived pointers are still sane void verify_base_ptrs( ResourceArea *a ) const; + void verify( ResourceArea *a, bool verify_ifg = false ) const; + void dump_for_spill_split_recycle() const; public: diff --git a/hotspot/src/share/vm/opto/classes.hpp b/hotspot/src/share/vm/opto/classes.hpp index 14b43120059..bbb3e79990e 100644 --- a/hotspot/src/share/vm/opto/classes.hpp +++ b/hotspot/src/share/vm/opto/classes.hpp @@ -129,7 +129,7 @@ macro(JumpProj) macro(LShiftI) macro(LShiftL) macro(LoadB) -macro(LoadC) +macro(LoadUS) macro(LoadD) macro(LoadD_unaligned) macro(LoadF) diff --git a/hotspot/src/share/vm/opto/compile.cpp b/hotspot/src/share/vm/opto/compile.cpp index de05e5fb84a..7c6f751f8ff 100644 --- a/hotspot/src/share/vm/opto/compile.cpp +++ b/hotspot/src/share/vm/opto/compile.cpp @@ -2005,7 +2005,7 @@ static void final_graph_reshaping_impl( Node *n, Final_Reshape_Counts &fpu ) { case Op_StoreP: case Op_StoreN: case Op_LoadB: - case Op_LoadC: + case Op_LoadUS: case Op_LoadI: case Op_LoadKlass: case Op_LoadNKlass: diff --git a/hotspot/src/share/vm/opto/divnode.cpp b/hotspot/src/share/vm/opto/divnode.cpp index 94240873ef5..67cad067960 100644 --- a/hotspot/src/share/vm/opto/divnode.cpp +++ b/hotspot/src/share/vm/opto/divnode.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2009 Sun Microsystems, Inc. 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 @@ -244,42 +244,73 @@ static bool magic_long_divide_constants(jlong d, jlong &M, jint &s) { //---------------------long_by_long_mulhi-------------------------------------- // Generate ideal node graph for upper half of a 64 bit x 64 bit multiplication -static Node *long_by_long_mulhi( PhaseGVN *phase, Node *dividend, jlong magic_const) { +static Node* long_by_long_mulhi(PhaseGVN* phase, Node* dividend, jlong magic_const) { // If the architecture supports a 64x64 mulhi, there is // no need to synthesize it in ideal nodes. if (Matcher::has_match_rule(Op_MulHiL)) { - Node *v = phase->longcon(magic_const); + Node* v = phase->longcon(magic_const); return new (phase->C, 3) MulHiLNode(dividend, v); } + // Taken from Hacker's Delight, Fig. 8-2. Multiply high signed. + // (http://www.hackersdelight.org/HDcode/mulhs.c) + // + // int mulhs(int u, int v) { + // unsigned u0, v0, w0; + // int u1, v1, w1, w2, t; + // + // u0 = u & 0xFFFF; u1 = u >> 16; + // v0 = v & 0xFFFF; v1 = v >> 16; + // w0 = u0*v0; + // t = u1*v0 + (w0 >> 16); + // w1 = t & 0xFFFF; + // w2 = t >> 16; + // w1 = u0*v1 + w1; + // return u1*v1 + w2 + (w1 >> 16); + // } + // + // Note: The version above is for 32x32 multiplications, while the + // following inline comments are adapted to 64x64. + const int N = 64; - Node *u_hi = phase->transform(new (phase->C, 3) RShiftLNode(dividend, phase->intcon(N / 2))); - Node *u_lo = phase->transform(new (phase->C, 3) AndLNode(dividend, phase->longcon(0xFFFFFFFF))); + // u0 = u & 0xFFFFFFFF; u1 = u >> 32; + Node* u0 = phase->transform(new (phase->C, 3) AndLNode(dividend, phase->longcon(0xFFFFFFFF))); + Node* u1 = phase->transform(new (phase->C, 3) RShiftLNode(dividend, phase->intcon(N / 2))); - Node *v_hi = phase->longcon(magic_const >> N/2); - Node *v_lo = phase->longcon(magic_const & 0XFFFFFFFF); + // v0 = v & 0xFFFFFFFF; v1 = v >> 32; + Node* v0 = phase->longcon(magic_const & 0xFFFFFFFF); + Node* v1 = phase->longcon(magic_const >> (N / 2)); - Node *hihi_product = phase->transform(new (phase->C, 3) MulLNode(u_hi, v_hi)); - Node *hilo_product = phase->transform(new (phase->C, 3) MulLNode(u_hi, v_lo)); - Node *lohi_product = phase->transform(new (phase->C, 3) MulLNode(u_lo, v_hi)); - Node *lolo_product = phase->transform(new (phase->C, 3) MulLNode(u_lo, v_lo)); + // w0 = u0*v0; + Node* w0 = phase->transform(new (phase->C, 3) MulLNode(u0, v0)); - Node *t1 = phase->transform(new (phase->C, 3) URShiftLNode(lolo_product, phase->intcon(N / 2))); - Node *t2 = phase->transform(new (phase->C, 3) AddLNode(hilo_product, t1)); + // t = u1*v0 + (w0 >> 32); + Node* u1v0 = phase->transform(new (phase->C, 3) MulLNode(u1, v0)); + Node* temp = phase->transform(new (phase->C, 3) URShiftLNode(w0, phase->intcon(N / 2))); + Node* t = phase->transform(new (phase->C, 3) AddLNode(u1v0, temp)); - // Construct both t3 and t4 before transforming so t2 doesn't go dead - // prematurely. - Node *t3 = new (phase->C, 3) RShiftLNode(t2, phase->intcon(N / 2)); - Node *t4 = new (phase->C, 3) AndLNode(t2, phase->longcon(0xFFFFFFFF)); - t3 = phase->transform(t3); - t4 = phase->transform(t4); + // w1 = t & 0xFFFFFFFF; + Node* w1 = new (phase->C, 3) AndLNode(t, phase->longcon(0xFFFFFFFF)); - Node *t5 = phase->transform(new (phase->C, 3) AddLNode(t4, lohi_product)); - Node *t6 = phase->transform(new (phase->C, 3) RShiftLNode(t5, phase->intcon(N / 2))); - Node *t7 = phase->transform(new (phase->C, 3) AddLNode(t3, hihi_product)); + // w2 = t >> 32; + Node* w2 = new (phase->C, 3) RShiftLNode(t, phase->intcon(N / 2)); - return new (phase->C, 3) AddLNode(t7, t6); + // 6732154: Construct both w1 and w2 before transforming, so t + // doesn't go dead prematurely. + w1 = phase->transform(w1); + w2 = phase->transform(w2); + + // w1 = u0*v1 + w1; + Node* u0v1 = phase->transform(new (phase->C, 3) MulLNode(u0, v1)); + w1 = phase->transform(new (phase->C, 3) AddLNode(u0v1, w1)); + + // return u1*v1 + w2 + (w1 >> 32); + Node* u1v1 = phase->transform(new (phase->C, 3) MulLNode(u1, v1)); + Node* temp1 = phase->transform(new (phase->C, 3) AddLNode(u1v1, w2)); + Node* temp2 = phase->transform(new (phase->C, 3) RShiftLNode(w1, phase->intcon(N / 2))); + + return new (phase->C, 3) AddLNode(temp1, temp2); } @@ -976,7 +1007,7 @@ Node *ModLNode::Ideal(PhaseGVN *phase, bool can_reshape) { // Expand mod if( con >= 0 && con < max_jlong && is_power_of_2_long(con+1) ) { - uint k = log2_long(con); // Extract k + uint k = exact_log2_long(con+1); // Extract k // Basic algorithm by David Detlefs. See fastmod_long.java for gory details. // Used to help a popular random number generator which does a long-mod diff --git a/hotspot/src/share/vm/opto/gcm.cpp b/hotspot/src/share/vm/opto/gcm.cpp index c3d9db916bc..b56fb157119 100644 --- a/hotspot/src/share/vm/opto/gcm.cpp +++ b/hotspot/src/share/vm/opto/gcm.cpp @@ -29,6 +29,9 @@ #include "incls/_precompiled.incl" #include "incls/_gcm.cpp.incl" +// To avoid float value underflow +#define MIN_BLOCK_FREQUENCY 1.e-35f + //----------------------------schedule_node_into_block------------------------- // Insert node n into block b. Look for projections of n and make sure they // are in b also. @@ -1380,6 +1383,13 @@ void PhaseCFG::Estimate_Block_Frequency() { } } +#ifdef ASSERT + for (uint i = 0; i < _num_blocks; i++ ) { + Block *b = _blocks[i]; + assert(b->_freq >= MIN_BLOCK_FREQUENCY, "Register Allocator requiers meaningful block frequency"); + } +#endif + #ifndef PRODUCT if (PrintCFGBlockFreq) { tty->print_cr("CFG Block Frequencies"); @@ -1877,7 +1887,9 @@ void CFGLoop::scale_freq() { float loop_freq = _freq * trip_count(); for (int i = 0; i < _members.length(); i++) { CFGElement* s = _members.at(i); - s->_freq *= loop_freq; + float block_freq = s->_freq * loop_freq; + if (block_freq < MIN_BLOCK_FREQUENCY) block_freq = MIN_BLOCK_FREQUENCY; + s->_freq = block_freq; } CFGLoop* ch = _child; while (ch != NULL) { diff --git a/hotspot/src/share/vm/opto/graphKit.cpp b/hotspot/src/share/vm/opto/graphKit.cpp index 36a6eafde59..c0cb4ba0132 100644 --- a/hotspot/src/share/vm/opto/graphKit.cpp +++ b/hotspot/src/share/vm/opto/graphKit.cpp @@ -1836,10 +1836,7 @@ void GraphKit::write_barrier_post(Node* oop_store, Node* obj, Node* adr, (CardTableModRefBS*)(Universe::heap()->barrier_set()); Node *b = _gvn.transform(new (C, 3) URShiftXNode( cast, _gvn.intcon(CardTableModRefBS::card_shift) )); // We store into a byte array, so do not bother to left-shift by zero - // Get base of card map - assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), - "adjust this code"); - Node *c = makecon(TypeRawPtr::make((address)ct->byte_map_base)); + Node *c = byte_map_base_node(); // Combine Node *sb_ctl = control(); Node *sb_adr = _gvn.transform(new (C, 4) AddPNode( top()/*no base ptr*/, c, b )); @@ -2945,16 +2942,10 @@ Node* GraphKit::new_instance(Node* klass_node, // Now generate allocation code - // With escape analysis, the entire memory state is needed to be able to - // eliminate the allocation. If the allocations cannot be eliminated, this - // will be optimized to the raw slice when the allocation is expanded. - Node *mem; - if (C->do_escape_analysis()) { - mem = reset_memory(); - set_all_memory(mem); - } else { - mem = memory(Compile::AliasIdxRaw); - } + // The entire memory state is needed for slow path of the allocation + // since GC and deoptimization can happened. + Node *mem = reset_memory(); + set_all_memory(mem); // Create new memory state AllocateNode* alloc = new (C, AllocateNode::ParmLimit) @@ -3091,16 +3082,10 @@ Node* GraphKit::new_array(Node* klass_node, // array klass (maybe variable) // Now generate allocation code - // With escape analysis, the entire memory state is needed to be able to - // eliminate the allocation. If the allocations cannot be eliminated, this - // will be optimized to the raw slice when the allocation is expanded. - Node *mem; - if (C->do_escape_analysis()) { - mem = reset_memory(); - set_all_memory(mem); - } else { - mem = memory(Compile::AliasIdxRaw); - } + // The entire memory state is needed for slow path of the allocation + // since GC and deoptimization can happened. + Node *mem = reset_memory(); + set_all_memory(mem); // Create new memory state // Create the AllocateArrayNode and its result projections AllocateArrayNode* alloc @@ -3233,12 +3218,11 @@ void GraphKit::g1_write_barrier_pre(Node* obj, // Now some of the values - Node* marking = __ load(no_ctrl, marking_adr, TypeInt::INT, active_type, Compile::AliasIdxRaw); - Node* index = __ load(no_ctrl, index_adr, TypeInt::INT, T_INT, Compile::AliasIdxRaw); - Node* buffer = __ load(no_ctrl, buffer_adr, TypeRawPtr::NOTNULL, T_ADDRESS, Compile::AliasIdxRaw); + Node* marking = __ load(__ ctrl(), marking_adr, TypeInt::INT, active_type, Compile::AliasIdxRaw); // if (!marking) __ if_then(marking, BoolTest::ne, zero); { + Node* index = __ load(__ ctrl(), index_adr, TypeInt::INT, T_INT, Compile::AliasIdxRaw); const Type* t1 = adr->bottom_type(); const Type* t2 = val->bottom_type(); @@ -3246,6 +3230,7 @@ void GraphKit::g1_write_barrier_pre(Node* obj, Node* orig = __ load(no_ctrl, adr, val_type, bt, alias_idx); // if (orig != NULL) __ if_then(orig, BoolTest::ne, null()); { + Node* buffer = __ load(__ ctrl(), buffer_adr, TypeRawPtr::NOTNULL, T_ADDRESS, Compile::AliasIdxRaw); // load original value // alias_idx correct?? @@ -3365,14 +3350,6 @@ void GraphKit::g1_write_barrier_post(Node* store, const TypeFunc *tf = OptoRuntime::g1_wb_post_Type(); - // Get the address of the card table - CardTableModRefBS* ct = - (CardTableModRefBS*)(Universe::heap()->barrier_set()); - Node *card_table = __ makecon(TypeRawPtr::make((address)ct->byte_map_base)); - // Get base of card map - assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code"); - - // Offsets into the thread const int index_offset = in_bytes(JavaThread::dirty_card_queue_offset() + PtrQueue::byte_offset_of_index()); @@ -3402,7 +3379,7 @@ void GraphKit::g1_write_barrier_post(Node* store, Node* card_offset = __ URShiftX( cast, __ ConI(CardTableModRefBS::card_shift) ); // Combine card table base and card offset - Node *card_adr = __ AddP(no_base, card_table, card_offset ); + Node *card_adr = __ AddP(no_base, byte_map_base_node(), card_offset ); // If we know the value being stored does it cross regions? diff --git a/hotspot/src/share/vm/opto/graphKit.hpp b/hotspot/src/share/vm/opto/graphKit.hpp index 0817ed3bfcb..160e3376c95 100644 --- a/hotspot/src/share/vm/opto/graphKit.hpp +++ b/hotspot/src/share/vm/opto/graphKit.hpp @@ -83,6 +83,18 @@ class GraphKit : public Phase { Node* zerocon(BasicType bt) const { return _gvn.zerocon(bt); } // (See also macro MakeConX in type.hpp, which uses intcon or longcon.) + // Helper for byte_map_base + Node* byte_map_base_node() { + // Get base of card map + CardTableModRefBS* ct = (CardTableModRefBS*)(Universe::heap()->barrier_set()); + assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust users of this code"); + if (ct->byte_map_base != NULL) { + return makecon(TypeRawPtr::make((address)ct->byte_map_base)); + } else { + return null(); + } + } + jint find_int_con(Node* n, jint value_if_unknown) { return _gvn.find_int_con(n, value_if_unknown); } diff --git a/hotspot/src/share/vm/opto/idealGraphPrinter.cpp b/hotspot/src/share/vm/opto/idealGraphPrinter.cpp index 6dfc5fc9c8a..ad45b566eda 100644 --- a/hotspot/src/share/vm/opto/idealGraphPrinter.cpp +++ b/hotspot/src/share/vm/opto/idealGraphPrinter.cpp @@ -557,7 +557,7 @@ void IdealGraphPrinter::visit_node(Node *n, void *param) { // max. 2 chars allowed if (value >= -9 && value <= 99) { - sprintf(buffer, "%d", value); + sprintf(buffer, INT64_FORMAT, value); print_prop(short_name, buffer); } else { print_prop(short_name, "L"); diff --git a/hotspot/src/share/vm/opto/ifg.cpp b/hotspot/src/share/vm/opto/ifg.cpp index 1a352de722b..b3250513d7a 100644 --- a/hotspot/src/share/vm/opto/ifg.cpp +++ b/hotspot/src/share/vm/opto/ifg.cpp @@ -471,12 +471,28 @@ uint PhaseChaitin::build_ifg_physical( ResourceArea *a ) { // for the "collect_gc_info" phase later. IndexSet liveout(_live->live(b)); uint last_inst = b->end_idx(); - // Compute last phi index - uint last_phi; - for( last_phi = 1; last_phi < last_inst; last_phi++ ) - if( !b->_nodes[last_phi]->is_Phi() ) + // Compute first nonphi node index + uint first_inst; + for( first_inst = 1; first_inst < last_inst; first_inst++ ) + if( !b->_nodes[first_inst]->is_Phi() ) break; + // Spills could be inserted before CreateEx node which should be + // first instruction in block after Phis. Move CreateEx up. + for( uint insidx = first_inst; insidx < last_inst; insidx++ ) { + Node *ex = b->_nodes[insidx]; + if( ex->is_SpillCopy() ) continue; + if( insidx > first_inst && ex->is_Mach() && + ex->as_Mach()->ideal_Opcode() == Op_CreateEx ) { + // If the CreateEx isn't above all the MachSpillCopies + // then move it to the top. + b->_nodes.remove(insidx); + b->_nodes.insert(first_inst, ex); + } + // Stop once a CreateEx or any other node is found + break; + } + // Reset block's register pressure values for each ifg construction uint pressure[2], hrp_index[2]; pressure[0] = pressure[1] = 0; @@ -485,7 +501,7 @@ uint PhaseChaitin::build_ifg_physical( ResourceArea *a ) { // Liveout things are presumed live for the whole block. We accumulate // 'area' accordingly. If they get killed in the block, we'll subtract // the unused part of the block from the area. - int inst_count = last_inst - last_phi; + int inst_count = last_inst - first_inst; double cost = (inst_count <= 0) ? 0.0 : b->_freq * double(inst_count); assert(!(cost < 0.0), "negative spill cost" ); IndexSetIterator elements(&liveout); diff --git a/hotspot/src/share/vm/opto/lcm.cpp b/hotspot/src/share/vm/opto/lcm.cpp index 341ddb08c14..dcedbd61f83 100644 --- a/hotspot/src/share/vm/opto/lcm.cpp +++ b/hotspot/src/share/vm/opto/lcm.cpp @@ -107,7 +107,7 @@ void Block::implicit_null_check(PhaseCFG *cfg, Node *proj, Node *val, int allowe was_store = false; switch( mach->ideal_Opcode() ) { case Op_LoadB: - case Op_LoadC: + case Op_LoadUS: case Op_LoadD: case Op_LoadF: case Op_LoadI: diff --git a/hotspot/src/share/vm/opto/live.cpp b/hotspot/src/share/vm/opto/live.cpp index 4127f67e1dd..d2ff515058c 100644 --- a/hotspot/src/share/vm/opto/live.cpp +++ b/hotspot/src/share/vm/opto/live.cpp @@ -271,9 +271,9 @@ void PhaseLive::dump( const Block *b ) const { //------------------------------verify_base_ptrs------------------------------- // Verify that base pointers and derived pointers are still sane. -// Basically, if a derived pointer is live at a safepoint, then its -// base pointer must be live also. void PhaseChaitin::verify_base_ptrs( ResourceArea *a ) const { +#ifdef ASSERT + Unique_Node_List worklist(a); for( uint i = 0; i < _cfg._num_blocks; i++ ) { Block *b = _cfg._blocks[i]; for( uint j = b->end_idx() + 1; j > 1; j-- ) { @@ -287,28 +287,81 @@ void PhaseChaitin::verify_base_ptrs( ResourceArea *a ) const { // Now scan for a live derived pointer if (jvms->oopoff() < sfpt->req()) { // Check each derived/base pair - for (uint idx = jvms->oopoff(); idx < sfpt->req(); idx += 2) { + for (uint idx = jvms->oopoff(); idx < sfpt->req(); idx++) { Node *check = sfpt->in(idx); - uint j = 0; + bool is_derived = ((idx - jvms->oopoff()) & 1) == 0; // search upwards through spills and spill phis for AddP - while(true) { - if( !check ) break; - int idx = check->is_Copy(); - if( idx ) { - check = check->in(idx); - } else if( check->is_Phi() && check->_idx >= _oldphi ) { - check = check->in(1); - } else - break; - j++; - assert(j < 100000,"Derived pointer checking in infinite loop"); + worklist.clear(); + worklist.push(check); + uint k = 0; + while( k < worklist.size() ) { + check = worklist.at(k); + assert(check,"Bad base or derived pointer"); + // See PhaseChaitin::find_base_for_derived() for all cases. + int isc = check->is_Copy(); + if( isc ) { + worklist.push(check->in(isc)); + } else if( check->is_Phi() ) { + for (uint m = 1; m < check->req(); m++) + worklist.push(check->in(m)); + } else if( check->is_Con() ) { + if (is_derived) { + // Derived is NULL+offset + assert(!is_derived || check->bottom_type()->is_ptr()->ptr() == TypePtr::Null,"Bad derived pointer"); + } else { + assert(check->bottom_type()->is_ptr()->_offset == 0,"Bad base pointer"); + // Base either ConP(NULL) or loadConP + if (check->is_Mach()) { + assert(check->as_Mach()->ideal_Opcode() == Op_ConP,"Bad base pointer"); + } else { + assert(check->Opcode() == Op_ConP && + check->bottom_type()->is_ptr()->ptr() == TypePtr::Null,"Bad base pointer"); + } + } + } else if( check->bottom_type()->is_ptr()->_offset == 0 ) { + if(check->is_Proj() || check->is_Mach() && + (check->as_Mach()->ideal_Opcode() == Op_CreateEx || + check->as_Mach()->ideal_Opcode() == Op_ThreadLocal || + check->as_Mach()->ideal_Opcode() == Op_CMoveP || + check->as_Mach()->ideal_Opcode() == Op_CheckCastPP || +#ifdef _LP64 + UseCompressedOops && check->as_Mach()->ideal_Opcode() == Op_CastPP || + UseCompressedOops && check->as_Mach()->ideal_Opcode() == Op_DecodeN || +#endif + check->as_Mach()->ideal_Opcode() == Op_LoadP || + check->as_Mach()->ideal_Opcode() == Op_LoadKlass)) { + // Valid nodes + } else { + check->dump(); + assert(false,"Bad base or derived pointer"); + } + } else { + assert(is_derived,"Bad base pointer"); + assert(check->is_Mach() && check->as_Mach()->ideal_Opcode() == Op_AddP,"Bad derived pointer"); + } + k++; + assert(k < 100000,"Derived pointer checking in infinite loop"); } // End while - assert(check->is_Mach() && check->as_Mach()->ideal_Opcode() == Op_AddP,"Bad derived pointer") } } // End of check for derived pointers } // End of Kcheck for debug info } // End of if found a safepoint } // End of forall instructions in block } // End of forall blocks -} +#endif +} + +//------------------------------verify------------------------------------- +// Verify that graphs and base pointers are still sane. +void PhaseChaitin::verify( ResourceArea *a, bool verify_ifg ) const { +#ifdef ASSERT + if( VerifyOpto || VerifyRegisterAllocator ) { + _cfg.verify(); + verify_base_ptrs(a); + if(verify_ifg) + _ifg->verify(this); + } +#endif +} + #endif diff --git a/hotspot/src/share/vm/opto/loopnode.cpp b/hotspot/src/share/vm/opto/loopnode.cpp index 7e375992f1d..fba4a350bbb 100644 --- a/hotspot/src/share/vm/opto/loopnode.cpp +++ b/hotspot/src/share/vm/opto/loopnode.cpp @@ -2654,7 +2654,7 @@ void PhaseIdealLoop::build_loop_late_post( Node *n, const PhaseIdealLoop *verify case Op_ModF: case Op_ModD: case Op_LoadB: // Same with Loads; they can sink - case Op_LoadC: // during loop optimizations. + case Op_LoadUS: // during loop optimizations. case Op_LoadD: case Op_LoadF: case Op_LoadI: diff --git a/hotspot/src/share/vm/opto/macro.cpp b/hotspot/src/share/vm/opto/macro.cpp index 4d74a434fec..f77b14ada56 100644 --- a/hotspot/src/share/vm/opto/macro.cpp +++ b/hotspot/src/share/vm/opto/macro.cpp @@ -952,13 +952,6 @@ void PhaseMacroExpand::expand_allocate_common( Node* klass_node = alloc->in(AllocateNode::KlassNode); Node* initial_slow_test = alloc->in(AllocateNode::InitialTest); - // With escape analysis, the entire memory state was needed to be able to - // eliminate the allocation. Since the allocations cannot be eliminated, - // optimize it to the raw slice. - if (mem->is_MergeMem()) { - mem = mem->as_MergeMem()->memory_at(Compile::AliasIdxRaw); - } - assert(ctrl != NULL, "must have control"); // We need a Region and corresponding Phi's to merge the slow-path and fast-path results. // they will not be used if "always_slow" is set @@ -1016,6 +1009,11 @@ void PhaseMacroExpand::expand_allocate_common( Node *slow_mem = mem; // save the current memory state for slow path // generate the fast allocation code unless we know that the initial test will always go slow if (!always_slow) { + // Fast path modifies only raw memory. + if (mem->is_MergeMem()) { + mem = mem->as_MergeMem()->memory_at(Compile::AliasIdxRaw); + } + Node* eden_top_adr; Node* eden_end_adr; @@ -1239,8 +1237,6 @@ void PhaseMacroExpand::expand_allocate_common( } } - mem = result_phi_rawmem; - // An allocate node has separate i_o projections for the uses on the control and i_o paths // Replace uses of the control i_o projection with result_phi_i_o (unless we are only generating a slow call) if (_ioproj_fallthrough == NULL) { diff --git a/hotspot/src/share/vm/opto/matcher.cpp b/hotspot/src/share/vm/opto/matcher.cpp index 582cf2740b9..e911c065ccd 100644 --- a/hotspot/src/share/vm/opto/matcher.cpp +++ b/hotspot/src/share/vm/opto/matcher.cpp @@ -1824,7 +1824,7 @@ void Matcher::find_shared( Node *n ) { mem_op = true; break; case Op_LoadB: - case Op_LoadC: + case Op_LoadUS: case Op_LoadD: case Op_LoadF: case Op_LoadI: diff --git a/hotspot/src/share/vm/opto/memnode.cpp b/hotspot/src/share/vm/opto/memnode.cpp index 4cfc0d233f3..9c79f2ec936 100644 --- a/hotspot/src/share/vm/opto/memnode.cpp +++ b/hotspot/src/share/vm/opto/memnode.cpp @@ -779,14 +779,14 @@ Node *LoadNode::make( PhaseGVN& gvn, Node *ctl, Node *mem, Node *adr, const Type "use LoadRangeNode instead"); switch (bt) { case T_BOOLEAN: - case T_BYTE: return new (C, 3) LoadBNode(ctl, mem, adr, adr_type, rt->is_int() ); - case T_INT: return new (C, 3) LoadINode(ctl, mem, adr, adr_type, rt->is_int() ); - case T_CHAR: return new (C, 3) LoadCNode(ctl, mem, adr, adr_type, rt->is_int() ); - case T_SHORT: return new (C, 3) LoadSNode(ctl, mem, adr, adr_type, rt->is_int() ); - case T_LONG: return new (C, 3) LoadLNode(ctl, mem, adr, adr_type, rt->is_long() ); - case T_FLOAT: return new (C, 3) LoadFNode(ctl, mem, adr, adr_type, rt ); - case T_DOUBLE: return new (C, 3) LoadDNode(ctl, mem, adr, adr_type, rt ); - case T_ADDRESS: return new (C, 3) LoadPNode(ctl, mem, adr, adr_type, rt->is_ptr() ); + case T_BYTE: return new (C, 3) LoadBNode (ctl, mem, adr, adr_type, rt->is_int() ); + case T_INT: return new (C, 3) LoadINode (ctl, mem, adr, adr_type, rt->is_int() ); + case T_CHAR: return new (C, 3) LoadUSNode(ctl, mem, adr, adr_type, rt->is_int() ); + case T_SHORT: return new (C, 3) LoadSNode (ctl, mem, adr, adr_type, rt->is_int() ); + case T_LONG: return new (C, 3) LoadLNode (ctl, mem, adr, adr_type, rt->is_long() ); + case T_FLOAT: return new (C, 3) LoadFNode (ctl, mem, adr, adr_type, rt ); + case T_DOUBLE: return new (C, 3) LoadDNode (ctl, mem, adr, adr_type, rt ); + case T_ADDRESS: return new (C, 3) LoadPNode (ctl, mem, adr, adr_type, rt->is_ptr() ); case T_OBJECT: #ifdef _LP64 if (adr->bottom_type()->is_ptr_to_narrowoop()) { @@ -1076,13 +1076,14 @@ Node* LoadNode::eliminate_autobox(PhaseGVN* phase) { // of the original value. Node* mem_phi = in(Memory); Node* offset = in(Address)->in(AddPNode::Offset); + Node* region = base->in(0); Node* in1 = clone(); Node* in1_addr = in1->in(Address)->clone(); in1_addr->set_req(AddPNode::Base, base->in(allocation_index)); in1_addr->set_req(AddPNode::Address, base->in(allocation_index)); in1_addr->set_req(AddPNode::Offset, offset); - in1->set_req(0, base->in(allocation_index)); + in1->set_req(0, region->in(allocation_index)); in1->set_req(Address, in1_addr); in1->set_req(Memory, mem_phi->in(allocation_index)); @@ -1091,7 +1092,7 @@ Node* LoadNode::eliminate_autobox(PhaseGVN* phase) { in2_addr->set_req(AddPNode::Base, base->in(load_index)); in2_addr->set_req(AddPNode::Address, base->in(load_index)); in2_addr->set_req(AddPNode::Offset, offset); - in2->set_req(0, base->in(load_index)); + in2->set_req(0, region->in(load_index)); in2->set_req(Address, in2_addr); in2->set_req(Memory, mem_phi->in(load_index)); @@ -1100,7 +1101,7 @@ Node* LoadNode::eliminate_autobox(PhaseGVN* phase) { in2_addr = phase->transform(in2_addr); in2 = phase->transform(in2); - PhiNode* result = PhiNode::make_blank(base->in(0), this); + PhiNode* result = PhiNode::make_blank(region, this); result->set_req(allocation_index, in1); result->set_req(load_index, in2); return result; @@ -1303,6 +1304,7 @@ Node *LoadNode::Ideal(PhaseGVN *phase, bool can_reshape) { Node* base = AddPNode::Ideal_base_and_offset(address, phase, ignore); if (base != NULL && phase->type(base)->higher_equal(TypePtr::NOTNULL) + && phase->C->get_alias_index(phase->type(address)->is_ptr()) != Compile::AliasIdxRaw && all_controls_dominate(base, phase->C->start())) { // A method-invariant, non-null address (constant or 'this' argument). set_req(MemNode::Control, NULL); @@ -1356,7 +1358,7 @@ Node *LoadNode::Ideal(PhaseGVN *phase, bool can_reshape) { // Steps (a), (b): Walk past independent stores to find an exact match. if (prev_mem != NULL && prev_mem != in(MemNode::Memory)) { // (c) See if we can fold up on the spot, but don't fold up here. - // Fold-up might require truncation (for LoadB/LoadS/LoadC) or + // Fold-up might require truncation (for LoadB/LoadS/LoadUS) or // just return a prior value, which is done by Identity calls. if (can_see_stored_value(prev_mem, phase)) { // Make ready for step (d): @@ -1605,14 +1607,14 @@ Node *LoadBNode::Ideal(PhaseGVN *phase, bool can_reshape) { return LoadNode::Ideal(phase, can_reshape); } -//--------------------------LoadCNode::Ideal-------------------------------------- +//--------------------------LoadUSNode::Ideal------------------------------------- // // If the previous store is to the same address as this load, // and the value stored was larger than a char, replace this load // with the value stored truncated to a char. If no truncation is // needed, the replacement is done in LoadNode::Identity(). // -Node *LoadCNode::Ideal(PhaseGVN *phase, bool can_reshape) { +Node *LoadUSNode::Ideal(PhaseGVN *phase, bool can_reshape) { Node* mem = in(MemNode::Memory); Node* value = can_see_stored_value(mem,phase); if( value && !phase->type(value)->higher_equal( _type ) ) diff --git a/hotspot/src/share/vm/opto/memnode.hpp b/hotspot/src/share/vm/opto/memnode.hpp index e1a84febc44..63cb0d653f7 100644 --- a/hotspot/src/share/vm/opto/memnode.hpp +++ b/hotspot/src/share/vm/opto/memnode.hpp @@ -207,11 +207,11 @@ public: virtual BasicType memory_type() const { return T_BYTE; } }; -//------------------------------LoadCNode-------------------------------------- -// Load a char (16bits unsigned) from memory -class LoadCNode : public LoadNode { +//------------------------------LoadUSNode------------------------------------- +// Load an unsigned short/char (16bits unsigned) from memory +class LoadUSNode : public LoadNode { public: - LoadCNode( Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeInt *ti = TypeInt::CHAR ) + LoadUSNode( Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeInt *ti = TypeInt::CHAR ) : LoadNode(c,mem,adr,at,ti) {} virtual int Opcode() const; virtual uint ideal_reg() const { return Op_RegI; } diff --git a/hotspot/src/share/vm/opto/mulnode.cpp b/hotspot/src/share/vm/opto/mulnode.cpp index 5cdcbafbc4b..081dce647bb 100644 --- a/hotspot/src/share/vm/opto/mulnode.cpp +++ b/hotspot/src/share/vm/opto/mulnode.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2009 Sun Microsystems, Inc. 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 @@ -442,16 +442,17 @@ Node *AndINode::Identity( PhaseTransform *phase ) { return load; } uint lop = load->Opcode(); - if( lop == Op_LoadC && + if( lop == Op_LoadUS && con == 0x0000FFFF ) // Already zero-extended return load; // Masking off the high bits of a unsigned-shift-right is not // needed either. if( lop == Op_URShiftI ) { const TypeInt *t12 = phase->type( load->in(2) )->isa_int(); - if( t12 && t12->is_con() ) { - int shift_con = t12->get_con(); - int mask = max_juint >> shift_con; + if( t12 && t12->is_con() ) { // Shift is by a constant + int shift = t12->get_con(); + shift &= BitsPerJavaInteger - 1; // semantics of Java shifts + int mask = max_juint >> shift; if( (mask&con) == mask ) // If AND is useless, skip it return load; } @@ -470,19 +471,19 @@ Node *AndINode::Ideal(PhaseGVN *phase, bool can_reshape) { uint lop = load->Opcode(); // Masking bits off of a Character? Hi bits are already zero. - if( lop == Op_LoadC && + if( lop == Op_LoadUS && (mask & 0xFFFF0000) ) // Can we make a smaller mask? return new (phase->C, 3) AndINode(load,phase->intcon(mask&0xFFFF)); // Masking bits off of a Short? Loading a Character does some masking if( lop == Op_LoadS && (mask & 0xFFFF0000) == 0 ) { - Node *ldc = new (phase->C, 3) LoadCNode(load->in(MemNode::Control), + Node *ldus = new (phase->C, 3) LoadUSNode(load->in(MemNode::Control), load->in(MemNode::Memory), load->in(MemNode::Address), load->adr_type()); - ldc = phase->transform(ldc); - return new (phase->C, 3) AndINode(ldc,phase->intcon(mask&0xFFFF)); + ldus = phase->transform(ldus); + return new (phase->C, 3) AndINode(ldus, phase->intcon(mask&0xFFFF)); } // Masking sign bits off of a Byte? Let the matcher use an unsigned load @@ -579,9 +580,10 @@ Node *AndLNode::Identity( PhaseTransform *phase ) { // needed either. if( lop == Op_URShiftL ) { const TypeInt *t12 = phase->type( usr->in(2) )->isa_int(); - if( t12 && t12->is_con() ) { - int shift_con = t12->get_con(); - jlong mask = max_julong >> shift_con; + if( t12 && t12->is_con() ) { // Shift is by a constant + int shift = t12->get_con(); + shift &= BitsPerJavaLong - 1; // semantics of Java shifts + jlong mask = max_julong >> shift; if( (mask&con) == mask ) // If AND is useless, skip it return usr; } @@ -605,8 +607,8 @@ Node *AndLNode::Ideal(PhaseGVN *phase, bool can_reshape) { const TypeInt *t12 = phase->type(rsh->in(2))->isa_int(); if( t12 && t12->is_con() ) { // Shift is by a constant int shift = t12->get_con(); - shift &= (BitsPerJavaInteger*2)-1; // semantics of Java shifts - const jlong sign_bits_mask = ~(((jlong)CONST64(1) << (jlong)(BitsPerJavaInteger*2 - shift)) -1); + shift &= BitsPerJavaLong - 1; // semantics of Java shifts + const jlong sign_bits_mask = ~(((jlong)CONST64(1) << (jlong)(BitsPerJavaLong - shift)) -1); // If the AND'ing of the 2 masks has no bits, then only original shifted // bits survive. NO sign-extension bits survive the maskings. if( (sign_bits_mask & mask) == 0 ) { @@ -786,7 +788,7 @@ Node *LShiftLNode::Ideal(PhaseGVN *phase, bool can_reshape) { // Check for ((x & ((CONST64(1)<<(64-c0))-1)) << c0) which ANDs off high bits // before shifting them away. - const jlong bits_mask = ((jlong)CONST64(1) << (jlong)(BitsPerJavaInteger*2 - con)) - CONST64(1); + const jlong bits_mask = ((jlong)CONST64(1) << (jlong)(BitsPerJavaLong - con)) - CONST64(1); if( add1_op == Op_AndL && phase->type(add1->in(2)) == TypeLong::make( bits_mask ) ) return new (phase->C, 3) LShiftLNode( add1->in(1), in(2) ); @@ -820,7 +822,7 @@ const Type *LShiftLNode::Value( PhaseTransform *phase ) const { return TypeLong::LONG; uint shift = r2->get_con(); - shift &= (BitsPerJavaInteger*2)-1; // semantics of Java shifts + shift &= BitsPerJavaLong - 1; // semantics of Java shifts // Shift by a multiple of 64 does nothing: if (shift == 0) return t1; @@ -913,7 +915,7 @@ Node *RShiftINode::Ideal(PhaseGVN *phase, bool can_reshape) { set_req(2, phase->intcon(0)); return this; } - else if( ld->Opcode() == Op_LoadC ) + else if( ld->Opcode() == Op_LoadUS ) // Replace zero-extension-load with sign-extension-load return new (phase->C, 3) LoadSNode( ld->in(MemNode::Control), ld->in(MemNode::Memory), @@ -1235,7 +1237,7 @@ Node *URShiftLNode::Ideal(PhaseGVN *phase, bool can_reshape) { if ( con == 0 ) return NULL; // let Identity() handle a 0 shift count // note: mask computation below does not work for 0 shift count // We'll be wanting the right-shift amount as a mask of that many bits - const jlong mask = (((jlong)CONST64(1) << (jlong)(BitsPerJavaInteger*2 - con)) -1); + const jlong mask = (((jlong)CONST64(1) << (jlong)(BitsPerJavaLong - con)) -1); // Check for ((x << z) + Y) >>> z. Replace with x + con>>>z // The idiom for rounding to a power of 2 is "(Q+(2^z-1)) >>> z". @@ -1302,7 +1304,7 @@ const Type *URShiftLNode::Value( PhaseTransform *phase ) const { if (r2->is_con()) { uint shift = r2->get_con(); - shift &= (2*BitsPerJavaInteger)-1; // semantics of Java shifts + shift &= BitsPerJavaLong - 1; // semantics of Java shifts // Shift by a multiple of 64 does nothing: if (shift == 0) return t1; // Calculate reasonably aggressive bounds for the result. @@ -1325,7 +1327,7 @@ const Type *URShiftLNode::Value( PhaseTransform *phase ) const { const TypeLong* tl = TypeLong::make(lo, hi, MAX2(r1->_widen,r2->_widen)); #ifdef ASSERT // Make sure we get the sign-capture idiom correct. - if (shift == (2*BitsPerJavaInteger)-1) { + if (shift == BitsPerJavaLong - 1) { if (r1->_lo >= 0) assert(tl == TypeLong::ZERO, ">>>63 of + is 0"); if (r1->_hi < 0) assert(tl == TypeLong::ONE, ">>>63 of - is +1"); } diff --git a/hotspot/src/share/vm/opto/superword.cpp b/hotspot/src/share/vm/opto/superword.cpp index acc8248500d..4551162bff3 100644 --- a/hotspot/src/share/vm/opto/superword.cpp +++ b/hotspot/src/share/vm/opto/superword.cpp @@ -1444,7 +1444,7 @@ const Type* SuperWord::container_type(const Type* t) { // (Start, end] half-open range defining which operands are vector void SuperWord::vector_opd_range(Node* n, uint* start, uint* end) { switch (n->Opcode()) { - case Op_LoadB: case Op_LoadC: + case Op_LoadB: case Op_LoadUS: case Op_LoadI: case Op_LoadL: case Op_LoadF: case Op_LoadD: case Op_LoadP: diff --git a/hotspot/src/share/vm/opto/type.cpp b/hotspot/src/share/vm/opto/type.cpp index f433a125535..6830277ea3f 100644 --- a/hotspot/src/share/vm/opto/type.cpp +++ b/hotspot/src/share/vm/opto/type.cpp @@ -2471,6 +2471,8 @@ const Type *TypeOopPtr::filter( const Type *kills ) const { const Type* ft = join(kills); const TypeInstPtr* ftip = ft->isa_instptr(); const TypeInstPtr* ktip = kills->isa_instptr(); + const TypeKlassPtr* ftkp = ft->isa_klassptr(); + const TypeKlassPtr* ktkp = kills->isa_klassptr(); if (ft->empty()) { // Check for evil case of 'this' being a class and 'kills' expecting an @@ -2484,6 +2486,8 @@ const Type *TypeOopPtr::filter( const Type *kills ) const { // uplift the type. if (!empty() && ktip != NULL && ktip->is_loaded() && ktip->klass()->is_interface()) return kills; // Uplift to interface + if (!empty() && ktkp != NULL && ktkp->klass()->is_loaded() && ktkp->klass()->is_interface()) + return kills; // Uplift to interface return Type::TOP; // Canonical empty value } @@ -2499,6 +2503,12 @@ const Type *TypeOopPtr::filter( const Type *kills ) const { // Happens in a CTW of rt.jar, 320-341, no extra flags return ktip->cast_to_ptr_type(ftip->ptr()); } + if (ftkp != NULL && ktkp != NULL && + ftkp->is_loaded() && ftkp->klass()->is_interface() && + ktkp->is_loaded() && !ktkp->klass()->is_interface()) { + // Happens in a CTW of rt.jar, 320-341, no extra flags + return ktkp->cast_to_ptr_type(ftkp->ptr()); + } return ft; } @@ -3657,7 +3667,7 @@ const TypePtr *TypeKlassPtr::add_offset( intptr_t offset ) const { //------------------------------cast_to_ptr_type------------------------------- const Type *TypeKlassPtr::cast_to_ptr_type(PTR ptr) const { - assert(_base == OopPtr, "subclass must override cast_to_ptr_type"); + assert(_base == KlassPtr, "subclass must override cast_to_ptr_type"); if( ptr == _ptr ) return this; return make(ptr, _klass, _offset); } diff --git a/hotspot/src/share/vm/opto/type.hpp b/hotspot/src/share/vm/opto/type.hpp index 3d3f3ddd883..493b622a28e 100644 --- a/hotspot/src/share/vm/opto/type.hpp +++ b/hotspot/src/share/vm/opto/type.hpp @@ -882,6 +882,8 @@ class TypeKlassPtr : public TypeOopPtr { public: ciSymbol* name() const { return _klass->name(); } + bool is_loaded() const { return _klass->is_loaded(); } + // ptr to klass 'k' static const TypeKlassPtr *make( ciKlass* k ) { return make( TypePtr::Constant, k, 0); } // ptr to klass 'k' with offset diff --git a/hotspot/src/share/vm/opto/vectornode.cpp b/hotspot/src/share/vm/opto/vectornode.cpp index bf2cdc81ac8..7b6fef64bdf 100644 --- a/hotspot/src/share/vm/opto/vectornode.cpp +++ b/hotspot/src/share/vm/opto/vectornode.cpp @@ -239,7 +239,7 @@ int VectorNode::opcode(int sopc, uint vlen, const Type* opd_t) { return Op_XorV; case Op_LoadB: - case Op_LoadC: + case Op_LoadUS: case Op_LoadS: case Op_LoadI: case Op_LoadL: @@ -269,7 +269,7 @@ int VectorLoadNode::opcode(int sopc, uint vlen) { case 16: return Op_Load16B; } break; - case Op_LoadC: + case Op_LoadUS: switch (vlen) { case 2: return Op_Load2C; case 4: return Op_Load4C; diff --git a/hotspot/src/share/vm/prims/jni.cpp b/hotspot/src/share/vm/prims/jni.cpp index b4a82b9e547..e3f715dd23e 100644 --- a/hotspot/src/share/vm/prims/jni.cpp +++ b/hotspot/src/share/vm/prims/jni.cpp @@ -2691,8 +2691,13 @@ static bool initializeDirectBufferSupport(JNIEnv* env, JavaThread* thread) { directBufferSupportInitializeEnded = 1; } else { - ThreadInVMfromNative tivn(thread); // set state as yield_all can call os:sleep while (!directBufferSupportInitializeEnded && !directBufferSupportInitializeFailed) { + // Set state as yield_all can call os:sleep. On Solaris, yield_all calls + // os::sleep which requires the VM state transition. On other platforms, it + // is not necessary. The following call to change the VM state is purposely + // put inside the loop to avoid potential deadlock when multiple threads + // try to call this method. See 6791815 for more details. + ThreadInVMfromNative tivn(thread); os::yield_all(); } } diff --git a/hotspot/src/share/vm/prims/jvm.cpp b/hotspot/src/share/vm/prims/jvm.cpp index 7f832341c6e..1835594ba0b 100644 --- a/hotspot/src/share/vm/prims/jvm.cpp +++ b/hotspot/src/share/vm/prims/jvm.cpp @@ -2475,7 +2475,8 @@ void jio_print(const char* s) { if (Arguments::vfprintf_hook() != NULL) { jio_fprintf(defaultStream::output_stream(), "%s", s); } else { - ::write(defaultStream::output_fd(), s, (int)strlen(s)); + // Make an unused local variable to avoid warning from gcc 4.x compiler. + size_t count = ::write(defaultStream::output_fd(), s, (int)strlen(s)); } } diff --git a/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp b/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp index bd8fe2b356b..4cc6b577b47 100644 --- a/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp +++ b/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp @@ -1230,8 +1230,14 @@ jvmtiError VM_RedefineClasses::merge_cp_and_rewrite( // Constant pools are not easily reused so we allocate a new one // each time. + // merge_cp is created unsafe for concurrent GC processing. It + // should be marked safe before discarding it because, even if + // garbage. If it crosses a card boundary, it may be scanned + // in order to find the start of the first complete object on the card. constantPoolHandle merge_cp(THREAD, - oopFactory::new_constantPool(merge_cp_length, THREAD)); + oopFactory::new_constantPool(merge_cp_length, + methodOopDesc::IsUnsafeConc, + THREAD)); int orig_length = old_cp->orig_length(); if (orig_length == 0) { // This old_cp is an actual original constant pool. We save @@ -1274,6 +1280,7 @@ jvmtiError VM_RedefineClasses::merge_cp_and_rewrite( // rewriting so we can't use the old constant pool with the new // class. + merge_cp()->set_is_conc_safe(true); merge_cp = constantPoolHandle(); // toss the merged constant pool } else if (old_cp->length() < scratch_cp->length()) { // The old constant pool has fewer entries than the new constant @@ -1283,6 +1290,7 @@ jvmtiError VM_RedefineClasses::merge_cp_and_rewrite( // rewriting so we can't use the new constant pool with the old // class. + merge_cp()->set_is_conc_safe(true); merge_cp = constantPoolHandle(); // toss the merged constant pool } else { // The old constant pool has more entries than the new constant @@ -1296,6 +1304,7 @@ jvmtiError VM_RedefineClasses::merge_cp_and_rewrite( set_new_constant_pool(scratch_class, merge_cp, merge_cp_length, true, THREAD); // drop local ref to the merged constant pool + merge_cp()->set_is_conc_safe(true); merge_cp = constantPoolHandle(); } } else { @@ -1325,7 +1334,10 @@ jvmtiError VM_RedefineClasses::merge_cp_and_rewrite( // GCed. set_new_constant_pool(scratch_class, merge_cp, merge_cp_length, true, THREAD); + merge_cp()->set_is_conc_safe(true); } + assert(old_cp()->is_conc_safe(), "Just checking"); + assert(scratch_cp()->is_conc_safe(), "Just checking"); return JVMTI_ERROR_NONE; } // end merge_cp_and_rewrite() @@ -2314,13 +2326,16 @@ void VM_RedefineClasses::set_new_constant_pool( // worst case merge situation. We want to associate the minimum // sized constant pool with the klass to save space. constantPoolHandle smaller_cp(THREAD, - oopFactory::new_constantPool(scratch_cp_length, THREAD)); + oopFactory::new_constantPool(scratch_cp_length, + methodOopDesc::IsUnsafeConc, + THREAD)); // preserve orig_length() value in the smaller copy int orig_length = scratch_cp->orig_length(); assert(orig_length != 0, "sanity check"); smaller_cp->set_orig_length(orig_length); scratch_cp->copy_cp_to(1, scratch_cp_length - 1, smaller_cp, 1, THREAD); scratch_cp = smaller_cp; + smaller_cp()->set_is_conc_safe(true); } // attach new constant pool to klass @@ -2516,6 +2531,7 @@ void VM_RedefineClasses::set_new_constant_pool( rewrite_cp_refs_in_stack_map_table(method, THREAD); } // end for each method + assert(scratch_cp()->is_conc_safe(), "Just checking"); } // end set_new_constant_pool() diff --git a/hotspot/src/share/vm/prims/jvmtiTagMap.cpp b/hotspot/src/share/vm/prims/jvmtiTagMap.cpp index 152789815af..dcf83bb22d4 100644 --- a/hotspot/src/share/vm/prims/jvmtiTagMap.cpp +++ b/hotspot/src/share/vm/prims/jvmtiTagMap.cpp @@ -1320,6 +1320,9 @@ class VM_HeapIterateOperation: public VM_Operation { } // do the iteration + // If this operation encounters a bad object when using CMS, + // consider using safe_object_iterate() which avoids perm gen + // objects that may contain bad references. Universe::heap()->object_iterate(_blk); // when sharing is enabled we must iterate over the shared spaces diff --git a/hotspot/src/share/vm/runtime/arguments.cpp b/hotspot/src/share/vm/runtime/arguments.cpp index b9c943d10b2..417522943ad 100644 --- a/hotspot/src/share/vm/runtime/arguments.cpp +++ b/hotspot/src/share/vm/runtime/arguments.cpp @@ -229,6 +229,7 @@ public: inline void set_base(const char* base); inline void add_prefix(const char* prefix); + inline void add_suffix_to_prefix(const char* suffix); inline void add_suffix(const char* suffix); inline void reset_path(const char* base); @@ -290,6 +291,10 @@ inline void SysClassPath::add_prefix(const char* prefix) { _items[_scp_prefix] = add_to_path(_items[_scp_prefix], prefix, true); } +inline void SysClassPath::add_suffix_to_prefix(const char* suffix) { + _items[_scp_prefix] = add_to_path(_items[_scp_prefix], suffix, false); +} + inline void SysClassPath::add_suffix(const char* suffix) { _items[_scp_suffix] = add_to_path(_items[_scp_suffix], suffix, false); } @@ -512,7 +517,6 @@ static bool set_bool_flag(char* name, bool value, FlagValueOrigin origin) { return CommandLineFlags::boolAtPut(name, &value, origin); } - static bool set_fp_numeric_flag(char* name, char* value, FlagValueOrigin origin) { double v; if (sscanf(value, "%lf", &v) != 1) { @@ -525,7 +529,6 @@ static bool set_fp_numeric_flag(char* name, char* value, FlagValueOrigin origin) return false; } - static bool set_numeric_flag(char* name, char* value, FlagValueOrigin origin) { julong v; intx intx_v; @@ -555,7 +558,6 @@ static bool set_numeric_flag(char* name, char* value, FlagValueOrigin origin) { return false; } - static bool set_string_flag(char* name, const char* value, FlagValueOrigin origin) { if (!CommandLineFlags::ccstrAtPut(name, &value, origin)) return false; // Contract: CommandLineFlags always returns a pointer that needs freeing. @@ -591,7 +593,6 @@ static bool append_to_string_flag(char* name, const char* new_value, FlagValueOr return true; } - bool Arguments::parse_argument(const char* arg, FlagValueOrigin origin) { // range of acceptable characters spelled out for portability reasons @@ -652,7 +653,6 @@ bool Arguments::parse_argument(const char* arg, FlagValueOrigin origin) { return false; } - void Arguments::add_string(char*** bldarray, int* count, const char* arg) { assert(bldarray != NULL, "illegal argument"); @@ -756,7 +756,6 @@ bool Arguments::process_argument(const char* arg, return true; } - bool Arguments::process_settings_file(const char* file_name, bool should_exist, jboolean ignore_unrecognized) { FILE* stream = fopen(file_name, "rb"); if (stream == NULL) { @@ -932,7 +931,6 @@ void Arguments::set_mode_flags(Mode mode) { } } - // Conflict: required to use shared spaces (-Xshare:on), but // incompatible command line options were chosen. @@ -946,7 +944,6 @@ static void no_shared_spaces() { } } - // If the user has chosen ParallelGCThreads > 0, we set UseParNewGC // if it's not explictly set or unset. If the user has chosen // UseParNewGC and not explicitly set ParallelGCThreads we @@ -1361,7 +1358,7 @@ void Arguments::set_aggressive_opts_flags() { // Feed the cache size setting into the JDK char buffer[1024]; - sprintf(buffer, "java.lang.Integer.IntegerCache.high=%d", AutoBoxCacheMax); + sprintf(buffer, "java.lang.Integer.IntegerCache.high=" INTX_FORMAT, AutoBoxCacheMax); add_property(buffer); } if (AggressiveOpts && FLAG_IS_DEFAULT(DoEscapeAnalysis)) { @@ -1714,6 +1711,21 @@ jint Arguments::parse_vm_init_args(const JavaVMInitArgs* args) { return result; } + if (AggressiveOpts) { + // Insert alt-rt.jar between user-specified bootclasspath + // prefix and the default bootclasspath. os::set_boot_path() + // uses meta_index_dir as the default bootclasspath directory. + const char* altclasses_jar = "alt-rt.jar"; + size_t altclasses_path_len = strlen(get_meta_index_dir()) + 1 + + strlen(altclasses_jar); + char* altclasses_path = NEW_C_HEAP_ARRAY(char, altclasses_path_len); + strcpy(altclasses_path, get_meta_index_dir()); + strcat(altclasses_path, altclasses_jar); + scp.add_suffix_to_prefix(altclasses_path); + scp_assembly_required = true; + FREE_C_HEAP_ARRAY(char, altclasses_path); + } + // Parse _JAVA_OPTIONS environment variable (if present) (mimics classic VM) result = parse_java_options_environment_variable(&scp, &scp_assembly_required); if (result != JNI_OK) { @@ -1729,7 +1741,6 @@ jint Arguments::parse_vm_init_args(const JavaVMInitArgs* args) { return JNI_OK; } - jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, SysClassPath* scp_p, bool* scp_assembly_required_p, @@ -1795,7 +1806,7 @@ jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, *scp_assembly_required_p = true; // -Xrun } else if (match_option(option, "-Xrun", &tail)) { - if(tail != NULL) { + if (tail != NULL) { const char* pos = strchr(tail, ':'); size_t len = (pos == NULL) ? strlen(tail) : pos - tail; char* name = (char*)memcpy(NEW_C_HEAP_ARRAY(char, len + 1), tail, len); @@ -2478,7 +2489,7 @@ jint Arguments::parse_options_environment_variable(const char* name, SysClassPat vm_args.version = JNI_VERSION_1_2; vm_args.options = options; vm_args.nOptions = i; - vm_args.ignoreUnrecognized = false; + vm_args.ignoreUnrecognized = IgnoreUnrecognizedVMOptions; if (PrintVMOptions) { const char* tail; @@ -2525,13 +2536,12 @@ jint Arguments::parse(const JavaVMInitArgs* args) { // If flag "-XX:Flags=flags-file" is used it will be the first option to be processed. bool settings_file_specified = false; + const char* flags_file; int index; for (index = 0; index < args->nOptions; index++) { const JavaVMOption *option = args->options + index; if (match_option(option, "-XX:Flags=", &tail)) { - if (!process_settings_file(tail, true, args->ignoreUnrecognized)) { - return JNI_EINVAL; - } + flags_file = tail; settings_file_specified = true; } if (match_option(option, "-XX:+PrintVMOptions", &tail)) { @@ -2540,6 +2550,24 @@ jint Arguments::parse(const JavaVMInitArgs* args) { if (match_option(option, "-XX:-PrintVMOptions", &tail)) { PrintVMOptions = false; } + if (match_option(option, "-XX:+IgnoreUnrecognizedVMOptions", &tail)) { + IgnoreUnrecognizedVMOptions = true; + } + if (match_option(option, "-XX:-IgnoreUnrecognizedVMOptions", &tail)) { + IgnoreUnrecognizedVMOptions = false; + } + } + + if (IgnoreUnrecognizedVMOptions) { + // uncast const to modify the flag args->ignoreUnrecognized + *(jboolean*)(&args->ignoreUnrecognized) = true; + } + + // Parse specified settings file + if (settings_file_specified) { + if (!process_settings_file(flags_file, true, args->ignoreUnrecognized)) { + return JNI_EINVAL; + } } // Parse default .hotspotrc settings file @@ -2558,7 +2586,6 @@ jint Arguments::parse(const JavaVMInitArgs* args) { } } - // Parse JavaVMInitArgs structure passed in, as well as JAVA_TOOL_OPTIONS and _JAVA_OPTIONS jint result = parse_vm_init_args(args); if (result != JNI_OK) { diff --git a/hotspot/src/share/vm/runtime/globals.hpp b/hotspot/src/share/vm/runtime/globals.hpp index 7d9e1a614ae..c16ae09ec32 100644 --- a/hotspot/src/share/vm/runtime/globals.hpp +++ b/hotspot/src/share/vm/runtime/globals.hpp @@ -835,8 +835,21 @@ class CommandLineFlags { "Prints the system dictionary at exit") \ \ diagnostic(bool, UnsyncloadClass, false, \ - "Unstable: VM calls loadClass unsynchronized. Custom classloader "\ - "must call VM synchronized for findClass & defineClass") \ + "Unstable: VM calls loadClass unsynchronized. Custom " \ + "class loader must call VM synchronized for findClass " \ + "and defineClass.") \ + \ + product(bool, AlwaysLockClassLoader, false, \ + "Require the VM to acquire the class loader lock before calling " \ + "loadClass() even for class loaders registering " \ + "as parallel capable. Default false. ") \ + \ + product(bool, AllowParallelDefineClass, false, \ + "Allow parallel defineClass requests for class loaders " \ + "registering as parallel capable. Default false") \ + \ + product(bool, MustCallLoadClassInternal, false, \ + "Call loadClassInternal() rather than loadClass().Default false") \ \ product_pd(bool, DontYieldALot, \ "Throw away obvious excess yield calls (for SOLARIS only)") \ @@ -1294,7 +1307,14 @@ class CommandLineFlags { product(intx, ParGCArrayScanChunk, 50, \ "Scan a subset and push remainder, if array is bigger than this") \ \ - product(intx, ParGCDesiredObjsFromOverflowList, 20, \ + notproduct(bool, ParGCWorkQueueOverflowALot, false, \ + "Whether we should simulate work queue overflow in ParNew") \ + \ + notproduct(uintx, ParGCWorkQueueOverflowInterval, 1000, \ + "An `interval' counter that determines how frequently" \ + " we simulate overflow; a smaller number increases frequency") \ + \ + product(uintx, ParGCDesiredObjsFromOverflowList, 20, \ "The desired number of objects to claim from the overflow list") \ \ product(uintx, CMSParPromoteBlocksToClaim, 50, \ @@ -1406,18 +1426,18 @@ class CommandLineFlags { develop(bool, CMSOverflowEarlyRestoration, false, \ "Whether preserved marks should be restored early") \ \ - product(uintx, CMSMarkStackSize, 32*K, \ + product(uintx, CMSMarkStackSize, NOT_LP64(32*K) LP64_ONLY(4*M), \ "Size of CMS marking stack") \ \ - product(uintx, CMSMarkStackSizeMax, 4*M, \ + product(uintx, CMSMarkStackSizeMax, NOT_LP64(4*M) LP64_ONLY(512*M), \ "Max size of CMS marking stack") \ \ notproduct(bool, CMSMarkStackOverflowALot, false, \ "Whether we should simulate frequent marking stack / work queue" \ " overflow") \ \ - notproduct(intx, CMSMarkStackOverflowInterval, 1000, \ - "A per-thread `interval' counter that determines how frequently" \ + notproduct(uintx, CMSMarkStackOverflowInterval, 1000, \ + "An `interval' counter that determines how frequently" \ " we simulate overflow; a smaller number increases frequency") \ \ product(uintx, CMSMaxAbortablePrecleanLoops, 0, \ @@ -1635,7 +1655,14 @@ class CommandLineFlags { develop(uintx, WorkStealingYieldsBeforeSleep, 1000, \ "Number of yields before a sleep is done during workstealing") \ \ - product(uintx, PreserveMarkStackSize, 40, \ + develop(uintx, WorkStealingHardSpins, 4096, \ + "Number of iterations in a spin loop between checks on " \ + "time out of hard spin") \ + \ + develop(uintx, WorkStealingSpinToYieldRatio, 10, \ + "Ratio of hard spins to calls to yield") \ + \ + product(uintx, PreserveMarkStackSize, 1024, \ "Size for stack used in promotion failure handling") \ \ product_pd(bool, UseTLAB, "Use thread-local object allocation") \ @@ -2167,6 +2194,9 @@ class CommandLineFlags { product(bool, PrintVMOptions, trueInDebug, \ "print VM flag settings") \ \ + product(bool, IgnoreUnrecognizedVMOptions, false, \ + "Ignore unrecognized VM options") \ + \ diagnostic(bool, SerializeVMOutput, true, \ "Use a mutex to serialize output to tty and hotspot.log") \ \ diff --git a/hotspot/src/share/vm/runtime/memprofiler.cpp b/hotspot/src/share/vm/runtime/memprofiler.cpp index 4d5ad533d83..f8a259f9be2 100644 --- a/hotspot/src/share/vm/runtime/memprofiler.cpp +++ b/hotspot/src/share/vm/runtime/memprofiler.cpp @@ -104,21 +104,22 @@ void MemProfiler::do_trace() { } // Print trace line in log - fprintf(_log_fp, "%6.1f,%5d,%5d,%6ld,%6ld,%6ld,%6ld,", - os::elapsedTime(), - Threads::number_of_threads(), - SystemDictionary::number_of_classes(), - Universe::heap()->used() / K, - Universe::heap()->capacity() / K, - Universe::heap()->permanent_used() / HWperKB, - Universe::heap()->permanent_capacity() / HWperKB); + fprintf(_log_fp, "%6.1f,%5d,%5d," UINTX_FORMAT_W(6) "," UINTX_FORMAT_W(6) "," + UINTX_FORMAT_W(6) "," UINTX_FORMAT_W(6) ",", + os::elapsedTime(), + Threads::number_of_threads(), + SystemDictionary::number_of_classes(), + Universe::heap()->used() / K, + Universe::heap()->capacity() / K, + Universe::heap()->permanent_used() / HWperKB, + Universe::heap()->permanent_capacity() / HWperKB); - fprintf(_log_fp, "%6ld,", CodeCache::capacity() / K); + fprintf(_log_fp, UINTX_FORMAT_W(6) ",", CodeCache::capacity() / K); - fprintf(_log_fp, "%6ld,%6ld,%6ld\n", - handles_memory_usage / K, - resource_memory_usage / K, - OopMapCache::memory_usage() / K); + fprintf(_log_fp, UINTX_FORMAT_W(6) "," UINTX_FORMAT_W(6) ",%6ld\n", + handles_memory_usage / K, + resource_memory_usage / K, + OopMapCache::memory_usage() / K); fflush(_log_fp); } diff --git a/hotspot/src/share/vm/runtime/os.cpp b/hotspot/src/share/vm/runtime/os.cpp index da6d719edc0..8c81d42734a 100644 --- a/hotspot/src/share/vm/runtime/os.cpp +++ b/hotspot/src/share/vm/runtime/os.cpp @@ -74,13 +74,11 @@ char* os::iso8601_time(char* buffer, size_t buffer_length) { const int milliseconds_after_second = milliseconds_since_19700101 % milliseconds_per_microsecond; // Convert the time value to a tm and timezone variable - const struct tm *time_struct_temp = localtime(&seconds_since_19700101); - if (time_struct_temp == NULL) { - assert(false, "Failed localtime"); + struct tm time_struct; + if (localtime_pd(&seconds_since_19700101, &time_struct) == NULL) { + assert(false, "Failed localtime_pd"); return NULL; } - // Save the results of localtime - const struct tm time_struct = *time_struct_temp; const time_t zone = timezone; // If daylight savings time is in effect, @@ -93,10 +91,10 @@ char* os::iso8601_time(char* buffer, size_t buffer_length) { UTC_to_local = UTC_to_local - seconds_per_hour; } // Compute the time zone offset. - // localtime(3C) sets timezone to the difference (in seconds) + // localtime_pd() sets timezone to the difference (in seconds) // between UTC and and local time. // ISO 8601 says we need the difference between local time and UTC, - // we change the sign of the localtime(3C) result. + // we change the sign of the localtime_pd() result. const time_t local_to_UTC = -(UTC_to_local); // Then we have to figure out if if we are ahead (+) or behind (-) UTC. char sign_local_to_UTC = '+'; diff --git a/hotspot/src/share/vm/runtime/os.hpp b/hotspot/src/share/vm/runtime/os.hpp index 0856d23a03b..ce653c5f6f2 100644 --- a/hotspot/src/share/vm/runtime/os.hpp +++ b/hotspot/src/share/vm/runtime/os.hpp @@ -120,7 +120,8 @@ class os: AllStatic { // Return current local time in a string (YYYY-MM-DD HH:MM:SS). // It is MT safe, but not async-safe, as reading time zone // information may require a lock on some platforms. - static char* local_time_string(char *buf, size_t buflen); + static char* local_time_string(char *buf, size_t buflen); + static struct tm* localtime_pd (const time_t* clock, struct tm* res); // Fill in buffer with current local time as an ISO-8601 string. // E.g., YYYY-MM-DDThh:mm:ss.mmm+zzzz. // Returns buffer, or NULL if it failed. diff --git a/hotspot/src/share/vm/runtime/safepoint.cpp b/hotspot/src/share/vm/runtime/safepoint.cpp index 2a3b838f6e5..c13af643a85 100644 --- a/hotspot/src/share/vm/runtime/safepoint.cpp +++ b/hotspot/src/share/vm/runtime/safepoint.cpp @@ -730,7 +730,7 @@ void SafepointSynchronize::print_safepoint_timeout(SafepointTimeoutReason reason if (DieOnSafepointTimeout) { char msg[1024]; VM_Operation *op = VMThread::vm_operation(); - sprintf(msg, "Safepoint sync time longer than %d ms detected when executing %s.", + sprintf(msg, "Safepoint sync time longer than " INTX_FORMAT "ms detected when executing %s.", SafepointTimeoutDelay, op != NULL ? op->name() : "no vm operation"); fatal(msg); diff --git a/hotspot/src/share/vm/runtime/sharedRuntime.cpp b/hotspot/src/share/vm/runtime/sharedRuntime.cpp index 76067dc8ee1..cf69631c0bb 100644 --- a/hotspot/src/share/vm/runtime/sharedRuntime.cpp +++ b/hotspot/src/share/vm/runtime/sharedRuntime.cpp @@ -192,64 +192,46 @@ JRT_END JRT_LEAF(jint, SharedRuntime::f2i(jfloat x)) - if (g_isnan(x)) {return 0;} - jlong lltmp = (jlong)x; - jint ltmp = (jint)lltmp; - if (ltmp == lltmp) { - return ltmp; - } else { - if (x < 0) { - return min_jint; - } else { - return max_jint; - } - } + if (g_isnan(x)) + return 0; + if (x >= (jfloat) max_jint) + return max_jint; + if (x <= (jfloat) min_jint) + return min_jint; + return (jint) x; JRT_END JRT_LEAF(jlong, SharedRuntime::f2l(jfloat x)) - if (g_isnan(x)) {return 0;} - jlong lltmp = (jlong)x; - if (lltmp != min_jlong) { - return lltmp; - } else { - if (x < 0) { - return min_jlong; - } else { - return max_jlong; - } - } + if (g_isnan(x)) + return 0; + if (x >= (jfloat) max_jlong) + return max_jlong; + if (x <= (jfloat) min_jlong) + return min_jlong; + return (jlong) x; JRT_END JRT_LEAF(jint, SharedRuntime::d2i(jdouble x)) - if (g_isnan(x)) {return 0;} - jlong lltmp = (jlong)x; - jint ltmp = (jint)lltmp; - if (ltmp == lltmp) { - return ltmp; - } else { - if (x < 0) { - return min_jint; - } else { - return max_jint; - } - } + if (g_isnan(x)) + return 0; + if (x >= (jdouble) max_jint) + return max_jint; + if (x <= (jdouble) min_jint) + return min_jint; + return (jint) x; JRT_END JRT_LEAF(jlong, SharedRuntime::d2l(jdouble x)) - if (g_isnan(x)) {return 0;} - jlong lltmp = (jlong)x; - if (lltmp != min_jlong) { - return lltmp; - } else { - if (x < 0) { - return min_jlong; - } else { - return max_jlong; - } - } + if (g_isnan(x)) + return 0; + if (x >= (jdouble) max_jlong) + return max_jlong; + if (x <= (jdouble) min_jlong) + return min_jlong; + return (jlong) x; JRT_END diff --git a/hotspot/src/share/vm/runtime/synchronizer.cpp b/hotspot/src/share/vm/runtime/synchronizer.cpp index aeb66980add..e0f3cfe04bb 100644 --- a/hotspot/src/share/vm/runtime/synchronizer.cpp +++ b/hotspot/src/share/vm/runtime/synchronizer.cpp @@ -424,7 +424,7 @@ void ObjectSynchronizer::Initialize () { // asserts is that error message -- often something about negative array // indices -- is opaque. -#define CTASSERT(x) { int tag[1-(2*!(x))]; printf ("Tag @%X\n", tag); } +#define CTASSERT(x) { int tag[1-(2*!(x))]; printf ("Tag @" INTPTR_FORMAT "\n", (intptr_t)tag); } void ObjectMonitor::ctAsserts() { CTASSERT(offset_of (ObjectMonitor, _header) == 0); diff --git a/hotspot/src/share/vm/services/heapDumper.cpp b/hotspot/src/share/vm/services/heapDumper.cpp index bf7aaf1a914..18bd9f477d7 100644 --- a/hotspot/src/share/vm/services/heapDumper.cpp +++ b/hotspot/src/share/vm/services/heapDumper.cpp @@ -1700,7 +1700,7 @@ void VM_HeapDumper::doit() { // The HPROF_GC_CLASS_DUMP and HPROF_GC_INSTANCE_DUMP are the vast bulk // of the heap dump. HeapObjectDumper obj_dumper(this, writer()); - Universe::heap()->object_iterate(&obj_dumper); + Universe::heap()->safe_object_iterate(&obj_dumper); // HPROF_GC_ROOT_THREAD_OBJ + frames + jni locals do_threads(); diff --git a/hotspot/src/share/vm/utilities/globalDefinitions.hpp b/hotspot/src/share/vm/utilities/globalDefinitions.hpp index f87bfad69ac..0a9b8f2a2f3 100644 --- a/hotspot/src/share/vm/utilities/globalDefinitions.hpp +++ b/hotspot/src/share/vm/utilities/globalDefinitions.hpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2009 Sun Microsystems, Inc. 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 @@ -74,6 +74,7 @@ extern int BytesPerHeapOop; extern int BitsPerHeapOop; const int BitsPerJavaInteger = 32; +const int BitsPerJavaLong = 64; const int BitsPerSize_t = size_tSize * BitsPerByte; // Size of a char[] needed to represent a jint as a string in decimal. @@ -906,6 +907,14 @@ inline int exact_log2(intptr_t x) { return log2_intptr(x); } +//* the argument must be exactly a power of 2 +inline int exact_log2_long(jlong x) { + #ifdef ASSERT + if (!is_power_of_2_long(x)) basic_fatal("x must be a power of 2"); + #endif + return log2_long(x); +} + // returns integer round-up to the nearest multiple of s (s must be a power of two) inline intptr_t round_to(intptr_t x, uintx s) { @@ -1087,15 +1096,24 @@ inline int build_int_from_shorts( jushort low, jushort high ) { // Format macros that allow the field width to be specified. The width must be // a string literal (e.g., "8") or a macro that evaluates to one. #ifdef _LP64 +#define UINTX_FORMAT_W(width) UINT64_FORMAT_W(width) #define SSIZE_FORMAT_W(width) INT64_FORMAT_W(width) #define SIZE_FORMAT_W(width) UINT64_FORMAT_W(width) #else +#define UINTX_FORMAT_W(width) UINT32_FORMAT_W(width) #define SSIZE_FORMAT_W(width) INT32_FORMAT_W(width) #define SIZE_FORMAT_W(width) UINT32_FORMAT_W(width) #endif // _LP64 // Format pointers and size_t (or size_t-like integer types) which change size -// between 32- and 64-bit. +// between 32- and 64-bit. The pointer format theoretically should be "%p", +// however, it has different output on different platforms. On Windows, the data +// will be padded with zeros automatically. On Solaris, we can use "%016p" & +// "%08p" on 64 bit & 32 bit platforms to make the data padded with extra zeros. +// On Linux, "%016p" or "%08p" is not be allowed, at least on the latest GCC +// 4.3.2. So we have to use "%016x" or "%08x" to simulate the printing format. +// GCC 4.3.2, however requires the data to be converted to "intptr_t" when +// using "%x". #ifdef _LP64 #define PTR_FORMAT PTR64_FORMAT #define UINTX_FORMAT UINT64_FORMAT diff --git a/hotspot/src/share/vm/utilities/globalDefinitions_gcc.hpp b/hotspot/src/share/vm/utilities/globalDefinitions_gcc.hpp index 417978f0891..48f2c7e886a 100644 --- a/hotspot/src/share/vm/utilities/globalDefinitions_gcc.hpp +++ b/hotspot/src/share/vm/utilities/globalDefinitions_gcc.hpp @@ -116,7 +116,9 @@ #ifdef _LP64 #define NULL_WORD 0L #else - #define NULL_WORD 0 + // Cast 0 to intptr_t rather than int32_t since they are not the same type + // on platforms such as Mac OS X. + #define NULL_WORD ((intptr_t)0) #endif #else #define NULL_WORD NULL diff --git a/hotspot/src/share/vm/utilities/globalDefinitions_sparcWorks.hpp b/hotspot/src/share/vm/utilities/globalDefinitions_sparcWorks.hpp index f25364b72bf..62c8b92e255 100644 --- a/hotspot/src/share/vm/utilities/globalDefinitions_sparcWorks.hpp +++ b/hotspot/src/share/vm/utilities/globalDefinitions_sparcWorks.hpp @@ -115,7 +115,9 @@ #ifdef _LP64 #define NULL_WORD 0L #else - #define NULL_WORD 0 + // Cast 0 to intptr_t rather than int32_t since they are not the same type + // on some platforms. + #define NULL_WORD ((intptr_t)0) #endif #else #define NULL_WORD NULL diff --git a/hotspot/src/share/vm/utilities/ostream.cpp b/hotspot/src/share/vm/utilities/ostream.cpp index 8770bed52ca..65d18802ba2 100644 --- a/hotspot/src/share/vm/utilities/ostream.cpp +++ b/hotspot/src/share/vm/utilities/ostream.cpp @@ -300,7 +300,10 @@ fileStream::fileStream(const char* file_name) { } void fileStream::write(const char* s, size_t len) { - if (_file != NULL) fwrite(s, 1, len, _file); + if (_file != NULL) { + // Make an unused local variable to avoid warning from gcc 4.x compiler. + size_t count = fwrite(s, 1, len, _file); + } update_position(s, len); } @@ -328,7 +331,10 @@ fdStream::~fdStream() { } void fdStream::write(const char* s, size_t len) { - if (_fd != -1) ::write(_fd, s, (int)len); + if (_fd != -1) { + // Make an unused local variable to avoid warning from gcc 4.x compiler. + size_t count = ::write(_fd, s, (int)len); + } update_position(s, len); } diff --git a/hotspot/src/share/vm/utilities/taskqueue.cpp b/hotspot/src/share/vm/utilities/taskqueue.cpp index 779ec4e7f3a..2b3145813fd 100644 --- a/hotspot/src/share/vm/utilities/taskqueue.cpp +++ b/hotspot/src/share/vm/utilities/taskqueue.cpp @@ -25,6 +25,12 @@ # include "incls/_precompiled.incl" # include "incls/_taskqueue.cpp.incl" +#ifdef TRACESPINNING +uint ParallelTaskTerminator::_total_yields = 0; +uint ParallelTaskTerminator::_total_spins = 0; +uint ParallelTaskTerminator::_total_peeks = 0; +#endif + bool TaskQueueSuper::peek() { return _bottom != _age.top(); } @@ -69,15 +75,62 @@ bool ParallelTaskTerminator::offer_termination(TerminatorTerminator* terminator) { Atomic::inc(&_offered_termination); - juint yield_count = 0; + uint yield_count = 0; + // Number of hard spin loops done since last yield + uint hard_spin_count = 0; + // Number of iterations in the hard spin loop. + uint hard_spin_limit = WorkStealingHardSpins; + + // If WorkStealingSpinToYieldRatio is 0, no hard spinning is done. + // If it is greater than 0, then start with a small number + // of spins and increase number with each turn at spinning until + // the count of hard spins exceeds WorkStealingSpinToYieldRatio. + // Then do a yield() call and start spinning afresh. + if (WorkStealingSpinToYieldRatio > 0) { + hard_spin_limit = WorkStealingHardSpins >> WorkStealingSpinToYieldRatio; + hard_spin_limit = MAX2(hard_spin_limit, 1U); + } + // Remember the initial spin limit. + uint hard_spin_start = hard_spin_limit; + + // Loop waiting for all threads to offer termination or + // more work. while (true) { + // Are all threads offering termination? if (_offered_termination == _n_threads) { - //inner_termination_loop(); return true; } else { + // Look for more work. + // Periodically sleep() instead of yield() to give threads + // waiting on the cores the chance to grab this code if (yield_count <= WorkStealingYieldsBeforeSleep) { + // Do a yield or hardspin. For purposes of deciding whether + // to sleep, count this as a yield. yield_count++; - yield(); + + // Periodically call yield() instead spinning + // After WorkStealingSpinToYieldRatio spins, do a yield() call + // and reset the counts and starting limit. + if (hard_spin_count > WorkStealingSpinToYieldRatio) { + yield(); + hard_spin_count = 0; + hard_spin_limit = hard_spin_start; +#ifdef TRACESPINNING + _total_yields++; +#endif + } else { + // Hard spin this time + // Increase the hard spinning period but only up to a limit. + hard_spin_limit = MIN2(2*hard_spin_limit, + (uint) WorkStealingHardSpins); + for (uint j = 0; j < hard_spin_limit; j++) { + SpinPause(); + } + hard_spin_count++; +#ifdef TRACESPINNING + _total_spins++; +#endif + } } else { if (PrintGCDetails && Verbose) { gclog_or_tty->print_cr("ParallelTaskTerminator::offer_termination() " @@ -92,6 +145,9 @@ ParallelTaskTerminator::offer_termination(TerminatorTerminator* terminator) { sleep(WorkStealingSleepMillis); } +#ifdef TRACESPINNING + _total_peeks++; +#endif if (peek_in_queue_set() || (terminator != NULL && terminator->should_exit_termination())) { Atomic::dec(&_offered_termination); @@ -101,6 +157,16 @@ ParallelTaskTerminator::offer_termination(TerminatorTerminator* terminator) { } } +#ifdef TRACESPINNING +void ParallelTaskTerminator::print_termination_counts() { + gclog_or_tty->print_cr("ParallelTaskTerminator Total yields: %lld " + "Total spins: %lld Total peeks: %lld", + total_yields(), + total_spins(), + total_peeks()); +} +#endif + void ParallelTaskTerminator::reset_for_reuse() { if (_offered_termination != 0) { assert(_offered_termination == _n_threads, diff --git a/hotspot/src/share/vm/utilities/taskqueue.hpp b/hotspot/src/share/vm/utilities/taskqueue.hpp index 2323fb61c76..3a80a814238 100644 --- a/hotspot/src/share/vm/utilities/taskqueue.hpp +++ b/hotspot/src/share/vm/utilities/taskqueue.hpp @@ -22,67 +22,76 @@ * */ +#ifdef LP64 +typedef juint TAG_TYPE; +// for a taskqueue size of 4M +#define LOG_TASKQ_SIZE 22 +#else +typedef jushort TAG_TYPE; +// for a taskqueue size of 16K +#define LOG_TASKQ_SIZE 14 +#endif + class TaskQueueSuper: public CHeapObj { protected: // The first free element after the last one pushed (mod _n). - // (For now we'll assume only 32-bit CAS). - volatile juint _bottom; + volatile uint _bottom; // log2 of the size of the queue. enum SomeProtectedConstants { - Log_n = 14 + Log_n = LOG_TASKQ_SIZE }; +#undef LOG_TASKQ_SIZE // Size of the queue. - juint n() { return (1 << Log_n); } + uint n() { return (1 << Log_n); } // For computing "x mod n" efficiently. - juint n_mod_mask() { return n() - 1; } + uint n_mod_mask() { return n() - 1; } struct Age { - jushort _top; - jushort _tag; + TAG_TYPE _top; + TAG_TYPE _tag; - jushort tag() const { return _tag; } - jushort top() const { return _top; } + TAG_TYPE tag() const { return _tag; } + TAG_TYPE top() const { return _top; } Age() { _tag = 0; _top = 0; } friend bool operator ==(const Age& a1, const Age& a2) { return a1.tag() == a2.tag() && a1.top() == a2.top(); } - }; Age _age; // These make sure we do single atomic reads and writes. Age get_age() { - jint res = *(volatile jint*)(&_age); + uint res = *(volatile uint*)(&_age); return *(Age*)(&res); } void set_age(Age a) { - *(volatile jint*)(&_age) = *(int*)(&a); + *(volatile uint*)(&_age) = *(uint*)(&a); } - jushort get_top() { + TAG_TYPE get_top() { return get_age().top(); } // These both operate mod _n. - juint increment_index(juint ind) { + uint increment_index(uint ind) { return (ind + 1) & n_mod_mask(); } - juint decrement_index(juint ind) { + uint decrement_index(uint ind) { return (ind - 1) & n_mod_mask(); } // Returns a number in the range [0.._n). If the result is "n-1", it // should be interpreted as 0. - juint dirty_size(juint bot, juint top) { - return ((jint)bot - (jint)top) & n_mod_mask(); + uint dirty_size(uint bot, uint top) { + return ((int)bot - (int)top) & n_mod_mask(); } // Returns the size corresponding to the given "bot" and "top". - juint size(juint bot, juint top) { - juint sz = dirty_size(bot, top); + uint size(uint bot, uint top) { + uint sz = dirty_size(bot, top); // Has the queue "wrapped", so that bottom is less than top? // There's a complicated special case here. A pair of threads could // perform pop_local and pop_global operations concurrently, starting @@ -94,7 +103,7 @@ protected: // owner performs pop_local's, and several concurrent threads // attempting to perform the pop_global will all perform the same CAS, // and only one can succeed. Any stealing thread that reads after - // either the increment or decrement will seen an empty queue, and will + // either the increment or decrement will see an empty queue, and will // not join the competitors. The "sz == -1 || sz == _n-1" state will // not be modified by concurrent queues, so the owner thread can reset // the state to _bottom == top so subsequent pushes will be performed @@ -112,11 +121,11 @@ public: // Return an estimate of the number of elements in the queue. // The "careful" version admits the possibility of pop_local/pop_global // races. - juint size() { + uint size() { return size(_bottom, get_top()); } - juint dirty_size() { + uint dirty_size() { return dirty_size(_bottom, get_top()); } @@ -127,15 +136,15 @@ public: // Maximum number of elements allowed in the queue. This is two less // than the actual queue size, for somewhat complicated reasons. - juint max_elems() { return n() - 2; } + uint max_elems() { return n() - 2; } }; template class GenericTaskQueue: public TaskQueueSuper { private: // Slow paths for push, pop_local. (pop_global has no fast path.) - bool push_slow(E t, juint dirty_n_elems); - bool pop_local_slow(juint localBot, Age oldAge); + bool push_slow(E t, uint dirty_n_elems); + bool pop_local_slow(uint localBot, Age oldAge); public: // Initializes the queue to empty. @@ -170,7 +179,7 @@ private: template GenericTaskQueue::GenericTaskQueue():TaskQueueSuper() { - assert(sizeof(Age) == sizeof(jint), "Depends on this."); + assert(sizeof(Age) == sizeof(int), "Depends on this."); } template @@ -182,9 +191,9 @@ void GenericTaskQueue::initialize() { template void GenericTaskQueue::oops_do(OopClosure* f) { // tty->print_cr("START OopTaskQueue::oops_do"); - int iters = size(); - juint index = _bottom; - for (int i = 0; i < iters; ++i) { + uint iters = size(); + uint index = _bottom; + for (uint i = 0; i < iters; ++i) { index = decrement_index(index); // tty->print_cr(" doing entry %d," INTPTR_T " -> " INTPTR_T, // index, &_elems[index], _elems[index]); @@ -198,10 +207,10 @@ void GenericTaskQueue::oops_do(OopClosure* f) { template -bool GenericTaskQueue::push_slow(E t, juint dirty_n_elems) { +bool GenericTaskQueue::push_slow(E t, uint dirty_n_elems) { if (dirty_n_elems == n() - 1) { // Actually means 0, so do the push. - juint localBot = _bottom; + uint localBot = _bottom; _elems[localBot] = t; _bottom = increment_index(localBot); return true; @@ -211,7 +220,7 @@ bool GenericTaskQueue::push_slow(E t, juint dirty_n_elems) { template bool GenericTaskQueue:: -pop_local_slow(juint localBot, Age oldAge) { +pop_local_slow(uint localBot, Age oldAge) { // This queue was observed to contain exactly one element; either this // thread will claim it, or a competing "pop_global". In either case, // the queue will be logically empty afterwards. Create a new Age value @@ -230,9 +239,8 @@ pop_local_slow(juint localBot, Age oldAge) { Age tempAge; // No competing pop_global has yet incremented "top"; we'll try to // install new_age, thus claiming the element. - assert(sizeof(Age) == sizeof(jint) && sizeof(jint) == sizeof(juint), - "Assumption about CAS unit."); - *(jint*)&tempAge = Atomic::cmpxchg(*(jint*)&newAge, (volatile jint*)&_age, *(jint*)&oldAge); + assert(sizeof(Age) == sizeof(int), "Assumption about CAS unit."); + *(uint*)&tempAge = Atomic::cmpxchg(*(uint*)&newAge, (volatile uint*)&_age, *(uint*)&oldAge); if (tempAge == oldAge) { // We win. assert(dirty_size(localBot, get_top()) != n() - 1, @@ -253,8 +261,8 @@ template bool GenericTaskQueue::pop_global(E& t) { Age newAge; Age oldAge = get_age(); - juint localBot = _bottom; - juint n_elems = size(localBot, oldAge.top()); + uint localBot = _bottom; + uint n_elems = size(localBot, oldAge.top()); if (n_elems == 0) { return false; } @@ -263,7 +271,7 @@ bool GenericTaskQueue::pop_global(E& t) { newAge._top = increment_index(newAge.top()); if ( newAge._top == 0 ) newAge._tag++; Age resAge; - *(jint*)&resAge = Atomic::cmpxchg(*(jint*)&newAge, (volatile jint*)&_age, *(jint*)&oldAge); + *(uint*)&resAge = Atomic::cmpxchg(*(uint*)&newAge, (volatile uint*)&_age, *(uint*)&oldAge); // Note that using "_bottom" here might fail, since a pop_local might // have decremented it. assert(dirty_size(localBot, newAge._top) != n() - 1, @@ -287,7 +295,7 @@ public: template class GenericTaskQueueSet: public TaskQueueSetSuper { private: - int _n; + uint _n; GenericTaskQueue** _queues; public: @@ -300,51 +308,51 @@ public: } } - bool steal_1_random(int queue_num, int* seed, E& t); - bool steal_best_of_2(int queue_num, int* seed, E& t); - bool steal_best_of_all(int queue_num, int* seed, E& t); + bool steal_1_random(uint queue_num, int* seed, E& t); + bool steal_best_of_2(uint queue_num, int* seed, E& t); + bool steal_best_of_all(uint queue_num, int* seed, E& t); - void register_queue(int i, GenericTaskQueue* q); + void register_queue(uint i, GenericTaskQueue* q); - GenericTaskQueue* queue(int n); + GenericTaskQueue* queue(uint n); // The thread with queue number "queue_num" (and whose random number seed // is at "seed") is trying to steal a task from some other queue. (It // may try several queues, according to some configuration parameter.) // If some steal succeeds, returns "true" and sets "t" the stolen task, // otherwise returns false. - bool steal(int queue_num, int* seed, E& t); + bool steal(uint queue_num, int* seed, E& t); bool peek(); }; template -void GenericTaskQueueSet::register_queue(int i, GenericTaskQueue* q) { - assert(0 <= i && i < _n, "index out of range."); +void GenericTaskQueueSet::register_queue(uint i, GenericTaskQueue* q) { + assert(i < _n, "index out of range."); _queues[i] = q; } template -GenericTaskQueue* GenericTaskQueueSet::queue(int i) { +GenericTaskQueue* GenericTaskQueueSet::queue(uint i) { return _queues[i]; } template -bool GenericTaskQueueSet::steal(int queue_num, int* seed, E& t) { - for (int i = 0; i < 2 * _n; i++) +bool GenericTaskQueueSet::steal(uint queue_num, int* seed, E& t) { + for (uint i = 0; i < 2 * _n; i++) if (steal_best_of_2(queue_num, seed, t)) return true; return false; } template -bool GenericTaskQueueSet::steal_best_of_all(int queue_num, int* seed, E& t) { +bool GenericTaskQueueSet::steal_best_of_all(uint queue_num, int* seed, E& t) { if (_n > 2) { int best_k; - jint best_sz = 0; - for (int k = 0; k < _n; k++) { + uint best_sz = 0; + for (uint k = 0; k < _n; k++) { if (k == queue_num) continue; - jint sz = _queues[k]->size(); + uint sz = _queues[k]->size(); if (sz > best_sz) { best_sz = sz; best_k = k; @@ -362,9 +370,9 @@ bool GenericTaskQueueSet::steal_best_of_all(int queue_num, int* seed, E& t) { } template -bool GenericTaskQueueSet::steal_1_random(int queue_num, int* seed, E& t) { +bool GenericTaskQueueSet::steal_1_random(uint queue_num, int* seed, E& t) { if (_n > 2) { - int k = queue_num; + uint k = queue_num; while (k == queue_num) k = randomParkAndMiller(seed) % _n; return _queues[2]->pop_global(t); } else if (_n == 2) { @@ -378,20 +386,20 @@ bool GenericTaskQueueSet::steal_1_random(int queue_num, int* seed, E& t) { } template -bool GenericTaskQueueSet::steal_best_of_2(int queue_num, int* seed, E& t) { +bool GenericTaskQueueSet::steal_best_of_2(uint queue_num, int* seed, E& t) { if (_n > 2) { - int k1 = queue_num; + uint k1 = queue_num; while (k1 == queue_num) k1 = randomParkAndMiller(seed) % _n; - int k2 = queue_num; + uint k2 = queue_num; while (k2 == queue_num || k2 == k1) k2 = randomParkAndMiller(seed) % _n; // Sample both and try the larger. - juint sz1 = _queues[k1]->size(); - juint sz2 = _queues[k2]->size(); + uint sz1 = _queues[k1]->size(); + uint sz2 = _queues[k2]->size(); if (sz2 > sz1) return _queues[k2]->pop_global(t); else return _queues[k1]->pop_global(t); } else if (_n == 2) { // Just try the other one. - int k = (queue_num + 1) % 2; + uint k = (queue_num + 1) % 2; return _queues[k]->pop_global(t); } else { assert(_n == 1, "can't be zero."); @@ -402,7 +410,7 @@ bool GenericTaskQueueSet::steal_best_of_2(int queue_num, int* seed, E& t) { template bool GenericTaskQueueSet::peek() { // Try all the queues. - for (int j = 0; j < _n; j++) { + for (uint j = 0; j < _n; j++) { if (_queues[j]->peek()) return true; } @@ -418,11 +426,19 @@ public: // A class to aid in the termination of a set of parallel tasks using // TaskQueueSet's for work stealing. +#undef TRACESPINNING + class ParallelTaskTerminator: public StackObj { private: int _n_threads; TaskQueueSetSuper* _queue_set; - jint _offered_termination; + int _offered_termination; + +#ifdef TRACESPINNING + static uint _total_yields; + static uint _total_spins; + static uint _total_peeks; +#endif bool peek_in_queue_set(); protected: @@ -454,13 +470,19 @@ public: // the terminator is finished. void reset_for_reuse(); +#ifdef TRACESPINNING + static uint total_yields() { return _total_yields; } + static uint total_spins() { return _total_spins; } + static uint total_peeks() { return _total_peeks; } + static void print_termination_counts(); +#endif }; #define SIMPLE_STACK 0 template inline bool GenericTaskQueue::push(E t) { #if SIMPLE_STACK - juint localBot = _bottom; + uint localBot = _bottom; if (_bottom < max_elems()) { _elems[localBot] = t; _bottom = localBot + 1; @@ -469,10 +491,10 @@ template inline bool GenericTaskQueue::push(E t) { return false; } #else - juint localBot = _bottom; + uint localBot = _bottom; assert((localBot >= 0) && (localBot < n()), "_bottom out of range."); - jushort top = get_top(); - juint dirty_n_elems = dirty_size(localBot, top); + TAG_TYPE top = get_top(); + uint dirty_n_elems = dirty_size(localBot, top); assert((dirty_n_elems >= 0) && (dirty_n_elems < n()), "n_elems out of range."); if (dirty_n_elems < max_elems()) { @@ -487,19 +509,19 @@ template inline bool GenericTaskQueue::push(E t) { template inline bool GenericTaskQueue::pop_local(E& t) { #if SIMPLE_STACK - juint localBot = _bottom; + uint localBot = _bottom; assert(localBot > 0, "precondition."); localBot--; t = _elems[localBot]; _bottom = localBot; return true; #else - juint localBot = _bottom; + uint localBot = _bottom; // This value cannot be n-1. That can only occur as a result of // the assignment to bottom in this method. If it does, this method // resets the size( to 0 before the next call (which is sequential, // since this is pop_local.) - juint dirty_n_elems = dirty_size(localBot, get_top()); + uint dirty_n_elems = dirty_size(localBot, get_top()); assert(dirty_n_elems != n() - 1, "Shouldn't be possible..."); if (dirty_n_elems == 0) return false; localBot = decrement_index(localBot); @@ -512,7 +534,7 @@ template inline bool GenericTaskQueue::pop_local(E& t) { // If there's still at least one element in the queue, based on the // "_bottom" and "age" we've read, then there can be no interference with // a "pop_global" operation, and we're done. - juint tp = get_top(); + TAG_TYPE tp = get_top(); // XXX if (size(localBot, tp) > 0) { assert(dirty_size(localBot, tp) != n() - 1, "Shouldn't be possible..."); @@ -581,7 +603,7 @@ class RegionTaskQueueWithOverflow: public CHeapObj { bool is_empty(); bool stealable_is_empty(); bool overflow_is_empty(); - juint stealable_size() { return _region_queue.size(); } + uint stealable_size() { return _region_queue.size(); } RegionTaskQueue* task_queue() { return &_region_queue; } }; diff --git a/hotspot/src/share/vm/utilities/vmError.cpp b/hotspot/src/share/vm/utilities/vmError.cpp index d2a0161a7cc..a4d0cb0baf0 100644 --- a/hotspot/src/share/vm/utilities/vmError.cpp +++ b/hotspot/src/share/vm/utilities/vmError.cpp @@ -674,6 +674,11 @@ void VMError::report_and_die() { reset_signal_handlers(); } else { + // If UseOsErrorReporting we call this for each level of the call stack + // while searching for the exception handler. Only the first level needs + // to be reported. + if (UseOSErrorReporting && log_done) return; + // This is not the first error, see if it happened in a different thread // or in the same thread during error reporting. if (first_error_tid != mytid) { diff --git a/hotspot/src/share/vm/utilities/vmError.hpp b/hotspot/src/share/vm/utilities/vmError.hpp index 414bc7f21eb..8e618d91462 100644 --- a/hotspot/src/share/vm/utilities/vmError.hpp +++ b/hotspot/src/share/vm/utilities/vmError.hpp @@ -50,7 +50,7 @@ class VMError : public StackObj { // additional info for VM internal errors const char * _filename; - int _lineno; + size_t _lineno; // used by fatal error handler int _current_step; diff --git a/hotspot/src/share/vm/utilities/workgroup.hpp b/hotspot/src/share/vm/utilities/workgroup.hpp index fb2ec0603fd..45ddc9cbfc2 100644 --- a/hotspot/src/share/vm/utilities/workgroup.hpp +++ b/hotspot/src/share/vm/utilities/workgroup.hpp @@ -32,7 +32,7 @@ class WorkData; // An abstract task to be worked on by a gang. // You subclass this to supply your own work() method -class AbstractGangTask: public CHeapObj { +class AbstractGangTask VALUE_OBJ_CLASS_SPEC { public: // The abstract work method. // The argument tells you which member of the gang you are. diff --git a/hotspot/test/Makefile b/hotspot/test/Makefile index 2596d851229..f78c2d971c6 100644 --- a/hotspot/test/Makefile +++ b/hotspot/test/Makefile @@ -28,9 +28,9 @@ # Get OS/ARCH specifics OSNAME = $(shell uname -s) -SLASH_JAVA = /java ifeq ($(OSNAME), SunOS) PLATFORM = solaris + SLASH_JAVA = /java ARCH = $(shell uname -p) ifeq ($(ARCH), i386) ARCH=i586 @@ -38,6 +38,7 @@ ifeq ($(OSNAME), SunOS) endif ifeq ($(OSNAME), Linux) PLATFORM = linux + SLASH_JAVA = /java ARCH = $(shell uname -m) ifeq ($(ARCH), i386) ARCH = i586 @@ -62,6 +63,10 @@ ifeq ($(OSNAME), Windows_NT) EXESUFFIX = .exe endif +ifdef ALT_SLASH_JAVA + SLASH_JAVA = $(ALT_SLASH_JAVA) +endif + # Utilities used CD = cd CP = cp diff --git a/hotspot/test/compiler/6603011/Test.java b/hotspot/test/compiler/6603011/Test.java new file mode 100644 index 00000000000..1192d258afe --- /dev/null +++ b/hotspot/test/compiler/6603011/Test.java @@ -0,0 +1,220 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/** + * @test + * @bug 6603011 + * @summary long/int division by constant + * + * @run main/othervm -Xcomp -Xbatch -XX:-Inline Test + */ + +// +// -XX:-Inline is essential to this test so that verification functions +// divi, modi, divl and modl generate "plain" divides. +// -Xcomp -Xbatch are also useful to ensure the full range of +// dividend and divisor combinations are tested +// + +import java.net.*; + +class s { + static int divi(int dividend, int divisor) { return dividend / divisor; } + static int modi(int dividend, int divisor) { return dividend % divisor; } + static long divl(long dividend, long divisor) { return dividend / divisor; } + static long modl(long dividend, long divisor) { return dividend % divisor; } +} + +public class Test implements Runnable { + // Report verbose messages on failure; turn off to suppress + // too much output with gross numbers of failures. + static final boolean VERBOSE = true; + + // Initailize DIVISOR so that it is final in this class. + static final int DIVISOR; + static { + int value = 0; + try { + value = Integer.decode(System.getProperty("divisor")); + } catch (Throwable e) { + } + DIVISOR = value; + } + + // The methods of interest. We want the JIT to compile these + // and convert the divide into a multiply. + public int divbyI (int dividend) { return dividend / DIVISOR; } + public int modbyI (int dividend) { return dividend % DIVISOR; } + public long divbyL (long dividend) { return dividend / DIVISOR; } + public long modbyL (long dividend) { return dividend % DIVISOR; } + + public int divisor() { return DIVISOR; } + + public boolean checkI (int dividend) { + int quo = divbyI(dividend); + int rem = modbyI(dividend); + int quo0 = s.divi(dividend, divisor()); + int rem0 = s.modi(dividend, divisor()); + + if (quo != quo0 || rem != rem0) { + if (VERBOSE) { + System.out.println("Computed: " + dividend + " / " + divisor() + " = " + + quo + ", " + dividend + " % " + divisor() + " = " + rem ); + System.out.println("expected: " + dividend + " / " + divisor() + " = " + + quo0 + ", " + dividend + " % " + divisor() + " = " + rem0); + // Report sign of rem failure + if (rem != 0 && (rem ^ dividend) < 0) { + System.out.println(" rem & dividend have different signs"); + } + // Report range of rem failure + if (java.lang.Math.abs(rem) >= java.lang.Math.abs(divisor())) { + System.out.println(" remainder out of range"); + } + // Report quo/rem identity relationship failure + if ((quo * divisor()) + rem != dividend) { + System.out.println(" quotien/remainder invariant broken"); + } + } + return false; + } + return true; + } + + public boolean checkL (long dividend) { + long quo = divbyL(dividend); + long rem = modbyL(dividend); + long quo0 = s.divl(dividend, divisor()); + long rem0 = s.modl(dividend, divisor()); + + if (quo != quo0 || rem != rem0) { + if (VERBOSE) { + System.out.println(" " + dividend + " / " + divisor() + " = " + + quo + ", " + dividend + " % " + divisor() + " = " + rem); + // Report sign of rem failure + if (rem != 0 && (rem ^ dividend) < 0) { + System.out.println(" rem & dividend have different signs"); + } + // Report range of rem failure + if (java.lang.Math.abs(rem) >= java.lang.Math.abs(divisor())) { + System.out.println(" remainder out of range"); + } + // Report quo/rem identity relationship failure + if ((quo * divisor()) + rem != dividend) { + System.out.println(" (" + quo + " * " + divisor() + ") + " + rem + " != " + + dividend); + } + } + return false; + } + return true; + } + + public void run() { + // Don't try to divide by zero + if (divisor() == 0) return; + + // Range of dividends to check. Try dividends from start to end + // inclusive, as well as variations on those values as shifted + // left. + int start = -1024; + int end = 1024; + + // Test int division using a variety of dividends. + int wrong = 0; + int total = 0; + + outerloop: + for (int i = start; i <= end; i++) { + for (int s = 0; s < 32; s += 4) { + total++; + int dividend = i << s; + if (!checkI(dividend)) { + wrong++; + // Stop on the first failure + // break outerloop; + } + } + } + if (wrong > 0) { + System.out.println("divisor " + divisor() + ": " + + wrong + "/" + total + " wrong int divisions"); + } + + // Test long division using a variety of dividends. + wrong = 0; + total = 0; + + outerloop: + for (int i = start; i <= end; i++) { + for (int s = 0; s < 64; s += 4) { + total++; + long dividend = i << s; + if (!checkL(dividend)) { + wrong++; + // Stop on the first failure + // break outerloop; + } + } + } + if (wrong > 0) { + System.out.println("divisor " + divisor() + ": " + + wrong + "/" + total + " wrong long divisions"); + } + + } + + // Reload this class with the "divisor" property set to the input parameter. + // This allows the JIT to see q.DIVISOR as a final constant, and change + // any divisions or mod operations into multiplies. + public static void test_divisor(int divisor, + URLClassLoader apploader) throws Exception { + System.setProperty("divisor", "" + divisor); + ClassLoader loader = new URLClassLoader(apploader.getURLs(), + apploader.getParent()); + Class c = loader.loadClass("Test"); + Runnable r = (Runnable)c.newInstance(); + r.run(); + } + + public static void main(String[] args) throws Exception { + Class cl = Class.forName("Test"); + URLClassLoader apploader = (URLClassLoader)cl.getClassLoader(); + + + // Test every divisor between -100 and 100. + for (int i = -100; i <= 100; i++) { + test_divisor(i, apploader); + } + + // Try a few divisors outside the typical range. + // The values below have been observed in rt.jar. + test_divisor(101, apploader); + test_divisor(400, apploader); + test_divisor(1000, apploader); + test_divisor(3600, apploader); + test_divisor(9973, apploader); + test_divisor(86400, apploader); + test_divisor(1000000, apploader); + } + +} diff --git a/hotspot/test/compiler/6775880/Test.java b/hotspot/test/compiler/6775880/Test.java index 7c952ec4530..a938f9e73c4 100644 --- a/hotspot/test/compiler/6775880/Test.java +++ b/hotspot/test/compiler/6775880/Test.java @@ -27,7 +27,7 @@ * @bug 6775880 * @summary EA +DeoptimizeALot: assert(mon_info->owner()->is_locked(),"object must be locked now") * @compile -source 1.4 -target 1.4 Test.java - * @run main/othervm -server -Xbatch -XX:+DoEscapeAnalysis -XX:+DeoptimizeALot -XX:CompileCommand=exclude,java.lang.AbstractStringBuilder::append Test + * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -Xbatch -XX:+DoEscapeAnalysis -XX:+DeoptimizeALot -XX:CompileCommand=exclude,java.lang.AbstractStringBuilder::append Test */ public class Test { diff --git a/hotspot/test/compiler/6778657/Test.java b/hotspot/test/compiler/6778657/Test.java new file mode 100644 index 00000000000..4fdd33e9386 --- /dev/null +++ b/hotspot/test/compiler/6778657/Test.java @@ -0,0 +1,75 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ + +/* + * @test + * @bug 6778657 + * @summary Casts in SharedRuntime::f2i, f2l, d2i and d2l rely on undefined C++ behaviour + */ + +public class Test { + public static void check_f2i(int expect) { + float check = expect; + check *= 2; + int actual = (int) check; + if (actual != expect) + throw new RuntimeException("expecting " + expect + ", got " + actual); + } + + public static void check_f2l(long expect) { + float check = expect; + check *= 2; + long actual = (long) check; + if (actual != expect) + throw new RuntimeException("expecting " + expect + ", got " + actual); + } + + public static void check_d2i(int expect) { + double check = expect; + check *= 2; + int actual = (int) check; + if (actual != expect) + throw new RuntimeException("expecting " + expect + ", got " + actual); + } + + public static void check_d2l(long expect) { + double check = expect; + check *= 2; + long actual = (long) check; + if (actual != expect) + throw new RuntimeException("expecting " + expect + ", got " + actual); + } + + public static void main(String[] args) { + check_f2i(Integer.MAX_VALUE); + check_f2i(Integer.MIN_VALUE); + check_f2l(Long.MAX_VALUE); + check_f2l(Long.MIN_VALUE); + check_d2i(Integer.MAX_VALUE); + check_d2i(Integer.MIN_VALUE); + check_d2l(Long.MAX_VALUE); + check_d2l(Long.MIN_VALUE); + } +} + diff --git a/hotspot/test/compiler/6795161/Test.java b/hotspot/test/compiler/6795161/Test.java new file mode 100644 index 00000000000..62dbd0dc5cc --- /dev/null +++ b/hotspot/test/compiler/6795161/Test.java @@ -0,0 +1,60 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ + +/* + * @test + * @bug 6795161 + * @summary Escape analysis leads to data corruption + * @run main/othervm -server -Xcomp -XX:CompileOnly=Test -XX:+DoEscapeAnalysis Test + */ + +class Test_Class_1 { + static String var_1; + + static void badFunc(int size) + { + try { + for (int i = 0; i < 1; (new byte[size-i])[0] = 0, i++) {} + } catch (Exception e) { + // don't comment it out, it will lead to correct results ;) + //System.out.println("Got exception: " + e); + } + } +} + +public class Test { + static String var_1_copy = Test_Class_1.var_1; + + static byte var_check; + + public static void main(String[] args) + { + var_check = 1; + + Test_Class_1.badFunc(-1); + + System.out.println("EATester.var_check = " + Test.var_check + " (expected 1)\n"); + } +} + diff --git a/hotspot/test/compiler/6795362/Test6795362.java b/hotspot/test/compiler/6795362/Test6795362.java new file mode 100644 index 00000000000..2b37618ac76 --- /dev/null +++ b/hotspot/test/compiler/6795362/Test6795362.java @@ -0,0 +1,48 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/** + * @test + * @bug 6795362 + * @summary 32bit server compiler leads to wrong results on solaris-x86 + * + * @run main/othervm -Xcomp -XX:CompileOnly=Test6795362.sub Test6795362 + */ + +public class Test6795362 { + public static void main(String[] args) + { + sub(); + + if (var_bad != 0) + throw new InternalError(var_bad + " != 0"); + } + + static long var_bad = -1L; + + static void sub() + { + var_bad >>= 65; + var_bad /= 65; + } +} diff --git a/hotspot/test/compiler/6799693/Test.java b/hotspot/test/compiler/6799693/Test.java new file mode 100644 index 00000000000..dbb691e0384 --- /dev/null +++ b/hotspot/test/compiler/6799693/Test.java @@ -0,0 +1,47 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ + +/* + * @test + * @bug 6799693 + * @summary Server compiler leads to data corruption when expression throws an Exception + * @run main/othervm -Xcomp -XX:CompileOnly=Test Test + */ + +public class Test { + static int var_bad = 1; + + public static void main(String[] args) + { + var_bad++; + + try { + for (int i = 0; i < 10; i++) (new byte[((byte)-1 << i)])[0] = 0; + } + catch (Exception e) { System.out.println("Got " + e); } + + System.out.println("Test.var_bad = " + var_bad + " (expected 2)\n"); + } +} + diff --git a/hotspot/test/compiler/6800154/Test6800154.java b/hotspot/test/compiler/6800154/Test6800154.java new file mode 100644 index 00000000000..41b95bb0f50 --- /dev/null +++ b/hotspot/test/compiler/6800154/Test6800154.java @@ -0,0 +1,109 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/** + * @test + * @bug 6800154 + * @summary Add comments to long_by_long_mulhi() for better understandability + * + * @run main/othervm -Xcomp -XX:CompileOnly=Test6800154.divcomp Test6800154 + */ + +import java.net.URLClassLoader; + +public class Test6800154 implements Runnable { + static final long[] DIVIDENDS = { + 0, + 1, + 2, + 1423487, + 4444441, + 4918923241323L, + -1, + -24351, + 0x3333, + 0x0000000080000000L, + 0x7fffffffffffffffL, + 0x8000000000000000L + }; + + static final long[] DIVISORS = { + 1, + 2, + 17, + 12342, + 24123, + 143444, + 123444442344L, + -1, + -2, + -4423423234231423L, + 0x0000000080000000L, + 0x7fffffffffffffffL, + 0x8000000000000000L + }; + + // Initialize DIVISOR so that it is final in this class. + static final long DIVISOR; + + static { + long value = 0; + try { + value = Long.decode(System.getProperty("divisor")); + } catch (Throwable e) { + } + DIVISOR = value; + } + + public static void main(String[] args) throws Exception + { + Class cl = Class.forName("Test6800154"); + URLClassLoader apploader = (URLClassLoader) cl.getClassLoader(); + + // Iterate over all divisors. + for (int i = 0; i < DIVISORS.length; i++) { + System.setProperty("divisor", "" + DIVISORS[i]); + ClassLoader loader = new URLClassLoader(apploader.getURLs(), apploader.getParent()); + Class c = loader.loadClass("Test6800154"); + Runnable r = (Runnable) c.newInstance(); + r.run(); + } + } + + public void run() + { + // Iterate over all dividends. + for (int i = 0; i < DIVIDENDS.length; i++) { + long dividend = DIVIDENDS[i]; + + long expected = divint(dividend); + long result = divcomp(dividend); + + if (result != expected) + throw new InternalError(dividend + " / " + DIVISOR + " failed: " + result + " != " + expected); + } + } + + static long divint(long a) { return a / DIVISOR; } + static long divcomp(long a) { return a / DIVISOR; } +} diff --git a/hotspot/test/compiler/6805724/Test6805724.java b/hotspot/test/compiler/6805724/Test6805724.java new file mode 100644 index 00000000000..f05d8e6bf6e --- /dev/null +++ b/hotspot/test/compiler/6805724/Test6805724.java @@ -0,0 +1,80 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/** + * @test + * @bug 6805724 + * @summary ModLNode::Ideal() generates functionally incorrect graph when divisor is any (2^k-1) constant. + * + * @run main/othervm -Xcomp -XX:CompileOnly=Test6805724.fcomp Test6805724 + */ + +import java.net.URLClassLoader; + +public class Test6805724 implements Runnable { + // Initialize DIVISOR so that it is final in this class. + static final long DIVISOR; // 2^k-1 constant + + static { + long value = 0; + try { + value = Long.decode(System.getProperty("divisor")); + } catch (Throwable t) { + // This one is required for the Class.forName() in main. + } + DIVISOR = value; + } + + static long fint(long x) { + return x % DIVISOR; + } + + static long fcomp(long x) { + return x % DIVISOR; + } + + public void run() { + long a = 0x617981E1L; + + long expected = fint(a); + long result = fcomp(a); + + if (result != expected) + throw new InternalError(result + " != " + expected); + } + + public static void main(String args[]) throws Exception { + Class cl = Class.forName("Test6805724"); + URLClassLoader apploader = (URLClassLoader) cl.getClassLoader(); + + // Iterate over all 2^k-1 divisors. + for (int k = 1; k < Long.SIZE; k++) { + long divisor = (1L << k) - 1; + System.setProperty("divisor", "" + divisor); + ClassLoader loader = new URLClassLoader(apploader.getURLs(), apploader.getParent()); + Class c = loader.loadClass("Test6805724"); + Runnable r = (Runnable) c.newInstance(); + r.run(); + } + } +} diff --git a/jaxp/.hgtags b/jaxp/.hgtags index 7fc0dc775eb..a5c20cf42ee 100644 --- a/jaxp/.hgtags +++ b/jaxp/.hgtags @@ -18,3 +18,8 @@ e9f750f0a3a00413a7b77028b2ecdabb7129ae32 jdk7-b38 0758bd3e2852e4f931ba211cc4d48f589450eeb4 jdk7-b41 036e0dca841a5a17f784d15c86a9da88d2a6f1e6 jdk7-b42 96fe28d4a9131e1a97bfe00f779e5626cd09c4d0 jdk7-b43 +b203df0741af3eb08687bc5eb798bac87363758d jdk7-b44 +0f113667880d335cfa2c35721b1b45144fb757f5 jdk7-b45 +b2271877894af809b7703767fe8d4e38591a02a2 jdk7-b46 +d711ad1954b294957737ea386cfd4d3c05028a36 jdk7-b47 +39de90eb4822cafaacc69edd67ab5547e55ae920 jdk7-b48 diff --git a/jaxws/.hgtags b/jaxws/.hgtags index cd4d4fd0691..0229b71ed66 100644 --- a/jaxws/.hgtags +++ b/jaxws/.hgtags @@ -18,3 +18,8 @@ a2a6f9edf761934faf59ea60d7fe7178371302cd jdk7-b37 a8379d24aa03386610169cb0f4e4b8ed266a2e8d jdk7-b41 621c02d83abc850c170fb6726d57b19f1eaf5033 jdk7-b42 1ad2f51564db6ca4c6d95760cf13fb083d3dec94 jdk7-b43 +344485a03674b6950a7a23d01a6efb8055afb6ec jdk7-b44 +dea7753d713936c5b6fd942a91811b0676537fd0 jdk7-b45 +af4a3eeb7812a5d09a241c50b51b3c648a9d45c1 jdk7-b46 +223011570edbd49bb0fe51cdeb2089f95d305267 jdk7-b47 +01e5dd31d0c10a2db3d50db346905d2d3db45e88 jdk7-b48 diff --git a/jdk/.hgtags b/jdk/.hgtags index d543838710c..6a5bcb2becb 100644 --- a/jdk/.hgtags +++ b/jdk/.hgtags @@ -18,3 +18,9 @@ cc5f810b5af8a3a83b0df5a29d9e24d7a0ff8086 jdk7-b38 44941f893cea95ecdd5987b12e548069bd803849 jdk7-b41 3ef0bdfa7609f79d4f2ea621f30cf593a2e432ce jdk7-b42 50c67678b0d180063ade199d398b67a54063fa7f jdk7-b43 +d8eb2738db6b148911177d9bcfe888109b7f2f71 jdk7-b44 +527b426497a259d0605d069e3930e838948531a6 jdk7-b45 +4b03e27a44090d1f646af28dc58f9ead827e24c7 jdk7-b46 +b4ac413b1f129eeef0acab3f31081c1b7dfe3b27 jdk7-b47 +5fbd9ea7def17186693b6f7099b5d0dc73903eee jdk7-b48 +8311105ea7a3db7bcbcb2b696459127c7f2297a4 jdk7-b49 diff --git a/jdk/make/com/sun/org/apache/xml/Makefile b/jdk/make/com/sun/org/apache/xml/Makefile index 140a381c45e..36a15bac490 100644 --- a/jdk/make/com/sun/org/apache/xml/Makefile +++ b/jdk/make/com/sun/org/apache/xml/Makefile @@ -41,7 +41,7 @@ AUTO_FILES_JAVA_DIRS = com/sun/org/apache/xml # Resources # LOCALE_SET_DEFINITION = jre -NEW_RESOURCE_BUNDLES_PROPERTIES = \ +NEW_RESOURCE_BUNDLES_UNCOMPILED_PROPERTIES = \ $(PKGDIR)/internal/security/resource/config.dtd \ $(PKGDIR)/internal/security/resource/config.xml \ $(PKGDIR)/internal/security/resource/xmlsecurity_de.properties \ diff --git a/jdk/make/com/sun/rowset/Makefile b/jdk/make/com/sun/rowset/Makefile index 919ef46fd99..ff7641a128e 100644 --- a/jdk/make/com/sun/rowset/Makefile +++ b/jdk/make/com/sun/rowset/Makefile @@ -41,7 +41,7 @@ AUTO_FILES_JAVA_DIRS = com/sun/rowset # Resources # LOCALE_SET_DEFINITION = jre -RESOURCE_BUNDLES_PROPERTIES = $(PKGDIR)/RowSetResourceBundle.properties +RESOURCE_BUNDLES_UNCOMPILED_PROPERTIES = $(PKGDIR)/RowSetResourceBundle.properties # # Rules diff --git a/jdk/make/common/Release.gmk b/jdk/make/common/Release.gmk index 76a1bc466f2..4bee467967d 100644 --- a/jdk/make/common/Release.gmk +++ b/jdk/make/common/Release.gmk @@ -911,14 +911,6 @@ initial-image-jdk:: initial-image-jdk-setup \ fi; \ done ifeq ($(PLATFORM), windows) - @# - @# Audio soundbank - Bug# 4236400 - @# Windows only: adding audio files to JDK's jre/lib directory. - @# - ($(CD) $(LIBDIR) && $(TAR) cf - \ - `$(FIND) audio -depth -print`) | \ - ($(CD) $(JDK_IMAGE_DIR)/jre/lib && $(TAR) xf -) - @# @# @# lib/ @# diff --git a/jdk/make/common/internal/BinaryPlugs.gmk b/jdk/make/common/internal/BinaryPlugs.gmk index bb2d64262ed..a77044af43c 100644 --- a/jdk/make/common/internal/BinaryPlugs.gmk +++ b/jdk/make/common/internal/BinaryPlugs.gmk @@ -29,9 +29,7 @@ # Names of native shared libraries -PLUG_JSOUND_LIBRARY=$(LIB_PREFIX)jsoundhs.$(LIBRARY_SUFFIX) -PLUG_LIBRARY_NAMES = \ - $(PLUG_JSOUND_LIBRARY) +PLUG_LIBRARY_NAMES= # Sub-directory where native shared libraries are located (e.g. jre/bin or...) @@ -74,62 +72,10 @@ com/sun/jmx/snmp/daemon/SnmpSocket.class \ com/sun/jmx/snmp/daemon/SnmpTimerServer.class \ com/sun/jmx/snmp/daemon/WaitQ.class -PLUG_SOUND_CLASS_NAMES = \ -com/sun/media/sound/AbstractPlayer.class \ -com/sun/media/sound/CircularBuffer.class \ -com/sun/media/sound/HeadspaceInstrument.class \ -com/sun/media/sound/HeadspaceMixer\$$1.class \ -com/sun/media/sound/HeadspaceMixer\$$MidiLine.class \ -com/sun/media/sound/HeadspaceMixer\$$MidiLineInfo.class \ -com/sun/media/sound/HeadspaceMixer\$$MixerInfo.class \ -com/sun/media/sound/HeadspaceMixer\$$MixerReverbControl\$$MixerReverbType.class \ -com/sun/media/sound/HeadspaceMixer\$$MixerReverbControl.class \ -com/sun/media/sound/HeadspaceMixer.class \ -com/sun/media/sound/HeadspaceMixerProvider.class \ -com/sun/media/sound/HeadspaceSample.class \ -com/sun/media/sound/HeadspaceSoundbank.class \ -com/sun/media/sound/HsbParser.class \ -com/sun/media/sound/MixerClip\$$1.class \ -com/sun/media/sound/MixerClip\$$MixerClipApplyReverbControl.class \ -com/sun/media/sound/MixerClip\$$MixerClipGainControl.class \ -com/sun/media/sound/MixerClip\$$MixerClipMuteControl.class \ -com/sun/media/sound/MixerClip\$$MixerClipPanControl.class \ -com/sun/media/sound/MixerClip\$$MixerClipSampleRateControl.class \ -com/sun/media/sound/MixerClip.class \ -com/sun/media/sound/MixerMidiChannel.class \ -com/sun/media/sound/MixerSequencer\$$1.class \ -com/sun/media/sound/MixerSequencer\$$ControllerVectorElement.class \ -com/sun/media/sound/MixerSequencer\$$MixerSequencerInfo.class \ -com/sun/media/sound/MixerSequencer\$$RecordingTrack.class \ -com/sun/media/sound/MixerSequencer.class \ -com/sun/media/sound/MixerSequencerProvider.class \ -com/sun/media/sound/MixerSourceLine\$$1.class \ -com/sun/media/sound/MixerSourceLine\$$MixerSourceLineApplyReverbControl.class \ -com/sun/media/sound/MixerSourceLine\$$MixerSourceLineGainControl.class \ -com/sun/media/sound/MixerSourceLine\$$MixerSourceLineMuteControl.class \ -com/sun/media/sound/MixerSourceLine\$$MixerSourceLinePanControl.class \ -com/sun/media/sound/MixerSourceLine\$$MixerSourceLineSampleRateControl.class \ -com/sun/media/sound/MixerSourceLine.class \ -com/sun/media/sound/MixerSynth\$$1.class \ -com/sun/media/sound/MixerSynth\$$MixerSynthInfo.class \ -com/sun/media/sound/MixerSynth\$$SynthReceiver.class \ -com/sun/media/sound/MixerSynth.class \ -com/sun/media/sound/MixerSynthProvider.class \ -com/sun/media/sound/MixerThread.class \ -com/sun/media/sound/RmfFileReader.class \ -com/sun/media/sound/SimpleInputDevice\$$1.class \ -com/sun/media/sound/SimpleInputDevice\$$InputDeviceDataLine.class \ -com/sun/media/sound/SimpleInputDevice\$$InputDevicePort.class \ -com/sun/media/sound/SimpleInputDevice\$$InputDevicePortInfo.class \ -com/sun/media/sound/SimpleInputDevice.class \ -com/sun/media/sound/SimpleInputDeviceProvider\$$1.class \ -com/sun/media/sound/SimpleInputDeviceProvider\$$InputDeviceInfo.class \ -com/sun/media/sound/SimpleInputDeviceProvider.class - # Class list temp files (used by both import and export of plugs) PLUG_TEMPDIR=$(ABS_TEMPDIR)/plugs -PLUG_CLASS_AREAS = jmf sound +PLUG_CLASS_AREAS = jmf PLUG_CLISTS = $(PLUG_CLASS_AREAS:%=$(PLUG_TEMPDIR)/%.clist) # Create jargs file command @@ -147,18 +93,11 @@ $(PLUG_TEMPDIR)/jmf.clist: @for i in $(PLUG_JMF_CLASS_NAMES) ; do \ $(ECHO) "$$i" >> $@; \ done -$(PLUG_TEMPDIR)/sound.clist: - @$(prep-target) - @for i in $(PLUG_SOUND_CLASS_NAMES) ; do \ - $(ECHO) "$$i" >> $@ ; \ - done $(PLUG_TEMPDIR)/all.clist: $(PLUG_CLISTS) @$(prep-target) $(CAT) $(PLUG_CLISTS) > $@ $(PLUG_TEMPDIR)/jmf.jargs: $(PLUG_TEMPDIR)/jmf.clist $(plug-create-jargs) -$(PLUG_TEMPDIR)/sound.jargs: $(PLUG_TEMPDIR)/sound.clist - $(plug-create-jargs) $(PLUG_TEMPDIR)/all.jargs: $(PLUG_TEMPDIR)/all.clist $(plug-create-jargs) @@ -193,25 +132,11 @@ endef # import-binary-plug-classes import-binary-plug-jmf-classes: $(PLUG_IMPORT_JARFILE) $(PLUG_TEMPDIR)/jmf.clist $(call import-binary-plug-classes,$(PLUG_TEMPDIR)/jmf.clist) -import-binary-plug-sound-classes: $(PLUG_IMPORT_JARFILE) $(PLUG_TEMPDIR)/sound.clist - $(call import-binary-plug-classes,$(PLUG_TEMPDIR)/sound.clist) # Import all classes from the jar file import-binary-plug-jar: \ - import-binary-plug-jmf-classes \ - import-binary-plug-sound-classes - -# Import native libraries - -$(LIB_LOCATION)/$(PLUG_JSOUND_LIBRARY): \ - $(PLUG_IMPORT_DIR)/$(PLUG_LOCATION_SUBDIR)/$(PLUG_JSOUND_LIBRARY) - $(import-binary-plug-file) - -# Rules only used by lower level makefiles - -import-binary-plug-jsound-library: \ - $(LIB_LOCATION)/$(PLUG_JSOUND_LIBRARY) + import-binary-plug-jmf-classes # Binary plug start/complete messages @@ -241,9 +166,7 @@ import-binary-plugs: \ import-binary-plugs-libs \ import-binary-plugs \ import-binary-plug-jar \ - import-binary-plug-jmf-classes \ - import-binary-plug-sound-classes \ - import-binary-plug-jsound-library + import-binary-plug-jmf-classes else # !OPENJDK @@ -280,12 +203,6 @@ $(PLUG_EXPORT_JARFILE): $(PLUG_TEMPDIR)/all.clist $(PLUG_TEMPDIR)/all.jargs @$(java-vm-cleanup) export-binary-plugs-jar: $(PLUG_EXPORT_JARFILE) -# Export native libraries - -$(PLUG_EXPORT_DIR)/$(PLUG_LOCATION_SUBDIR)/$(PLUG_JSOUND_LIBRARY): \ - $(LIB_LOCATION)/$(PLUG_JSOUND_LIBRARY) - $(export-binary-plug-file) - # Export binary plug start/complete messages export-binary-plugs-started: diff --git a/jdk/make/common/internal/Resources.gmk b/jdk/make/common/internal/Resources.gmk index dbc11ef832f..a772194b471 100644 --- a/jdk/make/common/internal/Resources.gmk +++ b/jdk/make/common/internal/Resources.gmk @@ -44,12 +44,8 @@ # # NEW_RESOURCE_BUNDLES_JAVA - new resource bundles implemented in # Java, not localized -# NEW_RESOURCE_BUNDLES_PROPERTIES - new resource bundles implemented as -# properties files, not localized # RESOURCE_BUNDLES_JAVA - resource bundles implemented in # Java, localized -# RESOURCE_BUNDLES_PROPERTIES - new resource bundles implemented as -# properties files, localized # # The following variable is now used for most .properties files in the JDK. # These properties files are converted into java and compiled with javac. @@ -61,6 +57,13 @@ # properties files, localized # NEW_RESOURCE_BUNDLES_COMPILED_PROPERTIES - same as above, not localized # +# For non-compiled properties files, use the following variables: +# +# NEW_RESOURCE_BUNDLES_UNCOMPILED_PROPERTIES - new resource bundles implemented as +# properties files, not localized +# RESOURCE_BUNDLES_UNCOMPILED_PROPERTIES - resource bundles implemented as +# properties files, localized +# # Other properties files to be installed are identified using the variable: # # OTHER_PROPERTIES @@ -109,11 +112,12 @@ COMPILED_PROPERTIES += $(RESOURCE_BUNDLES_COMPILED_PROPERTIES) \ FILES_java += $(COMPILED_PROPERTIES:%.properties=%.java) # Non-compiled files -PROPERTIES_FILES += $(NEW_RESOURCE_BUNDLES_PROPERTIES) -PROPERTIES_FILES += $(RESOURCE_BUNDLES_PROPERTIES) \ - $(foreach file,$(RESOURCE_BUNDLES_PROPERTIES), \ +PROPERTIES_FILES += $(NEW_RESOURCE_BUNDLES_UNCOMPILED_PROPERTIES) +PROPERTIES_FILES += $(RESOURCE_BUNDLES_UNCOMPILED_PROPERTIES) \ + $(foreach file,$(RESOURCE_BUNDLES_UNCOMPILED_PROPERTIES), \ $(foreach locale,$(LOCALE_SUFFIXES), \ $(basename $(file))_$(locale)$(suffix $(file)))) +# other properties PROPERTIES_FILES += $(OTHER_PROPERTIES) # diff --git a/jdk/make/javax/sound/Makefile b/jdk/make/javax/sound/Makefile index 9b5346003d1..c3e0524fd46 100644 --- a/jdk/make/javax/sound/Makefile +++ b/jdk/make/javax/sound/Makefile @@ -53,18 +53,6 @@ include FILES_c.gmk # add java files AUTO_FILES_JAVA_DIRS = javax/sound com/sun/media/sound -# -# Specific to OpenJDK building -# -ifdef OPENJDK - -# copy closed .class files -build: import-binary-plug-sound-classes - -include $(BUILDDIR)/common/internal/BinaryPlugs.gmk - -endif # OPENJDK - # # Files that just need cp. # @@ -79,13 +67,11 @@ FILES_copy = \ $(SERVICEDIR)/javax.sound.sampled.spi.AudioFileReader \ $(SERVICEDIR)/javax.sound.sampled.spi.FormatConversionProvider \ $(SERVICEDIR)/javax.sound.sampled.spi.MixerProvider \ - $(LIBDIR)/audio/soundbank.gm \ $(LIBDIR)/sound.properties FILES_mkdirs = \ $(CLASSBINDIR)/META-INF \ - $(CLASSBINDIR)/META-INF/services \ - $(LIBDIR)/audio + $(CLASSBINDIR)/META-INF/services FILES_copydirs = \ $(CLASSBINDIR) \ @@ -95,11 +81,6 @@ FILES_copydirs = \ FILES_c += $(FILES_$(PLATFORM)) -# -# add "closed" library -# -SUBDIRS += jsoundhs - # # system dependent flags # diff --git a/jdk/make/javax/sound/jsoundhs/FILES.gmk b/jdk/make/javax/sound/jsoundhs/FILES.gmk deleted file mode 100644 index 6bc7a57da83..00000000000 --- a/jdk/make/javax/sound/jsoundhs/FILES.gmk +++ /dev/null @@ -1,91 +0,0 @@ -# -# Copyright 2007 Sun Microsystems, Inc. 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 -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. Sun designates this -# particular file as subject to the "Classpath" exception as provided -# by Sun in the LICENSE file that accompanied this code. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, -# CA 95054 USA or visit www.sun.com if you need additional information or -# have any questions. -# - -FILES_c = \ - Utilities.c \ - MixerThread.c \ - HeadspaceMixer.c \ - MixerClip.c \ - MixerSourceLine.c \ - SimpleInputDevice.c \ - SimpleInputDeviceProvider.c \ - HeadspaceSoundbank.c \ - MixerMidiChannel.c \ - AbstractPlayer.c \ - MixerSequencer.c \ - MixerSynth.c - -FILES_engine = \ - DriverTools.c \ - GenAudioCaptureStreams.c \ - GenAudioStreams.c \ - GenOutput.c \ - GenPatch.c \ - GenReverb.c \ - GenSample.c \ - GenSeq.c \ - GenSetup.c \ - GenSong.c \ - GenSynth.c \ - GenSynthFilters.c \ - GenSynthInterp2.c \ - GenSynthResample.c \ - NewNewLZSS.c \ - SampleTools.c \ - SMOD_Volume_Scaler.c \ - X_API.c \ - X_Decompress.c \ - X_IMA.c \ - GenFiltersReverb.c \ - GenInterp2Reverb.c \ - GenSoundFiles.c \ - SincResample.c - -FILES_solaris = \ - HAE_API_SolarisOS.c \ - HAE_API_SolarisOS_Capture.c - -FILES_linux = \ - HAE_API_LinuxOS.c \ - HAE_API_LinuxOS_Capture.c - -FILES_windows = \ - HAE_API_WinOS.c \ - HAE_API_WinOS_Capture.c \ - HAE_API_WinOS_Synth.c - -FILES_export = \ - com/sun/media/sound/AbstractPlayer.java \ - com/sun/media/sound/HeadspaceMixer.java \ - com/sun/media/sound/HeadspaceSoundbank.java \ - com/sun/media/sound/MixerClip.java \ - com/sun/media/sound/MixerMidiChannel.java \ - com/sun/media/sound/MixerSequencer.java \ - com/sun/media/sound/MixerSourceLine.java \ - com/sun/media/sound/MixerSynth.java \ - com/sun/media/sound/MixerThread.java \ - com/sun/media/sound/SimpleInputDevice.java \ - com/sun/media/sound/SimpleInputDeviceProvider.java - diff --git a/jdk/make/javax/sound/jsoundhs/Makefile b/jdk/make/javax/sound/jsoundhs/Makefile deleted file mode 100644 index 6a4952c6522..00000000000 --- a/jdk/make/javax/sound/jsoundhs/Makefile +++ /dev/null @@ -1,100 +0,0 @@ -# -# Copyright 2007 Sun Microsystems, Inc. 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 -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. Sun designates this -# particular file as subject to the "Classpath" exception as provided -# by Sun in the LICENSE file that accompanied this code. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, -# CA 95054 USA or visit www.sun.com if you need additional information or -# have any questions. -# - -BUILDDIR = ../../.. -PACKAGE = javax.sound -LIBRARY = jsoundhs -PRODUCT = sun -CPLUSPLUSLIBRARY = true -include $(BUILDDIR)/common/Defs.gmk - -# this Makefile compiles "closed" JavaSound library - -ifdef OPENJDK - -# precompiled lib will be copied by the rules in Library.gmk instead of compiling. -USE_BINARY_PLUG_LIBRARY=true - -build: import-binary-plug-jsound-library - -include $(BUILDDIR)/common/internal/BinaryPlugs.gmk - -else # OPENJDK - -# include defines for sound -include ../SoundDefs.gmk - -# -# Add use of mapfile -# -FILES_m = mapfile-vers -include $(BUILDDIR)/common/Mapfile-vers.gmk - -# -# Files -# -include FILES.gmk - -FILES_c += $(FILES_engine) $(FILES_$(PLATFORM)) - -# -# Extra cc/linker flags. -# -# flags needed for all platforms -CPPFLAGS += \ - -DJAVA_SOUND -DJAVA_THREAD \ - -I$(CLOSED_SHARE_SRC)/native/com/sun/media/sound \ - -I$(CLOSED_SHARE_SRC)/native/com/sun/media/sound/engine - -# system dependent flags -ifeq ($(PLATFORM), windows) - CPPFLAGS += -DUSE_DIRECTSOUND=0 \ - -DUSE_EXTERNAL_SYNTH=TRUE - LDLIBS += winmm.lib -endif # PLATFORM windows - -ifeq ($(PLATFORM), linux) -endif # PLATFORM linux - -ifeq ($(PLATFORM), solaris) -endif # PLATFORM solaris - - -# -# Add to the ambient VPATH. -# -vpath %.c $(CLOSED_SHARE_SRC)/native/com/sun/media/sound -vpath %.c $(CLOSED_SHARE_SRC)/native/com/sun/media/sound/engine -vpath %.c $(CLOSED_PLATFORM_SRC)/native/com/sun/media/sound/engine - - -endif # OPENJDK - - -# -# Include rules -# -include $(BUILDDIR)/common/Library.gmk - diff --git a/jdk/make/javax/sound/jsoundhs/mapfile-vers b/jdk/make/javax/sound/jsoundhs/mapfile-vers deleted file mode 100644 index 7961825600c..00000000000 --- a/jdk/make/javax/sound/jsoundhs/mapfile-vers +++ /dev/null @@ -1,153 +0,0 @@ -# -# Copyright 2007 Sun Microsystems, Inc. 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 -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. Sun designates this -# particular file as subject to the "Classpath" exception as provided -# by Sun in the LICENSE file that accompanied this code. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, -# CA 95054 USA or visit www.sun.com if you need additional information or -# have any questions. -# - -# Define library interface. - -SUNWprivate_1.1 { - global: - Java_com_sun_media_sound_AbstractPlayer_nAddReceiver; - Java_com_sun_media_sound_AbstractPlayer_nClose; - Java_com_sun_media_sound_AbstractPlayer_nLoadInstrument; - Java_com_sun_media_sound_AbstractPlayer_nRemapInstrument; - Java_com_sun_media_sound_AbstractPlayer_nRemoveReceiver; - Java_com_sun_media_sound_AbstractPlayer_nUnloadInstrument; - Java_com_sun_media_sound_HeadspaceMixer_nAllocateVoices; - Java_com_sun_media_sound_HeadspaceMixer_nCloseMixer; - Java_com_sun_media_sound_HeadspaceMixer_nCreateLinkedStreams; - Java_com_sun_media_sound_HeadspaceMixer_nDrain; - Java_com_sun_media_sound_HeadspaceMixer_nFlush; - Java_com_sun_media_sound_HeadspaceMixer_nGetCpuLoad; - Java_com_sun_media_sound_HeadspaceMixer_nGetDefaultBufferSize; - Java_com_sun_media_sound_HeadspaceMixer_nGetLevel; - Java_com_sun_media_sound_HeadspaceMixer_nGetPosition; - Java_com_sun_media_sound_HeadspaceMixer_nGetTotalVoices; - Java_com_sun_media_sound_HeadspaceMixer_nOpenMixer; - Java_com_sun_media_sound_HeadspaceMixer_nPause; - Java_com_sun_media_sound_HeadspaceMixer_nResume; - Java_com_sun_media_sound_HeadspaceMixer_nSetInterpolation; - Java_com_sun_media_sound_HeadspaceMixer_nSetMixerFormat; - Java_com_sun_media_sound_HeadspaceMixer_nSetMixLevel; - Java_com_sun_media_sound_HeadspaceMixer_nSetReverb; - Java_com_sun_media_sound_HeadspaceMixer_nStartLinkedStreams; - Java_com_sun_media_sound_HeadspaceMixer_nStopLinkedStreams; - Java_com_sun_media_sound_HeadspaceSoundbank_nCloseResource; - Java_com_sun_media_sound_HeadspaceSoundbank_nGetInstruments; - Java_com_sun_media_sound_HeadspaceSoundbank_nGetName; - Java_com_sun_media_sound_HeadspaceSoundbank_nGetSamples; - Java_com_sun_media_sound_HeadspaceSoundbank_nGetVersionMajor; - Java_com_sun_media_sound_HeadspaceSoundbank_nGetVersionMinor; - Java_com_sun_media_sound_HeadspaceSoundbank_nGetVersionSubMinor; - Java_com_sun_media_sound_HeadspaceSoundbank_nOpenResource; - Java_com_sun_media_sound_HeadspaceSoundbank_nOpenResourceFromByteArray; - Java_com_sun_media_sound_MixerClip_nClose; - Java_com_sun_media_sound_MixerClip_nDrain; - Java_com_sun_media_sound_MixerClip_nFlush; - Java_com_sun_media_sound_MixerClip_nGetPosition; - Java_com_sun_media_sound_MixerClip_nOpen; - Java_com_sun_media_sound_MixerClip_nSetLinearGain; - Java_com_sun_media_sound_MixerClip_nSetPan; - Java_com_sun_media_sound_MixerClip_nSetSampleRate; - Java_com_sun_media_sound_MixerClip_nSetup; - Java_com_sun_media_sound_MixerClip_nStart; - Java_com_sun_media_sound_MixerClip_nStop; - Java_com_sun_media_sound_MixerMidiChannel_nAllNotesOff; - Java_com_sun_media_sound_MixerMidiChannel_nControlChange; - Java_com_sun_media_sound_MixerMidiChannel_nGetController; - Java_com_sun_media_sound_MixerMidiChannel_nGetPitchBend; - Java_com_sun_media_sound_MixerMidiChannel_nGetSolo; - Java_com_sun_media_sound_MixerMidiChannel_nNoteOff; - Java_com_sun_media_sound_MixerMidiChannel_nNoteOn; - Java_com_sun_media_sound_MixerMidiChannel_nProgramChange__JIIIJ; - Java_com_sun_media_sound_MixerMidiChannel_nProgramChange__JIIJ; - Java_com_sun_media_sound_MixerMidiChannel_nResetAllControllers; - Java_com_sun_media_sound_MixerMidiChannel_nSetMute; - Java_com_sun_media_sound_MixerMidiChannel_nSetPitchBend; - Java_com_sun_media_sound_MixerMidiChannel_nSetSolo; - Java_com_sun_media_sound_MixerSequencer_nAddControllerEventCallback; - Java_com_sun_media_sound_MixerSequencer_nGetMasterTempo; - Java_com_sun_media_sound_MixerSequencer_nGetSequenceMicrosecondLength; - Java_com_sun_media_sound_MixerSequencer_nGetSequencerMicrosecondPosition; - Java_com_sun_media_sound_MixerSequencer_nGetSequencerTickPosition; - Java_com_sun_media_sound_MixerSequencer_nGetSequenceTickLength; - Java_com_sun_media_sound_MixerSequencer_nGetTempoInBPM; - Java_com_sun_media_sound_MixerSequencer_nGetTempoInMPQ; - Java_com_sun_media_sound_MixerSequencer_nGetTrackMute; - Java_com_sun_media_sound_MixerSequencer_nGetTrackSolo; - Java_com_sun_media_sound_MixerSequencer_nOpenMidiSequencer; - Java_com_sun_media_sound_MixerSequencer_nOpenRmfSequencer; - Java_com_sun_media_sound_MixerSequencer_nPauseSequencer; - Java_com_sun_media_sound_MixerSequencer_nResumeSequencer; - Java_com_sun_media_sound_MixerSequencer_nSetMasterTempo; - Java_com_sun_media_sound_MixerSequencer_nSetSequencerMicrosecondPosition; - Java_com_sun_media_sound_MixerSequencer_nSetSequencerTickPosition; - Java_com_sun_media_sound_MixerSequencer_nSetTempoInBPM; - Java_com_sun_media_sound_MixerSequencer_nSetTempoInMPQ; - Java_com_sun_media_sound_MixerSequencer_nSetTrackMute; - Java_com_sun_media_sound_MixerSequencer_nSetTrackSolo; - Java_com_sun_media_sound_MixerSequencer_nStartSequencer; - Java_com_sun_media_sound_MixerSourceLine_nClose; - Java_com_sun_media_sound_MixerSourceLine_nDrain; - Java_com_sun_media_sound_MixerSourceLine_nFlush; - Java_com_sun_media_sound_MixerSourceLine_nGetLevel; - Java_com_sun_media_sound_MixerSourceLine_nGetPosition; - Java_com_sun_media_sound_MixerSourceLine_nOpen; - Java_com_sun_media_sound_MixerSourceLine_nPause; - Java_com_sun_media_sound_MixerSourceLine_nResume; - Java_com_sun_media_sound_MixerSourceLine_nSetLinearGain; - Java_com_sun_media_sound_MixerSourceLine_nSetPan; - Java_com_sun_media_sound_MixerSourceLine_nSetSampleRate; - Java_com_sun_media_sound_MixerSourceLine_nStart; - Java_com_sun_media_sound_MixerSynth_nCreateSynthesizer; - Java_com_sun_media_sound_MixerSynth_nDestroySynthesizer; - Java_com_sun_media_sound_MixerSynth_nGetLatency; - Java_com_sun_media_sound_MixerSynth_nLoadInstrument; - Java_com_sun_media_sound_MixerSynth_nRemapInstrument; - Java_com_sun_media_sound_MixerSynth_nStartSynthesizer; - Java_com_sun_media_sound_MixerSynth_nUnloadInstrument; - Java_com_sun_media_sound_MixerThread_runNative; - Java_com_sun_media_sound_SimpleInputDevice_nClose; - Java_com_sun_media_sound_SimpleInputDevice_nDrain; - Java_com_sun_media_sound_SimpleInputDevice_nFlush; - Java_com_sun_media_sound_SimpleInputDevice_nGetBufferSizeInFrames; - Java_com_sun_media_sound_SimpleInputDevice_nGetFormats; - Java_com_sun_media_sound_SimpleInputDevice_nGetNumPorts; - Java_com_sun_media_sound_SimpleInputDevice_nGetPortName; - Java_com_sun_media_sound_SimpleInputDevice_nGetPosition; - Java_com_sun_media_sound_SimpleInputDevice_nOpen; - Java_com_sun_media_sound_SimpleInputDevice_nPause; - Java_com_sun_media_sound_SimpleInputDevice_nResume; - Java_com_sun_media_sound_SimpleInputDevice_nStart; - Java_com_sun_media_sound_SimpleInputDevice_nStop; - Java_com_sun_media_sound_SimpleInputDevice_nSupportsChannels; - Java_com_sun_media_sound_SimpleInputDevice_nSupportsSampleRate; - Java_com_sun_media_sound_SimpleInputDevice_nSupportsSampleSizeInBits; - Java_com_sun_media_sound_SimpleInputDeviceProvider_nGetDescription; - Java_com_sun_media_sound_SimpleInputDeviceProvider_nGetName; - Java_com_sun_media_sound_SimpleInputDeviceProvider_nGetNumDevices; - Java_com_sun_media_sound_SimpleInputDeviceProvider_nGetVendor; - Java_com_sun_media_sound_SimpleInputDeviceProvider_nGetVersion; - local: - *; -}; diff --git a/jdk/make/sun/awt/FILES_c_windows.gmk b/jdk/make/sun/awt/FILES_c_windows.gmk index 1bd3d485366..1a9b3b6ad3c 100644 --- a/jdk/make/sun/awt/FILES_c_windows.gmk +++ b/jdk/make/sun/awt/FILES_c_windows.gmk @@ -153,7 +153,6 @@ FILES_cpp = \ awt_Menu.cpp \ awt_MenuBar.cpp \ awt_MenuItem.cpp \ - awt_MMStub.cpp \ awt_MouseEvent.cpp \ awt_Object.cpp \ awt_Palette.cpp \ @@ -171,7 +170,6 @@ FILES_cpp = \ awt_TextComponent.cpp \ awt_TextField.cpp \ awt_Toolkit.cpp \ - awt_Unicode.cpp \ awt_Window.cpp \ awt_Win32GraphicsEnv.cpp \ awt_Win32GraphicsDevice.cpp \ @@ -202,6 +200,4 @@ FILES_cpp = \ ThemeReader.cpp \ ComCtl32Util.cpp \ initIDs.cpp \ - awt_dlls.cpp \ - UnicowsLoader.cpp \ MouseInfo.cpp diff --git a/jdk/make/sun/awt/Makefile b/jdk/make/sun/awt/Makefile index ed35dcd2bdf..82a0a681de0 100644 --- a/jdk/make/sun/awt/Makefile +++ b/jdk/make/sun/awt/Makefile @@ -47,7 +47,7 @@ OTHER_CFLAGS += -D__MEDIALIB_OLD_NAMES -D__USE_J2D_NAMES # sun/awt/resources handled by java/awt/Makefile # sun/java2d/pisces handled by sun/pisces/Makefile # -AUTO_FILES_JAVA_DIRS = sun/awt sun/java2d +AUTO_FILES_JAVA_DIRS = sun/awt sun/java2d com/sun/awt AUTO_JAVA_PRUNE = resources pisces ifeq ($(PLATFORM), windows) @@ -247,8 +247,14 @@ endif # PLATFORM ifeq ($(PLATFORM), windows) # vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv WINDOWS OTHER_LDLIBS = kernel32.lib user32.lib gdi32.lib winspool.lib \ - imm32.lib ole32.lib uuid.lib $(JVMLIB) \ - shell32.lib + imm32.lib ole32.lib uuid.lib shell32.lib \ + comdlg32.lib winmm.lib comctl32.lib delayimp.lib \ + $(JVMLIB) \ + /DELAYLOAD:user32.dll /DELAYLOAD:gdi32.dll \ + /DELAYLOAD:shell32.dll /DELAYLOAD:winmm.dll \ + /DELAYLOAD:winspool.drv /DELAYLOAD:imm32.dll \ + /DELAYLOAD:ole32.dll /DELAYLOAD:comdlg32.dll \ + /DELAYLOAD:comctl32.dll clean:: awt.clean diff --git a/jdk/make/sun/awt/make.depend b/jdk/make/sun/awt/make.depend index a014b416426..650e4c7fde8 100644 --- a/jdk/make/sun/awt/make.depend +++ b/jdk/make/sun/awt/make.depend @@ -14,141 +14,135 @@ $(OBJDIR)/AnyInt.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/sha $(OBJDIR)/AnyShort.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/awt_AWTEvent.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_AWTEvent.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_BitmapUtil.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_BitmapUtil.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_BitmapUtil.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_BitmapUtil.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Brush.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_Brush.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Button.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Button.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WButtonPeer.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Button.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_Button.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Button.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WButtonPeer.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Button.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Canvas.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsConfig.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_Canvas.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsConfig.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Checkbox.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Checkbox.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WCheckboxPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Checkbox.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_Checkbox.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Checkbox.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WCheckboxPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Checkbox.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Choice.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Choice.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WChoicePeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Choice.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_Choice.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Choice.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WChoicePeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Choice.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Clipboard.obj:: $(CLASSHDRDIR)/sun_awt_windows_WClipboard.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Clipboard.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_Clipboard.obj:: $(CLASSHDRDIR)/sun_awt_windows_WClipboard.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Clipboard.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Color.obj:: $(CLASSHDRDIR)/sun_awt_windows_WColor.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Color.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_Color.obj:: $(CLASSHDRDIR)/sun_awt_windows_WColor.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Color.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Component.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Color.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_InputMethodEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_MouseWheelEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Insets.h $(CLASSHDRDIR)/java_awt_KeyboardFocusManager.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WInputMethod.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPanelPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_InputEvent.h ../../../src/windows/native/sun/windows/awt_InputTextInfor.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_KeyEvent.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_MouseEvent.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_Component.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Color.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_InputMethodEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_MouseWheelEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Insets.h $(CLASSHDRDIR)/java_awt_KeyboardFocusManager.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WInputMethod.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPanelPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_InputEvent.h ../../../src/windows/native/sun/windows/awt_InputTextInfor.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_KeyEvent.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_MouseEvent.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Container.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_Container.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Cursor.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Cursor.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WCustomCursor.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WGlobalCursorManager.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_Cursor.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Cursor.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WCustomCursor.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WGlobalCursorManager.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_DataTransferer.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_datatransfer_DataTransferer.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDataTransferer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/common/locale_str.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_dlls.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_DataTransferer.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_datatransfer_DataTransferer.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDataTransferer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/common/locale_str.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Debug.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_Debug.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/awt_Desktop.obj:: ../../../src/share/javavm/export/jni.h ../../../src/windows/javavm/export/jni_md.h -$(OBJDIR)/awt_DesktopProperties.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDesktopProperties.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DesktopProperties.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_dlls.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_DesktopProperties.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDesktopProperties.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DesktopProperties.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Dialog.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_Dialog.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Dimension.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_Dimension.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_dlls.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_dlls.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_DnDDS.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_dnd_DnDConstants.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_dnd_SunDragSourceContextPeer.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDragSourceContextPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DnDDS.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_DnDDS.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_dnd_DnDConstants.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_dnd_SunDragSourceContextPeer.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDragSourceContextPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DnDDS.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_DnDDT.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_dnd_DnDConstants.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDropTargetContextPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_DnDDS.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_DnDDT.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_dnd_DnDConstants.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDropTargetContextPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_DataTransferer.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_dlls.h ../../../src/windows/native/sun/windows/awt_DnDDS.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_DrawingSurface.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jawt_md.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DrawingSurface.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_DrawingSurface.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jawt_md.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DrawingSurface.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_Event.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Event.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Event.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Event.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_FileDialog.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_FileDialog.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_dlls.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_Font.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDefaultFontCharset.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFontPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/Disposer.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Font.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDefaultFontCharset.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFontPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/Disposer.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_Frame.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/java_lang_Integer.h $(CLASSHDRDIR)/sun_awt_EmbeddedFrame.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WEmbeddedFrame.h $(CLASSHDRDIR)/sun_awt_windows_WEmbeddedFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Frame.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/java_lang_Integer.h $(CLASSHDRDIR)/sun_awt_EmbeddedFrame.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WEmbeddedFrame.h $(CLASSHDRDIR)/sun_awt_windows_WEmbeddedFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_GDIObject.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_GDIObject.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h - -$(OBJDIR)/awt_IconCursor.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_IconCursor.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/awt_ImageRep.obj:: $(CLASSHDRDIR)/sun_awt_image_ImageRepresentation.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/image/awt_parseImage.h ../../../src/share/native/sun/awt/image/imageInitIDs.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h $(OBJDIR)/awt_ImagingLib.obj:: $(CLASSHDRDIR)/java_awt_color_ColorSpace.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_image_BufferedImage.h $(CLASSHDRDIR)/java_awt_image_ConvolveOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_image_ImagingLib.h $(CLASSHDRDIR)/sun_awt_image_IntegerComponentRaster.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/image/awt_parseImage.h ../../../src/share/native/sun/awt/image/imageInitIDs.h ../../../src/share/native/sun/awt/medialib/awt_ImagingLib.h ../../../src/share/native/sun/awt/medialib/mlib_image_get.h ../../../src/share/native/sun/awt/medialib/mlib_image_types.h ../../../src/share/native/sun/awt/medialib/mlib_status.h ../../../src/share/native/sun/awt/medialib/mlib_types.h ../../../src/share/native/sun/awt/medialib/safe_alloc.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/awt_Mlib.h -$(OBJDIR)/awt_InputEvent.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_InputEvent.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_InputEvent.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_InputEvent.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_InputMethod.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputMethodEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WInputMethod.h $(CLASSHDRDIR)/sun_awt_windows_WInputMethodDescriptor.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/common/locale_str.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_InputMethod.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputMethodEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WInputMethod.h $(CLASSHDRDIR)/sun_awt_windows_WInputMethodDescriptor.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/common/locale_str.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_InputTextInfor.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_InputTextInfor.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_InputTextInfor.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_InputTextInfor.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Insets.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_Insets.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_KeyboardFocusManager.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_KeyboardFocusManager.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_KeyboardFocusManager.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_KeyboardFocusManager.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_KeyEvent.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_KeyEvent.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_KeyEvent.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_KeyEvent.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Label.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Label.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WLabelPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Label.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_Label.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Label.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WLabelPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Label.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_List.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_List.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WListPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_List.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_List.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_List.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WListPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dimension.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_List.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Menu.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_Menu.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_MenuBar.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_MenuBar.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_MenuItem.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_CheckboxMenuItem.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCheckboxMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DesktopProperties.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_MenuItem.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_CheckboxMenuItem.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCheckboxMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DesktopProperties.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/awt_Mlib.obj:: $(CLASSHDRDIR)/java_awt_image_BufferedImage.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/medialib/awt_ImagingLib.h ../../../src/share/native/sun/awt/medialib/mlib_image_get.h ../../../src/share/native/sun/awt/medialib/mlib_image_types.h ../../../src/share/native/sun/awt/medialib/mlib_status.h ../../../src/share/native/sun/awt/medialib/mlib_types.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Mlib.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_MMStub.obj:: ../../../src/windows/native/sun/windows/awt_MMStub.h +$(OBJDIR)/awt_MouseEvent.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_MouseEvent.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_MouseEvent.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_MouseEvent.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_new.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_new.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_new.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_new.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_Object.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Object.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_Palette.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_CustomPaletteDef.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/img_util_md.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Palette.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_CustomPaletteDef.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/img_util_md.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h - -$(OBJDIR)/awt_Panel.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Panel.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_Panel.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Panel.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/awt_parseImage.obj:: $(CLASSHDRDIR)/java_awt_color_ColorSpace.h $(CLASSHDRDIR)/java_awt_image_BufferedImage.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_image_ImagingLib.h $(CLASSHDRDIR)/sun_awt_image_IntegerComponentRaster.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/image/awt_parseImage.h ../../../src/share/native/sun/awt/image/imageInitIDs.h ../../../src/share/native/sun/awt/medialib/awt_ImagingLib.h ../../../src/share/native/sun/awt/medialib/mlib_image_get.h ../../../src/share/native/sun/awt/medialib/mlib_image_types.h ../../../src/share/native/sun/awt/medialib/mlib_status.h ../../../src/share/native/sun/awt/medialib/mlib_types.h ../../../src/share/native/sun/awt/medialib/safe_alloc.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/awt_Mlib.h -$(OBJDIR)/awt_Pen.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_Pen.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_PopupMenu.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_PopupMenu.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPopupMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Event.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PopupMenu.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_PopupMenu.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_PopupMenu.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPopupMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Event.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PopupMenu.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_PrintControl.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_PrintControl.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_PrintDialog.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPrintDialog.h $(CLASSHDRDIR)/sun_awt_windows_WPrintDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_dlls.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_PrintDialog.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPrintDialog.h $(CLASSHDRDIR)/sun_awt_windows_WPrintDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_PrintJob.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPrinterJob.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_dlls.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_PrintJob.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPrinterJob.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Rectangle.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Rectangle.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_Rectangle.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Rectangle.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Robot.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WRobotPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Robot.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_Robot.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WRobotPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Robot.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Scrollbar.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Scrollbar.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WScrollbarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Scrollbar.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_Scrollbar.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Scrollbar.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WScrollbarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Scrollbar.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_ScrollPane.obj:: $(CLASSHDRDIR)/java_awt_Adjustable.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_AdjustmentEvent.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Insets.h $(CLASSHDRDIR)/java_awt_Scrollbar.h $(CLASSHDRDIR)/java_awt_ScrollPane.h $(CLASSHDRDIR)/java_awt_ScrollPaneAdjustable.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WScrollbarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WScrollPanePeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Panel.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Scrollbar.h ../../../src/windows/native/sun/windows/awt_ScrollPane.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_ScrollPane.obj:: $(CLASSHDRDIR)/java_awt_Adjustable.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_AdjustmentEvent.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_Insets.h $(CLASSHDRDIR)/java_awt_Scrollbar.h $(CLASSHDRDIR)/java_awt_ScrollPane.h $(CLASSHDRDIR)/java_awt_ScrollPaneAdjustable.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WScrollbarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WScrollPanePeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Panel.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Scrollbar.h ../../../src/windows/native/sun/windows/awt_ScrollPane.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_TextArea.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_TextArea.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextAreaPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_dlls.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_TextArea.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_TextArea.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_TextArea.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextAreaPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_TextArea.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_TextComponent.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_TextComponent.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_TextField.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/java_awt_TextField.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextFieldPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_dlls.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_TextField.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_TextField.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_TextComponent.h $(CLASSHDRDIR)/java_awt_TextField.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WTextFieldPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_KeyboardFocusManager.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_TextComponent.h ../../../src/windows/native/sun/windows/awt_TextField.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Toolkit.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputMethodEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_List.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_ComponentPeer.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_PopupMenu.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WListPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPopupMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jawt_md.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Clipboard.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DesktopProperties.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_DnDDS.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_DrawingSurface.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_InputEvent.h ../../../src/windows/native/sun/windows/awt_KeyEvent.h ../../../src/windows/native/sun/windows/awt_List.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_new.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PopupMenu.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/CmdIDList.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_Toolkit.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputMethodEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_List.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_ComponentPeer.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_PopupMenu.h $(CLASSHDRDIR)/java_awt_Toolkit.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WListPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WPopupMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jawt_md.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Clipboard.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Cursor.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DesktopProperties.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_DnDDS.h ../../../src/windows/native/sun/windows/awt_DnDDT.h ../../../src/windows/native/sun/windows/awt_DrawingSurface.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_InputEvent.h ../../../src/windows/native/sun/windows/awt_KeyEvent.h ../../../src/windows/native/sun/windows/awt_List.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_new.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PopupMenu.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/CmdIDList.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_TrayIcon.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_ActionEvent.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_TrayIcon.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WTrayIconPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_TrayIcon.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_TrayIcon.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_ActionEvent.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_InputEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_TrayIcon.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WTrayIconPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_AWTEvent.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_TrayIcon.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Unicode.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_Win32GraphicsConfig.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_image_DataBuffer.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_Win32GraphicsConfig.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsConfig.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Win32GraphicsConfig.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_image_DataBuffer.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_Win32GraphicsConfig.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsConfig.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_Win32GraphicsDevice.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_color_ColorSpace.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_image_DataBuffer.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_Win32GraphicsDevice.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/awt/image/dither.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/img_util_md.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Win32GraphicsDevice.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_color_ColorSpace.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_image_DataBuffer.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_Win32GraphicsDevice.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/awt/image/dither.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_dlls.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/img_util_md.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_Win32GraphicsEnv.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_Win32GraphicsEnvironment.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/awt_Win32GraphicsEnv.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_Win32GraphicsEnvironment.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h - -$(OBJDIR)/awt_Window.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Container.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_ComponentEvent.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Insets.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_BitmapUtil.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_dlls.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Panel.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/awt_Window.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Container.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_ComponentEvent.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Insets.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_BitmapUtil.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Container.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_IconCursor.h ../../../src/windows/native/sun/windows/awt_Insets.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Panel.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/Blit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_Blit.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h @@ -170,9 +164,9 @@ $(OBJDIR)/ByteGray.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/s $(OBJDIR)/ByteIndexed.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyByte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/Index12Gray.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/CmdIDList.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/CmdIDList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/CmdIDList.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/CmdIDList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/ComCtl32Util.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/ComCtl32Util.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/ComCtl32Util.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/D3DBlitLoops.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DBlitLoops.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntBgr.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/Ushort555Rgb.h ../../../src/share/native/sun/java2d/loops/Ushort565Rgb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBlitLoops.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h @@ -182,7 +176,7 @@ $(OBJDIR)/D3DContext.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDI $(OBJDIR)/D3DGlyphCache.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DGlyphCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/D3DGraphicsDevice.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DGraphicsDevice.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DGraphicsDevice.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/D3DGraphicsDevice.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DGraphicsDevice.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DGraphicsDevice.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/D3DMaskBlit.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskBlit.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h @@ -192,15 +186,15 @@ $(OBJDIR)/D3DMaskFill.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $( $(OBJDIR)/D3DPaints.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/D3DPipelineManager.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBadHardware.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/D3DPipelineManager.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBadHardware.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/D3DRenderer.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DRenderer.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/D3DRenderQueue.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DBlitLoops.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedOpCodes.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBlitLoops.h ../../../src/windows/native/sun/java2d/d3d/D3DBufImgOps.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskBlit.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskFill.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/D3DRenderQueue.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DBlitLoops.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedOpCodes.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedRenderPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DBlitLoops.h ../../../src/windows/native/sun/java2d/d3d/D3DBufImgOps.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskBlit.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskFill.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DResourceManager.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/D3DResourceManager.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h $(CLASSHDRDIR)/sun_java2d_SunGraphics2D.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPaints.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/D3DSurfaceData.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_BitmapUtil.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/D3DSurfaceData.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_BitmapUtil.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/D3DTextRenderer.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DTextRenderer.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedTextPipe.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/sun/font/AccelGlyphCache.h ../../../src/share/native/sun/font/fontscalerdefs.h ../../../src/share/native/sun/font/sunfontids.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DGlyphCache.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DRenderQueue.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DTextRenderer.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h @@ -216,7 +210,7 @@ $(OBJDIR)/debug_trace.obj:: ../../../src/share/javavm/export/jni.h ../../../src/ $(OBJDIR)/debug_util.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h -$(OBJDIR)/Devices.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/Devices.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/java_awt_Transparency.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DContext.h $(CLASSHDRDIR)/sun_java2d_d3d_D3DSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelDeviceEventNotifier.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/ShaderList.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/d3d/D3DContext.h ../../../src/windows/native/sun/java2d/d3d/D3DMaskCache.h ../../../src/windows/native/sun/java2d/d3d/D3DPipeline.h ../../../src/windows/native/sun/java2d/d3d/D3DPipelineManager.h ../../../src/windows/native/sun/java2d/d3d/D3DResourceManager.h ../../../src/windows/native/sun/java2d/d3d/D3DSurfaceData.h ../../../src/windows/native/sun/java2d/d3d/D3DVertexCacher.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/Disposer.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/Disposer.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h @@ -240,19 +234,19 @@ $(OBJDIR)/FourByteAbgr.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../s $(OBJDIR)/FourByteAbgrPre.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/Any4Byte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/FourByteAbgrPre.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/GDIBlitLoops.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_windows_GDIBlitLoops.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/GDIBlitLoops.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_windows_GDIBlitLoops.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/GDIHashtable.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_dlls.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/GDIHashtable.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/GDIRenderer.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_geom_PathIterator.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_windows_GDIRenderer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/GDIRenderer.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_geom_PathIterator.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_windows_GDIRenderer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/GDIWindowSurfaceData.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_windows_GDIWindowSurfaceData.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/Disposer.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/GDIWindowSurfaceData.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_java2d_windows_GDIWindowSurfaceData.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/Disposer.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/gifdecoder.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h $(OBJDIR)/GraphicsPrimitiveMgr.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_GraphicsPrimitiveMgr.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/Hashtable.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/Hashtable.obj:: $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/imageInitIDs.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/image/imageInitIDs.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h @@ -282,9 +276,9 @@ $(OBJDIR)/MaskBlit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR) $(OBJDIR)/MaskFill.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/sun_java2d_loops_MaskFill.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/MouseInfo.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/MouseInfo.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/ObjectList.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/ObjectList.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/OGLBlitLoops.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLBlitLoops.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLBlitLoops.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h @@ -320,13 +314,13 @@ $(OBJDIR)/ScaledBlit.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDI $(OBJDIR)/ShapeSpanIterator.obj:: $(CLASSHDRDIR)/java_awt_geom_PathIterator.h $(CLASSHDRDIR)/sun_java2d_pipe_ShapeSpanIterator.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/pipe/PathConsumer2D.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/ShellFolder2.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/ShellFolder2.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/SpanClipRenderer.obj:: $(CLASSHDRDIR)/sun_java2d_pipe_RegionIterator.h $(CLASSHDRDIR)/sun_java2d_pipe_SpanClipRenderer.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h $(OBJDIR)/SurfaceData.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/Disposer.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h -$(OBJDIR)/ThemeReader.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_ThemeReader.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/ThemeReader.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_ThemeReader.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h $(OBJDIR)/ThreeByteBgr.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/Any3Byte.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h @@ -334,8 +328,6 @@ $(OBJDIR)/Trace.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/ $(OBJDIR)/TransformHelper.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_loops_TransformHelper.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/Region.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h -$(OBJDIR)/UnicowsLoader.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h - $(OBJDIR)/Ushort4444Argb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/Ushort4444Argb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h $(OBJDIR)/Ushort555Rgb.obj:: $(CLASSHDRDIR)/java_awt_AlphaComposite.h ../../../src/share/javavm/export/jni.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/sun/java2d/loops/AlphaMacros.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/AnyShort.h ../../../src/share/native/sun/java2d/loops/ByteGray.h ../../../src/share/native/sun/java2d/loops/ByteIndexed.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/loops/IntArgb.h ../../../src/share/native/sun/java2d/loops/IntArgbBm.h ../../../src/share/native/sun/java2d/loops/IntArgbPre.h ../../../src/share/native/sun/java2d/loops/IntDcm.h ../../../src/share/native/sun/java2d/loops/IntRgb.h ../../../src/share/native/sun/java2d/loops/LineUtils.h ../../../src/share/native/sun/java2d/loops/LoopMacros.h ../../../src/share/native/sun/java2d/loops/ThreeByteBgr.h ../../../src/share/native/sun/java2d/loops/Ushort555Rgb.h ../../../src/share/native/sun/java2d/loops/UshortGray.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h @@ -352,6 +344,6 @@ $(OBJDIR)/WGLGraphicsConfig.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformO $(OBJDIR)/WGLSurfaceData.obj:: $(CLASSHDRDIR)/java_awt_image_AffineTransformOp.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLContext.h $(CLASSHDRDIR)/sun_java2d_opengl_OGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_opengl_WGLSurfaceData.h $(CLASSHDRDIR)/sun_java2d_pipe_BufferedContext.h $(CLASSHDRDIR)/sun_java2d_pipe_hw_AccelSurface.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/gl.h ../../../src/share/native/sun/java2d/opengl/J2D_GL/glext.h ../../../src/share/native/sun/java2d/opengl/OGLContext.h ../../../src/share/native/sun/java2d/opengl/OGLFuncMacros.h ../../../src/share/native/sun/java2d/opengl/OGLFuncs.h ../../../src/share/native/sun/java2d/opengl/OGLRenderQueue.h ../../../src/share/native/sun/java2d/opengl/OGLSurfaceData.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/opengl/J2D_GL/wglext.h ../../../src/windows/native/sun/java2d/opengl/OGLFuncs_md.h ../../../src/windows/native/sun/java2d/opengl/WGLGraphicsConfig.h ../../../src/windows/native/sun/java2d/opengl/WGLSurfaceData.h -$(OBJDIR)/WindowsFlags.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/WindowsFlags.obj:: ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/WindowsFlags.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/stdhdrs.h -$(OBJDIR)/WPrinterJob.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_dlls.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h +$(OBJDIR)/WPrinterJob.obj:: $(CLASSHDRDIR)/java_awt_AWTEvent.h $(CLASSHDRDIR)/java_awt_Component.h $(CLASSHDRDIR)/java_awt_Dialog.h $(CLASSHDRDIR)/java_awt_Dimension.h $(CLASSHDRDIR)/java_awt_Event.h $(CLASSHDRDIR)/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/java_awt_FileDialog.h $(CLASSHDRDIR)/java_awt_Font.h $(CLASSHDRDIR)/java_awt_FontMetrics.h $(CLASSHDRDIR)/java_awt_Frame.h $(CLASSHDRDIR)/java_awt_Menu.h $(CLASSHDRDIR)/java_awt_MenuBar.h $(CLASSHDRDIR)/java_awt_MenuComponent.h $(CLASSHDRDIR)/java_awt_MenuItem.h $(CLASSHDRDIR)/java_awt_peer_MenuComponentPeer.h $(CLASSHDRDIR)/java_awt_Window.h $(CLASSHDRDIR)/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/sun_awt_PlatformFont.h $(CLASSHDRDIR)/sun_awt_windows_WCanvasPeer.h $(CLASSHDRDIR)/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/sun_awt_windows_WDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFileDialogPeer.h $(CLASSHDRDIR)/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/sun_awt_windows_WFramePeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuBarPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuItemPeer.h $(CLASSHDRDIR)/sun_awt_windows_WMenuPeer.h $(CLASSHDRDIR)/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/sun_awt_windows_WToolkit.h $(CLASSHDRDIR)/sun_awt_windows_WWindowPeer.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Canvas.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_Dialog.h ../../../src/windows/native/sun/windows/awt_FileDialog.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_Frame.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Menu.h ../../../src/windows/native/sun/windows/awt_MenuBar.h ../../../src/windows/native/sun/windows/awt_MenuItem.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_PrintControl.h ../../../src/windows/native/sun/windows/awt_PrintDialog.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awt_Window.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h diff --git a/jdk/make/sun/javazic/tzdata/VERSION b/jdk/make/sun/javazic/tzdata/VERSION index 2f4f9df808f..2c19203a2c9 100644 --- a/jdk/make/sun/javazic/tzdata/VERSION +++ b/jdk/make/sun/javazic/tzdata/VERSION @@ -21,4 +21,4 @@ # CA 95054 USA or visit www.sun.com if you need additional information or # have any questions. # -tzdata2008e +tzdata2009a diff --git a/jdk/make/sun/javazic/tzdata/africa b/jdk/make/sun/javazic/tzdata/africa index 8141f080997..52289f12054 100644 --- a/jdk/make/sun/javazic/tzdata/africa +++ b/jdk/make/sun/javazic/tzdata/africa @@ -458,11 +458,36 @@ Zone Africa/Nouakchott -1:03:48 - LMT 1912 # http://www.worldtimezone.com/dst_news/dst_news_mauritius02.html # +# From Riad M. Hossen Ally (2008-08-03): +# The Government of Mauritius weblink +# +# http://www.gov.mu/portal/site/pmosite/menuitem.4ca0efdee47462e7440a600248a521ca/?content_id=3D4728ca68b2a5b110VgnVCM1000000a04a8c0RCRD +# +# Cabinet Decision of July 18th, 2008 states as follows: +# +# 4. ...Cabinet has agreed to the introduction into the National Assembly +# of the Time Bill which provides for the introduction of summer time in +# Mauritius. The summer time period which will be of one hour ahead of +# the standard time, will be aligned with that in Europe and the United +# States of America. It will start at two o'clock in the morning on the +# last Sunday of October and will end at two o'clock in the morning on +# the last Sunday of March the following year. The summer time for the +# year 2008 - 2009 will, therefore, be effective as from 26 October 2008 +# and end on 29 March 2009. + +# From Ed Maste (2008-10-07): +# THE TIME BILL (No. XXVII of 2008) Explanatory Memorandum states the +# beginning / ending of summer time is 2 o'clock standard time in the +# morning of the last Sunday of October / last Sunday of March. +# +# http://www.gov.mu/portal/goc/assemblysite/file/bill2708.pdf +# + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule Mauritius 1982 only - Oct 10 0:00 1:00 S Rule Mauritius 1983 only - Mar 21 0:00 0 - -Rule Mauritius 2008 only - Oct 26 2:00s 1:00 S -Rule Mauritius 2009 only - Mar 27 2:00s 0 - +Rule Mauritius 2008 max - Oct lastSun 2:00s 1:00 S +Rule Mauritius 2009 max - Mar lastSun 2:00s 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Indian/Mauritius 3:50:00 - LMT 1907 # Port Louis 4:00 Mauritius MU%sT # Mauritius Time @@ -547,7 +572,22 @@ Zone Indian/Mayotte 3:00:56 - LMT 1911 Jul # Mamoutzou # From Arthur David Olson (2008-05-09): # XXX--guess that it is only Morocco for now; guess only 2008 for now. +# From Steffen Thorsen (2008-08-27): +# Morocco will change the clocks back on the midnight between August 31 +# and September 1. They originally planned to observe DST to near the end +# of September: +# +# One article about it (in French): +# +# http://www.menara.ma/fr/Actualites/Maroc/Societe/ci.retour_a_l_heure_gmt_a_partir_du_dimanche_31_aout_a_minuit_officiel_.default +# +# +# We have some further details posted here: +# +# http://www.timeanddate.com/news/time/morocco-ends-dst-early-2008.html +# # RULE NAME FROM TO TYPE IN ON AT SAVE LETTER/S + Rule Morocco 1939 only - Sep 12 0:00 1:00 S Rule Morocco 1939 only - Nov 19 0:00 0 - Rule Morocco 1940 only - Feb 25 0:00 1:00 S @@ -564,7 +604,7 @@ Rule Morocco 1977 only - Sep 28 0:00 0 - Rule Morocco 1978 only - Jun 1 0:00 1:00 S Rule Morocco 1978 only - Aug 4 0:00 0 - Rule Morocco 2008 only - Jun 1 0:00 1:00 S -Rule Morocco 2008 only - Sep 28 0:00 0 - +Rule Morocco 2008 only - Sep 1 0:00 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Africa/Casablanca -0:30:20 - LMT 1913 Oct 26 0:00 Morocco WE%sT 1984 Mar 16 diff --git a/jdk/make/sun/javazic/tzdata/asia b/jdk/make/sun/javazic/tzdata/asia index be581970001..b245bbf0653 100644 --- a/jdk/make/sun/javazic/tzdata/asia +++ b/jdk/make/sun/javazic/tzdata/asia @@ -1496,7 +1496,7 @@ Zone Asia/Choibalsan 7:38:00 - LMT 1905 Aug # Nepal # Zone NAME GMTOFF RULES FORMAT [UNTIL] -Zone Asia/Katmandu 5:41:16 - LMT 1920 +Zone Asia/Kathmandu 5:41:16 - LMT 1920 5:30 - IST 1986 5:45 - NPT # Nepal Time @@ -1563,11 +1563,24 @@ Zone Asia/Muscat 3:54:20 - LMT 1920 # From Arthur David Olson (2008-05-19): # XXX--midnight transitions is a guess; 2008 only is a guess. +# From Alexander Krivenyshev (2008-08-28): +# Pakistan government has decided to keep the watches one-hour advanced +# for another 2 months--plan to return to Standard Time on October 31 +# instead of August 31. +# +# +# http://www.worldtimezone.com/dst_news/dst_news_pakistan02.html +# +# OR +# +# http://dailymailnews.com/200808/28/news/dmbrn03.html +# + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule Pakistan 2002 only - Apr Sun>=2 0:01 1:00 S Rule Pakistan 2002 only - Oct Sun>=2 0:01 0 - Rule Pakistan 2008 only - Jun 1 0:00 1:00 S -Rule Pakistan 2008 only - Sep 1 0:00 0 - +Rule Pakistan 2008 only - Nov 1 0:00 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Asia/Karachi 4:28:12 - LMT 1907 5:30 - IST 1942 Sep @@ -1687,6 +1700,23 @@ Zone Asia/Karachi 4:28:12 - LMT 1907 # For lack of better information, predict that future changes will be # the 2nd Thursday of September at 02:00. +# From Alexander Krivenyshev (2008-08-28): +# Here is an article, that Mideast running on different clocks at Ramadan. +# +# Gaza Strip (as Egypt) ended DST at midnight Thursday (Aug 28, 2008), while +# the West Bank will end Daylight Saving Time at midnight Sunday (Aug 31, 2008). +# +# +# http://www.guardian.co.uk/world/feedarticle/7759001 +# +# +# http://www.abcnews.go.com/International/wireStory?id=5676087 +# +# or +# +# http://www.worldtimezone.com/dst_news/dst_news_gazastrip01.html +# + # The rules for Egypt are stolen from the `africa' file. # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule EgyptAsia 1957 only - May 10 0:00 1:00 S @@ -1702,7 +1732,8 @@ Rule Palestine 2004 only - Oct 1 1:00 0 - Rule Palestine 2005 only - Oct 4 2:00 0 - Rule Palestine 2006 max - Apr 1 0:00 1:00 S Rule Palestine 2006 only - Sep 22 0:00 0 - -Rule Palestine 2007 max - Sep Thu>=8 2:00 0 - +Rule Palestine 2007 only - Sep Thu>=8 2:00 0 - +Rule Palestine 2008 max - Aug lastThu 2:00 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Asia/Gaza 2:17:52 - LMT 1900 Oct @@ -1948,8 +1979,20 @@ Rule Syria 2007 only - Nov Fri>=1 0:00 0 - # compilers can't handle or having multiple Rules (a la Israel). # For now, use "Apr Fri>=1", and go with IATA on a uniform Sep 30 end. +# From Steffen Thorsen (2008-10-07): +# Syria has now officially decided to end DST on 2008-11-01 this year, +# according to the following article in the Syrian Arab News Agency (SANA). +# +# The article is in Arabic, and seems to tell that they will go back to +# winter time on 2008-11-01 at 00:00 local daylight time (delaying/setting +# clocks back 60 minutes). +# +# +# http://sana.sy/ara/2/2008/10/07/195459.htm +# + Rule Syria 2008 max - Apr Fri>=1 0:00 1:00 S -Rule Syria 2008 max - Oct 1 0:00 0 - +Rule Syria 2008 max - Nov 1 0:00 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Asia/Damascus 2:25:12 - LMT 1920 # Dimashq diff --git a/jdk/make/sun/javazic/tzdata/backward b/jdk/make/sun/javazic/tzdata/backward index 85522740f41..57bb988bc99 100644 --- a/jdk/make/sun/javazic/tzdata/backward +++ b/jdk/make/sun/javazic/tzdata/backward @@ -46,6 +46,7 @@ Link America/St_Thomas America/Virgin Link Asia/Ashgabat Asia/Ashkhabad Link Asia/Chongqing Asia/Chungking Link Asia/Dhaka Asia/Dacca +Link Asia/Kathmandu Asia/Katmandu Link Asia/Kolkata Asia/Calcutta Link Asia/Macau Asia/Macao Link Asia/Jerusalem Asia/Tel_Aviv diff --git a/jdk/make/sun/javazic/tzdata/europe b/jdk/make/sun/javazic/tzdata/europe index 30724328383..a80f1bc9cff 100644 --- a/jdk/make/sun/javazic/tzdata/europe +++ b/jdk/make/sun/javazic/tzdata/europe @@ -2335,11 +2335,64 @@ Zone Europe/Stockholm 1:12:12 - LMT 1879 Jan 1 # mean time in preference to apparent time -- Geneva from 1780 .... # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S # From Whitman (who writes ``Midnight?''): -Rule Swiss 1940 only - Nov 2 0:00 1:00 S -Rule Swiss 1940 only - Dec 31 0:00 0 - +# Rule Swiss 1940 only - Nov 2 0:00 1:00 S +# Rule Swiss 1940 only - Dec 31 0:00 0 - # From Shanks & Pottenger: -Rule Swiss 1941 1942 - May Sun>=1 2:00 1:00 S -Rule Swiss 1941 1942 - Oct Sun>=1 0:00 0 - +# Rule Swiss 1941 1942 - May Sun>=1 2:00 1:00 S +# Rule Swiss 1941 1942 - Oct Sun>=1 0:00 0 - + +# From Alois Treindl (2008-12-17): +# I have researched the DST usage in Switzerland during the 1940ies. +# +# As I wrote in an earlier message, I suspected the current tzdata values +# to be wrong. This is now verified. +# +# I have found copies of the original ruling by the Swiss Federal +# government, in 'Eidgen[o]ssische Gesetzessammlung 1941 and 1942' (Swiss +# federal law collection)... +# +# DST began on Monday 5 May 1941, 1:00 am by shifting the clocks to 2:00 am +# DST ended on Monday 6 Oct 1941, 2:00 am by shifting the clocks to 1:00 am. +# +# DST began on Monday, 4 May 1942 at 01:00 am +# DST ended on Monday, 5 Oct 1942 at 02:00 am +# +# There was no DST in 1940, I have checked the law collection carefully. +# It is also indicated by the fact that the 1942 entry in the law +# collection points back to 1941 as a reference, but no reference to any +# other years are made. +# +# Newspaper articles I have read in the archives on 6 May 1941 reported +# about the introduction of DST (Sommerzeit in German) during the previous +# night as an absolute novelty, because this was the first time that such +# a thing had happened in Switzerland. +# +# I have also checked 1916, because one book source (Gabriel, Traite de +# l'heure dans le monde) claims that Switzerland had DST in 1916. This is +# false, no official document could be found. Probably Gabriel got misled +# by references to Germany, which introduced DST in 1916 for the first time. +# +# The tzdata rules for Switzerland must be changed to: +# Rule Swiss 1941 1942 - May Mon>=1 1:00 1:00 S +# Rule Swiss 1941 1942 - Oct Mon>=1 2:00 0 - +# +# The 1940 rules must be deleted. +# +# One further detail for Switzerland, which is probably out of scope for +# most users of tzdata: +# The zone file +# Zone Europe/Zurich 0:34:08 - LMT 1848 Sep 12 +# 0:29:44 - BMT 1894 Jun #Bern Mean Time +# 1:00 Swiss CE%sT 1981 +# 1:00 EU CE%sT +# describes all of Switzerland correctly, with the exception of +# the Cantone Geneve (Geneva, Genf). Between 1848 and 1894 Geneve did not +# follow Bern Mean Time but kept its own local mean time. +# To represent this, an extra zone would be needed. + +# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +Rule Swiss 1941 1942 - May Mon>=1 1:00 1:00 S +Rule Swiss 1941 1942 - Oct Mon>=1 2:00 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Europe/Zurich 0:34:08 - LMT 1848 Sep 12 0:29:44 - BMT 1894 Jun # Bern Mean Time @@ -2375,6 +2428,27 @@ Zone Europe/Zurich 0:34:08 - LMT 1848 Sep 12 # (on a non-government server though) describing dates between 2002 and 2006: # http://www.alomaliye.com/bkk_2002_3769.htm +# From Sue Williams (2008-08-11): +# I spotted this news article about a potential change in Turkey. +# +# +# http://www.hurriyet.com.tr/english/domestic/9626174.asp?scr=1 +# + +# From Sue Williams (2008-08-20): +# This article says that around the end of March 2011, Turkey wants to +# adjust the clocks forward by 1/2 hour and stay that way permanently. +# The article indicates that this is a change in timezone offset in addition +# to stopping observance of DST. +# This proposal has not yet been approved. +# +# Read more here... +# +# Turkey to abandon daylight saving time in 2011 +# +# http://www.turkishdailynews.com.tr/article.php?enewsid=112989 +# + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule Turkey 1916 only - May 1 0:00 1:00 S Rule Turkey 1916 only - Oct 1 0:00 0 - diff --git a/jdk/make/sun/javazic/tzdata/northamerica b/jdk/make/sun/javazic/tzdata/northamerica index 6e0317277b7..1638f1fecbb 100644 --- a/jdk/make/sun/javazic/tzdata/northamerica +++ b/jdk/make/sun/javazic/tzdata/northamerica @@ -1764,9 +1764,13 @@ Zone America/Dawson_Creek -8:00:56 - LMT 1884 # The individual that answered the phone confirmed that the clocks did not # move at the end of daylight saving on October 29/2006. He also told me that # the clocks did not move this past weekend (March 11/2007).... -# -# America/Resolute should use the "Canada" Rule up to October 29/2006. -# After that it should be fixed on Eastern Standard Time until further notice. + +# From Chris Walton (2008-11-13): +# ...the residents of Resolute believe that they are changing "time zones" +# twice a year. In winter months, local time is qualified with "Eastern +# Time" which is really "Eastern Standard Time (UTC-5)". In summer +# months, local time is qualified with "Central Time" which is really +# "Central Daylight Time (UTC-5)"... # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule NT_YK 1918 only - Apr 14 2:00 1:00 D @@ -1794,11 +1798,14 @@ Zone America/Iqaluit 0 - zzz 1942 Aug # Frobisher Bay est. -6:00 Canada C%sT 2000 Oct 29 2:00 -5:00 Canada E%sT # aka Qausuittuq +# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +Rule Resolute 2006 max - Nov Sun>=1 2:00 0 ES +Rule Resolute 2007 max - Mar Sun>=8 2:00 0 CD Zone America/Resolute 0 - zzz 1947 Aug 31 # Resolute founded -6:00 NT_YK C%sT 2000 Oct 29 2:00 -5:00 - EST 2001 Apr 1 3:00 -6:00 Canada C%sT 2006 Oct 29 2:00 - -5:00 - EST + -5:00 Resolute %sT # aka Kangiqiniq Zone America/Rankin_Inlet 0 - zzz 1957 # Rankin Inlet founded -6:00 NT_YK C%sT 2000 Oct 29 2:00 @@ -2302,7 +2309,7 @@ Rule Cuba 1996 only - Oct 6 0:00s 0 S Rule Cuba 1997 only - Oct 12 0:00s 0 S Rule Cuba 1998 1999 - Mar lastSun 0:00s 1:00 D Rule Cuba 1998 2003 - Oct lastSun 0:00s 0 S -Rule Cuba 2000 2006 - Apr Sun>=1 0:00s 1:00 D +Rule Cuba 2000 2004 - Apr Sun>=1 0:00s 1:00 D Rule Cuba 2006 max - Oct lastSun 0:00s 0 S Rule Cuba 2007 only - Mar Sun>=8 0:00s 1:00 D Rule Cuba 2008 max - Mar Sun>=15 0:00s 1:00 D diff --git a/jdk/make/sun/javazic/tzdata/southamerica b/jdk/make/sun/javazic/tzdata/southamerica index 06a8d130e39..6c82a557a70 100644 --- a/jdk/make/sun/javazic/tzdata/southamerica +++ b/jdk/make/sun/javazic/tzdata/southamerica @@ -186,9 +186,58 @@ Rule Arg 2000 only - Mar 3 0:00 0 - # From Paul Eggert (2007-12-22): # For dates after mid-2008, the following rules are my guesses and # are quite possibly wrong, but are more likely than no DST at all. + +# From Alexander Krivenyshev (2008-09-05): +# As per message from Carlos Alberto Fonseca Arauz (Nicaragua), +# Argentina will start DST on Sunday October 19, 2008. +# +# +# http://www.worldtimezone.com/dst_news/dst_news_argentina03.html +# +# OR +# +# http://www.impulsobaires.com.ar/nota.php?id=57832 (in spanish) +# + +# From Rodrigo Severo (2008-10-06): +# Here is some info available at a Gentoo bug related to TZ on Argentina's DST: +# ... +# ------- Comment #1 from [jmdocile] 2008-10-06 16:28 0000 ------- +# Hi, there is a problem with timezone-data-2008e and maybe with +# timezone-data-2008f +# Argentinian law [Number] 25.155 is no longer valid. +# +# http://www.infoleg.gov.ar/infolegInternet/anexos/60000-64999/60036/norma.htm +# +# The new one is law [Number] 26.350 +# +# http://www.infoleg.gov.ar/infolegInternet/anexos/135000-139999/136191/norma.htm +# +# So there is no summer time in Argentina for now. + +# From Mariano Absatz (2008-10-20): +# Decree 1693/2008 applies Law 26.350 for the summer 2008/2009 establishing DST in Argentina +# From 2008-10-19 until 2009-03-15 +# +# http://www.boletinoficial.gov.ar/Bora.Portal/CustomControls/PdfContent.aspx?fp=16102008&pi=3&pf=4&s=0&sec=01 +# +# +# Decree 1705/2008 excepting 12 Provinces from applying DST in the summer 2008/2009: +# Catamarca, La Rioja, Mendoza, Salta, San Juan, San Luis, La Pampa, Neuquen, Rio Negro, Chubut, Santa Cruz +# and Tierra del Fuego +# +# http://www.boletinoficial.gov.ar/Bora.Portal/CustomControls/PdfContent.aspx?fp=17102008&pi=1&pf=1&s=0&sec=01 +# +# +# Press release 235 dated Saturday October 18th, from the Government of the Province of Jujuy saying +# it will not apply DST either (even when it was not included in Decree 1705/2008) +# +# http://www.jujuy.gov.ar/index2/partes_prensa/18_10_08/235-181008.doc +# + Rule Arg 2007 only - Dec 30 0:00 1:00 S Rule Arg 2008 max - Mar Sun>=15 0:00 0 - -Rule Arg 2008 max - Oct Sun>=1 0:00 1:00 S +Rule Arg 2008 max - Oct Sun>=15 0:00 1:00 S # From Mariano Absatz (2004-05-21): # Today it was officially published that the Province of Mendoza is changing @@ -336,9 +385,8 @@ Zone America/Argentina/Buenos_Aires -3:53:48 - LMT 1894 Oct 31 -4:00 Arg AR%sT 2000 Mar 3 -3:00 Arg AR%sT # -# Santa Fe (SF), Entre Rios (ER), Corrientes (CN), Misiones (MN), Chaco (CC), -# Formosa (FM), Salta (SA), Santiago del Estero (SE), Cordoba (CB), -# La Pampa (LP), Neuquen (NQ), Rio Negro (RN) +# Cordoba (CB), Santa Fe (SF), Entre Rios (ER), Corrientes (CN), Misiones (MN), +# Chaco (CC), Formosa (FM), Santiago del Estero (SE) # # Shanks & Pottenger also make the following claims, which we haven't verified: # - Formosa switched to -3:00 on 1991-01-07. @@ -357,6 +405,18 @@ Zone America/Argentina/Cordoba -4:16:48 - LMT 1894 Oct 31 -4:00 Arg AR%sT 2000 Mar 3 -3:00 Arg AR%sT # +# Salta (SA), La Pampa (LP), Neuquen (NQ), Rio Negro (RN) +Zone America/Argentina/Salta -4:21:40 - LMT 1894 Oct 31 + -4:16:48 - CMT 1920 May + -4:00 - ART 1930 Dec + -4:00 Arg AR%sT 1969 Oct 5 + -3:00 Arg AR%sT 1991 Mar 3 + -4:00 - WART 1991 Oct 20 + -3:00 Arg AR%sT 1999 Oct 3 + -4:00 Arg AR%sT 2000 Mar 3 + -3:00 Arg AR%sT 2008 Oct 18 + -3:00 - ART +# # Tucuman (TM) Zone America/Argentina/Tucuman -4:20:52 - LMT 1894 Oct 31 -4:16:48 - CMT 1920 May @@ -381,7 +441,8 @@ Zone America/Argentina/La_Rioja -4:27:24 - LMT 1894 Oct 31 -4:00 Arg AR%sT 2000 Mar 3 -3:00 - ART 2004 Jun 1 -4:00 - WART 2004 Jun 20 - -3:00 Arg AR%sT + -3:00 Arg AR%sT 2008 Oct 18 + -3:00 - ART # # San Juan (SJ) Zone America/Argentina/San_Juan -4:34:04 - LMT 1894 Oct 31 @@ -394,7 +455,8 @@ Zone America/Argentina/San_Juan -4:34:04 - LMT 1894 Oct 31 -4:00 Arg AR%sT 2000 Mar 3 -3:00 - ART 2004 May 31 -4:00 - WART 2004 Jul 25 - -3:00 Arg AR%sT + -3:00 Arg AR%sT 2008 Oct 18 + -3:00 - ART # # Jujuy (JY) Zone America/Argentina/Jujuy -4:21:12 - LMT 1894 Oct 31 @@ -408,7 +470,8 @@ Zone America/Argentina/Jujuy -4:21:12 - LMT 1894 Oct 31 -3:00 1:00 ARST 1992 -3:00 Arg AR%sT 1999 Oct 3 -4:00 Arg AR%sT 2000 Mar 3 - -3:00 Arg AR%sT + -3:00 Arg AR%sT 2008 Oct 18 + -3:00 - ART # # Catamarca (CT), Chubut (CH) Zone America/Argentina/Catamarca -4:23:08 - LMT 1894 Oct 31 @@ -421,7 +484,8 @@ Zone America/Argentina/Catamarca -4:23:08 - LMT 1894 Oct 31 -4:00 Arg AR%sT 2000 Mar 3 -3:00 - ART 2004 Jun 1 -4:00 - WART 2004 Jun 20 - -3:00 Arg AR%sT + -3:00 Arg AR%sT 2008 Oct 18 + -3:00 - ART # # Mendoza (MZ) Zone America/Argentina/Mendoza -4:35:16 - LMT 1894 Oct 31 @@ -438,7 +502,8 @@ Zone America/Argentina/Mendoza -4:35:16 - LMT 1894 Oct 31 -4:00 Arg AR%sT 2000 Mar 3 -3:00 - ART 2004 May 23 -4:00 - WART 2004 Sep 26 - -3:00 Arg AR%sT + -3:00 Arg AR%sT 2008 Oct 18 + -3:00 - ART # # San Luis (SL) Zone America/Argentina/San_Luis -4:25:24 - LMT 1894 Oct 31 @@ -466,7 +531,8 @@ Zone America/Argentina/Rio_Gallegos -4:36:52 - LMT 1894 Oct 31 -4:00 Arg AR%sT 2000 Mar 3 -3:00 - ART 2004 Jun 1 -4:00 - WART 2004 Jun 20 - -3:00 Arg AR%sT + -3:00 Arg AR%sT 2008 Oct 18 + -3:00 - ART # # Tierra del Fuego, Antartida e Islas del Atlantico Sur (TF) Zone America/Argentina/Ushuaia -4:33:12 - LMT 1894 Oct 31 @@ -477,7 +543,8 @@ Zone America/Argentina/Ushuaia -4:33:12 - LMT 1894 Oct 31 -4:00 Arg AR%sT 2000 Mar 3 -3:00 - ART 2004 May 30 -4:00 - WART 2004 Jun 20 - -3:00 Arg AR%sT + -3:00 Arg AR%sT 2008 Oct 18 + -3:00 - ART # Aruba # Zone NAME GMTOFF RULES FORMAT [UNTIL] @@ -613,6 +680,36 @@ Zone America/La_Paz -4:32:36 - LMT 1890 # Decretos sobre o Horario de Verao no Brasil # . +# From Steffen Thorsen (2008-08-29): +# As announced by the government and many newspapers in Brazil late +# yesterday, Brazil will start DST on 2008-10-19 (need to change rule) and +# it will end on 2009-02-15 (current rule for Brazil is fine). Based on +# past years experience with the elections, there was a good chance that +# the start was postponed to November, but it did not happen this year. +# +# It has not yet been posted to http://pcdsh01.on.br/DecHV.html +# +# An official page about it: +# +# http://www.mme.gov.br/site/news/detail.do?newsId=16722 +# +# Note that this link does not always work directly, but must be accessed +# by going to +# +# http://www.mme.gov.br/first +# +# +# One example link that works directly: +# +# http://jornale.com.br/index.php?option=com_content&task=view&id=13530&Itemid=54 +# (Portuguese) +# +# +# We have a written a short article about it as well: +# +# http://www.timeanddate.com/news/time/brazil-dst-2008-2009.html +# + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S # Decree 20,466 (1931-10-01) # Decree 21,896 (1932-01-10) @@ -746,12 +843,34 @@ Rule Brazil 2006 only - Nov 5 0:00 1:00 S Rule Brazil 2007 only - Feb 25 0:00 0 - # Decree 6,212 (2007-09-26), # adopted by the same states as before. -Rule Brazil 2007 max - Oct Sun>=8 0:00 1:00 S -Rule Brazil 2008 max - Feb Sun>=15 0:00 0 - +Rule Brazil 2007 only - Oct Sun>=8 0:00 1:00 S +# From Frederico A. C. Neves (2008-09-10): +# Acording to this decree +# +# http://www.planalto.gov.br/ccivil_03/_Ato2007-2010/2008/Decreto/D6558.htm +# +# [t]he DST period in Brazil now on will be from the 3rd Oct Sunday to the +# 3rd Feb Sunday. There is an exception on the return date when this is +# the Carnival Sunday then the return date will be the next Sunday... +Rule Brazil 2008 max - Oct Sun>=15 0:00 1:00 S +Rule Brazil 2008 2011 - Feb Sun>=15 0:00 0 - +Rule Brazil 2012 only - Feb Sun>=22 0:00 0 - +Rule Brazil 2013 2014 - Feb Sun>=15 0:00 0 - +Rule Brazil 2015 only - Feb Sun>=22 0:00 0 - +Rule Brazil 2016 2022 - Feb Sun>=15 0:00 0 - +Rule Brazil 2023 only - Feb Sun>=22 0:00 0 - +Rule Brazil 2024 2025 - Feb Sun>=15 0:00 0 - +Rule Brazil 2026 only - Feb Sun>=22 0:00 0 - +Rule Brazil 2027 2033 - Feb Sun>=15 0:00 0 - +Rule Brazil 2034 only - Feb Sun>=22 0:00 0 - +Rule Brazil 2035 2036 - Feb Sun>=15 0:00 0 - +Rule Brazil 2037 only - Feb Sun>=22 0:00 0 - +# From Arthur David Olson (2008-09-29): +# The next is wrong in some years but is better than nothing. +Rule Brazil 2038 max - Feb Sun>=15 0:00 0 - + # The latest ruleset listed above says that the following states observe DST: # DF, ES, GO, MG, MS, MT, PR, RJ, RS, SC, SP. -# For dates after mid-2008, the above rules with TO="max" are guesses -# and are quite possibly wrong, but are more likely than no DST at all. # Zone NAME GMTOFF RULES FORMAT [UNTIL] # diff --git a/jdk/make/sun/javazic/tzdata/zone.tab b/jdk/make/sun/javazic/tzdata/zone.tab index a9c686227ec..467367e2d72 100644 --- a/jdk/make/sun/javazic/tzdata/zone.tab +++ b/jdk/make/sun/javazic/tzdata/zone.tab @@ -64,14 +64,15 @@ AQ -7824+10654 Antarctica/Vostok Vostok Station, S Magnetic Pole AQ -6640+14001 Antarctica/DumontDUrville Dumont-d'Urville Station, Terre Adelie AQ -690022+0393524 Antarctica/Syowa Syowa Station, E Ongul I AR -3436-05827 America/Argentina/Buenos_Aires Buenos Aires (BA, CF) -AR -3124-06411 America/Argentina/Cordoba most locations (CB, CC, CN, ER, FM, LP, MN, NQ, RN, SA, SE, SF) -AR -3319-06621 America/Argentina/San_Luis San Luis (SL) +AR -3124-06411 America/Argentina/Cordoba most locations (CB, CC, CN, ER, FM, MN, SE, SF) +AR -2447-06525 America/Argentina/Salta (SA, LP, NQ, RN) AR -2411-06518 America/Argentina/Jujuy Jujuy (JY) AR -2649-06513 America/Argentina/Tucuman Tucuman (TM) AR -2828-06547 America/Argentina/Catamarca Catamarca (CT), Chubut (CH) AR -2926-06651 America/Argentina/La_Rioja La Rioja (LR) AR -3132-06831 America/Argentina/San_Juan San Juan (SJ) AR -3253-06849 America/Argentina/Mendoza Mendoza (MZ) +AR -3319-06621 America/Argentina/San_Luis San Luis (SL) AR -5138-06913 America/Argentina/Rio_Gallegos Santa Cruz (SC) AR -5448-06818 America/Argentina/Ushuaia Tierra del Fuego (TF) AS -1416-17042 Pacific/Pago_Pago @@ -137,7 +138,7 @@ CA +4901-08816 America/Nipigon Eastern Time - Ontario & Quebec - places that did CA +4823-08915 America/Thunder_Bay Eastern Time - Thunder Bay, Ontario CA +6344-06828 America/Iqaluit Eastern Time - east Nunavut - most locations CA +6608-06544 America/Pangnirtung Eastern Time - Pangnirtung, Nunavut -CA +744144-0944945 America/Resolute Eastern Time - Resolute, Nunavut +CA +744144-0944945 America/Resolute Eastern Standard Time - Resolute, Nunavut CA +484531-0913718 America/Atikokan Eastern Standard Time - Atikokan, Ontario and Southampton I, Nunavut CA +624900-0920459 America/Rankin_Inlet Central Time - central Nunavut CA +4953-09709 America/Winnipeg Central Time - Manitoba & west Ontario @@ -313,9 +314,9 @@ NG +0627+00324 Africa/Lagos NI +1209-08617 America/Managua NL +5222+00454 Europe/Amsterdam NO +5955+01045 Europe/Oslo -NP +2743+08519 Asia/Katmandu +NP +2743+08519 Asia/Kathmandu NR -0031+16655 Pacific/Nauru -NU -1901+16955 Pacific/Niue +NU -1901-16955 Pacific/Niue NZ -3652+17446 Pacific/Auckland most locations NZ -4357-17633 Pacific/Chatham Chatham Islands OM +2336+05835 Asia/Muscat @@ -406,13 +407,13 @@ US +381515-0854534 America/Kentucky/Louisville Eastern Time - Kentucky - Louisvi US +364947-0845057 America/Kentucky/Monticello Eastern Time - Kentucky - Wayne County US +394606-0860929 America/Indiana/Indianapolis Eastern Time - Indiana - most locations US +384038-0873143 America/Indiana/Vincennes Eastern Time - Indiana - Daviess, Dubois, Knox & Martin Counties -US +411745-0863730 America/Indiana/Knox Eastern Time - Indiana - Starke County US +410305-0863611 America/Indiana/Winamac Eastern Time - Indiana - Pulaski County US +382232-0862041 America/Indiana/Marengo Eastern Time - Indiana - Crawford County +US +382931-0871643 America/Indiana/Petersburg Eastern Time - Indiana - Pike County US +384452-0850402 America/Indiana/Vevay Eastern Time - Indiana - Switzerland County US +415100-0873900 America/Chicago Central Time US +375711-0864541 America/Indiana/Tell_City Central Time - Indiana - Perry County -US +382931-0871643 America/Indiana/Petersburg Central Time - Indiana - Pike County +US +411745-0863730 America/Indiana/Knox Central Time - Indiana - Starke County US +450628-0873651 America/Menominee Central Time - Michigan - Dickinson, Gogebic, Iron & Menominee Counties US +470659-1011757 America/North_Dakota/Center Central Time - North Dakota - Oliver County US +465042-1012439 America/North_Dakota/New_Salem Central Time - North Dakota - Morton County (except Mandan area) diff --git a/jdk/make/sun/jawt/make.depend b/jdk/make/sun/jawt/make.depend index 47792f71696..2eefe099c35 100644 --- a/jdk/make/sun/jawt/make.depend +++ b/jdk/make/sun/jawt/make.depend @@ -1 +1 @@ -$(OBJDIR)/jawt.obj:: $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_AWTEvent.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_Component.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_Dimension.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_Event.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_Font.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_PlatformFont.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jawt_md.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/UnicowsLoader.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DrawingSurface.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/stdhdrs.h +$(OBJDIR)/jawt.obj:: $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_AWTEvent.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_Component.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_Dimension.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_Event.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_Font.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_PlatformFont.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jawt_md.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DrawingSurface.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/stdhdrs.h diff --git a/jdk/make/sun/launcher/Makefile b/jdk/make/sun/launcher/Makefile index d9fba17bbbe..1346bc4e200 100644 --- a/jdk/make/sun/launcher/Makefile +++ b/jdk/make/sun/launcher/Makefile @@ -37,7 +37,7 @@ AUTO_FILES_JAVA_DIRS = sun/launcher # Resources # LOCALE_SET_DEFINITION = jre -NEW_RESOURCE_BUNDLES_PROPERTIES = $(PKGDIR)/resources/launcher.properties +NEW_RESOURCE_BUNDLES_COMPILED_PROPERTIES = $(PKGDIR)/resources/launcher.properties # # Rules diff --git a/jdk/make/sun/rmi/oldtools/Makefile b/jdk/make/sun/rmi/oldtools/Makefile index 1b5dfaaa8de..ad610ffca41 100644 --- a/jdk/make/sun/rmi/oldtools/Makefile +++ b/jdk/make/sun/rmi/oldtools/Makefile @@ -41,7 +41,7 @@ include FILES_java.gmk # Resources # LOCALE_SET_DEFINITION = j2sdk -RESOURCE_BUNDLES_PROPERTIES = sun/tools/javac/resources/javac.properties +RESOURCE_BUNDLES_UNCOMPILED_PROPERTIES = sun/tools/javac/resources/javac.properties # # Rules diff --git a/jdk/make/sun/rmi/registry/Makefile b/jdk/make/sun/rmi/registry/Makefile index 552131848d7..c5254a7f3c9 100644 --- a/jdk/make/sun/rmi/registry/Makefile +++ b/jdk/make/sun/rmi/registry/Makefile @@ -41,7 +41,7 @@ AUTO_FILES_JAVA_DIRS = sun/rmi/registry # Resources # LOCALE_SET_DEFINITION = jre -RESOURCE_BUNDLES_PROPERTIES = $(PKGDIR)/resources/rmiregistry.properties +RESOURCE_BUNDLES_UNCOMPILED_PROPERTIES = $(PKGDIR)/resources/rmiregistry.properties # # Rules diff --git a/jdk/make/sun/rmi/rmic/Makefile b/jdk/make/sun/rmi/rmic/Makefile index c6c7c53e23c..8d9f435e6ec 100644 --- a/jdk/make/sun/rmi/rmic/Makefile +++ b/jdk/make/sun/rmi/rmic/Makefile @@ -43,7 +43,7 @@ FILES_java = $(RMIC_java) # Resources # LOCALE_SET_DEFINITION = jdk -RESOURCE_BUNDLES_PROPERTIES = $(PKGDIR)/resources/rmic.properties +RESOURCE_BUNDLES_UNCOMPILED_PROPERTIES = $(PKGDIR)/resources/rmic.properties # # Rules diff --git a/jdk/make/sun/rmi/rmid/Makefile b/jdk/make/sun/rmi/rmid/Makefile index 48c62d1a942..845b103220d 100644 --- a/jdk/make/sun/rmi/rmid/Makefile +++ b/jdk/make/sun/rmi/rmid/Makefile @@ -39,7 +39,7 @@ build: stubs # Resources # LOCALE_SET_DEFINITION = jre -RESOURCE_BUNDLES_PROPERTIES = sun/rmi/server/resources/rmid.properties +RESOURCE_BUNDLES_UNCOMPILED_PROPERTIES = sun/rmi/server/resources/rmid.properties # # Extra dependencies. diff --git a/jdk/make/sun/serialver/Makefile b/jdk/make/sun/serialver/Makefile index 3dfae491160..e848154af6a 100644 --- a/jdk/make/sun/serialver/Makefile +++ b/jdk/make/sun/serialver/Makefile @@ -41,7 +41,7 @@ AUTO_FILES_JAVA_DIRS = sun/tools/serialver # Resources # LOCALE_SET_DEFINITION = jdk -RESOURCE_BUNDLES_PROPERTIES = $(PKGDIR)/resources/serialver.properties +RESOURCE_BUNDLES_UNCOMPILED_PROPERTIES = $(PKGDIR)/resources/serialver.properties # # Rules diff --git a/jdk/make/sun/splashscreen/Makefile b/jdk/make/sun/splashscreen/Makefile index e65ab7ec181..0df06e4482e 100644 --- a/jdk/make/sun/splashscreen/Makefile +++ b/jdk/make/sun/splashscreen/Makefile @@ -67,7 +67,7 @@ ifneq ($(PLATFORM), windows) OTHER_LDLIBS += -L$(OPENWIN_LIB) -lX11 -lXext $(LIBM) -lpthread else # PLATFORM CFLAGS += -DWITH_WIN32 - OTHER_LDLIBS += kernel32.lib user32.lib gdi32.lib + OTHER_LDLIBS += kernel32.lib user32.lib gdi32.lib delayimp.lib /DELAYLOAD:user32.dll #$(JVMLIB) $(OBJDIR)/../../jpeg/$(OBJDIRNAME)/jpeg$(SUFFIX).lib endif # PLATFORM @@ -85,13 +85,6 @@ vpath %.c $(PLATFORM_SRC)/native/$(PKGDIR)/splashscreen CPPFLAGS += -I$(PLATFORM_SRC)/native/$(PKGDIR)/splashscreen -I$(SHARE_SRC)/native/$(PKGDIR)/splashscreen CPPFLAGS += -I$(SHARE_SRC)/native/$(PKGDIR)/image/jpeg -I$(SHARE_SRC)/native/java/util/zip/zlib-1.1.3 -ifeq ($(PLATFORM), linux) - ifeq ($(ARCH_DATA_MODEL), 64) - # 64-bit gcc has problems compiling MMX instructions. - # Google it for more details. Possibly the newer versions of - # the PNG-library and/or the new compiler will not need this - # option in the future. - CPPFLAGS += -DPNG_NO_MMX_CODE - endif -endif - +# Shun the less than portable MMX assembly code in pnggccrd.c, +# and use alternative implementations in C. +CPPFLAGS += -DPNG_NO_MMX_CODE diff --git a/jdk/make/sun/xawt/mapfile-vers b/jdk/make/sun/xawt/mapfile-vers index d4b5b6e32ba..6e6e05ea459 100644 --- a/jdk/make/sun/xawt/mapfile-vers +++ b/jdk/make/sun/xawt/mapfile-vers @@ -151,6 +151,7 @@ SUNWprivate_1.1 { Java_sun_awt_X11_XRobotPeer_mouseReleaseImpl; Java_sun_awt_X11_XRobotPeer_mouseWheelImpl; Java_sun_awt_X11_XRobotPeer_setup; + Java_sun_awt_X11_XRobotPeer_getNumberOfButtonsImpl; Java_java_awt_Component_initIDs; Java_java_awt_Container_initIDs; Java_java_awt_Button_initIDs; @@ -288,6 +289,7 @@ SUNWprivate_1.1 { Java_sun_awt_X11_XlibWrapper_XGetIconSizes; Java_sun_awt_X11_XlibWrapper_XKeycodeToKeysym; Java_sun_awt_X11_XlibWrapper_XKeysymToKeycode; + Java_sun_awt_X11_XlibWrapper_XQueryKeymap; Java_sun_awt_X11_XlibWrapper_XGetModifierMapping; Java_sun_awt_X11_XlibWrapper_XFreeModifiermap; Java_sun_awt_X11_XlibWrapper_XChangeActivePointerGrab; diff --git a/jdk/make/tools/sharing/classlist.linux b/jdk/make/tools/sharing/classlist.linux index b61d94f54ab..0b8c11e8b3a 100644 --- a/jdk/make/tools/sharing/classlist.linux +++ b/jdk/make/tools/sharing/classlist.linux @@ -1718,6 +1718,7 @@ javax/swing/plaf/basic/BasicToolBarSeparatorUI sun/awt/color/CMM java/applet/Applet java/awt/Panel +com/sun/awt/AWTUtilities javax/swing/KeyboardManager$ComponentKeyStrokePair sun/awt/EmbeddedFrame sun/awt/im/InputMethodContext diff --git a/jdk/make/tools/sharing/classlist.solaris b/jdk/make/tools/sharing/classlist.solaris index e645a4ba065..898bca057c2 100644 --- a/jdk/make/tools/sharing/classlist.solaris +++ b/jdk/make/tools/sharing/classlist.solaris @@ -961,6 +961,7 @@ sun/awt/SunToolkit$3 javax/swing/SystemEventQueueUtilities$ComponentWorkRequest java/applet/Applet java/awt/Panel +com/sun/awt/AWTUtilities sun/awt/X11/XExposeEvent java/util/jar/Manifest java/io/ByteArrayInputStream diff --git a/jdk/make/tools/sharing/classlist.windows b/jdk/make/tools/sharing/classlist.windows index 6459f9e5ab4..f1a5a693b9e 100644 --- a/jdk/make/tools/sharing/classlist.windows +++ b/jdk/make/tools/sharing/classlist.windows @@ -1621,6 +1621,7 @@ javax/swing/plaf/basic/BasicToolBarSeparatorUI sun/font/FontDesignMetrics$MetricsKey java/applet/Applet java/awt/Panel +com/sun/awt/AWTUtilities javax/swing/KeyboardManager$ComponentKeyStrokePair sun/awt/im/InputMethodContext java/awt/im/spi/InputMethodContext diff --git a/jdk/src/share/classes/com/sun/awt/AWTUtilities.java b/jdk/src/share/classes/com/sun/awt/AWTUtilities.java new file mode 100644 index 00000000000..818ac6f53e0 --- /dev/null +++ b/jdk/src/share/classes/com/sun/awt/AWTUtilities.java @@ -0,0 +1,104 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package com.sun.awt; + +import java.awt.*; +import sun.awt.AWTAccessor; + + +/** + * A collection of utility methods for AWT. + * + * The functionality provided by the static methods of the class includes: + *
    + *
  • Setting a 'mixing-cutout' shape for a component. + *
+ *

+ * WARNING: This class is an implementation detail and only meant + * for limited use outside of the core platform. This API may change + * drastically between update release, and it may even be + * removed or be moved in some other package(s)/class(es). + */ +public final class AWTUtilities { + + /** + * The AWTUtilities class should not be instantiated + */ + private AWTUtilities() { + } + + /** + * Sets a 'mixing-cutout' shape for the given component. + * + * By default a lightweight component is treated as an opaque rectangle for + * the purposes of the Heavyweight/Lightweight Components Mixing feature. + * This method enables developers to set an arbitrary shape to be cut out + * from heavyweight components positioned underneath the lightweight + * component in the z-order. + *

+ * The {@code shape} argument may have the following values: + *

    + *
  • {@code null} - reverts the default cutout shape (the rectangle equal + * to the component's {@code getBounds()}) + *
  • empty-shape - does not cut out anything from heavyweight + * components. This makes the given lightweight component effectively + * transparent. Note that descendants of the lightweight component still + * affect the shapes of heavyweight components. An example of an + * empty-shape is {@code new Rectangle()}. + *
  • non-empty-shape - the given shape will be cut out from + * heavyweight components. + *
+ *

+ * The most common example when the 'mixing-cutout' shape is needed is a + * glass pane component. The {@link JRootPane#setGlassPane()} method + * automatically sets the empty-shape as the 'mixing-cutout' shape + * for the given glass pane component. If a developer needs some other + * 'mixing-cutout' shape for the glass pane (which is rare), this must be + * changed manually after installing the glass pane to the root pane. + *

+ * Note that the 'mixing-cutout' shape neither affects painting, nor the + * mouse events handling for the given component. It is used exclusively + * for the purposes of the Heavyweight/Lightweight Components Mixing + * feature. + * + * @param component the component that needs non-default + * 'mixing-cutout' shape + * @param shape the new 'mixing-cutout' shape + * @throws NullPointerException if the component argument is {@code null} + */ + public static void setComponentMixingCutoutShape(Component component, + Shape shape) + { + if (component == null) { + throw new NullPointerException( + "The component argument should not be null."); + } + + AWTAccessor.getComponentAccessor().setMixingCutoutShape(component, + shape); + } +} + diff --git a/jdk/src/share/classes/com/sun/beans/ObjectHandler.java b/jdk/src/share/classes/com/sun/beans/ObjectHandler.java deleted file mode 100644 index 6daeab953a2..00000000000 --- a/jdk/src/share/classes/com/sun/beans/ObjectHandler.java +++ /dev/null @@ -1,479 +0,0 @@ -/* - * Copyright 2003-2006 Sun Microsystems, Inc. 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 - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - */ - -package com.sun.beans; - -import com.sun.beans.finder.ClassFinder; - -import java.beans.*; -import java.util.*; - -import org.xml.sax.*; - -import static java.util.Locale.ENGLISH; - -/** - * WARNING: This class is an implementation detail and only meant - * for use within the core platform. You should NOT depend upon it! This - * API may change drastically between dot dot release, and it may even be - * removed. - * - * @see java.beans.XMLEncoder - * @see java.io.ObjectInputStream - * - * @since 1.4 - * - * @author Philip Milne - */ -public class ObjectHandler extends HandlerBase { - - public static Class typeNameToClass(String typeName) { - typeName = typeName.intern(); - if (typeName == "boolean") return Boolean.class; - if (typeName == "byte") return Byte.class; - if (typeName == "char") return Character.class; - if (typeName == "short") return Short.class; - if (typeName == "int") return Integer.class; - if (typeName == "long") return Long.class; - if (typeName == "float") return Float.class; - if (typeName == "double") return Double.class; - if (typeName == "void") return Void.class; - return null; - } - - public static Class typeNameToPrimitiveClass(String typeName) { - typeName = typeName.intern(); - if (typeName == "boolean") return boolean.class; - if (typeName == "byte") return byte.class; - if (typeName == "char") return char.class; - if (typeName == "short") return short.class; - if (typeName == "int") return int.class; - if (typeName == "long") return long.class; - if (typeName == "float") return float.class; - if (typeName == "double") return double.class; - if (typeName == "void") return void.class; - return null; - } - - /** - * Returns the Class object associated with - * the class or interface with the given string name, - * using the default class loader. - * - * @param name fully qualified name of the desired class - * @param cl class loader from which the class must be loaded - * @return class object representing the desired class - * - * @exception ClassNotFoundException if the class cannot be located - * by the specified class loader - * - * @deprecated As of JDK version 7, replaced by - * {@link ClassFinder#resolveClass(String)}. - */ - @Deprecated - public static Class classForName(String name) throws ClassNotFoundException { - return ClassFinder.resolveClass(name); - } - - /** - * Returns the Class object associated with - * the class or interface with the given string name, - * using the given class loader. - * - * @param name fully qualified name of the desired class - * @param cl class loader from which the class must be loaded - * @return class object representing the desired class - * - * @exception ClassNotFoundException if the class cannot be located - * by the specified class loader - * - * @deprecated As of JDK version 7, replaced by - * {@link ClassFinder#resolveClass(String,ClassLoader)}. - */ - @Deprecated - public static Class classForName(String name, ClassLoader cl) - throws ClassNotFoundException { - return ClassFinder.resolveClass(name, cl); - } - - private Hashtable environment; - private Vector expStack; - private StringBuffer chars; - private XMLDecoder is; - private ClassLoader ldr; - private int itemsRead = 0; - private boolean isString; - - public ObjectHandler() { - environment = new Hashtable(); - expStack = new Vector(); - chars = new StringBuffer(); - } - - public ObjectHandler(XMLDecoder is) { - this(); - this.is = is; - } - - /* loader can be null */ - public ObjectHandler(XMLDecoder is, ClassLoader loader) { - this(is); - this.ldr = loader; - } - - - public void reset() { - expStack.clear(); - chars.setLength(0); - MutableExpression e = new MutableExpression(); - e.setTarget(classForName2("java.lang.Object")); - e.setMethodName("null"); - expStack.add(e); - } - - private Object getValue(Expression exp) { - try { - return exp.getValue(); - } - catch (Exception e) { - if (is != null) { - is.getExceptionListener().exceptionThrown(e); - } - return null; - } - } - - private void addArg(Object arg) { - lastExp().addArg(arg); - } - - private Object pop(Vector v) { - int last = v.size()-1; - Object result = v.get(last); - v.remove(last); - return result; - } - - private Object eval() { - return getValue(lastExp()); - } - - private MutableExpression lastExp() { - return (MutableExpression)expStack.lastElement(); - } - - public Object dequeueResult() { - Object[] results = lastExp().getArguments(); - return results[itemsRead++]; - } - - private boolean isPrimitive(String name) { - return name != "void" && typeNameToClass(name) != null; - } - - private void simulateException(String message) { - Exception e = new Exception(message); - e.fillInStackTrace(); - if (is != null) { - is.getExceptionListener().exceptionThrown(e); - } - } - - private Class classForName2(String name) { - try { - return ClassFinder.resolveClass(name, this.ldr); - } - catch (ClassNotFoundException e) { - if (is != null) { - is.getExceptionListener().exceptionThrown(e); - } - } - return null; - } - - private HashMap getAttributes(AttributeList attrs) { - HashMap attributes = new HashMap(); - if (attrs != null && attrs.getLength() > 0) { - for(int i = 0; i < attrs.getLength(); i++) { - attributes.put(attrs.getName(i), attrs.getValue(i)); - } - } - return attributes; - } - - public void startElement(String name, AttributeList attrs) throws SAXException { - name = name.intern(); // Xerces parser does not supply unique tag names. - if (this.isString) { - parseCharCode(name, getAttributes(attrs)); - return; - } - chars.setLength(0); - - HashMap attributes = getAttributes(attrs); - MutableExpression e = new MutableExpression(); - - // Target - String className = (String)attributes.get("class"); - if (className != null) { - e.setTarget(classForName2(className)); - } - - // Property - Object property = attributes.get("property"); - String index = (String)attributes.get("index"); - if (index != null) { - property = new Integer(index); - e.addArg(property); - } - e.setProperty(property); - - // Method - String methodName = (String)attributes.get("method"); - if (methodName == null && property == null) { - methodName = "new"; - } - e.setMethodName(methodName); - - // Tags - if (name == "string") { - e.setTarget(String.class); - e.setMethodName("new"); - this.isString = true; - } - else if (isPrimitive(name)){ - Class wrapper = typeNameToClass(name); - e.setTarget(wrapper); - e.setMethodName("new"); - parseCharCode(name, attributes); - } - else if (name == "class") { - e.setTarget(Class.class); - e.setMethodName("forName"); - } - else if (name == "null") { - // Create an arbitrary expression that has a value of null - for - // consistency. - e.setTarget(Object.class); - e.setMethodName("getSuperclass"); - e.setValue(null); - } - else if (name == "void") { - if (e.getTarget() == null) { // this check is for "void class="foo" method= ..." - e.setTarget(eval()); - } - } - else if (name == "array") { - // The class attribute means sub-type for arrays. - String subtypeName = (String)attributes.get("class"); - Class subtype = (subtypeName == null) ? Object.class : classForName2(subtypeName); - String length = (String)attributes.get("length"); - if (length != null) { - e.setTarget(java.lang.reflect.Array.class); - e.addArg(subtype); - e.addArg(new Integer(length)); - } - else { - Class arrayClass = java.lang.reflect.Array.newInstance(subtype, 0).getClass(); - e.setTarget(arrayClass); - } - } - else if (name == "java") { - e.setValue(is); // The outermost scope is the stream itself. - } - else if (name == "object") { - } - else { - simulateException("Unrecognized opening tag: " + name + " " + attrsToString(attrs)); - return; - } - - // ids - String idName = (String)attributes.get("id"); - if (idName != null) { - environment.put(idName, e); - } - - // idrefs - String idrefName = (String)attributes.get("idref"); - if (idrefName != null) { - e.setValue(lookup(idrefName)); - } - - // fields - String fieldName = (String)attributes.get("field"); - if (fieldName != null) { - e.setValue(getFieldValue(e.getTarget(), fieldName)); - } - expStack.add(e); - } - - private Object getFieldValue(Object target, String fieldName) { - try { - Class type = target.getClass(); - if (type == Class.class) { - type = (Class)target; - } - java.lang.reflect.Field f = sun.reflect.misc.FieldUtil.getField(type, fieldName); - return f.get(target); - } - catch (Exception e) { - if (is != null) { - is.getExceptionListener().exceptionThrown(e); - } - return null; - } - } - - private String attrsToString(AttributeList attrs) { - StringBuffer b = new StringBuffer(); - for (int i = 0; i < attrs.getLength (); i++) { - b.append(attrs.getName(i)+"=\""+attrs.getValue(i)+"\" "); - } - return b.toString(); - } - - public void characters(char buf [], int offset, int len) throws SAXException { - chars.append(new String(buf, offset, len)); - } - - private void parseCharCode(String name, Map map) { - if (name == "char") { - String value = (String) map.get("code"); - if (value != null) { - int code = Integer.decode(value); - for (char ch : Character.toChars(code)) { - this.chars.append(ch); - } - } - } - } - - public Object lookup(String s) { - Expression e = (Expression)environment.get(s); - if (e == null) { - simulateException("Unbound variable: " + s); - } - return getValue(e); - } - - public void register(String id, Object value) { - Expression e = new MutableExpression(); - e.setValue(value); - environment.put(id, e); - } - - public void endElement(String name) throws SAXException { - name = name.intern(); // Xerces parser does not supply unique tag names. - if (name == "string") { - this.isString = false; - } else if (this.isString) { - return; - } - if (name == "java") { - return; - } - if (isPrimitive(name) || name == "string" || name == "class") { - addArg(chars.toString()); - } - if (name == "object" || name == "array" || name == "void" || - isPrimitive(name) || name == "string" || name == "class" || - name == "null") { - Expression e = (Expression)pop(expStack); - Object value = getValue(e); - if (name != "void") { - addArg(value); - } - } - else { - simulateException("Unrecognized closing tag: " + name); - } - } -} - - -class MutableExpression extends Expression { - private Object target; - private String methodName; - - private Object property; - private Vector argV = new Vector(); - - private String capitalize(String propertyName) { - if (propertyName.length() == 0) { - return propertyName; - } - return propertyName.substring(0, 1).toUpperCase(ENGLISH) + propertyName.substring(1); - } - - public MutableExpression() { - super(null, null, null); - } - - public Object[] getArguments() { - return argV.toArray(); - } - - public String getMethodName() { - if (property == null) { - return methodName; - } - int setterArgs = (property instanceof String) ? 1 : 2; - String methodName = (argV.size() == setterArgs) ? "set" : "get"; - if (property instanceof String) { - return methodName + capitalize((String)property); - } - else { - return methodName; - } - } - - public void addArg(Object arg) { - argV.add(arg); - } - - public void setTarget(Object target) { - this.target = target; - } - - public Object getTarget() { - return target; - } - - public void setMethodName(String methodName) { - this.methodName = methodName; - } - - public void setProperty(Object property) { - this.property = property; - } - - public void setValue(Object value) { - super.setValue(value); - } - - public Object getValue() throws Exception { - return super.getValue(); - } -} diff --git a/jdk/src/share/classes/com/sun/beans/decoder/AccessorElementHandler.java b/jdk/src/share/classes/com/sun/beans/decoder/AccessorElementHandler.java new file mode 100644 index 00000000000..d34fce45635 --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/decoder/AccessorElementHandler.java @@ -0,0 +1,105 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This is base class that simplifies access to entities (fields or properties). + * The {@code name} attribute specifies the name of the accessible entity. + * The element defines getter if it contains no argument + * or setter if it contains one argument. + * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +abstract class AccessorElementHandler extends ElementHandler { + private String name; + private ValueObject value; + + /** + * Parses attributes of the element. + * The following atributes are supported: + *

+ *
name + *
the name of the accessible entity + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @param name the attribute name + * @param value the attribute value + */ + @Override + public void addAttribute(String name, String value) { + if (name.equals("name")) { // NON-NLS: the attribute name + this.name = value; + } else { + super.addAttribute(name, value); + } + } + + /** + * Adds the argument that is used to set the value of this element. + * + * @param argument the value of the element that contained in this one + */ + @Override + protected final void addArgument(Object argument) { + if (this.value != null) { + throw new IllegalStateException("Could not add argument to evaluated element"); + } + setValue(this.name, argument); + this.value = ValueObjectImpl.VOID; + } + + /** + * Returns the value of this element. + * + * @return the value of this element + */ + @Override + protected final ValueObject getValueObject() { + if (this.value == null) { + this.value = ValueObjectImpl.create(getValue(this.name)); + } + return this.value; + } + + /** + * Returns the value of the entity with specified {@code name}. + * + * @param name the name of the accessible entity + * @return the value of the specified entity + */ + protected abstract Object getValue(String name); + + /** + * Sets the new value for the entity with specified {@code name}. + * + * @param name the name of the accessible entity + * @param value the new value for the specified entity + */ + protected abstract void setValue(String name, Object value); +} diff --git a/jdk/src/share/classes/com/sun/beans/decoder/ArrayElementHandler.java b/jdk/src/share/classes/com/sun/beans/decoder/ArrayElementHandler.java new file mode 100644 index 00000000000..0bfcec6e46a --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/decoder/ArrayElementHandler.java @@ -0,0 +1,133 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +import java.lang.reflect.Array; + +/** + * This class is intended to handle <array> element, + * that is used to array creation. + * The {@code length} attribute specifies the length of the array. + * The {@code class} attribute specifies the elements type. + * The {@link Object} type is used by default. + * For example:
+ * <array length="10"/>
+ * is equivalent to {@code new Component[10]} in Java code. + * The {@code set} and {@code get} methods, + * as defined in the {@link java.util.List} interface, + * can be used as if they could be applied to array instances. + * The {@code index} attribute can thus be used with arrays. + * For example:
+ * <array length="3" class="java.lang.String">
+ *     <void index="1">
+ *         <string>Hello, world</string>
+ *     </void>
+ * </array>
+ * is equivalent to the following Java code:
+ * String[] s = new String[3];
+ * s[1] = "Hello, world";
+ * It is possible to omit the {@code length} attribute and + * specify the values directly, without using {@code void} tags. + * The length of the array is equal to the number of values specified. + * For example:
+ * <array id="array" class="int">
+ *     <int>123</int>
+ *     <int>456</int>
+ * </array>
+ * is equivalent to {@code int[] array = {123, 456}} in Java code. + *

The following atributes are supported: + *

+ *
length + *
the array length + *
class + *
the type of object for instantiation + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class ArrayElementHandler extends NewElementHandler { + private Integer length; + + /** + * Parses attributes of the element. + * The following atributes are supported: + *
+ *
length + *
the array length + *
class + *
the type of object for instantiation + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @param name the attribute name + * @param value the attribute value + */ + @Override + public void addAttribute(String name, String value) { + if (name.equals("length")) { // NON-NLS: the attribute name + this.length = Integer.valueOf(value); + } else { + super.addAttribute(name, value); + } + } + + /** + * Calculates the value of this element + * if the lentgh attribute is set. + */ + @Override + public void startElement() { + if (this.length != null) { + getValueObject(); + } + } + + /** + * Creates an instance of the array. + * + * @param type the base class + * @param args the array of arguments + * @return the value of this element + */ + @Override + protected ValueObject getValueObject(Class type, Object[] args) { + if (type == null) { + type = Object.class; + } + if (this.length != null) { + return ValueObjectImpl.create(Array.newInstance(type, this.length)); + } + Object array = Array.newInstance(type, args.length); + for (int i = 0; i < args.length; i++) { + Array.set(array, i, args[i]); + } + return ValueObjectImpl.create(array); + } +} diff --git a/jdk/src/share/classes/com/sun/beans/decoder/BooleanElementHandler.java b/jdk/src/share/classes/com/sun/beans/decoder/BooleanElementHandler.java new file mode 100644 index 00000000000..a5f401b5f49 --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/decoder/BooleanElementHandler.java @@ -0,0 +1,69 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This class is intended to handle <boolean> element. + * This element specifies {@code boolean} values. + * The class {@link Boolean} is used as wrapper for these values. + * The result value is created from text of the body of this element. + * The body parsing is described in the class {@link StringElementHandler}. + * For example:
+ * <boolean>true</boolean>
+ * is shortcut to
+ * <method name="valueOf" class="java.lang.Boolean">
+ *     <string>true</string>
+ * </method>
+ * which is equivalent to {@code Boolean.valueOf("true")} in Java code. + *

The following atribute is supported: + *

+ *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class BooleanElementHandler extends StringElementHandler { + + /** + * Creates {@code boolean} value from + * the text of the body of this element. + * + * @param argument the text of the body + * @return evaluated {@code boolean} value + */ + @Override + public Object getValue(String argument) { + if (Boolean.TRUE.toString().equalsIgnoreCase(argument)) { + return Boolean.TRUE; + } + if (Boolean.FALSE.toString().equalsIgnoreCase(argument)) { + return Boolean.FALSE; + } + throw new IllegalArgumentException("Unsupported boolean argument: " + argument); + } +} diff --git a/jdk/src/share/classes/com/sun/beans/decoder/ByteElementHandler.java b/jdk/src/share/classes/com/sun/beans/decoder/ByteElementHandler.java new file mode 100644 index 00000000000..d7d458f0104 --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/decoder/ByteElementHandler.java @@ -0,0 +1,63 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This class is intended to handle <byte> element. + * This element specifies {@code byte} values. + * The class {@link Byte} is used as wrapper for these values. + * The result value is created from text of the body of this element. + * The body parsing is described in the class {@link StringElementHandler}. + * For example:
+ * <byte>127</byte>
+ * is shortcut to
+ * <method name="decode" class="java.lang.Byte">
+ *     <string>127</string>
+ * </method>
+ * which is equivalent to {@code Byte.decode("127")} in Java code. + *

The following atribute is supported: + *

+ *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class ByteElementHandler extends StringElementHandler { + + /** + * Creates {@code byte} value from + * the text of the body of this element. + * + * @param argument the text of the body + * @return evaluated {@code byte} value + */ + @Override + public Object getValue(String argument) { + return Byte.decode(argument); + } +} diff --git a/jdk/src/share/classes/com/sun/beans/decoder/CharElementHandler.java b/jdk/src/share/classes/com/sun/beans/decoder/CharElementHandler.java new file mode 100644 index 00000000000..910b5a63f70 --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/decoder/CharElementHandler.java @@ -0,0 +1,92 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This class is intended to handle <char> element. + * This element specifies {@code char} values. + * The class {@link Character} is used as wrapper for these values. + * The result value is created from text of the body of this element. + * The body parsing is described in the class {@link StringElementHandler}. + * For example:
+ * <char>X</char>
+ * which is equivalent to {@code Character.valueOf('X')} in Java code. + *

The following atributes are supported: + *

+ *
code + *
this attribute specifies character code + *
id + *
the identifier of the variable that is intended to store the result + *
+ * The {@code code} attribute can be used for characters + * that are illegal in XML document, for example:
+ * <char code="0"/>
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class CharElementHandler extends StringElementHandler { + + /** + * Parses attributes of the element. + * The following atributes are supported: + *
+ *
code + *
this attribute specifies character code + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @param name the attribute name + * @param value the attribute value + */ + @Override + public void addAttribute(String name, String value) { + if (name.equals("code")) { // NON-NLS: the attribute name + int code = Integer.decode(value); + for (char ch : Character.toChars(code)) { + addCharacter(ch); + } + } else { + super.addAttribute(name, value); + } + } + + /** + * Creates {@code char} value from + * the text of the body of this element. + * + * @param argument the text of the body + * @return evaluated {@code char} value + */ + @Override + public Object getValue(String argument) { + if (argument.length() != 1) { + throw new IllegalArgumentException("Wrong characters count"); + } + return Character.valueOf(argument.charAt(0)); + } +} diff --git a/jdk/src/share/classes/com/sun/beans/decoder/ClassElementHandler.java b/jdk/src/share/classes/com/sun/beans/decoder/ClassElementHandler.java new file mode 100644 index 00000000000..c6ca9856416 --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/decoder/ClassElementHandler.java @@ -0,0 +1,62 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This class is intended to handle <class> element. + * This element specifies {@link Class} values. + * The result value is created from text of the body of this element. + * The body parsing is described in the class {@link StringElementHandler}. + * For example:
+ * <class>java.lang.Class</class>
+ * is shortcut to
+ * <method name="forName" class="java.lang.Class">
+ *     <string>java.lang.Class</string>
+ * </method>
+ * which is equivalent to {@code Class.forName("java.lang.Class")} in Java code. + *

The following atribute is supported: + *

+ *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class ClassElementHandler extends StringElementHandler { + + /** + * Creates class by the name from + * the text of the body of this element. + * + * @param argument the text of the body + * @return evaluated {@code Class} value + */ + @Override + public Object getValue(String argument) { + return getOwner().findClass(argument); + } +} diff --git a/jdk/src/share/classes/com/sun/beans/decoder/DocumentHandler.java b/jdk/src/share/classes/com/sun/beans/decoder/DocumentHandler.java new file mode 100644 index 00000000000..4c409a12a9b --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/decoder/DocumentHandler.java @@ -0,0 +1,389 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +import com.sun.beans.finder.ClassFinder; + +import java.beans.ExceptionListener; + +import java.io.IOException; + +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +/** + * The main class to parse JavaBeans XML archive. + * + * @since 1.7 + * + * @author Sergey A. Malenkov + * + * @see ElementHandler + */ +public final class DocumentHandler extends DefaultHandler { + private final Map> handlers = new HashMap>(); + + private final Map environment = new HashMap(); + + private final List objects = new ArrayList(); + + private Reference loader; + private ExceptionListener listener; + private Object owner; + + private ElementHandler handler; + + /** + * Creates new instance of document handler. + */ + public DocumentHandler() { + setElementHandler("java", JavaElementHandler.class); // NON-NLS: the element name + setElementHandler("null", NullElementHandler.class); // NON-NLS: the element name + setElementHandler("array", ArrayElementHandler.class); // NON-NLS: the element name + setElementHandler("class", ClassElementHandler.class); // NON-NLS: the element name + setElementHandler("string", StringElementHandler.class); // NON-NLS: the element name + setElementHandler("object", ObjectElementHandler.class); // NON-NLS: the element name + + setElementHandler("void", VoidElementHandler.class); // NON-NLS: the element name + setElementHandler("char", CharElementHandler.class); // NON-NLS: the element name + setElementHandler("byte", ByteElementHandler.class); // NON-NLS: the element name + setElementHandler("short", ShortElementHandler.class); // NON-NLS: the element name + setElementHandler("int", IntElementHandler.class); // NON-NLS: the element name + setElementHandler("long", LongElementHandler.class); // NON-NLS: the element name + setElementHandler("float", FloatElementHandler.class); // NON-NLS: the element name + setElementHandler("double", DoubleElementHandler.class); // NON-NLS: the element name + setElementHandler("boolean", BooleanElementHandler.class); // NON-NLS: the element name + + // some handlers for new elements + setElementHandler("new", NewElementHandler.class); // NON-NLS: the element name + setElementHandler("var", VarElementHandler.class); // NON-NLS: the element name + setElementHandler("true", TrueElementHandler.class); // NON-NLS: the element name + setElementHandler("false", FalseElementHandler.class); // NON-NLS: the element name + setElementHandler("field", FieldElementHandler.class); // NON-NLS: the element name + setElementHandler("method", MethodElementHandler.class); // NON-NLS: the element name + setElementHandler("property", PropertyElementHandler.class); // NON-NLS: the element name + } + + /** + * Returns the class loader used to instantiate objects. + * If the class loader has not been explicitly set + * then {@code null} is returned. + * + * @return the class loader used to instantiate objects + */ + public ClassLoader getClassLoader() { + return (this.loader != null) + ? this.loader.get() + : null; + } + + /** + * Sets the class loader used to instantiate objects. + * If the class loader is not set + * then default class loader will be used. + * + * @param loader a classloader to use + */ + public void setClassLoader(ClassLoader loader) { + this.loader = new WeakReference(loader); + } + + /** + * Returns the exception listener for parsing. + * The exception listener is notified + * when handler catches recoverable exceptions. + * If the exception listener has not been explicitly set + * then default exception listener is returned. + * + * @return the exception listener for parsing + */ + public ExceptionListener getExceptionListener() { + return this.listener; + } + + /** + * Sets the exception listener for parsing. + * The exception listener is notified + * when handler catches recoverable exceptions. + * + * @param listener the exception listener for parsing + */ + public void setExceptionListener(ExceptionListener listener) { + this.listener = listener; + } + + /** + * Returns the owner of this document handler. + * + * @return the owner of this document handler + */ + public Object getOwner() { + return this.owner; + } + + /** + * Sets the owner of this document handler. + * + * @param owner the owner of this document handler + */ + public void setOwner(Object owner) { + this.owner = owner; + } + + /** + * Returns the handler for the element with specified name. + * + * @param name the name of the element + * @return the corresponding element handler + */ + public Class getElementHandler(String name) { + Class type = this.handlers.get(name); + if (type == null) { + throw new IllegalArgumentException("Unsupported element: " + name); + } + return type; + } + + /** + * Sets the handler for the element with specified name. + * + * @param name the name of the element + * @param handler the corresponding element handler + */ + public void setElementHandler(String name, Class handler) { + this.handlers.put(name, handler); + } + + /** + * Indicates whether the variable with specified identifier is defined. + * + * @param id the identifier + * @return @{code true} if the variable is defined; + * @{code false} otherwise + */ + public boolean hasVariable(String id) { + return this.environment.containsKey(id); + } + + /** + * Returns the value of the variable with specified identifier. + * + * @param id the identifier + * @return the value of the variable + */ + public Object getVariable(String id) { + if (!this.environment.containsKey(id)) { + throw new IllegalArgumentException("Unbound variable: " + id); + } + return this.environment.get(id); + } + + /** + * Sets new value of the variable with specified identifier. + * + * @param id the identifier + * @param value new value of the variable + */ + public void setVariable(String id, Object value) { + this.environment.put(id, value); + } + + /** + * Returns the array of readed objects. + * + * @return the array of readed objects + */ + public Object[] getObjects() { + return this.objects.toArray(); + } + + /** + * Adds the object to the list of readed objects. + * + * @param object the object that is readed from XML document + */ + void addObject(Object object) { + this.objects.add(object); + } + + /** + * Prepares this handler to read objects from XML document. + */ + @Override + public void startDocument() { + this.objects.clear(); + this.handler = null; + } + + /** + * Parses opening tag of XML element + * using corresponding element handler. + * + * @param uri the namespace URI, or the empty string + * if the element has no namespace URI or + * if namespace processing is not being performed + * @param localName the local name (without prefix), or the empty string + * if namespace processing is not being performed + * @param qName the qualified name (with prefix), or the empty string + * if qualified names are not available + * @param attributes the attributes attached to the element + */ + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + ElementHandler parent = this.handler; + try { + this.handler = getElementHandler(qName).newInstance(); + this.handler.setOwner(this); + this.handler.setParent(parent); + } + catch (Exception exception) { + throw new SAXException(exception); + } + for (int i = 0; i < attributes.getLength(); i++) + try { + String name = attributes.getQName(i); + String value = attributes.getValue(i); + this.handler.addAttribute(name, value); + } + catch (RuntimeException exception) { + handleException(exception); + } + + this.handler.startElement(); + } + + /** + * Parses closing tag of XML element + * using corresponding element handler. + * + * @param uri the namespace URI, or the empty string + * if the element has no namespace URI or + * if namespace processing is not being performed + * @param localName the local name (without prefix), or the empty string + * if namespace processing is not being performed + * @param qName the qualified name (with prefix), or the empty string + * if qualified names are not available + */ + @Override + public void endElement(String uri, String localName, String qName) { + try { + this.handler.endElement(); + } + catch (RuntimeException exception) { + handleException(exception); + } + finally { + this.handler = this.handler.getParent(); + } + } + + /** + * Parses character data inside XML element. + * + * @param chars the array of characters + * @param start the start position in the character array + * @param length the number of characters to use + */ + @Override + public void characters(char[] chars, int start, int length) { + if (this.handler != null) { + try { + while (0 < length--) { + this.handler.addCharacter(chars[start++]); + } + } + catch (RuntimeException exception) { + handleException(exception); + } + } + } + + /** + * Handles an exception using current exception listener. + * + * @param exception an exception to handle + * @see #setExceptionListener + */ + public void handleException(Exception exception) { + if (this.listener == null) { + throw new IllegalStateException(exception); + } + this.listener.exceptionThrown(exception); + } + + /** + * Starts parsing of the specified input source. + * + * @param input the input source to parse + */ + public void parse(InputSource input) { + try { + SAXParserFactory.newInstance().newSAXParser().parse(input, this); + } + catch (ParserConfigurationException exception) { + handleException(exception); + } + catch (SAXException wrapper) { + Exception exception = wrapper.getException(); + if (exception == null) { + exception = wrapper; + } + handleException(exception); + } + catch (IOException exception) { + handleException(exception); + } + } + + /** + * Resolves class by name using current class loader. + * This method handles exception using current exception listener. + * + * @param name the name of the class + * @return the object that represents the class + */ + public Class findClass(String name) { + try { + return ClassFinder.resolveClass(name, getClassLoader()); + } + catch (ClassNotFoundException exception) { + handleException(exception); + return null; + } + } +} diff --git a/jdk/src/share/classes/com/sun/beans/decoder/DoubleElementHandler.java b/jdk/src/share/classes/com/sun/beans/decoder/DoubleElementHandler.java new file mode 100644 index 00000000000..e0f58677627 --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/decoder/DoubleElementHandler.java @@ -0,0 +1,63 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This class is intended to handle <double> element. + * This element specifies {@code double} values. + * The class {@link Double} is used as wrapper for these values. + * The result value is created from text of the body of this element. + * The body parsing is described in the class {@link StringElementHandler}. + * For example:
+ * <double>1.23e45</double>
+ * is shortcut to
+ * <method name="valueOf" class="java.lang.Double">
+ *     <string>1.23e45</string>
+ * </method>
+ * which is equivalent to {@code Double.valueOf("1.23e45")} in Java code. + *

The following atribute is supported: + *

+ *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class DoubleElementHandler extends StringElementHandler { + + /** + * Creates {@code double} value from + * the text of the body of this element. + * + * @param argument the text of the body + * @return evaluated {@code double} value + */ + @Override + public Object getValue(String argument) { + return Double.valueOf(argument); + } +} diff --git a/jdk/src/share/classes/com/sun/beans/decoder/ElementHandler.java b/jdk/src/share/classes/com/sun/beans/decoder/ElementHandler.java new file mode 100644 index 00000000000..ca85cd6ed08 --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/decoder/ElementHandler.java @@ -0,0 +1,224 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * The base class for element handlers. + * + * @since 1.7 + * + * @author Sergey A. Malenkov + * + * @see DocumentHandler + */ +public abstract class ElementHandler { + private DocumentHandler owner; + private ElementHandler parent; + + private String id; + + /** + * Returns the document handler that creates this element handler. + * + * @return the owner document handler + */ + public final DocumentHandler getOwner() { + return this.owner; + } + + /** + * Sets the document handler that creates this element handler. + * The owner document handler should be set after instantiation. + * Such approach is used to simplify the extensibility. + * + * @param owner the owner document handler + * @see DocumentHandler#startElement + */ + final void setOwner(DocumentHandler owner) { + if (owner == null) { + throw new IllegalArgumentException("Every element should have owner"); + } + this.owner = owner; + } + + /** + * Returns the element handler that contains this one. + * + * @return the parent element handler + */ + public final ElementHandler getParent() { + return this.parent; + } + + /** + * Sets the element handler that contains this one. + * The parent element handler should be set after instantiation. + * Such approach is used to simplify the extensibility. + * + * @param parent the parent element handler + * @see DocumentHandler#startElement + */ + final void setParent(ElementHandler parent) { + this.parent = parent; + } + + /** + * Returns the value of the variable with specified identifier. + * + * @param id the identifier + * @return the value of the variable + */ + protected final Object getVariable(String id) { + if (id.equals(this.id)) { + ValueObject value = getValueObject(); + if (value.isVoid()) { + throw new IllegalStateException("The element does not return value"); + } + return value.getValue(); + } + return (this.parent != null) + ? this.parent.getVariable(id) + : this.owner.getVariable(id); + } + + /** + * Returns the value of the parent element. + * + * @return the value of the parent element + */ + protected Object getContextBean() { + if (this.parent != null) { + ValueObject value = this.parent.getValueObject(); + if (!value.isVoid()) { + return value.getValue(); + } + throw new IllegalStateException("The outer element does not return value"); + } else { + Object value = this.owner.getOwner(); + if (value != null) { + return value; + } + throw new IllegalStateException("The topmost element does not have context"); + } + } + + /** + * Parses attributes of the element. + * By default, the following atribute is supported: + *
+ *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @param name the attribute name + * @param value the attribute value + */ + public void addAttribute(String name, String value) { + if (name.equals("id")) { // NON-NLS: the attribute name + this.id = value; + } else { + throw new IllegalArgumentException("Unsupported attribute: " + name); + } + } + + /** + * This method is called before parsing of the element's body. + * All attributes are parsed at this point. + * By default, do nothing. + */ + public void startElement() { + } + + /** + * This method is called after parsing of the element's body. + * By default, it calculates the value of this element. + * The following tasks are executing for any non-void value: + *
    + *
  1. If the {@code id} attribute is set + * the value of the variable with the specified identifier + * is set to the value of this element.
  2. + *
  3. This element is used as an argument of parent element if it is possible.
  4. + *
+ * + * @see #isArgument + */ + public void endElement() { + // do nothing if no value returned + ValueObject value = getValueObject(); + if (!value.isVoid()) { + if (this.id != null) { + this.owner.setVariable(this.id, value.getValue()); + } + if (isArgument()) { + if (this.parent != null) { + this.parent.addArgument(value.getValue()); + } else { + this.owner.addObject(value.getValue()); + } + } + } + } + + /** + * Adds the character that contained in this element. + * By default, only whitespaces are acceptable. + * + * @param ch the character + */ + public void addCharacter(char ch) { + if ((ch != ' ') && (ch != '\n') && (ch != '\t') && (ch != '\r')) { + throw new IllegalStateException("Illegal character with code " + (int) ch); + } + } + + /** + * Adds the argument that is used to calculate the value of this element. + * By default, no arguments are acceptable. + * + * @param argument the value of the element that contained in this one + */ + protected void addArgument(Object argument) { + throw new IllegalStateException("Could not add argument to simple element"); + } + + /** + * Tests whether the value of this element can be used + * as an argument of the element that contained in this one. + * + * @return {@code true} if the value of this element can be used + * as an argument of the element that contained in this one, + * {@code false} otherwise + */ + protected boolean isArgument() { + return this.id == null; + } + + /** + * Returns the value of this element. + * + * @return the value of this element + */ + protected abstract ValueObject getValueObject(); +} diff --git a/jdk/src/share/classes/com/sun/beans/decoder/FalseElementHandler.java b/jdk/src/share/classes/com/sun/beans/decoder/FalseElementHandler.java new file mode 100644 index 00000000000..6e8d786aa14 --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/decoder/FalseElementHandler.java @@ -0,0 +1,56 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This class is intended to handle <false> element. + * This element specifies {@code false} value. + * It should not contain body or inner elements. + * For example:
+ * <false/>
+ * is equivalent to {@code false} in Java code. + *

The following atribute is supported: + *

+ *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class FalseElementHandler extends NullElementHandler { + + /** + * Returns {@code Boolean.FALSE} + * as a value of <false> element. + * + * @return {@code Boolean.FALSE} by default + */ + @Override + public Object getValue() { + return Boolean.FALSE; + } +} diff --git a/jdk/src/share/classes/com/sun/beans/decoder/FieldElementHandler.java b/jdk/src/share/classes/com/sun/beans/decoder/FieldElementHandler.java new file mode 100644 index 00000000000..ac255dde7fd --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/decoder/FieldElementHandler.java @@ -0,0 +1,189 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +import com.sun.beans.finder.FieldFinder; + +import java.lang.reflect.Field; + +/** + * This class is intended to handle <field> element. + * This element simplifies access to the fields. + * If the {@code class} attribute is specified + * this element accesses static field of specified class. + * This element defines getter if it contains no argument. + * It returns the value of the field in this case. + * For example:
+ * <field name="TYPE" class="java.lang.Long"/>
+ * is equivalent to {@code Long.TYPE} in Java code. + * This element defines setter if it contains one argument. + * It does not return the value of the field in this case. + * For example:
+ * <field name="id"><int>0</int></field>
+ * is equivalent to {@code id = 0} in Java code. + *

The following atributes are supported: + *

+ *
name + *
the field name + *
class + *
the type is used for static fields only + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class FieldElementHandler extends AccessorElementHandler { + private Class type; + + /** + * Parses attributes of the element. + * The following atributes are supported: + *
+ *
name + *
the field name + *
class + *
the type is used for static fields only + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @param name the attribute name + * @param value the attribute value + */ + @Override + public void addAttribute(String name, String value) { + if (name.equals("class")) { // NON-NLS: the attribute name + this.type = getOwner().findClass(value); + } else { + super.addAttribute(name, value); + } + } + + /** + * Tests whether the value of this element can be used + * as an argument of the element that contained in this one. + * + * @return {@code true} if the value of this element should be used + * as an argument of the element that contained in this one, + * {@code false} otherwise + */ + @Override + protected boolean isArgument() { + return super.isArgument() && (this.type != null); // only static accessor can be used an argument + } + + /** + * Returns the context of the field. + * The context of the static field is the class object. + * The context of the non-static field is the value of the parent element. + * + * @return the context of the field + */ + @Override + protected Object getContextBean() { + return (this.type != null) + ? this.type + : super.getContextBean(); + } + + /** + * Returns the value of the field with specified {@code name}. + * + * @param name the name of the field + * @return the value of the specified field + */ + @Override + protected Object getValue(String name) { + try { + return getFieldValue(getContextBean(), name); + } + catch (Exception exception) { + getOwner().handleException(exception); + } + return null; + } + + /** + * Sets the new value for the field with specified {@code name}. + * + * @param name the name of the field + * @param value the new value for the specified field + */ + @Override + protected void setValue(String name, Object value) { + try { + setFieldValue(getContextBean(), name, value); + } + catch (Exception exception) { + getOwner().handleException(exception); + } + } + + /** + * Performs the search of the field with specified {@code name} + * in specified context and returns its value. + * + * @param bean the context bean that contains field + * @param name the name of the field + * @return the value of the field + * @throws IllegalAccessException if the field is not accesible + * @throws NoSuchFieldException if the field is not found + */ + static Object getFieldValue(Object bean, String name) throws IllegalAccessException, NoSuchFieldException { + return findField(bean, name).get(bean); + } + + /** + * Performs the search of the field with specified {@code name} + * in specified context and updates its value. + * + * @param bean the context bean that contains field + * @param name the name of the field + * @param value the new value for the field + * @throws IllegalAccessException if the field is not accesible + * @throws NoSuchFieldException if the field is not found + */ + private static void setFieldValue(Object bean, String name, Object value) throws IllegalAccessException, NoSuchFieldException { + findField(bean, name).set(bean, value); + } + + /** + * Performs the search of the field + * with specified {@code name} in specified context. + * + * @param bean the context bean that contains field + * @param name the name of the field + * @return field object that represents found field + * @throws NoSuchFieldException if the field is not found + */ + private static Field findField(Object bean, String name) throws NoSuchFieldException { + return (bean instanceof Class) + ? FieldFinder.findStaticField((Class) bean, name) + : FieldFinder.findField(bean.getClass(), name); + } +} diff --git a/jdk/src/share/classes/com/sun/beans/decoder/FloatElementHandler.java b/jdk/src/share/classes/com/sun/beans/decoder/FloatElementHandler.java new file mode 100644 index 00000000000..08311b49f29 --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/decoder/FloatElementHandler.java @@ -0,0 +1,63 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This class is intended to handle <float> element. + * This element specifies {@code float} values. + * The class {@link Float} is used as wrapper for these values. + * The result value is created from text of the body of this element. + * The body parsing is described in the class {@link StringElementHandler}. + * For example:
+ * <float>-1.23</float>
+ * is shortcut to
+ * <method name="valueOf" class="java.lang.Float">
+ *     <string>-1.23</string>
+ * </method>
+ * which is equivalent to {@code Float.valueOf("-1.23")} in Java code. + *

The following atribute is supported: + *

+ *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class FloatElementHandler extends StringElementHandler { + + /** + * Creates {@code float} value from + * the text of the body of this element. + * + * @param argument the text of the body + * @return evaluated {@code float} value + */ + @Override + public Object getValue(String argument) { + return Float.valueOf(argument); + } +} diff --git a/jdk/src/share/classes/com/sun/beans/decoder/IntElementHandler.java b/jdk/src/share/classes/com/sun/beans/decoder/IntElementHandler.java new file mode 100644 index 00000000000..ec5063fcd8e --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/decoder/IntElementHandler.java @@ -0,0 +1,63 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This class is intended to handle <int> element. + * This element specifies {@code int} values. + * The class {@link Integer} is used as wrapper for these values. + * The result value is created from text of the body of this element. + * The body parsing is described in the class {@link StringElementHandler}. + * For example:
+ * <int>-1</int>
+ * is shortcut to
+ * <method name="decode" class="java.lang.Integer">
+ *     <string>-1</string>
+ * </method>
+ * which is equivalent to {@code Integer.decode("-1")} in Java code. + *

The following atribute is supported: + *

+ *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class IntElementHandler extends StringElementHandler { + + /** + * Creates {@code int} value from + * the text of the body of this element. + * + * @param argument the text of the body + * @return evaluated {@code int} value + */ + @Override + public Object getValue(String argument) { + return Integer.decode(argument); + } +} diff --git a/jdk/src/share/classes/com/sun/beans/decoder/JavaElementHandler.java b/jdk/src/share/classes/com/sun/beans/decoder/JavaElementHandler.java new file mode 100644 index 00000000000..2d416a139fb --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/decoder/JavaElementHandler.java @@ -0,0 +1,151 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +import java.beans.XMLDecoder; + +/** + * This class is intended to handle <java> element. + * Each element that appears in the body of this element + * is evaluated in the context of the decoder itself. + * Typically this outer context is used to retrieve the owner of the decoder, + * which can be set before reading the archive. + *

The following atributes are supported: + *

+ *
version + *
the Java version (not supported) + *
class + *
the type of preferable parser (not supported) + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @see DocumentHandler#getOwner + * @see DocumentHandler#setOwner + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class JavaElementHandler extends ElementHandler { + private Class type; + private ValueObject value; + + /** + * Parses attributes of the element. + * The following atributes are supported: + *
+ *
version + *
the Java version (not supported) + *
class + *
the type of preferable parser (not supported) + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @param name the attribute name + * @param value the attribute value + */ + @Override + public void addAttribute(String name, String value) { + if (name.equals("version")) { // NON-NLS: the attribute name + // unsupported attribute + } else if (name.equals("class")) { // NON-NLS: the attribute name + // check class for owner + this.type = getOwner().findClass(value); + } else { + super.addAttribute(name, value); + } + } + + /** + * Adds the argument to the list of readed objects. + * + * @param argument the value of the element that contained in this one + */ + @Override + protected void addArgument(Object argument) { + getOwner().addObject(argument); + } + + /** + * Tests whether the value of this element can be used + * as an argument of the element that contained in this one. + * + * @return {@code true} if the value of this element should be used + * as an argument of the element that contained in this one, + * {@code false} otherwise + */ + @Override + protected boolean isArgument() { + return false; // do not use owner as object + } + + /** + * Returns the value of this element. + * + * @return the value of this element + */ + @Override + protected ValueObject getValueObject() { + if (this.value == null) { + this.value = ValueObjectImpl.create(getValue()); + } + return this.value; + } + + /** + * Returns the owner of the owner document handler + * as a value of <java> element. + * + * @return the owner of the owner document handler + */ + private Object getValue() { + Object owner = getOwner().getOwner(); + if ((this.type == null) || isValid(owner)) { + return owner; + } + if (owner instanceof XMLDecoder) { + XMLDecoder decoder = (XMLDecoder) owner; + owner = decoder.getOwner(); + if (isValid(owner)) { + return owner; + } + } + throw new IllegalStateException("Unexpected owner class: " + owner.getClass().getName()); + } + + /** + * Validates the owner of the <java> element. + * The owner is valid if it is {@code null} or an instance + * of the class specified by the {@code class} attribute. + * + * @param owner the owner of the <java> element + * @return {@code true} if the {@code owner} is valid; + * {@code false} otherwise + */ + private boolean isValid(Object owner) { + return (owner == null) || this.type.isInstance(owner); + } +} diff --git a/jdk/src/share/classes/com/sun/beans/decoder/LongElementHandler.java b/jdk/src/share/classes/com/sun/beans/decoder/LongElementHandler.java new file mode 100644 index 00000000000..a26f2f57fb6 --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/decoder/LongElementHandler.java @@ -0,0 +1,63 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This class is intended to handle <long> element. + * This element specifies {@code long} values. + * The class {@link Long} is used as wrapper for these values. + * The result value is created from text of the body of this element. + * The body parsing is described in the class {@link StringElementHandler}. + * For example:
+ * <long>0xFFFF</long>
+ * is shortcut to
+ * <method name="decode" class="java.lang.Long">
+ *     <string>0xFFFF</string>
+ * </method>
+ * which is equivalent to {@code Long.decode("0xFFFF")} in Java code. + *

The following atribute is supported: + *

+ *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class LongElementHandler extends StringElementHandler { + + /** + * Creates {@code long} value from + * the text of the body of this element. + * + * @param argument the text of the body + * @return evaluated {@code long} value + */ + @Override + public Object getValue(String argument) { + return Long.decode(argument); + } +} diff --git a/jdk/src/share/classes/com/sun/beans/decoder/MethodElementHandler.java b/jdk/src/share/classes/com/sun/beans/decoder/MethodElementHandler.java new file mode 100644 index 00000000000..34d030c90b3 --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/decoder/MethodElementHandler.java @@ -0,0 +1,109 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +import com.sun.beans.finder.MethodFinder; + +import java.lang.reflect.Method; + +/** + * This class is intended to handle <method> element. + * It describes invocation of the method. + * The {@code name} attribute denotes + * the name of the method to invoke. + * If the {@code class} attribute is specified + * this element invokes static method of specified class. + * The inner elements specifies the arguments of the method. + * For example:
+ * <method name="valueOf" class="java.lang.Long">
+ *     <string>10</string>
+ * </method>
+ * is equivalent to {@code Long.valueOf("10")} in Java code. + *

The following atributes are supported: + *

+ *
name + *
the method name + *
class + *
the type of object for instantiation + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class MethodElementHandler extends NewElementHandler { + private String name; + + /** + * Parses attributes of the element. + * The following atributes are supported: + *
+ *
name + *
the method name + *
class + *
the type of object for instantiation + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @param name the attribute name + * @param value the attribute value + */ + @Override + public void addAttribute(String name, String value) { + if (name.equals("name")) { // NON-NLS: the attribute name + this.name = value; + } else { + super.addAttribute(name, value); + } + } + + /** + * Returns the result of method execution. + * + * @param type the base class + * @param args the array of arguments + * @return the value of this element + * @throws Exception if calculation is failed + */ + @Override + protected ValueObject getValueObject(Class type, Object[] args) throws Exception { + Object bean = getContextBean(); + Class[] types = getArgumentTypes(args); + Method method = (type != null) + ? MethodFinder.findStaticMethod(type, this.name, types) + : MethodFinder.findMethod(bean.getClass(), this.name, types); + + if (method.isVarArgs()) { + args = getArguments(args, method.getParameterTypes()); + } + Object value = method.invoke(bean, args); + return method.getReturnType().equals(void.class) + ? ValueObjectImpl.VOID + : ValueObjectImpl.create(value); + } +} diff --git a/jdk/src/share/classes/com/sun/beans/decoder/NewElementHandler.java b/jdk/src/share/classes/com/sun/beans/decoder/NewElementHandler.java new file mode 100644 index 00000000000..fc7debfc500 --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/decoder/NewElementHandler.java @@ -0,0 +1,205 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +import com.sun.beans.finder.ConstructorFinder; + +import java.lang.reflect.Array; +import java.lang.reflect.Constructor; + +import java.util.ArrayList; +import java.util.List; + +/** + * This class is intended to handle <new> element. + * It describes instantiation of the object. + * The {@code class} attribute denotes + * the name of the class to instantiate. + * The inner elements specifies the arguments of the constructor. + * For example:
+ * <new class="java.lang.Long">
+ *     <string>10</string>
+ * </new>
+ * is equivalent to {@code new Long("10")} in Java code. + *

The following atributes are supported: + *

+ *
class + *
the type of object for instantiation + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +class NewElementHandler extends ElementHandler { + private List arguments = new ArrayList(); + private ValueObject value = ValueObjectImpl.VOID; + + private Class type; + + /** + * Parses attributes of the element. + * The following atributes are supported: + *
+ *
class + *
the type of object for instantiation + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @param name the attribute name + * @param value the attribute value + */ + @Override + public void addAttribute(String name, String value) { + if (name.equals("class")) { // NON-NLS: the attribute name + this.type = getOwner().findClass(value); + } else { + super.addAttribute(name, value); + } + } + + /** + * Adds the argument to the list of arguments + * that is used to calculate the value of this element. + * + * @param argument the value of the element that contained in this one + */ + @Override + protected final void addArgument(Object argument) { + if (this.arguments == null) { + throw new IllegalStateException("Could not add argument to evaluated element"); + } + this.arguments.add(argument); + } + + /** + * Returns the context of the method. + * The context of the static method is the class object. + * The context of the non-static method is the value of the parent element. + * + * @return the context of the method + */ + @Override + protected final Object getContextBean() { + return (this.type != null) + ? this.type + : super.getContextBean(); + } + + /** + * Returns the value of this element. + * + * @return the value of this element + */ + @Override + protected final ValueObject getValueObject() { + if (this.arguments != null) { + try { + this.value = getValueObject(this.type, this.arguments.toArray()); + } + catch (Exception exception) { + getOwner().handleException(exception); + } + finally { + this.arguments = null; + } + } + return this.value; + } + + /** + * Calculates the value of this element + * using the base class and the array of arguments. + * By default, it creates an instance of the base class. + * This method should be overridden in those handlers + * that extend behavior of this element. + * + * @param type the base class + * @param args the array of arguments + * @return the value of this element + * @throws Exception if calculation is failed + */ + ValueObject getValueObject(Class type, Object[] args) throws Exception { + if (type == null) { + throw new IllegalArgumentException("Class name is not set"); + } + Class[] types = getArgumentTypes(args); + Constructor constructor = ConstructorFinder.findConstructor(type, types); + if (constructor.isVarArgs()) { + args = getArguments(args, constructor.getParameterTypes()); + } + return ValueObjectImpl.create(constructor.newInstance(args)); + } + + /** + * Converts the array of arguments to the array of corresponding classes. + * If argument is {@code null} the class is {@code null} too. + * + * @param arguments the array of arguments + * @return the array of corresponding classes + */ + static Class[] getArgumentTypes(Object[] arguments) { + Class[] types = new Class[arguments.length]; + for (int i = 0; i < arguments.length; i++) { + if (arguments[i] != null) { + types[i] = arguments[i].getClass(); + } + } + return types; + } + + /** + * Resolves variable arguments. + * + * @param arguments the array of arguments + * @param types the array of parameter types + * @return the resolved array of arguments + */ + static Object[] getArguments(Object[] arguments, Class[] types) { + int index = types.length - 1; + if (types.length == arguments.length) { + Object argument = arguments[index]; + if (argument == null) { + return arguments; + } + Class type = types[index]; + if (type.isAssignableFrom(argument.getClass())) { + return arguments; + } + } + int length = arguments.length - index; + Class type = types[index].getComponentType(); + Object array = Array.newInstance(type, length); + System.arraycopy(arguments, index, array, 0, length); + + Object[] args = new Object[types.length]; + System.arraycopy(arguments, 0, args, 0, index); + args[index] = array; + return args; + } +} diff --git a/jdk/src/share/classes/com/sun/beans/decoder/NullElementHandler.java b/jdk/src/share/classes/com/sun/beans/decoder/NullElementHandler.java new file mode 100644 index 00000000000..a3e2d699c39 --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/decoder/NullElementHandler.java @@ -0,0 +1,76 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This class is intended to handle <null> element. + * This element specifies {@code null} value. + * It should not contain body or inner elements. + * For example:
+ * <null/>
+ * is equivalent to {@code null} in Java code. + *

The following atribute is supported: + *

+ *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +class NullElementHandler extends ElementHandler implements ValueObject { + + /** + * Returns the value of this element. + * + * @return the value of this element + */ + @Override + protected final ValueObject getValueObject() { + return this; + } + + /** + * Returns {@code null} + * as a value of <null> element. + * This method should be overridden in those handlers + * that extend behavior of this element. + * + * @return {@code null} by default + */ + public Object getValue() { + return null; + } + + /** + * Returns {@code void} state of this value object. + * + * @return {@code false} always + */ + public final boolean isVoid() { + return false; + } +} diff --git a/jdk/src/share/classes/com/sun/beans/decoder/ObjectElementHandler.java b/jdk/src/share/classes/com/sun/beans/decoder/ObjectElementHandler.java new file mode 100644 index 00000000000..3ab5ddca942 --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/decoder/ObjectElementHandler.java @@ -0,0 +1,168 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +import java.beans.Expression; + +import static java.util.Locale.ENGLISH; + +/** + * This class is intended to handle <object> element. + * This element looks like <void> element, + * but its value is always used as an argument for element + * that contains this one. + *

The following atributes are supported: + *

+ *
class + *
the type is used for static methods and fields + *
method + *
the method name + *
property + *
the property name + *
index + *
the property index + *
field + *
the field name + *
idref + *
the identifier to refer to the variable + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +class ObjectElementHandler extends NewElementHandler { + private String idref; + private String field; + private Integer index; + private String property; + private String method; + + /** + * Parses attributes of the element. + * The following atributes are supported: + *
+ *
class + *
the type is used for static methods and fields + *
method + *
the method name + *
property + *
the property name + *
index + *
the property index + *
field + *
the field name + *
idref + *
the identifier to refer to the variable + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @param name the attribute name + * @param value the attribute value + */ + @Override + public final void addAttribute(String name, String value) { + if (name.equals("idref")) { // NON-NLS: the attribute name + this.idref = value; + } else if (name.equals("field")) { // NON-NLS: the attribute name + this.field = value; + } else if (name.equals("index")) { // NON-NLS: the attribute name + this.index = Integer.valueOf(value); + addArgument(this.index); // hack for compatibility + } else if (name.equals("property")) { // NON-NLS: the attribute name + this.property = value; + } else if (name.equals("method")) { // NON-NLS: the attribute name + this.method = value; + } else { + super.addAttribute(name, value); + } + } + + /** + * Calculates the value of this element + * if the field attribute or the idref attribute is set. + */ + @Override + public final void startElement() { + if ((this.field != null) || (this.idref != null)) { + getValueObject(); + } + } + + /** + * Tests whether the value of this element can be used + * as an argument of the element that contained in this one. + * + * @return {@code true} if the value of this element can be used + * as an argument of the element that contained in this one, + * {@code false} otherwise + */ + @Override + protected boolean isArgument() { + return true; // hack for compatibility + } + + /** + * Creates the value of this element. + * + * @param type the base class + * @param args the array of arguments + * @return the value of this element + * @throws Exception if calculation is failed + */ + @Override + protected final ValueObject getValueObject(Class type, Object[] args) throws Exception { + if (this.field != null) { + return ValueObjectImpl.create(FieldElementHandler.getFieldValue(getContextBean(), this.field)); + } + if (this.idref != null) { + return ValueObjectImpl.create(getVariable(this.idref)); + } + Object bean = getContextBean(); + String name; + if (this.index != null) { + name = (args.length == 2) + ? PropertyElementHandler.SETTER + : PropertyElementHandler.GETTER; + } else if (this.property != null) { + name = (args.length == 1) + ? PropertyElementHandler.SETTER + : PropertyElementHandler.GETTER; + + if (0 < this.property.length()) { + name += this.property.substring(0, 1).toUpperCase(ENGLISH) + this.property.substring(1); + } + } else { + name = (this.method != null) && (0 < this.method.length()) + ? this.method + : "new"; // NON-NLS: the constructor marker + } + Expression expression = new Expression(bean, name, args); + return ValueObjectImpl.create(expression.getValue()); + } +} diff --git a/jdk/src/share/classes/com/sun/beans/decoder/PropertyElementHandler.java b/jdk/src/share/classes/com/sun/beans/decoder/PropertyElementHandler.java new file mode 100644 index 00000000000..dcc55062945 --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/decoder/PropertyElementHandler.java @@ -0,0 +1,287 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +import com.sun.beans.finder.MethodFinder; + +import java.beans.IndexedPropertyDescriptor; +import java.beans.IntrospectionException; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; + +import java.lang.reflect.Array; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +/** + * This class is intended to handle <property> element. + * This element simplifies access to the properties. + * If the {@code index} attribute is specified + * this element uses additional {@code int} parameter. + * If the {@code name} attribute is not specified + * this element uses method "get" as getter + * and method "set" as setter. + * This element defines getter if it contains no argument. + * It returns the value of the property in this case. + * For example:
+ * <property name="object" index="10"/>
+ * is shortcut to
+ * <method name="getObject">
+ *     <int>10</int>
+ * </method>
+ * which is equivalent to {@code getObject(10)} in Java code. + * This element defines setter if it contains one argument. + * It does not return the value of the property in this case. + * For example:
+ * <property><int>0</int></property>
+ * is shortcut to
+ * <method name="set">
+ *     <int>0</int>
+ * </method>
+ * which is equivalent to {@code set(0)} in Java code. + *

The following atributes are supported: + *

+ *
name + *
the property name + *
index + *
the property index + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class PropertyElementHandler extends AccessorElementHandler { + static final String GETTER = "get"; // NON-NLS: the getter prefix + static final String SETTER = "set"; // NON-NLS: the setter prefix + + private Integer index; + + /** + * Parses attributes of the element. + * The following atributes are supported: + *
+ *
name + *
the property name + *
index + *
the property index + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @param name the attribute name + * @param value the attribute value + */ + @Override + public void addAttribute(String name, String value) { + if (name.equals("index")) { // NON-NLS: the attribute name + this.index = Integer.valueOf(value); + } else { + super.addAttribute(name, value); + } + } + + /** + * Tests whether the value of this element can be used + * as an argument of the element that contained in this one. + * + * @return {@code true} if the value of this element should be used + * as an argument of the element that contained in this one, + * {@code false} otherwise + */ + @Override + protected boolean isArgument() { + return false; // non-static accessor cannot be used an argument + } + + /** + * Returns the value of the property with specified {@code name}. + * + * @param name the name of the property + * @return the value of the specified property + */ + @Override + protected Object getValue(String name) { + try { + return getPropertyValue(getContextBean(), name, this.index); + } + catch (Exception exception) { + getOwner().handleException(exception); + } + return null; + } + + /** + * Sets the new value for the property with specified {@code name}. + * + * @param name the name of the property + * @param value the new value for the specified property + */ + @Override + protected void setValue(String name, Object value) { + try { + setPropertyValue(getContextBean(), name, this.index, value); + } + catch (Exception exception) { + getOwner().handleException(exception); + } + } + + /** + * Performs the search of the getter for the property + * with specified {@code name} in specified class + * and returns value of the property. + * + * @param bean the context bean that contains property + * @param name the name of the property + * @param index the index of the indexed property + * @return the value of the property + * @throws IllegalAccessException if the property is not accesible + * @throws IntrospectionException if the bean introspection is failed + * @throws InvocationTargetException if the getter cannot be invoked + * @throws NoSuchMethodException if the getter is not found + */ + private static Object getPropertyValue(Object bean, String name, Integer index) throws IllegalAccessException, IntrospectionException, InvocationTargetException, NoSuchMethodException { + Class type = bean.getClass(); + if (index == null) { + return findGetter(type, name).invoke(bean); + } else if (type.isArray() && (name == null)) { + return Array.get(bean, index); + } else { + return findGetter(type, name, int.class).invoke(bean, index); + } + } + + /** + * Performs the search of the setter for the property + * with specified {@code name} in specified class + * and updates value of the property. + * + * @param bean the context bean that contains property + * @param name the name of the property + * @param index the index of the indexed property + * @param value the new value for the property + * @throws IllegalAccessException if the property is not accesible + * @throws IntrospectionException if the bean introspection is failed + * @throws InvocationTargetException if the setter cannot be invoked + * @throws NoSuchMethodException if the setter is not found + */ + private static void setPropertyValue(Object bean, String name, Integer index, Object value) throws IllegalAccessException, IntrospectionException, InvocationTargetException, NoSuchMethodException { + Class type = bean.getClass(); + Class param = (value != null) + ? value.getClass() + : null; + + if (index == null) { + findSetter(type, name, param).invoke(bean, value); + } else if (type.isArray() && (name == null)) { + Array.set(bean, index, value); + } else { + findSetter(type, name, int.class, param).invoke(bean, index, value); + } + } + + /** + * Performs the search of the getter for the property + * with specified {@code name} in specified class. + * + * @param type the class that contains method + * @param name the name of the property + * @param args the method arguments + * @return method object that represents found getter + * @throws IntrospectionException if the bean introspection is failed + * @throws NoSuchMethodException if method is not found + */ + private static Method findGetter(Class type, String name, Class...args) throws IntrospectionException, NoSuchMethodException { + if (name == null) { + return MethodFinder.findInstanceMethod(type, GETTER, args); + } + PropertyDescriptor pd = getProperty(type, name); + if (args.length == 0) { + Method method = pd.getReadMethod(); + if (method != null) { + return method; + } + } else if (pd instanceof IndexedPropertyDescriptor) { + IndexedPropertyDescriptor ipd = (IndexedPropertyDescriptor) pd; + Method method = ipd.getIndexedReadMethod(); + if (method != null) { + return method; + } + } + throw new IntrospectionException("Could not find getter for the " + name + " property"); + } + + /** + * Performs the search of the setter for the property + * with specified {@code name} in specified class. + * + * @param type the class that contains method + * @param name the name of the property + * @param args the method arguments + * @return method object that represents found setter + * @throws IntrospectionException if the bean introspection is failed + * @throws NoSuchMethodException if method is not found + */ + private static Method findSetter(Class type, String name, Class...args) throws IntrospectionException, NoSuchMethodException { + if (name == null) { + return MethodFinder.findInstanceMethod(type, SETTER, args); + } + PropertyDescriptor pd = getProperty(type, name); + if (args.length == 1) { + Method method = pd.getWriteMethod(); + if (method != null) { + return method; + } + } else if (pd instanceof IndexedPropertyDescriptor) { + IndexedPropertyDescriptor ipd = (IndexedPropertyDescriptor) pd; + Method method = ipd.getIndexedWriteMethod(); + if (method != null) { + return method; + } + } + throw new IntrospectionException("Could not find setter for the " + name + " property"); + } + + /** + * Performs the search of the descriptor for the property + * with specified {@code name} in specified class. + * + * @param type the class to introspect + * @param name the property name + * @return descriptor for the named property + * @throws IntrospectionException if property descriptor is not found + */ + private static PropertyDescriptor getProperty(Class type, String name) throws IntrospectionException { + for (PropertyDescriptor pd : Introspector.getBeanInfo(type).getPropertyDescriptors()) { + if (name.equals(pd.getName())) { + return pd; + } + } + throw new IntrospectionException("Could not find the " + name + " property descriptor"); + } +} diff --git a/jdk/src/share/classes/com/sun/beans/decoder/ShortElementHandler.java b/jdk/src/share/classes/com/sun/beans/decoder/ShortElementHandler.java new file mode 100644 index 00000000000..5f91e254424 --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/decoder/ShortElementHandler.java @@ -0,0 +1,63 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This class is intended to handle <short> element. + * This element specifies {@code short} values. + * The class {@link Short} is used as wrapper for these values. + * The result value is created from text of the body of this element. + * The body parsing is described in the class {@link StringElementHandler}. + * For example:
+ * <short>200</short>
+ * is shortcut to
+ * <method name="decode" class="java.lang.Short">
+ *     <string>200</string>
+ * </method>
+ * which is equivalent to {@code Short.decode("200")} in Java code. + *

The following atribute is supported: + *

+ *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class ShortElementHandler extends StringElementHandler { + + /** + * Creates {@code short} value from + * the text of the body of this element. + * + * @param argument the text of the body + * @return evaluated {@code short} value + */ + @Override + public Object getValue(String argument) { + return Short.decode(argument); + } +} diff --git a/jdk/src/share/classes/com/sun/beans/decoder/StringElementHandler.java b/jdk/src/share/classes/com/sun/beans/decoder/StringElementHandler.java new file mode 100644 index 00000000000..6075f436aa0 --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/decoder/StringElementHandler.java @@ -0,0 +1,116 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This class is intended to handle <string> element. + * This element specifies {@link String} values. + * The result value is created from text of the body of this element. + * For example:
+ * <string>description</string>
+ * is equivalent to {@code "description"} in Java code. + * The value of inner element is calculated + * before adding to the string using {@link String#valueOf(Object)}. + * Note that all characters are used including whitespaces (' ', '\t', '\n', '\r'). + * So the value of the element
+ * <string><true></string>
+ * is not equal to the value of the element
+ * <string>
+ *     <true>
+ * </string>
+ *

The following atribute is supported: + *

+ *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +public class StringElementHandler extends ElementHandler { + private StringBuilder sb = new StringBuilder(); + private ValueObject value = ValueObjectImpl.NULL; + + /** + * Adds the character that contained in this element. + * + * @param ch the character + */ + @Override + public final void addCharacter(char ch) { + if (this.sb == null) { + throw new IllegalStateException("Could not add chararcter to evaluated string element"); + } + this.sb.append(ch); + } + + /** + * Adds the string value of the argument to the string value of this element. + * + * @param argument the value of the element that contained in this one + */ + @Override + protected final void addArgument(Object argument) { + if (this.sb == null) { + throw new IllegalStateException("Could not add argument to evaluated string element"); + } + this.sb.append(argument); + } + + /** + * Returns the value of this element. + * + * @return the value of this element + */ + @Override + protected final ValueObject getValueObject() { + if (this.sb != null) { + try { + this.value = ValueObjectImpl.create(getValue(this.sb.toString())); + } + catch (RuntimeException exception) { + getOwner().handleException(exception); + } + finally { + this.sb = null; + } + } + return this.value; + } + + /** + * Returns the text of the body of this element. + * This method evaluates value from text of the body, + * and should be overridden in those handlers + * that extend behavior of this element. + * + * @param argument the text of the body + * @return evaluated value + */ + protected Object getValue(String argument) { + return argument; + } +} diff --git a/jdk/src/share/classes/com/sun/beans/decoder/TrueElementHandler.java b/jdk/src/share/classes/com/sun/beans/decoder/TrueElementHandler.java new file mode 100644 index 00000000000..faf8904d4d0 --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/decoder/TrueElementHandler.java @@ -0,0 +1,56 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This class is intended to handle <true> element. + * This element specifies {@code true} value. + * It should not contain body or inner elements. + * For example:
+ * <true/>
+ * is equivalent to {@code true} in Java code. + *

The following atribute is supported: + *

+ *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class TrueElementHandler extends NullElementHandler { + + /** + * Returns {@code Boolean.TRUE} + * as a value of <true> element. + * + * @return {@code Boolean.TRUE} by default + */ + @Override + public Object getValue() { + return Boolean.TRUE; + } +} diff --git a/jdk/src/share/classes/com/sun/beans/decoder/ValueObject.java b/jdk/src/share/classes/com/sun/beans/decoder/ValueObject.java new file mode 100644 index 00000000000..04f28278e34 --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/decoder/ValueObject.java @@ -0,0 +1,50 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This interface represents the result of method execution. + * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +public interface ValueObject { + + /** + * Returns the result of method execution. + * + * @return the result of method execution + */ + Object getValue(); + + /** + * Returns {@code void} state of this value object. + * + * @return {@code true} if value can be ignored, + * {@code false} otherwise + */ + boolean isVoid(); +} diff --git a/jdk/src/share/classes/com/sun/beans/decoder/ValueObjectImpl.java b/jdk/src/share/classes/com/sun/beans/decoder/ValueObjectImpl.java new file mode 100644 index 00000000000..cb891fe6c61 --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/decoder/ValueObjectImpl.java @@ -0,0 +1,88 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This utility class provides {@code static} method + * to create the object that contains the result of method execution. + * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class ValueObjectImpl implements ValueObject { + static final ValueObject NULL = new ValueObjectImpl(null); + static final ValueObject VOID = new ValueObjectImpl(); + + /** + * Returns the object that describes returning value. + * + * @param value the result of method execution + * @return the object that describes value + */ + static ValueObject create(Object value) { + return (value != null) + ? new ValueObjectImpl(value) + : NULL; + } + + private Object value; + private boolean isVoid; + + /** + * Creates the object that describes returning void value. + */ + private ValueObjectImpl() { + this.isVoid = true; + } + + /** + * Creates the object that describes returning non-void value. + * + * @param value the result of method execution + */ + private ValueObjectImpl(Object value) { + this.value = value; + } + + /** + * Returns the result of method execution. + * + * @return the result of method execution + */ + public Object getValue() { + return this.value; + } + + /** + * Returns {@code void} state of this value object. + * + * @return {@code true} if value should be ignored, + * {@code false} otherwise + */ + public boolean isVoid() { + return this.isVoid; + } +} diff --git a/jdk/src/share/classes/com/sun/beans/decoder/VarElementHandler.java b/jdk/src/share/classes/com/sun/beans/decoder/VarElementHandler.java new file mode 100644 index 00000000000..d948c18e538 --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/decoder/VarElementHandler.java @@ -0,0 +1,82 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This class is intended to handle <var> element. + * This element retrieves the value of specified variable. + * For example:
+ * <var id="id1" idref="id2"/>
+ * is equivalent to {@code id1 = id2} in Java code. + *

The following atributes are supported: + *

+ *
idref + *
the identifier to refer to the variable + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class VarElementHandler extends ElementHandler { + private ValueObject value; + + /** + * Parses attributes of the element. + * The following atributes are supported: + *
+ *
idref + *
the identifier to refer to the variable + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @param name the attribute name + * @param value the attribute value + */ + @Override + public void addAttribute(String name, String value) { + if (name.equals("idref")) { // NON-NLS: the attribute name + this.value = ValueObjectImpl.create(getVariable(value)); + } else { + super.addAttribute(name, value); + } + } + + /** + * Returns the value of this element. + * + * @return the value of this element + */ + @Override + protected ValueObject getValueObject() { + if (this.value == null) { + throw new IllegalArgumentException("Variable name is not set"); + } + return this.value; + } +} diff --git a/jdk/src/share/classes/com/sun/beans/decoder/VoidElementHandler.java b/jdk/src/share/classes/com/sun/beans/decoder/VoidElementHandler.java new file mode 100644 index 00000000000..44726a0f7a1 --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/decoder/VoidElementHandler.java @@ -0,0 +1,68 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.decoder; + +/** + * This class is intended to handle <void> element. + * This element looks like <object> element, + * but its value is not used as an argument for element + * that contains this one. + *

The following atributes are supported: + *

+ *
class + *
the type is used for static methods and fields + *
method + *
the method name + *
property + *
the property name + *
index + *
the property index + *
field + *
the field name + *
idref + *
the identifier to refer to the variable + *
id + *
the identifier of the variable that is intended to store the result + *
+ * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class VoidElementHandler extends ObjectElementHandler { + + /** + * Tests whether the value of this element can be used + * as an argument of the element that contained in this one. + * + * @return {@code true} if the value of this element should be used + * as an argument of the element that contained in this one, + * {@code false} otherwise + */ + @Override + protected boolean isArgument() { + return false; // hack for compatibility + } +} diff --git a/jdk/src/share/classes/com/sun/beans/finder/AbstractFinder.java b/jdk/src/share/classes/com/sun/beans/finder/AbstractFinder.java new file mode 100644 index 00000000000..396d6cbf8f8 --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/finder/AbstractFinder.java @@ -0,0 +1,213 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.finder; + +import java.util.HashMap; +import java.util.Map; + +/** + * This abstract class provides functionality + * to find a public method or constructor + * with specified parameter types. + * It supports a variable number of parameters. + * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +abstract class AbstractFinder { + private final Class[] args; + + /** + * Creates finder for array of classes of arguments. + * If a particular element of array equals {@code null}, + * than the appropriate pair of classes + * does not take into consideration. + * + * @param args array of classes of arguments + */ + protected AbstractFinder(Class[] args) { + this.args = args; + } + + /** + * Returns an array of {@code Class} objects + * that represent the formal parameter types of the method + * Returns an empty array if the method takes no parameters. + * + * @param method the object that represents method + * @return the parameter types of the method + */ + protected abstract Class[] getParameters(T method); + + /** + * Returns {@code true} if and only if the method + * was declared to take a variable number of arguments. + * + * @param method the object that represents method + * @return {@code true} if the method was declared + * to take a variable number of arguments; + * {@code false} otherwise + */ + protected abstract boolean isVarArgs(T method); + + /** + * Checks validness of the method. + * At least the valid method should be public. + * + * @param method the object that represents method + * @return {@code true} if the method is valid, + * {@code false} otherwise + */ + protected abstract boolean isValid(T method); + + /** + * Performs a search in the {@code methods} array. + * The one method is selected from the array of the valid methods. + * The list of parameters of the selected method shows + * the best correlation with the list of arguments + * specified at class initialization. + * If more than one method is both accessible and applicable + * to a method invocation, it is necessary to choose one + * to provide the descriptor for the run-time method dispatch. + * The most specific method should be chosen. + * + * @param methods the array of methods to search within + * @return the object that represents found method + * @throws NoSuchMethodException if no method was found or several + * methods meet the search criteria + * @see #isAssignable + */ + final T find(T[] methods) throws NoSuchMethodException { + Map[]> map = new HashMap[]>(); + + T oldMethod = null; + Class[] oldParams = null; + boolean ambiguous = false; + + for (T newMethod : methods) { + if (isValid(newMethod)) { + Class[] newParams = getParameters(newMethod); + if (newParams.length == this.args.length) { + PrimitiveWrapperMap.replacePrimitivesWithWrappers(newParams); + if (isAssignable(newParams, this.args)) { + if (oldMethod == null) { + oldMethod = newMethod; + oldParams = newParams; + } else { + boolean useNew = isAssignable(oldParams, newParams); + boolean useOld = isAssignable(newParams, oldParams); + + if (useOld == useNew) { + ambiguous = true; + } else if (useNew) { + oldMethod = newMethod; + oldParams = newParams; + ambiguous = false; + } + } + } + } + if (isVarArgs(newMethod)) { + int length = newParams.length - 1; + if (length <= this.args.length) { + Class[] array = new Class[this.args.length]; + System.arraycopy(newParams, 0, array, 0, length); + if (length < this.args.length) { + Class type = newParams[length].getComponentType(); + if (type.isPrimitive()) { + type = PrimitiveWrapperMap.getType(type.getName()); + } + for (int i = length; i < this.args.length; i++) { + array[i] = type; + } + } + map.put(newMethod, array); + } + } + } + } + for (T newMethod : methods) { + Class[] newParams = map.get(newMethod); + if (newParams != null) { + if (isAssignable(newParams, this.args)) { + if (oldMethod == null) { + oldMethod = newMethod; + oldParams = newParams; + } else { + boolean useNew = isAssignable(oldParams, newParams); + boolean useOld = isAssignable(newParams, oldParams); + + if (useOld == useNew) { + if (oldParams == map.get(oldMethod)) { + ambiguous = true; + } + } else if (useNew) { + oldMethod = newMethod; + oldParams = newParams; + ambiguous = false; + } + } + } + } + } + + if (ambiguous) { + throw new NoSuchMethodException("Ambiguous methods are found"); + } + if (oldMethod == null) { + throw new NoSuchMethodException("Method is not found"); + } + return oldMethod; + } + + /** + * Determines if every class in {@code min} array is either the same as, + * or is a superclass of, the corresponding class in {@code max} array. + * The length of every array must equal the number of arguments. + * This comparison is performed in the {@link #find} method + * before the first call of the isAssignable method. + * If an argument equals {@code null} + * the appropriate pair of classes does not take into consideration. + * + * @param min the array of classes to be checked + * @param max the array of classes that is used to check + * @return {@code true} if all classes in {@code min} array + * are assignable from corresponding classes in {@code max} array, + * {@code false} otherwise + * + * @see Class#isAssignableFrom + */ + private boolean isAssignable(Class[] min, Class[] max) { + for (int i = 0; i < this.args.length; i++) { + if (null != this.args[i]) { + if (!min[i].isAssignableFrom(max[i])) { + return false; + } + } + } + return true; + } +} diff --git a/jdk/src/share/classes/com/sun/beans/finder/ClassFinder.java b/jdk/src/share/classes/com/sun/beans/finder/ClassFinder.java index 79b77415653..01a72fa5809 100644 --- a/jdk/src/share/classes/com/sun/beans/finder/ClassFinder.java +++ b/jdk/src/share/classes/com/sun/beans/finder/ClassFinder.java @@ -1,5 +1,5 @@ /* - * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2006-2008 Sun Microsystems, Inc. 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 @@ -25,7 +25,7 @@ package com.sun.beans.finder; /** - * This is utility class that provides static methods + * This is utility class that provides {@code static} methods * to find a class with the specified name using the specified class loader. * * @since 1.7 @@ -33,137 +33,138 @@ package com.sun.beans.finder; * @author Sergey A. Malenkov */ public final class ClassFinder { + /** - * Returns the Class object associated + * Returns the {@code Class} object associated * with the class or interface with the given string name, * using the default class loader. *

- * The name can denote an array class + * The {@code name} can denote an array class * (see {@link Class#getName} for details). * * @param name fully qualified name of the desired class * @return class object representing the desired class * - * @exception ClassNotFoundException if the class cannot be located - * by the specified class loader + * @throws ClassNotFoundException if the class cannot be located + * by the specified class loader * * @see Class#forName(String) * @see Class#forName(String,boolean,ClassLoader) * @see ClassLoader#getSystemClassLoader() * @see Thread#getContextClassLoader() */ - public static Class findClass( String name ) throws ClassNotFoundException { + public static Class findClass(String name) throws ClassNotFoundException { try { ClassLoader loader = Thread.currentThread().getContextClassLoader(); - if ( loader == null ) { + if (loader == null) { // can be null in IE (see 6204697) loader = ClassLoader.getSystemClassLoader(); } - if ( loader != null ) { - return Class.forName( name, false, loader ); + if (loader != null) { + return Class.forName(name, false, loader); } - } catch ( ClassNotFoundException exception ) { + } catch (ClassNotFoundException exception) { // use current class loader instead - } catch ( SecurityException exception ) { + } catch (SecurityException exception) { // use current class loader instead } - return Class.forName( name ); + return Class.forName(name); } /** - * Returns the Class object associated with + * Returns the {@code Class} object associated with * the class or interface with the given string name, * using the given class loader. *

- * The name can denote an array class + * The {@code name} can denote an array class * (see {@link Class#getName} for details). *

- * If the parameter loader is null, + * If the parameter {@code loader} is null, * the class is loaded through the default class loader. * * @param name fully qualified name of the desired class * @param loader class loader from which the class must be loaded * @return class object representing the desired class * - * @exception ClassNotFoundException if the class cannot be located - * by the specified class loader + * @throws ClassNotFoundException if the class cannot be located + * by the specified class loader * * @see #findClass(String,ClassLoader) * @see Class#forName(String,boolean,ClassLoader) */ - public static Class findClass( String name, ClassLoader loader ) throws ClassNotFoundException { - if ( loader != null ) { + public static Class findClass(String name, ClassLoader loader) throws ClassNotFoundException { + if (loader != null) { try { - return Class.forName( name, false, loader ); - } catch ( ClassNotFoundException exception ) { + return Class.forName(name, false, loader); + } catch (ClassNotFoundException exception) { // use default class loader instead - } catch ( SecurityException exception ) { + } catch (SecurityException exception) { // use default class loader instead } } - return findClass( name ); + return findClass(name); } /** - * Returns the Class object associated + * Returns the {@code Class} object associated * with the class or interface with the given string name, * using the default class loader. *

- * The name can denote an array class + * The {@code name} can denote an array class * (see {@link Class#getName} for details). *

* This method can be used to obtain - * any of the Class objects - * representing void or primitive Java types: - * char, byte, short, - * int, long, float, - * double and boolean. + * any of the {@code Class} objects + * representing {@code void} or primitive Java types: + * {@code char}, {@code byte}, {@code short}, + * {@code int}, {@code long}, {@code float}, + * {@code double} and {@code boolean}. * * @param name fully qualified name of the desired class * @return class object representing the desired class * - * @exception ClassNotFoundException if the class cannot be located - * by the specified class loader + * @throws ClassNotFoundException if the class cannot be located + * by the specified class loader * * @see #resolveClass(String,ClassLoader) */ - public static Class resolveClass( String name ) throws ClassNotFoundException { - return resolveClass( name, null ); + public static Class resolveClass(String name) throws ClassNotFoundException { + return resolveClass(name, null); } /** - * Returns the Class object associated with + * Returns the {@code Class} object associated with * the class or interface with the given string name, * using the given class loader. *

- * The name can denote an array class + * The {@code name} can denote an array class * (see {@link Class#getName} for details). *

- * If the parameter loader is null, + * If the parameter {@code loader} is null, * the class is loaded through the default class loader. *

* This method can be used to obtain - * any of the Class objects - * representing void or primitive Java types: - * char, byte, short, - * int, long, float, - * double and boolean. + * any of the {@code Class} objects + * representing {@code void} or primitive Java types: + * {@code char}, {@code byte}, {@code short}, + * {@code int}, {@code long}, {@code float}, + * {@code double} and {@code boolean}. * * @param name fully qualified name of the desired class * @param loader class loader from which the class must be loaded * @return class object representing the desired class * - * @exception ClassNotFoundException if the class cannot be located - * by the specified class loader + * @throws ClassNotFoundException if the class cannot be located + * by the specified class loader * * @see #findClass(String,ClassLoader) * @see PrimitiveTypeMap#getType(String) */ - public static Class resolveClass( String name, ClassLoader loader ) throws ClassNotFoundException { - Class type = PrimitiveTypeMap.getType( name ); - return ( type == null ) - ? findClass( name, loader ) + public static Class resolveClass(String name, ClassLoader loader) throws ClassNotFoundException { + Class type = PrimitiveTypeMap.getType(name); + return (type == null) + ? findClass(name, loader) : type; } diff --git a/jdk/src/share/classes/com/sun/beans/finder/ConstructorFinder.java b/jdk/src/share/classes/com/sun/beans/finder/ConstructorFinder.java new file mode 100644 index 00000000000..e7bb33421fe --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/finder/ConstructorFinder.java @@ -0,0 +1,127 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.finder; + +import com.sun.beans.WeakCache; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Modifier; + +/** + * This utility class provides {@code static} methods + * to find a public constructor with specified parameter types + * in specified class. + * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +public final class ConstructorFinder extends AbstractFinder> { + private static final WeakCache> CACHE = new WeakCache>(); + + /** + * Finds public constructor + * that is declared in public class. + * + * @param type the class that can have constructor + * @param args parameter types that is used to find constructor + * @return object that represents found constructor + * @throws NoSuchMethodException if constructor could not be found + * or some constructors are found + */ + public static Constructor findConstructor(Class type, Class...args) throws NoSuchMethodException { + if (type.isPrimitive()) { + throw new NoSuchMethodException("Primitive wrapper does not contain constructors"); + } + if (type.isInterface()) { + throw new NoSuchMethodException("Interface does not contain constructors"); + } + if (Modifier.isAbstract(type.getModifiers())) { + throw new NoSuchMethodException("Abstract class cannot be instantiated"); + } + if (!Modifier.isPublic(type.getModifiers())) { + throw new NoSuchMethodException("Class is not accessible"); + } + PrimitiveWrapperMap.replacePrimitivesWithWrappers(args); + Signature signature = new Signature(type, args); + + Constructor constructor = CACHE.get(signature); + if (constructor != null) { + return constructor; + } + constructor = new ConstructorFinder(args).find(type.getConstructors()); + CACHE.put(signature, constructor); + return constructor; + } + + /** + * Creates constructor finder with specified array of parameter types. + * + * @param args the array of parameter types + */ + private ConstructorFinder(Class[] args) { + super(args); + } + + /** + * Returns an array of {@code Class} objects + * that represent the formal parameter types of the constructor + * Returns an empty array if the constructor takes no parameters. + * + * @param constructor the object that represents constructor + * @return the parameter types of the constructor + */ + @Override + protected Class[] getParameters(Constructor constructor) { + return constructor.getParameterTypes(); + } + + /** + * Returns {@code true} if and only if the constructor + * was declared to take a variable number of arguments. + * + * @param constructor the object that represents constructor + * @return {@code true} if the constructor was declared + * to take a variable number of arguments; + * {@code false} otherwise + */ + @Override + protected boolean isVarArgs(Constructor constructor) { + return constructor.isVarArgs(); + } + + /** + * Checks validness of the constructor. + * The valid constructor should be public. + * + * @param constructor the object that represents constructor + * @return {@code true} if the constructor is valid, + * {@code false} otherwise + */ + @Override + protected boolean isValid(Constructor constructor) { + return Modifier.isPublic(constructor.getModifiers()); + } +} diff --git a/jdk/src/share/classes/com/sun/beans/finder/FieldFinder.java b/jdk/src/share/classes/com/sun/beans/finder/FieldFinder.java new file mode 100644 index 00000000000..cb17d02417d --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/finder/FieldFinder.java @@ -0,0 +1,106 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.finder; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; + +/** + * This utility class provides {@code static} methods + * to find a public field with specified name + * in specified class. + * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +public final class FieldFinder { + + /** + * Finds public field (static or non-static) + * that is declared in public class. + * + * @param type the class that can have field + * @param name the name of field to find + * @return object that represents found field + * @throws NoSuchFieldException if field is not found + * @see Class#getField + */ + public static Field findField(Class type, String name) throws NoSuchFieldException { + if (name == null) { + throw new IllegalArgumentException("Field name is not set"); + } + Field field = type.getField(name); + if (!Modifier.isPublic(field.getModifiers())) { + throw new NoSuchFieldException("Field '" + name + "' is not public"); + } + if (!Modifier.isPublic(field.getDeclaringClass().getModifiers())) { + throw new NoSuchFieldException("Field '" + name + "' is not accessible"); + } + return field; + } + + /** + * Finds public non-static field + * that is declared in public class. + * + * @param type the class that can have field + * @param name the name of field to find + * @return object that represents found field + * @throws NoSuchFieldException if field is not found + * @see Class#getField + */ + public static Field findInstanceField(Class type, String name) throws NoSuchFieldException { + Field field = findField(type, name); + if (Modifier.isStatic(field.getModifiers())) { + throw new NoSuchFieldException("Field '" + name + "' is static"); + } + return field; + } + + /** + * Finds public static field + * that is declared in public class. + * + * @param type the class that can have field + * @param name the name of field to find + * @return object that represents found field + * @throws NoSuchFieldException if field is not found + * @see Class#getField + */ + public static Field findStaticField(Class type, String name) throws NoSuchFieldException { + Field field = findField(type, name); + if (!Modifier.isStatic(field.getModifiers())) { + throw new NoSuchFieldException("Field '" + name + "' is not static"); + } + return field; + } + + /** + * Disable instantiation. + */ + private FieldFinder() { + } +} diff --git a/jdk/src/share/classes/com/sun/beans/finder/MethodFinder.java b/jdk/src/share/classes/com/sun/beans/finder/MethodFinder.java new file mode 100644 index 00000000000..9ccb4c4397f --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/finder/MethodFinder.java @@ -0,0 +1,231 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.finder; + +import com.sun.beans.TypeResolver; +import com.sun.beans.WeakCache; + +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.Arrays; + +/** + * This utility class provides {@code static} methods + * to find a public method with specified name and parameter types + * in specified class. + * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +public final class MethodFinder extends AbstractFinder { + private static final WeakCache CACHE = new WeakCache(); + + /** + * Finds public method (static or non-static) + * that is accessible from public class. + * + * @param type the class that can have method + * @param name the name of method to find + * @param args parameter types that is used to find method + * @return object that represents found method + * @throws NoSuchMethodException if method could not be found + * or some methods are found + */ + public static Method findMethod(Class type, String name, Class...args) throws NoSuchMethodException { + if (name == null) { + throw new IllegalArgumentException("Method name is not set"); + } + PrimitiveWrapperMap.replacePrimitivesWithWrappers(args); + Signature signature = new Signature(type, name, args); + + Method method = CACHE.get(signature); + if (method != null) { + return method; + } + method = findAccessibleMethod(new MethodFinder(name, args).find(type.getMethods())); + CACHE.put(signature, method); + return method; + } + + /** + * Finds public non-static method + * that is accessible from public class. + * + * @param type the class that can have method + * @param name the name of method to find + * @param args parameter types that is used to find method + * @return object that represents found method + * @throws NoSuchMethodException if method could not be found + * or some methods are found + */ + public static Method findInstanceMethod(Class type, String name, Class... args) throws NoSuchMethodException { + Method method = findMethod(type, name, args); + if (Modifier.isStatic(method.getModifiers())) { + throw new NoSuchMethodException("Method '" + name + "' is static"); + } + return method; + } + + /** + * Finds public static method + * that is accessible from public class. + * + * @param type the class that can have method + * @param name the name of method to find + * @param args parameter types that is used to find method + * @return object that represents found method + * @throws NoSuchMethodException if method could not be found + * or some methods are found + */ + public static Method findStaticMethod(Class type, String name, Class...args) throws NoSuchMethodException { + Method method = findMethod(type, name, args); + if (!Modifier.isStatic(method.getModifiers())) { + throw new NoSuchMethodException("Method '" + name + "' is not static"); + } + return method; + } + + /** + * Finds method that is accessible from public class or interface through class hierarchy. + * + * @param method object that represents found method + * @return object that represents accessible method + * @throws NoSuchMethodException if method is not accessible or is not found + * in specified superclass or interface + */ + private static Method findAccessibleMethod(Method method) throws NoSuchMethodException { + Class type = method.getDeclaringClass(); + if (Modifier.isPublic(type.getModifiers())) { + return method; + } + if (Modifier.isStatic(method.getModifiers())) { + throw new NoSuchMethodException("Method '" + method.getName() + "' is not accessible"); + } + for (Type generic : type.getGenericInterfaces()) { + try { + return findAccessibleMethod(method, generic); + } + catch (NoSuchMethodException exception) { + // try to find in superclass or another interface + } + } + return findAccessibleMethod(method, type.getGenericSuperclass()); + } + + /** + * Finds method that accessible from specified class. + * + * @param method object that represents found method + * @param generic generic type that is used to find accessible method + * @return object that represents accessible method + * @throws NoSuchMethodException if method is not accessible or is not found + * in specified superclass or interface + */ + private static Method findAccessibleMethod(Method method, Type generic) throws NoSuchMethodException { + String name = method.getName(); + Class[] params = method.getParameterTypes(); + if (generic instanceof Class) { + Class type = (Class) generic; + return findAccessibleMethod(type.getMethod(name, params)); + } + if (generic instanceof ParameterizedType) { + ParameterizedType pt = (ParameterizedType) generic; + Class type = (Class) pt.getRawType(); + for (Method m : type.getMethods()) { + if (m.getName().equals(name)) { + Class[] pts = m.getParameterTypes(); + if (pts.length == params.length) { + if (Arrays.equals(params, pts)) { + return findAccessibleMethod(m); + } + Type[] gpts = m.getGenericParameterTypes(); + if (Arrays.equals(params, TypeResolver.erase(TypeResolver.resolve(pt, gpts)))) { + return findAccessibleMethod(m); + } + } + } + } + } + throw new NoSuchMethodException("Method '" + name + "' is not accessible"); + } + + + private final String name; + + /** + * Creates method finder with specified array of parameter types. + * + * @param name the name of method to find + * @param args the array of parameter types + */ + private MethodFinder(String name, Class[] args) { + super(args); + this.name = name; + } + + /** + * Returns an array of {@code Class} objects + * that represent the formal parameter types of the method + * Returns an empty array if the method takes no parameters. + * + * @param method the object that represents method + * @return the parameter types of the method + */ + @Override + protected Class[] getParameters(Method method) { + return method.getParameterTypes(); + } + + /** + * Returns {@code true} if and only if the method + * was declared to take a variable number of arguments. + * + * @param method the object that represents method + * @return {@code true} if the method was declared + * to take a variable number of arguments; + * {@code false} otherwise + */ + @Override + protected boolean isVarArgs(Method method) { + return method.isVarArgs(); + } + + /** + * Checks validness of the method. + * The valid method should be public and + * should have the specified name. + * + * @param method the object that represents method + * @return {@code true} if the method is valid, + * {@code false} otherwise + */ + @Override + protected boolean isValid(Method method) { + return Modifier.isPublic(method.getModifiers()) && method.getName().equals(this.name); + } +} diff --git a/jdk/src/share/classes/com/sun/beans/finder/PrimitiveTypeMap.java b/jdk/src/share/classes/com/sun/beans/finder/PrimitiveTypeMap.java index 0bdb09e5be1..36a552b906c 100644 --- a/jdk/src/share/classes/com/sun/beans/finder/PrimitiveTypeMap.java +++ b/jdk/src/share/classes/com/sun/beans/finder/PrimitiveTypeMap.java @@ -1,5 +1,5 @@ /* - * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2006-2008 Sun Microsystems, Inc. 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 @@ -36,29 +36,30 @@ import java.util.Map; * @author Sergey A. Malenkov */ final class PrimitiveTypeMap { + /** * Returns primitive type class by its name. * * @param name the name of primitive type * @return found primitive type class, - * or null if not found + * or {@code null} if not found */ - static Class getType( String name ) { - return map.get( name ); + static Class getType(String name) { + return map.get(name); } - private static final Map map = new HashMap( 9 ); + private static final Map> map = new HashMap>(9); static { - map.put( boolean.class.getName(), boolean.class ); - map.put( char.class.getName(), char.class ); - map.put( byte.class.getName(), byte.class ); - map.put( short.class.getName(), short.class ); - map.put( int.class.getName(), int.class ); - map.put( long.class.getName(), long.class ); - map.put( float.class.getName(), float.class ); - map.put( double.class.getName(), double.class ); - map.put( void.class.getName(), void.class ); + map.put(boolean.class.getName(), boolean.class); + map.put(char.class.getName(), char.class); + map.put(byte.class.getName(), byte.class); + map.put(short.class.getName(), short.class); + map.put(int.class.getName(), int.class); + map.put(long.class.getName(), long.class); + map.put(float.class.getName(), float.class); + map.put(double.class.getName(), double.class); + map.put(void.class.getName(), void.class); } /** diff --git a/jdk/src/share/classes/com/sun/beans/finder/PrimitiveWrapperMap.java b/jdk/src/share/classes/com/sun/beans/finder/PrimitiveWrapperMap.java new file mode 100644 index 00000000000..f39b3ea3df0 --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/finder/PrimitiveWrapperMap.java @@ -0,0 +1,86 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.finder; + +import java.util.HashMap; +import java.util.Map; + +/** + * This utility class associates + * name of primitive type with appropriate wrapper. + * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +public final class PrimitiveWrapperMap { + + /** + * Replaces all primitive types in specified array with wrappers. + * + * @param types array of classes where all primitive types + * will be replaced by appropriate wrappers + */ + static void replacePrimitivesWithWrappers(Class[] types) { + for (int i = 0; i < types.length; i++) { + if (types[i] != null) { + if (types[i].isPrimitive()) { + types[i] = getType(types[i].getName()); + } + } + } + } + + /** + * Returns wrapper for primitive type by its name. + * + * @param name the name of primitive type + * @return found wrapper for primitive type, + * or {@code null} if not found + */ + public static Class getType(String name) { + return map.get(name); + } + + private static final Map> map = new HashMap>(9); + + static { + map.put(Boolean.TYPE.getName(), Boolean.class); + map.put(Character.TYPE.getName(), Character.class); + map.put(Byte.TYPE.getName(), Byte.class); + map.put(Short.TYPE.getName(), Short.class); + map.put(Integer.TYPE.getName(), Integer.class); + map.put(Long.TYPE.getName(), Long.class); + map.put(Float.TYPE.getName(), Float.class); + map.put(Double.TYPE.getName(), Double.class); + map.put(Void.TYPE.getName(), Void.class); + } + + /** + * Disable instantiation. + */ + private PrimitiveWrapperMap() { + } +} diff --git a/jdk/src/share/classes/com/sun/beans/finder/Signature.java b/jdk/src/share/classes/com/sun/beans/finder/Signature.java new file mode 100644 index 00000000000..8c09e11f4b4 --- /dev/null +++ b/jdk/src/share/classes/com/sun/beans/finder/Signature.java @@ -0,0 +1,169 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.beans.finder; + +/** + * This class is designed to be a key of a cache + * of constructors or methods. + * + * @since 1.7 + * + * @author Sergey A. Malenkov + */ +final class Signature { + private final Class type; + private final String name; + private final Class[] args; + + private volatile int code; + + /** + * Constructs signature for constructor. + * + * @param type the class that contains constructor + * @param args the types of constructor's parameters + */ + Signature(Class type, Class[] args) { + this(type, null, args); + } + + /** + * Constructs signature for method. + * + * @param type the class that contains method + * @param name the name of the method + * @param args the types of method's parameters + */ + Signature(Class type, String name, Class[] args) { + this.type = type; + this.name = name; + this.args = args; + } + + /** + * Indicates whether some other object is "equal to" this one. + * + * @param object the reference object with which to compare + * @return {@code true} if this object is the same as the + * {@code object} argument, {@code false} otherwise + * @see #hashCode() + */ + @Override + public boolean equals(Object object) { + if (this == object) { + return true; + } + if (object instanceof Signature) { + Signature signature = (Signature) object; + return isEqual(signature.type, this.type) + && isEqual(signature.name, this.name) + && isEqual(signature.args, this.args); + } + return false; + } + + /** + * Indicates whether some object is "equal to" another one. + * This method supports {@code null} values. + * + * @param obj1 the first reference object that will compared + * @param obj2 the second reference object that will compared + * @return {@code true} if first object is the same as the second object, + * {@code false} otherwise + */ + private static boolean isEqual(Object obj1, Object obj2) { + return (obj1 == null) + ? obj2 == null + : obj1.equals(obj2); + } + + /** + * Indicates whether some array is "equal to" another one. + * This method supports {@code null} values. + * + * @param args1 the first reference array that will compared + * @param args2 the second reference array that will compared + * @return {@code true} if first array is the same as the second array, + * {@code false} otherwise + */ + private static boolean isEqual(Class[] args1, Class[] args2) { + if ((args1 == null) || (args2 == null)) { + return args1 == args2; + } + if (args1.length != args2.length) { + return false; + } + for (int i = 0; i < args1.length; i++) { + if (!isEqual(args1[i], args2[i])) { + return false; + } + } + return true; + } + + /** + * Returns a hash code value for the object. + * This method is supported for the benefit of hashtables + * such as {@link java.util.HashMap} or {@link java.util.HashSet}. + * Hash code computed using algorithm + * suggested in Effective Java, Item 8. + * + * @return a hash code value for this object + * @see #equals(Object) + */ + @Override + public int hashCode() { + if (this.code == 0) { + int code = 17; + code = addHashCode(code, this.type); + code = addHashCode(code, this.name); + + if (this.args != null) { + for (Class arg : this.args) { + code = addHashCode(code, arg); + } + } + this.code = code; + } + return this.code; + } + + /** + * Adds hash code value if specified object. + * This is a part of the algorithm + * suggested in Effective Java, Item 8. + * + * @param code current hash code value + * @param object object that updates hash code value + * @return updated hash code value + * @see #hashCode() + */ + private static int addHashCode(int code, Object object) { + code *= 37; + return (object != null) + ? code + object.hashCode() + : code; + } +} diff --git a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKColorChooserPanel.java b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKColorChooserPanel.java index c70d889f453..d54839f7e3c 100644 --- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKColorChooserPanel.java +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKColorChooserPanel.java @@ -799,9 +799,9 @@ class GTKColorChooserPanel extends AbstractColorChooserPanel implements Graphics g = triangleImage.getGraphics(); g.setColor(new Color(0, 0, 0, 0)); g.fillRect(0, 0, a, a); - g.translate((int)(a / 2), 0); + g.translate(a / 2, 0); paintTriangle(g, triangleSize, getColor()); - g.translate((int)(-a / 2), 0); + g.translate(-a / 2, 0); g.dispose(); g = wheelImage.getGraphics(); @@ -897,7 +897,7 @@ class GTKColorChooserPanel extends AbstractColorChooserPanel implements return false; } // Rotate to origin and and verify x is valid. - int triangleSize = (int)innerR * 3 / 2; + int triangleSize = innerR * 3 / 2; double x1 = Math.cos(angle) * x - Math.sin(angle) * y; double y1 = Math.sin(angle) * x + Math.cos(angle) * y; if (x1 < -(innerR / 2)) { @@ -960,7 +960,7 @@ class GTKColorChooserPanel extends AbstractColorChooserPanel implements */ private void setSaturationAndBrightness(float s, float b) { int innerR = getTriangleCircumscribedRadius(); - int triangleSize = (int)innerR * 3 / 2; + int triangleSize = innerR * 3 / 2; double x = b * triangleSize; double maxY = x * Math.tan(Math.toRadians(30.0)); double y = 2 * maxY * s - maxY; @@ -1156,7 +1156,7 @@ class GTKColorChooserPanel extends AbstractColorChooserPanel implements * @param x X location to get color for * @param y Y location to get color for * @param rad Radius from center of color wheel - * @param integer with red, green and blue components + * @return integer with red, green and blue components */ private int colorWheelLocationToRGB(int x, int y, double rad) { double angle = Math.acos((double)x / rad); @@ -1165,12 +1165,12 @@ class GTKColorChooserPanel extends AbstractColorChooserPanel implements if (angle < PI_3) { if (y < 0) { // FFFF00 - FF0000 - rgb = 0xFF0000 | (int)Math.min(255, + rgb = 0xFF0000 | Math.min(255, (int)(255 * angle / PI_3)) << 8; } else { // FF0000 - FF00FF - rgb = 0xFF0000 | (int)Math.min(255, + rgb = 0xFF0000 | Math.min(255, (int)(255 * angle / PI_3)); } } @@ -1178,12 +1178,12 @@ class GTKColorChooserPanel extends AbstractColorChooserPanel implements angle -= PI_3; if (y < 0) { // 00FF00 - FFFF00 - rgb = 0x00FF00 | (int)Math.max(0, 255 - + rgb = 0x00FF00 | Math.max(0, 255 - (int)(255 * angle / PI_3)) << 16; } else { // FF00FF - 0000FF - rgb = 0x0000FF | (int)Math.max(0, 255 - + rgb = 0x0000FF | Math.max(0, 255 - (int)(255 * angle / PI_3)) << 16; } } @@ -1191,12 +1191,12 @@ class GTKColorChooserPanel extends AbstractColorChooserPanel implements angle -= 2 * PI_3; if (y < 0) { // 00FFFF - 00FF00 - rgb = 0x00FF00 | (int)Math.min(255, + rgb = 0x00FF00 | Math.min(255, (int)(255 * angle / PI_3)); } else { // 0000FF - 00FFFF - rgb = 0x0000FF | (int)Math.min(255, + rgb = 0x0000FF | Math.min(255, (int)(255 * angle / PI_3)) << 8; } } diff --git a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKEngine.java b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKEngine.java index 95bf090b645..737e20c2243 100644 --- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKEngine.java +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKEngine.java @@ -112,7 +112,7 @@ class GTKEngine { } - private static HashMap regionToWidgetTypeMap; + private static HashMap regionToWidgetTypeMap; private ImageCache cache = new ImageCache(CACHE_SIZE); private int x0, y0, w0, h0; private Graphics graphics; @@ -178,7 +178,7 @@ class GTKEngine { Toolkit.getDefaultToolkit(); // Initialize regionToWidgetTypeMap - regionToWidgetTypeMap = new HashMap(50); + regionToWidgetTypeMap = new HashMap(50); regionToWidgetTypeMap.put(Region.ARROW_BUTTON, new WidgetType[] { WidgetType.SPINNER_ARROW_BUTTON, WidgetType.COMBO_BOX_ARROW_BUTTON, diff --git a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKFileChooserUI.java b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKFileChooserUI.java index 8b786da73fb..acb944dfa56 100644 --- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKFileChooserUI.java +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKFileChooserUI.java @@ -148,7 +148,7 @@ class GTKFileChooserUI extends SynthFileChooserUI { directoryList : fileList; Object[] files = list.getSelectedValues(); int len = files.length; - Vector result = new Vector(len + 1); + Vector result = new Vector(len + 1); // we return all selected file names for (int i = 0; i < len; i++) { @@ -263,13 +263,13 @@ class GTKFileChooserUI extends SynthFileChooserUI { ListSelectionModel sm = directoryList.getSelectionModel(); if (sm instanceof DefaultListSelectionModel) { ((DefaultListSelectionModel)sm).moveLeadSelectionIndex(0); - ((DefaultListSelectionModel)sm).setAnchorSelectionIndex(0); + sm.setAnchorSelectionIndex(0); } fileList.clearSelection(); sm = fileList.getSelectionModel(); if (sm instanceof DefaultListSelectionModel) { ((DefaultListSelectionModel)sm).moveLeadSelectionIndex(0); - ((DefaultListSelectionModel)sm).setAnchorSelectionIndex(0); + sm.setAnchorSelectionIndex(0); } File currentDirectory = getFileChooser().getCurrentDirectory(); @@ -425,16 +425,16 @@ class GTKFileChooserUI extends SynthFileChooserUI { setDirectorySelected(true); setDirectory(((File)objects[0])); } else { - ArrayList fList = new ArrayList(objects.length); - for (int i = 0; i < objects.length; i++) { - File f = (File)objects[i]; + ArrayList fList = new ArrayList(objects.length); + for (Object object : objects) { + File f = (File) object; if ((chooser.isFileSelectionEnabled() && f.isFile()) || (chooser.isDirectorySelectionEnabled() && f.isDirectory())) { fList.add(f); } } if (fList.size() > 0) { - files = (File[])fList.toArray(new File[fList.size()]); + files = fList.toArray(new File[fList.size()]); } setDirectorySelected(false); } @@ -671,9 +671,9 @@ class GTKFileChooserUI extends SynthFileChooserUI { pathFieldLabel.setLabelFor(fileNameTextField); - Set forwardTraversalKeys = fileNameTextField.getFocusTraversalKeys( + Set forwardTraversalKeys = fileNameTextField.getFocusTraversalKeys( KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS); - forwardTraversalKeys = new HashSet(forwardTraversalKeys); + forwardTraversalKeys = new HashSet(forwardTraversalKeys); forwardTraversalKeys.remove(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0)); fileNameTextField.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, forwardTraversalKeys); @@ -895,10 +895,9 @@ class GTKFileChooserUI extends SynthFileChooserUI { private class GTKDirectoryModel extends BasicDirectoryModel { FileSystemView fsv; - private Comparator fileComparator = new Comparator() { - public int compare(Object o, Object o1) { - return fsv.getSystemDisplayName((File) o).compareTo - (fsv.getSystemDisplayName((File) o1)); + private Comparator fileComparator = new Comparator() { + public int compare(File o, File o1) { + return fsv.getSystemDisplayName(o).compareTo(fsv.getSystemDisplayName(o1)); } }; @@ -1074,7 +1073,7 @@ class GTKFileChooserUI extends SynthFileChooserUI { * Data model for a type-face selection combo-box. */ protected class DirectoryComboBoxModel extends AbstractListModel implements ComboBoxModel { - Vector directories = new Vector(); + Vector directories = new Vector(); File selectedDirectory = null; JFileChooser chooser = getFileChooser(); FileSystemView fsv = chooser.getFileSystemView(); @@ -1216,7 +1215,7 @@ class GTKFileChooserUI extends SynthFileChooserUI { ListSelectionModel sm = fileList.getSelectionModel(); if (sm instanceof DefaultListSelectionModel) { ((DefaultListSelectionModel)sm).moveLeadSelectionIndex(0); - ((DefaultListSelectionModel)sm).setAnchorSelectionIndex(0); + sm.setAnchorSelectionIndex(0); } rescanCurrentDirectory(getFileChooser()); return; @@ -1352,8 +1351,8 @@ class GTKFileChooserUI extends SynthFileChooserUI { FileFilter currentFilter = getFileChooser().getFileFilter(); boolean found = false; if (currentFilter != null) { - for (int i = 0; i < filters.length; i++) { - if (filters[i] == currentFilter) { + for (FileFilter filter : filters) { + if (filter == currentFilter) { found = true; } } diff --git a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKLookAndFeel.java b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKLookAndFeel.java index 6934aa213d1..23e4ee2eee5 100644 --- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKLookAndFeel.java +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKLookAndFeel.java @@ -1470,7 +1470,7 @@ public class GTKLookAndFeel extends SynthLookAndFeel { aaTextInfo = SwingUtilities2.AATextInfo.getAATextInfo(gtkAAFontSettingsCond); } - static ReferenceQueue queue = new ReferenceQueue(); + static ReferenceQueue queue = new ReferenceQueue(); private static void flushUnreferenced() { WeakPCL pcl; @@ -1480,12 +1480,12 @@ public class GTKLookAndFeel extends SynthLookAndFeel { } } - static class WeakPCL extends WeakReference implements + static class WeakPCL extends WeakReference implements PropertyChangeListener { private Toolkit kit; private String key; - WeakPCL(Object target, Toolkit kit, String key) { + WeakPCL(GTKLookAndFeel target, Toolkit kit, String key) { super(target, queue); this.kit = kit; this.key = key; @@ -1494,7 +1494,7 @@ public class GTKLookAndFeel extends SynthLookAndFeel { public String getKey() { return key; } public void propertyChange(final PropertyChangeEvent pce) { - final GTKLookAndFeel lnf = (GTKLookAndFeel)get(); + final GTKLookAndFeel lnf = get(); if (lnf == null || UIManager.getLookAndFeel() != lnf) { // The property was GC'ed, we're no longer interested in diff --git a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKPainter.java b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKPainter.java index 780b01cf6d4..58d61dc909a 100644 --- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKPainter.java +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKPainter.java @@ -299,7 +299,7 @@ class GTKPainter extends SynthPainter { // Paint the default indicator GTKStyle style = (GTKStyle)context.getStyle(); if (defaultCapable && !toolButton) { - Insets defaultInsets = (Insets)style.getClassSpecificInsetsValue( + Insets defaultInsets = style.getClassSpecificInsetsValue( context, "default-border", GTKStyle.BUTTON_DEFAULT_BORDER_INSETS); diff --git a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/Metacity.java b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/Metacity.java index a3eada90d84..d432bb088ba 100644 --- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/Metacity.java +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/Metacity.java @@ -124,7 +124,7 @@ class Metacity implements SynthConstants { } // Initialize constants - variables = new HashMap(); + variables = new HashMap(); NodeList nodes = xmlDoc.getElementsByTagName("constant"); int n = nodes.getLength(); for (int i = 0; i < n; i++) { @@ -144,14 +144,14 @@ class Metacity implements SynthConstants { } // Cache frame geometries - frameGeometries = new HashMap(); + frameGeometries = new HashMap>(); nodes = xmlDoc.getElementsByTagName("frame_geometry"); n = nodes.getLength(); for (int i = 0; i < n; i++) { Node node = nodes.item(i); String name = getStringAttr(node, "name"); if (name != null) { - HashMap gm = new HashMap(); + HashMap gm = new HashMap(); frameGeometries.put(name, gm); String parentGM = getStringAttr(node, "parent"); @@ -458,7 +458,7 @@ class Metacity implements SynthConstants { - private static class Privileged implements PrivilegedAction { + private static class Privileged implements PrivilegedAction { private static int GET_THEME_DIR = 0; private static int GET_USER_THEME = 1; private static int GET_IMAGE = 2; @@ -598,7 +598,7 @@ class Metacity implements SynthConstants { g2.setComposite(oldComp); } - private HashMap images = new HashMap(); + private HashMap images = new HashMap(); protected Image getImage(String key, Color c) { Image image = images.get(key+"-"+c.getRGB()); @@ -1530,8 +1530,8 @@ class Metacity implements SynthConstants { DocumentBuilderFactory.newInstance().newDocumentBuilder(); } InputStream inputStream = - (InputStream)AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { + AccessController.doPrivileged(new PrivilegedAction() { + public InputStream run() { try { return new BufferedInputStream(xmlFile.openStream()); } catch (IOException ex) { @@ -1551,7 +1551,7 @@ class Metacity implements SynthConstants { protected Node[] getNodesByName(Node parent, String name) { NodeList nodes = parent.getChildNodes(); // ElementNode int n = nodes.getLength(); - ArrayList list = new ArrayList(); + ArrayList list = new ArrayList(); for (int i=0; i < n; i++) { Node node = nodes.item(i); if (name.equals(node.getNodeName())) { @@ -1603,7 +1603,7 @@ class Metacity implements SynthConstants { String aValue = attrs[a * 2 + 1]; Node attr = nodeAttrs.getNamedItem(aName); if (attr == null || - aValue != null && !aValue.equals((String)attr.getNodeValue())) { + aValue != null && !aValue.equals(attr.getNodeValue())) { matches = false; break; } @@ -1642,7 +1642,7 @@ class Metacity implements SynthConstants { protected String getStringAttr(NamedNodeMap attrs, String name) { Node item = attrs.getNamedItem(name); - return (item != null) ? (String)item.getNodeValue() : null; + return (item != null) ? item.getNodeValue() : null; } protected boolean getBooleanAttr(Node node, String name, boolean fallback) { diff --git a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java index f9f32f2ff73..57af97958dd 100644 --- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java @@ -70,7 +70,6 @@ public class WindowsFileChooserUI extends BasicFileChooserUI { private JTextField filenameTextField; private FilePane filePane; private WindowsPlacesBar placesBar; - private boolean useShellFolder; private JButton approveButton; private JButton cancelButton; @@ -210,10 +209,6 @@ public class WindowsFileChooserUI extends BasicFileChooserUI { public ListSelectionListener createListSelectionListener() { return WindowsFileChooserUI.this.createListSelectionListener(getFileChooser()); } - - public boolean usesShellFolder() { - return useShellFolder; - } } public void installComponents(JFileChooser fc) { @@ -625,15 +620,8 @@ public class WindowsFileChooserUI extends BasicFileChooserUI { // Decide whether to use the ShellFolder class to populate shortcut // panel and combobox. JFileChooser fc = getFileChooser(); - Boolean prop = - (Boolean)fc.getClientProperty("FileChooser.useShellFolder"); - if (prop != null) { - useShellFolder = prop.booleanValue(); - } else { - useShellFolder = fc.getFileSystemView().equals(FileSystemView.getFileSystemView()); - } if (OS_VERSION.compareTo(OSInfo.WINDOWS_ME) >= 0) { - if (useShellFolder) { + if (FilePane.usesShellFolder(fc)) { if (placesBar == null && !UIManager.getBoolean("FileChooser.noPlacesBar")) { placesBar = new WindowsPlacesBar(fc, XPStyle.getXP() != null); fc.add(placesBar, BorderLayout.BEFORE_LINE_BEGINS); @@ -1149,6 +1137,8 @@ public class WindowsFileChooserUI extends BasicFileChooserUI { return; } + boolean useShellFolder = FilePane.usesShellFolder(chooser); + directories.clear(); File[] baseFolders; diff --git a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java index bb7842a0018..788fe9fec38 100644 --- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java @@ -1554,10 +1554,10 @@ public class WindowsLookAndFeel extends BasicLookAndFeel "Tree.selectionBackground", SelectionBackgroundColor, "Tree.expandedIcon", treeExpandedIcon, "Tree.collapsedIcon", treeCollapsedIcon, - "Tree.openIcon", new ActiveWindowsIcon("win.icon.shellIconBPP", "shell32Icon 5", - (Icon)table.get("Tree.openIcon")), - "Tree.closedIcon", new ActiveWindowsIcon("win.icon.shellIconBPP", "shell32Icon 4", - (Icon)table.get("Tree.closedIcon")), + "Tree.openIcon", new ActiveWindowsIcon("win.icon.shellIconBPP", + "shell32Icon 5", "icons/TreeOpen.gif"), + "Tree.closedIcon", new ActiveWindowsIcon("win.icon.shellIconBPP", + "shell32Icon 4", "icons/TreeClosed.gif"), "Tree.focusInputMap", new UIDefaults.LazyInputMap(new Object[] { "ADD", "expand", @@ -2205,21 +2205,21 @@ public class WindowsLookAndFeel extends BasicLookAndFeel */ private class ActiveWindowsIcon implements UIDefaults.ActiveValue { private Icon icon; - private Icon fallback; private String nativeImageName; + private String fallbackName; private DesktopProperty desktopProperty; ActiveWindowsIcon(String desktopPropertyName, - String nativeImageName, Icon fallback) { + String nativeImageName, String fallbackName) { this.nativeImageName = nativeImageName; - this.fallback = fallback; + this.fallbackName = fallbackName; if (OSInfo.getOSType() == OSInfo.OSType.WINDOWS && OSInfo.getWindowsVersion().compareTo(OSInfo.WINDOWS_XP) < 0) { // This desktop property is needed to trigger reloading the icon. // It is kept in member variable to avoid GC. this.desktopProperty = new TriggerDesktopProperty(desktopPropertyName) { - protected void updateUI() { + @Override protected void updateUI() { icon = null; super.updateUI(); } @@ -2227,6 +2227,7 @@ public class WindowsLookAndFeel extends BasicLookAndFeel } } + @Override public Object createValue(UIDefaults table) { if (icon == null) { Image image = (Image)ShellFolder.get(nativeImageName); @@ -2234,8 +2235,11 @@ public class WindowsLookAndFeel extends BasicLookAndFeel icon = new ImageIconUIResource(image); } } - if (icon == null && fallback != null) { - icon = fallback; + if (icon == null && fallbackName != null) { + UIDefaults.LazyValue fallback = (UIDefaults.LazyValue) + SwingUtilities2.makeIcon(WindowsLookAndFeel.class, + BasicLookAndFeel.class, fallbackName); + icon = (Icon) fallback.createValue(table); } return icon; } diff --git a/jdk/src/share/classes/com/sun/media/sound/AbstractMidiDevice.java b/jdk/src/share/classes/com/sun/media/sound/AbstractMidiDevice.java index 5409ab0567b..70cb15e0a40 100644 --- a/jdk/src/share/classes/com/sun/media/sound/AbstractMidiDevice.java +++ b/jdk/src/share/classes/com/sun/media/sound/AbstractMidiDevice.java @@ -75,13 +75,6 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice /** * This is the device handle returned from native code */ - /* - * $$rratta Solaris 64 bit holds pointer must be long - * - * $$mp 2003-08-07: - * 'id' is a really bad name. The variable should - * be called nativePointer or something similar. - */ protected long id = 0; @@ -586,7 +579,6 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice private ArrayList transmitters = new ArrayList(); private MidiOutDevice.MidiOutReceiver midiOutReceiver; - private MixerSynth.SynthReceiver mixerSynthReceiver; // how many transmitters must be present for optimized // handling @@ -621,22 +613,14 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice if (midiOutReceiver == oldR) { midiOutReceiver = null; } - if (mixerSynthReceiver == oldR) { - mixerSynthReceiver = null; - } if (newR != null) { if ((newR instanceof MidiOutDevice.MidiOutReceiver) && (midiOutReceiver == null)) { midiOutReceiver = ((MidiOutDevice.MidiOutReceiver) newR); } - if ((newR instanceof MixerSynth.SynthReceiver) - && (mixerSynthReceiver == null)) { - mixerSynthReceiver = ((MixerSynth.SynthReceiver) newR); - } } optimizedReceiverCount = - ((midiOutReceiver!=null)?1:0) - + ((mixerSynthReceiver!=null)?1:0); + ((midiOutReceiver!=null)?1:0); } // more potential for optimization here } @@ -670,10 +654,6 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice if (TRACE_TRANSMITTER) Printer.println("Sending packed message to MidiOutReceiver"); midiOutReceiver.sendPackedMidiMessage(packedMessage, timeStamp); } - if (mixerSynthReceiver != null) { - if (TRACE_TRANSMITTER) Printer.println("Sending packed message to MixerSynthReceiver"); - mixerSynthReceiver.sendPackedMidiMessage(packedMessage, timeStamp); - } } else { if (TRACE_TRANSMITTER) Printer.println("Sending packed message to "+size+" transmitter's receivers"); for (int i = 0; i < size; i++) { @@ -682,9 +662,6 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice if (optimizedReceiverCount > 0) { if (receiver instanceof MidiOutDevice.MidiOutReceiver) { ((MidiOutDevice.MidiOutReceiver) receiver).sendPackedMidiMessage(packedMessage, timeStamp); - } - else if (receiver instanceof MixerSynth.SynthReceiver) { - ((MixerSynth.SynthReceiver) receiver).sendPackedMidiMessage(packedMessage, timeStamp); } else { receiver.send(new FastShortMessage(packedMessage), timeStamp); } @@ -739,10 +716,6 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice if (TRACE_TRANSMITTER) Printer.println("Sending MIDI message to MidiOutReceiver"); midiOutReceiver.send(message, timeStamp); } - if (mixerSynthReceiver != null) { - if (TRACE_TRANSMITTER) Printer.println("Sending MIDI message to MixerSynthReceiver"); - mixerSynthReceiver.send(message, timeStamp); - } } else { if (TRACE_TRANSMITTER) Printer.println("Sending MIDI message to "+size+" transmitter's receivers"); for (int i = 0; i < size; i++) { diff --git a/jdk/src/share/classes/com/sun/media/sound/AudioFileSoundbankReader.java b/jdk/src/share/classes/com/sun/media/sound/AudioFileSoundbankReader.java new file mode 100644 index 00000000000..7f4090d8d3e --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/AudioFileSoundbankReader.java @@ -0,0 +1,131 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +import javax.sound.midi.InvalidMidiDataException; +import javax.sound.midi.Soundbank; +import javax.sound.midi.spi.SoundbankReader; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.UnsupportedAudioFileException; + +/** + * Soundbank reader that uses audio files as soundbanks. + * + * @author Karl Helgason + */ +public class AudioFileSoundbankReader extends SoundbankReader { + + public Soundbank getSoundbank(URL url) + throws InvalidMidiDataException, IOException { + try { + AudioInputStream ais = AudioSystem.getAudioInputStream(url); + Soundbank sbk = getSoundbank(ais); + ais.close(); + return sbk; + } catch (UnsupportedAudioFileException e) { + return null; + } catch (IOException e) { + return null; + } + } + + public Soundbank getSoundbank(InputStream stream) + throws InvalidMidiDataException, IOException { + stream.mark(512); + try { + AudioInputStream ais = AudioSystem.getAudioInputStream(stream); + Soundbank sbk = getSoundbank(ais); + if (sbk != null) + return sbk; + } catch (UnsupportedAudioFileException e) { + } catch (IOException e) { + } + stream.reset(); + return null; + } + + public Soundbank getSoundbank(AudioInputStream ais) + throws InvalidMidiDataException, IOException { + try { + byte[] buffer; + if (ais.getFrameLength() == -1) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + byte[] buff = new byte[1024 + - (1024 % ais.getFormat().getFrameSize())]; + int ret; + while ((ret = ais.read(buff)) != -1) { + baos.write(buff, 0, ret); + } + ais.close(); + buffer = baos.toByteArray(); + } else { + buffer = new byte[(int) (ais.getFrameLength() + * ais.getFormat().getFrameSize())]; + new DataInputStream(ais).readFully(buffer); + } + ModelByteBufferWavetable osc = new ModelByteBufferWavetable( + new ModelByteBuffer(buffer), ais.getFormat(), -4800); + ModelPerformer performer = new ModelPerformer(); + performer.getOscillators().add(osc); + + SimpleSoundbank sbk = new SimpleSoundbank(); + SimpleInstrument ins = new SimpleInstrument(); + ins.add(performer); + sbk.addInstrument(ins); + return sbk; + } catch (Exception e) { + return null; + } + } + + public Soundbank getSoundbank(File file) + throws InvalidMidiDataException, IOException { + try { + AudioInputStream ais = AudioSystem.getAudioInputStream(file); + ais.close(); + ModelByteBufferWavetable osc = new ModelByteBufferWavetable( + new ModelByteBuffer(file, 0, file.length()), -4800); + ModelPerformer performer = new ModelPerformer(); + performer.getOscillators().add(osc); + SimpleSoundbank sbk = new SimpleSoundbank(); + SimpleInstrument ins = new SimpleInstrument(); + ins.add(performer); + sbk.addInstrument(ins); + return sbk; + } catch (UnsupportedAudioFileException e1) { + return null; + } catch (IOException e) { + return null; + } + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/AudioFloatConverter.java b/jdk/src/share/classes/com/sun/media/sound/AudioFloatConverter.java new file mode 100644 index 00000000000..e8d9dbeb14d --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/AudioFloatConverter.java @@ -0,0 +1,1058 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.DoubleBuffer; +import java.nio.FloatBuffer; + +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioFormat.Encoding; + +/** + * This class is used to convert between 8,16,24,32,32+ bit signed/unsigned + * big/litle endian fixed/floating point byte buffers and float buffers. + * + * @author Karl Helgason + */ +public abstract class AudioFloatConverter { + + public static final Encoding PCM_FLOAT = new Encoding("PCM_FLOAT"); + + /*************************************************************************** + * + * LSB Filter, used filter least significant byte in samples arrays. + * + * Is used filter out data in lsb byte when SampleSizeInBits is not + * dividable by 8. + * + **************************************************************************/ + + private static class AudioFloatLSBFilter extends AudioFloatConverter { + + private AudioFloatConverter converter; + + final private int offset; + + final private int stepsize; + + final private byte mask; + + private byte[] mask_buffer; + + public AudioFloatLSBFilter(AudioFloatConverter converter, + AudioFormat format) { + int bits = format.getSampleSizeInBits(); + boolean bigEndian = format.isBigEndian(); + this.converter = converter; + stepsize = (bits + 7) / 8; + offset = bigEndian ? (stepsize - 1) : 0; + int lsb_bits = bits % 8; + if (lsb_bits == 0) + mask = (byte) 0x00; + else if (lsb_bits == 1) + mask = (byte) 0x80; + else if (lsb_bits == 2) + mask = (byte) 0xC0; + else if (lsb_bits == 3) + mask = (byte) 0xE0; + else if (lsb_bits == 4) + mask = (byte) 0xF0; + else if (lsb_bits == 5) + mask = (byte) 0xF8; + else if (lsb_bits == 6) + mask = (byte) 0xFC; + else if (lsb_bits == 7) + mask = (byte) 0xFE; + else + mask = (byte) 0xFF; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + byte[] ret = converter.toByteArray(in_buff, in_offset, in_len, + out_buff, out_offset); + + int out_offset_end = in_len * stepsize; + for (int i = out_offset + offset; i < out_offset_end; i += stepsize) { + out_buff[i] = (byte) (out_buff[i] & mask); + } + + return ret; + } + + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + if (mask_buffer == null || mask_buffer.length < in_buff.length) + mask_buffer = new byte[in_buff.length]; + System.arraycopy(in_buff, 0, mask_buffer, 0, in_buff.length); + int in_offset_end = out_len * stepsize; + for (int i = in_offset + offset; i < in_offset_end; i += stepsize) { + mask_buffer[i] = (byte) (mask_buffer[i] & mask); + } + float[] ret = converter.toFloatArray(mask_buffer, in_offset, + out_buff, out_offset, out_len); + return ret; + } + + } + + /*************************************************************************** + * + * 64 bit float, little/big-endian + * + **************************************************************************/ + + // PCM 64 bit float, little-endian + private static class AudioFloatConversion64L extends AudioFloatConverter { + ByteBuffer bytebuffer = null; + + DoubleBuffer floatbuffer = null; + + double[] double_buff = null; + + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int in_len = out_len * 8; + if (bytebuffer == null || bytebuffer.capacity() < in_len) { + bytebuffer = ByteBuffer.allocate(in_len).order( + ByteOrder.LITTLE_ENDIAN); + floatbuffer = bytebuffer.asDoubleBuffer(); + } + bytebuffer.position(0); + floatbuffer.position(0); + bytebuffer.put(in_buff, in_offset, in_len); + if (double_buff == null + || double_buff.length < out_len + out_offset) + double_buff = new double[out_len + out_offset]; + floatbuffer.get(double_buff, out_offset, out_len); + int out_offset_end = out_offset + out_len; + for (int i = out_offset; i < out_offset_end; i++) { + out_buff[i] = (float) double_buff[i]; + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int out_len = in_len * 8; + if (bytebuffer == null || bytebuffer.capacity() < out_len) { + bytebuffer = ByteBuffer.allocate(out_len).order( + ByteOrder.LITTLE_ENDIAN); + floatbuffer = bytebuffer.asDoubleBuffer(); + } + floatbuffer.position(0); + bytebuffer.position(0); + if (double_buff == null || double_buff.length < in_offset + in_len) + double_buff = new double[in_offset + in_len]; + int in_offset_end = in_offset + in_len; + for (int i = in_offset; i < in_offset_end; i++) { + double_buff[i] = in_buff[i]; + } + floatbuffer.put(double_buff, in_offset, in_len); + bytebuffer.get(out_buff, out_offset, out_len); + return out_buff; + } + } + + // PCM 64 bit float, big-endian + private static class AudioFloatConversion64B extends AudioFloatConverter { + ByteBuffer bytebuffer = null; + + DoubleBuffer floatbuffer = null; + + double[] double_buff = null; + + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int in_len = out_len * 8; + if (bytebuffer == null || bytebuffer.capacity() < in_len) { + bytebuffer = ByteBuffer.allocate(in_len).order( + ByteOrder.BIG_ENDIAN); + floatbuffer = bytebuffer.asDoubleBuffer(); + } + bytebuffer.position(0); + floatbuffer.position(0); + bytebuffer.put(in_buff, in_offset, in_len); + if (double_buff == null + || double_buff.length < out_len + out_offset) + double_buff = new double[out_len + out_offset]; + floatbuffer.get(double_buff, out_offset, out_len); + int out_offset_end = out_offset + out_len; + for (int i = out_offset; i < out_offset_end; i++) { + out_buff[i] = (float) double_buff[i]; + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int out_len = in_len * 8; + if (bytebuffer == null || bytebuffer.capacity() < out_len) { + bytebuffer = ByteBuffer.allocate(out_len).order( + ByteOrder.BIG_ENDIAN); + floatbuffer = bytebuffer.asDoubleBuffer(); + } + floatbuffer.position(0); + bytebuffer.position(0); + if (double_buff == null || double_buff.length < in_offset + in_len) + double_buff = new double[in_offset + in_len]; + int in_offset_end = in_offset + in_len; + for (int i = in_offset; i < in_offset_end; i++) { + double_buff[i] = in_buff[i]; + } + floatbuffer.put(double_buff, in_offset, in_len); + bytebuffer.get(out_buff, out_offset, out_len); + return out_buff; + } + } + + /*************************************************************************** + * + * 32 bit float, little/big-endian + * + **************************************************************************/ + + // PCM 32 bit float, little-endian + private static class AudioFloatConversion32L extends AudioFloatConverter { + ByteBuffer bytebuffer = null; + + FloatBuffer floatbuffer = null; + + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int in_len = out_len * 4; + if (bytebuffer == null || bytebuffer.capacity() < in_len) { + bytebuffer = ByteBuffer.allocate(in_len).order( + ByteOrder.LITTLE_ENDIAN); + floatbuffer = bytebuffer.asFloatBuffer(); + } + bytebuffer.position(0); + floatbuffer.position(0); + bytebuffer.put(in_buff, in_offset, in_len); + floatbuffer.get(out_buff, out_offset, out_len); + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int out_len = in_len * 4; + if (bytebuffer == null || bytebuffer.capacity() < out_len) { + bytebuffer = ByteBuffer.allocate(out_len).order( + ByteOrder.LITTLE_ENDIAN); + floatbuffer = bytebuffer.asFloatBuffer(); + } + floatbuffer.position(0); + bytebuffer.position(0); + floatbuffer.put(in_buff, in_offset, in_len); + bytebuffer.get(out_buff, out_offset, out_len); + return out_buff; + } + } + + // PCM 32 bit float, big-endian + private static class AudioFloatConversion32B extends AudioFloatConverter { + ByteBuffer bytebuffer = null; + + FloatBuffer floatbuffer = null; + + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int in_len = out_len * 4; + if (bytebuffer == null || bytebuffer.capacity() < in_len) { + bytebuffer = ByteBuffer.allocate(in_len).order( + ByteOrder.BIG_ENDIAN); + floatbuffer = bytebuffer.asFloatBuffer(); + } + bytebuffer.position(0); + floatbuffer.position(0); + bytebuffer.put(in_buff, in_offset, in_len); + floatbuffer.get(out_buff, out_offset, out_len); + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int out_len = in_len * 4; + if (bytebuffer == null || bytebuffer.capacity() < out_len) { + bytebuffer = ByteBuffer.allocate(out_len).order( + ByteOrder.BIG_ENDIAN); + floatbuffer = bytebuffer.asFloatBuffer(); + } + floatbuffer.position(0); + bytebuffer.position(0); + floatbuffer.put(in_buff, in_offset, in_len); + bytebuffer.get(out_buff, out_offset, out_len); + return out_buff; + } + } + + /*************************************************************************** + * + * 8 bit signed/unsigned + * + **************************************************************************/ + + // PCM 8 bit, signed + private static class AudioFloatConversion8S extends AudioFloatConverter { + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) + out_buff[ox++] = in_buff[ix++] * (1.0f / 127.0f); + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) + out_buff[ox++] = (byte) (in_buff[ix++] * 127.0f); + return out_buff; + } + } + + // PCM 8 bit, unsigned + private static class AudioFloatConversion8U extends AudioFloatConverter { + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) + out_buff[ox++] = ((in_buff[ix++] & 0xFF) - 127) + * (1.0f / 127.0f); + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) + out_buff[ox++] = (byte) (127 + in_buff[ix++] * 127.0f); + return out_buff; + } + } + + /*************************************************************************** + * + * 16 bit signed/unsigned, little/big-endian + * + **************************************************************************/ + + // PCM 16 bit, signed, little-endian + private static class AudioFloatConversion16SL extends AudioFloatConverter { + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int len = out_offset + out_len; + for (int ox = out_offset; ox < len; ox++) { + out_buff[ox] = ((short) ((in_buff[ix++] & 0xFF) | + (in_buff[ix++] << 8))) * (1.0f / 32767.0f); + } + + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ox = out_offset; + int len = in_offset + in_len; + for (int ix = in_offset; ix < len; ix++) { + int x = (int) (in_buff[ix] * 32767.0); + out_buff[ox++] = (byte) x; + out_buff[ox++] = (byte) (x >>> 8); + } + return out_buff; + } + } + + // PCM 16 bit, signed, big-endian + private static class AudioFloatConversion16SB extends AudioFloatConverter { + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) { + out_buff[ox++] = ((short) ((in_buff[ix++] << 8) | + (in_buff[ix++] & 0xFF))) * (1.0f / 32767.0f); + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) { + int x = (int) (in_buff[ix++] * 32767.0); + out_buff[ox++] = (byte) (x >>> 8); + out_buff[ox++] = (byte) x; + } + return out_buff; + } + } + + // PCM 16 bit, unsigned, little-endian + private static class AudioFloatConversion16UL extends AudioFloatConverter { + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) { + int x = (in_buff[ix++] & 0xFF) | ((in_buff[ix++] & 0xFF) << 8); + out_buff[ox++] = (x - 32767) * (1.0f / 32767.0f); + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) { + int x = 32767 + (int) (in_buff[ix++] * 32767.0); + out_buff[ox++] = (byte) x; + out_buff[ox++] = (byte) (x >>> 8); + } + return out_buff; + } + } + + // PCM 16 bit, unsigned, big-endian + private static class AudioFloatConversion16UB extends AudioFloatConverter { + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) { + int x = ((in_buff[ix++] & 0xFF) << 8) | (in_buff[ix++] & 0xFF); + out_buff[ox++] = (x - 32767) * (1.0f / 32767.0f); + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) { + int x = 32767 + (int) (in_buff[ix++] * 32767.0); + out_buff[ox++] = (byte) (x >>> 8); + out_buff[ox++] = (byte) x; + } + return out_buff; + } + } + + /*************************************************************************** + * + * 24 bit signed/unsigned, little/big-endian + * + **************************************************************************/ + + // PCM 24 bit, signed, little-endian + private static class AudioFloatConversion24SL extends AudioFloatConverter { + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) { + int x = (in_buff[ix++] & 0xFF) | ((in_buff[ix++] & 0xFF) << 8) + | ((in_buff[ix++] & 0xFF) << 16); + if (x > 0x7FFFFF) + x -= 0x1000000; + out_buff[ox++] = x * (1.0f / (float)0x7FFFFF); + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) { + int x = (int) (in_buff[ix++] * (float)0x7FFFFF); + if (x < 0) + x += 0x1000000; + out_buff[ox++] = (byte) x; + out_buff[ox++] = (byte) (x >>> 8); + out_buff[ox++] = (byte) (x >>> 16); + } + return out_buff; + } + } + + // PCM 24 bit, signed, big-endian + private static class AudioFloatConversion24SB extends AudioFloatConverter { + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) { + int x = ((in_buff[ix++] & 0xFF) << 16) + | ((in_buff[ix++] & 0xFF) << 8) | (in_buff[ix++] & 0xFF); + if (x > 0x7FFFFF) + x -= 0x1000000; + out_buff[ox++] = x * (1.0f / (float)0x7FFFFF); + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) { + int x = (int) (in_buff[ix++] * (float)0x7FFFFF); + if (x < 0) + x += 0x1000000; + out_buff[ox++] = (byte) (x >>> 16); + out_buff[ox++] = (byte) (x >>> 8); + out_buff[ox++] = (byte) x; + } + return out_buff; + } + } + + // PCM 24 bit, unsigned, little-endian + private static class AudioFloatConversion24UL extends AudioFloatConverter { + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) { + int x = (in_buff[ix++] & 0xFF) | ((in_buff[ix++] & 0xFF) << 8) + | ((in_buff[ix++] & 0xFF) << 16); + x -= 0x7FFFFF; + out_buff[ox++] = x * (1.0f / (float)0x7FFFFF); + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) { + int x = (int) (in_buff[ix++] * (float)0x7FFFFF); + x += 0x7FFFFF; + out_buff[ox++] = (byte) x; + out_buff[ox++] = (byte) (x >>> 8); + out_buff[ox++] = (byte) (x >>> 16); + } + return out_buff; + } + } + + // PCM 24 bit, unsigned, big-endian + private static class AudioFloatConversion24UB extends AudioFloatConverter { + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) { + int x = ((in_buff[ix++] & 0xFF) << 16) + | ((in_buff[ix++] & 0xFF) << 8) | (in_buff[ix++] & 0xFF); + x -= 0x7FFFFF; + out_buff[ox++] = x * (1.0f / (float)0x7FFFFF); + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) { + int x = (int) (in_buff[ix++] * (float)0x7FFFFF); + x += 0x7FFFFF; + out_buff[ox++] = (byte) (x >>> 16); + out_buff[ox++] = (byte) (x >>> 8); + out_buff[ox++] = (byte) x; + } + return out_buff; + } + } + + /*************************************************************************** + * + * 32 bit signed/unsigned, little/big-endian + * + **************************************************************************/ + + // PCM 32 bit, signed, little-endian + private static class AudioFloatConversion32SL extends AudioFloatConverter { + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) { + int x = (in_buff[ix++] & 0xFF) | ((in_buff[ix++] & 0xFF) << 8) | + ((in_buff[ix++] & 0xFF) << 16) | + ((in_buff[ix++] & 0xFF) << 24); + out_buff[ox++] = x * (1.0f / (float)0x7FFFFFFF); + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) { + int x = (int) (in_buff[ix++] * (float)0x7FFFFFFF); + out_buff[ox++] = (byte) x; + out_buff[ox++] = (byte) (x >>> 8); + out_buff[ox++] = (byte) (x >>> 16); + out_buff[ox++] = (byte) (x >>> 24); + } + return out_buff; + } + } + + // PCM 32 bit, signed, big-endian + private static class AudioFloatConversion32SB extends AudioFloatConverter { + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) { + int x = ((in_buff[ix++] & 0xFF) << 24) | + ((in_buff[ix++] & 0xFF) << 16) | + ((in_buff[ix++] & 0xFF) << 8) | (in_buff[ix++] & 0xFF); + out_buff[ox++] = x * (1.0f / (float)0x7FFFFFFF); + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) { + int x = (int) (in_buff[ix++] * (float)0x7FFFFFFF); + out_buff[ox++] = (byte) (x >>> 24); + out_buff[ox++] = (byte) (x >>> 16); + out_buff[ox++] = (byte) (x >>> 8); + out_buff[ox++] = (byte) x; + } + return out_buff; + } + } + + // PCM 32 bit, unsigned, little-endian + private static class AudioFloatConversion32UL extends AudioFloatConverter { + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) { + int x = (in_buff[ix++] & 0xFF) | ((in_buff[ix++] & 0xFF) << 8) | + ((in_buff[ix++] & 0xFF) << 16) | + ((in_buff[ix++] & 0xFF) << 24); + x -= 0x7FFFFFFF; + out_buff[ox++] = x * (1.0f / (float)0x7FFFFFFF); + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) { + int x = (int) (in_buff[ix++] * (float)0x7FFFFFFF); + x += 0x7FFFFFFF; + out_buff[ox++] = (byte) x; + out_buff[ox++] = (byte) (x >>> 8); + out_buff[ox++] = (byte) (x >>> 16); + out_buff[ox++] = (byte) (x >>> 24); + } + return out_buff; + } + } + + // PCM 32 bit, unsigned, big-endian + private static class AudioFloatConversion32UB extends AudioFloatConverter { + + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) { + int x = ((in_buff[ix++] & 0xFF) << 24) | + ((in_buff[ix++] & 0xFF) << 16) | + ((in_buff[ix++] & 0xFF) << 8) | (in_buff[ix++] & 0xFF); + x -= 0x7FFFFFFF; + out_buff[ox++] = x * (1.0f / (float)0x7FFFFFFF); + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) { + int x = (int) (in_buff[ix++] * (float)0x7FFFFFFF); + x += 0x7FFFFFFF; + out_buff[ox++] = (byte) (x >>> 24); + out_buff[ox++] = (byte) (x >>> 16); + out_buff[ox++] = (byte) (x >>> 8); + out_buff[ox++] = (byte) x; + } + return out_buff; + } + } + + /*************************************************************************** + * + * 32+ bit signed/unsigned, little/big-endian + * + **************************************************************************/ + + // PCM 32+ bit, signed, little-endian + private static class AudioFloatConversion32xSL extends AudioFloatConverter { + + final int xbytes; + + public AudioFloatConversion32xSL(int xbytes) { + this.xbytes = xbytes; + } + + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) { + ix += xbytes; + int x = (in_buff[ix++] & 0xFF) | ((in_buff[ix++] & 0xFF) << 8) + | ((in_buff[ix++] & 0xFF) << 16) + | ((in_buff[ix++] & 0xFF) << 24); + out_buff[ox++] = x * (1.0f / (float)0x7FFFFFFF); + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) { + int x = (int) (in_buff[ix++] * (float)0x7FFFFFFF); + for (int j = 0; j < xbytes; j++) { + out_buff[ox++] = 0; + } + out_buff[ox++] = (byte) x; + out_buff[ox++] = (byte) (x >>> 8); + out_buff[ox++] = (byte) (x >>> 16); + out_buff[ox++] = (byte) (x >>> 24); + } + return out_buff; + } + } + + // PCM 32+ bit, signed, big-endian + private static class AudioFloatConversion32xSB extends AudioFloatConverter { + + final int xbytes; + + public AudioFloatConversion32xSB(int xbytes) { + this.xbytes = xbytes; + } + + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) { + int x = ((in_buff[ix++] & 0xFF) << 24) + | ((in_buff[ix++] & 0xFF) << 16) + | ((in_buff[ix++] & 0xFF) << 8) + | (in_buff[ix++] & 0xFF); + ix += xbytes; + out_buff[ox++] = x * (1.0f / (float)0x7FFFFFFF); + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) { + int x = (int) (in_buff[ix++] * (float)0x7FFFFFFF); + out_buff[ox++] = (byte) (x >>> 24); + out_buff[ox++] = (byte) (x >>> 16); + out_buff[ox++] = (byte) (x >>> 8); + out_buff[ox++] = (byte) x; + for (int j = 0; j < xbytes; j++) { + out_buff[ox++] = 0; + } + } + return out_buff; + } + } + + // PCM 32+ bit, unsigned, little-endian + private static class AudioFloatConversion32xUL extends AudioFloatConverter { + + final int xbytes; + + public AudioFloatConversion32xUL(int xbytes) { + this.xbytes = xbytes; + } + + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) { + ix += xbytes; + int x = (in_buff[ix++] & 0xFF) | ((in_buff[ix++] & 0xFF) << 8) + | ((in_buff[ix++] & 0xFF) << 16) + | ((in_buff[ix++] & 0xFF) << 24); + x -= 0x7FFFFFFF; + out_buff[ox++] = x * (1.0f / (float)0x7FFFFFFF); + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) { + int x = (int) (in_buff[ix++] * (float)0x7FFFFFFF); + x += 0x7FFFFFFF; + for (int j = 0; j < xbytes; j++) { + out_buff[ox++] = 0; + } + out_buff[ox++] = (byte) x; + out_buff[ox++] = (byte) (x >>> 8); + out_buff[ox++] = (byte) (x >>> 16); + out_buff[ox++] = (byte) (x >>> 24); + } + return out_buff; + } + } + + // PCM 32+ bit, unsigned, big-endian + private static class AudioFloatConversion32xUB extends AudioFloatConverter { + + final int xbytes; + + public AudioFloatConversion32xUB(int xbytes) { + this.xbytes = xbytes; + } + + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < out_len; i++) { + int x = ((in_buff[ix++] & 0xFF) << 24) | + ((in_buff[ix++] & 0xFF) << 16) | + ((in_buff[ix++] & 0xFF) << 8) | (in_buff[ix++] & 0xFF); + ix += xbytes; + x -= 2147483647; + out_buff[ox++] = x * (1.0f / 2147483647.0f); + } + return out_buff; + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff, int out_offset) { + int ix = in_offset; + int ox = out_offset; + for (int i = 0; i < in_len; i++) { + int x = (int) (in_buff[ix++] * 2147483647.0); + x += 2147483647; + out_buff[ox++] = (byte) (x >>> 24); + out_buff[ox++] = (byte) (x >>> 16); + out_buff[ox++] = (byte) (x >>> 8); + out_buff[ox++] = (byte) x; + for (int j = 0; j < xbytes; j++) { + out_buff[ox++] = 0; + } + } + return out_buff; + } + } + + public static AudioFloatConverter getConverter(AudioFormat format) { + AudioFloatConverter conv = null; + if (format.getFrameSize() == 0) + return null; + if (format.getFrameSize() != + ((format.getSampleSizeInBits() + 7) / 8) * format.getChannels()) { + return null; + } + if (format.getEncoding().equals(Encoding.PCM_SIGNED)) { + if (format.isBigEndian()) { + if (format.getSampleSizeInBits() <= 8) { + conv = new AudioFloatConversion8S(); + } else if (format.getSampleSizeInBits() > 8 && + format.getSampleSizeInBits() <= 16) { + conv = new AudioFloatConversion16SB(); + } else if (format.getSampleSizeInBits() > 16 && + format.getSampleSizeInBits() <= 24) { + conv = new AudioFloatConversion24SB(); + } else if (format.getSampleSizeInBits() > 24 && + format.getSampleSizeInBits() <= 32) { + conv = new AudioFloatConversion32SB(); + } else if (format.getSampleSizeInBits() > 32) { + conv = new AudioFloatConversion32xSB(((format + .getSampleSizeInBits() + 7) / 8) - 4); + } + } else { + if (format.getSampleSizeInBits() <= 8) { + conv = new AudioFloatConversion8S(); + } else if (format.getSampleSizeInBits() > 8 && + format.getSampleSizeInBits() <= 16) { + conv = new AudioFloatConversion16SL(); + } else if (format.getSampleSizeInBits() > 16 && + format.getSampleSizeInBits() <= 24) { + conv = new AudioFloatConversion24SL(); + } else if (format.getSampleSizeInBits() > 24 && + format.getSampleSizeInBits() <= 32) { + conv = new AudioFloatConversion32SL(); + } else if (format.getSampleSizeInBits() > 32) { + conv = new AudioFloatConversion32xSL(((format + .getSampleSizeInBits() + 7) / 8) - 4); + } + } + } else if (format.getEncoding().equals(Encoding.PCM_UNSIGNED)) { + if (format.isBigEndian()) { + if (format.getSampleSizeInBits() <= 8) { + conv = new AudioFloatConversion8U(); + } else if (format.getSampleSizeInBits() > 8 && + format.getSampleSizeInBits() <= 16) { + conv = new AudioFloatConversion16UB(); + } else if (format.getSampleSizeInBits() > 16 && + format.getSampleSizeInBits() <= 24) { + conv = new AudioFloatConversion24UB(); + } else if (format.getSampleSizeInBits() > 24 && + format.getSampleSizeInBits() <= 32) { + conv = new AudioFloatConversion32UB(); + } else if (format.getSampleSizeInBits() > 32) { + conv = new AudioFloatConversion32xUB((( + format.getSampleSizeInBits() + 7) / 8) - 4); + } + } else { + if (format.getSampleSizeInBits() <= 8) { + conv = new AudioFloatConversion8U(); + } else if (format.getSampleSizeInBits() > 8 && + format.getSampleSizeInBits() <= 16) { + conv = new AudioFloatConversion16UL(); + } else if (format.getSampleSizeInBits() > 16 && + format.getSampleSizeInBits() <= 24) { + conv = new AudioFloatConversion24UL(); + } else if (format.getSampleSizeInBits() > 24 && + format.getSampleSizeInBits() <= 32) { + conv = new AudioFloatConversion32UL(); + } else if (format.getSampleSizeInBits() > 32) { + conv = new AudioFloatConversion32xUL((( + format.getSampleSizeInBits() + 7) / 8) - 4); + } + } + } else if (format.getEncoding().equals(PCM_FLOAT)) { + if (format.getSampleSizeInBits() == 32) { + if (format.isBigEndian()) + conv = new AudioFloatConversion32B(); + else + conv = new AudioFloatConversion32L(); + } else if (format.getSampleSizeInBits() == 64) { + if (format.isBigEndian()) + conv = new AudioFloatConversion64B(); + else + conv = new AudioFloatConversion64L(); + } + + } + + if ((format.getEncoding().equals(Encoding.PCM_SIGNED) || + format.getEncoding().equals(Encoding.PCM_UNSIGNED)) && + (format.getSampleSizeInBits() % 8 != 0)) { + conv = new AudioFloatLSBFilter(conv, format); + } + + if (conv != null) + conv.format = format; + return conv; + } + + private AudioFormat format; + + public AudioFormat getFormat() { + return format; + } + + public abstract float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_offset, int out_len); + + public float[] toFloatArray(byte[] in_buff, float[] out_buff, + int out_offset, int out_len) { + return toFloatArray(in_buff, 0, out_buff, out_offset, out_len); + } + + public float[] toFloatArray(byte[] in_buff, int in_offset, + float[] out_buff, int out_len) { + return toFloatArray(in_buff, in_offset, out_buff, 0, out_len); + } + + public float[] toFloatArray(byte[] in_buff, float[] out_buff, int out_len) { + return toFloatArray(in_buff, 0, out_buff, 0, out_len); + } + + public float[] toFloatArray(byte[] in_buff, float[] out_buff) { + return toFloatArray(in_buff, 0, out_buff, 0, out_buff.length); + } + + public abstract byte[] toByteArray(float[] in_buff, int in_offset, + int in_len, byte[] out_buff, int out_offset); + + public byte[] toByteArray(float[] in_buff, int in_len, byte[] out_buff, + int out_offset) { + return toByteArray(in_buff, 0, in_len, out_buff, out_offset); + } + + public byte[] toByteArray(float[] in_buff, int in_offset, int in_len, + byte[] out_buff) { + return toByteArray(in_buff, in_offset, in_len, out_buff, 0); + } + + public byte[] toByteArray(float[] in_buff, int in_len, byte[] out_buff) { + return toByteArray(in_buff, 0, in_len, out_buff, 0); + } + + public byte[] toByteArray(float[] in_buff, byte[] out_buff) { + return toByteArray(in_buff, 0, in_buff.length, out_buff, 0); + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/AudioFloatFormatConverter.java b/jdk/src/share/classes/com/sun/media/sound/AudioFloatFormatConverter.java new file mode 100644 index 00000000000..4e835f4c192 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/AudioFloatFormatConverter.java @@ -0,0 +1,617 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Arrays; + +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.AudioFormat.Encoding; +import javax.sound.sampled.spi.FormatConversionProvider; + +/** + * This class is used to convert between 8,16,24,32 bit signed/unsigned + * big/litle endian fixed/floating stereo/mono/multi-channel audio streams and + * perform sample-rate conversion if needed. + * + * @author Karl Helgason + */ +public class AudioFloatFormatConverter extends FormatConversionProvider { + + private static class AudioFloatFormatConverterInputStream extends + InputStream { + private AudioFloatConverter converter; + + private AudioFloatInputStream stream; + + private float[] readfloatbuffer; + + private int fsize = 0; + + public AudioFloatFormatConverterInputStream(AudioFormat targetFormat, + AudioFloatInputStream stream) { + this.stream = stream; + converter = AudioFloatConverter.getConverter(targetFormat); + fsize = ((targetFormat.getSampleSizeInBits() + 7) / 8); + } + + public int read() throws IOException { + byte[] b = new byte[1]; + int ret = read(b); + if (ret < 0) + return ret; + return b[0] & 0xFF; + } + + public int read(byte[] b, int off, int len) throws IOException { + + int flen = len / fsize; + if (readfloatbuffer == null || readfloatbuffer.length < flen) + readfloatbuffer = new float[flen]; + int ret = stream.read(readfloatbuffer, 0, flen); + if (ret < 0) + return ret; + converter.toByteArray(readfloatbuffer, 0, ret, b, off); + return ret * fsize; + } + + public int available() throws IOException { + int ret = stream.available(); + if (ret < 0) + return ret; + return ret * fsize; + } + + public void close() throws IOException { + stream.close(); + } + + public synchronized void mark(int readlimit) { + stream.mark(readlimit * fsize); + } + + public boolean markSupported() { + return stream.markSupported(); + } + + public synchronized void reset() throws IOException { + stream.reset(); + } + + public long skip(long n) throws IOException { + long ret = stream.skip(n / fsize); + if (ret < 0) + return ret; + return ret * fsize; + } + + } + + private static class AudioFloatInputStreamChannelMixer extends + AudioFloatInputStream { + + private int targetChannels; + + private int sourceChannels; + + private AudioFloatInputStream ais; + + private AudioFormat targetFormat; + + private float[] conversion_buffer; + + public AudioFloatInputStreamChannelMixer(AudioFloatInputStream ais, + int targetChannels) { + this.sourceChannels = ais.getFormat().getChannels(); + this.targetChannels = targetChannels; + this.ais = ais; + AudioFormat format = ais.getFormat(); + targetFormat = new AudioFormat(format.getEncoding(), format + .getSampleRate(), format.getSampleSizeInBits(), + targetChannels, (format.getFrameSize() / sourceChannels) + * targetChannels, format.getFrameRate(), format + .isBigEndian()); + } + + public int available() throws IOException { + return (ais.available() / sourceChannels) * targetChannels; + } + + public void close() throws IOException { + ais.close(); + } + + public AudioFormat getFormat() { + return targetFormat; + } + + public long getFrameLength() { + return ais.getFrameLength(); + } + + public void mark(int readlimit) { + ais.mark((readlimit / targetChannels) * sourceChannels); + } + + public boolean markSupported() { + return ais.markSupported(); + } + + public int read(float[] b, int off, int len) throws IOException { + int len2 = (len / targetChannels) * sourceChannels; + if (conversion_buffer == null || conversion_buffer.length < len2) + conversion_buffer = new float[len2]; + int ret = ais.read(conversion_buffer, 0, len2); + if (ret < 0) + return ret; + if (sourceChannels == 1) { + int cs = targetChannels; + for (int c = 0; c < targetChannels; c++) { + for (int i = 0, ix = off + c; i < len2; i++, ix += cs) { + b[ix] = conversion_buffer[i]; + ; + } + } + } else if (targetChannels == 1) { + int cs = sourceChannels; + for (int i = 0, ix = off; i < len2; i += cs, ix++) { + b[ix] = conversion_buffer[i]; + } + for (int c = 1; c < sourceChannels; c++) { + for (int i = c, ix = off; i < len2; i += cs, ix++) { + b[ix] += conversion_buffer[i]; + ; + } + } + float vol = 1f / ((float) sourceChannels); + for (int i = 0, ix = off; i < len2; i += cs, ix++) { + b[ix] *= vol; + } + } else { + int minChannels = Math.min(sourceChannels, targetChannels); + int off_len = off + len; + int ct = targetChannels; + int cs = sourceChannels; + for (int c = 0; c < minChannels; c++) { + for (int i = off + c, ix = c; i < off_len; i += ct, ix += cs) { + b[i] = conversion_buffer[ix]; + } + } + for (int c = minChannels; c < targetChannels; c++) { + for (int i = off + c; i < off_len; i += ct) { + b[i] = 0; + } + } + } + return (ret / sourceChannels) * targetChannels; + } + + public void reset() throws IOException { + ais.reset(); + } + + public long skip(long len) throws IOException { + long ret = ais.skip((len / targetChannels) * sourceChannels); + if (ret < 0) + return ret; + return (ret / sourceChannels) * targetChannels; + } + + } + + private static class AudioFloatInputStreamResampler extends + AudioFloatInputStream { + + private AudioFloatInputStream ais; + + private AudioFormat targetFormat; + + private float[] skipbuffer; + + private SoftAbstractResampler resampler; + + private float[] pitch = new float[1]; + + private float[] ibuffer2; + + private float[][] ibuffer; + + private float ibuffer_index = 0; + + private int ibuffer_len = 0; + + private int nrofchannels = 0; + + private float[][] cbuffer; + + private int buffer_len = 512; + + private int pad; + + private int pad2; + + private float[] ix = new float[1]; + + private int[] ox = new int[1]; + + private float[][] mark_ibuffer = null; + + private float mark_ibuffer_index = 0; + + private int mark_ibuffer_len = 0; + + public AudioFloatInputStreamResampler(AudioFloatInputStream ais, + AudioFormat format) { + this.ais = ais; + AudioFormat sourceFormat = ais.getFormat(); + targetFormat = new AudioFormat(sourceFormat.getEncoding(), format + .getSampleRate(), sourceFormat.getSampleSizeInBits(), + sourceFormat.getChannels(), sourceFormat.getFrameSize(), + format.getSampleRate(), sourceFormat.isBigEndian()); + nrofchannels = targetFormat.getChannels(); + Object interpolation = format.getProperty("interpolation"); + if (interpolation != null && (interpolation instanceof String)) { + String resamplerType = (String) interpolation; + if (resamplerType.equalsIgnoreCase("point")) + this.resampler = new SoftPointResampler(); + if (resamplerType.equalsIgnoreCase("linear")) + this.resampler = new SoftLinearResampler2(); + if (resamplerType.equalsIgnoreCase("linear1")) + this.resampler = new SoftLinearResampler(); + if (resamplerType.equalsIgnoreCase("linear2")) + this.resampler = new SoftLinearResampler2(); + if (resamplerType.equalsIgnoreCase("cubic")) + this.resampler = new SoftCubicResampler(); + if (resamplerType.equalsIgnoreCase("lanczos")) + this.resampler = new SoftLanczosResampler(); + if (resamplerType.equalsIgnoreCase("sinc")) + this.resampler = new SoftSincResampler(); + } + if (resampler == null) + resampler = new SoftLinearResampler2(); // new + // SoftLinearResampler2(); + pitch[0] = sourceFormat.getSampleRate() / format.getSampleRate(); + pad = resampler.getPadding(); + pad2 = pad * 2; + ibuffer = new float[nrofchannels][buffer_len + pad2]; + ibuffer2 = new float[nrofchannels * buffer_len]; + ibuffer_index = buffer_len + pad; + ibuffer_len = buffer_len; + } + + public int available() throws IOException { + return 0; + } + + public void close() throws IOException { + ais.close(); + } + + public AudioFormat getFormat() { + return targetFormat; + } + + public long getFrameLength() { + return AudioSystem.NOT_SPECIFIED; // ais.getFrameLength(); + } + + public void mark(int readlimit) { + ais.mark((int) (readlimit * pitch[0])); + mark_ibuffer_index = ibuffer_index; + mark_ibuffer_len = ibuffer_len; + if (mark_ibuffer == null) { + mark_ibuffer = new float[ibuffer.length][ibuffer[0].length]; + } + for (int c = 0; c < ibuffer.length; c++) { + float[] from = ibuffer[c]; + float[] to = mark_ibuffer[c]; + for (int i = 0; i < to.length; i++) { + to[i] = from[i]; + } + } + } + + public boolean markSupported() { + return ais.markSupported(); + } + + private void readNextBuffer() throws IOException { + + if (ibuffer_len == -1) + return; + + for (int c = 0; c < nrofchannels; c++) { + float[] buff = ibuffer[c]; + int buffer_len_pad = ibuffer_len + pad2; + for (int i = ibuffer_len, ix = 0; i < buffer_len_pad; i++, ix++) { + buff[ix] = buff[i]; + } + } + + ibuffer_index -= (ibuffer_len); + + ibuffer_len = ais.read(ibuffer2); + if (ibuffer_len >= 0) { + while (ibuffer_len < ibuffer2.length) { + int ret = ais.read(ibuffer2, ibuffer_len, ibuffer2.length + - ibuffer_len); + if (ret == -1) + break; + ibuffer_len += ret; + } + Arrays.fill(ibuffer2, ibuffer_len, ibuffer2.length, 0); + ibuffer_len /= nrofchannels; + } else { + Arrays.fill(ibuffer2, 0, ibuffer2.length, 0); + } + + int ibuffer2_len = ibuffer2.length; + for (int c = 0; c < nrofchannels; c++) { + float[] buff = ibuffer[c]; + for (int i = c, ix = pad2; i < ibuffer2_len; i += nrofchannels, ix++) { + buff[ix] = ibuffer2[i]; + } + } + + } + + public int read(float[] b, int off, int len) throws IOException { + + if (cbuffer == null || cbuffer[0].length < len / nrofchannels) { + cbuffer = new float[nrofchannels][len / nrofchannels]; + } + if (ibuffer_len == -1) + return -1; + if (len < 0) + return 0; + int remain = len / nrofchannels; + int destPos = 0; + int in_end = ibuffer_len; + while (remain > 0) { + if (ibuffer_len >= 0) { + if (ibuffer_index >= (ibuffer_len + pad)) + readNextBuffer(); + in_end = ibuffer_len + pad; + } + + if (ibuffer_len < 0) { + in_end = pad2; + if (ibuffer_index >= in_end) + break; + } + + if (ibuffer_index < 0) + break; + int preDestPos = destPos; + for (int c = 0; c < nrofchannels; c++) { + ix[0] = ibuffer_index; + ox[0] = destPos; + float[] buff = ibuffer[c]; + resampler.interpolate(buff, ix, in_end, pitch, 0, + cbuffer[c], ox, len / nrofchannels); + } + ibuffer_index = ix[0]; + destPos = ox[0]; + remain -= destPos - preDestPos; + } + for (int c = 0; c < nrofchannels; c++) { + int ix = 0; + float[] buff = cbuffer[c]; + for (int i = c; i < b.length; i += nrofchannels) { + b[i] = buff[ix++]; + } + } + return len - remain * nrofchannels; + } + + public void reset() throws IOException { + ais.reset(); + if (mark_ibuffer == null) + return; + ibuffer_index = mark_ibuffer_index; + ibuffer_len = mark_ibuffer_len; + for (int c = 0; c < ibuffer.length; c++) { + float[] from = mark_ibuffer[c]; + float[] to = ibuffer[c]; + for (int i = 0; i < to.length; i++) { + to[i] = from[i]; + } + } + + } + + public long skip(long len) throws IOException { + if (len > 0) + return 0; + if (skipbuffer == null) + skipbuffer = new float[1024 * targetFormat.getFrameSize()]; + float[] l_skipbuffer = skipbuffer; + long remain = len; + while (remain > 0) { + int ret = read(l_skipbuffer, 0, (int) Math.min(remain, + skipbuffer.length)); + if (ret < 0) { + if (remain == len) + return ret; + break; + } + remain -= ret; + } + return len - remain; + + } + + } + + private Encoding[] formats = { Encoding.PCM_SIGNED, Encoding.PCM_UNSIGNED, + AudioFloatConverter.PCM_FLOAT }; + + public AudioInputStream getAudioInputStream(Encoding targetEncoding, + AudioInputStream sourceStream) { + if (sourceStream.getFormat().getEncoding().equals(targetEncoding)) + return sourceStream; + AudioFormat format = sourceStream.getFormat(); + int channels = format.getChannels(); + Encoding encoding = targetEncoding; + float samplerate = format.getSampleRate(); + int bits = format.getSampleSizeInBits(); + boolean bigendian = format.isBigEndian(); + if (targetEncoding.equals(AudioFloatConverter.PCM_FLOAT)) + bits = 32; + AudioFormat targetFormat = new AudioFormat(encoding, samplerate, bits, + channels, channels * bits / 8, samplerate, bigendian); + return getAudioInputStream(targetFormat, sourceStream); + } + + public AudioInputStream getAudioInputStream(AudioFormat targetFormat, + AudioInputStream sourceStream) { + if (!isConversionSupported(targetFormat, sourceStream.getFormat())) + throw new IllegalArgumentException("Unsupported conversion: " + + sourceStream.getFormat().toString() + " to " + + targetFormat.toString()); + return getAudioInputStream(targetFormat, AudioFloatInputStream + .getInputStream(sourceStream)); + } + + public AudioInputStream getAudioInputStream(AudioFormat targetFormat, + AudioFloatInputStream sourceStream) { + + if (!isConversionSupported(targetFormat, sourceStream.getFormat())) + throw new IllegalArgumentException("Unsupported conversion: " + + sourceStream.getFormat().toString() + " to " + + targetFormat.toString()); + if (targetFormat.getChannels() != sourceStream.getFormat() + .getChannels()) + sourceStream = new AudioFloatInputStreamChannelMixer(sourceStream, + targetFormat.getChannels()); + if (Math.abs(targetFormat.getSampleRate() + - sourceStream.getFormat().getSampleRate()) > 0.000001) + sourceStream = new AudioFloatInputStreamResampler(sourceStream, + targetFormat); + return new AudioInputStream(new AudioFloatFormatConverterInputStream( + targetFormat, sourceStream), targetFormat, sourceStream + .getFrameLength()); + } + + public Encoding[] getSourceEncodings() { + return new Encoding[] { Encoding.PCM_SIGNED, Encoding.PCM_UNSIGNED, + AudioFloatConverter.PCM_FLOAT }; + } + + public Encoding[] getTargetEncodings() { + return new Encoding[] { Encoding.PCM_SIGNED, Encoding.PCM_UNSIGNED, + AudioFloatConverter.PCM_FLOAT }; + } + + public Encoding[] getTargetEncodings(AudioFormat sourceFormat) { + if (AudioFloatConverter.getConverter(sourceFormat) == null) + return new Encoding[0]; + return new Encoding[] { Encoding.PCM_SIGNED, Encoding.PCM_UNSIGNED, + AudioFloatConverter.PCM_FLOAT }; + } + + public AudioFormat[] getTargetFormats(Encoding targetEncoding, + AudioFormat sourceFormat) { + if (AudioFloatConverter.getConverter(sourceFormat) == null) + return new AudioFormat[0]; + int channels = sourceFormat.getChannels(); + + ArrayList formats = new ArrayList(); + + if (targetEncoding.equals(Encoding.PCM_SIGNED)) + formats.add(new AudioFormat(Encoding.PCM_SIGNED, + AudioSystem.NOT_SPECIFIED, 8, channels, channels, + AudioSystem.NOT_SPECIFIED, false)); + if (targetEncoding.equals(Encoding.PCM_UNSIGNED)) + formats.add(new AudioFormat(Encoding.PCM_UNSIGNED, + AudioSystem.NOT_SPECIFIED, 8, channels, channels, + AudioSystem.NOT_SPECIFIED, false)); + + for (int bits = 16; bits < 32; bits += 8) { + if (targetEncoding.equals(Encoding.PCM_SIGNED)) { + formats.add(new AudioFormat(Encoding.PCM_SIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(Encoding.PCM_SIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, true)); + } + if (targetEncoding.equals(Encoding.PCM_UNSIGNED)) { + formats.add(new AudioFormat(Encoding.PCM_UNSIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, true)); + formats.add(new AudioFormat(Encoding.PCM_UNSIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, false)); + } + } + + if (targetEncoding.equals(AudioFloatConverter.PCM_FLOAT)) { + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 32, channels, channels * 4, + AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 32, channels, channels * 4, + AudioSystem.NOT_SPECIFIED, true)); + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 64, channels, channels * 8, + AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 64, channels, channels * 8, + AudioSystem.NOT_SPECIFIED, true)); + } + + return formats.toArray(new AudioFormat[formats.size()]); + } + + public boolean isConversionSupported(AudioFormat targetFormat, + AudioFormat sourceFormat) { + if (AudioFloatConverter.getConverter(sourceFormat) == null) + return false; + if (AudioFloatConverter.getConverter(targetFormat) == null) + return false; + if (sourceFormat.getChannels() <= 0) + return false; + if (targetFormat.getChannels() <= 0) + return false; + return true; + } + + public boolean isConversionSupported(Encoding targetEncoding, + AudioFormat sourceFormat) { + if (AudioFloatConverter.getConverter(sourceFormat) == null) + return false; + for (int i = 0; i < formats.length; i++) { + if (targetEncoding.equals(formats[i])) + return true; + } + return false; + } + +} diff --git a/jdk/src/share/classes/com/sun/media/sound/AudioFloatInputStream.java b/jdk/src/share/classes/com/sun/media/sound/AudioFloatInputStream.java new file mode 100644 index 00000000000..9c3673721c3 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/AudioFloatInputStream.java @@ -0,0 +1,281 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.UnsupportedAudioFileException; + +/** + * This class is used to create AudioFloatInputStream from AudioInputStream and + * byte buffers. + * + * @author Karl Helgason + */ +public abstract class AudioFloatInputStream { + + private static class BytaArrayAudioFloatInputStream + extends AudioFloatInputStream { + + private int pos = 0; + private int markpos = 0; + private AudioFloatConverter converter; + private AudioFormat format; + private byte[] buffer; + private int buffer_offset; + private int buffer_len; + private int framesize_pc; + + public BytaArrayAudioFloatInputStream(AudioFloatConverter converter, + byte[] buffer, int offset, int len) { + this.converter = converter; + this.format = converter.getFormat(); + this.buffer = buffer; + this.buffer_offset = offset; + framesize_pc = format.getFrameSize() / format.getChannels(); + this.buffer_len = len / framesize_pc; + + } + + public AudioFormat getFormat() { + return format; + } + + public long getFrameLength() { + return buffer_len;// / format.getFrameSize(); + } + + public int read(float[] b, int off, int len) throws IOException { + if (b == null) + throw new NullPointerException(); + if (off < 0 || len < 0 || len > b.length - off) + throw new IndexOutOfBoundsException(); + if (pos >= buffer_len) + return -1; + if (len == 0) + return 0; + if (pos + len > buffer_len) + len = buffer_len - pos; + converter.toFloatArray(buffer, buffer_offset + pos * framesize_pc, + b, off, len); + pos += len; + return len; + } + + public long skip(long len) throws IOException { + if (pos >= buffer_len) + return -1; + if (len <= 0) + return 0; + if (pos + len > buffer_len) + len = buffer_len - pos; + pos += len; + return len; + } + + public int available() throws IOException { + return buffer_len - pos; + } + + public void close() throws IOException { + } + + public void mark(int readlimit) { + markpos = pos; + } + + public boolean markSupported() { + return true; + } + + public void reset() throws IOException { + pos = markpos; + } + } + + private static class DirectAudioFloatInputStream + extends AudioFloatInputStream { + + private AudioInputStream stream; + private AudioFloatConverter converter; + private int framesize_pc; // framesize / channels + private byte[] buffer; + + public DirectAudioFloatInputStream(AudioInputStream stream) { + converter = AudioFloatConverter.getConverter(stream.getFormat()); + if (converter == null) { + AudioFormat format = stream.getFormat(); + AudioFormat newformat; + + AudioFormat[] formats = AudioSystem.getTargetFormats( + AudioFormat.Encoding.PCM_SIGNED, format); + if (formats.length != 0) { + newformat = formats[0]; + } else { + float samplerate = format.getSampleRate(); + int samplesizeinbits = format.getSampleSizeInBits(); + int framesize = format.getFrameSize(); + float framerate = format.getFrameRate(); + samplesizeinbits = 16; + framesize = format.getChannels() * (samplesizeinbits / 8); + framerate = samplerate; + + newformat = new AudioFormat( + AudioFormat.Encoding.PCM_SIGNED, samplerate, + samplesizeinbits, format.getChannels(), framesize, + framerate, false); + } + + stream = AudioSystem.getAudioInputStream(newformat, stream); + converter = AudioFloatConverter.getConverter(stream.getFormat()); + } + framesize_pc = stream.getFormat().getFrameSize() + / stream.getFormat().getChannels(); + this.stream = stream; + } + + public AudioFormat getFormat() { + return stream.getFormat(); + } + + public long getFrameLength() { + return stream.getFrameLength(); + } + + public int read(float[] b, int off, int len) throws IOException { + int b_len = len * framesize_pc; + if (buffer == null || buffer.length < b_len) + buffer = new byte[b_len]; + int ret = stream.read(buffer, 0, b_len); + if (ret == -1) + return -1; + converter.toFloatArray(buffer, b, off, ret / framesize_pc); + return ret / framesize_pc; + } + + public long skip(long len) throws IOException { + long b_len = len * framesize_pc; + long ret = stream.skip(b_len); + if (ret == -1) + return -1; + return ret / framesize_pc; + } + + public int available() throws IOException { + return stream.available() / framesize_pc; + } + + public void close() throws IOException { + stream.close(); + } + + public void mark(int readlimit) { + stream.mark(readlimit * framesize_pc); + } + + public boolean markSupported() { + return stream.markSupported(); + } + + public void reset() throws IOException { + stream.reset(); + } + } + + public static AudioFloatInputStream getInputStream(URL url) + throws UnsupportedAudioFileException, IOException { + return new DirectAudioFloatInputStream(AudioSystem + .getAudioInputStream(url)); + } + + public static AudioFloatInputStream getInputStream(File file) + throws UnsupportedAudioFileException, IOException { + return new DirectAudioFloatInputStream(AudioSystem + .getAudioInputStream(file)); + } + + public static AudioFloatInputStream getInputStream(InputStream stream) + throws UnsupportedAudioFileException, IOException { + return new DirectAudioFloatInputStream(AudioSystem + .getAudioInputStream(stream)); + } + + public static AudioFloatInputStream getInputStream( + AudioInputStream stream) { + return new DirectAudioFloatInputStream(stream); + } + + public static AudioFloatInputStream getInputStream(AudioFormat format, + byte[] buffer, int offset, int len) { + AudioFloatConverter converter = AudioFloatConverter + .getConverter(format); + if (converter != null) + return new BytaArrayAudioFloatInputStream(converter, buffer, + offset, len); + + InputStream stream = new ByteArrayInputStream(buffer, offset, len); + long aLen = format.getFrameSize() == AudioSystem.NOT_SPECIFIED + ? AudioSystem.NOT_SPECIFIED : len / format.getFrameSize(); + AudioInputStream astream = new AudioInputStream(stream, format, aLen); + return getInputStream(astream); + } + + public abstract AudioFormat getFormat(); + + public abstract long getFrameLength(); + + public abstract int read(float[] b, int off, int len) throws IOException; + + public int read(float[] b) throws IOException { + return read(b, 0, b.length); + } + + public float read() throws IOException { + float[] b = new float[1]; + int ret = read(b, 0, 1); + if (ret == -1 || ret == 0) + return 0; + return b[0]; + } + + public abstract long skip(long len) throws IOException; + + public abstract int available() throws IOException; + + public abstract void close() throws IOException; + + public abstract void mark(int readlimit); + + public abstract boolean markSupported(); + + public abstract void reset() throws IOException; +} diff --git a/jdk/src/share/classes/com/sun/media/sound/AudioSynthesizer.java b/jdk/src/share/classes/com/sun/media/sound/AudioSynthesizer.java new file mode 100644 index 00000000000..247e03f04ab --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/AudioSynthesizer.java @@ -0,0 +1,128 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.Map; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Synthesizer; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.SourceDataLine; + +/** + * AudioSynthesizer is a Synthesizer + * which renders it's output audio into SourceDataLine + * or AudioInputStream. + * + * @see MidiSystem#getSynthesizer + * @see Synthesizer + * + * @author Karl Helgason + */ +public interface AudioSynthesizer extends Synthesizer { + + /** + * Obtains the current format (encoding, sample rate, number of channels, + * etc.) of the synthesizer audio data. + * + *

If the synthesizer is not open and has never been opened, it returns + * the default format. + * + * @return current audio data format + * @see AudioFormat + */ + public AudioFormat getFormat(); + + /** + * Gets information about the possible properties for the synthesizer. + * + * @param info a proposed list of tag/value pairs that will be sent on open. + * @return an array of AudioSynthesizerPropertyInfo objects + * describing possible properties. This array may be an empty array if + * no properties are required. + */ + public AudioSynthesizerPropertyInfo[] getPropertyInfo( + Map info); + + /** + * Opens the synthesizer and starts rendering audio into + * SourceDataLine. + * + *

An application opening a synthesizer explicitly with this call + * has to close the synthesizer by calling {@link #close}. This is + * necessary to release system resources and allow applications to + * exit cleanly. + * + *

Note that some synthesizers, once closed, cannot be reopened. + * Attempts to reopen such a synthesizer will always result in + * a MidiUnavailableException. + * + * @param line which AudioSynthesizer writes output audio into. + * If line is null, then line from system default mixer is used. + * @param info a Map object containing + * properties for additional configuration supported by synthesizer. + * If info is null then default settings are used. + * + * @throws MidiUnavailableException thrown if the synthesizer cannot be + * opened due to resource restrictions. + * @throws SecurityException thrown if the synthesizer cannot be + * opened due to security restrictions. + * + * @see #close + * @see #isOpen + */ + public void open(SourceDataLine line, Map info) + throws MidiUnavailableException; + + /** + * Opens the synthesizer and renders audio into returned + * AudioInputStream. + * + *

An application opening a synthesizer explicitly with this call + * has to close the synthesizer by calling {@link #close}. This is + * necessary to release system resources and allow applications to + * exit cleanly. + * + *

Note that some synthesizers, once closed, cannot be reopened. + * Attempts to reopen such a synthesizer will always result in + * a MidiUnavailableException. + * + * @param targetFormat specifies the AudioFormat + * used in returned AudioInputStream. + * @param info a Map object containing + * properties for additional configuration supported by synthesizer. + * If info is null then default settings are used. + * + * @throws MidiUnavailableException thrown if the synthesizer cannot be + * opened due to resource restrictions. + * @throws SecurityException thrown if the synthesizer cannot be + * opened due to security restrictions. + * + * @see #close + * @see #isOpen + */ + public AudioInputStream openStream(AudioFormat targetFormat, + Map info) throws MidiUnavailableException; +} diff --git a/jdk/src/share/classes/com/sun/media/sound/AudioSynthesizerPropertyInfo.java b/jdk/src/share/classes/com/sun/media/sound/AudioSynthesizerPropertyInfo.java new file mode 100644 index 00000000000..cf40dda256a --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/AudioSynthesizerPropertyInfo.java @@ -0,0 +1,76 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * Information about property used in opening AudioSynthesizer. + * + * @author Karl Helgason + */ +public class AudioSynthesizerPropertyInfo { + + /** + * Constructs a AudioSynthesizerPropertyInfo object with a given + * name and value. The description and choices + * are intialized by null values. + * + * @param name the name of the property + * @param value the current value or class used for values. + * + */ + public AudioSynthesizerPropertyInfo(String name, Object value) { + this.name = name; + this.value = value; + if (value instanceof Class) + valueClass = (Class)value; + else if (value != null) + valueClass = value.getClass(); + } + /** + * The name of the property. + */ + public String name; + /** + * A brief description of the property, which may be null. + */ + public String description = null; + /** + * The value field specifies the current value of + * the property. + */ + public Object value = null; + /** + * The valueClass field specifies class + * used in value field. + */ + public Class valueClass = null; + /** + * An array of possible values if the value for the field + * AudioSynthesizerPropertyInfo.value may be selected + * from a particular set of values; otherwise null. + */ + public Object[] choices = null; + +} diff --git a/jdk/src/share/classes/com/sun/media/sound/DLSInfo.java b/jdk/src/share/classes/com/sun/media/sound/DLSInfo.java new file mode 100644 index 00000000000..4e904216138 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/DLSInfo.java @@ -0,0 +1,109 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * This class is used to store information to describe soundbanks, instruments + * and samples. It is stored inside a "INFO" List Chunk inside DLS files. + * + * @author Karl Helgason + */ +public class DLSInfo { + + /** + * (INAM) Title or subject. + */ + public String name = "untitled"; + /** + * (ICRD) Date of creation, the format is: YYYY-MM-DD. + * For example 2007-01-01 for 1. january of year 2007. + */ + public String creationDate = null; + /** + * (IENG) Name of engineer who created the object. + */ + public String engineers = null; + /** + * (IPRD) Name of the product which the object is intended for. + */ + public String product = null; + /** + * (ICOP) Copyright information. + */ + public String copyright = null; + /** + * (ICMT) General comments. Doesn't contain newline characters. + */ + public String comments = null; + /** + * (ISFT) Name of software package used to create the file. + */ + public String tools = null; + /** + * (IARL) Where content is archived. + */ + public String archival_location = null; + /** + * (IART) Artists of original content. + */ + public String artist = null; + /** + * (ICMS) Names of persons or orginizations who commissioned the file. + */ + public String commissioned = null; + /** + * (IGNR) Genre of the work. + * Example: jazz, classical, rock, etc. + */ + public String genre = null; + /** + * (IKEY) List of keyword that describe the content. + * Examples: FX, bird, piano, etc. + */ + public String keywords = null; + /** + * (IMED) Describes original medium of the data. + * For example: record, CD, etc. + */ + public String medium = null; + /** + * (ISBJ) Description of the content. + */ + public String subject = null; + /** + * (ISRC) Name of person or orginization who supplied + * orginal material for the file. + */ + public String source = null; + /** + * (ISRF) Source media for sample data is from. + * For example: CD, TV, etc. + */ + public String source_form = null; + /** + * (ITCH) Technician who sample the file/object. + */ + public String technician = null; +} diff --git a/jdk/src/share/classes/com/sun/media/sound/DLSInstrument.java b/jdk/src/share/classes/com/sun/media/sound/DLSInstrument.java new file mode 100644 index 00000000000..c4912314abb --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/DLSInstrument.java @@ -0,0 +1,448 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.sound.midi.Patch; + +/** + * This class is used to store information to describe instrument. + * It contains list of regions and modulators. + * It is stored inside a "ins " List Chunk inside DLS files. + * In the DLS documentation a modulator is called articulator. + * + * @author Karl Helgason + */ +public class DLSInstrument extends ModelInstrument { + + protected int preset = 0; + protected int bank = 0; + protected boolean druminstrument = false; + protected byte[] guid = null; + protected DLSInfo info = new DLSInfo(); + protected List regions = new ArrayList(); + protected List modulators = new ArrayList(); + + public DLSInstrument() { + super(null, null, null, null); + } + + public DLSInstrument(DLSSoundbank soundbank) { + super(soundbank, null, null, null); + } + + public DLSInfo getInfo() { + return info; + } + + public String getName() { + return info.name; + } + + public void setName(String name) { + info.name = name; + } + + public ModelPatch getPatch() { + return new ModelPatch(bank, preset, druminstrument); + } + + public void setPatch(Patch patch) { + if (patch instanceof ModelPatch && ((ModelPatch)patch).isPercussion()) { + druminstrument = true; + bank = patch.getBank(); + preset = patch.getProgram(); + } else { + druminstrument = false; + bank = patch.getBank(); + preset = patch.getProgram(); + } + } + + public Object getData() { + return null; + } + + public List getRegions() { + return regions; + } + + public List getModulators() { + return modulators; + } + + public String toString() { + if (druminstrument) + return "Drumkit: " + info.name + + " bank #" + bank + " preset #" + preset; + else + return "Instrument: " + info.name + + " bank #" + bank + " preset #" + preset; + } + + private ModelIdentifier convertToModelDest(int dest) { + if (dest == DLSModulator.CONN_DST_NONE) + return null; + if (dest == DLSModulator.CONN_DST_GAIN) + return ModelDestination.DESTINATION_GAIN; + if (dest == DLSModulator.CONN_DST_PITCH) + return ModelDestination.DESTINATION_PITCH; + if (dest == DLSModulator.CONN_DST_PAN) + return ModelDestination.DESTINATION_PAN; + + if (dest == DLSModulator.CONN_DST_LFO_FREQUENCY) + return ModelDestination.DESTINATION_LFO1_FREQ; + if (dest == DLSModulator.CONN_DST_LFO_STARTDELAY) + return ModelDestination.DESTINATION_LFO1_DELAY; + + if (dest == DLSModulator.CONN_DST_EG1_ATTACKTIME) + return ModelDestination.DESTINATION_EG1_ATTACK; + if (dest == DLSModulator.CONN_DST_EG1_DECAYTIME) + return ModelDestination.DESTINATION_EG1_DECAY; + if (dest == DLSModulator.CONN_DST_EG1_RELEASETIME) + return ModelDestination.DESTINATION_EG1_RELEASE; + if (dest == DLSModulator.CONN_DST_EG1_SUSTAINLEVEL) + return ModelDestination.DESTINATION_EG1_SUSTAIN; + + if (dest == DLSModulator.CONN_DST_EG2_ATTACKTIME) + return ModelDestination.DESTINATION_EG2_ATTACK; + if (dest == DLSModulator.CONN_DST_EG2_DECAYTIME) + return ModelDestination.DESTINATION_EG2_DECAY; + if (dest == DLSModulator.CONN_DST_EG2_RELEASETIME) + return ModelDestination.DESTINATION_EG2_RELEASE; + if (dest == DLSModulator.CONN_DST_EG2_SUSTAINLEVEL) + return ModelDestination.DESTINATION_EG2_SUSTAIN; + + // DLS2 Destinations + if (dest == DLSModulator.CONN_DST_KEYNUMBER) + return ModelDestination.DESTINATION_KEYNUMBER; + + if (dest == DLSModulator.CONN_DST_CHORUS) + return ModelDestination.DESTINATION_CHORUS; + if (dest == DLSModulator.CONN_DST_REVERB) + return ModelDestination.DESTINATION_REVERB; + + if (dest == DLSModulator.CONN_DST_VIB_FREQUENCY) + return ModelDestination.DESTINATION_LFO2_FREQ; + if (dest == DLSModulator.CONN_DST_VIB_STARTDELAY) + return ModelDestination.DESTINATION_LFO2_DELAY; + + if (dest == DLSModulator.CONN_DST_EG1_DELAYTIME) + return ModelDestination.DESTINATION_EG1_DELAY; + if (dest == DLSModulator.CONN_DST_EG1_HOLDTIME) + return ModelDestination.DESTINATION_EG1_HOLD; + if (dest == DLSModulator.CONN_DST_EG1_SHUTDOWNTIME) + return ModelDestination.DESTINATION_EG1_SHUTDOWN; + + if (dest == DLSModulator.CONN_DST_EG2_DELAYTIME) + return ModelDestination.DESTINATION_EG2_DELAY; + if (dest == DLSModulator.CONN_DST_EG2_HOLDTIME) + return ModelDestination.DESTINATION_EG2_HOLD; + + if (dest == DLSModulator.CONN_DST_FILTER_CUTOFF) + return ModelDestination.DESTINATION_FILTER_FREQ; + if (dest == DLSModulator.CONN_DST_FILTER_Q) + return ModelDestination.DESTINATION_FILTER_Q; + + return null; + } + + private ModelIdentifier convertToModelSrc(int src) { + if (src == DLSModulator.CONN_SRC_NONE) + return null; + + if (src == DLSModulator.CONN_SRC_LFO) + return ModelSource.SOURCE_LFO1; + if (src == DLSModulator.CONN_SRC_KEYONVELOCITY) + return ModelSource.SOURCE_NOTEON_VELOCITY; + if (src == DLSModulator.CONN_SRC_KEYNUMBER) + return ModelSource.SOURCE_NOTEON_KEYNUMBER; + if (src == DLSModulator.CONN_SRC_EG1) + return ModelSource.SOURCE_EG1; + if (src == DLSModulator.CONN_SRC_EG2) + return ModelSource.SOURCE_EG2; + if (src == DLSModulator.CONN_SRC_PITCHWHEEL) + return ModelSource.SOURCE_MIDI_PITCH; + if (src == DLSModulator.CONN_SRC_CC1) + return new ModelIdentifier("midi_cc", "1", 0); + if (src == DLSModulator.CONN_SRC_CC7) + return new ModelIdentifier("midi_cc", "7", 0); + if (src == DLSModulator.CONN_SRC_CC10) + return new ModelIdentifier("midi_cc", "10", 0); + if (src == DLSModulator.CONN_SRC_CC11) + return new ModelIdentifier("midi_cc", "11", 0); + if (src == DLSModulator.CONN_SRC_RPN0) + return new ModelIdentifier("midi_rpn", "0", 0); + if (src == DLSModulator.CONN_SRC_RPN1) + return new ModelIdentifier("midi_rpn", "1", 0); + + if (src == DLSModulator.CONN_SRC_POLYPRESSURE) + return ModelSource.SOURCE_MIDI_POLY_PRESSURE; + if (src == DLSModulator.CONN_SRC_CHANNELPRESSURE) + return ModelSource.SOURCE_MIDI_CHANNEL_PRESSURE; + if (src == DLSModulator.CONN_SRC_VIBRATO) + return ModelSource.SOURCE_LFO2; + if (src == DLSModulator.CONN_SRC_MONOPRESSURE) + return ModelSource.SOURCE_MIDI_CHANNEL_PRESSURE; + + if (src == DLSModulator.CONN_SRC_CC91) + return new ModelIdentifier("midi_cc", "91", 0); + if (src == DLSModulator.CONN_SRC_CC93) + return new ModelIdentifier("midi_cc", "93", 0); + + return null; + } + + private ModelConnectionBlock convertToModel(DLSModulator mod) { + ModelIdentifier source = convertToModelSrc(mod.getSource()); + ModelIdentifier control = convertToModelSrc(mod.getControl()); + ModelIdentifier destination_id = + convertToModelDest(mod.getDestination()); + + int scale = mod.getScale(); + double f_scale; + if (scale == Integer.MIN_VALUE) + f_scale = Double.NEGATIVE_INFINITY; + else + f_scale = scale / 65536.0; + + if (destination_id != null) { + ModelSource src = null; + ModelSource ctrl = null; + ModelConnectionBlock block = new ModelConnectionBlock(); + if (control != null) { + ModelSource s = new ModelSource(); + if (control == ModelSource.SOURCE_MIDI_PITCH) { + ((ModelStandardTransform)s.getTransform()).setPolarity( + ModelStandardTransform.POLARITY_BIPOLAR); + } else if (control == ModelSource.SOURCE_LFO1 + || control == ModelSource.SOURCE_LFO2) { + ((ModelStandardTransform)s.getTransform()).setPolarity( + ModelStandardTransform.POLARITY_BIPOLAR); + } + s.setIdentifier(control); + block.addSource(s); + ctrl = s; + } + if (source != null) { + ModelSource s = new ModelSource(); + if (source == ModelSource.SOURCE_MIDI_PITCH) { + ((ModelStandardTransform)s.getTransform()).setPolarity( + ModelStandardTransform.POLARITY_BIPOLAR); + } else if (source == ModelSource.SOURCE_LFO1 + || source == ModelSource.SOURCE_LFO2) { + ((ModelStandardTransform)s.getTransform()).setPolarity( + ModelStandardTransform.POLARITY_BIPOLAR); + } + s.setIdentifier(source); + block.addSource(s); + src = s; + } + ModelDestination destination = new ModelDestination(); + destination.setIdentifier(destination_id); + block.setDestination(destination); + + if (mod.getVersion() == 1) { + //if (mod.getTransform() == DLSModulator.CONN_TRN_CONCAVE) { + // ((ModelStandardTransform)destination.getTransform()) + // .setTransform( + // ModelStandardTransform.TRANSFORM_CONCAVE); + //} + if (mod.getTransform() == DLSModulator.CONN_TRN_CONCAVE) { + if (src != null) { + ((ModelStandardTransform)src.getTransform()) + .setTransform( + ModelStandardTransform.TRANSFORM_CONCAVE); + ((ModelStandardTransform)src.getTransform()) + .setDirection( + ModelStandardTransform.DIRECTION_MAX2MIN); + } + if (ctrl != null) { + ((ModelStandardTransform)ctrl.getTransform()) + .setTransform( + ModelStandardTransform.TRANSFORM_CONCAVE); + ((ModelStandardTransform)ctrl.getTransform()) + .setDirection( + ModelStandardTransform.DIRECTION_MAX2MIN); + } + } + + } else if (mod.getVersion() == 2) { + int transform = mod.getTransform(); + int src_transform_invert = (transform >> 15) & 1; + int src_transform_bipolar = (transform >> 14) & 1; + int src_transform = (transform >> 10) & 8; + int ctr_transform_invert = (transform >> 9) & 1; + int ctr_transform_bipolar = (transform >> 8) & 1; + int ctr_transform = (transform >> 4) & 8; + + + if (src != null) { + int trans = ModelStandardTransform.TRANSFORM_LINEAR; + if (src_transform == DLSModulator.CONN_TRN_SWITCH) + trans = ModelStandardTransform.TRANSFORM_SWITCH; + if (src_transform == DLSModulator.CONN_TRN_CONCAVE) + trans = ModelStandardTransform.TRANSFORM_CONCAVE; + if (src_transform == DLSModulator.CONN_TRN_CONVEX) + trans = ModelStandardTransform.TRANSFORM_CONVEX; + ((ModelStandardTransform)src.getTransform()) + .setTransform(trans); + ((ModelStandardTransform)src.getTransform()) + .setPolarity(src_transform_bipolar == 1); + ((ModelStandardTransform)src.getTransform()) + .setDirection(src_transform_invert == 1); + + } + + if (ctrl != null) { + int trans = ModelStandardTransform.TRANSFORM_LINEAR; + if (ctr_transform == DLSModulator.CONN_TRN_SWITCH) + trans = ModelStandardTransform.TRANSFORM_SWITCH; + if (ctr_transform == DLSModulator.CONN_TRN_CONCAVE) + trans = ModelStandardTransform.TRANSFORM_CONCAVE; + if (ctr_transform == DLSModulator.CONN_TRN_CONVEX) + trans = ModelStandardTransform.TRANSFORM_CONVEX; + ((ModelStandardTransform)ctrl.getTransform()) + .setTransform(trans); + ((ModelStandardTransform)ctrl.getTransform()) + .setPolarity(ctr_transform_bipolar == 1); + ((ModelStandardTransform)ctrl.getTransform()) + .setDirection(ctr_transform_invert == 1); + } + + /* No output transforms are defined the DLS Level 2 + int out_transform = transform % 8; + int trans = ModelStandardTransform.TRANSFORM_LINEAR; + if (out_transform == DLSModulator.CONN_TRN_SWITCH) + trans = ModelStandardTransform.TRANSFORM_SWITCH; + if (out_transform == DLSModulator.CONN_TRN_CONCAVE) + trans = ModelStandardTransform.TRANSFORM_CONCAVE; + if (out_transform == DLSModulator.CONN_TRN_CONVEX) + trans = ModelStandardTransform.TRANSFORM_CONVEX; + if (ctrl != null) { + ((ModelStandardTransform)destination.getTransform()) + .setTransform(trans); + } + */ + + } + + block.setScale(f_scale); + + return block; + } + + return null; + } + + public ModelPerformer[] getPerformers() { + List performers = new ArrayList(); + + Map modmap = new HashMap(); + for (DLSModulator mod: getModulators()) { + modmap.put(mod.getSource() + "x" + mod.getControl() + "=" + + mod.getDestination(), mod); + } + + Map insmodmap = + new HashMap(); + + for (DLSRegion zone: regions) { + ModelPerformer performer = new ModelPerformer(); + performer.setName(zone.getSample().getName()); + performer.setSelfNonExclusive((zone.getFusoptions() & + DLSRegion.OPTION_SELFNONEXCLUSIVE) != 0); + performer.setExclusiveClass(zone.getExclusiveClass()); + performer.setKeyFrom(zone.getKeyfrom()); + performer.setKeyTo(zone.getKeyto()); + performer.setVelFrom(zone.getVelfrom()); + performer.setVelTo(zone.getVelto()); + + insmodmap.clear(); + insmodmap.putAll(modmap); + for (DLSModulator mod: zone.getModulators()) { + insmodmap.put(mod.getSource() + "x" + mod.getControl() + "=" + + mod.getDestination(), mod); + } + + List blocks = performer.getConnectionBlocks(); + for (DLSModulator mod: insmodmap.values()) { + ModelConnectionBlock p = convertToModel(mod); + if (p != null) + blocks.add(p); + } + + + DLSSample sample = zone.getSample(); + DLSSampleOptions sampleopt = zone.getSampleoptions(); + if (sampleopt == null) + sampleopt = sample.getSampleoptions(); + + ModelByteBuffer buff = sample.getDataBuffer(); + + float pitchcorrection = (-sampleopt.unitynote * 100) + + sampleopt.finetune; + + ModelByteBufferWavetable osc = new ModelByteBufferWavetable(buff, + sample.getFormat(), pitchcorrection); + osc.setAttenuation(osc.getAttenuation() / 65536f); + if (sampleopt.getLoops().size() != 0) { + DLSSampleLoop loop = sampleopt.getLoops().get(0); + osc.setLoopStart((int)loop.getStart()); + osc.setLoopLength((int)loop.getLength()); + if (loop.getType() == DLSSampleLoop.LOOP_TYPE_FORWARD) + osc.setLoopType(ModelWavetable.LOOP_TYPE_FORWARD); + if (loop.getType() == DLSSampleLoop.LOOP_TYPE_RELEASE) + osc.setLoopType(ModelWavetable.LOOP_TYPE_RELEASE); + else + osc.setLoopType(ModelWavetable.LOOP_TYPE_FORWARD); + } + + performer.getConnectionBlocks().add( + new ModelConnectionBlock(SoftFilter.FILTERTYPE_LP12, + new ModelDestination( + new ModelIdentifier("filter", "type", 1)))); + + performer.getOscillators().add(osc); + + performers.add(performer); + + } + + return performers.toArray(new ModelPerformer[performers.size()]); + } + + public byte[] getGuid() { + return guid; + } + + public void setGuid(byte[] guid) { + this.guid = guid; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/DLSModulator.java b/jdk/src/share/classes/com/sun/media/sound/DLSModulator.java new file mode 100644 index 00000000000..082454ea980 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/DLSModulator.java @@ -0,0 +1,351 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * This class is used to store modulator/artiuclation data. + * A modulator connects one synthesizer source to + * a destination. For example a note on velocity + * can be mapped to the gain of the synthesized voice. + * It is stored as a "art1" or "art2" chunk inside DLS files. + * + * @author Karl Helgason + */ +public class DLSModulator { + + // DLS1 Destinations + public static final int CONN_DST_NONE = 0x000; // 0 + public static final int CONN_DST_GAIN = 0x001; // cB + public static final int CONN_DST_PITCH = 0x003; // cent + public static final int CONN_DST_PAN = 0x004; // 0.1% + public static final int CONN_DST_LFO_FREQUENCY = 0x104; // cent (default 5 Hz) + public static final int CONN_DST_LFO_STARTDELAY = 0x105; // timecent + public static final int CONN_DST_EG1_ATTACKTIME = 0x206; // timecent + public static final int CONN_DST_EG1_DECAYTIME = 0x207; // timecent + public static final int CONN_DST_EG1_RELEASETIME = 0x209; // timecent + public static final int CONN_DST_EG1_SUSTAINLEVEL = 0x20A; // 0.1% + public static final int CONN_DST_EG2_ATTACKTIME = 0x30A; // timecent + public static final int CONN_DST_EG2_DECAYTIME = 0x30B; // timecent + public static final int CONN_DST_EG2_RELEASETIME = 0x30D; // timecent + public static final int CONN_DST_EG2_SUSTAINLEVEL = 0x30E; // 0.1% + // DLS2 Destinations + public static final int CONN_DST_KEYNUMBER = 0x005; + public static final int CONN_DST_LEFT = 0x010; // 0.1% + public static final int CONN_DST_RIGHT = 0x011; // 0.1% + public static final int CONN_DST_CENTER = 0x012; // 0.1% + public static final int CONN_DST_LEFTREAR = 0x013; // 0.1% + public static final int CONN_DST_RIGHTREAR = 0x014; // 0.1% + public static final int CONN_DST_LFE_CHANNEL = 0x015; // 0.1% + public static final int CONN_DST_CHORUS = 0x080; // 0.1% + public static final int CONN_DST_REVERB = 0x081; // 0.1% + public static final int CONN_DST_VIB_FREQUENCY = 0x114; // cent + public static final int CONN_DST_VIB_STARTDELAY = 0x115; // dB + public static final int CONN_DST_EG1_DELAYTIME = 0x20B; // timecent + public static final int CONN_DST_EG1_HOLDTIME = 0x20C; // timecent + public static final int CONN_DST_EG1_SHUTDOWNTIME = 0x20D; // timecent + public static final int CONN_DST_EG2_DELAYTIME = 0x30F; // timecent + public static final int CONN_DST_EG2_HOLDTIME = 0x310; // timecent + public static final int CONN_DST_FILTER_CUTOFF = 0x500; // cent + public static final int CONN_DST_FILTER_Q = 0x501; // dB + + // DLS1 Sources + public static final int CONN_SRC_NONE = 0x000; // 1 + public static final int CONN_SRC_LFO = 0x001; // linear (sine wave) + public static final int CONN_SRC_KEYONVELOCITY = 0x002; // ??db or velocity?? + public static final int CONN_SRC_KEYNUMBER = 0x003; // ??cent or keynumber?? + public static final int CONN_SRC_EG1 = 0x004; // linear direct from eg + public static final int CONN_SRC_EG2 = 0x005; // linear direct from eg + public static final int CONN_SRC_PITCHWHEEL = 0x006; // linear -1..1 + public static final int CONN_SRC_CC1 = 0x081; // linear 0..1 + public static final int CONN_SRC_CC7 = 0x087; // linear 0..1 + public static final int CONN_SRC_CC10 = 0x08A; // linear 0..1 + public static final int CONN_SRC_CC11 = 0x08B; // linear 0..1 + public static final int CONN_SRC_RPN0 = 0x100; // ?? // Pitch Bend Range + public static final int CONN_SRC_RPN1 = 0x101; // ?? // Fine Tune + public static final int CONN_SRC_RPN2 = 0x102; // ?? // Course Tune + // DLS2 Sources + public static final int CONN_SRC_POLYPRESSURE = 0x007; // linear 0..1 + public static final int CONN_SRC_CHANNELPRESSURE = 0x008; // linear 0..1 + public static final int CONN_SRC_VIBRATO = 0x009; // linear 0..1 + public static final int CONN_SRC_MONOPRESSURE = 0x00A; // linear 0..1 + public static final int CONN_SRC_CC91 = 0x0DB; // linear 0..1 + public static final int CONN_SRC_CC93 = 0x0DD; // linear 0..1 + // DLS1 Transforms + public static final int CONN_TRN_NONE = 0x000; + public static final int CONN_TRN_CONCAVE = 0x001; + // DLS2 Transforms + public static final int CONN_TRN_CONVEX = 0x002; + public static final int CONN_TRN_SWITCH = 0x003; + public static final int DST_FORMAT_CB = 1; + public static final int DST_FORMAT_CENT = 1; + public static final int DST_FORMAT_TIMECENT = 2; + public static final int DST_FORMAT_PERCENT = 3; + protected int source; + protected int control; + protected int destination; + protected int transform; + protected int scale; + protected int version = 1; + + public int getControl() { + return control; + } + + public void setControl(int control) { + this.control = control; + } + + public static int getDestinationFormat(int destination) { + + if (destination == CONN_DST_GAIN) + return DST_FORMAT_CB; + if (destination == CONN_DST_PITCH) + return DST_FORMAT_CENT; + if (destination == CONN_DST_PAN) + return DST_FORMAT_PERCENT; + + if (destination == CONN_DST_LFO_FREQUENCY) + return DST_FORMAT_CENT; + if (destination == CONN_DST_LFO_STARTDELAY) + return DST_FORMAT_TIMECENT; + + if (destination == CONN_DST_EG1_ATTACKTIME) + return DST_FORMAT_TIMECENT; + if (destination == CONN_DST_EG1_DECAYTIME) + return DST_FORMAT_TIMECENT; + if (destination == CONN_DST_EG1_RELEASETIME) + return DST_FORMAT_TIMECENT; + if (destination == CONN_DST_EG1_SUSTAINLEVEL) + return DST_FORMAT_PERCENT; + + if (destination == CONN_DST_EG2_ATTACKTIME) + return DST_FORMAT_TIMECENT; + if (destination == CONN_DST_EG2_DECAYTIME) + return DST_FORMAT_TIMECENT; + if (destination == CONN_DST_EG2_RELEASETIME) + return DST_FORMAT_TIMECENT; + if (destination == CONN_DST_EG2_SUSTAINLEVEL) + return DST_FORMAT_PERCENT; + + if (destination == CONN_DST_KEYNUMBER) + return DST_FORMAT_CENT; // NOT SURE WITHOUT DLS 2 SPEC + if (destination == CONN_DST_LEFT) + return DST_FORMAT_CB; + if (destination == CONN_DST_RIGHT) + return DST_FORMAT_CB; + if (destination == CONN_DST_CENTER) + return DST_FORMAT_CB; + if (destination == CONN_DST_LEFTREAR) + return DST_FORMAT_CB; + if (destination == CONN_DST_RIGHTREAR) + return DST_FORMAT_CB; + if (destination == CONN_DST_LFE_CHANNEL) + return DST_FORMAT_CB; + if (destination == CONN_DST_CHORUS) + return DST_FORMAT_PERCENT; + if (destination == CONN_DST_REVERB) + return DST_FORMAT_PERCENT; + + if (destination == CONN_DST_VIB_FREQUENCY) + return DST_FORMAT_CENT; + if (destination == CONN_DST_VIB_STARTDELAY) + return DST_FORMAT_TIMECENT; + + if (destination == CONN_DST_EG1_DELAYTIME) + return DST_FORMAT_TIMECENT; + if (destination == CONN_DST_EG1_HOLDTIME) + return DST_FORMAT_TIMECENT; + if (destination == CONN_DST_EG1_SHUTDOWNTIME) + return DST_FORMAT_TIMECENT; + + if (destination == CONN_DST_EG2_DELAYTIME) + return DST_FORMAT_TIMECENT; + if (destination == CONN_DST_EG2_HOLDTIME) + return DST_FORMAT_TIMECENT; + + if (destination == CONN_DST_FILTER_CUTOFF) + return DST_FORMAT_CENT; + if (destination == CONN_DST_FILTER_Q) + return DST_FORMAT_CB; + + return -1; + } + + public static String getDestinationName(int destination) { + + if (destination == CONN_DST_GAIN) + return "gain"; + if (destination == CONN_DST_PITCH) + return "pitch"; + if (destination == CONN_DST_PAN) + return "pan"; + + if (destination == CONN_DST_LFO_FREQUENCY) + return "lfo1.freq"; + if (destination == CONN_DST_LFO_STARTDELAY) + return "lfo1.delay"; + + if (destination == CONN_DST_EG1_ATTACKTIME) + return "eg1.attack"; + if (destination == CONN_DST_EG1_DECAYTIME) + return "eg1.decay"; + if (destination == CONN_DST_EG1_RELEASETIME) + return "eg1.release"; + if (destination == CONN_DST_EG1_SUSTAINLEVEL) + return "eg1.sustain"; + + if (destination == CONN_DST_EG2_ATTACKTIME) + return "eg2.attack"; + if (destination == CONN_DST_EG2_DECAYTIME) + return "eg2.decay"; + if (destination == CONN_DST_EG2_RELEASETIME) + return "eg2.release"; + if (destination == CONN_DST_EG2_SUSTAINLEVEL) + return "eg2.sustain"; + + if (destination == CONN_DST_KEYNUMBER) + return "keynumber"; + if (destination == CONN_DST_LEFT) + return "left"; + if (destination == CONN_DST_RIGHT) + return "right"; + if (destination == CONN_DST_CENTER) + return "center"; + if (destination == CONN_DST_LEFTREAR) + return "leftrear"; + if (destination == CONN_DST_RIGHTREAR) + return "rightrear"; + if (destination == CONN_DST_LFE_CHANNEL) + return "lfe_channel"; + if (destination == CONN_DST_CHORUS) + return "chorus"; + if (destination == CONN_DST_REVERB) + return "reverb"; + + if (destination == CONN_DST_VIB_FREQUENCY) + return "vib.freq"; + if (destination == CONN_DST_VIB_STARTDELAY) + return "vib.delay"; + + if (destination == CONN_DST_EG1_DELAYTIME) + return "eg1.delay"; + if (destination == CONN_DST_EG1_HOLDTIME) + return "eg1.hold"; + if (destination == CONN_DST_EG1_SHUTDOWNTIME) + return "eg1.shutdown"; + + if (destination == CONN_DST_EG2_DELAYTIME) + return "eg2.delay"; + if (destination == CONN_DST_EG2_HOLDTIME) + return "eg.2hold"; + + if (destination == CONN_DST_FILTER_CUTOFF) + return "filter.cutoff"; // NOT SURE WITHOUT DLS 2 SPEC + if (destination == CONN_DST_FILTER_Q) + return "filter.q"; // NOT SURE WITHOUT DLS 2 SPEC + + return null; + } + + public static String getSourceName(int source) { + + if (source == CONN_SRC_NONE) + return "none"; + if (source == CONN_SRC_LFO) + return "lfo"; + if (source == CONN_SRC_KEYONVELOCITY) + return "keyonvelocity"; + if (source == CONN_SRC_KEYNUMBER) + return "keynumber"; + if (source == CONN_SRC_EG1) + return "eg1"; + if (source == CONN_SRC_EG2) + return "eg2"; + if (source == CONN_SRC_PITCHWHEEL) + return "pitchweel"; + if (source == CONN_SRC_CC1) + return "cc1"; + if (source == CONN_SRC_CC7) + return "cc7"; + if (source == CONN_SRC_CC10) + return "c10"; + if (source == CONN_SRC_CC11) + return "cc11"; + + if (source == CONN_SRC_POLYPRESSURE) + return "polypressure"; + if (source == CONN_SRC_CHANNELPRESSURE) + return "channelpressure"; + if (source == CONN_SRC_VIBRATO) + return "vibrato"; + if (source == CONN_SRC_MONOPRESSURE) + return "monopressure"; + if (source == CONN_SRC_CC91) + return "cc91"; + if (source == CONN_SRC_CC93) + return "cc93"; + return null; + } + + public int getDestination() { + return destination; + } + + public void setDestination(int destination) { + this.destination = destination; + } + + public int getScale() { + return scale; + } + + public void setScale(int scale) { + this.scale = scale; + } + + public int getSource() { + return source; + } + + public void setSource(int source) { + this.source = source; + } + + public int getVersion() { + return version; + } + + public void setVersion(int version) { + this.version = version; + } + + public int getTransform() { + return transform; + } + + public void setTransform(int transform) { + this.transform = transform; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/DLSRegion.java b/jdk/src/share/classes/com/sun/media/sound/DLSRegion.java new file mode 100644 index 00000000000..17e57a3b3cf --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/DLSRegion.java @@ -0,0 +1,150 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.ArrayList; +import java.util.List; + +/** + * This class is used to store region parts for instrument. + * A region has a velocity and key range which it response to. + * And it has a list of modulators/articulators which + * is used how to synthesize a single voice. + * It is stored inside a "rgn " List Chunk inside DLS files. + * + * @author Karl Helgason + */ +public class DLSRegion { + + public final static int OPTION_SELFNONEXCLUSIVE = 0x0001; + protected List modulators = new ArrayList(); + protected int keyfrom; + protected int keyto; + protected int velfrom; + protected int velto; + protected int options; + protected int exclusiveClass; + protected int fusoptions; + protected int phasegroup; + protected long channel; + protected DLSSample sample = null; + protected DLSSampleOptions sampleoptions; + + public List getModulators() { + return modulators; + } + + public long getChannel() { + return channel; + } + + public void setChannel(long channel) { + this.channel = channel; + } + + public int getExclusiveClass() { + return exclusiveClass; + } + + public void setExclusiveClass(int exclusiveClass) { + this.exclusiveClass = exclusiveClass; + } + + public int getFusoptions() { + return fusoptions; + } + + public void setFusoptions(int fusoptions) { + this.fusoptions = fusoptions; + } + + public int getKeyfrom() { + return keyfrom; + } + + public void setKeyfrom(int keyfrom) { + this.keyfrom = keyfrom; + } + + public int getKeyto() { + return keyto; + } + + public void setKeyto(int keyto) { + this.keyto = keyto; + } + + public int getOptions() { + return options; + } + + public void setOptions(int options) { + this.options = options; + } + + public int getPhasegroup() { + return phasegroup; + } + + public void setPhasegroup(int phasegroup) { + this.phasegroup = phasegroup; + } + + public DLSSample getSample() { + return sample; + } + + public void setSample(DLSSample sample) { + this.sample = sample; + } + + public int getVelfrom() { + return velfrom; + } + + public void setVelfrom(int velfrom) { + this.velfrom = velfrom; + } + + public int getVelto() { + return velto; + } + + public void setVelto(int velto) { + this.velto = velto; + } + + public void setModulators(List modulators) { + this.modulators = modulators; + } + + public DLSSampleOptions getSampleoptions() { + return sampleoptions; + } + + public void setSampleoptions(DLSSampleOptions sampleOptions) { + this.sampleoptions = sampleOptions; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/DLSSample.java b/jdk/src/share/classes/com/sun/media/sound/DLSSample.java new file mode 100644 index 00000000000..b75b2a9a94c --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/DLSSample.java @@ -0,0 +1,122 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.InputStream; +import javax.sound.midi.Soundbank; +import javax.sound.midi.SoundbankResource; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; + +/** + * This class is used to store the sample data itself. + * A sample is encoded as PCM audio stream + * and in DLS Level 1 files it is always a mono 8/16 bit stream. + * They are stored just like RIFF WAVE files are stored. + * It is stored inside a "wave" List Chunk inside DLS files. + * + * @author Karl Helgason + */ +public class DLSSample extends SoundbankResource { + + protected byte[] guid = null; + protected DLSInfo info = new DLSInfo(); + protected DLSSampleOptions sampleoptions; + protected ModelByteBuffer data; + protected AudioFormat format; + + public DLSSample(Soundbank soundBank) { + super(soundBank, null, AudioInputStream.class); + } + + public DLSSample() { + super(null, null, AudioInputStream.class); + } + + public DLSInfo getInfo() { + return info; + } + + public Object getData() { + AudioFormat format = getFormat(); + + InputStream is = data.getInputStream(); + if (is == null) + return null; + return new AudioInputStream(is, format, data.capacity()); + } + + public ModelByteBuffer getDataBuffer() { + return data; + } + + public AudioFormat getFormat() { + return format; + } + + public void setFormat(AudioFormat format) { + this.format = format; + } + + public void setData(ModelByteBuffer data) { + this.data = data; + } + + public void setData(byte[] data) { + this.data = new ModelByteBuffer(data); + } + + public void setData(byte[] data, int offset, int length) { + this.data = new ModelByteBuffer(data, offset, length); + } + + public String getName() { + return info.name; + } + + public void setName(String name) { + info.name = name; + } + + public DLSSampleOptions getSampleoptions() { + return sampleoptions; + } + + public void setSampleoptions(DLSSampleOptions sampleOptions) { + this.sampleoptions = sampleOptions; + } + + public String toString() { + return "Sample: " + info.name; + } + + public byte[] getGuid() { + return guid; + } + + public void setGuid(byte[] guid) { + this.guid = guid; + } +} diff --git a/jdk/src/windows/native/sun/windows/awt_Unicode.h b/jdk/src/share/classes/com/sun/media/sound/DLSSampleLoop.java similarity index 58% rename from jdk/src/windows/native/sun/windows/awt_Unicode.h rename to jdk/src/share/classes/com/sun/media/sound/DLSSampleLoop.java index 235140bdac8..ee78d64fce0 100644 --- a/jdk/src/windows/native/sun/windows/awt_Unicode.h +++ b/jdk/src/share/classes/com/sun/media/sound/DLSSampleLoop.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2007 Sun Microsystems, Inc. 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 @@ -22,29 +22,42 @@ * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ +package com.sun.media.sound; -/* - * Unicode to ANSI string conversion macros, based on a slide from a - * presentation by Asmus Freytag. These must be macros, since the - * alloca() has to be in the caller's stack space. +/** + * This class is used to store loop points inside DLSSampleOptions class. + * + * @author Karl Helgason */ +public class DLSSampleLoop { -#ifndef AWT_UNICODE_H -#define AWT_UNICODE_H + public final static int LOOP_TYPE_FORWARD = 0; + public final static int LOOP_TYPE_RELEASE = 1; + protected long type; + protected long start; + protected long length; -#include + public long getLength() { + return length; + } -// Get a Unicode string copy of a Java String object (Java String aren't -// null-terminated). -extern LPWSTR J2WHelper(LPWSTR lpw, LPWSTR lpj, int nChars); -extern LPWSTR J2WHelper1(LPWSTR lpw, LPWSTR lpj, int offset, int nChars); + public void setLength(long length) { + this.length = length; + } -extern LPWSTR JNI_J2WHelper1(JNIEnv *env, LPWSTR lpw, jstring jstr); + public long getStart() { + return start; + } -#define TO_WSTRING(jstr) \ - ((jstr == NULL) ? NULL : \ - (JNI_J2WHelper1(env, (LPWSTR) alloca((env->GetStringLength(jstr)+1)*2), \ - jstr) \ - )) + public void setStart(long start) { + this.start = start; + } -#endif // AWT_UNICODE_H + public long getType() { + return type; + } + + public void setType(long type) { + this.type = type; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/DLSSampleOptions.java b/jdk/src/share/classes/com/sun/media/sound/DLSSampleOptions.java new file mode 100644 index 00000000000..849644b6cc7 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/DLSSampleOptions.java @@ -0,0 +1,80 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.ArrayList; +import java.util.List; + +/** + * This class stores options how to playback sampled data like pitch/tuning, + * attenuation and loops. + * It is stored as a "wsmp" chunk inside DLS files. + * + * @author Karl Helgason + */ +public class DLSSampleOptions { + + protected int unitynote; + protected short finetune; + protected int attenuation; + protected long options; + protected List loops = new ArrayList(); + + public int getAttenuation() { + return attenuation; + } + + public void setAttenuation(int attenuation) { + this.attenuation = attenuation; + } + + public short getFinetune() { + return finetune; + } + + public void setFinetune(short finetune) { + this.finetune = finetune; + } + + public List getLoops() { + return loops; + } + + public long getOptions() { + return options; + } + + public void setOptions(long options) { + this.options = options; + } + + public int getUnitynote() { + return unitynote; + } + + public void setUnitynote(int unitynote) { + this.unitynote = unitynote; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/DLSSoundbank.java b/jdk/src/share/classes/com/sun/media/sound/DLSSoundbank.java new file mode 100644 index 00000000000..027fa75b472 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/DLSSoundbank.java @@ -0,0 +1,1287 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Stack; + +import javax.sound.midi.Instrument; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; +import javax.sound.midi.SoundbankResource; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.AudioFormat.Encoding; + +/** + * A DLS Level 1 and Level 2 soundbank reader (from files/url/streams). + * + * @author Karl Helgason + */ +public class DLSSoundbank implements Soundbank { + + static private class DLSID { + long i1; + int s1; + int s2; + int x1; + int x2; + int x3; + int x4; + int x5; + int x6; + int x7; + int x8; + + private DLSID() { + } + + public DLSID(long i1, int s1, int s2, int x1, int x2, int x3, int x4, + int x5, int x6, int x7, int x8) { + this.i1 = i1; + this.s1 = s1; + this.s2 = s2; + this.x1 = x1; + this.x2 = x2; + this.x3 = x3; + this.x4 = x4; + this.x5 = x5; + this.x6 = x6; + this.x7 = x7; + this.x8 = x8; + } + + public static DLSID read(RIFFReader riff) throws IOException { + DLSID d = new DLSID(); + d.i1 = riff.readUnsignedInt(); + d.s1 = riff.readUnsignedShort(); + d.s2 = riff.readUnsignedShort(); + d.x1 = riff.readUnsignedByte(); + d.x2 = riff.readUnsignedByte(); + d.x3 = riff.readUnsignedByte(); + d.x4 = riff.readUnsignedByte(); + d.x5 = riff.readUnsignedByte(); + d.x6 = riff.readUnsignedByte(); + d.x7 = riff.readUnsignedByte(); + d.x8 = riff.readUnsignedByte(); + return d; + } + + public int hashCode() { + return (int)i1; + } + + public boolean equals(Object obj) { + if (!(obj instanceof DLSID)) { + return false; + } + DLSID t = (DLSID) obj; + return i1 == t.i1 && s1 == t.s1 && s2 == t.s2 + && x1 == t.x1 && x2 == t.x2 && x3 == t.x3 && x4 == t.x4 + && x5 == t.x5 && x6 == t.x6 && x7 == t.x7 && x8 == t.x8; + } + } + + /** X = X & Y */ + private static final int DLS_CDL_AND = 0x0001; + /** X = X | Y */ + private static final int DLS_CDL_OR = 0x0002; + /** X = X ^ Y */ + private static final int DLS_CDL_XOR = 0x0003; + /** X = X + Y */ + private static final int DLS_CDL_ADD = 0x0004; + /** X = X - Y */ + private static final int DLS_CDL_SUBTRACT = 0x0005; + /** X = X * Y */ + private static final int DLS_CDL_MULTIPLY = 0x0006; + /** X = X / Y */ + private static final int DLS_CDL_DIVIDE = 0x0007; + /** X = X && Y */ + private static final int DLS_CDL_LOGICAL_AND = 0x0008; + /** X = X || Y */ + private static final int DLS_CDL_LOGICAL_OR = 0x0009; + /** X = (X < Y) */ + private static final int DLS_CDL_LT = 0x000A; + /** X = (X <= Y) */ + private static final int DLS_CDL_LE = 0x000B; + /** X = (X > Y) */ + private static final int DLS_CDL_GT = 0x000C; + /** X = (X >= Y) */ + private static final int DLS_CDL_GE = 0x000D; + /** X = (X == Y) */ + private static final int DLS_CDL_EQ = 0x000E; + /** X = !X */ + private static final int DLS_CDL_NOT = 0x000F; + /** 32-bit constant */ + private static final int DLS_CDL_CONST = 0x0010; + /** 32-bit value returned from query */ + private static final int DLS_CDL_QUERY = 0x0011; + /** 32-bit value returned from query */ + private static final int DLS_CDL_QUERYSUPPORTED = 0x0012; + + private static final DLSID DLSID_GMInHardware = new DLSID(0x178f2f24, + 0xc364, 0x11d1, 0xa7, 0x60, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); + private static final DLSID DLSID_GSInHardware = new DLSID(0x178f2f25, + 0xc364, 0x11d1, 0xa7, 0x60, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); + private static final DLSID DLSID_XGInHardware = new DLSID(0x178f2f26, + 0xc364, 0x11d1, 0xa7, 0x60, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); + private static final DLSID DLSID_SupportsDLS1 = new DLSID(0x178f2f27, + 0xc364, 0x11d1, 0xa7, 0x60, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); + private static final DLSID DLSID_SupportsDLS2 = new DLSID(0xf14599e5, + 0x4689, 0x11d2, 0xaf, 0xa6, 0x0, 0xaa, 0x0, 0x24, 0xd8, 0xb6); + private static final DLSID DLSID_SampleMemorySize = new DLSID(0x178f2f28, + 0xc364, 0x11d1, 0xa7, 0x60, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); + private static final DLSID DLSID_ManufacturersID = new DLSID(0xb03e1181, + 0x8095, 0x11d2, 0xa1, 0xef, 0x0, 0x60, 0x8, 0x33, 0xdb, 0xd8); + private static final DLSID DLSID_ProductID = new DLSID(0xb03e1182, + 0x8095, 0x11d2, 0xa1, 0xef, 0x0, 0x60, 0x8, 0x33, 0xdb, 0xd8); + private static final DLSID DLSID_SamplePlaybackRate = new DLSID(0x2a91f713, + 0xa4bf, 0x11d2, 0xbb, 0xdf, 0x0, 0x60, 0x8, 0x33, 0xdb, 0xd8); + + private long major = -1; + private long minor = -1; + + private DLSInfo info = new DLSInfo(); + + private List instruments = new ArrayList(); + private List samples = new ArrayList(); + + private boolean largeFormat = false; + private File sampleFile; + + public DLSSoundbank() { + } + + public DLSSoundbank(URL url) throws IOException { + InputStream is = url.openStream(); + try { + readSoundbank(is); + } finally { + is.close(); + } + } + + public DLSSoundbank(File file) throws IOException { + largeFormat = true; + sampleFile = file; + InputStream is = new FileInputStream(file); + try { + readSoundbank(is); + } finally { + is.close(); + } + } + + public DLSSoundbank(InputStream inputstream) throws IOException { + readSoundbank(inputstream); + } + + private void readSoundbank(InputStream inputstream) throws IOException { + RIFFReader riff = new RIFFReader(inputstream); + if (!riff.getFormat().equals("RIFF")) { + throw new RIFFInvalidFormatException( + "Input stream is not a valid RIFF stream!"); + } + if (!riff.getType().equals("DLS ")) { + throw new RIFFInvalidFormatException( + "Input stream is not a valid DLS soundbank!"); + } + while (riff.hasNextChunk()) { + RIFFReader chunk = riff.nextChunk(); + if (chunk.getFormat().equals("LIST")) { + if (chunk.getType().equals("INFO")) + readInfoChunk(chunk); + if (chunk.getType().equals("lins")) + readLinsChunk(chunk); + if (chunk.getType().equals("wvpl")) + readWvplChunk(chunk); + } else { + if (chunk.getFormat().equals("cdl ")) { + if (!readCdlChunk(chunk)) { + throw new RIFFInvalidFormatException( + "DLS file isn't supported!"); + } + } + if (chunk.getFormat().equals("colh")) { + // skipped because we will load the entire bank into memory + // long instrumentcount = chunk.readUnsignedInt(); + // System.out.println("instrumentcount = "+ instrumentcount); + } + if (chunk.getFormat().equals("ptbl")) { + // Pool Table Chunk + // skipped because we will load the entire bank into memory + } + if (chunk.getFormat().equals("vers")) { + major = chunk.readUnsignedInt(); + minor = chunk.readUnsignedInt(); + } + } + } + + for (Map.Entry entry : temp_rgnassign.entrySet()) { + entry.getKey().sample = samples.get((int)entry.getValue().longValue()); + } + + temp_rgnassign = null; + } + + private boolean cdlIsQuerySupported(DLSID uuid) { + return uuid.equals(DLSID_GMInHardware) + || uuid.equals(DLSID_GSInHardware) + || uuid.equals(DLSID_XGInHardware) + || uuid.equals(DLSID_SupportsDLS1) + || uuid.equals(DLSID_SupportsDLS2) + || uuid.equals(DLSID_SampleMemorySize) + || uuid.equals(DLSID_ManufacturersID) + || uuid.equals(DLSID_ProductID) + || uuid.equals(DLSID_SamplePlaybackRate); + } + + private long cdlQuery(DLSID uuid) { + if (uuid.equals(DLSID_GMInHardware)) + return 1; + if (uuid.equals(DLSID_GSInHardware)) + return 0; + if (uuid.equals(DLSID_XGInHardware)) + return 0; + if (uuid.equals(DLSID_SupportsDLS1)) + return 1; + if (uuid.equals(DLSID_SupportsDLS2)) + return 1; + if (uuid.equals(DLSID_SampleMemorySize)) + return Runtime.getRuntime().totalMemory(); + if (uuid.equals(DLSID_ManufacturersID)) + return 0; + if (uuid.equals(DLSID_ProductID)) + return 0; + if (uuid.equals(DLSID_SamplePlaybackRate)) + return 44100; + return 0; + } + + + // Reading cdl-ck Chunk + // "cdl " chunk can only appear inside : DLS,lart,lar2,rgn,rgn2 + private boolean readCdlChunk(RIFFReader riff) throws IOException { + + DLSID uuid; + long x; + long y; + Stack stack = new Stack(); + + while (riff.available() != 0) { + int opcode = riff.readUnsignedShort(); + switch (opcode) { + case DLS_CDL_AND: + x = stack.pop(); + y = stack.pop(); + stack.push(Long.valueOf(((x != 0) && (y != 0)) ? 1 : 0)); + break; + case DLS_CDL_OR: + x = stack.pop(); + y = stack.pop(); + stack.push(Long.valueOf(((x != 0) || (y != 0)) ? 1 : 0)); + break; + case DLS_CDL_XOR: + x = stack.pop(); + y = stack.pop(); + stack.push(Long.valueOf(((x != 0) ^ (y != 0)) ? 1 : 0)); + break; + case DLS_CDL_ADD: + x = stack.pop(); + y = stack.pop(); + stack.push(Long.valueOf(x + y)); + break; + case DLS_CDL_SUBTRACT: + x = stack.pop(); + y = stack.pop(); + stack.push(Long.valueOf(x - y)); + break; + case DLS_CDL_MULTIPLY: + x = stack.pop(); + y = stack.pop(); + stack.push(Long.valueOf(x * y)); + break; + case DLS_CDL_DIVIDE: + x = stack.pop(); + y = stack.pop(); + stack.push(Long.valueOf(x / y)); + break; + case DLS_CDL_LOGICAL_AND: + x = stack.pop(); + y = stack.pop(); + stack.push(Long.valueOf(((x != 0) && (y != 0)) ? 1 : 0)); + break; + case DLS_CDL_LOGICAL_OR: + x = stack.pop(); + y = stack.pop(); + stack.push(Long.valueOf(((x != 0) || (y != 0)) ? 1 : 0)); + break; + case DLS_CDL_LT: + x = stack.pop(); + y = stack.pop(); + stack.push(Long.valueOf((x < y) ? 1 : 0)); + break; + case DLS_CDL_LE: + x = stack.pop(); + y = stack.pop(); + stack.push(Long.valueOf((x <= y) ? 1 : 0)); + break; + case DLS_CDL_GT: + x = stack.pop(); + y = stack.pop(); + stack.push(Long.valueOf((x > y) ? 1 : 0)); + break; + case DLS_CDL_GE: + x = stack.pop(); + y = stack.pop(); + stack.push(Long.valueOf((x >= y) ? 1 : 0)); + break; + case DLS_CDL_EQ: + x = stack.pop(); + y = stack.pop(); + stack.push(Long.valueOf((x == y) ? 1 : 0)); + break; + case DLS_CDL_NOT: + x = stack.pop(); + y = stack.pop(); + stack.push(Long.valueOf((x == 0) ? 1 : 0)); + break; + case DLS_CDL_CONST: + stack.push(Long.valueOf(riff.readUnsignedInt())); + break; + case DLS_CDL_QUERY: + uuid = DLSID.read(riff); + stack.push(cdlQuery(uuid)); + break; + case DLS_CDL_QUERYSUPPORTED: + uuid = DLSID.read(riff); + stack.push(Long.valueOf(cdlIsQuerySupported(uuid) ? 1 : 0)); + break; + default: + break; + } + } + if (stack.isEmpty()) + return false; + + return stack.pop() == 1; + } + + private void readInfoChunk(RIFFReader riff) throws IOException { + info.name = null; + while (riff.hasNextChunk()) { + RIFFReader chunk = riff.nextChunk(); + String format = chunk.getFormat(); + if (format.equals("INAM")) + info.name = chunk.readString(chunk.available()); + else if (format.equals("ICRD")) + info.creationDate = chunk.readString(chunk.available()); + else if (format.equals("IENG")) + info.engineers = chunk.readString(chunk.available()); + else if (format.equals("IPRD")) + info.product = chunk.readString(chunk.available()); + else if (format.equals("ICOP")) + info.copyright = chunk.readString(chunk.available()); + else if (format.equals("ICMT")) + info.comments = chunk.readString(chunk.available()); + else if (format.equals("ISFT")) + info.tools = chunk.readString(chunk.available()); + else if (format.equals("IARL")) + info.archival_location = chunk.readString(chunk.available()); + else if (format.equals("IART")) + info.artist = chunk.readString(chunk.available()); + else if (format.equals("ICMS")) + info.commissioned = chunk.readString(chunk.available()); + else if (format.equals("IGNR")) + info.genre = chunk.readString(chunk.available()); + else if (format.equals("IKEY")) + info.keywords = chunk.readString(chunk.available()); + else if (format.equals("IMED")) + info.medium = chunk.readString(chunk.available()); + else if (format.equals("ISBJ")) + info.subject = chunk.readString(chunk.available()); + else if (format.equals("ISRC")) + info.source = chunk.readString(chunk.available()); + else if (format.equals("ISRF")) + info.source_form = chunk.readString(chunk.available()); + else if (format.equals("ITCH")) + info.technician = chunk.readString(chunk.available()); + } + } + + private void readLinsChunk(RIFFReader riff) throws IOException { + while (riff.hasNextChunk()) { + RIFFReader chunk = riff.nextChunk(); + if (chunk.getFormat().equals("LIST")) { + if (chunk.getType().equals("ins ")) + readInsChunk(chunk); + } + } + } + + private void readInsChunk(RIFFReader riff) throws IOException { + DLSInstrument instrument = new DLSInstrument(this); + + while (riff.hasNextChunk()) { + RIFFReader chunk = riff.nextChunk(); + String format = chunk.getFormat(); + if (format.equals("LIST")) { + if (chunk.getType().equals("INFO")) { + readInsInfoChunk(instrument, chunk); + } + if (chunk.getType().equals("lrgn")) { + while (chunk.hasNextChunk()) { + RIFFReader subchunk = chunk.nextChunk(); + if (subchunk.getFormat().equals("LIST")) { + if (subchunk.getType().equals("rgn ")) { + DLSRegion split = new DLSRegion(); + if (readRgnChunk(split, subchunk)) + instrument.getRegions().add(split); + } + if (subchunk.getType().equals("rgn2")) { + // support for DLS level 2 regions + DLSRegion split = new DLSRegion(); + if (readRgnChunk(split, subchunk)) + instrument.getRegions().add(split); + } + } + } + } + if (chunk.getType().equals("lart")) { + List modlist = new ArrayList(); + while (chunk.hasNextChunk()) { + RIFFReader subchunk = chunk.nextChunk(); + if (chunk.getFormat().equals("cdl ")) { + if (!readCdlChunk(chunk)) { + modlist.clear(); + break; + } + } + if (subchunk.getFormat().equals("art1")) + readArt1Chunk(modlist, subchunk); + } + instrument.getModulators().addAll(modlist); + } + if (chunk.getType().equals("lar2")) { + // support for DLS level 2 ART + List modlist = new ArrayList(); + while (chunk.hasNextChunk()) { + RIFFReader subchunk = chunk.nextChunk(); + if (chunk.getFormat().equals("cdl ")) { + if (!readCdlChunk(chunk)) { + modlist.clear(); + break; + } + } + if (subchunk.getFormat().equals("art2")) + readArt2Chunk(modlist, subchunk); + } + instrument.getModulators().addAll(modlist); + } + } else { + if (format.equals("dlid")) { + instrument.guid = new byte[16]; + chunk.readFully(instrument.guid); + } + if (format.equals("insh")) { + chunk.readUnsignedInt(); // Read Region Count - ignored + + int bank = chunk.read(); // LSB + bank += (chunk.read() & 127) << 7; // MSB + chunk.read(); // Read Reserved byte + int drumins = chunk.read(); // Drum Instrument + + int id = chunk.read() & 127; // Read only first 7 bits + chunk.read(); // Read Reserved byte + chunk.read(); // Read Reserved byte + chunk.read(); // Read Reserved byte + + instrument.bank = bank; + instrument.preset = (int) id; + instrument.druminstrument = (drumins & 128) > 0; + //System.out.println("bank="+bank+" drumkit="+drumkit + // +" id="+id); + } + + } + } + instruments.add(instrument); + } + + private void readArt1Chunk(List modulators, RIFFReader riff) + throws IOException { + long size = riff.readUnsignedInt(); + long count = riff.readUnsignedInt(); + + if (size - 8 != 0) + riff.skipBytes(size - 8); + + for (int i = 0; i < count; i++) { + DLSModulator modulator = new DLSModulator(); + modulator.version = 1; + modulator.source = riff.readUnsignedShort(); + modulator.control = riff.readUnsignedShort(); + modulator.destination = riff.readUnsignedShort(); + modulator.transform = riff.readUnsignedShort(); + modulator.scale = riff.readInt(); + modulators.add(modulator); + } + } + + private void readArt2Chunk(List modulators, RIFFReader riff) + throws IOException { + long size = riff.readUnsignedInt(); + long count = riff.readUnsignedInt(); + + if (size - 8 != 0) + riff.skipBytes(size - 8); + + for (int i = 0; i < count; i++) { + DLSModulator modulator = new DLSModulator(); + modulator.version = 2; + modulator.source = riff.readUnsignedShort(); + modulator.control = riff.readUnsignedShort(); + modulator.destination = riff.readUnsignedShort(); + modulator.transform = riff.readUnsignedShort(); + modulator.scale = riff.readInt(); + modulators.add(modulator); + } + } + + private Map temp_rgnassign = new HashMap(); + + private boolean readRgnChunk(DLSRegion split, RIFFReader riff) + throws IOException { + while (riff.hasNextChunk()) { + RIFFReader chunk = riff.nextChunk(); + String format = chunk.getFormat(); + if (format.equals("LIST")) { + if (chunk.getType().equals("lart")) { + List modlist = new ArrayList(); + while (chunk.hasNextChunk()) { + RIFFReader subchunk = chunk.nextChunk(); + if (chunk.getFormat().equals("cdl ")) { + if (!readCdlChunk(chunk)) { + modlist.clear(); + break; + } + } + if (subchunk.getFormat().equals("art1")) + readArt1Chunk(modlist, subchunk); + } + split.getModulators().addAll(modlist); + } + if (chunk.getType().equals("lar2")) { + // support for DLS level 2 ART + List modlist = new ArrayList(); + while (chunk.hasNextChunk()) { + RIFFReader subchunk = chunk.nextChunk(); + if (chunk.getFormat().equals("cdl ")) { + if (!readCdlChunk(chunk)) { + modlist.clear(); + break; + } + } + if (subchunk.getFormat().equals("art2")) + readArt2Chunk(modlist, subchunk); + } + split.getModulators().addAll(modlist); + } + } else { + + if (format.equals("cdl ")) { + if (!readCdlChunk(chunk)) + return false; + } + if (format.equals("rgnh")) { + split.keyfrom = chunk.readUnsignedShort(); + split.keyto = chunk.readUnsignedShort(); + split.velfrom = chunk.readUnsignedShort(); + split.velto = chunk.readUnsignedShort(); + split.options = chunk.readUnsignedShort(); + split.exclusiveClass = chunk.readUnsignedShort(); + } + if (format.equals("wlnk")) { + split.fusoptions = chunk.readUnsignedShort(); + split.phasegroup = chunk.readUnsignedShort(); + split.channel = chunk.readUnsignedInt(); + long sampleid = chunk.readUnsignedInt(); + temp_rgnassign.put(split, sampleid); + } + if (format.equals("wsmp")) { + split.sampleoptions = new DLSSampleOptions(); + readWsmpChunk(split.sampleoptions, chunk); + } + } + } + return true; + } + + private void readWsmpChunk(DLSSampleOptions sampleOptions, RIFFReader riff) + throws IOException { + long size = riff.readUnsignedInt(); + sampleOptions.unitynote = riff.readUnsignedShort(); + sampleOptions.finetune = riff.readShort(); + sampleOptions.attenuation = riff.readInt(); + sampleOptions.options = riff.readUnsignedInt(); + long loops = riff.readInt(); + + if (size > 20) + riff.skipBytes(size - 20); + + for (int i = 0; i < loops; i++) { + DLSSampleLoop loop = new DLSSampleLoop(); + long size2 = riff.readUnsignedInt(); + loop.type = riff.readUnsignedInt(); + loop.start = riff.readUnsignedInt(); + loop.length = riff.readUnsignedInt(); + sampleOptions.loops.add(loop); + if (size2 > 16) + riff.skipBytes(size2 - 16); + } + } + + private void readInsInfoChunk(DLSInstrument dlsinstrument, RIFFReader riff) + throws IOException { + dlsinstrument.info.name = null; + while (riff.hasNextChunk()) { + RIFFReader chunk = riff.nextChunk(); + String format = chunk.getFormat(); + if (format.equals("INAM")) { + dlsinstrument.info.name = chunk.readString(chunk.available()); + } else if (format.equals("ICRD")) { + dlsinstrument.info.creationDate = + chunk.readString(chunk.available()); + } else if (format.equals("IENG")) { + dlsinstrument.info.engineers = + chunk.readString(chunk.available()); + } else if (format.equals("IPRD")) { + dlsinstrument.info.product = chunk.readString(chunk.available()); + } else if (format.equals("ICOP")) { + dlsinstrument.info.copyright = + chunk.readString(chunk.available()); + } else if (format.equals("ICMT")) { + dlsinstrument.info.comments = + chunk.readString(chunk.available()); + } else if (format.equals("ISFT")) { + dlsinstrument.info.tools = chunk.readString(chunk.available()); + } else if (format.equals("IARL")) { + dlsinstrument.info.archival_location = + chunk.readString(chunk.available()); + } else if (format.equals("IART")) { + dlsinstrument.info.artist = chunk.readString(chunk.available()); + } else if (format.equals("ICMS")) { + dlsinstrument.info.commissioned = + chunk.readString(chunk.available()); + } else if (format.equals("IGNR")) { + dlsinstrument.info.genre = chunk.readString(chunk.available()); + } else if (format.equals("IKEY")) { + dlsinstrument.info.keywords = + chunk.readString(chunk.available()); + } else if (format.equals("IMED")) { + dlsinstrument.info.medium = chunk.readString(chunk.available()); + } else if (format.equals("ISBJ")) { + dlsinstrument.info.subject = chunk.readString(chunk.available()); + } else if (format.equals("ISRC")) { + dlsinstrument.info.source = chunk.readString(chunk.available()); + } else if (format.equals("ISRF")) { + dlsinstrument.info.source_form = + chunk.readString(chunk.available()); + } else if (format.equals("ITCH")) { + dlsinstrument.info.technician = + chunk.readString(chunk.available()); + } + } + } + + private void readWvplChunk(RIFFReader riff) throws IOException { + while (riff.hasNextChunk()) { + RIFFReader chunk = riff.nextChunk(); + if (chunk.getFormat().equals("LIST")) { + if (chunk.getType().equals("wave")) + readWaveChunk(chunk); + } + } + } + + private void readWaveChunk(RIFFReader riff) throws IOException { + DLSSample sample = new DLSSample(this); + + while (riff.hasNextChunk()) { + RIFFReader chunk = riff.nextChunk(); + String format = chunk.getFormat(); + if (format.equals("LIST")) { + if (chunk.getType().equals("INFO")) { + readWaveInfoChunk(sample, chunk); + } + } else { + if (format.equals("dlid")) { + sample.guid = new byte[16]; + chunk.readFully(sample.guid); + } + + if (format.equals("fmt ")) { + int sampleformat = chunk.readUnsignedShort(); + if (sampleformat != 1 && sampleformat != 3) { + throw new RIFFInvalidDataException( + "Only PCM samples are supported!"); + } + int channels = chunk.readUnsignedShort(); + long samplerate = chunk.readUnsignedInt(); + // bytes per sec + /* long framerate = */ chunk.readUnsignedInt(); + // block align, framesize + int framesize = chunk.readUnsignedShort(); + int bits = chunk.readUnsignedShort(); + AudioFormat audioformat = null; + if (sampleformat == 1) { + if (bits == 8) { + audioformat = new AudioFormat( + Encoding.PCM_UNSIGNED, samplerate, bits, + channels, framesize, samplerate, false); + } else { + audioformat = new AudioFormat( + Encoding.PCM_SIGNED, samplerate, bits, + channels, framesize, samplerate, false); + } + } + if (sampleformat == 3) { + audioformat = new AudioFormat( + AudioFloatConverter.PCM_FLOAT, samplerate, bits, + channels, framesize, samplerate, false); + } + + sample.format = audioformat; + } + + if (format.equals("data")) { + if (largeFormat) { + sample.setData(new ModelByteBuffer(sampleFile, + chunk.getFilePointer(), chunk.available())); + } else { + byte[] buffer = new byte[chunk.available()]; + // chunk.read(buffer); + sample.setData(buffer); + + int read = 0; + int avail = chunk.available(); + while (read != avail) { + if (avail - read > 65536) { + chunk.readFully(buffer, read, 65536); + read += 65536; + } else { + chunk.readFully(buffer, read, avail - read); + read = avail; + } + } + } + } + + if (format.equals("wsmp")) { + sample.sampleoptions = new DLSSampleOptions(); + readWsmpChunk(sample.sampleoptions, chunk); + } + } + } + + samples.add(sample); + + } + + private void readWaveInfoChunk(DLSSample dlssample, RIFFReader riff) + throws IOException { + dlssample.info.name = null; + while (riff.hasNextChunk()) { + RIFFReader chunk = riff.nextChunk(); + String format = chunk.getFormat(); + if (format.equals("INAM")) { + dlssample.info.name = chunk.readString(chunk.available()); + } else if (format.equals("ICRD")) { + dlssample.info.creationDate = + chunk.readString(chunk.available()); + } else if (format.equals("IENG")) { + dlssample.info.engineers = chunk.readString(chunk.available()); + } else if (format.equals("IPRD")) { + dlssample.info.product = chunk.readString(chunk.available()); + } else if (format.equals("ICOP")) { + dlssample.info.copyright = chunk.readString(chunk.available()); + } else if (format.equals("ICMT")) { + dlssample.info.comments = chunk.readString(chunk.available()); + } else if (format.equals("ISFT")) { + dlssample.info.tools = chunk.readString(chunk.available()); + } else if (format.equals("IARL")) { + dlssample.info.archival_location = + chunk.readString(chunk.available()); + } else if (format.equals("IART")) { + dlssample.info.artist = chunk.readString(chunk.available()); + } else if (format.equals("ICMS")) { + dlssample.info.commissioned = + chunk.readString(chunk.available()); + } else if (format.equals("IGNR")) { + dlssample.info.genre = chunk.readString(chunk.available()); + } else if (format.equals("IKEY")) { + dlssample.info.keywords = chunk.readString(chunk.available()); + } else if (format.equals("IMED")) { + dlssample.info.medium = chunk.readString(chunk.available()); + } else if (format.equals("ISBJ")) { + dlssample.info.subject = chunk.readString(chunk.available()); + } else if (format.equals("ISRC")) { + dlssample.info.source = chunk.readString(chunk.available()); + } else if (format.equals("ISRF")) { + dlssample.info.source_form = chunk.readString(chunk.available()); + } else if (format.equals("ITCH")) { + dlssample.info.technician = chunk.readString(chunk.available()); + } + } + } + + public void save(String name) throws IOException { + writeSoundbank(new RIFFWriter(name, "DLS ")); + } + + public void save(File file) throws IOException { + writeSoundbank(new RIFFWriter(file, "DLS ")); + } + + public void save(OutputStream out) throws IOException { + writeSoundbank(new RIFFWriter(out, "DLS ")); + } + + private void writeSoundbank(RIFFWriter writer) throws IOException { + RIFFWriter colh_chunk = writer.writeChunk("colh"); + colh_chunk.writeUnsignedInt(instruments.size()); + + if (major != -1 && minor != -1) { + RIFFWriter vers_chunk = writer.writeChunk("vers"); + vers_chunk.writeUnsignedInt(major); + vers_chunk.writeUnsignedInt(minor); + } + + writeInstruments(writer.writeList("lins")); + + RIFFWriter ptbl = writer.writeChunk("ptbl"); + ptbl.writeUnsignedInt(8); + ptbl.writeUnsignedInt(samples.size()); + long ptbl_offset = writer.getFilePointer(); + for (int i = 0; i < samples.size(); i++) + ptbl.writeUnsignedInt(0); + + RIFFWriter wvpl = writer.writeList("wvpl"); + long off = wvpl.getFilePointer(); + List offsettable = new ArrayList(); + for (DLSSample sample : samples) { + offsettable.add(Long.valueOf(wvpl.getFilePointer() - off)); + writeSample(wvpl.writeList("wave"), sample); + } + + // small cheat, we are going to rewrite data back in wvpl + long bak = writer.getFilePointer(); + writer.seek(ptbl_offset); + writer.setWriteOverride(true); + for (Long offset : offsettable) + writer.writeUnsignedInt(offset.longValue()); + writer.setWriteOverride(false); + writer.seek(bak); + + writeInfo(writer.writeList("INFO"), info); + + writer.close(); + } + + private void writeSample(RIFFWriter writer, DLSSample sample) + throws IOException { + + AudioFormat audioformat = sample.getFormat(); + + Encoding encoding = audioformat.getEncoding(); + float sampleRate = audioformat.getSampleRate(); + int sampleSizeInBits = audioformat.getSampleSizeInBits(); + int channels = audioformat.getChannels(); + int frameSize = audioformat.getFrameSize(); + float frameRate = audioformat.getFrameRate(); + boolean bigEndian = audioformat.isBigEndian(); + + boolean convert_needed = false; + + if (audioformat.getSampleSizeInBits() == 8) { + if (!encoding.equals(Encoding.PCM_UNSIGNED)) { + encoding = Encoding.PCM_UNSIGNED; + convert_needed = true; + } + } else { + if (!encoding.equals(Encoding.PCM_SIGNED)) { + encoding = Encoding.PCM_SIGNED; + convert_needed = true; + } + if (bigEndian) { + bigEndian = false; + convert_needed = true; + } + } + + if (convert_needed) { + audioformat = new AudioFormat(encoding, sampleRate, + sampleSizeInBits, channels, frameSize, frameRate, bigEndian); + } + + // fmt + RIFFWriter fmt_chunk = writer.writeChunk("fmt "); + int sampleformat = 0; + if (audioformat.getEncoding().equals(Encoding.PCM_UNSIGNED)) + sampleformat = 1; + else if (audioformat.getEncoding().equals(Encoding.PCM_SIGNED)) + sampleformat = 1; + else if (audioformat.getEncoding().equals(AudioFloatConverter.PCM_FLOAT)) + sampleformat = 3; + + fmt_chunk.writeUnsignedShort(sampleformat); + fmt_chunk.writeUnsignedShort(audioformat.getChannels()); + fmt_chunk.writeUnsignedInt((long) audioformat.getSampleRate()); + long srate = ((long)audioformat.getFrameRate())*audioformat.getFrameSize(); + fmt_chunk.writeUnsignedInt(srate); + fmt_chunk.writeUnsignedShort(audioformat.getFrameSize()); + fmt_chunk.writeUnsignedShort(audioformat.getSampleSizeInBits()); + fmt_chunk.write(0); + fmt_chunk.write(0); + + writeSampleOptions(writer.writeChunk("wsmp"), sample.sampleoptions); + + if (convert_needed) { + RIFFWriter data_chunk = writer.writeChunk("data"); + AudioInputStream stream = AudioSystem.getAudioInputStream( + audioformat, (AudioInputStream)sample.getData()); + byte[] buff = new byte[1024]; + int ret; + while ((ret = stream.read(buff)) != -1) { + data_chunk.write(buff, 0, ret); + } + } else { + RIFFWriter data_chunk = writer.writeChunk("data"); + ModelByteBuffer databuff = sample.getDataBuffer(); + databuff.writeTo(data_chunk); + /* + data_chunk.write(databuff.array(), + databuff.arrayOffset(), + databuff.capacity()); + */ + } + + writeInfo(writer.writeList("INFO"), sample.info); + } + + private void writeInstruments(RIFFWriter writer) throws IOException { + for (DLSInstrument instrument : instruments) { + writeInstrument(writer.writeList("ins "), instrument); + } + } + + private void writeInstrument(RIFFWriter writer, DLSInstrument instrument) + throws IOException { + + int art1_count = 0; + int art2_count = 0; + for (DLSModulator modulator : instrument.getModulators()) { + if (modulator.version == 1) + art1_count++; + if (modulator.version == 2) + art2_count++; + } + for (DLSRegion region : instrument.regions) { + for (DLSModulator modulator : region.getModulators()) { + if (modulator.version == 1) + art1_count++; + if (modulator.version == 2) + art2_count++; + } + } + + int version = 1; + if (art2_count > 0) + version = 2; + + RIFFWriter insh_chunk = writer.writeChunk("insh"); + insh_chunk.writeUnsignedInt(instrument.getRegions().size()); + insh_chunk.writeUnsignedInt(instrument.bank + + (instrument.druminstrument ? 2147483648L : 0)); + insh_chunk.writeUnsignedInt(instrument.preset); + + RIFFWriter lrgn = writer.writeList("lrgn"); + for (DLSRegion region: instrument.regions) + writeRegion(lrgn, region, version); + + writeArticulators(writer, instrument.getModulators()); + + writeInfo(writer.writeList("INFO"), instrument.info); + + } + + private void writeArticulators(RIFFWriter writer, + List modulators) throws IOException { + int art1_count = 0; + int art2_count = 0; + for (DLSModulator modulator : modulators) { + if (modulator.version == 1) + art1_count++; + if (modulator.version == 2) + art2_count++; + } + if (art1_count > 0) { + RIFFWriter lar1 = writer.writeList("lart"); + RIFFWriter art1 = lar1.writeChunk("art1"); + art1.writeUnsignedInt(8); + art1.writeUnsignedInt(art1_count); + for (DLSModulator modulator : modulators) { + if (modulator.version == 1) { + art1.writeUnsignedShort(modulator.source); + art1.writeUnsignedShort(modulator.control); + art1.writeUnsignedShort(modulator.destination); + art1.writeUnsignedShort(modulator.transform); + art1.writeInt(modulator.scale); + } + } + } + if (art2_count > 0) { + RIFFWriter lar2 = writer.writeList("lar2"); + RIFFWriter art2 = lar2.writeChunk("art2"); + art2.writeUnsignedInt(8); + art2.writeUnsignedInt(art2_count); + for (DLSModulator modulator : modulators) { + if (modulator.version == 2) { + art2.writeUnsignedShort(modulator.source); + art2.writeUnsignedShort(modulator.control); + art2.writeUnsignedShort(modulator.destination); + art2.writeUnsignedShort(modulator.transform); + art2.writeInt(modulator.scale); + } + } + } + } + + private void writeRegion(RIFFWriter writer, DLSRegion region, int version) + throws IOException { + RIFFWriter rgns = null; + if (version == 1) + rgns = writer.writeList("rgn "); + if (version == 2) + rgns = writer.writeList("rgn2"); + if (rgns == null) + return; + + RIFFWriter rgnh = rgns.writeChunk("rgnh"); + rgnh.writeUnsignedShort(region.keyfrom); + rgnh.writeUnsignedShort(region.keyto); + rgnh.writeUnsignedShort(region.velfrom); + rgnh.writeUnsignedShort(region.velto); + rgnh.writeUnsignedShort(region.options); + rgnh.writeUnsignedShort(region.exclusiveClass); + + if (region.sampleoptions != null) + writeSampleOptions(rgns.writeChunk("wsmp"), region.sampleoptions); + + if (region.sample != null) { + if (samples.indexOf(region.sample) != -1) { + RIFFWriter wlnk = rgns.writeChunk("wlnk"); + wlnk.writeUnsignedShort(region.fusoptions); + wlnk.writeUnsignedShort(region.phasegroup); + wlnk.writeUnsignedInt(region.channel); + wlnk.writeUnsignedInt(samples.indexOf(region.sample)); + } + } + writeArticulators(rgns, region.getModulators()); + rgns.close(); + } + + private void writeSampleOptions(RIFFWriter wsmp, + DLSSampleOptions sampleoptions) throws IOException { + wsmp.writeUnsignedInt(20); + wsmp.writeUnsignedShort(sampleoptions.unitynote); + wsmp.writeShort(sampleoptions.finetune); + wsmp.writeInt(sampleoptions.attenuation); + wsmp.writeUnsignedInt(sampleoptions.options); + wsmp.writeInt(sampleoptions.loops.size()); + + for (DLSSampleLoop loop : sampleoptions.loops) { + wsmp.writeUnsignedInt(16); + wsmp.writeUnsignedInt(loop.type); + wsmp.writeUnsignedInt(loop.start); + wsmp.writeUnsignedInt(loop.length); + } + } + + private void writeInfoStringChunk(RIFFWriter writer, + String name, String value) throws IOException { + if (value == null) + return; + RIFFWriter chunk = writer.writeChunk(name); + chunk.writeString(value); + int len = value.getBytes("ascii").length; + chunk.write(0); + len++; + if (len % 2 != 0) + chunk.write(0); + } + + private void writeInfo(RIFFWriter writer, DLSInfo info) throws IOException { + writeInfoStringChunk(writer, "INAM", info.name); + writeInfoStringChunk(writer, "ICRD", info.creationDate); + writeInfoStringChunk(writer, "IENG", info.engineers); + writeInfoStringChunk(writer, "IPRD", info.product); + writeInfoStringChunk(writer, "ICOP", info.copyright); + writeInfoStringChunk(writer, "ICMT", info.comments); + writeInfoStringChunk(writer, "ISFT", info.tools); + writeInfoStringChunk(writer, "IARL", info.archival_location); + writeInfoStringChunk(writer, "IART", info.artist); + writeInfoStringChunk(writer, "ICMS", info.commissioned); + writeInfoStringChunk(writer, "IGNR", info.genre); + writeInfoStringChunk(writer, "IKEY", info.keywords); + writeInfoStringChunk(writer, "IMED", info.medium); + writeInfoStringChunk(writer, "ISBJ", info.subject); + writeInfoStringChunk(writer, "ISRC", info.source); + writeInfoStringChunk(writer, "ISRF", info.source_form); + writeInfoStringChunk(writer, "ITCH", info.technician); + } + + public DLSInfo getInfo() { + return info; + } + + public String getName() { + return info.name; + } + + public String getVersion() { + return major + "." + minor; + } + + public String getVendor() { + return info.engineers; + } + + public String getDescription() { + return info.comments; + } + + public void setName(String s) { + info.name = s; + } + + public void setVendor(String s) { + info.engineers = s; + } + + public void setDescription(String s) { + info.comments = s; + } + + public SoundbankResource[] getResources() { + SoundbankResource[] resources = new SoundbankResource[samples.size()]; + int j = 0; + for (int i = 0; i < samples.size(); i++) + resources[j++] = samples.get(i); + return resources; + } + + public DLSInstrument[] getInstruments() { + DLSInstrument[] inslist_array = + instruments.toArray(new DLSInstrument[instruments.size()]); + Arrays.sort(inslist_array, new ModelInstrumentComparator()); + return inslist_array; + } + + public DLSSample[] getSamples() { + return samples.toArray(new DLSSample[samples.size()]); + } + + public Instrument getInstrument(Patch patch) { + int program = patch.getProgram(); + int bank = patch.getBank(); + boolean percussion = false; + if (patch instanceof ModelPatch) + percussion = ((ModelPatch) patch).isPercussion(); + for (Instrument instrument : instruments) { + Patch patch2 = instrument.getPatch(); + int program2 = patch2.getProgram(); + int bank2 = patch2.getBank(); + if (program == program2 && bank == bank2) { + boolean percussion2 = false; + if (patch2 instanceof ModelPatch) + percussion2 = ((ModelPatch) patch2).isPercussion(); + if (percussion == percussion2) + return instrument; + } + } + return null; + } + + public void addResource(SoundbankResource resource) { + if (resource instanceof DLSInstrument) + instruments.add((DLSInstrument) resource); + if (resource instanceof DLSSample) + samples.add((DLSSample) resource); + } + + public void removeResource(SoundbankResource resource) { + if (resource instanceof DLSInstrument) + instruments.remove((DLSInstrument) resource); + if (resource instanceof DLSSample) + samples.remove((DLSSample) resource); + } + + public void addInstrument(DLSInstrument resource) { + instruments.add(resource); + } + + public void removeInstrument(DLSInstrument resource) { + instruments.remove(resource); + } + + public long getMajor() { + return major; + } + + public void setMajor(long major) { + this.major = major; + } + + public long getMinor() { + return minor; + } + + public void setMinor(long minor) { + this.minor = minor; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/DLSSoundbankReader.java b/jdk/src/share/classes/com/sun/media/sound/DLSSoundbankReader.java new file mode 100644 index 00000000000..294384976af --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/DLSSoundbankReader.java @@ -0,0 +1,74 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package com.sun.media.sound; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import javax.sound.midi.InvalidMidiDataException; +import javax.sound.midi.Soundbank; +import javax.sound.midi.spi.SoundbankReader; + +/** + * This class is used to connect the DLSSoundBank class + * to the SoundbankReader SPI interface. + * + * @author Karl Helgason + */ +public class DLSSoundbankReader extends SoundbankReader { + + public Soundbank getSoundbank(URL url) + throws InvalidMidiDataException, IOException { + try { + return new DLSSoundbank(url); + } catch (RIFFInvalidFormatException e) { + return null; + } catch(IOException ioe) { + return null; + } + } + + public Soundbank getSoundbank(InputStream stream) + throws InvalidMidiDataException, IOException { + try { + stream.mark(512); + return new DLSSoundbank(stream); + } catch (RIFFInvalidFormatException e) { + stream.reset(); + return null; + } + } + + public Soundbank getSoundbank(File file) + throws InvalidMidiDataException, IOException { + try { + return new DLSSoundbank(file); + } catch (RIFFInvalidFormatException e) { + return null; + } + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/DirectAudioDevice.java b/jdk/src/share/classes/com/sun/media/sound/DirectAudioDevice.java index 754aebf6a44..7a4289b1a30 100644 --- a/jdk/src/share/classes/com/sun/media/sound/DirectAudioDevice.java +++ b/jdk/src/share/classes/com/sun/media/sound/DirectAudioDevice.java @@ -394,7 +394,12 @@ class DirectAudioDevice extends AbstractMixer { private float leftGain, rightGain; protected volatile boolean noService = false; // do not run the nService method + // Guards all native calls. protected Object lockNative = new Object(); + // Guards the lastOpened static variable in implOpen and implClose. + protected static Object lockLast = new Object(); + // Keeps track of last opened line, see implOpen "trick". + protected static DirectDL lastOpened; // CONSTRUCTOR protected DirectDL(DataLine.Info info, @@ -496,20 +501,50 @@ class DirectAudioDevice extends AbstractMixer { // align buffer to full frames bufferSize = ((int) bufferSize / format.getFrameSize()) * format.getFrameSize(); - id = nOpen(mixerIndex, deviceID, isSource, - encoding, - hardwareFormat.getSampleRate(), - hardwareFormat.getSampleSizeInBits(), - hardwareFormat.getFrameSize(), - hardwareFormat.getChannels(), - hardwareFormat.getEncoding().equals(AudioFormat.Encoding.PCM_SIGNED), - hardwareFormat.isBigEndian(), - bufferSize); + synchronized(lockLast) { + id = nOpen(mixerIndex, deviceID, isSource, + encoding, + hardwareFormat.getSampleRate(), + hardwareFormat.getSampleSizeInBits(), + hardwareFormat.getFrameSize(), + hardwareFormat.getChannels(), + hardwareFormat.getEncoding().equals( + AudioFormat.Encoding.PCM_SIGNED), + hardwareFormat.isBigEndian(), + bufferSize); - if (id == 0) { - // TODO: nicer error messages... - throw new LineUnavailableException("line with format "+format+" not supported."); + if (id == 0) { + // Bah... Dirty trick. The most likely cause is an application + // already having a line open for this particular hardware + // format and forgetting about it. If so, silently close that + // implementation and try again. Unfortuantely we can only + // open one line per hardware format currently. + if (lastOpened != null + && hardwareFormat.matches(lastOpened.hardwareFormat)) { + lastOpened.implClose(); + lastOpened = null; + + id = nOpen(mixerIndex, deviceID, isSource, + encoding, + hardwareFormat.getSampleRate(), + hardwareFormat.getSampleSizeInBits(), + hardwareFormat.getFrameSize(), + hardwareFormat.getChannels(), + hardwareFormat.getEncoding().equals( + AudioFormat.Encoding.PCM_SIGNED), + hardwareFormat.isBigEndian(), + bufferSize); + } + + if (id == 0) { + // TODO: nicer error messages... + throw new LineUnavailableException( + "line with format "+format+" not supported."); + } + } + lastOpened = this; } + this.bufferSize = nGetBufferSize(id, isSource); if (this.bufferSize < 1) { // this is an error! @@ -580,12 +615,12 @@ class DirectAudioDevice extends AbstractMixer { } synchronized (lockNative) { nStop(id, isSource); - } - // need to set doIO to false before notifying the - // read/write thread, that's why isStartedRunning() - // cannot be used - doIO = false; + // need to set doIO to false before notifying the + // read/write thread, that's why isStartedRunning() + // cannot be used + doIO = false; + } // wake up any waiting threads synchronized(lock) { lock.notifyAll(); @@ -614,8 +649,12 @@ class DirectAudioDevice extends AbstractMixer { doIO = false; long oldID = id; id = 0; - synchronized (lockNative) { - nClose(oldID, isSource); + synchronized (lockLast) { + synchronized (lockNative) { + nClose(oldID, isSource); + if (lastOpened == this) + lastOpened = null; + } } bytePosition = 0; softwareConversionSize = 0; @@ -630,7 +669,8 @@ class DirectAudioDevice extends AbstractMixer { } int a = 0; synchronized (lockNative) { - a = nAvailable(id, isSource); + if (doIO) + a = nAvailable(id, isSource); } return a; } @@ -644,9 +684,9 @@ class DirectAudioDevice extends AbstractMixer { int counter = 0; long startPos = getLongFramePosition(); boolean posChanged = false; - while (!drained && doIO) { + while (!drained) { synchronized (lockNative) { - if ((id == 0) || !nIsStillDraining(id, isSource)) + if ((id == 0) || (!doIO) || !nIsStillDraining(id, isSource)) break; } // check every now and then for a new position @@ -686,7 +726,7 @@ class DirectAudioDevice extends AbstractMixer { lock.notifyAll(); } synchronized (lockNative) { - if (id != 0) { + if (id != 0 && doIO) { // then flush native buffers nFlush(id, isSource); } @@ -697,9 +737,10 @@ class DirectAudioDevice extends AbstractMixer { // replacement for getFramePosition (see AbstractDataLine) public long getLongFramePosition() { - long pos; + long pos = 0; synchronized (lockNative) { - pos = nGetBytePosition(id, isSource, bytePosition); + if (doIO) + pos = nGetBytePosition(id, isSource, bytePosition); } // hack because ALSA sometimes reports wrong framepos if (pos < 0) { @@ -745,11 +786,12 @@ class DirectAudioDevice extends AbstractMixer { } int written = 0; while (!flushing) { - int thisWritten; + int thisWritten = 0; synchronized (lockNative) { - thisWritten = nWrite(id, b, off, len, - softwareConversionSize, - leftGain, rightGain); + if (doIO) + thisWritten = nWrite(id, b, off, len, + softwareConversionSize, + leftGain, rightGain); if (thisWritten < 0) { // error in native layer break; @@ -972,9 +1014,10 @@ class DirectAudioDevice extends AbstractMixer { } int read = 0; while (doIO && !flushing) { - int thisRead; + int thisRead = 0; synchronized (lockNative) { - thisRead = nRead(id, b, off, len, softwareConversionSize); + if (doIO) + thisRead = nRead(id, b, off, len, softwareConversionSize); if (thisRead < 0) { // error in native layer break; @@ -1209,7 +1252,8 @@ class DirectAudioDevice extends AbstractMixer { // set new native position (if necessary) // this must come after the flush! synchronized (lockNative) { - nSetBytePosition(id, isSource, frames * frameSize); + if (doIO) + nSetBytePosition(id, isSource, frames * frameSize); } if (Printer.debug) Printer.debug(" DirectClip.setFramePosition: " diff --git a/jdk/src/share/classes/com/sun/media/sound/EmergencySoundbank.java b/jdk/src/share/classes/com/sun/media/sound/EmergencySoundbank.java new file mode 100644 index 00000000000..9e248641c05 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/EmergencySoundbank.java @@ -0,0 +1,2695 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.Random; + +import javax.sound.midi.Patch; +import javax.sound.sampled.AudioFormat; + +/** + * Emergency Soundbank generator. + * Used when no other default soundbank can be found. + * + * @author Karl Helgason + */ +public class EmergencySoundbank { + + private final static String[] general_midi_instruments = { + "Acoustic Grand Piano", + "Bright Acoustic Piano", + "Electric Grand Piano", + "Honky-tonk Piano", + "Electric Piano 1", + "Electric Piano 2", + "Harpsichord", + "Clavi", + "Celesta", + "Glockenspiel", + "Music Box", + "Vibraphone", + "Marimba", + "Xylophone", + "Tubular Bells", + "Dulcimer", + "Drawbar Organ", + "Percussive Organ", + "Rock Organ", + "Church Organ", + "Reed Organ", + "Accordion", + "Harmonica", + "Tango Accordion", + "Acoustic Guitar (nylon)", + "Acoustic Guitar (steel)", + "Electric Guitar (jazz)", + "Electric Guitar (clean)", + "Electric Guitar (muted)", + "Overdriven Guitar", + "Distortion Guitar", + "Guitar harmonics", + "Acoustic Bass", + "Electric Bass (finger)", + "Electric Bass (pick)", + "Fretless Bass", + "Slap Bass 1", + "Slap Bass 2", + "Synth Bass 1", + "Synth Bass 2", + "Violin", + "Viola", + "Cello", + "Contrabass", + "Tremolo Strings", + "Pizzicato Strings", + "Orchestral Harp", + "Timpani", + "String Ensemble 1", + "String Ensemble 2", + "SynthStrings 1", + "SynthStrings 2", + "Choir Aahs", + "Voice Oohs", + "Synth Voice", + "Orchestra Hit", + "Trumpet", + "Trombone", + "Tuba", + "Muted Trumpet", + "French Horn", + "Brass Section", + "SynthBrass 1", + "SynthBrass 2", + "Soprano Sax", + "Alto Sax", + "Tenor Sax", + "Baritone Sax", + "Oboe", + "English Horn", + "Bassoon", + "Clarinet", + "Piccolo", + "Flute", + "Recorder", + "Pan Flute", + "Blown Bottle", + "Shakuhachi", + "Whistle", + "Ocarina", + "Lead 1 (square)", + "Lead 2 (sawtooth)", + "Lead 3 (calliope)", + "Lead 4 (chiff)", + "Lead 5 (charang)", + "Lead 6 (voice)", + "Lead 7 (fifths)", + "Lead 8 (bass + lead)", + "Pad 1 (new age)", + "Pad 2 (warm)", + "Pad 3 (polysynth)", + "Pad 4 (choir)", + "Pad 5 (bowed)", + "Pad 6 (metallic)", + "Pad 7 (halo)", + "Pad 8 (sweep)", + "FX 1 (rain)", + "FX 2 (soundtrack)", + "FX 3 (crystal)", + "FX 4 (atmosphere)", + "FX 5 (brightness)", + "FX 6 (goblins)", + "FX 7 (echoes)", + "FX 8 (sci-fi)", + "Sitar", + "Banjo", + "Shamisen", + "Koto", + "Kalimba", + "Bag pipe", + "Fiddle", + "Shanai", + "Tinkle Bell", + "Agogo", + "Steel Drums", + "Woodblock", + "Taiko Drum", + "Melodic Tom", + "Synth Drum", + "Reverse Cymbal", + "Guitar Fret Noise", + "Breath Noise", + "Seashore", + "Bird Tweet", + "Telephone Ring", + "Helicopter", + "Applause", + "Gunshot" + }; + + public static SF2Soundbank createSoundbank() throws Exception { + SF2Soundbank sf2 = new SF2Soundbank(); + sf2.setName("Emergency GM sound set"); + sf2.setVendor("Generated"); + sf2.setDescription("Emergency generated soundbank"); + + /* + * percussion instruments + */ + + SF2Layer bass_drum = new_bass_drum(sf2); + SF2Layer snare_drum = new_snare_drum(sf2); + SF2Layer tom = new_tom(sf2); + SF2Layer open_hihat = new_open_hihat(sf2); + SF2Layer closed_hihat = new_closed_hihat(sf2); + SF2Layer crash_cymbal = new_crash_cymbal(sf2); + SF2Layer side_stick = new_side_stick(sf2); + + SF2Layer[] drums = new SF2Layer[128]; + drums[35] = bass_drum; + drums[36] = bass_drum; + drums[38] = snare_drum; + drums[40] = snare_drum; + drums[41] = tom; + drums[43] = tom; + drums[45] = tom; + drums[47] = tom; + drums[48] = tom; + drums[50] = tom; + drums[42] = closed_hihat; + drums[44] = closed_hihat; + drums[46] = open_hihat; + drums[49] = crash_cymbal; + drums[51] = crash_cymbal; + drums[52] = crash_cymbal; + drums[55] = crash_cymbal; + drums[57] = crash_cymbal; + drums[59] = crash_cymbal; + + // Use side_stick for missing drums: + drums[37] = side_stick; + drums[39] = side_stick; + drums[53] = side_stick; + drums[54] = side_stick; + drums[56] = side_stick; + drums[58] = side_stick; + drums[69] = side_stick; + drums[70] = side_stick; + drums[75] = side_stick; + drums[60] = side_stick; + drums[61] = side_stick; + drums[62] = side_stick; + drums[63] = side_stick; + drums[64] = side_stick; + drums[65] = side_stick; + drums[66] = side_stick; + drums[67] = side_stick; + drums[68] = side_stick; + drums[71] = side_stick; + drums[72] = side_stick; + drums[73] = side_stick; + drums[74] = side_stick; + drums[76] = side_stick; + drums[77] = side_stick; + drums[78] = side_stick; + drums[79] = side_stick; + drums[80] = side_stick; + drums[81] = side_stick; + + + SF2Instrument drum_instrument = new SF2Instrument(sf2); + drum_instrument.setName("Standard Kit"); + drum_instrument.setPatch(new ModelPatch(0, 0, true)); + sf2.addInstrument(drum_instrument); + for (int i = 0; i < drums.length; i++) { + if (drums[i] != null) { + SF2InstrumentRegion region = new SF2InstrumentRegion(); + region.setLayer(drums[i]); + region.putBytes(SF2InstrumentRegion.GENERATOR_KEYRANGE, + new byte[]{(byte) i, (byte) i}); + drum_instrument.getRegions().add(region); + } + } + + + /* + * melodic instruments + */ + + SF2Layer gpiano = new_gpiano(sf2); + SF2Layer gpiano2 = new_gpiano2(sf2); + SF2Layer gpiano_hammer = new_piano_hammer(sf2); + SF2Layer piano1 = new_piano1(sf2); + SF2Layer epiano1 = new_epiano1(sf2); + SF2Layer epiano2 = new_epiano2(sf2); + + SF2Layer guitar = new_guitar1(sf2); + SF2Layer guitar_pick = new_guitar_pick(sf2); + SF2Layer guitar_dist = new_guitar_dist(sf2); + SF2Layer bass1 = new_bass1(sf2); + SF2Layer bass2 = new_bass2(sf2); + SF2Layer synthbass = new_synthbass(sf2); + SF2Layer string2 = new_string2(sf2); + SF2Layer orchhit = new_orchhit(sf2); + SF2Layer choir = new_choir(sf2); + SF2Layer solostring = new_solostring(sf2); + SF2Layer organ = new_organ(sf2); + SF2Layer ch_organ = new_ch_organ(sf2); + SF2Layer bell = new_bell(sf2); + SF2Layer flute = new_flute(sf2); + + SF2Layer timpani = new_timpani(sf2); + SF2Layer melodic_toms = new_melodic_toms(sf2); + SF2Layer trumpet = new_trumpet(sf2); + SF2Layer trombone = new_trombone(sf2); + SF2Layer brass_section = new_brass_section(sf2); + SF2Layer horn = new_horn(sf2); + SF2Layer sax = new_sax(sf2); + SF2Layer oboe = new_oboe(sf2); + SF2Layer bassoon = new_bassoon(sf2); + SF2Layer clarinet = new_clarinet(sf2); + SF2Layer reverse_cymbal = new_reverse_cymbal(sf2); + + SF2Layer defaultsound = piano1; + + newInstrument(sf2, "Piano", new Patch(0, 0), gpiano, gpiano_hammer); + newInstrument(sf2, "Piano", new Patch(0, 1), gpiano2, gpiano_hammer); + newInstrument(sf2, "Piano", new Patch(0, 2), piano1); + { + SF2Instrument ins = newInstrument(sf2, "Honky-tonk Piano", + new Patch(0, 3), piano1, piano1); + SF2InstrumentRegion region = ins.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 80); + region.putInteger(SF2Region.GENERATOR_FINETUNE, 30); + region = ins.getRegions().get(1); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 30); + } + newInstrument(sf2, "Rhodes", new Patch(0, 4), epiano2); + newInstrument(sf2, "Rhodes", new Patch(0, 5), epiano2); + newInstrument(sf2, "Clavinet", new Patch(0, 6), epiano1); + newInstrument(sf2, "Clavinet", new Patch(0, 7), epiano1); + newInstrument(sf2, "Rhodes", new Patch(0, 8), epiano2); + newInstrument(sf2, "Bell", new Patch(0, 9), bell); + newInstrument(sf2, "Bell", new Patch(0, 10), bell); + newInstrument(sf2, "Vibraphone", new Patch(0, 11), bell); + newInstrument(sf2, "Marimba", new Patch(0, 12), bell); + newInstrument(sf2, "Marimba", new Patch(0, 13), bell); + newInstrument(sf2, "Bell", new Patch(0, 14), bell); + newInstrument(sf2, "Rock Organ", new Patch(0, 15), organ); + newInstrument(sf2, "Rock Organ", new Patch(0, 16), organ); + newInstrument(sf2, "Perc Organ", new Patch(0, 17), organ); + newInstrument(sf2, "Rock Organ", new Patch(0, 18), organ); + newInstrument(sf2, "Church Organ", new Patch(0, 19), ch_organ); + newInstrument(sf2, "Accordion", new Patch(0, 20), organ); + newInstrument(sf2, "Accordion", new Patch(0, 21), organ); + newInstrument(sf2, "Accordion", new Patch(0, 22), organ); + newInstrument(sf2, "Accordion", new Patch(0, 23), organ); + newInstrument(sf2, "Guitar", new Patch(0, 24), guitar, guitar_pick); + newInstrument(sf2, "Guitar", new Patch(0, 25), guitar, guitar_pick); + newInstrument(sf2, "Guitar", new Patch(0, 26), guitar, guitar_pick); + newInstrument(sf2, "Guitar", new Patch(0, 27), guitar, guitar_pick); + newInstrument(sf2, "Guitar", new Patch(0, 28), guitar, guitar_pick); + newInstrument(sf2, "Distorted Guitar", new Patch(0, 29), guitar_dist); + newInstrument(sf2, "Distorted Guitar", new Patch(0, 30), guitar_dist); + newInstrument(sf2, "Guitar", new Patch(0, 31), guitar, guitar_pick); + newInstrument(sf2, "Finger Bass", new Patch(0, 32), bass1); + newInstrument(sf2, "Finger Bass", new Patch(0, 33), bass1); + newInstrument(sf2, "Finger Bass", new Patch(0, 34), bass1); + newInstrument(sf2, "Frettless Bass", new Patch(0, 35), bass2); + newInstrument(sf2, "Frettless Bass", new Patch(0, 36), bass2); + newInstrument(sf2, "Frettless Bass", new Patch(0, 37), bass2); + newInstrument(sf2, "Synth Bass1", new Patch(0, 38), synthbass); + newInstrument(sf2, "Synth Bass2", new Patch(0, 39), synthbass); + newInstrument(sf2, "Solo String", new Patch(0, 40), string2, solostring); + newInstrument(sf2, "Solo String", new Patch(0, 41), string2, solostring); + newInstrument(sf2, "Solo String", new Patch(0, 42), string2, solostring); + newInstrument(sf2, "Solo String", new Patch(0, 43), string2, solostring); + newInstrument(sf2, "Solo String", new Patch(0, 44), string2, solostring); + newInstrument(sf2, "Def", new Patch(0, 45), defaultsound); + newInstrument(sf2, "Harp", new Patch(0, 46), bell); + newInstrument(sf2, "Timpani", new Patch(0, 47), timpani); + newInstrument(sf2, "Strings", new Patch(0, 48), string2); + SF2Instrument slow_strings = + newInstrument(sf2, "Slow Strings", new Patch(0, 49), string2); + SF2InstrumentRegion region = slow_strings.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, 2500); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 2000); + newInstrument(sf2, "Synth Strings", new Patch(0, 50), string2); + newInstrument(sf2, "Synth Strings", new Patch(0, 51), string2); + + + newInstrument(sf2, "Choir", new Patch(0, 52), choir); + newInstrument(sf2, "Choir", new Patch(0, 53), choir); + newInstrument(sf2, "Choir", new Patch(0, 54), choir); + { + SF2Instrument ins = newInstrument(sf2, "Orch Hit", + new Patch(0, 55), orchhit, orchhit, timpani); + region = ins.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_COARSETUNE, -12); + region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100); + } + newInstrument(sf2, "Trumpet", new Patch(0, 56), trumpet); + newInstrument(sf2, "Trombone", new Patch(0, 57), trombone); + newInstrument(sf2, "Trombone", new Patch(0, 58), trombone); + newInstrument(sf2, "Trumpet", new Patch(0, 59), trumpet); + newInstrument(sf2, "Horn", new Patch(0, 60), horn); + newInstrument(sf2, "Brass Section", new Patch(0, 61), brass_section); + newInstrument(sf2, "Brass Section", new Patch(0, 62), brass_section); + newInstrument(sf2, "Brass Section", new Patch(0, 63), brass_section); + newInstrument(sf2, "Sax", new Patch(0, 64), sax); + newInstrument(sf2, "Sax", new Patch(0, 65), sax); + newInstrument(sf2, "Sax", new Patch(0, 66), sax); + newInstrument(sf2, "Sax", new Patch(0, 67), sax); + newInstrument(sf2, "Oboe", new Patch(0, 68), oboe); + newInstrument(sf2, "Horn", new Patch(0, 69), horn); + newInstrument(sf2, "Bassoon", new Patch(0, 70), bassoon); + newInstrument(sf2, "Clarinet", new Patch(0, 71), clarinet); + newInstrument(sf2, "Flute", new Patch(0, 72), flute); + newInstrument(sf2, "Flute", new Patch(0, 73), flute); + newInstrument(sf2, "Flute", new Patch(0, 74), flute); + newInstrument(sf2, "Flute", new Patch(0, 75), flute); + newInstrument(sf2, "Flute", new Patch(0, 76), flute); + newInstrument(sf2, "Flute", new Patch(0, 77), flute); + newInstrument(sf2, "Flute", new Patch(0, 78), flute); + newInstrument(sf2, "Flute", new Patch(0, 79), flute); + newInstrument(sf2, "Organ", new Patch(0, 80), organ); + newInstrument(sf2, "Organ", new Patch(0, 81), organ); + newInstrument(sf2, "Flute", new Patch(0, 82), flute); + newInstrument(sf2, "Organ", new Patch(0, 83), organ); + newInstrument(sf2, "Organ", new Patch(0, 84), organ); + newInstrument(sf2, "Choir", new Patch(0, 85), choir); + newInstrument(sf2, "Organ", new Patch(0, 86), organ); + newInstrument(sf2, "Organ", new Patch(0, 87), organ); + newInstrument(sf2, "Synth Strings", new Patch(0, 88), string2); + newInstrument(sf2, "Organ", new Patch(0, 89), organ); + newInstrument(sf2, "Def", new Patch(0, 90), defaultsound); + newInstrument(sf2, "Choir", new Patch(0, 91), choir); + newInstrument(sf2, "Organ", new Patch(0, 92), organ); + newInstrument(sf2, "Organ", new Patch(0, 93), organ); + newInstrument(sf2, "Organ", new Patch(0, 94), organ); + newInstrument(sf2, "Organ", new Patch(0, 95), organ); + newInstrument(sf2, "Organ", new Patch(0, 96), organ); + newInstrument(sf2, "Organ", new Patch(0, 97), organ); + newInstrument(sf2, "Bell", new Patch(0, 98), bell); + newInstrument(sf2, "Organ", new Patch(0, 99), organ); + newInstrument(sf2, "Organ", new Patch(0, 100), organ); + newInstrument(sf2, "Organ", new Patch(0, 101), organ); + newInstrument(sf2, "Def", new Patch(0, 102), defaultsound); + newInstrument(sf2, "Synth Strings", new Patch(0, 103), string2); + newInstrument(sf2, "Def", new Patch(0, 104), defaultsound); + newInstrument(sf2, "Def", new Patch(0, 105), defaultsound); + newInstrument(sf2, "Def", new Patch(0, 106), defaultsound); + newInstrument(sf2, "Def", new Patch(0, 107), defaultsound); + newInstrument(sf2, "Marimba", new Patch(0, 108), bell); + newInstrument(sf2, "Sax", new Patch(0, 109), sax); + newInstrument(sf2, "Solo String", new Patch(0, 110), string2, solostring); + newInstrument(sf2, "Oboe", new Patch(0, 111), oboe); + newInstrument(sf2, "Bell", new Patch(0, 112), bell); + newInstrument(sf2, "Melodic Toms", new Patch(0, 113), melodic_toms); + newInstrument(sf2, "Marimba", new Patch(0, 114), bell); + newInstrument(sf2, "Melodic Toms", new Patch(0, 115), melodic_toms); + newInstrument(sf2, "Melodic Toms", new Patch(0, 116), melodic_toms); + newInstrument(sf2, "Melodic Toms", new Patch(0, 117), melodic_toms); + newInstrument(sf2, "Reverse Cymbal", new Patch(0, 118), reverse_cymbal); + newInstrument(sf2, "Reverse Cymbal", new Patch(0, 119), reverse_cymbal); + newInstrument(sf2, "Guitar", new Patch(0, 120), guitar); + newInstrument(sf2, "Def", new Patch(0, 121), defaultsound); + { + SF2Instrument ins = newInstrument(sf2, "Seashore/Reverse Cymbal", + new Patch(0, 122), reverse_cymbal); + region = ins.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 18500); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 4500); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, -4500); + } + { + SF2Instrument ins = newInstrument(sf2, "Bird/Flute", + new Patch(0, 123), flute); + region = ins.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_COARSETUNE, 24); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, -3000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + } + newInstrument(sf2, "Def", new Patch(0, 124), side_stick); + { + SF2Instrument ins = newInstrument(sf2, "Seashore/Reverse Cymbal", + new Patch(0, 125), reverse_cymbal); + region = ins.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 18500); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 4500); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, -4500); + } + newInstrument(sf2, "Applause/crash_cymbal", + new Patch(0, 126), crash_cymbal); + newInstrument(sf2, "Gunshot/side_stick", new Patch(0, 127), side_stick); + + for (SF2Instrument instrument : sf2.getInstruments()) { + Patch patch = instrument.getPatch(); + if (patch instanceof ModelPatch) { + if (((ModelPatch) patch).isPercussion()) + continue; + } + instrument.setName(general_midi_instruments[patch.getProgram()]); + } + + return sf2; + + } + + public static SF2Layer new_bell(SF2Soundbank sf2) { + Random random = new Random(102030201); + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 25; + double start_w = 0.01; + double end_w = 0.05; + double start_a = 0.2; + double end_a = 0.00001; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 40.0); + for (int i = 0; i < 40; i++) { + double detune = 1 + (random.nextDouble() * 2 - 1) * 0.01; + double w = start_w + (end_w - start_w) * (i / 40.0); + complexGaussianDist(data, base * (i + 1) * detune, w, a); + a *= a_step; + } + SF2Sample sample = newSimpleFFTSample(sf2, "EPiano", data, base); + SF2Layer layer = newLayer(sf2, "EPiano", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, 1200); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -9000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 16000); + return layer; + } + + public static SF2Layer new_guitar1(SF2Soundbank sf2) { + + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 25; + double start_w = 0.01; + double end_w = 0.01; + double start_a = 2; + double end_a = 0.01; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 40.0); + + double[] aa = new double[40]; + for (int i = 0; i < 40; i++) { + aa[i] = a; + a *= a_step; + } + + aa[0] = 2; + aa[1] = 0.5; + aa[2] = 0.45; + aa[3] = 0.2; + aa[4] = 1; + aa[5] = 0.5; + aa[6] = 2; + aa[7] = 1; + aa[8] = 0.5; + aa[9] = 1; + aa[9] = 0.5; + aa[10] = 0.2; + aa[11] = 1; + aa[12] = 0.7; + aa[13] = 0.5; + aa[14] = 1; + + for (int i = 0; i < 40; i++) { + double w = start_w + (end_w - start_w) * (i / 40.0); + complexGaussianDist(data, base * (i + 1), w, aa[i]); + } + + SF2Sample sample = newSimpleFFTSample(sf2, "Guitar", data, base); + SF2Layer layer = newLayer(sf2, "Guitar", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 2400); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -100); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -6000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 16000); + region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -20); + return layer; + } + + public static SF2Layer new_guitar_dist(SF2Soundbank sf2) { + + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 25; + double start_w = 0.01; + double end_w = 0.01; + double start_a = 2; + double end_a = 0.01; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 40.0); + + double[] aa = new double[40]; + for (int i = 0; i < 40; i++) { + aa[i] = a; + a *= a_step; + } + + aa[0] = 5; + aa[1] = 2; + aa[2] = 0.45; + aa[3] = 0.2; + aa[4] = 1; + aa[5] = 0.5; + aa[6] = 2; + aa[7] = 1; + aa[8] = 0.5; + aa[9] = 1; + aa[9] = 0.5; + aa[10] = 0.2; + aa[11] = 1; + aa[12] = 0.7; + aa[13] = 0.5; + aa[14] = 1; + + for (int i = 0; i < 40; i++) { + double w = start_w + (end_w - start_w) * (i / 40.0); + complexGaussianDist(data, base * (i + 1), w, aa[i]); + } + + + SF2Sample sample = newSimpleFFTSample_dist(sf2, "Distorted Guitar", + data, base, 10000.0); + + + SF2Layer layer = newLayer(sf2, "Distorted Guitar", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0); + //region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 2400); + //region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 200); + + //region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -100); + //region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + //region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -1000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 8000); + //region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -20); + return layer; + } + + public static SF2Layer new_guitar_pick(SF2Soundbank sf2) { + + double datab[]; + + // Make treble part + { + int m = 2; + int fftlen = 4096 * m; + double[] data = new double[2 * fftlen]; + Random random = new Random(3049912); + for (int i = 0; i < data.length; i += 2) + data[i] = (2.0 * (random.nextDouble() - 0.5)); + fft(data); + // Remove all negative frequency + for (int i = fftlen / 2; i < data.length; i++) + data[i] = 0; + for (int i = 0; i < 2048 * m; i++) { + data[i] *= Math.exp(-Math.abs((i - 23) / ((double) m)) * 1.2) + + Math.exp(-Math.abs((i - 40) / ((double) m)) * 0.9); + } + randomPhase(data, new Random(3049912)); + ifft(data); + normalize(data, 0.8); + data = realPart(data); + double gain = 1.0; + for (int i = 0; i < data.length; i++) { + data[i] *= gain; + gain *= 0.9994; + } + datab = data; + + fadeUp(data, 80); + } + + SF2Sample sample = newSimpleDrumSample(sf2, "Guitar Noise", datab); + + SF2Layer layer = new SF2Layer(sf2); + layer.setName("Guitar Noise"); + + SF2GlobalRegion global = new SF2GlobalRegion(); + layer.setGlobalZone(global); + sf2.addResource(layer); + + SF2LayerRegion region = new SF2LayerRegion(); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000); + //region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0); +// region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100); +/* + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, 0); + region.putInteger(SF2Region.GENERATOR_SUSTAINMODENV, 1000); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -11000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 12000); + */ + + region.setSample(sample); + layer.getRegions().add(region); + + return layer; + } + + public static SF2Layer new_gpiano(SF2Soundbank sf2) { + //Random random = new Random(302030201); + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 25; + double start_a = 0.2; + double end_a = 0.001; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 15.0); + + double[] aa = new double[30]; + for (int i = 0; i < 30; i++) { + aa[i] = a; + a *= a_step; + } + + aa[0] *= 2; + //aa[2] *= 0.1; + aa[4] *= 2; + + + aa[12] *= 0.9; + aa[13] *= 0.7; + for (int i = 14; i < 30; i++) { + aa[i] *= 0.5; + } + + + for (int i = 0; i < 30; i++) { + //double detune = 1 + (random.nextDouble()*2 - 1)*0.0001; + double w = 0.2; + double ai = aa[i]; + if (i > 10) { + w = 5; + ai *= 10; + } + int adjust = 0; + if (i > 5) { + adjust = (i - 5) * 7; + } + complexGaussianDist(data, base * (i + 1) + adjust, w, ai); + } + + SF2Sample sample = newSimpleFFTSample(sf2, "Grand Piano", data, base, 200); + SF2Layer layer = newLayer(sf2, "Grand Piano", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -7000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -6000); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -5500); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 18000); + return layer; + } + + public static SF2Layer new_gpiano2(SF2Soundbank sf2) { + //Random random = new Random(302030201); + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 25; + double start_a = 0.2; + double end_a = 0.001; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 20.0); + + double[] aa = new double[30]; + for (int i = 0; i < 30; i++) { + aa[i] = a; + a *= a_step; + } + + aa[0] *= 1; + //aa[2] *= 0.1; + aa[4] *= 2; + + + aa[12] *= 0.9; + aa[13] *= 0.7; + for (int i = 14; i < 30; i++) { + aa[i] *= 0.5; + } + + + for (int i = 0; i < 30; i++) { + //double detune = 1 + (random.nextDouble()*2 - 1)*0.0001; + double w = 0.2; + double ai = aa[i]; + if (i > 10) { + w = 5; + ai *= 10; + } + int adjust = 0; + if (i > 5) { + adjust = (i - 5) * 7; + } + complexGaussianDist(data, base * (i + 1) + adjust, w, ai); + } + + SF2Sample sample = newSimpleFFTSample(sf2, "Grand Piano", data, base, 200); + SF2Layer layer = newLayer(sf2, "Grand Piano", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -7000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -6000); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -5500); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 18000); + return layer; + } + + public static SF2Layer new_piano_hammer(SF2Soundbank sf2) { + + double datab[]; + + // Make treble part + { + int m = 2; + int fftlen = 4096 * m; + double[] data = new double[2 * fftlen]; + Random random = new Random(3049912); + for (int i = 0; i < data.length; i += 2) + data[i] = (2.0 * (random.nextDouble() - 0.5)); + fft(data); + // Remove all negative frequency + for (int i = fftlen / 2; i < data.length; i++) + data[i] = 0; + for (int i = 0; i < 2048 * m; i++) + data[i] *= Math.exp(-Math.abs((i - 37) / ((double) m)) * 0.05); + randomPhase(data, new Random(3049912)); + ifft(data); + normalize(data, 0.6); + data = realPart(data); + double gain = 1.0; + for (int i = 0; i < data.length; i++) { + data[i] *= gain; + gain *= 0.9997; + } + datab = data; + + fadeUp(data, 80); + } + + SF2Sample sample = newSimpleDrumSample(sf2, "Piano Hammer", datab); + + SF2Layer layer = new SF2Layer(sf2); + layer.setName("Piano Hammer"); + + SF2GlobalRegion global = new SF2GlobalRegion(); + layer.setGlobalZone(global); + sf2.addResource(layer); + + SF2LayerRegion region = new SF2LayerRegion(); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000); + //region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0); +/* + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, 0); + region.putInteger(SF2Region.GENERATOR_SUSTAINMODENV, 1000); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -11000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 12000); + */ + + region.setSample(sample); + layer.getRegions().add(region); + + return layer; + } + + public static SF2Layer new_piano1(SF2Soundbank sf2) { + //Random random = new Random(302030201); + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 25; + double start_a = 0.2; + double end_a = 0.0001; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 40.0); + + double[] aa = new double[30]; + for (int i = 0; i < 30; i++) { + aa[i] = a; + a *= a_step; + } + + aa[0] *= 5; + aa[2] *= 0.1; + aa[7] *= 5; + + + for (int i = 0; i < 30; i++) { + //double detune = 1 + (random.nextDouble()*2 - 1)*0.0001; + double w = 0.2; + double ai = aa[i]; + if (i > 12) { + w = 5; + ai *= 10; + } + int adjust = 0; + if (i > 5) { + adjust = (i - 5) * 7; + } + complexGaussianDist(data, base * (i + 1) + adjust, w, ai); + } + + complexGaussianDist(data, base * (15.5), 1, 0.1); + complexGaussianDist(data, base * (17.5), 1, 0.01); + + SF2Sample sample = newSimpleFFTSample(sf2, "EPiano", data, base, 200); + SF2Layer layer = newLayer(sf2, "EPiano", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -1200); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -5500); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 16000); + return layer; + } + + public static SF2Layer new_epiano1(SF2Soundbank sf2) { + Random random = new Random(302030201); + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 25; + double start_w = 0.05; + double end_w = 0.05; + double start_a = 0.2; + double end_a = 0.0001; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 40.0); + for (int i = 0; i < 40; i++) { + double detune = 1 + (random.nextDouble() * 2 - 1) * 0.0001; + double w = start_w + (end_w - start_w) * (i / 40.0); + complexGaussianDist(data, base * (i + 1) * detune, w, a); + a *= a_step; + } + + + + SF2Sample sample = newSimpleFFTSample(sf2, "EPiano", data, base); + SF2Layer layer = newLayer(sf2, "EPiano", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, 1200); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -9000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 16000); + return layer; + } + + public static SF2Layer new_epiano2(SF2Soundbank sf2) { + Random random = new Random(302030201); + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 25; + double start_w = 0.01; + double end_w = 0.05; + double start_a = 0.2; + double end_a = 0.00001; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 40.0); + for (int i = 0; i < 40; i++) { + double detune = 1 + (random.nextDouble() * 2 - 1) * 0.0001; + double w = start_w + (end_w - start_w) * (i / 40.0); + complexGaussianDist(data, base * (i + 1) * detune, w, a); + a *= a_step; + } + + SF2Sample sample = newSimpleFFTSample(sf2, "EPiano", data, base); + SF2Layer layer = newLayer(sf2, "EPiano", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 8000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, 2400); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -9000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 16000); + region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100); + return layer; + } + + public static SF2Layer new_bass1(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 25; + double start_w = 0.05; + double end_w = 0.05; + double start_a = 0.2; + double end_a = 0.02; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 25.0); + + double[] aa = new double[25]; + for (int i = 0; i < 25; i++) { + aa[i] = a; + a *= a_step; + } + + aa[0] *= 8; + aa[1] *= 4; + aa[3] *= 8; + aa[5] *= 8; + + for (int i = 0; i < 25; i++) { + double w = start_w + (end_w - start_w) * (i / 40.0); + complexGaussianDist(data, base * (i + 1), w, aa[i]); + } + + + SF2Sample sample = newSimpleFFTSample(sf2, "Bass", data, base); + SF2Layer layer = newLayer(sf2, "Bass", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -3000); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -5000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 11000); + region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100); + return layer; + } + + public static SF2Layer new_synthbass(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 25; + double start_w = 0.05; + double end_w = 0.05; + double start_a = 0.2; + double end_a = 0.02; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 25.0); + + double[] aa = new double[25]; + for (int i = 0; i < 25; i++) { + aa[i] = a; + a *= a_step; + } + + aa[0] *= 16; + aa[1] *= 4; + aa[3] *= 16; + aa[5] *= 8; + + for (int i = 0; i < 25; i++) { + double w = start_w + (end_w - start_w) * (i / 40.0); + complexGaussianDist(data, base * (i + 1), w, aa[i]); + } + + + SF2Sample sample = newSimpleFFTSample(sf2, "Bass", data, base); + SF2Layer layer = newLayer(sf2, "Bass", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -12000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -3000); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, -3000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERQ, 100); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 8000); + region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100); + return layer; + } + + public static SF2Layer new_bass2(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 25; + double start_w = 0.05; + double end_w = 0.05; + double start_a = 0.2; + double end_a = 0.002; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 25.0); + + double[] aa = new double[25]; + for (int i = 0; i < 25; i++) { + aa[i] = a; + a *= a_step; + } + + aa[0] *= 8; + aa[1] *= 4; + aa[3] *= 8; + aa[5] *= 8; + + for (int i = 0; i < 25; i++) { + double w = start_w + (end_w - start_w) * (i / 40.0); + complexGaussianDist(data, base * (i + 1), w, aa[i]); + } + + + SF2Sample sample = newSimpleFFTSample(sf2, "Bass2", data, base); + SF2Layer layer = newLayer(sf2, "Bass2", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -8000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -6000); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 5000); + region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100); + return layer; + } + + public static SF2Layer new_solostring(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 25; + double start_w = 2; + double end_w = 2; + double start_a = 0.2; + double end_a = 0.01; + + double[] aa = new double[18]; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 40.0); + for (int i = 0; i < aa.length; i++) { + a *= a_step; + aa[i] = a; + } + + aa[0] *= 5; + aa[1] *= 5; + aa[2] *= 5; + aa[3] *= 4; + aa[4] *= 4; + aa[5] *= 3; + aa[6] *= 3; + aa[7] *= 2; + + for (int i = 0; i < aa.length; i++) { + double w = start_w + (end_w - start_w) * (i / 40.0); + complexGaussianDist(data, base * (i + 1), w, a); + } + SF2Sample sample = newSimpleFFTSample(sf2, "Strings", data, base); + SF2Layer layer = newLayer(sf2, "Strings", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -5000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500); + region.putInteger(SF2Region.GENERATOR_FREQVIBLFO, -1000); + region.putInteger(SF2Region.GENERATOR_VIBLFOTOPITCH, 15); + return layer; + + } + + public static SF2Layer new_orchhit(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 25; + double start_w = 2; + double end_w = 80; + double start_a = 0.2; + double end_a = 0.001; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 40.0); + for (int i = 0; i < 40; i++) { + double w = start_w + (end_w - start_w) * (i / 40.0); + complexGaussianDist(data, base * (i + 1), w, a); + a *= a_step; + } + complexGaussianDist(data, base * 4, 300, 1); + + + SF2Sample sample = newSimpleFFTSample(sf2, "Och Strings", data, base); + SF2Layer layer = newLayer(sf2, "Och Strings", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -5000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 200); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 200); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500); + return layer; + + } + + public static SF2Layer new_string2(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 25; + double start_w = 2; + double end_w = 80; + double start_a = 0.2; + double end_a = 0.001; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 40.0); + for (int i = 0; i < 40; i++) { + double w = start_w + (end_w - start_w) * (i / 40.0); + complexGaussianDist(data, base * (i + 1), w, a); + a *= a_step; + } + SF2Sample sample = newSimpleFFTSample(sf2, "Strings", data, base); + SF2Layer layer = newLayer(sf2, "Strings", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -5000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500); + return layer; + + } + + public static SF2Layer new_choir(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 25; + double start_w = 2; + double end_w = 80; + double start_a = 0.2; + double end_a = 0.001; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 40.0); + double[] aa = new double[40]; + for (int i = 0; i < aa.length; i++) { + a *= a_step; + aa[i] = a; + } + + aa[5] *= 0.1; + aa[6] *= 0.01; + aa[7] *= 0.1; + aa[8] *= 0.1; + + for (int i = 0; i < aa.length; i++) { + double w = start_w + (end_w - start_w) * (i / 40.0); + complexGaussianDist(data, base * (i + 1), w, aa[i]); + } + SF2Sample sample = newSimpleFFTSample(sf2, "Strings", data, base); + SF2Layer layer = newLayer(sf2, "Strings", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -5000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500); + return layer; + + } + + public static SF2Layer new_organ(SF2Soundbank sf2) { + Random random = new Random(102030201); + int x = 1; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 15; + double start_w = 0.01; + double end_w = 0.01; + double start_a = 0.2; + double end_a = 0.001; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 40.0); + + for (int i = 0; i < 12; i++) { + double w = start_w + (end_w - start_w) * (i / 40.0); + complexGaussianDist(data, base * (i + 1), w, + a * (0.5 + 3 * (random.nextDouble()))); + a *= a_step; + } + SF2Sample sample = newSimpleFFTSample(sf2, "Organ", data, base); + SF2Layer layer = newLayer(sf2, "Organ", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500); + return layer; + + } + + public static SF2Layer new_ch_organ(SF2Soundbank sf2) { + int x = 1; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 15; + double start_w = 0.01; + double end_w = 0.01; + double start_a = 0.2; + double end_a = 0.001; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 60.0); + + double[] aa = new double[60]; + for (int i = 0; i < aa.length; i++) { + a *= a_step; + aa[i] = a; + } + + aa[0] *= 5; + aa[1] *= 2; + aa[2] = 0; + aa[4] = 0; + aa[5] = 0; + aa[7] *= 7; + aa[9] = 0; + aa[10] = 0; + aa[12] = 0; + aa[15] *= 7; + aa[18] = 0; + aa[20] = 0; + aa[24] = 0; + aa[27] *= 5; + aa[29] = 0; + aa[30] = 0; + aa[33] = 0; + aa[36] *= 4; + aa[37] = 0; + aa[39] = 0; + aa[42] = 0; + aa[43] = 0; + aa[47] = 0; + aa[50] *= 4; + aa[52] = 0; + aa[55] = 0; + aa[57] = 0; + + + aa[10] *= 0.1; + aa[11] *= 0.1; + aa[12] *= 0.1; + aa[13] *= 0.1; + + aa[17] *= 0.1; + aa[18] *= 0.1; + aa[19] *= 0.1; + aa[20] *= 0.1; + + for (int i = 0; i < 60; i++) { + double w = start_w + (end_w - start_w) * (i / 40.0); + complexGaussianDist(data, base * (i + 1), w, aa[i]); + a *= a_step; + } + SF2Sample sample = newSimpleFFTSample(sf2, "Organ", data, base); + SF2Layer layer = newLayer(sf2, "Organ", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -10000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000); + return layer; + + } + + public static SF2Layer new_flute(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 15; + + complexGaussianDist(data, base * 1, 0.001, 0.5); + complexGaussianDist(data, base * 2, 0.001, 0.5); + complexGaussianDist(data, base * 3, 0.001, 0.5); + complexGaussianDist(data, base * 4, 0.01, 0.5); + + complexGaussianDist(data, base * 4, 100, 120); + complexGaussianDist(data, base * 6, 100, 40); + complexGaussianDist(data, base * 8, 100, 80); + + complexGaussianDist(data, base * 5, 0.001, 0.05); + complexGaussianDist(data, base * 6, 0.001, 0.06); + complexGaussianDist(data, base * 7, 0.001, 0.04); + complexGaussianDist(data, base * 8, 0.005, 0.06); + complexGaussianDist(data, base * 9, 0.005, 0.06); + complexGaussianDist(data, base * 10, 0.01, 0.1); + complexGaussianDist(data, base * 11, 0.08, 0.7); + complexGaussianDist(data, base * 12, 0.08, 0.6); + complexGaussianDist(data, base * 13, 0.08, 0.6); + complexGaussianDist(data, base * 14, 0.08, 0.6); + complexGaussianDist(data, base * 15, 0.08, 0.5); + complexGaussianDist(data, base * 16, 0.08, 0.5); + complexGaussianDist(data, base * 17, 0.08, 0.2); + + + complexGaussianDist(data, base * 1, 10, 8); + complexGaussianDist(data, base * 2, 10, 8); + complexGaussianDist(data, base * 3, 10, 8); + complexGaussianDist(data, base * 4, 10, 8); + complexGaussianDist(data, base * 5, 10, 8); + complexGaussianDist(data, base * 6, 20, 9); + complexGaussianDist(data, base * 7, 20, 9); + complexGaussianDist(data, base * 8, 20, 9); + complexGaussianDist(data, base * 9, 20, 8); + complexGaussianDist(data, base * 10, 30, 8); + complexGaussianDist(data, base * 11, 30, 9); + complexGaussianDist(data, base * 12, 30, 9); + complexGaussianDist(data, base * 13, 30, 8); + complexGaussianDist(data, base * 14, 30, 8); + complexGaussianDist(data, base * 15, 30, 7); + complexGaussianDist(data, base * 16, 30, 7); + complexGaussianDist(data, base * 17, 30, 6); + + SF2Sample sample = newSimpleFFTSample(sf2, "Flute", data, base); + SF2Layer layer = newLayer(sf2, "Flute", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500); + return layer; + + } + + public static SF2Layer new_horn(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 15; + + double start_a = 0.5; + double end_a = 0.00000000001; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 40.0); + for (int i = 0; i < 40; i++) { + if (i == 0) + complexGaussianDist(data, base * (i + 1), 0.1, a * 0.2); + else + complexGaussianDist(data, base * (i + 1), 0.1, a); + a *= a_step; + } + + complexGaussianDist(data, base * 2, 100, 1); + + + SF2Sample sample = newSimpleFFTSample(sf2, "Horn", data, base); + SF2Layer layer = newLayer(sf2, "Horn", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100); + + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -500); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, 5000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 4500); + return layer; + + } + + public static SF2Layer new_trumpet(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 15; + + double start_a = 0.5; + double end_a = 0.00001; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 80.0); + double[] aa = new double[80]; + for (int i = 0; i < 80; i++) { + aa[i] = a; + a *= a_step; + } + + aa[0] *= 0.05; + aa[1] *= 0.2; + aa[2] *= 0.5; + aa[3] *= 0.85; + + for (int i = 0; i < 80; i++) { + complexGaussianDist(data, base * (i + 1), 0.1, aa[i]); + } + + complexGaussianDist(data, base * 5, 300, 3); + + + SF2Sample sample = newSimpleFFTSample(sf2, "Trumpet", data, base); + SF2Layer layer = newLayer(sf2, "Trumpet", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -10000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 0); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100); + + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -4000); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, -2500); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, 5000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 4500); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERQ, 10); + return layer; + + } + + public static SF2Layer new_brass_section(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 15; + + double start_a = 0.5; + double end_a = 0.005; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 30.0); + double[] aa = new double[30]; + for (int i = 0; i < 30; i++) { + aa[i] = a; + a *= a_step; + } + + aa[0] *= 0.8; + aa[1] *= 0.9; + + double w = 5; + for (int i = 0; i < 30; i++) { + complexGaussianDist(data, base * (i + 1), 0.1 * w, aa[i] * w); + w += 6; //*= w_step; + } + + complexGaussianDist(data, base * 6, 300, 2); + + + SF2Sample sample = newSimpleFFTSample(sf2, "Brass Section", data, base); + SF2Layer layer = newLayer(sf2, "Brass Section", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -9200); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100); + + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -3000); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, 5000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 4500); + return layer; + + } + + public static SF2Layer new_trombone(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 15; + + double start_a = 0.5; + double end_a = 0.001; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 80.0); + double[] aa = new double[80]; + for (int i = 0; i < 80; i++) { + aa[i] = a; + a *= a_step; + } + + aa[0] *= 0.3; + aa[1] *= 0.7; + + for (int i = 0; i < 80; i++) { + complexGaussianDist(data, base * (i + 1), 0.1, aa[i]); + } + + complexGaussianDist(data, base * 6, 300, 2); + + + SF2Sample sample = newSimpleFFTSample(sf2, "Trombone", data, base); + SF2Layer layer = newLayer(sf2, "Trombone", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -8000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100); + + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -2000); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, 5000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 4500); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERQ, 10); + return layer; + + } + + public static SF2Layer new_sax(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 15; + + double start_a = 0.5; + double end_a = 0.01; + double a = start_a; + double a_step = Math.pow(end_a / start_a, 1.0 / 40.0); + for (int i = 0; i < 40; i++) { + if (i == 0 || i == 2) + complexGaussianDist(data, base * (i + 1), 0.1, a * 4); + else + complexGaussianDist(data, base * (i + 1), 0.1, a); + a *= a_step; + } + + complexGaussianDist(data, base * 4, 200, 1); + + SF2Sample sample = newSimpleFFTSample(sf2, "Sax", data, base); + SF2Layer layer = newLayer(sf2, "Sax", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100); + + region.putInteger(SF2Region.GENERATOR_ATTACKMODENV, -3000); + region.putInteger(SF2Region.GENERATOR_RELEASEMODENV, 12000); + region.putInteger(SF2Region.GENERATOR_MODENVTOFILTERFC, 5000); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 4500); + return layer; + + } + + public static SF2Layer new_oboe(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 15; + + complexGaussianDist(data, base * 5, 100, 80); + + + complexGaussianDist(data, base * 1, 0.01, 0.53); + complexGaussianDist(data, base * 2, 0.01, 0.51); + complexGaussianDist(data, base * 3, 0.01, 0.48); + complexGaussianDist(data, base * 4, 0.01, 0.49); + complexGaussianDist(data, base * 5, 0.01, 5); + complexGaussianDist(data, base * 6, 0.01, 0.51); + complexGaussianDist(data, base * 7, 0.01, 0.50); + complexGaussianDist(data, base * 8, 0.01, 0.59); + complexGaussianDist(data, base * 9, 0.01, 0.61); + complexGaussianDist(data, base * 10, 0.01, 0.52); + complexGaussianDist(data, base * 11, 0.01, 0.49); + complexGaussianDist(data, base * 12, 0.01, 0.51); + complexGaussianDist(data, base * 13, 0.01, 0.48); + complexGaussianDist(data, base * 14, 0.01, 0.51); + complexGaussianDist(data, base * 15, 0.01, 0.46); + complexGaussianDist(data, base * 16, 0.01, 0.35); + complexGaussianDist(data, base * 17, 0.01, 0.20); + complexGaussianDist(data, base * 18, 0.01, 0.10); + complexGaussianDist(data, base * 19, 0.01, 0.5); + complexGaussianDist(data, base * 20, 0.01, 0.1); + + + SF2Sample sample = newSimpleFFTSample(sf2, "Oboe", data, base); + SF2Layer layer = newLayer(sf2, "Oboe", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500); + return layer; + + } + + public static SF2Layer new_bassoon(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 15; + + complexGaussianDist(data, base * 2, 100, 40); + complexGaussianDist(data, base * 4, 100, 20); + + complexGaussianDist(data, base * 1, 0.01, 0.53); + complexGaussianDist(data, base * 2, 0.01, 5); + complexGaussianDist(data, base * 3, 0.01, 0.51); + complexGaussianDist(data, base * 4, 0.01, 0.48); + complexGaussianDist(data, base * 5, 0.01, 1.49); + complexGaussianDist(data, base * 6, 0.01, 0.51); + complexGaussianDist(data, base * 7, 0.01, 0.50); + complexGaussianDist(data, base * 8, 0.01, 0.59); + complexGaussianDist(data, base * 9, 0.01, 0.61); + complexGaussianDist(data, base * 10, 0.01, 0.52); + complexGaussianDist(data, base * 11, 0.01, 0.49); + complexGaussianDist(data, base * 12, 0.01, 0.51); + complexGaussianDist(data, base * 13, 0.01, 0.48); + complexGaussianDist(data, base * 14, 0.01, 0.51); + complexGaussianDist(data, base * 15, 0.01, 0.46); + complexGaussianDist(data, base * 16, 0.01, 0.35); + complexGaussianDist(data, base * 17, 0.01, 0.20); + complexGaussianDist(data, base * 18, 0.01, 0.10); + complexGaussianDist(data, base * 19, 0.01, 0.5); + complexGaussianDist(data, base * 20, 0.01, 0.1); + + + SF2Sample sample = newSimpleFFTSample(sf2, "Flute", data, base); + SF2Layer layer = newLayer(sf2, "Flute", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500); + return layer; + + } + + public static SF2Layer new_clarinet(SF2Soundbank sf2) { + int x = 8; + int fftsize = 4096 * x; + double[] data = new double[fftsize * 2]; + double base = x * 15; + + complexGaussianDist(data, base * 1, 0.001, 0.5); + complexGaussianDist(data, base * 2, 0.001, 0.02); + complexGaussianDist(data, base * 3, 0.001, 0.2); + complexGaussianDist(data, base * 4, 0.01, 0.1); + + complexGaussianDist(data, base * 4, 100, 60); + complexGaussianDist(data, base * 6, 100, 20); + complexGaussianDist(data, base * 8, 100, 20); + + complexGaussianDist(data, base * 5, 0.001, 0.1); + complexGaussianDist(data, base * 6, 0.001, 0.09); + complexGaussianDist(data, base * 7, 0.001, 0.02); + complexGaussianDist(data, base * 8, 0.005, 0.16); + complexGaussianDist(data, base * 9, 0.005, 0.96); + complexGaussianDist(data, base * 10, 0.01, 0.9); + complexGaussianDist(data, base * 11, 0.08, 1.2); + complexGaussianDist(data, base * 12, 0.08, 1.8); + complexGaussianDist(data, base * 13, 0.08, 1.6); + complexGaussianDist(data, base * 14, 0.08, 1.2); + complexGaussianDist(data, base * 15, 0.08, 0.9); + complexGaussianDist(data, base * 16, 0.08, 0.5); + complexGaussianDist(data, base * 17, 0.08, 0.2); + + + complexGaussianDist(data, base * 1, 10, 8); + complexGaussianDist(data, base * 2, 10, 8); + complexGaussianDist(data, base * 3, 10, 8); + complexGaussianDist(data, base * 4, 10, 8); + complexGaussianDist(data, base * 5, 10, 8); + complexGaussianDist(data, base * 6, 20, 9); + complexGaussianDist(data, base * 7, 20, 9); + complexGaussianDist(data, base * 8, 20, 9); + complexGaussianDist(data, base * 9, 20, 8); + complexGaussianDist(data, base * 10, 30, 8); + complexGaussianDist(data, base * 11, 30, 9); + complexGaussianDist(data, base * 12, 30, 9); + complexGaussianDist(data, base * 13, 30, 8); + complexGaussianDist(data, base * 14, 30, 8); + complexGaussianDist(data, base * 15, 30, 7); + complexGaussianDist(data, base * 16, 30, 7); + complexGaussianDist(data, base * 17, 30, 6); + + SF2Sample sample = newSimpleFFTSample(sf2, "Clarinet", data, base); + SF2Layer layer = newLayer(sf2, "Clarinet", sample); + SF2Region region = layer.getRegions().get(0); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -6000); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 4000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, -100); + region.putInteger(SF2Region.GENERATOR_INITIALFILTERFC, 9500); + return layer; + + } + + public static SF2Layer new_timpani(SF2Soundbank sf2) { + + double datab[]; + double datah[]; + + // Make Bass Part + { + int fftlen = 4096 * 8; + double[] data = new double[2 * fftlen]; + double base = 48; + complexGaussianDist(data, base * 2, 0.2, 1); + complexGaussianDist(data, base * 3, 0.2, 0.7); + complexGaussianDist(data, base * 5, 10, 1); + complexGaussianDist(data, base * 6, 9, 1); + complexGaussianDist(data, base * 8, 15, 1); + complexGaussianDist(data, base * 9, 18, 0.8); + complexGaussianDist(data, base * 11, 21, 0.5); + complexGaussianDist(data, base * 13, 28, 0.3); + complexGaussianDist(data, base * 14, 22, 0.1); + randomPhase(data, new Random(3049912)); + ifft(data); + normalize(data, 0.5); + data = realPart(data); + + double d_len = data.length; + for (int i = 0; i < data.length; i++) { + double g = (1.0 - (i / d_len)); + data[i] *= g * g; + } + fadeUp(data, 40); + datab = data; + } + + // Make treble part + { + int fftlen = 4096 * 4; + double[] data = new double[2 * fftlen]; + Random random = new Random(3049912); + for (int i = 0; i < data.length; i += 2) { + data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1; + } + fft(data); + // Remove all negative frequency + for (int i = fftlen / 2; i < data.length; i++) + data[i] = 0; + for (int i = 1024 * 4; i < 2048 * 4; i++) + data[i] = 1.0 - (i - 4096) / 4096.0; + for (int i = 0; i < 300; i++) { + double g = (1.0 - (i / 300.0)); + data[i] *= 1.0 + 20 * g * g; + } + for (int i = 0; i < 24; i++) + data[i] = 0; + randomPhase(data, new Random(3049912)); + ifft(data); + normalize(data, 0.9); + data = realPart(data); + double gain = 1.0; + for (int i = 0; i < data.length; i++) { + data[i] *= gain; + gain *= 0.9998; + } + datah = data; + } + + for (int i = 0; i < datah.length; i++) + datab[i] += datah[i] * 0.02; + + normalize(datab, 0.9); + + SF2Sample sample = newSimpleDrumSample(sf2, "Timpani", datab); + + SF2Layer layer = new SF2Layer(sf2); + layer.setName("Timpani"); + + SF2GlobalRegion global = new SF2GlobalRegion(); + layer.setGlobalZone(global); + sf2.addResource(layer); + + SF2LayerRegion region = new SF2LayerRegion(); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000); + region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100); + region.setSample(sample); + layer.getRegions().add(region); + + return layer; + } + + public static SF2Layer new_melodic_toms(SF2Soundbank sf2) { + + double datab[]; + double datah[]; + + // Make Bass Part + { + int fftlen = 4096 * 4; + double[] data = new double[2 * fftlen]; + complexGaussianDist(data, 30, 0.5, 1); + randomPhase(data, new Random(3049912)); + ifft(data); + normalize(data, 0.8); + data = realPart(data); + + double d_len = data.length; + for (int i = 0; i < data.length; i++) + data[i] *= (1.0 - (i / d_len)); + datab = data; + } + + // Make treble part + { + int fftlen = 4096 * 4; + double[] data = new double[2 * fftlen]; + Random random = new Random(3049912); + for (int i = 0; i < data.length; i += 2) + data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1; + fft(data); + // Remove all negative frequency + for (int i = fftlen / 2; i < data.length; i++) + data[i] = 0; + for (int i = 1024 * 4; i < 2048 * 4; i++) + data[i] = 1.0 - (i - 4096) / 4096.0; + for (int i = 0; i < 200; i++) { + double g = (1.0 - (i / 200.0)); + data[i] *= 1.0 + 20 * g * g; + } + for (int i = 0; i < 30; i++) + data[i] = 0; + randomPhase(data, new Random(3049912)); + ifft(data); + normalize(data, 0.9); + data = realPart(data); + double gain = 1.0; + for (int i = 0; i < data.length; i++) { + data[i] *= gain; + gain *= 0.9996; + } + datah = data; + } + + for (int i = 0; i < datah.length; i++) + datab[i] += datah[i] * 0.5; + for (int i = 0; i < 5; i++) + datab[i] *= i / 5.0; + + normalize(datab, 0.99); + + SF2Sample sample = newSimpleDrumSample(sf2, "Melodic Toms", datab); + sample.setOriginalPitch(63); + + SF2Layer layer = new SF2Layer(sf2); + layer.setName("Melodic Toms"); + + SF2GlobalRegion global = new SF2GlobalRegion(); + layer.setGlobalZone(global); + sf2.addResource(layer); + + SF2LayerRegion region = new SF2LayerRegion(); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000); + //region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0); + region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100); + region.setSample(sample); + layer.getRegions().add(region); + + return layer; + } + + public static SF2Layer new_reverse_cymbal(SF2Soundbank sf2) { + double datah[]; + { + int fftlen = 4096 * 4; + double[] data = new double[2 * fftlen]; + Random random = new Random(3049912); + for (int i = 0; i < data.length; i += 2) + data[i] = (2.0 * (random.nextDouble() - 0.5)); + for (int i = fftlen / 2; i < data.length; i++) + data[i] = 0; + for (int i = 0; i < 100; i++) + data[i] = 0; + + for (int i = 0; i < 512 * 2; i++) { + double gain = (i / (512.0 * 2.0)); + data[i] = 1 - gain; + } + datah = data; + } + + SF2Sample sample = newSimpleFFTSample(sf2, "Reverse Cymbal", + datah, 100, 20); + + SF2Layer layer = new SF2Layer(sf2); + layer.setName("Reverse Cymbal"); + + SF2GlobalRegion global = new SF2GlobalRegion(); + layer.setGlobalZone(global); + sf2.addResource(layer); + + SF2LayerRegion region = new SF2LayerRegion(); + region.putInteger(SF2Region.GENERATOR_ATTACKVOLENV, -200); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, -12000); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, -1000); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + region.setSample(sample); + layer.getRegions().add(region); + + return layer; + } + + public static SF2Layer new_snare_drum(SF2Soundbank sf2) { + + double datab[]; + double datah[]; + + // Make Bass Part + { + int fftlen = 4096 * 4; + double[] data = new double[2 * fftlen]; + complexGaussianDist(data, 24, 0.5, 1); + randomPhase(data, new Random(3049912)); + ifft(data); + normalize(data, 0.5); + data = realPart(data); + + double d_len = data.length; + for (int i = 0; i < data.length; i++) + data[i] *= (1.0 - (i / d_len)); + datab = data; + } + + // Make treble part + { + int fftlen = 4096 * 4; + double[] data = new double[2 * fftlen]; + Random random = new Random(3049912); + for (int i = 0; i < data.length; i += 2) + data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1; + fft(data); + // Remove all negative frequency + for (int i = fftlen / 2; i < data.length; i++) + data[i] = 0; + for (int i = 1024 * 4; i < 2048 * 4; i++) + data[i] = 1.0 - (i - 4096) / 4096.0; + for (int i = 0; i < 300; i++) { + double g = (1.0 - (i / 300.0)); + data[i] *= 1.0 + 20 * g * g; + } + for (int i = 0; i < 24; i++) + data[i] = 0; + randomPhase(data, new Random(3049912)); + ifft(data); + normalize(data, 0.9); + data = realPart(data); + double gain = 1.0; + for (int i = 0; i < data.length; i++) { + data[i] *= gain; + gain *= 0.9998; + } + datah = data; + } + + for (int i = 0; i < datah.length; i++) + datab[i] += datah[i]; + for (int i = 0; i < 5; i++) + datab[i] *= i / 5.0; + + SF2Sample sample = newSimpleDrumSample(sf2, "Snare Drum", datab); + + SF2Layer layer = new SF2Layer(sf2); + layer.setName("Snare Drum"); + + SF2GlobalRegion global = new SF2GlobalRegion(); + layer.setGlobalZone(global); + sf2.addResource(layer); + + SF2LayerRegion region = new SF2LayerRegion(); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000); + region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0); + region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100); + region.setSample(sample); + layer.getRegions().add(region); + + return layer; + } + + public static SF2Layer new_bass_drum(SF2Soundbank sf2) { + + double datab[]; + double datah[]; + + // Make Bass Part + { + int fftlen = 4096 * 4; + double[] data = new double[2 * fftlen]; + complexGaussianDist(data, 1.8 * 5 + 1, 2, 1); + complexGaussianDist(data, 1.8 * 9 + 1, 2, 1); + randomPhase(data, new Random(3049912)); + ifft(data); + normalize(data, 0.9); + data = realPart(data); + double d_len = data.length; + for (int i = 0; i < data.length; i++) + data[i] *= (1.0 - (i / d_len)); + datab = data; + } + + // Make treble part + { + int fftlen = 4096; + double[] data = new double[2 * fftlen]; + Random random = new Random(3049912); + for (int i = 0; i < data.length; i += 2) + data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1; + fft(data); + // Remove all negative frequency + for (int i = fftlen / 2; i < data.length; i++) + data[i] = 0; + for (int i = 1024; i < 2048; i++) + data[i] = 1.0 - (i - 1024) / 1024.0; + for (int i = 0; i < 512; i++) + data[i] = 10 * i / 512.0; + for (int i = 0; i < 10; i++) + data[i] = 0; + randomPhase(data, new Random(3049912)); + ifft(data); + normalize(data, 0.9); + data = realPart(data); + double gain = 1.0; + for (int i = 0; i < data.length; i++) { + data[i] *= gain; + gain *= 0.999; + } + datah = data; + } + + for (int i = 0; i < datah.length; i++) + datab[i] += datah[i] * 0.5; + for (int i = 0; i < 5; i++) + datab[i] *= i / 5.0; + + SF2Sample sample = newSimpleDrumSample(sf2, "Bass Drum", datab); + + SF2Layer layer = new SF2Layer(sf2); + layer.setName("Bass Drum"); + + SF2GlobalRegion global = new SF2GlobalRegion(); + layer.setGlobalZone(global); + sf2.addResource(layer); + + SF2LayerRegion region = new SF2LayerRegion(); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000); + region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0); + region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100); + region.setSample(sample); + layer.getRegions().add(region); + + return layer; + } + + public static SF2Layer new_tom(SF2Soundbank sf2) { + + double datab[]; + double datah[]; + + // Make Bass Part + { + int fftlen = 4096 * 4; + double[] data = new double[2 * fftlen]; + complexGaussianDist(data, 30, 0.5, 1); + randomPhase(data, new Random(3049912)); + ifft(data); + normalize(data, 0.8); + data = realPart(data); + + double d_len = data.length; + for (int i = 0; i < data.length; i++) + data[i] *= (1.0 - (i / d_len)); + datab = data; + } + + // Make treble part + { + int fftlen = 4096 * 4; + double[] data = new double[2 * fftlen]; + Random random = new Random(3049912); + for (int i = 0; i < data.length; i += 2) + data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1; + fft(data); + // Remove all negative frequency + for (int i = fftlen / 2; i < data.length; i++) + data[i] = 0; + for (int i = 1024 * 4; i < 2048 * 4; i++) + data[i] = 1.0 - (i - 4096) / 4096.0; + for (int i = 0; i < 200; i++) { + double g = (1.0 - (i / 200.0)); + data[i] *= 1.0 + 20 * g * g; + } + for (int i = 0; i < 30; i++) + data[i] = 0; + randomPhase(data, new Random(3049912)); + ifft(data); + normalize(data, 0.9); + data = realPart(data); + double gain = 1.0; + for (int i = 0; i < data.length; i++) { + data[i] *= gain; + gain *= 0.9996; + } + datah = data; + } + + for (int i = 0; i < datah.length; i++) + datab[i] += datah[i] * 0.5; + for (int i = 0; i < 5; i++) + datab[i] *= i / 5.0; + + normalize(datab, 0.99); + + SF2Sample sample = newSimpleDrumSample(sf2, "Tom", datab); + sample.setOriginalPitch(50); + + SF2Layer layer = new SF2Layer(sf2); + layer.setName("Tom"); + + SF2GlobalRegion global = new SF2GlobalRegion(); + layer.setGlobalZone(global); + sf2.addResource(layer); + + SF2LayerRegion region = new SF2LayerRegion(); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000); + //region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0); + region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -100); + region.setSample(sample); + layer.getRegions().add(region); + + return layer; + } + + public static SF2Layer new_closed_hihat(SF2Soundbank sf2) { + double datah[]; + + // Make treble part + { + int fftlen = 4096 * 4; + double[] data = new double[2 * fftlen]; + Random random = new Random(3049912); + for (int i = 0; i < data.length; i += 2) + data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1; + fft(data); + // Remove all negative frequency + for (int i = fftlen / 2; i < data.length; i++) + data[i] = 0; + for (int i = 1024 * 4; i < 2048 * 4; i++) + data[i] = 1.0 - (i - 4096) / 4096.0; + for (int i = 0; i < 2048; i++) + data[i] = 0.2 + 0.8 * (i / 2048.0); + randomPhase(data, new Random(3049912)); + ifft(data); + normalize(data, 0.9); + data = realPart(data); + double gain = 1.0; + for (int i = 0; i < data.length; i++) { + data[i] *= gain; + gain *= 0.9996; + } + datah = data; + } + + for (int i = 0; i < 5; i++) + datah[i] *= i / 5.0; + SF2Sample sample = newSimpleDrumSample(sf2, "Closed Hi-Hat", datah); + + SF2Layer layer = new SF2Layer(sf2); + layer.setName("Closed Hi-Hat"); + + SF2GlobalRegion global = new SF2GlobalRegion(); + layer.setGlobalZone(global); + sf2.addResource(layer); + + SF2LayerRegion region = new SF2LayerRegion(); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000); + region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0); + region.putInteger(SF2Region.GENERATOR_EXCLUSIVECLASS, 1); + region.setSample(sample); + layer.getRegions().add(region); + + return layer; + } + + public static SF2Layer new_open_hihat(SF2Soundbank sf2) { + double datah[]; + { + int fftlen = 4096 * 4; + double[] data = new double[2 * fftlen]; + Random random = new Random(3049912); + for (int i = 0; i < data.length; i += 2) + data[i] = (2.0 * (random.nextDouble() - 0.5)); + for (int i = fftlen / 2; i < data.length; i++) + data[i] = 0; + for (int i = 0; i < 200; i++) + data[i] = 0; + for (int i = 0; i < 2048 * 4; i++) { + double gain = (i / (2048.0 * 4.0)); + data[i] = gain; + } + datah = data; + } + + SF2Sample sample = newSimpleFFTSample(sf2, "Open Hi-Hat", datah, 1000, 5); + + SF2Layer layer = new SF2Layer(sf2); + layer.setName("Open Hi-Hat"); + + SF2GlobalRegion global = new SF2GlobalRegion(); + layer.setGlobalZone(global); + sf2.addResource(layer); + + SF2LayerRegion region = new SF2LayerRegion(); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 1500); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1500); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0); + region.putInteger(SF2Region.GENERATOR_EXCLUSIVECLASS, 1); + region.setSample(sample); + layer.getRegions().add(region); + + return layer; + } + + public static SF2Layer new_crash_cymbal(SF2Soundbank sf2) { + double datah[]; + { + int fftlen = 4096 * 4; + double[] data = new double[2 * fftlen]; + Random random = new Random(3049912); + for (int i = 0; i < data.length; i += 2) + data[i] = (2.0 * (random.nextDouble() - 0.5)); + for (int i = fftlen / 2; i < data.length; i++) + data[i] = 0; + for (int i = 0; i < 100; i++) + data[i] = 0; + for (int i = 0; i < 512 * 2; i++) { + double gain = (i / (512.0 * 2.0)); + data[i] = gain; + } + datah = data; + } + + SF2Sample sample = newSimpleFFTSample(sf2, "Crash Cymbal", datah, 1000, 5); + + SF2Layer layer = new SF2Layer(sf2); + layer.setName("Crash Cymbal"); + + SF2GlobalRegion global = new SF2GlobalRegion(); + layer.setGlobalZone(global); + sf2.addResource(layer); + + SF2LayerRegion region = new SF2LayerRegion(); + region.putInteger(SF2Region.GENERATOR_DECAYVOLENV, 1800); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 1800); + region.putInteger(SF2Region.GENERATOR_SUSTAINVOLENV, 1000); + region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0); + region.setSample(sample); + layer.getRegions().add(region); + + return layer; + } + + public static SF2Layer new_side_stick(SF2Soundbank sf2) { + double datab[]; + + // Make treble part + { + int fftlen = 4096 * 4; + double[] data = new double[2 * fftlen]; + Random random = new Random(3049912); + for (int i = 0; i < data.length; i += 2) + data[i] = (2.0 * (random.nextDouble() - 0.5)) * 0.1; + fft(data); + // Remove all negative frequency + for (int i = fftlen / 2; i < data.length; i++) + data[i] = 0; + for (int i = 1024 * 4; i < 2048 * 4; i++) + data[i] = 1.0 - (i - 4096) / 4096.0; + for (int i = 0; i < 200; i++) { + double g = (1.0 - (i / 200.0)); + data[i] *= 1.0 + 20 * g * g; + } + for (int i = 0; i < 30; i++) + data[i] = 0; + randomPhase(data, new Random(3049912)); + ifft(data); + normalize(data, 0.9); + data = realPart(data); + double gain = 1.0; + for (int i = 0; i < data.length; i++) { + data[i] *= gain; + gain *= 0.9996; + } + datab = data; + } + + for (int i = 0; i < 10; i++) + datab[i] *= i / 10.0; + + SF2Sample sample = newSimpleDrumSample(sf2, "Side Stick", datab); + + SF2Layer layer = new SF2Layer(sf2); + layer.setName("Side Stick"); + + SF2GlobalRegion global = new SF2GlobalRegion(); + layer.setGlobalZone(global); + sf2.addResource(layer); + + SF2LayerRegion region = new SF2LayerRegion(); + region.putInteger(SF2Region.GENERATOR_RELEASEVOLENV, 12000); + region.putInteger(SF2Region.GENERATOR_SCALETUNING, 0); + region.putInteger(SF2Region.GENERATOR_INITIALATTENUATION, -50); + region.setSample(sample); + layer.getRegions().add(region); + + return layer; + + } + + public static SF2Sample newSimpleFFTSample(SF2Soundbank sf2, String name, + double[] data, double base) { + return newSimpleFFTSample(sf2, name, data, base, 10); + } + + public static SF2Sample newSimpleFFTSample(SF2Soundbank sf2, String name, + double[] data, double base, int fadeuptime) { + + int fftsize = data.length / 2; + AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + double basefreq = (base / fftsize) * format.getSampleRate() * 0.5; + + randomPhase(data); + ifft(data); + data = realPart(data); + normalize(data, 0.9); + float[] fdata = toFloat(data); + fdata = loopExtend(fdata, fdata.length + 512); + fadeUp(fdata, fadeuptime); + byte[] bdata = toBytes(fdata, format); + + /* + * Create SoundFont2 sample. + */ + SF2Sample sample = new SF2Sample(sf2); + sample.setName(name); + sample.setData(bdata); + sample.setStartLoop(256); + sample.setEndLoop(fftsize + 256); + sample.setSampleRate((long) format.getSampleRate()); + double orgnote = (69 + 12) + + (12 * Math.log(basefreq / 440.0) / Math.log(2)); + sample.setOriginalPitch((int) orgnote); + sample.setPitchCorrection((byte) (-(orgnote - (int) orgnote) * 100.0)); + sf2.addResource(sample); + + return sample; + } + + public static SF2Sample newSimpleFFTSample_dist(SF2Soundbank sf2, + String name, double[] data, double base, double preamp) { + + int fftsize = data.length / 2; + AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + double basefreq = (base / fftsize) * format.getSampleRate() * 0.5; + + randomPhase(data); + ifft(data); + data = realPart(data); + + for (int i = 0; i < data.length; i++) { + data[i] = (1 - Math.exp(-Math.abs(data[i] * preamp))) + * Math.signum(data[i]); + } + + normalize(data, 0.9); + float[] fdata = toFloat(data); + fdata = loopExtend(fdata, fdata.length + 512); + fadeUp(fdata, 80); + byte[] bdata = toBytes(fdata, format); + + /* + * Create SoundFont2 sample. + */ + SF2Sample sample = new SF2Sample(sf2); + sample.setName(name); + sample.setData(bdata); + sample.setStartLoop(256); + sample.setEndLoop(fftsize + 256); + sample.setSampleRate((long) format.getSampleRate()); + double orgnote = (69 + 12) + + (12 * Math.log(basefreq / 440.0) / Math.log(2)); + sample.setOriginalPitch((int) orgnote); + sample.setPitchCorrection((byte) (-(orgnote - (int) orgnote) * 100.0)); + sf2.addResource(sample); + + return sample; + } + + public static SF2Sample newSimpleDrumSample(SF2Soundbank sf2, String name, + double[] data) { + + int fftsize = data.length; + AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + byte[] bdata = toBytes(toFloat(realPart(data)), format); + + /* + * Create SoundFont2 sample. + */ + SF2Sample sample = new SF2Sample(sf2); + sample.setName(name); + sample.setData(bdata); + sample.setStartLoop(256); + sample.setEndLoop(fftsize + 256); + sample.setSampleRate((long) format.getSampleRate()); + sample.setOriginalPitch(60); + sf2.addResource(sample); + + return sample; + } + + public static SF2Layer newLayer(SF2Soundbank sf2, String name, SF2Sample sample) { + SF2LayerRegion region = new SF2LayerRegion(); + region.setSample(sample); + + SF2Layer layer = new SF2Layer(sf2); + layer.setName(name); + layer.getRegions().add(region); + sf2.addResource(layer); + + return layer; + } + + public static SF2Instrument newInstrument(SF2Soundbank sf2, String name, + Patch patch, SF2Layer... layers) { + + /* + * Create SoundFont2 instrument. + */ + SF2Instrument ins = new SF2Instrument(sf2); + ins.setPatch(patch); + ins.setName(name); + sf2.addInstrument(ins); + + /* + * Create region for instrument. + */ + for (int i = 0; i < layers.length; i++) { + SF2InstrumentRegion insregion = new SF2InstrumentRegion(); + insregion.setLayer(layers[i]); + ins.getRegions().add(insregion); + } + + return ins; + } + + static public void ifft(double[] data) { + new FFT(data.length / 2, 1).transform(data); + } + + static public void fft(double[] data) { + new FFT(data.length / 2, -1).transform(data); + } + + public static void complexGaussianDist(double[] cdata, double m, + double s, double v) { + for (int x = 0; x < cdata.length / 4; x++) { + cdata[x * 2] += v * (1.0 / (s * Math.sqrt(2 * Math.PI)) + * Math.exp((-1.0 / 2.0) * Math.pow((x - m) / s, 2.0))); + } + } + + static public void randomPhase(double[] data) { + for (int i = 0; i < data.length; i += 2) { + double phase = Math.random() * 2 * Math.PI; + double d = data[i]; + data[i] = Math.sin(phase) * d; + data[i + 1] = Math.cos(phase) * d; + } + } + + static public void randomPhase(double[] data, Random random) { + for (int i = 0; i < data.length; i += 2) { + double phase = random.nextDouble() * 2 * Math.PI; + double d = data[i]; + data[i] = Math.sin(phase) * d; + data[i + 1] = Math.cos(phase) * d; + } + } + + static public void normalize(double[] data, double target) { + double maxvalue = 0; + for (int i = 0; i < data.length; i++) { + if (data[i] > maxvalue) + maxvalue = data[i]; + if (-data[i] > maxvalue) + maxvalue = -data[i]; + } + if (maxvalue == 0) + return; + double gain = target / maxvalue; + for (int i = 0; i < data.length; i++) + data[i] *= gain; + } + + static public void normalize(float[] data, double target) { + double maxvalue = 0.5; + for (int i = 0; i < data.length; i++) { + if (data[i * 2] > maxvalue) + maxvalue = data[i * 2]; + if (-data[i * 2] > maxvalue) + maxvalue = -data[i * 2]; + } + double gain = target / maxvalue; + for (int i = 0; i < data.length; i++) + data[i * 2] *= gain; + } + + static public double[] realPart(double[] in) { + double[] out = new double[in.length / 2]; + for (int i = 0; i < out.length; i++) { + out[i] = in[i * 2]; + } + return out; + } + + static public double[] imgPart(double[] in) { + double[] out = new double[in.length / 2]; + for (int i = 0; i < out.length; i++) { + out[i] = in[i * 2]; + } + return out; + } + + static public float[] toFloat(double[] in) { + float[] out = new float[in.length]; + for (int i = 0; i < out.length; i++) { + out[i] = (float) in[i]; + } + return out; + } + + static public byte[] toBytes(float[] in, AudioFormat format) { + byte[] out = new byte[in.length * format.getFrameSize()]; + return AudioFloatConverter.getConverter(format).toByteArray(in, out); + } + + static public void fadeUp(double[] data, int samples) { + double dsamples = samples; + for (int i = 0; i < samples; i++) + data[i] *= i / dsamples; + } + + static public void fadeUp(float[] data, int samples) { + double dsamples = samples; + for (int i = 0; i < samples; i++) + data[i] *= i / dsamples; + } + + static public double[] loopExtend(double[] data, int newsize) { + double[] outdata = new double[newsize]; + int p_len = data.length; + int p_ps = 0; + for (int i = 0; i < outdata.length; i++) { + outdata[i] = data[p_ps]; + p_ps++; + if (p_ps == p_len) + p_ps = 0; + } + return outdata; + } + + static public float[] loopExtend(float[] data, int newsize) { + float[] outdata = new float[newsize]; + int p_len = data.length; + int p_ps = 0; + for (int i = 0; i < outdata.length; i++) { + outdata[i] = data[p_ps]; + p_ps++; + if (p_ps == p_len) + p_ps = 0; + } + return outdata; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/FFT.java b/jdk/src/share/classes/com/sun/media/sound/FFT.java new file mode 100644 index 00000000000..2e297e127d7 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/FFT.java @@ -0,0 +1,748 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * Fast Fourier Transformer. + * + * @author Karl Helgason + */ +public final class FFT { + + private double[] w; + private int fftFrameSize; + private int sign; + private int[] bitm_array; + private int fftFrameSize2; + + // Sign = -1 is FFT, 1 is IFFT (inverse FFT) + // Data = Interlaced double array to be transformed. + // The order is: real (sin), complex (cos) + // Framesize must be power of 2 + public FFT(int fftFrameSize, int sign) { + w = computeTwiddleFactors(fftFrameSize, sign); + + this.fftFrameSize = fftFrameSize; + this.sign = sign; + fftFrameSize2 = fftFrameSize << 1; + + // Pre-process Bit-Reversal + bitm_array = new int[fftFrameSize2]; + for (int i = 2; i < fftFrameSize2; i += 2) { + int j; + int bitm; + for (bitm = 2, j = 0; bitm < fftFrameSize2; bitm <<= 1) { + if ((i & bitm) != 0) + j++; + j <<= 1; + } + bitm_array[i] = j; + } + + } + + public void transform(double[] data) { + bitreversal(data); + calc(fftFrameSize, data, sign, w); + } + + private final static double[] computeTwiddleFactors(int fftFrameSize, + int sign) { + + int imax = (int) (Math.log(fftFrameSize) / Math.log(2.)); + + double[] warray = new double[(fftFrameSize - 1) * 4]; + int w_index = 0; + + for (int i = 0, nstep = 2; i < imax; i++) { + int jmax = nstep; + nstep <<= 1; + + double wr = 1.0; + double wi = 0.0; + + double arg = Math.PI / (jmax >> 1); + double wfr = Math.cos(arg); + double wfi = sign * Math.sin(arg); + + for (int j = 0; j < jmax; j += 2) { + warray[w_index++] = wr; + warray[w_index++] = wi; + + double tempr = wr; + wr = tempr * wfr - wi * wfi; + wi = tempr * wfi + wi * wfr; + } + } + + // PRECOMPUTATION of wwr1, wwi1 for factor 4 Decomposition (3 * complex + // operators and 8 +/- complex operators) + { + w_index = 0; + int w_index2 = warray.length >> 1; + for (int i = 0, nstep = 2; i < (imax - 1); i++) { + int jmax = nstep; + nstep *= 2; + + int ii = w_index + jmax; + for (int j = 0; j < jmax; j += 2) { + double wr = warray[w_index++]; + double wi = warray[w_index++]; + double wr1 = warray[ii++]; + double wi1 = warray[ii++]; + warray[w_index2++] = wr * wr1 - wi * wi1; + warray[w_index2++] = wr * wi1 + wi * wr1; + } + } + + } + + return warray; + } + + private final static void calc(int fftFrameSize, double[] data, int sign, + double[] w) { + + final int fftFrameSize2 = fftFrameSize << 1; + + int nstep = 2; + + if (nstep >= fftFrameSize2) + return; + int i = nstep - 2; + if (sign == -1) + calcF4F(fftFrameSize, data, i, nstep, w); + else + calcF4I(fftFrameSize, data, i, nstep, w); + + } + + private final static void calcF2E(int fftFrameSize, double[] data, int i, + int nstep, double[] w) { + int jmax = nstep; + for (int n = 0; n < jmax; n += 2) { + double wr = w[i++]; + double wi = w[i++]; + int m = n + jmax; + double datam_r = data[m]; + double datam_i = data[m + 1]; + double datan_r = data[n]; + double datan_i = data[n + 1]; + double tempr = datam_r * wr - datam_i * wi; + double tempi = datam_r * wi + datam_i * wr; + data[m] = datan_r - tempr; + data[m + 1] = datan_i - tempi; + data[n] = datan_r + tempr; + data[n + 1] = datan_i + tempi; + } + return; + + } + + // Perform Factor-4 Decomposition with 3 * complex operators and 8 +/- + // complex operators + private final static void calcF4F(int fftFrameSize, double[] data, int i, + int nstep, double[] w) { + final int fftFrameSize2 = fftFrameSize << 1; // 2*fftFrameSize; + // Factor-4 Decomposition + + int w_len = w.length >> 1; + while (nstep < fftFrameSize2) { + + if (nstep << 2 == fftFrameSize2) { + // Goto Factor-4 Final Decomposition + // calcF4E(data, i, nstep, -1, w); + calcF4FE(fftFrameSize, data, i, nstep, w); + return; + } + int jmax = nstep; + int nnstep = nstep << 1; + if (nnstep == fftFrameSize2) { + // Factor-4 Decomposition not possible + calcF2E(fftFrameSize, data, i, nstep, w); + return; + } + nstep <<= 2; + int ii = i + jmax; + int iii = i + w_len; + + { + i += 2; + ii += 2; + iii += 2; + + for (int n = 0; n < fftFrameSize2; n += nstep) { + int m = n + jmax; + + double datam1_r = data[m]; + double datam1_i = data[m + 1]; + double datan1_r = data[n]; + double datan1_i = data[n + 1]; + + n += nnstep; + m += nnstep; + double datam2_r = data[m]; + double datam2_i = data[m + 1]; + double datan2_r = data[n]; + double datan2_i = data[n + 1]; + + double tempr = datam1_r; + double tempi = datam1_i; + + datam1_r = datan1_r - tempr; + datam1_i = datan1_i - tempi; + datan1_r = datan1_r + tempr; + datan1_i = datan1_i + tempi; + + double n2w1r = datan2_r; + double n2w1i = datan2_i; + double m2ww1r = datam2_r; + double m2ww1i = datam2_i; + + tempr = m2ww1r - n2w1r; + tempi = m2ww1i - n2w1i; + + datam2_r = datam1_r + tempi; + datam2_i = datam1_i - tempr; + datam1_r = datam1_r - tempi; + datam1_i = datam1_i + tempr; + + tempr = n2w1r + m2ww1r; + tempi = n2w1i + m2ww1i; + + datan2_r = datan1_r - tempr; + datan2_i = datan1_i - tempi; + datan1_r = datan1_r + tempr; + datan1_i = datan1_i + tempi; + + data[m] = datam2_r; + data[m + 1] = datam2_i; + data[n] = datan2_r; + data[n + 1] = datan2_i; + + n -= nnstep; + m -= nnstep; + data[m] = datam1_r; + data[m + 1] = datam1_i; + data[n] = datan1_r; + data[n + 1] = datan1_i; + + } + } + + for (int j = 2; j < jmax; j += 2) { + double wr = w[i++]; + double wi = w[i++]; + double wr1 = w[ii++]; + double wi1 = w[ii++]; + double wwr1 = w[iii++]; + double wwi1 = w[iii++]; + // double wwr1 = wr * wr1 - wi * wi1; // these numbers can be + // precomputed!!! + // double wwi1 = wr * wi1 + wi * wr1; + + for (int n = j; n < fftFrameSize2; n += nstep) { + int m = n + jmax; + + double datam1_r = data[m]; + double datam1_i = data[m + 1]; + double datan1_r = data[n]; + double datan1_i = data[n + 1]; + + n += nnstep; + m += nnstep; + double datam2_r = data[m]; + double datam2_i = data[m + 1]; + double datan2_r = data[n]; + double datan2_i = data[n + 1]; + + double tempr = datam1_r * wr - datam1_i * wi; + double tempi = datam1_r * wi + datam1_i * wr; + + datam1_r = datan1_r - tempr; + datam1_i = datan1_i - tempi; + datan1_r = datan1_r + tempr; + datan1_i = datan1_i + tempi; + + double n2w1r = datan2_r * wr1 - datan2_i * wi1; + double n2w1i = datan2_r * wi1 + datan2_i * wr1; + double m2ww1r = datam2_r * wwr1 - datam2_i * wwi1; + double m2ww1i = datam2_r * wwi1 + datam2_i * wwr1; + + tempr = m2ww1r - n2w1r; + tempi = m2ww1i - n2w1i; + + datam2_r = datam1_r + tempi; + datam2_i = datam1_i - tempr; + datam1_r = datam1_r - tempi; + datam1_i = datam1_i + tempr; + + tempr = n2w1r + m2ww1r; + tempi = n2w1i + m2ww1i; + + datan2_r = datan1_r - tempr; + datan2_i = datan1_i - tempi; + datan1_r = datan1_r + tempr; + datan1_i = datan1_i + tempi; + + data[m] = datam2_r; + data[m + 1] = datam2_i; + data[n] = datan2_r; + data[n + 1] = datan2_i; + + n -= nnstep; + m -= nnstep; + data[m] = datam1_r; + data[m + 1] = datam1_i; + data[n] = datan1_r; + data[n + 1] = datan1_i; + } + } + + i += jmax << 1; + + } + + calcF2E(fftFrameSize, data, i, nstep, w); + + } + + // Perform Factor-4 Decomposition with 3 * complex operators and 8 +/- + // complex operators + private final static void calcF4I(int fftFrameSize, double[] data, int i, + int nstep, double[] w) { + final int fftFrameSize2 = fftFrameSize << 1; // 2*fftFrameSize; + // Factor-4 Decomposition + + int w_len = w.length >> 1; + while (nstep < fftFrameSize2) { + + if (nstep << 2 == fftFrameSize2) { + // Goto Factor-4 Final Decomposition + // calcF4E(data, i, nstep, 1, w); + calcF4IE(fftFrameSize, data, i, nstep, w); + return; + } + int jmax = nstep; + int nnstep = nstep << 1; + if (nnstep == fftFrameSize2) { + // Factor-4 Decomposition not possible + calcF2E(fftFrameSize, data, i, nstep, w); + return; + } + nstep <<= 2; + int ii = i + jmax; + int iii = i + w_len; + { + i += 2; + ii += 2; + iii += 2; + + for (int n = 0; n < fftFrameSize2; n += nstep) { + int m = n + jmax; + + double datam1_r = data[m]; + double datam1_i = data[m + 1]; + double datan1_r = data[n]; + double datan1_i = data[n + 1]; + + n += nnstep; + m += nnstep; + double datam2_r = data[m]; + double datam2_i = data[m + 1]; + double datan2_r = data[n]; + double datan2_i = data[n + 1]; + + double tempr = datam1_r; + double tempi = datam1_i; + + datam1_r = datan1_r - tempr; + datam1_i = datan1_i - tempi; + datan1_r = datan1_r + tempr; + datan1_i = datan1_i + tempi; + + double n2w1r = datan2_r; + double n2w1i = datan2_i; + double m2ww1r = datam2_r; + double m2ww1i = datam2_i; + + tempr = n2w1r - m2ww1r; + tempi = n2w1i - m2ww1i; + + datam2_r = datam1_r + tempi; + datam2_i = datam1_i - tempr; + datam1_r = datam1_r - tempi; + datam1_i = datam1_i + tempr; + + tempr = n2w1r + m2ww1r; + tempi = n2w1i + m2ww1i; + + datan2_r = datan1_r - tempr; + datan2_i = datan1_i - tempi; + datan1_r = datan1_r + tempr; + datan1_i = datan1_i + tempi; + + data[m] = datam2_r; + data[m + 1] = datam2_i; + data[n] = datan2_r; + data[n + 1] = datan2_i; + + n -= nnstep; + m -= nnstep; + data[m] = datam1_r; + data[m + 1] = datam1_i; + data[n] = datan1_r; + data[n + 1] = datan1_i; + + } + + } + for (int j = 2; j < jmax; j += 2) { + double wr = w[i++]; + double wi = w[i++]; + double wr1 = w[ii++]; + double wi1 = w[ii++]; + double wwr1 = w[iii++]; + double wwi1 = w[iii++]; + // double wwr1 = wr * wr1 - wi * wi1; // these numbers can be + // precomputed!!! + // double wwi1 = wr * wi1 + wi * wr1; + + for (int n = j; n < fftFrameSize2; n += nstep) { + int m = n + jmax; + + double datam1_r = data[m]; + double datam1_i = data[m + 1]; + double datan1_r = data[n]; + double datan1_i = data[n + 1]; + + n += nnstep; + m += nnstep; + double datam2_r = data[m]; + double datam2_i = data[m + 1]; + double datan2_r = data[n]; + double datan2_i = data[n + 1]; + + double tempr = datam1_r * wr - datam1_i * wi; + double tempi = datam1_r * wi + datam1_i * wr; + + datam1_r = datan1_r - tempr; + datam1_i = datan1_i - tempi; + datan1_r = datan1_r + tempr; + datan1_i = datan1_i + tempi; + + double n2w1r = datan2_r * wr1 - datan2_i * wi1; + double n2w1i = datan2_r * wi1 + datan2_i * wr1; + double m2ww1r = datam2_r * wwr1 - datam2_i * wwi1; + double m2ww1i = datam2_r * wwi1 + datam2_i * wwr1; + + tempr = n2w1r - m2ww1r; + tempi = n2w1i - m2ww1i; + + datam2_r = datam1_r + tempi; + datam2_i = datam1_i - tempr; + datam1_r = datam1_r - tempi; + datam1_i = datam1_i + tempr; + + tempr = n2w1r + m2ww1r; + tempi = n2w1i + m2ww1i; + + datan2_r = datan1_r - tempr; + datan2_i = datan1_i - tempi; + datan1_r = datan1_r + tempr; + datan1_i = datan1_i + tempi; + + data[m] = datam2_r; + data[m + 1] = datam2_i; + data[n] = datan2_r; + data[n + 1] = datan2_i; + + n -= nnstep; + m -= nnstep; + data[m] = datam1_r; + data[m + 1] = datam1_i; + data[n] = datan1_r; + data[n + 1] = datan1_i; + + } + } + + i += jmax << 1; + + } + + calcF2E(fftFrameSize, data, i, nstep, w); + + } + + // Perform Factor-4 Decomposition with 3 * complex operators and 8 +/- + // complex operators + private final static void calcF4FE(int fftFrameSize, double[] data, int i, + int nstep, double[] w) { + final int fftFrameSize2 = fftFrameSize << 1; // 2*fftFrameSize; + // Factor-4 Decomposition + + int w_len = w.length >> 1; + while (nstep < fftFrameSize2) { + + int jmax = nstep; + int nnstep = nstep << 1; + if (nnstep == fftFrameSize2) { + // Factor-4 Decomposition not possible + calcF2E(fftFrameSize, data, i, nstep, w); + return; + } + nstep <<= 2; + int ii = i + jmax; + int iii = i + w_len; + for (int n = 0; n < jmax; n += 2) { + double wr = w[i++]; + double wi = w[i++]; + double wr1 = w[ii++]; + double wi1 = w[ii++]; + double wwr1 = w[iii++]; + double wwi1 = w[iii++]; + // double wwr1 = wr * wr1 - wi * wi1; // these numbers can be + // precomputed!!! + // double wwi1 = wr * wi1 + wi * wr1; + + int m = n + jmax; + + double datam1_r = data[m]; + double datam1_i = data[m + 1]; + double datan1_r = data[n]; + double datan1_i = data[n + 1]; + + n += nnstep; + m += nnstep; + double datam2_r = data[m]; + double datam2_i = data[m + 1]; + double datan2_r = data[n]; + double datan2_i = data[n + 1]; + + double tempr = datam1_r * wr - datam1_i * wi; + double tempi = datam1_r * wi + datam1_i * wr; + + datam1_r = datan1_r - tempr; + datam1_i = datan1_i - tempi; + datan1_r = datan1_r + tempr; + datan1_i = datan1_i + tempi; + + double n2w1r = datan2_r * wr1 - datan2_i * wi1; + double n2w1i = datan2_r * wi1 + datan2_i * wr1; + double m2ww1r = datam2_r * wwr1 - datam2_i * wwi1; + double m2ww1i = datam2_r * wwi1 + datam2_i * wwr1; + + tempr = m2ww1r - n2w1r; + tempi = m2ww1i - n2w1i; + + datam2_r = datam1_r + tempi; + datam2_i = datam1_i - tempr; + datam1_r = datam1_r - tempi; + datam1_i = datam1_i + tempr; + + tempr = n2w1r + m2ww1r; + tempi = n2w1i + m2ww1i; + + datan2_r = datan1_r - tempr; + datan2_i = datan1_i - tempi; + datan1_r = datan1_r + tempr; + datan1_i = datan1_i + tempi; + + data[m] = datam2_r; + data[m + 1] = datam2_i; + data[n] = datan2_r; + data[n + 1] = datan2_i; + + n -= nnstep; + m -= nnstep; + data[m] = datam1_r; + data[m + 1] = datam1_i; + data[n] = datan1_r; + data[n + 1] = datan1_i; + + } + + i += jmax << 1; + + } + + } + + // Perform Factor-4 Decomposition with 3 * complex operators and 8 +/- + // complex operators + private final static void calcF4IE(int fftFrameSize, double[] data, int i, + int nstep, double[] w) { + final int fftFrameSize2 = fftFrameSize << 1; // 2*fftFrameSize; + // Factor-4 Decomposition + + int w_len = w.length >> 1; + while (nstep < fftFrameSize2) { + + int jmax = nstep; + int nnstep = nstep << 1; + if (nnstep == fftFrameSize2) { + // Factor-4 Decomposition not possible + calcF2E(fftFrameSize, data, i, nstep, w); + return; + } + nstep <<= 2; + int ii = i + jmax; + int iii = i + w_len; + for (int n = 0; n < jmax; n += 2) { + double wr = w[i++]; + double wi = w[i++]; + double wr1 = w[ii++]; + double wi1 = w[ii++]; + double wwr1 = w[iii++]; + double wwi1 = w[iii++]; + // double wwr1 = wr * wr1 - wi * wi1; // these numbers can be + // precomputed!!! + // double wwi1 = wr * wi1 + wi * wr1; + + int m = n + jmax; + + double datam1_r = data[m]; + double datam1_i = data[m + 1]; + double datan1_r = data[n]; + double datan1_i = data[n + 1]; + + n += nnstep; + m += nnstep; + double datam2_r = data[m]; + double datam2_i = data[m + 1]; + double datan2_r = data[n]; + double datan2_i = data[n + 1]; + + double tempr = datam1_r * wr - datam1_i * wi; + double tempi = datam1_r * wi + datam1_i * wr; + + datam1_r = datan1_r - tempr; + datam1_i = datan1_i - tempi; + datan1_r = datan1_r + tempr; + datan1_i = datan1_i + tempi; + + double n2w1r = datan2_r * wr1 - datan2_i * wi1; + double n2w1i = datan2_r * wi1 + datan2_i * wr1; + double m2ww1r = datam2_r * wwr1 - datam2_i * wwi1; + double m2ww1i = datam2_r * wwi1 + datam2_i * wwr1; + + tempr = n2w1r - m2ww1r; + tempi = n2w1i - m2ww1i; + + datam2_r = datam1_r + tempi; + datam2_i = datam1_i - tempr; + datam1_r = datam1_r - tempi; + datam1_i = datam1_i + tempr; + + tempr = n2w1r + m2ww1r; + tempi = n2w1i + m2ww1i; + + datan2_r = datan1_r - tempr; + datan2_i = datan1_i - tempi; + datan1_r = datan1_r + tempr; + datan1_i = datan1_i + tempi; + + data[m] = datam2_r; + data[m + 1] = datam2_i; + data[n] = datan2_r; + data[n + 1] = datan2_i; + + n -= nnstep; + m -= nnstep; + data[m] = datam1_r; + data[m + 1] = datam1_i; + data[n] = datan1_r; + data[n + 1] = datan1_i; + + } + + i += jmax << 1; + + } + + } + + private final void bitreversal(double[] data) { + if (fftFrameSize < 4) + return; + + int inverse = fftFrameSize2 - 2; + for (int i = 0; i < fftFrameSize; i += 4) { + int j = bitm_array[i]; + + // Performing Bit-Reversal, even v.s. even, O(2N) + if (i < j) { + + int n = i; + int m = j; + + // COMPLEX: SWAP(data[n], data[m]) + // Real Part + double tempr = data[n]; + data[n] = data[m]; + data[m] = tempr; + // Imagery Part + n++; + m++; + double tempi = data[n]; + data[n] = data[m]; + data[m] = tempi; + + n = inverse - i; + m = inverse - j; + + // COMPLEX: SWAP(data[n], data[m]) + // Real Part + tempr = data[n]; + data[n] = data[m]; + data[m] = tempr; + // Imagery Part + n++; + m++; + tempi = data[n]; + data[n] = data[m]; + data[m] = tempi; + } + + // Performing Bit-Reversal, odd v.s. even, O(N) + + int m = j + fftFrameSize; // bitm_array[i+2]; + // COMPLEX: SWAP(data[n], data[m]) + // Real Part + int n = i + 2; + double tempr = data[n]; + data[n] = data[m]; + data[m] = tempr; + // Imagery Part + n++; + m++; + double tempi = data[n]; + data[n] = data[m]; + data[m] = tempi; + } + + } +} diff --git a/jdk/src/windows/native/sun/windows/awt_Unicode.cpp b/jdk/src/share/classes/com/sun/media/sound/InvalidDataException.java similarity index 67% rename from jdk/src/windows/native/sun/windows/awt_Unicode.cpp rename to jdk/src/share/classes/com/sun/media/sound/InvalidDataException.java index 669062e5dda..ab46ef370d5 100644 --- a/jdk/src/windows/native/sun/windows/awt_Unicode.cpp +++ b/jdk/src/share/classes/com/sun/media/sound/InvalidDataException.java @@ -1,5 +1,5 @@ /* - * Copyright 1996-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2007 Sun Microsystems, Inc. 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 @@ -22,25 +22,24 @@ * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ +package com.sun.media.sound; -#include "awt.h" +import java.io.IOException; -LPWSTR J2WHelper1(LPWSTR lpw, LPWSTR lpj, int offset, int nChars) { - memcpy(lpw, lpj + offset, nChars*2); - lpw[nChars] = '\0'; - return lpw; -} - -LPWSTR JNI_J2WHelper1(JNIEnv *env, LPWSTR lpwstr, jstring jstr) { - - int len = env->GetStringLength(jstr); - - env->GetStringRegion(jstr, 0, len, lpwstr); - lpwstr[len] = '\0'; - - return lpwstr; -} - -LPWSTR J2WHelper(LPWSTR lpw, LPWSTR lpj, int nChars) { - return J2WHelper1(lpw, lpj, 0, nChars); +/** + * This exception is used when a file contains illegal or unexpected data. + * + * @author Karl Helgason + */ +public class InvalidDataException extends IOException { + + private static final long serialVersionUID = 1L; + + public InvalidDataException() { + super("Invalid Data!"); + } + + public InvalidDataException(String s) { + super(s); + } } diff --git a/jdk/src/share/classes/com/sun/media/sound/InvalidFormatException.java b/jdk/src/share/classes/com/sun/media/sound/InvalidFormatException.java new file mode 100644 index 00000000000..96aaa02250e --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/InvalidFormatException.java @@ -0,0 +1,44 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * This exception is used when a reader is used to read file of a format + * it doesn't unterstand or support. + * + * @author Karl Helgason + */ +public class InvalidFormatException extends InvalidDataException { + + private static final long serialVersionUID = 1L; + + public InvalidFormatException() { + super("Invalid format!"); + } + + public InvalidFormatException(String s) { + super(s); + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/JARSoundbankReader.java b/jdk/src/share/classes/com/sun/media/sound/JARSoundbankReader.java new file mode 100644 index 00000000000..442fe72c31a --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/JARSoundbankReader.java @@ -0,0 +1,120 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; +import javax.sound.midi.InvalidMidiDataException; +import javax.sound.midi.Soundbank; +import javax.sound.midi.spi.SoundbankReader; + +/** + * JarSoundbankReader is used to read sounbank object from jar files. + * + * @author Karl Helgason + */ +public class JARSoundbankReader extends SoundbankReader { + + public boolean isZIP(URL url) { + boolean ok = false; + try { + InputStream stream = url.openStream(); + try { + byte[] buff = new byte[4]; + ok = stream.read(buff) == 4; + if (ok) { + ok = (buff[0] == 0x50 + && buff[1] == 0x4b + && buff[2] == 0x03 + && buff[3] == 0x04); + } + } finally { + stream.close(); + } + } catch (IOException e) { + } + return ok; + } + + public Soundbank getSoundbank(URL url) + throws InvalidMidiDataException, IOException { + if (!isZIP(url)) + return null; + ArrayList soundbanks = new ArrayList(); + URLClassLoader ucl = URLClassLoader.newInstance(new URL[]{url}); + InputStream stream = ucl.getResourceAsStream( + "META-INF/services/javax.sound.midi.Soundbank"); + if (stream == null) + return null; + try + { + BufferedReader r = new BufferedReader(new InputStreamReader(stream)); + String line = r.readLine(); + while (line != null) { + if (!line.startsWith("#")) { + try { + Class c = Class.forName(line.trim(), true, ucl); + Object o = c.newInstance(); + if (o instanceof Soundbank) { + soundbanks.add((Soundbank) o); + } + } catch (ClassNotFoundException e) { + } catch (InstantiationException e) { + } catch (IllegalAccessException e) { + } + } + line = r.readLine(); + } + } + finally + { + stream.close(); + } + if (soundbanks.size() == 0) + return null; + if (soundbanks.size() == 1) + return soundbanks.get(0); + SimpleSoundbank sbk = new SimpleSoundbank(); + for (Soundbank soundbank : soundbanks) + sbk.addAllInstruments(soundbank); + return sbk; + } + + public Soundbank getSoundbank(InputStream stream) + throws InvalidMidiDataException, IOException { + return null; + } + + public Soundbank getSoundbank(File file) + throws InvalidMidiDataException, IOException { + return getSoundbank(file.toURI().toURL()); + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/ModelAbstractChannelMixer.java b/jdk/src/share/classes/com/sun/media/sound/ModelAbstractChannelMixer.java new file mode 100644 index 00000000000..37b14fe1a74 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/ModelAbstractChannelMixer.java @@ -0,0 +1,126 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * ModelAbstractChannelMixer is ready for use class to implement + * ModelChannelMixer interface. + * + * @author Karl Helgason + */ +public abstract class ModelAbstractChannelMixer implements ModelChannelMixer { + + public abstract boolean process(float[][] buffer, int offset, int len); + + public abstract void stop(); + + public void allNotesOff() { + } + + public void allSoundOff() { + } + + public void controlChange(int controller, int value) { + } + + public int getChannelPressure() { + return 0; + } + + public int getController(int controller) { + return 0; + } + + public boolean getMono() { + return false; + } + + public boolean getMute() { + return false; + } + + public boolean getOmni() { + return false; + } + + public int getPitchBend() { + return 0; + } + + public int getPolyPressure(int noteNumber) { + return 0; + } + + public int getProgram() { + return 0; + } + + public boolean getSolo() { + return false; + } + + public boolean localControl(boolean on) { + return false; + } + + public void noteOff(int noteNumber) { + } + + public void noteOff(int noteNumber, int velocity) { + } + + public void noteOn(int noteNumber, int velocity) { + } + + public void programChange(int program) { + } + + public void programChange(int bank, int program) { + } + + public void resetAllControllers() { + } + + public void setChannelPressure(int pressure) { + } + + public void setMono(boolean on) { + } + + public void setMute(boolean mute) { + } + + public void setOmni(boolean on) { + } + + public void setPitchBend(int bend) { + } + + public void setPolyPressure(int noteNumber, int pressure) { + } + + public void setSolo(boolean soloState) { + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/ModelAbstractOscillator.java b/jdk/src/share/classes/com/sun/media/sound/ModelAbstractOscillator.java new file mode 100644 index 00000000000..5d5c7e937af --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/ModelAbstractOscillator.java @@ -0,0 +1,200 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.IOException; +import javax.sound.midi.Instrument; +import javax.sound.midi.MidiChannel; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; +import javax.sound.midi.SoundbankResource; +import javax.sound.midi.VoiceStatus; + +/** + * A abstract class used to simplify creating custom ModelOscillator. + * + * @author Karl Helgason + */ +public abstract class ModelAbstractOscillator + implements ModelOscillator, ModelOscillatorStream, Soundbank { + + protected float pitch = 6000; + protected float samplerate; + protected MidiChannel channel; + protected VoiceStatus voice; + protected int noteNumber; + protected int velocity; + protected boolean on = false; + + public void init() { + } + + public void close() throws IOException { + } + + public void noteOff(int velocity) { + on = false; + } + + public void noteOn(MidiChannel channel, VoiceStatus voice, int noteNumber, + int velocity) { + this.channel = channel; + this.voice = voice; + this.noteNumber = noteNumber; + this.velocity = velocity; + on = true; + } + + public int read(float[][] buffer, int offset, int len) throws IOException { + return -1; + } + + public MidiChannel getChannel() { + return channel; + } + + public VoiceStatus getVoice() { + return voice; + } + + public int getNoteNumber() { + return noteNumber; + } + + public int getVelocity() { + return velocity; + } + + public boolean isOn() { + return on; + } + + public void setPitch(float pitch) { + this.pitch = pitch; + } + + public float getPitch() { + return pitch; + } + + public void setSampleRate(float samplerate) { + this.samplerate = samplerate; + } + + public float getSampleRate() { + return samplerate; + } + + public float getAttenuation() { + return 0; + } + + public int getChannels() { + return 1; + } + + public String getName() { + return getClass().getName(); + } + + public Patch getPatch() { + return new Patch(0, 0); + } + + public ModelOscillatorStream open(float samplerate) { + ModelAbstractOscillator oscs; + try { + oscs = this.getClass().newInstance(); + } catch (InstantiationException e) { + throw new IllegalArgumentException(e); + } catch (IllegalAccessException e) { + throw new IllegalArgumentException(e); + } + oscs.setSampleRate(samplerate); + oscs.init(); + return oscs; + } + + public ModelPerformer getPerformer() { + // Create performer for my custom oscillirator + ModelPerformer performer = new ModelPerformer(); + performer.getOscillators().add(this); + return performer; + + } + + public ModelInstrument getInstrument() { + // Create Instrument object around my performer + SimpleInstrument ins = new SimpleInstrument(); + ins.setName(getName()); + ins.add(getPerformer()); + ins.setPatch(getPatch()); + return ins; + + } + + public Soundbank getSoundBank() { + // Create Soundbank object around the instrument + SimpleSoundbank sbk = new SimpleSoundbank(); + sbk.addInstrument(getInstrument()); + return sbk; + } + + public String getDescription() { + return getName(); + } + + public Instrument getInstrument(Patch patch) { + Instrument ins = getInstrument(); + Patch p = ins.getPatch(); + if (p.getBank() != patch.getBank()) + return null; + if (p.getProgram() != patch.getProgram()) + return null; + if (p instanceof ModelPatch && patch instanceof ModelPatch) { + if (((ModelPatch)p).isPercussion() + != ((ModelPatch)patch).isPercussion()) { + return null; + } + } + return ins; + } + + public Instrument[] getInstruments() { + return new Instrument[]{getInstrument()}; + } + + public SoundbankResource[] getResources() { + return new SoundbankResource[0]; + } + + public String getVendor() { + return null; + } + + public String getVersion() { + return null; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/ModelByteBuffer.java b/jdk/src/share/classes/com/sun/media/sound/ModelByteBuffer.java new file mode 100644 index 00000000000..16c1125fb61 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/ModelByteBuffer.java @@ -0,0 +1,329 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.RandomAccessFile; +import java.util.Collection; + +/** + * This class is a pointer to a binary array either in memory or on disk. + * + * @author Karl Helgason + */ +public class ModelByteBuffer { + + private ModelByteBuffer root = this; + private File file; + private long fileoffset; + private byte[] buffer; + private long offset; + private final long len; + + private class RandomFileInputStream extends InputStream { + + private RandomAccessFile raf; + private long left; + private long mark = 0; + private long markleft = 0; + + public RandomFileInputStream() throws IOException { + raf = new RandomAccessFile(root.file, "r"); + raf.seek(root.fileoffset + arrayOffset()); + left = capacity(); + } + + public int available() throws IOException { + if (left > Integer.MAX_VALUE) + return Integer.MAX_VALUE; + return (int)left; + } + + public synchronized void mark(int readlimit) { + try { + mark = raf.getFilePointer(); + markleft = left; + } catch (IOException e) { + //e.printStackTrace(); + } + } + + public boolean markSupported() { + return true; + } + + public synchronized void reset() throws IOException { + raf.seek(mark); + left = markleft; + } + + public long skip(long n) throws IOException { + if( n < 0) + return 0; + if (n > left) + n = left; + long p = raf.getFilePointer(); + raf.seek(p + n); + left -= n; + return n; + } + + public int read(byte b[], int off, int len) throws IOException { + if (len > left) + len = (int)left; + if (left == 0) + return -1; + len = raf.read(b, off, len); + if (len == -1) + return -1; + left -= len; + return len; + } + + public int read(byte[] b) throws IOException { + int len = b.length; + if (len > left) + len = (int)left; + if (left == 0) + return -1; + len = raf.read(b, 0, len); + if (len == -1) + return -1; + left -= len; + return len; + } + + public int read() throws IOException { + if (left == 0) + return -1; + int b = raf.read(); + if (b == -1) + return -1; + left--; + return b; + } + + public void close() throws IOException { + raf.close(); + } + } + + private ModelByteBuffer(ModelByteBuffer parent, + long beginIndex, long endIndex, boolean independent) { + this.root = parent.root; + this.offset = 0; + long parent_len = parent.len; + if (beginIndex < 0) + beginIndex = 0; + if (beginIndex > parent_len) + beginIndex = parent_len; + if (endIndex < 0) + endIndex = 0; + if (endIndex > parent_len) + endIndex = parent_len; + if (beginIndex > endIndex) + beginIndex = endIndex; + offset = beginIndex; + len = endIndex - beginIndex; + if (independent) { + buffer = root.buffer; + if (root.file != null) { + file = root.file; + fileoffset = root.fileoffset + arrayOffset(); + offset = 0; + } else + offset = arrayOffset(); + root = this; + } + } + + public ModelByteBuffer(byte[] buffer) { + this.buffer = buffer; + this.offset = 0; + this.len = buffer.length; + } + + public ModelByteBuffer(byte[] buffer, int offset, int len) { + this.buffer = buffer; + this.offset = offset; + this.len = len; + } + + public ModelByteBuffer(File file) { + this.file = file; + this.fileoffset = 0; + this.len = file.length(); + } + + public ModelByteBuffer(File file, long offset, long len) { + this.file = file; + this.fileoffset = offset; + this.len = len; + } + + public void writeTo(OutputStream out) throws IOException { + if (root.file != null && root.buffer == null) { + InputStream is = getInputStream(); + byte[] buff = new byte[1024]; + int ret; + while ((ret = is.read(buff)) != -1) + out.write(buff, 0, ret); + } else + out.write(array(), (int) arrayOffset(), (int) capacity()); + } + + public InputStream getInputStream() { + if (root.file != null && root.buffer == null) { + try { + return new RandomFileInputStream(); + } catch (IOException e) { + //e.printStackTrace(); + return null; + } + } + return new ByteArrayInputStream(array(), + (int)arrayOffset(), (int)capacity()); + } + + public ModelByteBuffer subbuffer(long beginIndex) { + return subbuffer(beginIndex, capacity()); + } + + public ModelByteBuffer subbuffer(long beginIndex, long endIndex) { + return subbuffer(beginIndex, endIndex, false); + } + + public ModelByteBuffer subbuffer(long beginIndex, long endIndex, + boolean independent) { + return new ModelByteBuffer(this, beginIndex, endIndex, independent); + } + + public byte[] array() { + return root.buffer; + } + + public long arrayOffset() { + if (root != this) + return root.arrayOffset() + offset; + return offset; + } + + public long capacity() { + return len; + } + + public ModelByteBuffer getRoot() { + return root; + } + + public File getFile() { + return file; + } + + public long getFilePointer() { + return fileoffset; + } + + public static void loadAll(Collection col) + throws IOException { + File selfile = null; + RandomAccessFile raf = null; + try { + for (ModelByteBuffer mbuff : col) { + mbuff = mbuff.root; + if (mbuff.file == null) + continue; + if (mbuff.buffer != null) + continue; + if (selfile == null || !selfile.equals(mbuff.file)) { + if (raf != null) { + raf.close(); + raf = null; + } + selfile = mbuff.file; + raf = new RandomAccessFile(mbuff.file, "r"); + } + raf.seek(mbuff.fileoffset); + byte[] buffer = new byte[(int) mbuff.capacity()]; + + int read = 0; + int avail = buffer.length; + while (read != avail) { + if (avail - read > 65536) { + raf.readFully(buffer, read, 65536); + read += 65536; + } else { + raf.readFully(buffer, read, avail - read); + read = avail; + } + + } + + mbuff.buffer = buffer; + mbuff.offset = 0; + } + } finally { + if (raf != null) + raf.close(); + } + } + + public void load() throws IOException { + if (root != this) { + root.load(); + return; + } + if (buffer != null) + return; + if (file == null) { + throw new IllegalStateException( + "No file associated with this ByteBuffer!"); + } + + DataInputStream is = new DataInputStream(getInputStream()); + buffer = new byte[(int) capacity()]; + offset = 0; + is.readFully(buffer); + is.close(); + + } + + public void unload() { + if (root != this) { + root.unload(); + return; + } + if (file == null) { + throw new IllegalStateException( + "No file associated with this ByteBuffer!"); + } + root.buffer = null; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/ModelByteBufferWavetable.java b/jdk/src/share/classes/com/sun/media/sound/ModelByteBufferWavetable.java new file mode 100644 index 00000000000..d7da52a7643 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/ModelByteBufferWavetable.java @@ -0,0 +1,281 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.IOException; +import java.io.InputStream; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.AudioFormat.Encoding; + +/** + * Wavetable oscillator for pre-loaded data. + * + * @author Karl Helgason + */ +public class ModelByteBufferWavetable implements ModelWavetable { + + private class Buffer8PlusInputStream extends InputStream { + + private boolean bigendian; + private int framesize_pc; + int pos = 0; + int pos2 = 0; + int markpos = 0; + int markpos2 = 0; + + public Buffer8PlusInputStream() { + framesize_pc = format.getFrameSize() / format.getChannels(); + bigendian = format.isBigEndian(); + } + + public int read(byte[] b, int off, int len) throws IOException { + int avail = available(); + if (avail <= 0) + return -1; + if (len > avail) + len = avail; + byte[] buff1 = buffer.array(); + byte[] buff2 = buffer8.array(); + pos += buffer.arrayOffset(); + pos2 += buffer8.arrayOffset(); + if (bigendian) { + for (int i = 0; i < len; i += (framesize_pc + 1)) { + System.arraycopy(buff1, pos, b, i, framesize_pc); + System.arraycopy(buff2, pos2, b, i + framesize_pc, 1); + pos += framesize_pc; + pos2 += 1; + } + } else { + for (int i = 0; i < len; i += (framesize_pc + 1)) { + System.arraycopy(buff2, pos2, b, i, 1); + System.arraycopy(buff1, pos, b, i + 1, framesize_pc); + pos += framesize_pc; + pos2 += 1; + } + } + pos -= buffer.arrayOffset(); + pos2 -= buffer8.arrayOffset(); + return len; + } + + public long skip(long n) throws IOException { + int avail = available(); + if (avail <= 0) + return -1; + if (n > avail) + n = avail; + pos += (n / (framesize_pc + 1)) * (framesize_pc); + pos2 += n / (framesize_pc + 1); + return super.skip(n); + } + + public int read(byte[] b) throws IOException { + return read(b, 0, b.length); + } + + public int read() throws IOException { + byte[] b = new byte[1]; + int ret = read(b, 0, 1); + if (ret == -1) + return -1; + return 0 & 0xFF; + } + + public boolean markSupported() { + return true; + } + + public int available() throws IOException { + return (int)buffer.capacity() + (int)buffer8.capacity() - pos - pos2; + } + + public synchronized void mark(int readlimit) { + markpos = pos; + markpos2 = pos2; + } + + public synchronized void reset() throws IOException { + pos = markpos; + pos2 = markpos2; + + } + } + + private float loopStart = -1; + private float loopLength = -1; + private ModelByteBuffer buffer; + private ModelByteBuffer buffer8 = null; + private AudioFormat format = null; + private float pitchcorrection = 0; + private float attenuation = 0; + private int loopType = LOOP_TYPE_OFF; + + public ModelByteBufferWavetable(ModelByteBuffer buffer) { + this.buffer = buffer; + } + + public ModelByteBufferWavetable(ModelByteBuffer buffer, + float pitchcorrection) { + this.buffer = buffer; + this.pitchcorrection = pitchcorrection; + } + + public ModelByteBufferWavetable(ModelByteBuffer buffer, AudioFormat format) { + this.format = format; + this.buffer = buffer; + } + + public ModelByteBufferWavetable(ModelByteBuffer buffer, AudioFormat format, + float pitchcorrection) { + this.format = format; + this.buffer = buffer; + this.pitchcorrection = pitchcorrection; + } + + public void set8BitExtensionBuffer(ModelByteBuffer buffer) { + buffer8 = buffer; + } + + public ModelByteBuffer get8BitExtensionBuffer() { + return buffer8; + } + + public ModelByteBuffer getBuffer() { + return buffer; + } + + public AudioFormat getFormat() { + if (format == null) { + if (buffer == null) + return null; + InputStream is = buffer.getInputStream(); + AudioFormat format = null; + try { + format = AudioSystem.getAudioFileFormat(is).getFormat(); + } catch (Exception e) { + //e.printStackTrace(); + } + try { + is.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + return format; + } + return format; + } + + public AudioFloatInputStream openStream() { + if (buffer == null) + return null; + if (format == null) { + InputStream is = buffer.getInputStream(); + AudioInputStream ais = null; + try { + ais = AudioSystem.getAudioInputStream(is); + } catch (Exception e) { + //e.printStackTrace(); + return null; + } + return AudioFloatInputStream.getInputStream(ais); + } + if (buffer.array() == null) { + return AudioFloatInputStream.getInputStream(new AudioInputStream( + buffer.getInputStream(), format, buffer.capacity())); + } + if (buffer8 != null) { + if (format.getEncoding().equals(Encoding.PCM_SIGNED) + || format.getEncoding().equals(Encoding.PCM_UNSIGNED)) { + InputStream is = new Buffer8PlusInputStream(); + AudioFormat format2 = new AudioFormat( + format.getEncoding(), + format.getSampleRate(), + format.getSampleSizeInBits() + 8, + format.getChannels(), + format.getFrameSize() + (1 * format.getChannels()), + format.getFrameRate(), + format.isBigEndian()); + + AudioInputStream ais = new AudioInputStream(is, format2, + buffer.capacity() / format.getFrameSize()); + return AudioFloatInputStream.getInputStream(ais); + } + } + return AudioFloatInputStream.getInputStream(format, buffer.array(), + (int)buffer.arrayOffset(), (int)buffer.capacity()); + } + + public int getChannels() { + return getFormat().getChannels(); + } + + public ModelOscillatorStream open(float samplerate) { + // ModelWavetableOscillator doesn't support ModelOscillatorStream + return null; + } + + // attenuation is in cB + public float getAttenuation() { + return attenuation; + } + // attenuation is in cB + public void setAttenuation(float attenuation) { + this.attenuation = attenuation; + } + + public float getLoopLength() { + return loopLength; + } + + public void setLoopLength(float loopLength) { + this.loopLength = loopLength; + } + + public float getLoopStart() { + return loopStart; + } + + public void setLoopStart(float loopStart) { + this.loopStart = loopStart; + } + + public void setLoopType(int loopType) { + this.loopType = loopType; + } + + public int getLoopType() { + return loopType; + } + + public float getPitchcorrection() { + return pitchcorrection; + } + + public void setPitchcorrection(float pitchcorrection) { + this.pitchcorrection = pitchcorrection; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/ModelChannelMixer.java b/jdk/src/share/classes/com/sun/media/sound/ModelChannelMixer.java new file mode 100644 index 00000000000..1f6dfd6e97d --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/ModelChannelMixer.java @@ -0,0 +1,50 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import javax.sound.midi.MidiChannel; + +/** + * ModelChannelMixer is used to process channel voice mix output before going + * to master output.
+ * It can be used to:
+ *

    + *
  • Implement non-voice oriented instruments.
  • + *
  • Add insert effect to instruments; for example distortion effect.
  • + * + *

    + * Warning! Classes that implements ModelChannelMixer must be thread-safe. + * + * @author Karl Helgason + */ +public interface ModelChannelMixer extends MidiChannel { + + // Used to process input audio from voices mix. + public boolean process(float[][] buffer, int offset, int len); + + // Is used to trigger that this mixer is not be used + // and it should fade out. + public void stop(); +} diff --git a/jdk/src/share/classes/com/sun/media/sound/ModelConnectionBlock.java b/jdk/src/share/classes/com/sun/media/sound/ModelConnectionBlock.java new file mode 100644 index 00000000000..349d6b42b7a --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/ModelConnectionBlock.java @@ -0,0 +1,135 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * Connection blocks are used to connect source variable + * to a destination variable. + * For example Note On velocity can be connected to output gain. + * In DLS this is called articulator and in SoundFonts (SF2) a modulator. + * + * @author Karl Helgason + */ +public class ModelConnectionBlock { + + // + // source1 * source2 * scale -> destination + // + private final static ModelSource[] no_sources = new ModelSource[0]; + private ModelSource[] sources = no_sources; + private double scale = 1; + private ModelDestination destination; + + public ModelConnectionBlock() { + } + + public ModelConnectionBlock(double scale, ModelDestination destination) { + this.scale = scale; + this.destination = destination; + } + + public ModelConnectionBlock(ModelSource source, + ModelDestination destination) { + if (source != null) { + this.sources = new ModelSource[1]; + this.sources[0] = source; + } + this.destination = destination; + } + + public ModelConnectionBlock(ModelSource source, double scale, + ModelDestination destination) { + if (source != null) { + this.sources = new ModelSource[1]; + this.sources[0] = source; + } + this.scale = scale; + this.destination = destination; + } + + public ModelConnectionBlock(ModelSource source, ModelSource control, + ModelDestination destination) { + if (source != null) { + if (control == null) { + this.sources = new ModelSource[1]; + this.sources[0] = source; + } else { + this.sources = new ModelSource[2]; + this.sources[0] = source; + this.sources[1] = control; + } + } + this.destination = destination; + } + + public ModelConnectionBlock(ModelSource source, ModelSource control, + double scale, ModelDestination destination) { + if (source != null) { + if (control == null) { + this.sources = new ModelSource[1]; + this.sources[0] = source; + } else { + this.sources = new ModelSource[2]; + this.sources[0] = source; + this.sources[1] = control; + } + } + this.scale = scale; + this.destination = destination; + } + + public ModelDestination getDestination() { + return destination; + } + + public void setDestination(ModelDestination destination) { + this.destination = destination; + } + + public double getScale() { + return scale; + } + + public void setScale(double scale) { + this.scale = scale; + } + + public ModelSource[] getSources() { + return sources; + } + + public void setSources(ModelSource[] source) { + this.sources = source; + } + + public void addSource(ModelSource source) { + ModelSource[] oldsources = sources; + sources = new ModelSource[oldsources.length + 1]; + for (int i = 0; i < oldsources.length; i++) { + sources[i] = oldsources[i]; + } + sources[sources.length - 1] = source; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/ModelDestination.java b/jdk/src/share/classes/com/sun/media/sound/ModelDestination.java new file mode 100644 index 00000000000..e8c1db41e1b --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/ModelDestination.java @@ -0,0 +1,117 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * This class is used to identify destinations in connection blocks, + * see ModelConnectionBlock. + * + * @author Karl Helgason + */ +public class ModelDestination { + + public static final ModelIdentifier DESTINATION_NONE = null; + public static final ModelIdentifier DESTINATION_KEYNUMBER + = new ModelIdentifier("noteon", "keynumber"); + public static final ModelIdentifier DESTINATION_VELOCITY + = new ModelIdentifier("noteon", "velocity"); + public static final ModelIdentifier DESTINATION_PITCH + = new ModelIdentifier("osc", "pitch"); // cent + public static final ModelIdentifier DESTINATION_GAIN + = new ModelIdentifier("mixer", "gain"); // cB + public static final ModelIdentifier DESTINATION_PAN + = new ModelIdentifier("mixer", "pan"); // 0.1 % + public static final ModelIdentifier DESTINATION_REVERB + = new ModelIdentifier("mixer", "reverb"); // 0.1 % + public static final ModelIdentifier DESTINATION_CHORUS + = new ModelIdentifier("mixer", "chorus"); // 0.1 % + public static final ModelIdentifier DESTINATION_LFO1_DELAY + = new ModelIdentifier("lfo", "delay", 0); // timecent + public static final ModelIdentifier DESTINATION_LFO1_FREQ + = new ModelIdentifier("lfo", "freq", 0); // cent + public static final ModelIdentifier DESTINATION_LFO2_DELAY + = new ModelIdentifier("lfo", "delay", 1); // timecent + public static final ModelIdentifier DESTINATION_LFO2_FREQ + = new ModelIdentifier("lfo", "freq", 1); // cent + public static final ModelIdentifier DESTINATION_EG1_DELAY + = new ModelIdentifier("eg", "delay", 0); // timecent + public static final ModelIdentifier DESTINATION_EG1_ATTACK + = new ModelIdentifier("eg", "attack", 0); // timecent + public static final ModelIdentifier DESTINATION_EG1_HOLD + = new ModelIdentifier("eg", "hold", 0); // timecent + public static final ModelIdentifier DESTINATION_EG1_DECAY + = new ModelIdentifier("eg", "decay", 0); // timecent + public static final ModelIdentifier DESTINATION_EG1_SUSTAIN + = new ModelIdentifier("eg", "sustain", 0); + // 0.1 % (I want this to be value not %) + public static final ModelIdentifier DESTINATION_EG1_RELEASE + = new ModelIdentifier("eg", "release", 0); // timecent + public static final ModelIdentifier DESTINATION_EG1_SHUTDOWN + = new ModelIdentifier("eg", "shutdown", 0); // timecent + public static final ModelIdentifier DESTINATION_EG2_DELAY + = new ModelIdentifier("eg", "delay", 1); // timecent + public static final ModelIdentifier DESTINATION_EG2_ATTACK + = new ModelIdentifier("eg", "attack", 1); // timecent + public static final ModelIdentifier DESTINATION_EG2_HOLD + = new ModelIdentifier("eg", "hold", 1); // 0.1 % + public static final ModelIdentifier DESTINATION_EG2_DECAY + = new ModelIdentifier("eg", "decay", 1); // timecent + public static final ModelIdentifier DESTINATION_EG2_SUSTAIN + = new ModelIdentifier("eg", "sustain", 1); + // 0.1 % ( I want this to be value not %) + public static final ModelIdentifier DESTINATION_EG2_RELEASE + = new ModelIdentifier("eg", "release", 1); // timecent + public static final ModelIdentifier DESTINATION_EG2_SHUTDOWN + = new ModelIdentifier("eg", "shutdown", 1); // timecent + public static final ModelIdentifier DESTINATION_FILTER_FREQ + = new ModelIdentifier("filter", "freq", 0); // cent + public static final ModelIdentifier DESTINATION_FILTER_Q + = new ModelIdentifier("filter", "q", 0); // cB + private ModelIdentifier destination = DESTINATION_NONE; + private ModelTransform transform = new ModelStandardTransform(); + + public ModelDestination() { + } + + public ModelDestination(ModelIdentifier id) { + destination = id; + } + + public ModelIdentifier getIdentifier() { + return destination; + } + + public void setIdentifier(ModelIdentifier destination) { + this.destination = destination; + } + + public ModelTransform getTransform() { + return transform; + } + + public void setTransform(ModelTransform transform) { + this.transform = transform; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/ModelDirectedPlayer.java b/jdk/src/share/classes/com/sun/media/sound/ModelDirectedPlayer.java new file mode 100644 index 00000000000..cdcfda5f3d6 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/ModelDirectedPlayer.java @@ -0,0 +1,36 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * ModelDirectedPlayer is the one who is directed by ModelDirector + * to play ModelPerformer objects. + * + * @author Karl Helgason + */ +public interface ModelDirectedPlayer { + + public void play(int performerIndex, ModelConnectionBlock[] connectionBlocks); +} diff --git a/jdk/src/share/classes/com/sun/media/sound/ModelDirector.java b/jdk/src/share/classes/com/sun/media/sound/ModelDirector.java new file mode 100644 index 00000000000..c7e7e914f2b --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/ModelDirector.java @@ -0,0 +1,46 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * A director chooses what performers should be played for each note on + * and note off events. + * + * ModelInstrument can implement custom performer who chooses what performers + * to play for example by sustain pedal is off or on. + * + * The default director (ModelStandardDirector) chooses performers + * by there keyfrom,keyto,velfrom,velto properties. + * + * @author Karl Helgason + */ +public interface ModelDirector { + + public void noteOn(int noteNumber, int velocity); + + public void noteOff(int noteNumber, int velocity); + + public void close(); +} diff --git a/jdk/src/share/classes/com/sun/media/sound/ModelIdentifier.java b/jdk/src/share/classes/com/sun/media/sound/ModelIdentifier.java new file mode 100644 index 00000000000..9900a679fc5 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/ModelIdentifier.java @@ -0,0 +1,169 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * This class stores the identity of source and destinations in connection + * blocks, see ModelConnectionBlock. + * + * @author Karl Helgason + */ +public class ModelIdentifier { + + /* + * Object Variable + * ------ -------- + * + * // INPUT parameters + * noteon keynumber 7 bit midi value + * velocity 7 bit midi vale + * on 1 or 0 + * + * midi pitch 14 bit midi value + * channel_pressure 7 bit midi value + * poly_pressure 7 bit midi value + * + * midi_cc 0 (midi control #0 7 bit midi value + * 1 (midi control #1 7 bit midi value + * ... + * 127 (midi control #127 7 bit midi value + * + * midi_rpn 0 (midi rpn control #0) 14 bit midi value + * 1 (midi rpn control #1) 14 bit midi value + * .... + * + * // DAHDSR envelope generator + * eg (null) + * delay timecent + * attack timecent + * hold timecent + * decay timecent + * sustain 0.1 % + * release timecent + * + * // Low frequency oscillirator (sine wave) + * lfo (null) + * delay timcent + * freq cent + * + * // Resonance LowPass Filter 6dB slope + * filter (null) (output/input) + * freq cent + * q cB + * + * // The oscillator with preloaded wavetable data + * osc (null) + * pitch cent + * + * // Output mixer pins + * mixer gain cB + * pan 0.1 % + * reverb 0.1 % + * chorus 0.1 % + * + */ + private String object = null; + private String variable = null; + private int instance = 0; + + public ModelIdentifier(String object) { + this.object = object; + } + + public ModelIdentifier(String object, int instance) { + this.object = object; + this.instance = instance; + } + + public ModelIdentifier(String object, String variable) { + this.object = object; + this.variable = variable; + + } + + public ModelIdentifier(String object, String variable, int instance) { + this.object = object; + this.variable = variable; + this.instance = instance; + + } + + public int getInstance() { + return instance; + } + + public void setInstance(int instance) { + this.instance = instance; + } + + public String getObject() { + return object; + } + + public void setObject(String object) { + this.object = object; + } + + public String getVariable() { + return variable; + } + + public void setVariable(String variable) { + this.variable = variable; + } + + public int hashCode() { + int hashcode = instance; + if(object != null) hashcode |= object.hashCode(); + if(variable != null) hashcode |= variable.hashCode(); + return hashcode; + } + + public boolean equals(Object obj) { + if (!(obj instanceof ModelIdentifier)) + return false; + + ModelIdentifier mobj = (ModelIdentifier)obj; + if ((object == null) != (mobj.object == null)) + return false; + if ((variable == null) != (mobj.variable == null)) + return false; + if (mobj.getInstance() != getInstance()) + return false; + if (!(object == null || object.equals(mobj.object))) + return false; + if (!(variable == null || variable.equals(mobj.variable))) + return false; + return true; + } + + public String toString() { + if (variable == null) { + return object + "[" + instance + "]"; + } else { + return object + "[" + instance + "]" + "." + variable; + } + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/ModelInstrument.java b/jdk/src/share/classes/com/sun/media/sound/ModelInstrument.java new file mode 100644 index 00000000000..37d0e583eac --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/ModelInstrument.java @@ -0,0 +1,136 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import javax.sound.midi.Instrument; +import javax.sound.midi.MidiChannel; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; +import javax.sound.sampled.AudioFormat; + +/** + * The model instrument class. + * + *

    The main methods to override are:
    + * getPerformer, getDirector, getChannelMixer. + * + *

    Performers are used to define what voices which will + * playback when using the instrument.
    + * + * ChannelMixer is used to add channel-wide processing + * on voices output or to define non-voice oriented instruments.
    + * + * Director is used to change how the synthesizer + * chooses what performers to play on midi events. + * + * @author Karl Helgason + */ +public abstract class ModelInstrument extends Instrument { + + protected ModelInstrument(Soundbank soundbank, Patch patch, String name, + Class dataClass) { + super(soundbank, patch, name, dataClass); + } + + public ModelDirector getDirector(ModelPerformer[] performers, + MidiChannel channel, ModelDirectedPlayer player) { + return new ModelStandardDirector(performers, player); + } + + public ModelPerformer[] getPerformers() { + return new ModelPerformer[0]; + } + + public ModelChannelMixer getChannelMixer(MidiChannel channel, + AudioFormat format) { + return null; + } + + // Get General MIDI 2 Alias patch for this instrument. + public Patch getPatchAlias() { + Patch patch = getPatch(); + int program = patch.getProgram(); + int bank = patch.getBank(); + if (bank != 0) + return patch; + boolean percussion = false; + if (getPatch() instanceof ModelPatch) + percussion = ((ModelPatch)getPatch()).isPercussion(); + if (percussion) + return new Patch(0x78 << 7, program); + else + return new Patch(0x79 << 7, program); + } + + // Return name of all the keys. + // This information is generated from ModelPerformer.getName() + // returned from getPerformers(). + public String[] getKeys() { + String[] keys = new String[128]; + for (ModelPerformer performer : getPerformers()) { + for (int k = performer.getKeyFrom(); k <= performer.getKeyTo(); k++) { + if (k >= 0 && k < 128 && keys[k] == null) { + String name = performer.getName(); + if (name == null) + name = "untitled"; + keys[k] = name; + } + } + } + return keys; + } + + // Return what channels this instrument will probably response + // on General MIDI synthesizer. + public boolean[] getChannels() { + boolean percussion = false; + if (getPatch() instanceof ModelPatch) + percussion = ((ModelPatch)getPatch()).isPercussion(); + + // Check if instrument is percussion. + if (percussion) { + boolean[] ch = new boolean[16]; + for (int i = 0; i < ch.length; i++) + ch[i] = false; + ch[9] = true; + return ch; + } + + // Check if instrument uses General MIDI 2 default banks. + int bank = getPatch().getBank(); + if (bank >> 7 == 0x78 || bank >> 7 == 0x79) { + boolean[] ch = new boolean[16]; + for (int i = 0; i < ch.length; i++) + ch[i] = true; + return ch; + } + + boolean[] ch = new boolean[16]; + for (int i = 0; i < ch.length; i++) + ch[i] = true; + ch[9] = false; + return ch; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/ModelInstrumentComparator.java b/jdk/src/share/classes/com/sun/media/sound/ModelInstrumentComparator.java new file mode 100644 index 00000000000..7268971f0d7 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/ModelInstrumentComparator.java @@ -0,0 +1,52 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.Comparator; +import javax.sound.midi.Instrument; +import javax.sound.midi.Patch; + +/** + * Instrument comparator class. + * Used to order instrument by program, bank, percussion. + * + * @author Karl Helgason + */ +public class ModelInstrumentComparator implements Comparator { + + public int compare(Instrument arg0, Instrument arg1) { + Patch p0 = arg0.getPatch(); + Patch p1 = arg1.getPatch(); + int a = p0.getBank() * 128 + p0.getProgram(); + int b = p1.getBank() * 128 + p1.getProgram(); + if (p0 instanceof ModelPatch) { + a += ((ModelPatch)p0).isPercussion() ? 2097152 : 0; + } + if (p1 instanceof ModelPatch) { + b += ((ModelPatch)p1).isPercussion() ? 2097152 : 0; + } + return a - b; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/ModelMappedInstrument.java b/jdk/src/share/classes/com/sun/media/sound/ModelMappedInstrument.java new file mode 100644 index 00000000000..6064852dee2 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/ModelMappedInstrument.java @@ -0,0 +1,62 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import javax.sound.midi.MidiChannel; +import javax.sound.midi.Patch; +import javax.sound.sampled.AudioFormat; + +/** + * This class is used to map instrument to another patch. + * + * @author Karl Helgason + */ +public class ModelMappedInstrument extends ModelInstrument { + + private ModelInstrument ins; + + public ModelMappedInstrument(ModelInstrument ins, Patch patch) { + super(ins.getSoundbank(), patch, ins.getName(), ins.getDataClass()); + this.ins = ins; + } + + public Object getData() { + return ins.getData(); + } + + public ModelPerformer[] getPerformers() { + return ins.getPerformers(); + } + + public ModelDirector getDirector(ModelPerformer[] performers, + MidiChannel channel, ModelDirectedPlayer player) { + return ins.getDirector(performers, channel, player); + } + + public ModelChannelMixer getChannelMixer(MidiChannel channel, + AudioFormat format) { + return ins.getChannelMixer(channel, format); + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/ModelOscillator.java b/jdk/src/share/classes/com/sun/media/sound/ModelOscillator.java new file mode 100644 index 00000000000..3312473d2ad --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/ModelOscillator.java @@ -0,0 +1,44 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * This interface is used for oscillators. + * See example in ModelDefaultOscillator which is a wavetable oscillator. + * + * @author Karl Helgason + */ +public interface ModelOscillator { + + public int getChannels(); + + /** + * Attenuation is in cB. + * @return + */ + public float getAttenuation(); + + public ModelOscillatorStream open(float samplerate); +} diff --git a/jdk/src/windows/native/sun/windows/awt_Multimon.h b/jdk/src/share/classes/com/sun/media/sound/ModelOscillatorStream.java similarity index 53% rename from jdk/src/windows/native/sun/windows/awt_Multimon.h rename to jdk/src/share/classes/com/sun/media/sound/ModelOscillatorStream.java index f2b371e3499..10ec5da46b9 100644 --- a/jdk/src/windows/native/sun/windows/awt_Multimon.h +++ b/jdk/src/share/classes/com/sun/media/sound/ModelOscillatorStream.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2001 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2007 Sun Microsystems, Inc. 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 @@ -22,33 +22,27 @@ * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ -#ifndef _INC_MULTIMON_ -#define _INC_MULTIMON_ -#endif -// -// build defines that replace the regular APIs with our versions -// -#undef GetMonitorInfo -#undef GetSystemMetrics -#undef MonitorFromWindow -#undef MonitorFromRect -#undef MonitorFromPoint -#undef EnumDisplayMonitors -#undef EnumDisplayDevices +package com.sun.media.sound; -#include "awt_MMStub.h" +import java.io.IOException; +import javax.sound.midi.MidiChannel; +import javax.sound.midi.VoiceStatus; -#define GetSystemMetricsMM _getSystemMetrics -#define MonitorFromWindow _monitorFromWindow -#define MonitorFromRect _monitorFromRect -#define MonitorFromPoint _monitorFromPoint -#define GetMonitorInfo _getMonitorInfo -#define EnumDisplayMonitors _enumDisplayMonitors -#define EnumDisplayDevices _enumDisplayDevices +/** + * This interface is used for audio streams from ModelOscillator. + * + * @author Karl Helgason + */ +public interface ModelOscillatorStream { + public void setPitch(float pitch); // Pitch is in cents! -#define CountMonitors _countMonitors -#define CollectMonitors _collectMonitors -#define MonitorBounds _monitorBounds -#define MakeDCFromMonitor _makeDCFromMonitor -#define CreateWindowOnMonitor _createWindowOM + public void noteOn(MidiChannel channel, VoiceStatus voice, int noteNumber, + int velocity); + + public void noteOff(int velocity); + + public int read(float[][] buffer, int offset, int len) throws IOException; + + public void close() throws IOException; +} diff --git a/jdk/src/share/classes/com/sun/media/sound/ModelPatch.java b/jdk/src/share/classes/com/sun/media/sound/ModelPatch.java new file mode 100644 index 00000000000..6b4c5b01df4 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/ModelPatch.java @@ -0,0 +1,52 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import javax.sound.midi.Patch; + +/** + * A extended patch object that has isPercussion function. + * Which is necessary to identify percussion instruments + * from melodic instruments. + * + * @author Karl Helgason + */ +public class ModelPatch extends Patch { + + private boolean percussion = false; + + public ModelPatch(int bank, int program) { + super(bank, program); + } + + public ModelPatch(int bank, int program, boolean percussion) { + super(bank, program); + this.percussion = percussion; + } + + public boolean isPercussion() { + return percussion; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/ModelPerformer.java b/jdk/src/share/classes/com/sun/media/sound/ModelPerformer.java new file mode 100644 index 00000000000..6ba48674c7c --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/ModelPerformer.java @@ -0,0 +1,143 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.ArrayList; +import java.util.List; + +/** + * This class is used to define how to synthesize audio in universal maner + * for both SF2 and DLS instruments. + * + * @author Karl Helgason + */ +public class ModelPerformer { + + private List oscillators = new ArrayList(); + private List connectionBlocks + = new ArrayList(); + private int keyFrom = 0; + private int keyTo = 127; + private int velFrom = 0; + private int velTo = 127; + private int exclusiveClass = 0; + private boolean releaseTrigger = false; + private boolean selfNonExclusive = false; + private Object userObject = null; + private boolean addDefaultConnections = true; + private String name = null; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getConnectionBlocks() { + return connectionBlocks; + } + + public void setConnectionBlocks(List connectionBlocks) { + this.connectionBlocks = connectionBlocks; + } + + public List getOscillators() { + return oscillators; + } + + public int getExclusiveClass() { + return exclusiveClass; + } + + public void setExclusiveClass(int exclusiveClass) { + this.exclusiveClass = exclusiveClass; + } + + public boolean isSelfNonExclusive() { + return selfNonExclusive; + } + + public void setSelfNonExclusive(boolean selfNonExclusive) { + this.selfNonExclusive = selfNonExclusive; + } + + public int getKeyFrom() { + return keyFrom; + } + + public void setKeyFrom(int keyFrom) { + this.keyFrom = keyFrom; + } + + public int getKeyTo() { + return keyTo; + } + + public void setKeyTo(int keyTo) { + this.keyTo = keyTo; + } + + public int getVelFrom() { + return velFrom; + } + + public void setVelFrom(int velFrom) { + this.velFrom = velFrom; + } + + public int getVelTo() { + return velTo; + } + + public void setVelTo(int velTo) { + this.velTo = velTo; + } + + public boolean isReleaseTriggered() { + return releaseTrigger; + } + + public void setReleaseTriggered(boolean value) { + this.releaseTrigger = value; + } + + public Object getUserObject() { + return userObject; + } + + public void setUserObject(Object object) { + userObject = object; + } + + public boolean isDefaultConnectionsEnabled() { + return addDefaultConnections; + } + + public void setDefaultConnectionsEnabled(boolean addDefaultConnections) { + this.addDefaultConnections = addDefaultConnections; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/ModelSource.java b/jdk/src/share/classes/com/sun/media/sound/ModelSource.java new file mode 100644 index 00000000000..1ad5f3e24ec --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/ModelSource.java @@ -0,0 +1,109 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * This class is used to identify sources in connection blocks, + * see ModelConnectionBlock. + * + * @author Karl Helgason + */ +public class ModelSource { + + public static final ModelIdentifier SOURCE_NONE = null; + public static final ModelIdentifier SOURCE_NOTEON_KEYNUMBER = + new ModelIdentifier("noteon", "keynumber"); // midi keynumber + public static final ModelIdentifier SOURCE_NOTEON_VELOCITY = + new ModelIdentifier("noteon", "velocity"); // midi velocity + public static final ModelIdentifier SOURCE_EG1 = + new ModelIdentifier("eg", null, 0); + public static final ModelIdentifier SOURCE_EG2 = + new ModelIdentifier("eg", null, 1); + public static final ModelIdentifier SOURCE_LFO1 = + new ModelIdentifier("lfo", null, 0); + public static final ModelIdentifier SOURCE_LFO2 = + new ModelIdentifier("lfo", null, 1); + public static final ModelIdentifier SOURCE_MIDI_PITCH = + new ModelIdentifier("midi", "pitch", 0); // (0..16383) + public static final ModelIdentifier SOURCE_MIDI_CHANNEL_PRESSURE = + new ModelIdentifier("midi", "channel_pressure", 0); // (0..127) +// public static final ModelIdentifier SOURCE_MIDI_MONO_PRESSURE = +// new ModelIdentifier("midi","mono_pressure",0); // (0..127) + public static final ModelIdentifier SOURCE_MIDI_POLY_PRESSURE = + new ModelIdentifier("midi", "poly_pressure", 0); // (0..127) + public static final ModelIdentifier SOURCE_MIDI_CC_0 = + new ModelIdentifier("midi_cc", "0", 0); // (0..127) + public static final ModelIdentifier SOURCE_MIDI_RPN_0 = + new ModelIdentifier("midi_rpn", "0", 0); // (0..16383) + private ModelIdentifier source = SOURCE_NONE; + private ModelTransform transform; + + public ModelSource() { + this.transform = new ModelStandardTransform(); + } + + public ModelSource(ModelIdentifier id) { + source = id; + this.transform = new ModelStandardTransform(); + } + + public ModelSource(ModelIdentifier id, boolean direction) { + source = id; + this.transform = new ModelStandardTransform(direction); + } + + public ModelSource(ModelIdentifier id, boolean direction, boolean polarity) { + source = id; + this.transform = new ModelStandardTransform(direction, polarity); + } + + public ModelSource(ModelIdentifier id, boolean direction, boolean polarity, + int transform) { + source = id; + this.transform = + new ModelStandardTransform(direction, polarity, transform); + } + + public ModelSource(ModelIdentifier id, ModelTransform transform) { + source = id; + this.transform = transform; + } + + public ModelIdentifier getIdentifier() { + return source; + } + + public void setIdentifier(ModelIdentifier source) { + this.source = source; + } + + public ModelTransform getTransform() { + return transform; + } + + public void setTransform(ModelTransform transform) { + this.transform = transform; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/ModelStandardDirector.java b/jdk/src/share/classes/com/sun/media/sound/ModelStandardDirector.java new file mode 100644 index 00000000000..f9c9fc21b25 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/ModelStandardDirector.java @@ -0,0 +1,86 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * A standard director who chooses performers + * by there keyfrom,keyto,velfrom,velto properties. + * + * @author Karl Helgason + */ +public class ModelStandardDirector implements ModelDirector { + + ModelPerformer[] performers; + ModelDirectedPlayer player; + boolean noteOnUsed = false; + boolean noteOffUsed = false; + + public ModelStandardDirector(ModelPerformer[] performers, + ModelDirectedPlayer player) { + this.performers = performers; + this.player = player; + for (int i = 0; i < performers.length; i++) { + ModelPerformer p = performers[i]; + if (p.isReleaseTriggered()) { + noteOffUsed = true; + } else { + noteOnUsed = true; + } + } + } + + public void close() { + } + + public void noteOff(int noteNumber, int velocity) { + if (!noteOffUsed) + return; + for (int i = 0; i < performers.length; i++) { + ModelPerformer p = performers[i]; + if (p.getKeyFrom() <= noteNumber && p.getKeyTo() >= noteNumber) { + if (p.getVelFrom() <= velocity && p.getVelTo() >= velocity) { + if (p.isReleaseTriggered()) { + player.play(i, null); + } + } + } + } + } + + public void noteOn(int noteNumber, int velocity) { + if (!noteOnUsed) + return; + for (int i = 0; i < performers.length; i++) { + ModelPerformer p = performers[i]; + if (p.getKeyFrom() <= noteNumber && p.getKeyTo() >= noteNumber) { + if (p.getVelFrom() <= velocity && p.getVelTo() >= velocity) { + if (!p.isReleaseTriggered()) { + player.play(i, null); + } + } + } + } + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/ModelStandardTransform.java b/jdk/src/share/classes/com/sun/media/sound/ModelStandardTransform.java new file mode 100644 index 00000000000..8cac033b343 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/ModelStandardTransform.java @@ -0,0 +1,139 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * A standard transformer used in connection blocks. + * It expects input values to be between 0 and 1. + * + * The result of the transform is + * between 0 and 1 if polarity = unipolar and + * between -1 and 1 if polarity = bipolar. + * + * These constraints only applies to Concave, Convex and Switch transforms. + * + * @author Karl Helgason + */ +public class ModelStandardTransform implements ModelTransform { + + public static final boolean DIRECTION_MIN2MAX = false; + public static final boolean DIRECTION_MAX2MIN = true; + public static final boolean POLARITY_UNIPOLAR = false; + public static final boolean POLARITY_BIPOLAR = true; + public static final int TRANSFORM_LINEAR = 0; + // concave: output = (20*log10(127^2/value^2)) / 96 + public static final int TRANSFORM_CONCAVE = 1; + // convex: same as concave except that start and end point are reversed. + public static final int TRANSFORM_CONVEX = 2; + // switch: if value > avg(max,min) then max else min + public static final int TRANSFORM_SWITCH = 3; + public static final int TRANSFORM_ABSOLUTE = 4; + private boolean direction = DIRECTION_MIN2MAX; + private boolean polarity = POLARITY_UNIPOLAR; + private int transform = TRANSFORM_LINEAR; + + public ModelStandardTransform() { + } + + public ModelStandardTransform(boolean direction) { + this.direction = direction; + } + + public ModelStandardTransform(boolean direction, boolean polarity) { + this.direction = direction; + this.polarity = polarity; + } + + public ModelStandardTransform(boolean direction, boolean polarity, + int transform) { + this.direction = direction; + this.polarity = polarity; + this.transform = transform; + } + + public double transform(double value) { + double s; + double a; + if (direction == DIRECTION_MAX2MIN) + value = 1.0 - value; + if (polarity == POLARITY_BIPOLAR) + value = value * 2.0 - 1.0; + switch (transform) { + case TRANSFORM_CONCAVE: + s = Math.signum(value); + a = Math.abs(value); + a = -((5.0 / 12.0) / Math.log(10)) * Math.log(1.0 - a); + if (a < 0) + a = 0; + else if (a > 1) + a = 1; + return s * a; + case TRANSFORM_CONVEX: + s = Math.signum(value); + a = Math.abs(value); + a = 1.0 + ((5.0 / 12.0) / Math.log(10)) * Math.log(a); + if (a < 0) + a = 0; + else if (a > 1) + a = 1; + return s * a; + case TRANSFORM_SWITCH: + if (polarity == POLARITY_BIPOLAR) + return (value > 0) ? 1 : -1; + else + return (value > 0.5) ? 1 : 0; + case TRANSFORM_ABSOLUTE: + return Math.abs(value); + default: + break; + } + + return value; + } + + public boolean getDirection() { + return direction; + } + + public void setDirection(boolean direction) { + this.direction = direction; + } + + public boolean getPolarity() { + return polarity; + } + + public void setPolarity(boolean polarity) { + this.polarity = polarity; + } + + public int getTransform() { + return transform; + } + + public void setTransform(int transform) { + this.transform = transform; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/ModelTransform.java b/jdk/src/share/classes/com/sun/media/sound/ModelTransform.java new file mode 100644 index 00000000000..8b12938ba77 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/ModelTransform.java @@ -0,0 +1,35 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * Model transform interface. + * + * @author Karl Helgason + */ +public interface ModelTransform { + + abstract public double transform(double value); +} diff --git a/jdk/src/share/classes/com/sun/media/sound/ModelWavetable.java b/jdk/src/share/classes/com/sun/media/sound/ModelWavetable.java new file mode 100644 index 00000000000..b162ce1a700 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/ModelWavetable.java @@ -0,0 +1,49 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * This is a wavetable oscillator interface. + * + * @author Karl Helgason + */ +public interface ModelWavetable extends ModelOscillator { + + public static final int LOOP_TYPE_OFF = 0; + public static final int LOOP_TYPE_FORWARD = 1; + public static final int LOOP_TYPE_RELEASE = 2; + public static final int LOOP_TYPE_PINGPONG = 4; + public static final int LOOP_TYPE_REVERSE = 8; + + public AudioFloatInputStream openStream(); + + public float getLoopLength(); + + public float getLoopStart(); + + public int getLoopType(); + + public float getPitchcorrection(); +} diff --git a/jdk/src/share/classes/com/sun/media/sound/Platform.java b/jdk/src/share/classes/com/sun/media/sound/Platform.java index 7dc55a50bf9..c29c0becf35 100644 --- a/jdk/src/share/classes/com/sun/media/sound/Platform.java +++ b/jdk/src/share/classes/com/sun/media/sound/Platform.java @@ -42,8 +42,6 @@ class Platform { // native library we need to load private static final String libNameMain = "jsound"; - private static final String libNameMain2 = "jsoundhs"; - private static final String libNameALSA = "jsoundalsa"; private static final String libNameDSound = "jsoundds"; @@ -158,9 +156,8 @@ class Platform { if(Printer.trace)Printer.trace(">>Platform.loadLibraries"); try { - // load the main libraries + // load the main library JSSecurityManager.loadLibrary(libNameMain); - JSSecurityManager.loadLibrary(libNameMain2); // just for the heck of it... loadedLibs |= LIB_MAIN; } catch (SecurityException e) { diff --git a/jdk/src/share/classes/com/sun/media/sound/RIFFInvalidDataException.java b/jdk/src/share/classes/com/sun/media/sound/RIFFInvalidDataException.java new file mode 100644 index 00000000000..0202b00ac8f --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/RIFFInvalidDataException.java @@ -0,0 +1,43 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * This exception is used when a RIFF file contains illegal or unexpected data. + * + * @author Karl Helgason + */ +public class RIFFInvalidDataException extends InvalidDataException { + + private static final long serialVersionUID = 1L; + + public RIFFInvalidDataException() { + super("Invalid Data!"); + } + + public RIFFInvalidDataException(String s) { + super(s); + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/RIFFInvalidFormatException.java b/jdk/src/share/classes/com/sun/media/sound/RIFFInvalidFormatException.java new file mode 100644 index 00000000000..edab090e1f2 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/RIFFInvalidFormatException.java @@ -0,0 +1,44 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * This exception is used when a reader is used to read RIFF file of a format it + * doesn't unterstand or support. + * + * @author Karl Helgason + */ +public class RIFFInvalidFormatException extends InvalidFormatException { + + private static final long serialVersionUID = 1L; + + public RIFFInvalidFormatException() { + super("Invalid format!"); + } + + public RIFFInvalidFormatException(String s) { + super(s); + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/RIFFReader.java b/jdk/src/share/classes/com/sun/media/sound/RIFFReader.java new file mode 100644 index 00000000000..3433bdecb36 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/RIFFReader.java @@ -0,0 +1,332 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; + +/** + * Resource Interchange File Format (RIFF) stream decoder. + * + * @author Karl Helgason + */ +public class RIFFReader extends InputStream { + + private RIFFReader root; + private long filepointer = 0; + private String fourcc; + private String riff_type = null; + private long ckSize = 0; + private InputStream stream; + private long avail; + private RIFFReader lastiterator = null; + + public RIFFReader(InputStream stream) throws IOException { + + if (stream instanceof RIFFReader) + root = ((RIFFReader)stream).root; + else + root = this; + + this.stream = stream; + avail = Integer.MAX_VALUE; + ckSize = Integer.MAX_VALUE; + + // Check for RIFF null paddings, + int b; + while (true) { + b = read(); + if (b == -1) { + fourcc = ""; // don't put null value into fourcc, + // because it is expected to + // always contain a string value + riff_type = null; + avail = 0; + return; + } + if (b != 0) + break; + } + + byte[] fourcc = new byte[4]; + fourcc[0] = (byte) b; + readFully(fourcc, 1, 3); + this.fourcc = new String(fourcc, "ascii"); + ckSize = readUnsignedInt(); + + avail = this.ckSize; + + if (getFormat().equals("RIFF") || getFormat().equals("LIST")) { + byte[] format = new byte[4]; + readFully(format); + this.riff_type = new String(format, "ascii"); + } + } + + public long getFilePointer() throws IOException { + return root.filepointer; + } + + public boolean hasNextChunk() throws IOException { + if (lastiterator != null) + lastiterator.finish(); + return avail != 0; + } + + public RIFFReader nextChunk() throws IOException { + if (lastiterator != null) + lastiterator.finish(); + if (avail == 0) + return null; + lastiterator = new RIFFReader(this); + return lastiterator; + } + + public String getFormat() { + return fourcc; + } + + public String getType() { + return riff_type; + } + + public long getSize() { + return ckSize; + } + + public int read() throws IOException { + if (avail == 0) + return -1; + int b = stream.read(); + if (b == -1) + return -1; + avail--; + filepointer++; + return b; + } + + public int read(byte[] b, int offset, int len) throws IOException { + if (avail == 0) + return -1; + if (len > avail) { + int rlen = stream.read(b, offset, (int)avail); + if (rlen != -1) + filepointer += rlen; + avail = 0; + return rlen; + } else { + int ret = stream.read(b, offset, len); + if (ret == -1) + return -1; + avail -= ret; + filepointer += ret; + return ret; + } + } + + public final void readFully(byte b[]) throws IOException { + readFully(b, 0, b.length); + } + + public final void readFully(byte b[], int off, int len) throws IOException { + if (len < 0) + throw new IndexOutOfBoundsException(); + while (len > 0) { + int s = read(b, off, len); + if (s < 0) + throw new EOFException(); + if (s == 0) + Thread.yield(); + off += s; + len -= s; + } + } + + public final long skipBytes(long n) throws IOException { + if (n < 0) + return 0; + long skipped = 0; + while (skipped != n) { + long s = skip(n - skipped); + if (s < 0) + break; + if (s == 0) + Thread.yield(); + skipped += s; + } + return skipped; + } + + public long skip(long n) throws IOException { + if (avail == 0) + return -1; + if (n > avail) { + long len = stream.skip(avail); + if (len != -1) + filepointer += len; + avail = 0; + return len; + } else { + long ret = stream.skip(n); + if (ret == -1) + return -1; + avail -= ret; + filepointer += ret; + return ret; + } + } + + public int available() { + return (int)avail; + } + + public void finish() throws IOException { + if (avail != 0) { + skipBytes(avail); + } + } + + // Read ASCII chars from stream + public String readString(int len) throws IOException { + byte[] buff = new byte[len]; + readFully(buff); + for (int i = 0; i < buff.length; i++) { + if (buff[i] == 0) { + return new String(buff, 0, i, "ascii"); + } + } + return new String(buff, "ascii"); + } + + // Read 8 bit signed integer from stream + public byte readByte() throws IOException { + int ch = read(); + if (ch < 0) + throw new EOFException(); + return (byte) ch; + } + + // Read 16 bit signed integer from stream + public short readShort() throws IOException { + int ch1 = read(); + int ch2 = read(); + if (ch1 < 0) + throw new EOFException(); + if (ch2 < 0) + throw new EOFException(); + return (short)(ch1 | (ch2 << 8)); + } + + // Read 32 bit signed integer from stream + public int readInt() throws IOException { + int ch1 = read(); + int ch2 = read(); + int ch3 = read(); + int ch4 = read(); + if (ch1 < 0) + throw new EOFException(); + if (ch2 < 0) + throw new EOFException(); + if (ch3 < 0) + throw new EOFException(); + if (ch4 < 0) + throw new EOFException(); + return ch1 + (ch2 << 8) | (ch3 << 16) | (ch4 << 24); + } + + // Read 64 bit signed integer from stream + public long readLong() throws IOException { + long ch1 = read(); + long ch2 = read(); + long ch3 = read(); + long ch4 = read(); + long ch5 = read(); + long ch6 = read(); + long ch7 = read(); + long ch8 = read(); + if (ch1 < 0) + throw new EOFException(); + if (ch2 < 0) + throw new EOFException(); + if (ch3 < 0) + throw new EOFException(); + if (ch4 < 0) + throw new EOFException(); + if (ch5 < 0) + throw new EOFException(); + if (ch6 < 0) + throw new EOFException(); + if (ch7 < 0) + throw new EOFException(); + if (ch8 < 0) + throw new EOFException(); + return ch1 | (ch2 << 8) | (ch3 << 16) | (ch4 << 24) + | (ch5 << 32) | (ch6 << 40) | (ch7 << 48) | (ch8 << 56); + } + + // Read 8 bit unsigned integer from stream + public int readUnsignedByte() throws IOException { + int ch = read(); + if (ch < 0) + throw new EOFException(); + return ch; + } + + // Read 16 bit unsigned integer from stream + public int readUnsignedShort() throws IOException { + int ch1 = read(); + int ch2 = read(); + if (ch1 < 0) + throw new EOFException(); + if (ch2 < 0) + throw new EOFException(); + return ch1 | (ch2 << 8); + } + + // Read 32 bit unsigned integer from stream + public long readUnsignedInt() throws IOException { + long ch1 = read(); + long ch2 = read(); + long ch3 = read(); + long ch4 = read(); + if (ch1 < 0) + throw new EOFException(); + if (ch2 < 0) + throw new EOFException(); + if (ch3 < 0) + throw new EOFException(); + if (ch4 < 0) + throw new EOFException(); + return ch1 + (ch2 << 8) | (ch3 << 16) | (ch4 << 24); + } + + public void close() throws IOException { + finish(); + if (this == root) + stream.close(); + stream = null; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/RIFFWriter.java b/jdk/src/share/classes/com/sun/media/sound/RIFFWriter.java new file mode 100644 index 00000000000..0c59f36a69f --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/RIFFWriter.java @@ -0,0 +1,365 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.OutputStream; +import java.io.RandomAccessFile; + +/** + * Resource Interchange File Format (RIFF) stream encoder. + * + * @author Karl Helgason + */ +public class RIFFWriter extends OutputStream { + + private interface RandomAccessWriter { + + public void seek(long chunksizepointer) throws IOException; + + public long getPointer() throws IOException; + + public void close() throws IOException; + + public void write(int b) throws IOException; + + public void write(byte[] b, int off, int len) throws IOException; + + public void write(byte[] bytes) throws IOException; + + public long length() throws IOException; + + public void setLength(long i) throws IOException; + } + + private static class RandomAccessFileWriter implements RandomAccessWriter { + + RandomAccessFile raf; + + public RandomAccessFileWriter(File file) throws FileNotFoundException { + this.raf = new RandomAccessFile(file, "rw"); + } + + public RandomAccessFileWriter(String name) throws FileNotFoundException { + this.raf = new RandomAccessFile(name, "rw"); + } + + public void seek(long chunksizepointer) throws IOException { + raf.seek(chunksizepointer); + } + + public long getPointer() throws IOException { + return raf.getFilePointer(); + } + + public void close() throws IOException { + raf.close(); + } + + public void write(int b) throws IOException { + raf.write(b); + } + + public void write(byte[] b, int off, int len) throws IOException { + raf.write(b, off, len); + } + + public void write(byte[] bytes) throws IOException { + raf.write(bytes); + } + + public long length() throws IOException { + return raf.length(); + } + + public void setLength(long i) throws IOException { + raf.setLength(i); + } + } + + private static class RandomAccessByteWriter implements RandomAccessWriter { + + byte[] buff = new byte[32]; + int length = 0; + int pos = 0; + byte[] s; + OutputStream stream; + + public RandomAccessByteWriter(OutputStream stream) { + this.stream = stream; + } + + public void seek(long chunksizepointer) throws IOException { + pos = (int) chunksizepointer; + } + + public long getPointer() throws IOException { + return pos; + } + + public void close() throws IOException { + stream.write(buff, 0, length); + stream.close(); + } + + public void write(int b) throws IOException { + if (s == null) + s = new byte[1]; + s[0] = (byte)b; + write(s, 0, 1); + } + + public void write(byte[] b, int off, int len) throws IOException { + int newsize = pos + len; + if (newsize > length) + setLength(newsize); + int end = off + len; + for (int i = off; i < end; i++) { + buff[pos++] = b[i]; + } + } + + public void write(byte[] bytes) throws IOException { + write(bytes, 0, bytes.length); + } + + public long length() throws IOException { + return length; + } + + public void setLength(long i) throws IOException { + length = (int) i; + if (length > buff.length) { + int newlen = Math.max(buff.length << 1, length); + byte[] newbuff = new byte[newlen]; + System.arraycopy(buff, 0, newbuff, 0, buff.length); + buff = newbuff; + } + } + } + private int chunktype = 0; // 0=RIFF, 1=LIST; 2=CHUNK + private RandomAccessWriter raf; + private long chunksizepointer; + private long startpointer; + private RIFFWriter childchunk = null; + private boolean open = true; + private boolean writeoverride = false; + + public RIFFWriter(String name, String format) throws IOException { + this(new RandomAccessFileWriter(name), format, 0); + } + + public RIFFWriter(File file, String format) throws IOException { + this(new RandomAccessFileWriter(file), format, 0); + } + + public RIFFWriter(OutputStream stream, String format) throws IOException { + this(new RandomAccessByteWriter(stream), format, 0); + } + + private RIFFWriter(RandomAccessWriter raf, String format, int chunktype) + throws IOException { + if (chunktype == 0) + if (raf.length() != 0) + raf.setLength(0); + this.raf = raf; + if (raf.getPointer() % 2 != 0) + raf.write(0); + + if (chunktype == 0) + raf.write("RIFF".getBytes("ascii")); + else if (chunktype == 1) + raf.write("LIST".getBytes("ascii")); + else + raf.write((format + " ").substring(0, 4).getBytes("ascii")); + + chunksizepointer = raf.getPointer(); + this.chunktype = 2; + writeUnsignedInt(0); + this.chunktype = chunktype; + startpointer = raf.getPointer(); + if (chunktype != 2) + raf.write((format + " ").substring(0, 4).getBytes("ascii")); + + } + + public void seek(long pos) throws IOException { + raf.seek(pos); + } + + public long getFilePointer() throws IOException { + return raf.getPointer(); + } + + public void setWriteOverride(boolean writeoverride) { + this.writeoverride = writeoverride; + } + + public boolean getWriteOverride() { + return writeoverride; + } + + public void close() throws IOException { + if (!open) + return; + if (childchunk != null) { + childchunk.close(); + childchunk = null; + } + + int bakchunktype = chunktype; + long fpointer = raf.getPointer(); + raf.seek(chunksizepointer); + chunktype = 2; + writeUnsignedInt(fpointer - startpointer); + + if (bakchunktype == 0) + raf.close(); + else + raf.seek(fpointer); + open = false; + raf = null; + } + + public void write(int b) throws IOException { + if (!writeoverride) { + if (chunktype != 2) { + throw new IllegalArgumentException( + "Only chunks can write bytes!"); + } + if (childchunk != null) { + childchunk.close(); + childchunk = null; + } + } + raf.write(b); + } + + public void write(byte b[], int off, int len) throws IOException { + if (!writeoverride) { + if (chunktype != 2) { + throw new IllegalArgumentException( + "Only chunks can write bytes!"); + } + if (childchunk != null) { + childchunk.close(); + childchunk = null; + } + } + raf.write(b, off, len); + } + + public RIFFWriter writeList(String format) throws IOException { + if (chunktype == 2) { + throw new IllegalArgumentException( + "Only LIST and RIFF can write lists!"); + } + if (childchunk != null) { + childchunk.close(); + childchunk = null; + } + childchunk = new RIFFWriter(this.raf, format, 1); + return childchunk; + } + + public RIFFWriter writeChunk(String format) throws IOException { + if (chunktype == 2) { + throw new IllegalArgumentException( + "Only LIST and RIFF can write chunks!"); + } + if (childchunk != null) { + childchunk.close(); + childchunk = null; + } + childchunk = new RIFFWriter(this.raf, format, 2); + return childchunk; + } + + // Write ASCII chars to stream + public void writeString(String string) throws IOException { + byte[] buff = string.getBytes(); + write(buff); + } + + // Write ASCII chars to stream + public void writeString(String string, int len) throws IOException { + byte[] buff = string.getBytes(); + if (buff.length > len) + write(buff, 0, len); + else { + write(buff); + for (int i = buff.length; i < len; i++) + write(0); + } + } + + // Write 8 bit signed integer to stream + public void writeByte(int b) throws IOException { + write(b); + } + + // Write 16 bit signed integer to stream + public void writeShort(short b) throws IOException { + write((b >>> 0) & 0xFF); + write((b >>> 8) & 0xFF); + } + + // Write 32 bit signed integer to stream + public void writeInt(int b) throws IOException { + write((b >>> 0) & 0xFF); + write((b >>> 8) & 0xFF); + write((b >>> 16) & 0xFF); + write((b >>> 24) & 0xFF); + } + + // Write 64 bit signed integer to stream + public void writeLong(long b) throws IOException { + write((int) (b >>> 0) & 0xFF); + write((int) (b >>> 8) & 0xFF); + write((int) (b >>> 16) & 0xFF); + write((int) (b >>> 24) & 0xFF); + write((int) (b >>> 32) & 0xFF); + write((int) (b >>> 40) & 0xFF); + write((int) (b >>> 48) & 0xFF); + write((int) (b >>> 56) & 0xFF); + } + + // Write 8 bit unsigned integer to stream + public void writeUnsignedByte(int b) throws IOException { + writeByte((byte) b); + } + + // Write 16 bit unsigned integer to stream + public void writeUnsignedShort(int b) throws IOException { + writeShort((short) b); + } + + // Write 32 bit unsigned integer to stream + public void writeUnsignedInt(long b) throws IOException { + writeInt((int) b); + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/RealTimeSequencer.java b/jdk/src/share/classes/com/sun/media/sound/RealTimeSequencer.java index 82ef73c8c8b..bdb092cbf16 100644 --- a/jdk/src/share/classes/com/sun/media/sound/RealTimeSequencer.java +++ b/jdk/src/share/classes/com/sun/media/sound/RealTimeSequencer.java @@ -54,10 +54,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon private final static boolean DEBUG_PUMP = false; private final static boolean DEBUG_PUMP_ALL = false; - - /** if true, we bridge RMF files over to the old MixerSequencer */ - private final static boolean RMF = true; - /** * Event Dispatcher thread. Should be using a shared event * dispatcher instance with a factory in EventDispatcher @@ -145,9 +141,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon private ArrayList controllerEventListeners = new ArrayList(); - /** for RMF media we need the RMF sequencer */ - private MixerSequencer seqBridge = null; - /** automatic connection support */ private boolean autoConnect = false; @@ -220,21 +213,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon playThread.setSequence(sequence); } } - if (RMF) { - if (seqBridge != null) { - seqBridge.close(); - seqBridge = null; - } - // if previous file was an RMF, but this file is not RMF, - // then need to call implOpen again! - if (isOpen() && sequence != null && playThread == null) { - try { - implOpen(); - } catch (MidiUnavailableException mue) { - if (Printer.err) mue.printStackTrace(); - } - } - } if (Printer.trace) Printer.trace("<< RealTimeSequencer: setSequence(" + sequence +") completed"); } @@ -249,52 +227,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon return; } - // need to be able to detect RMF - if (RMF) { - MidiFileFormat fileFormat = MidiSystem.getMidiFileFormat(stream); // can throw IOException, InvalidMidiDataException - int type = fileFormat.getType(); - int resolution = fileFormat.getResolution(); - if (Printer.debug) Printer.debug("Got file with type="+type+" and resolution="+resolution); - if (resolution == MidiFileFormat.UNKNOWN_LENGTH) { - // seems to be RMF - if (seqBridge == null) { - try { - seqBridge = new MixerSequencer(); - if (isOpen()) { - seqBridge.open(); - } - } catch (MidiUnavailableException mue) { - // uhum, strange situation. Need to cast to InvalidMidiDataException - throw new InvalidMidiDataException(mue.getMessage()); - } - } - seqBridge.setSequence(stream); - // propagate state - seqBridge.setTempoFactor(getTempoFactor()); - - // propagate listeners - synchronized(metaEventListeners) { - for (int i = 0 ; i < metaEventListeners.size(); i++) { - seqBridge.addMetaEventListener((MetaEventListener) (metaEventListeners.get(i))); - } - } - synchronized(controllerEventListeners) { - for (int i = 0 ; i < controllerEventListeners.size(); i++) { - ControllerListElement cve = (ControllerListElement) (controllerEventListeners.get(i)); - seqBridge.addControllerEventListener(cve.listener, cve.controllers); - } - } - // disable the current sequence of RealTimeSequencer - //setSequence((Sequence) null); -> will remove bridge again! - this.sequence = null; - return; - } - if (seqBridge != null) { - seqBridge.close(); - seqBridge = null; - } - } - Sequence seq = MidiSystem.getSequence(stream); // can throw IOException, InvalidMidiDataException setSequence(seq); @@ -305,22 +237,11 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon public Sequence getSequence() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getSequence(); - } - } return sequence; } public synchronized void start() { - if (RMF) { - if (seqBridge != null) { - seqBridge.start(); - return; - } - } if (Printer.trace) Printer.trace(">> RealTimeSequencer: start()"); // sequencer not open: throw an exception @@ -346,12 +267,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon public synchronized void stop() { - if (RMF) { - if (seqBridge != null) { - seqBridge.stop(); - return; - } - } if (Printer.trace) Printer.trace(">> RealTimeSequencer: stop()"); if (!isOpen()) { @@ -373,23 +288,11 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon public boolean isRunning() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.isRunning(); - } - } return running; } public void startRecording() { - if (RMF) { - if (seqBridge != null) { - seqBridge.startRecording(); - return; - } - } - if (!isOpen()) { throw new IllegalStateException("Sequencer not open"); } @@ -400,13 +303,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon public void stopRecording() { - if (RMF) { - if (seqBridge != null) { - seqBridge.stopRecording(); - return; - } - } - if (!isOpen()) { throw new IllegalStateException("Sequencer not open"); } @@ -415,23 +311,11 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon public boolean isRecording() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.isRecording(); - } - } return recording; } public void recordEnable(Track track, int channel) { - if (RMF) { - if (seqBridge != null) { - seqBridge.recordEnable(track, channel); - return; - } - } - if (!findTrack(track)) { throw new IllegalArgumentException("Track does not exist in the current sequence"); } @@ -449,13 +333,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon public void recordDisable(Track track) { - if (RMF) { - if (seqBridge != null) { - seqBridge.recordDisable(track); - return; - } - } - synchronized(recordingTracks) { RecordingTrack rc = RecordingTrack.get(recordingTracks, track); if (rc != null) { @@ -482,11 +359,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon public float getTempoInBPM() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getTempoInBPM(); - } - } if (Printer.trace) Printer.trace(">> RealTimeSequencer: getTempoInBPM() "); return (float) MidiUtils.convertTempo(getTempoInMPQ()); @@ -494,12 +366,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon public void setTempoInBPM(float bpm) { - if (RMF) { - if (seqBridge != null) { - seqBridge.setTempoInBPM(bpm); - return; - } - } if (Printer.trace) Printer.trace(">> RealTimeSequencer: setTempoInBPM() "); if (bpm <= 0) { // should throw IllegalArgumentException @@ -511,12 +377,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon public float getTempoInMPQ() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getTempoInMPQ(); - } - } - if (Printer.trace) Printer.trace(">> RealTimeSequencer: getTempoInMPQ() "); if (needCaching()) { @@ -537,12 +397,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon public void setTempoInMPQ(float mpq) { - if (RMF) { - if (seqBridge != null) { - seqBridge.setTempoInMPQ(mpq); - return; - } - } if (mpq <= 0) { // should throw IllegalArgumentException mpq = 1.0f; @@ -564,12 +418,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon public void setTempoFactor(float factor) { - if (RMF) { - if (seqBridge != null) { - seqBridge.setTempoFactor(factor); - return; - } - } if (factor <= 0) { // should throw IllegalArgumentException return; @@ -588,11 +436,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon public float getTempoFactor() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getTempoFactor(); - } - } if (Printer.trace) Printer.trace(">> RealTimeSequencer: getTempoFactor() "); if (needCaching()) { @@ -606,11 +449,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon public long getTickLength() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getTickLength(); - } - } if (Printer.trace) Printer.trace(">> RealTimeSequencer: getTickLength() "); if (sequence == null) { @@ -622,11 +460,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon public synchronized long getTickPosition() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getTickPosition(); - } - } if (Printer.trace) Printer.trace(">> RealTimeSequencer: getTickPosition() "); if (getDataPump() == null || sequence == null) { @@ -638,12 +471,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon public synchronized void setTickPosition(long tick) { - if (RMF) { - if (seqBridge != null) { - seqBridge.setTickPosition(tick); - return; - } - } if (tick < 0) { // should throw IllegalArgumentException return; @@ -667,12 +494,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon public long getMicrosecondLength() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getMicrosecondLength(); - } - } - if (Printer.trace) Printer.trace(">> RealTimeSequencer: getMicrosecondLength() "); if (sequence == null) { @@ -684,12 +505,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon public long getMicrosecondPosition() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getMicrosecondPosition(); - } - } - if (Printer.trace) Printer.trace(">> RealTimeSequencer: getMicrosecondPosition() "); if (getDataPump() == null || sequence == null) { @@ -702,13 +517,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon public void setMicrosecondPosition(long microseconds) { - if (RMF) { - if (seqBridge != null) { - seqBridge.setMicrosecondPosition(microseconds); - return; - } - } - if (microseconds < 0) { // should throw IllegalArgumentException return; @@ -734,33 +542,16 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon public void setMasterSyncMode(Sequencer.SyncMode sync) { - if (RMF) { - if (seqBridge != null) { - seqBridge.setMasterSyncMode(sync); - return; - } - } // not supported } public Sequencer.SyncMode getMasterSyncMode() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getMasterSyncMode(); - } - } return masterSyncMode; } public Sequencer.SyncMode[] getMasterSyncModes() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getMasterSyncModes(); - } - } - Sequencer.SyncMode[] returnedModes = new Sequencer.SyncMode[masterSyncModes.length]; System.arraycopy(masterSyncModes, 0, returnedModes, 0, masterSyncModes.length); return returnedModes; @@ -768,33 +559,16 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon public void setSlaveSyncMode(Sequencer.SyncMode sync) { - if (RMF) { - if (seqBridge != null) { - seqBridge.setSlaveSyncMode(sync); - return; - } - } // not supported } public Sequencer.SyncMode getSlaveSyncMode() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getSlaveSyncMode(); - } - } return slaveSyncMode; } public Sequencer.SyncMode[] getSlaveSyncModes() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getSlaveSyncModes(); - } - } - Sequencer.SyncMode[] returnedModes = new Sequencer.SyncMode[slaveSyncModes.length]; System.arraycopy(slaveSyncModes, 0, returnedModes, 0, slaveSyncModes.length); return returnedModes; @@ -812,12 +586,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon public synchronized void setTrackMute(int track, boolean mute) { - if (RMF) { - if (seqBridge != null) { - seqBridge.setTrackMute(track, mute); - return; - } - } int trackCount = getTrackCount(); if (track < 0 || track >= getTrackCount()) return; trackMuted = ensureBoolArraySize(trackMuted, trackCount); @@ -829,11 +597,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon public synchronized boolean getTrackMute(int track) { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getTrackMute(track); - } - } if (track < 0 || track >= getTrackCount()) return false; if (trackMuted == null || trackMuted.length <= track) return false; return trackMuted[track]; @@ -841,12 +604,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon public synchronized void setTrackSolo(int track, boolean solo) { - if (RMF) { - if (seqBridge != null) { - seqBridge.setTrackSolo(track, solo); - return; - } - } int trackCount = getTrackCount(); if (track < 0 || track >= getTrackCount()) return; trackSolo = ensureBoolArraySize(trackSolo, trackCount); @@ -858,11 +615,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon public synchronized boolean getTrackSolo(int track) { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getTrackSolo(track); - } - } if (track < 0 || track >= getTrackCount()) return false; if (trackSolo == null || trackSolo.length <= track) return false; return trackSolo[track]; @@ -870,12 +622,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon public boolean addMetaEventListener(MetaEventListener listener) { - if (RMF) { - if (seqBridge != null) { - seqBridge.addMetaEventListener(listener); - // do not return here! - } - } synchronized(metaEventListeners) { if (! metaEventListeners.contains(listener)) { @@ -887,12 +633,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon public void removeMetaEventListener(MetaEventListener listener) { - if (RMF) { - if (seqBridge != null) { - seqBridge.removeMetaEventListener(listener); - // do not return here! - } - } synchronized(metaEventListeners) { int index = metaEventListeners.indexOf(listener); if (index >= 0) { @@ -903,13 +643,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon public int[] addControllerEventListener(ControllerEventListener listener, int[] controllers) { - if (RMF) { - if (seqBridge != null) { - seqBridge.addControllerEventListener(listener, controllers); - // do not return here! - } - } - synchronized(controllerEventListeners) { // first find the listener. if we have one, add the controllers @@ -938,12 +671,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon public int[] removeControllerEventListener(ControllerEventListener listener, int[] controllers) { - if (RMF) { - if (seqBridge != null) { - seqBridge.removeControllerEventListener(listener, controllers); - // do not return here! - } - } synchronized(controllerEventListeners) { ControllerListElement cve = null; boolean flag = false; @@ -973,12 +700,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon ////////////////// LOOPING (added in 1.5) /////////////////////// public void setLoopStartPoint(long tick) { - if (RMF) { - if (seqBridge != null) { - seqBridge.setLoopStartPoint(tick); - return; - } - } if ((tick > getTickLength()) || ((loopEnd != -1) && (tick > loopEnd)) || (tick < 0)) { @@ -988,21 +709,10 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon } public long getLoopStartPoint() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getLoopStartPoint(); - } - } return loopStart; } public void setLoopEndPoint(long tick) { - if (RMF) { - if (seqBridge != null) { - seqBridge.setLoopEndPoint(tick); - return; - } - } if ((tick > getTickLength()) || ((loopStart > tick) && (tick != -1)) || (tick < -1)) { @@ -1012,21 +722,10 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon } public long getLoopEndPoint() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getLoopEndPoint(); - } - } return loopEnd; } public void setLoopCount(int count) { - if (RMF) { - if (seqBridge != null) { - seqBridge.setLoopCount(count); - return; - } - } if (count != LOOP_CONTINUOUSLY && count < 0) { throw new IllegalArgumentException("illegal value for loop count: "+count); @@ -1038,11 +737,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon } public int getLoopCount() { - if (RMF) { - if (seqBridge != null) { - return seqBridge.getLoopCount(); - } - } return loopCount; } @@ -1053,13 +747,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon */ protected void implOpen() throws MidiUnavailableException { if (Printer.trace) Printer.trace(">> RealTimeSequencer: implOpen()"); - if (RMF) { - if (seqBridge != null) { - seqBridge.open(); - if (Printer.trace) Printer.trace("<< RealTimeSequencer: -> called seqBridge.open"); - return; - } - } //openInternalSynth(); @@ -1095,12 +782,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon synth.open(); if (synth instanceof ReferenceCountingDevice) { rec = ((ReferenceCountingDevice) synth).getReceiverReferenceCounting(); - if (synth.getClass().toString().contains("com.sun.media.sound.MixerSynth") - && (synth.getDefaultSoundbank() == null)) { - // don't use this receiver if no soundbank available - rec = null; - synth.close(); - } } else { rec = synth.getReceiver(); } @@ -1147,12 +828,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon protected synchronized void implClose() { - if (RMF) { - if (seqBridge != null) { - seqBridge.close(); - // don't return here! - } - } if (Printer.trace) Printer.trace(">> RealTimeSequencer: implClose() "); if (playThread == null) { @@ -1302,12 +977,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon // OVERRIDES OF ABSTRACT MIDI DEVICE METHODS protected boolean hasReceivers() { - if (RMF) { - if (seqBridge != null) { - //RMF does not allow recording - return false; - } - } return true; } @@ -1318,12 +987,6 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon protected boolean hasTransmitters() { - if (RMF) { - if (seqBridge != null) { - //RMF does never allow setting own receivers - return false; - } - } return true; } diff --git a/jdk/src/share/classes/com/sun/media/sound/SF2GlobalRegion.java b/jdk/src/share/classes/com/sun/media/sound/SF2GlobalRegion.java new file mode 100644 index 00000000000..3740ee96b24 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SF2GlobalRegion.java @@ -0,0 +1,33 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * Soundfont global region. + * + * @author Karl Helgason + */ +public class SF2GlobalRegion extends SF2Region { +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SF2Instrument.java b/jdk/src/share/classes/com/sun/media/sound/SF2Instrument.java new file mode 100644 index 00000000000..ae44a7fe052 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SF2Instrument.java @@ -0,0 +1,911 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.sound.midi.Patch; + +/** + * Soundfont instrument. + * + * @author Karl Helgason + */ +public class SF2Instrument extends ModelInstrument { + + protected String name = ""; + protected int preset = 0; + protected int bank = 0; + protected long library = 0; + protected long genre = 0; + protected long morphology = 0; + protected SF2GlobalRegion globalregion = null; + protected List regions + = new ArrayList(); + + public SF2Instrument() { + super(null, null, null, null); + } + + public SF2Instrument(SF2Soundbank soundbank) { + super(soundbank, null, null, null); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Patch getPatch() { + if (bank == 128) + return new ModelPatch(0, preset, true); + else + return new ModelPatch(bank << 7, preset, false); + } + + public void setPatch(Patch patch) { + if (patch instanceof ModelPatch && ((ModelPatch) patch).isPercussion()) { + bank = 128; + preset = patch.getProgram(); + } else { + bank = patch.getBank() >> 7; + preset = patch.getProgram(); + } + } + + public Object getData() { + return null; + } + + public long getGenre() { + return genre; + } + + public void setGenre(long genre) { + this.genre = genre; + } + + public long getLibrary() { + return library; + } + + public void setLibrary(long library) { + this.library = library; + } + + public long getMorphology() { + return morphology; + } + + public void setMorphology(long morphology) { + this.morphology = morphology; + } + + public List getRegions() { + return regions; + } + + public SF2GlobalRegion getGlobalRegion() { + return globalregion; + } + + public void setGlobalZone(SF2GlobalRegion zone) { + globalregion = zone; + } + + public String toString() { + if (bank == 128) + return "Drumkit: " + name + " preset #" + preset; + else + return "Instrument: " + name + " bank #" + bank + + " preset #" + preset; + } + + public ModelPerformer[] getPerformers() { + int performercount = 0; + for (SF2InstrumentRegion presetzone : regions) + performercount += presetzone.getLayer().getRegions().size(); + ModelPerformer[] performers = new ModelPerformer[performercount]; + int pi = 0; + + SF2GlobalRegion presetglobal = globalregion; + for (SF2InstrumentRegion presetzone : regions) { + Map pgenerators = new HashMap(); + pgenerators.putAll(presetzone.getGenerators()); + if (presetglobal != null) + pgenerators.putAll(presetglobal.getGenerators()); + + SF2Layer layer = presetzone.getLayer(); + SF2GlobalRegion layerglobal = layer.getGlobalRegion(); + for (SF2LayerRegion layerzone : layer.getRegions()) { + ModelPerformer performer = new ModelPerformer(); + if (layerzone.getSample() != null) + performer.setName(layerzone.getSample().getName()); + else + performer.setName(layer.getName()); + + performers[pi++] = performer; + + int keyfrom = 0; + int keyto = 127; + int velfrom = 0; + int velto = 127; + + if (layerzone.contains(SF2Region.GENERATOR_EXCLUSIVECLASS)) { + performer.setExclusiveClass(layerzone.getInteger( + SF2Region.GENERATOR_EXCLUSIVECLASS)); + } + if (layerzone.contains(SF2Region.GENERATOR_KEYRANGE)) { + byte[] bytes = layerzone.getBytes( + SF2Region.GENERATOR_KEYRANGE); + if (bytes[0] >= 0) + if (bytes[0] > keyfrom) + keyfrom = bytes[0]; + if (bytes[1] >= 0) + if (bytes[1] < keyto) + keyto = bytes[1]; + } + if (layerzone.contains(SF2Region.GENERATOR_VELRANGE)) { + byte[] bytes = layerzone.getBytes( + SF2Region.GENERATOR_VELRANGE); + if (bytes[0] >= 0) + if (bytes[0] > velfrom) + velfrom = bytes[0]; + if (bytes[1] >= 0) + if (bytes[1] < velto) + velto = bytes[1]; + } + if (presetzone.contains(SF2Region.GENERATOR_KEYRANGE)) { + byte[] bytes = presetzone.getBytes( + SF2Region.GENERATOR_KEYRANGE); + if (bytes[0] > keyfrom) + keyfrom = bytes[0]; + if (bytes[1] < keyto) + keyto = bytes[1]; + } + if (presetzone.contains(SF2Region.GENERATOR_VELRANGE)) { + byte[] bytes = presetzone.getBytes( + SF2Region.GENERATOR_VELRANGE); + if (bytes[0] > velfrom) + velfrom = bytes[0]; + if (bytes[1] < velto) + velto = bytes[1]; + } + performer.setKeyFrom(keyfrom); + performer.setKeyTo(keyto); + performer.setVelFrom(velfrom); + performer.setVelTo(velto); + + int startAddrsOffset = layerzone.getShort( + SF2Region.GENERATOR_STARTADDRSOFFSET); + int endAddrsOffset = layerzone.getShort( + SF2Region.GENERATOR_ENDADDRSOFFSET); + int startloopAddrsOffset = layerzone.getShort( + SF2Region.GENERATOR_STARTLOOPADDRSOFFSET); + int endloopAddrsOffset = layerzone.getShort( + SF2Region.GENERATOR_ENDLOOPADDRSOFFSET); + + startAddrsOffset += layerzone.getShort( + SF2Region.GENERATOR_STARTADDRSCOARSEOFFSET) * 32768; + endAddrsOffset += layerzone.getShort( + SF2Region.GENERATOR_ENDADDRSCOARSEOFFSET) * 32768; + startloopAddrsOffset += layerzone.getShort( + SF2Region.GENERATOR_STARTLOOPADDRSCOARSEOFFSET) * 32768; + endloopAddrsOffset += layerzone.getShort( + SF2Region.GENERATOR_ENDLOOPADDRSCOARSEOFFSET) * 32768; + startloopAddrsOffset -= startAddrsOffset; + endloopAddrsOffset -= startAddrsOffset; + + SF2Sample sample = layerzone.getSample(); + int rootkey = sample.originalPitch; + if (layerzone.getShort(SF2Region.GENERATOR_OVERRIDINGROOTKEY) != -1) { + rootkey = layerzone.getShort( + SF2Region.GENERATOR_OVERRIDINGROOTKEY); + } + float pitchcorrection = (-rootkey * 100) + sample.pitchCorrection; + ModelByteBuffer buff = sample.getDataBuffer(); + ModelByteBuffer buff24 = sample.getData24Buffer(); + + if (startAddrsOffset != 0 || endAddrsOffset != 0) { + buff = buff.subbuffer(startAddrsOffset * 2, + buff.capacity() + endAddrsOffset * 2); + if (buff24 != null) { + buff24 = buff24.subbuffer(startAddrsOffset, + buff24.capacity() + endAddrsOffset); + } + + /* + if (startAddrsOffset < 0) + startAddrsOffset = 0; + if (endAddrsOffset > (buff.capacity()/2-startAddrsOffset)) + startAddrsOffset = (int)buff.capacity()/2-startAddrsOffset; + byte[] data = buff.array(); + int off = (int)buff.arrayOffset() + startAddrsOffset*2; + int len = (int)buff.capacity() + endAddrsOffset*2; + if (off+len > data.length) + len = data.length - off; + buff = new ModelByteBuffer(data, off, len); + if(buff24 != null) { + data = buff.array(); + off = (int)buff.arrayOffset() + startAddrsOffset; + len = (int)buff.capacity() + endAddrsOffset; + buff24 = new ModelByteBuffer(data, off, len); + } + */ + } + + ModelByteBufferWavetable osc = new ModelByteBufferWavetable( + buff, sample.getFormat(), pitchcorrection); + if (buff24 != null) + osc.set8BitExtensionBuffer(buff24); + + Map generators = new HashMap(); + if (layerglobal != null) + generators.putAll(layerglobal.getGenerators()); + generators.putAll(layerzone.getGenerators()); + for (Map.Entry gen : pgenerators.entrySet()) { + short val; + if (!generators.containsKey(gen.getKey())) + val = layerzone.getShort(gen.getKey()); + else + val = generators.get(gen.getKey()); + val += gen.getValue(); + generators.put(gen.getKey(), val); + } + + // SampleMode: + // 0 indicates a sound reproduced with no loop + // 1 indicates a sound which loops continuously + // 2 is unused but should be interpreted as indicating no loop + // 3 indicates a sound which loops for the duration of key + // depression then proceeds to play the remainder of the sample. + int sampleMode = getGeneratorValue(generators, + SF2Region.GENERATOR_SAMPLEMODES); + if ((sampleMode == 1) || (sampleMode == 3)) { + if (sample.startLoop >= 0 && sample.endLoop > 0) { + osc.setLoopStart((int)(sample.startLoop + + startloopAddrsOffset)); + osc.setLoopLength((int)(sample.endLoop - sample.startLoop + + endloopAddrsOffset - startloopAddrsOffset)); + if (sampleMode == 1) + osc.setLoopType(ModelWavetable.LOOP_TYPE_FORWARD); + if (sampleMode == 3) + osc.setLoopType(ModelWavetable.LOOP_TYPE_RELEASE); + } + } + performer.getOscillators().add(osc); + + + short volDelay = getGeneratorValue(generators, + SF2Region.GENERATOR_DELAYVOLENV); + short volAttack = getGeneratorValue(generators, + SF2Region.GENERATOR_ATTACKVOLENV); + short volHold = getGeneratorValue(generators, + SF2Region.GENERATOR_HOLDVOLENV); + short volDecay = getGeneratorValue(generators, + SF2Region.GENERATOR_DECAYVOLENV); + short volSustain = getGeneratorValue(generators, + SF2Region.GENERATOR_SUSTAINVOLENV); + short volRelease = getGeneratorValue(generators, + SF2Region.GENERATOR_RELEASEVOLENV); + + if (volHold != -12000) { + short volKeyNumToHold = getGeneratorValue(generators, + SF2Region.GENERATOR_KEYNUMTOVOLENVHOLD); + volHold += 60 * volKeyNumToHold; + float fvalue = -volKeyNumToHold * 128; + ModelIdentifier src = ModelSource.SOURCE_NOTEON_KEYNUMBER; + ModelIdentifier dest = ModelDestination.DESTINATION_EG1_HOLD; + performer.getConnectionBlocks().add( + new ModelConnectionBlock(new ModelSource(src), fvalue, + new ModelDestination(dest))); + } + if (volDecay != -12000) { + short volKeyNumToDecay = getGeneratorValue(generators, + SF2Region.GENERATOR_KEYNUMTOVOLENVDECAY); + volDecay += 60 * volKeyNumToDecay; + float fvalue = -volKeyNumToDecay * 128; + ModelIdentifier src = ModelSource.SOURCE_NOTEON_KEYNUMBER; + ModelIdentifier dest = ModelDestination.DESTINATION_EG1_DECAY; + performer.getConnectionBlocks().add( + new ModelConnectionBlock(new ModelSource(src), fvalue, + new ModelDestination(dest))); + } + + addTimecentValue(performer, + ModelDestination.DESTINATION_EG1_DELAY, volDelay); + addTimecentValue(performer, + ModelDestination.DESTINATION_EG1_ATTACK, volAttack); + addTimecentValue(performer, + ModelDestination.DESTINATION_EG1_HOLD, volHold); + addTimecentValue(performer, + ModelDestination.DESTINATION_EG1_DECAY, volDecay); + //float fvolsustain = (960-volSustain)*(1000.0f/960.0f); + + volSustain = (short)(1000 - volSustain); + if (volSustain < 0) + volSustain = 0; + if (volSustain > 1000) + volSustain = 1000; + + addValue(performer, + ModelDestination.DESTINATION_EG1_SUSTAIN, volSustain); + addTimecentValue(performer, + ModelDestination.DESTINATION_EG1_RELEASE, volRelease); + + if (getGeneratorValue(generators, + SF2Region.GENERATOR_MODENVTOFILTERFC) != 0 + || getGeneratorValue(generators, + SF2Region.GENERATOR_MODENVTOPITCH) != 0) { + short modDelay = getGeneratorValue(generators, + SF2Region.GENERATOR_DELAYMODENV); + short modAttack = getGeneratorValue(generators, + SF2Region.GENERATOR_ATTACKMODENV); + short modHold = getGeneratorValue(generators, + SF2Region.GENERATOR_HOLDMODENV); + short modDecay = getGeneratorValue(generators, + SF2Region.GENERATOR_DECAYMODENV); + short modSustain = getGeneratorValue(generators, + SF2Region.GENERATOR_SUSTAINMODENV); + short modRelease = getGeneratorValue(generators, + SF2Region.GENERATOR_RELEASEMODENV); + + + if (modHold != -12000) { + short modKeyNumToHold = getGeneratorValue(generators, + SF2Region.GENERATOR_KEYNUMTOMODENVHOLD); + modHold += 60 * modKeyNumToHold; + float fvalue = -modKeyNumToHold * 128; + ModelIdentifier src = ModelSource.SOURCE_NOTEON_KEYNUMBER; + ModelIdentifier dest = ModelDestination.DESTINATION_EG2_HOLD; + performer.getConnectionBlocks().add( + new ModelConnectionBlock(new ModelSource(src), + fvalue, new ModelDestination(dest))); + } + if (modDecay != -12000) { + short modKeyNumToDecay = getGeneratorValue(generators, + SF2Region.GENERATOR_KEYNUMTOMODENVDECAY); + modDecay += 60 * modKeyNumToDecay; + float fvalue = -modKeyNumToDecay * 128; + ModelIdentifier src = ModelSource.SOURCE_NOTEON_KEYNUMBER; + ModelIdentifier dest = ModelDestination.DESTINATION_EG2_DECAY; + performer.getConnectionBlocks().add( + new ModelConnectionBlock(new ModelSource(src), + fvalue, new ModelDestination(dest))); + } + + addTimecentValue(performer, + ModelDestination.DESTINATION_EG2_DELAY, modDelay); + addTimecentValue(performer, + ModelDestination.DESTINATION_EG2_ATTACK, modAttack); + addTimecentValue(performer, + ModelDestination.DESTINATION_EG2_HOLD, modHold); + addTimecentValue(performer, + ModelDestination.DESTINATION_EG2_DECAY, modDecay); + if (modSustain < 0) + modSustain = 0; + if (modSustain > 1000) + modSustain = 1000; + addValue(performer, ModelDestination.DESTINATION_EG2_SUSTAIN, + 1000 - modSustain); + addTimecentValue(performer, + ModelDestination.DESTINATION_EG2_RELEASE, modRelease); + + if (getGeneratorValue(generators, + SF2Region.GENERATOR_MODENVTOFILTERFC) != 0) { + double fvalue = getGeneratorValue(generators, + SF2Region.GENERATOR_MODENVTOFILTERFC); + ModelIdentifier src = ModelSource.SOURCE_EG2; + ModelIdentifier dest + = ModelDestination.DESTINATION_FILTER_FREQ; + performer.getConnectionBlocks().add( + new ModelConnectionBlock(new ModelSource(src), + fvalue, new ModelDestination(dest))); + } + + if (getGeneratorValue(generators, + SF2Region.GENERATOR_MODENVTOPITCH) != 0) { + double fvalue = getGeneratorValue(generators, + SF2Region.GENERATOR_MODENVTOPITCH); + ModelIdentifier src = ModelSource.SOURCE_EG2; + ModelIdentifier dest = ModelDestination.DESTINATION_PITCH; + performer.getConnectionBlocks().add( + new ModelConnectionBlock(new ModelSource(src), + fvalue, new ModelDestination(dest))); + } + + } + + if (getGeneratorValue(generators, + SF2Region.GENERATOR_MODLFOTOFILTERFC) != 0 + || getGeneratorValue(generators, + SF2Region.GENERATOR_MODLFOTOPITCH) != 0 + || getGeneratorValue(generators, + SF2Region.GENERATOR_MODLFOTOVOLUME) != 0) { + short lfo_freq = getGeneratorValue(generators, + SF2Region.GENERATOR_FREQMODLFO); + short lfo_delay = getGeneratorValue(generators, + SF2Region.GENERATOR_DELAYMODLFO); + addTimecentValue(performer, + ModelDestination.DESTINATION_LFO1_DELAY, lfo_delay); + addValue(performer, + ModelDestination.DESTINATION_LFO1_FREQ, lfo_freq); + } + + short vib_freq = getGeneratorValue(generators, + SF2Region.GENERATOR_FREQVIBLFO); + short vib_delay = getGeneratorValue(generators, + SF2Region.GENERATOR_DELAYVIBLFO); + addTimecentValue(performer, + ModelDestination.DESTINATION_LFO2_DELAY, vib_delay); + addValue(performer, + ModelDestination.DESTINATION_LFO2_FREQ, vib_freq); + + + if (getGeneratorValue(generators, + SF2Region.GENERATOR_VIBLFOTOPITCH) != 0) { + double fvalue = getGeneratorValue(generators, + SF2Region.GENERATOR_VIBLFOTOPITCH); + ModelIdentifier src = ModelSource.SOURCE_LFO2; + ModelIdentifier dest = ModelDestination.DESTINATION_PITCH; + performer.getConnectionBlocks().add( + new ModelConnectionBlock( + new ModelSource(src, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR), + fvalue, new ModelDestination(dest))); + } + + if (getGeneratorValue(generators, + SF2Region.GENERATOR_MODLFOTOFILTERFC) != 0) { + double fvalue = getGeneratorValue(generators, + SF2Region.GENERATOR_MODLFOTOFILTERFC); + ModelIdentifier src = ModelSource.SOURCE_LFO1; + ModelIdentifier dest = ModelDestination.DESTINATION_FILTER_FREQ; + performer.getConnectionBlocks().add( + new ModelConnectionBlock( + new ModelSource(src, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR), + fvalue, new ModelDestination(dest))); + } + + if (getGeneratorValue(generators, + SF2Region.GENERATOR_MODLFOTOPITCH) != 0) { + double fvalue = getGeneratorValue(generators, + SF2Region.GENERATOR_MODLFOTOPITCH); + ModelIdentifier src = ModelSource.SOURCE_LFO1; + ModelIdentifier dest = ModelDestination.DESTINATION_PITCH; + performer.getConnectionBlocks().add( + new ModelConnectionBlock( + new ModelSource(src, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR), + fvalue, new ModelDestination(dest))); + } + + if (getGeneratorValue(generators, + SF2Region.GENERATOR_MODLFOTOVOLUME) != 0) { + double fvalue = getGeneratorValue(generators, + SF2Region.GENERATOR_MODLFOTOVOLUME); + ModelIdentifier src = ModelSource.SOURCE_LFO1; + ModelIdentifier dest = ModelDestination.DESTINATION_GAIN; + performer.getConnectionBlocks().add( + new ModelConnectionBlock( + new ModelSource(src, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR), + fvalue, new ModelDestination(dest))); + } + + if (layerzone.getShort(SF2Region.GENERATOR_KEYNUM) != -1) { + double val = layerzone.getShort(SF2Region.GENERATOR_KEYNUM)/128.0; + addValue(performer, ModelDestination.DESTINATION_KEYNUMBER, val); + } + + if (layerzone.getShort(SF2Region.GENERATOR_VELOCITY) != -1) { + double val = layerzone.getShort(SF2Region.GENERATOR_VELOCITY) + / 128.0; + addValue(performer, ModelDestination.DESTINATION_VELOCITY, val); + } + + if (getGeneratorValue(generators, + SF2Region.GENERATOR_INITIALFILTERFC) < 13500) { + short filter_freq = getGeneratorValue(generators, + SF2Region.GENERATOR_INITIALFILTERFC); + short filter_q = getGeneratorValue(generators, + SF2Region.GENERATOR_INITIALFILTERQ); + addValue(performer, + ModelDestination.DESTINATION_FILTER_FREQ, filter_freq); + addValue(performer, + ModelDestination.DESTINATION_FILTER_Q, filter_q); + } + + int tune = 100 * getGeneratorValue(generators, + SF2Region.GENERATOR_COARSETUNE); + tune += getGeneratorValue(generators, + SF2Region.GENERATOR_FINETUNE); + if (tune != 0) { + addValue(performer, + ModelDestination.DESTINATION_PITCH, (short) tune); + } + if (getGeneratorValue(generators, SF2Region.GENERATOR_PAN) != 0) { + short val = getGeneratorValue(generators, + SF2Region.GENERATOR_PAN); + addValue(performer, ModelDestination.DESTINATION_PAN, val); + } + if (getGeneratorValue(generators, SF2Region.GENERATOR_INITIALATTENUATION) != 0) { + short val = getGeneratorValue(generators, + SF2Region.GENERATOR_INITIALATTENUATION); + addValue(performer, + ModelDestination.DESTINATION_GAIN, -0.376287f * val); + } + if (getGeneratorValue(generators, + SF2Region.GENERATOR_CHORUSEFFECTSSEND) != 0) { + short val = getGeneratorValue(generators, + SF2Region.GENERATOR_CHORUSEFFECTSSEND); + addValue(performer, ModelDestination.DESTINATION_CHORUS, val); + } + if (getGeneratorValue(generators, + SF2Region.GENERATOR_REVERBEFFECTSSEND) != 0) { + short val = getGeneratorValue(generators, + SF2Region.GENERATOR_REVERBEFFECTSSEND); + addValue(performer, ModelDestination.DESTINATION_REVERB, val); + } + if (getGeneratorValue(generators, + SF2Region.GENERATOR_SCALETUNING) != 100) { + short fvalue = getGeneratorValue(generators, + SF2Region.GENERATOR_SCALETUNING); + if (fvalue == 0) { + ModelIdentifier dest = ModelDestination.DESTINATION_PITCH; + performer.getConnectionBlocks().add( + new ModelConnectionBlock(null, rootkey * 100, + new ModelDestination(dest))); + } else { + ModelIdentifier dest = ModelDestination.DESTINATION_PITCH; + performer.getConnectionBlocks().add( + new ModelConnectionBlock(null, rootkey * (100 - fvalue), + new ModelDestination(dest))); + } + + ModelIdentifier src = ModelSource.SOURCE_NOTEON_KEYNUMBER; + ModelIdentifier dest = ModelDestination.DESTINATION_PITCH; + performer.getConnectionBlocks().add( + new ModelConnectionBlock(new ModelSource(src), + 128 * fvalue, new ModelDestination(dest))); + + } + + performer.getConnectionBlocks().add( + new ModelConnectionBlock( + new ModelSource(ModelSource.SOURCE_NOTEON_VELOCITY, + new ModelTransform() { + public double transform(double value) { + if (value < 0.5) + return 1 - value * 2; + else + return 0; + } + }), + -2400, + new ModelDestination( + ModelDestination.DESTINATION_FILTER_FREQ))); + + + performer.getConnectionBlocks().add( + new ModelConnectionBlock( + new ModelSource(ModelSource.SOURCE_LFO2, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + new ModelSource(new ModelIdentifier("midi_cc", "1", 0), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 50, new ModelDestination( + ModelDestination.DESTINATION_PITCH))); + + if (layer.getGlobalRegion() != null) { + for (SF2Modulator modulator + : layer.getGlobalRegion().getModulators()) { + convertModulator(performer, modulator); + } + } + for (SF2Modulator modulator : layerzone.getModulators()) + convertModulator(performer, modulator); + + if (presetglobal != null) { + for (SF2Modulator modulator : presetglobal.getModulators()) + convertModulator(performer, modulator); + } + for (SF2Modulator modulator : presetzone.getModulators()) + convertModulator(performer, modulator); + + } + } + return performers; + } + + private void convertModulator(ModelPerformer performer, + SF2Modulator modulator) { + ModelSource src1 = convertSource(modulator.getSourceOperator()); + ModelSource src2 = convertSource(modulator.getAmountSourceOperator()); + if (src1 == null && modulator.getSourceOperator() != 0) + return; + if (src2 == null && modulator.getAmountSourceOperator() != 0) + return; + double amount = modulator.getAmount(); + double[] amountcorrection = new double[1]; + ModelSource[] extrasrc = new ModelSource[1]; + amountcorrection[0] = 1; + ModelDestination dst = convertDestination( + modulator.getDestinationOperator(), amountcorrection, extrasrc); + amount *= amountcorrection[0]; + if (dst == null) + return; + if (modulator.getTransportOperator() == SF2Modulator.TRANSFORM_ABSOLUTE) { + ((ModelStandardTransform)dst.getTransform()).setTransform( + ModelStandardTransform.TRANSFORM_ABSOLUTE); + } + ModelConnectionBlock conn = new ModelConnectionBlock(src1, src2, amount, dst); + if (extrasrc[0] != null) + conn.addSource(extrasrc[0]); + performer.getConnectionBlocks().add(conn); + + } + + private static ModelSource convertSource(int src) { + if (src == 0) + return null; + ModelIdentifier id = null; + int idsrc = src & 0x7F; + if ((src & SF2Modulator.SOURCE_MIDI_CONTROL) != 0) { + id = new ModelIdentifier("midi_cc", Integer.toString(idsrc)); + } else { + if (idsrc == SF2Modulator.SOURCE_NOTE_ON_VELOCITY) + id = ModelSource.SOURCE_NOTEON_VELOCITY; + if (idsrc == SF2Modulator.SOURCE_NOTE_ON_KEYNUMBER) + id = ModelSource.SOURCE_NOTEON_KEYNUMBER; + if (idsrc == SF2Modulator.SOURCE_POLY_PRESSURE) + id = ModelSource.SOURCE_MIDI_POLY_PRESSURE; + if (idsrc == SF2Modulator.SOURCE_CHANNEL_PRESSURE) + id = ModelSource.SOURCE_MIDI_CHANNEL_PRESSURE; + if (idsrc == SF2Modulator.SOURCE_PITCH_WHEEL) + id = ModelSource.SOURCE_MIDI_PITCH; + if (idsrc == SF2Modulator.SOURCE_PITCH_SENSITIVITY) + id = new ModelIdentifier("midi_rpn", "0"); + } + if (id == null) + return null; + + ModelSource msrc = new ModelSource(id); + ModelStandardTransform transform + = (ModelStandardTransform) msrc.getTransform(); + + if ((SF2Modulator.SOURCE_DIRECTION_MAX_MIN & src) != 0) + transform.setDirection(ModelStandardTransform.DIRECTION_MAX2MIN); + else + transform.setDirection(ModelStandardTransform.DIRECTION_MIN2MAX); + + if ((SF2Modulator.SOURCE_POLARITY_BIPOLAR & src) != 0) + transform.setPolarity(ModelStandardTransform.POLARITY_BIPOLAR); + else + transform.setPolarity(ModelStandardTransform.POLARITY_UNIPOLAR); + + if ((SF2Modulator.SOURCE_TYPE_CONCAVE & src) != 0) + transform.setTransform(ModelStandardTransform.TRANSFORM_CONCAVE); + if ((SF2Modulator.SOURCE_TYPE_CONVEX & src) != 0) + transform.setTransform(ModelStandardTransform.TRANSFORM_CONVEX); + if ((SF2Modulator.SOURCE_TYPE_SWITCH & src) != 0) + transform.setTransform(ModelStandardTransform.TRANSFORM_SWITCH); + + return msrc; + } + + protected static ModelDestination convertDestination(int dst, + double[] amountcorrection, ModelSource[] extrasrc) { + ModelIdentifier id = null; + switch (dst) { + case SF2Region.GENERATOR_INITIALFILTERFC: + id = ModelDestination.DESTINATION_FILTER_FREQ; + break; + case SF2Region.GENERATOR_INITIALFILTERQ: + id = ModelDestination.DESTINATION_FILTER_Q; + break; + case SF2Region.GENERATOR_CHORUSEFFECTSSEND: + id = ModelDestination.DESTINATION_CHORUS; + break; + case SF2Region.GENERATOR_REVERBEFFECTSSEND: + id = ModelDestination.DESTINATION_REVERB; + break; + case SF2Region.GENERATOR_PAN: + id = ModelDestination.DESTINATION_PAN; + break; + case SF2Region.GENERATOR_DELAYMODLFO: + id = ModelDestination.DESTINATION_LFO1_DELAY; + break; + case SF2Region.GENERATOR_FREQMODLFO: + id = ModelDestination.DESTINATION_LFO1_FREQ; + break; + case SF2Region.GENERATOR_DELAYVIBLFO: + id = ModelDestination.DESTINATION_LFO2_DELAY; + break; + case SF2Region.GENERATOR_FREQVIBLFO: + id = ModelDestination.DESTINATION_LFO2_FREQ; + break; + + case SF2Region.GENERATOR_DELAYMODENV: + id = ModelDestination.DESTINATION_EG2_DELAY; + break; + case SF2Region.GENERATOR_ATTACKMODENV: + id = ModelDestination.DESTINATION_EG2_ATTACK; + break; + case SF2Region.GENERATOR_HOLDMODENV: + id = ModelDestination.DESTINATION_EG2_HOLD; + break; + case SF2Region.GENERATOR_DECAYMODENV: + id = ModelDestination.DESTINATION_EG2_DECAY; + break; + case SF2Region.GENERATOR_SUSTAINMODENV: + id = ModelDestination.DESTINATION_EG2_SUSTAIN; + amountcorrection[0] = -1; + break; + case SF2Region.GENERATOR_RELEASEMODENV: + id = ModelDestination.DESTINATION_EG2_RELEASE; + break; + case SF2Region.GENERATOR_DELAYVOLENV: + id = ModelDestination.DESTINATION_EG1_DELAY; + break; + case SF2Region.GENERATOR_ATTACKVOLENV: + id = ModelDestination.DESTINATION_EG1_ATTACK; + break; + case SF2Region.GENERATOR_HOLDVOLENV: + id = ModelDestination.DESTINATION_EG1_HOLD; + break; + case SF2Region.GENERATOR_DECAYVOLENV: + id = ModelDestination.DESTINATION_EG1_DECAY; + break; + case SF2Region.GENERATOR_SUSTAINVOLENV: + id = ModelDestination.DESTINATION_EG1_SUSTAIN; + amountcorrection[0] = -1; + break; + case SF2Region.GENERATOR_RELEASEVOLENV: + id = ModelDestination.DESTINATION_EG1_RELEASE; + break; + case SF2Region.GENERATOR_KEYNUM: + id = ModelDestination.DESTINATION_KEYNUMBER; + break; + case SF2Region.GENERATOR_VELOCITY: + id = ModelDestination.DESTINATION_VELOCITY; + break; + + case SF2Region.GENERATOR_COARSETUNE: + amountcorrection[0] = 100; + id = ModelDestination.DESTINATION_PITCH; + break; + + case SF2Region.GENERATOR_FINETUNE: + id = ModelDestination.DESTINATION_PITCH; + break; + + case SF2Region.GENERATOR_INITIALATTENUATION: + id = ModelDestination.DESTINATION_GAIN; + amountcorrection[0] = -0.376287f; + break; + + case SF2Region.GENERATOR_VIBLFOTOPITCH: + id = ModelDestination.DESTINATION_PITCH; + extrasrc[0] = new ModelSource( + ModelSource.SOURCE_LFO2, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR); + break; + + case SF2Region.GENERATOR_MODLFOTOPITCH: + id = ModelDestination.DESTINATION_PITCH; + extrasrc[0] = new ModelSource( + ModelSource.SOURCE_LFO1, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR); + break; + + case SF2Region.GENERATOR_MODLFOTOFILTERFC: + id = ModelDestination.DESTINATION_FILTER_FREQ; + extrasrc[0] = new ModelSource( + ModelSource.SOURCE_LFO1, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR); + break; + + case SF2Region.GENERATOR_MODLFOTOVOLUME: + id = ModelDestination.DESTINATION_GAIN; + amountcorrection[0] = -0.376287f; + extrasrc[0] = new ModelSource( + ModelSource.SOURCE_LFO1, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR); + break; + + case SF2Region.GENERATOR_MODENVTOPITCH: + id = ModelDestination.DESTINATION_PITCH; + extrasrc[0] = new ModelSource( + ModelSource.SOURCE_EG2, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR); + break; + + case SF2Region.GENERATOR_MODENVTOFILTERFC: + id = ModelDestination.DESTINATION_FILTER_FREQ; + extrasrc[0] = new ModelSource( + ModelSource.SOURCE_EG2, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR); + break; + + default: + break; + } + if (id != null) + return new ModelDestination(id); + return null; + } + + private void addTimecentValue(ModelPerformer performer, + ModelIdentifier dest, short value) { + double fvalue; + if (value == -12000) + fvalue = Double.NEGATIVE_INFINITY; + else + fvalue = value; + performer.getConnectionBlocks().add( + new ModelConnectionBlock(fvalue, new ModelDestination(dest))); + } + + private void addValue(ModelPerformer performer, + ModelIdentifier dest, short value) { + double fvalue = value; + performer.getConnectionBlocks().add( + new ModelConnectionBlock(fvalue, new ModelDestination(dest))); + } + + private void addValue(ModelPerformer performer, + ModelIdentifier dest, double value) { + double fvalue = value; + performer.getConnectionBlocks().add( + new ModelConnectionBlock(fvalue, new ModelDestination(dest))); + } + + private short getGeneratorValue(Map generators, int gen) { + if (generators.containsKey(gen)) + return generators.get(gen); + return SF2Region.getDefaultValue(gen); + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SF2InstrumentRegion.java b/jdk/src/share/classes/com/sun/media/sound/SF2InstrumentRegion.java new file mode 100644 index 00000000000..a1a09eda54d --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SF2InstrumentRegion.java @@ -0,0 +1,43 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * Soundfont instrument region. + * + * @author Karl Helgason + */ +public class SF2InstrumentRegion extends SF2Region { + + protected SF2Layer layer; + + public SF2Layer getLayer() { + return layer; + } + + public void setLayer(SF2Layer layer) { + this.layer = layer; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SF2Layer.java b/jdk/src/share/classes/com/sun/media/sound/SF2Layer.java new file mode 100644 index 00000000000..7af78a35fc1 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SF2Layer.java @@ -0,0 +1,78 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.ArrayList; +import java.util.List; + +import javax.sound.midi.SoundbankResource; + +/** + * Soundfont layer. + * + * @author Karl Helgason + */ +public class SF2Layer extends SoundbankResource { + + protected String name = ""; + protected SF2GlobalRegion globalregion = null; + protected List regions = new ArrayList(); + + public SF2Layer(SF2Soundbank soundBank) { + super(soundBank, null, null); + } + + public SF2Layer() { + super(null, null, null); + } + + public Object getData() { + return null; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getRegions() { + return regions; + } + + public SF2GlobalRegion getGlobalRegion() { + return globalregion; + } + + public void setGlobalZone(SF2GlobalRegion zone) { + globalregion = zone; + } + + public String toString() { + return "Layer: " + name; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SF2LayerRegion.java b/jdk/src/share/classes/com/sun/media/sound/SF2LayerRegion.java new file mode 100644 index 00000000000..c2006497e0d --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SF2LayerRegion.java @@ -0,0 +1,43 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * Soundfont layer region. + * + * @author Karl Helgason + */ +public class SF2LayerRegion extends SF2Region { + + protected SF2Sample sample; + + public SF2Sample getSample() { + return sample; + } + + public void setSample(SF2Sample sample) { + this.sample = sample; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SF2Modulator.java b/jdk/src/share/classes/com/sun/media/sound/SF2Modulator.java new file mode 100644 index 00000000000..4851fb12723 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SF2Modulator.java @@ -0,0 +1,97 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * Soundfont modulator container. + * + * @author Karl Helgason + */ +public class SF2Modulator { + + public final static int SOURCE_NONE = 0; + public final static int SOURCE_NOTE_ON_VELOCITY = 2; + public final static int SOURCE_NOTE_ON_KEYNUMBER = 3; + public final static int SOURCE_POLY_PRESSURE = 10; + public final static int SOURCE_CHANNEL_PRESSURE = 13; + public final static int SOURCE_PITCH_WHEEL = 14; + public final static int SOURCE_PITCH_SENSITIVITY = 16; + public final static int SOURCE_MIDI_CONTROL = 128 * 1; + public final static int SOURCE_DIRECTION_MIN_MAX = 256 * 0; + public final static int SOURCE_DIRECTION_MAX_MIN = 256 * 1; + public final static int SOURCE_POLARITY_UNIPOLAR = 512 * 0; + public final static int SOURCE_POLARITY_BIPOLAR = 512 * 1; + public final static int SOURCE_TYPE_LINEAR = 1024 * 0; + public final static int SOURCE_TYPE_CONCAVE = 1024 * 1; + public final static int SOURCE_TYPE_CONVEX = 1024 * 2; + public final static int SOURCE_TYPE_SWITCH = 1024 * 3; + public final static int TRANSFORM_LINEAR = 0; + public final static int TRANSFORM_ABSOLUTE = 2; + protected int sourceOperator; + protected int destinationOperator; + protected short amount; + protected int amountSourceOperator; + protected int transportOperator; + + public short getAmount() { + return amount; + } + + public void setAmount(short amount) { + this.amount = amount; + } + + public int getAmountSourceOperator() { + return amountSourceOperator; + } + + public void setAmountSourceOperator(int amountSourceOperator) { + this.amountSourceOperator = amountSourceOperator; + } + + public int getTransportOperator() { + return transportOperator; + } + + public void setTransportOperator(int transportOperator) { + this.transportOperator = transportOperator; + } + + public int getDestinationOperator() { + return destinationOperator; + } + + public void setDestinationOperator(int destinationOperator) { + this.destinationOperator = destinationOperator; + } + + public int getSourceOperator() { + return sourceOperator; + } + + public void setSourceOperator(int sourceOperator) { + this.sourceOperator = sourceOperator; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SF2Region.java b/jdk/src/share/classes/com/sun/media/sound/SF2Region.java new file mode 100644 index 00000000000..3acef4382a3 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SF2Region.java @@ -0,0 +1,167 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Soundfont general region. + * + * @author Karl Helgason + */ +public class SF2Region { + + public final static int GENERATOR_STARTADDRSOFFSET = 0; + public final static int GENERATOR_ENDADDRSOFFSET = 1; + public final static int GENERATOR_STARTLOOPADDRSOFFSET = 2; + public final static int GENERATOR_ENDLOOPADDRSOFFSET = 3; + public final static int GENERATOR_STARTADDRSCOARSEOFFSET = 4; + public final static int GENERATOR_MODLFOTOPITCH = 5; + public final static int GENERATOR_VIBLFOTOPITCH = 6; + public final static int GENERATOR_MODENVTOPITCH = 7; + public final static int GENERATOR_INITIALFILTERFC = 8; + public final static int GENERATOR_INITIALFILTERQ = 9; + public final static int GENERATOR_MODLFOTOFILTERFC = 10; + public final static int GENERATOR_MODENVTOFILTERFC = 11; + public final static int GENERATOR_ENDADDRSCOARSEOFFSET = 12; + public final static int GENERATOR_MODLFOTOVOLUME = 13; + public final static int GENERATOR_UNUSED1 = 14; + public final static int GENERATOR_CHORUSEFFECTSSEND = 15; + public final static int GENERATOR_REVERBEFFECTSSEND = 16; + public final static int GENERATOR_PAN = 17; + public final static int GENERATOR_UNUSED2 = 18; + public final static int GENERATOR_UNUSED3 = 19; + public final static int GENERATOR_UNUSED4 = 20; + public final static int GENERATOR_DELAYMODLFO = 21; + public final static int GENERATOR_FREQMODLFO = 22; + public final static int GENERATOR_DELAYVIBLFO = 23; + public final static int GENERATOR_FREQVIBLFO = 24; + public final static int GENERATOR_DELAYMODENV = 25; + public final static int GENERATOR_ATTACKMODENV = 26; + public final static int GENERATOR_HOLDMODENV = 27; + public final static int GENERATOR_DECAYMODENV = 28; + public final static int GENERATOR_SUSTAINMODENV = 29; + public final static int GENERATOR_RELEASEMODENV = 30; + public final static int GENERATOR_KEYNUMTOMODENVHOLD = 31; + public final static int GENERATOR_KEYNUMTOMODENVDECAY = 32; + public final static int GENERATOR_DELAYVOLENV = 33; + public final static int GENERATOR_ATTACKVOLENV = 34; + public final static int GENERATOR_HOLDVOLENV = 35; + public final static int GENERATOR_DECAYVOLENV = 36; + public final static int GENERATOR_SUSTAINVOLENV = 37; + public final static int GENERATOR_RELEASEVOLENV = 38; + public final static int GENERATOR_KEYNUMTOVOLENVHOLD = 39; + public final static int GENERATOR_KEYNUMTOVOLENVDECAY = 40; + public final static int GENERATOR_INSTRUMENT = 41; + public final static int GENERATOR_RESERVED1 = 42; + public final static int GENERATOR_KEYRANGE = 43; + public final static int GENERATOR_VELRANGE = 44; + public final static int GENERATOR_STARTLOOPADDRSCOARSEOFFSET = 45; + public final static int GENERATOR_KEYNUM = 46; + public final static int GENERATOR_VELOCITY = 47; + public final static int GENERATOR_INITIALATTENUATION = 48; + public final static int GENERATOR_RESERVED2 = 49; + public final static int GENERATOR_ENDLOOPADDRSCOARSEOFFSET = 50; + public final static int GENERATOR_COARSETUNE = 51; + public final static int GENERATOR_FINETUNE = 52; + public final static int GENERATOR_SAMPLEID = 53; + public final static int GENERATOR_SAMPLEMODES = 54; + public final static int GENERATOR_RESERVED3 = 55; + public final static int GENERATOR_SCALETUNING = 56; + public final static int GENERATOR_EXCLUSIVECLASS = 57; + public final static int GENERATOR_OVERRIDINGROOTKEY = 58; + public final static int GENERATOR_UNUSED5 = 59; + public final static int GENERATOR_ENDOPR = 60; + protected Map generators = new HashMap(); + protected List modulators = new ArrayList(); + + public Map getGenerators() { + return generators; + } + + public boolean contains(int generator) { + return generators.containsKey(generator); + } + + static public short getDefaultValue(int generator) { + if (generator == 8) return (short)13500; + if (generator == 21) return (short)-12000; + if (generator == 23) return (short)-12000; + if (generator == 25) return (short)-12000; + if (generator == 26) return (short)-12000; + if (generator == 27) return (short)-12000; + if (generator == 28) return (short)-12000; + if (generator == 30) return (short)-12000; + if (generator == 33) return (short)-12000; + if (generator == 34) return (short)-12000; + if (generator == 35) return (short)-12000; + if (generator == 36) return (short)-12000; + if (generator == 38) return (short)-12000; + if (generator == 43) return (short)0x7F00; + if (generator == 44) return (short)0x7F00; + if (generator == 46) return (short)-1; + if (generator == 47) return (short)-1; + if (generator == 56) return (short)100; + if (generator == 58) return (short)-1; + return 0; + } + + public short getShort(int generator) { + if (!contains(generator)) + return getDefaultValue(generator); + return generators.get(generator); + } + + public void putShort(int generator, short value) { + generators.put(generator, value); + } + + public byte[] getBytes(int generator) { + int val = getInteger(generator); + byte[] bytes = new byte[2]; + bytes[0] = (byte) (0xFF & val); + bytes[1] = (byte) ((0xFF00 & val) >> 8); + return bytes; + } + + public void putBytes(int generator, byte[] bytes) { + generators.put(generator, (short) (bytes[0] + (bytes[1] << 8))); + } + + public int getInteger(int generator) { + return 0xFFFF & getShort(generator); + } + + public void putInteger(int generator, int value) { + generators.put(generator, (short) value); + } + + public List getModulators() { + return modulators; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SF2Sample.java b/jdk/src/share/classes/com/sun/media/sound/SF2Sample.java new file mode 100644 index 00000000000..582b34615d3 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SF2Sample.java @@ -0,0 +1,216 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.InputStream; + +import javax.sound.midi.Soundbank; +import javax.sound.midi.SoundbankResource; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; + +/** + * Soundfont sample storage. + * + * @author Karl Helgason + */ +public class SF2Sample extends SoundbankResource { + + protected String name = ""; + protected long startLoop = 0; + protected long endLoop = 0; + protected long sampleRate = 44100; + protected int originalPitch = 60; + protected byte pitchCorrection = 0; + protected int sampleLink = 0; + protected int sampleType = 0; + protected ModelByteBuffer data; + protected ModelByteBuffer data24; + + public SF2Sample(Soundbank soundBank) { + super(soundBank, null, AudioInputStream.class); + } + + public SF2Sample() { + super(null, null, AudioInputStream.class); + } + + public Object getData() { + + AudioFormat format = getFormat(); + /* + if (sampleFile != null) { + FileInputStream fis; + try { + fis = new FileInputStream(sampleFile); + RIFFReader riff = new RIFFReader(fis); + if (!riff.getFormat().equals("RIFF")) { + throw new RIFFInvalidDataException( + "Input stream is not a valid RIFF stream!"); + } + if (!riff.getType().equals("sfbk")) { + throw new RIFFInvalidDataException( + "Input stream is not a valid SoundFont!"); + } + while (riff.hasNextChunk()) { + RIFFReader chunk = riff.nextChunk(); + if (chunk.getFormat().equals("LIST")) { + if (chunk.getType().equals("sdta")) { + while(chunk.hasNextChunk()) { + RIFFReader chunkchunk = chunk.nextChunk(); + if(chunkchunk.getFormat().equals("smpl")) { + chunkchunk.skip(sampleOffset); + return new AudioInputStream(chunkchunk, + format, sampleLen); + } + } + } + } + } + return null; + } catch (Exception e) { + return new Throwable(e.toString()); + } + } + */ + InputStream is = data.getInputStream(); + if (is == null) + return null; + return new AudioInputStream(is, format, data.capacity()); + } + + public ModelByteBuffer getDataBuffer() { + return data; + } + + public ModelByteBuffer getData24Buffer() { + return data24; + } + + public AudioFormat getFormat() { + return new AudioFormat(sampleRate, 16, 1, true, false); + } + + public void setData(ModelByteBuffer data) { + this.data = data; + } + + public void setData(byte[] data) { + this.data = new ModelByteBuffer(data); + } + + public void setData(byte[] data, int offset, int length) { + this.data = new ModelByteBuffer(data, offset, length); + } + + public void setData24(ModelByteBuffer data24) { + this.data24 = data24; + } + + public void setData24(byte[] data24) { + this.data24 = new ModelByteBuffer(data24); + } + + public void setData24(byte[] data24, int offset, int length) { + this.data24 = new ModelByteBuffer(data24, offset, length); + } + + /* + public void setData(File file, int offset, int length) { + this.data = null; + this.sampleFile = file; + this.sampleOffset = offset; + this.sampleLen = length; + } + */ + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public long getEndLoop() { + return endLoop; + } + + public void setEndLoop(long endLoop) { + this.endLoop = endLoop; + } + + public int getOriginalPitch() { + return originalPitch; + } + + public void setOriginalPitch(int originalPitch) { + this.originalPitch = originalPitch; + } + + public byte getPitchCorrection() { + return pitchCorrection; + } + + public void setPitchCorrection(byte pitchCorrection) { + this.pitchCorrection = pitchCorrection; + } + + public int getSampleLink() { + return sampleLink; + } + + public void setSampleLink(int sampleLink) { + this.sampleLink = sampleLink; + } + + public long getSampleRate() { + return sampleRate; + } + + public void setSampleRate(long sampleRate) { + this.sampleRate = sampleRate; + } + + public int getSampleType() { + return sampleType; + } + + public void setSampleType(int sampleType) { + this.sampleType = sampleType; + } + + public long getStartLoop() { + return startLoop; + } + + public void setStartLoop(long startLoop) { + this.startLoop = startLoop; + } + + public String toString() { + return "Sample: " + name; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SF2Soundbank.java b/jdk/src/share/classes/com/sun/media/sound/SF2Soundbank.java new file mode 100644 index 00000000000..7ae60d870e8 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SF2Soundbank.java @@ -0,0 +1,973 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import javax.sound.midi.Instrument; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; +import javax.sound.midi.SoundbankResource; + +/** + * A SoundFont 2.04 soundbank reader. + * + * Based on SoundFont 2.04 specification from: + *

    http://developer.creative.com
    + * http://www.soundfont.com/ ; + * + * @author Karl Helgason + */ +public class SF2Soundbank implements Soundbank { + + // version of the Sound Font RIFF file + protected int major = 2; + protected int minor = 1; + // target Sound Engine + protected String targetEngine = "EMU8000"; + // Sound Font Bank Name + protected String name = "untitled"; + // Sound ROM Name + protected String romName = null; + // Sound ROM Version + protected int romVersionMajor = -1; + protected int romVersionMinor = -1; + // Date of Creation of the Bank + protected String creationDate = null; + // Sound Designers and Engineers for the Bank + protected String engineers = null; + // Product for which the Bank was intended + protected String product = null; + // Copyright message + protected String copyright = null; + // Comments + protected String comments = null; + // The SoundFont tools used to create and alter the bank + protected String tools = null; + // The Sample Data loaded from the SoundFont + private ModelByteBuffer sampleData = null; + private ModelByteBuffer sampleData24 = null; + private File sampleFile = null; + private boolean largeFormat = false; + private List instruments = new ArrayList(); + private List layers = new ArrayList(); + private List samples = new ArrayList(); + + public SF2Soundbank() { + } + + public SF2Soundbank(URL url) throws IOException { + + InputStream is = url.openStream(); + try { + readSoundbank(is); + } finally { + is.close(); + } + } + + public SF2Soundbank(File file) throws IOException { + largeFormat = true; + sampleFile = file; + InputStream is = new FileInputStream(file); + try { + readSoundbank(is); + } finally { + is.close(); + } + } + + public SF2Soundbank(InputStream inputstream) throws IOException { + readSoundbank(inputstream); + } + + private void readSoundbank(InputStream inputstream) throws IOException { + RIFFReader riff = new RIFFReader(inputstream); + if (!riff.getFormat().equals("RIFF")) { + throw new RIFFInvalidFormatException( + "Input stream is not a valid RIFF stream!"); + } + if (!riff.getType().equals("sfbk")) { + throw new RIFFInvalidFormatException( + "Input stream is not a valid SoundFont!"); + } + while (riff.hasNextChunk()) { + RIFFReader chunk = riff.nextChunk(); + if (chunk.getFormat().equals("LIST")) { + if (chunk.getType().equals("INFO")) + readInfoChunk(chunk); + if (chunk.getType().equals("sdta")) + readSdtaChunk(chunk); + if (chunk.getType().equals("pdta")) + readPdtaChunk(chunk); + } + } + } + + private void readInfoChunk(RIFFReader riff) throws IOException { + while (riff.hasNextChunk()) { + RIFFReader chunk = riff.nextChunk(); + String format = chunk.getFormat(); + if (format.equals("ifil")) { + major = chunk.readUnsignedShort(); + minor = chunk.readUnsignedShort(); + } else if (format.equals("isng")) { + this.targetEngine = chunk.readString(chunk.available()); + } else if (format.equals("INAM")) { + this.name = chunk.readString(chunk.available()); + } else if (format.equals("irom")) { + this.romName = chunk.readString(chunk.available()); + } else if (format.equals("iver")) { + romVersionMajor = chunk.readUnsignedShort(); + romVersionMinor = chunk.readUnsignedShort(); + } else if (format.equals("ICRD")) { + this.creationDate = chunk.readString(chunk.available()); + } else if (format.equals("IENG")) { + this.engineers = chunk.readString(chunk.available()); + } else if (format.equals("IPRD")) { + this.product = chunk.readString(chunk.available()); + } else if (format.equals("ICOP")) { + this.copyright = chunk.readString(chunk.available()); + } else if (format.equals("ICMT")) { + this.comments = chunk.readString(chunk.available()); + } else if (format.equals("ISFT")) { + this.tools = chunk.readString(chunk.available()); + } + + } + } + + private void readSdtaChunk(RIFFReader riff) throws IOException { + while (riff.hasNextChunk()) { + RIFFReader chunk = riff.nextChunk(); + if (chunk.getFormat().equals("smpl")) { + if (!largeFormat) { + byte[] sampleData = new byte[chunk.available()]; + + int read = 0; + int avail = chunk.available(); + while (read != avail) { + if (avail - read > 65536) { + chunk.readFully(sampleData, read, 65536); + read += 65536; + } else { + chunk.readFully(sampleData, read, avail - read); + read = avail; + } + + } + this.sampleData = new ModelByteBuffer(sampleData); + //chunk.read(sampleData); + } else { + this.sampleData = new ModelByteBuffer(sampleFile, + chunk.getFilePointer(), chunk.available()); + } + } + if (chunk.getFormat().equals("sm24")) { + if (!largeFormat) { + byte[] sampleData24 = new byte[chunk.available()]; + //chunk.read(sampleData24); + + int read = 0; + int avail = chunk.available(); + while (read != avail) { + if (avail - read > 65536) { + chunk.readFully(sampleData24, read, 65536); + read += 65536; + } else { + chunk.readFully(sampleData24, read, avail - read); + read = avail; + } + + } + this.sampleData24 = new ModelByteBuffer(sampleData24); + } else { + this.sampleData24 = new ModelByteBuffer(sampleFile, + chunk.getFilePointer(), chunk.available()); + } + + } + } + } + + private void readPdtaChunk(RIFFReader riff) throws IOException { + + List presets = new ArrayList(); + List presets_bagNdx = new ArrayList(); + List presets_splits_gen + = new ArrayList(); + List presets_splits_mod + = new ArrayList(); + + List instruments = new ArrayList(); + List instruments_bagNdx = new ArrayList(); + List instruments_splits_gen + = new ArrayList(); + List instruments_splits_mod + = new ArrayList(); + + while (riff.hasNextChunk()) { + RIFFReader chunk = riff.nextChunk(); + String format = chunk.getFormat(); + if (format.equals("phdr")) { + // Preset Header / Instrument + if (chunk.available() % 38 != 0) + throw new RIFFInvalidDataException(); + int count = chunk.available() / 38; + for (int i = 0; i < count; i++) { + SF2Instrument preset = new SF2Instrument(this); + preset.name = chunk.readString(20); + preset.preset = chunk.readUnsignedShort(); + preset.bank = chunk.readUnsignedShort(); + presets_bagNdx.add(chunk.readUnsignedShort()); + preset.library = chunk.readUnsignedInt(); + preset.genre = chunk.readUnsignedInt(); + preset.morphology = chunk.readUnsignedInt(); + presets.add(preset); + if (i != count - 1) + this.instruments.add(preset); + } + } else if (format.equals("pbag")) { + // Preset Zones / Instruments splits + if (chunk.available() % 4 != 0) + throw new RIFFInvalidDataException(); + int count = chunk.available() / 4; + + // Skip first record + { + int gencount = chunk.readUnsignedShort(); + int modcount = chunk.readUnsignedShort(); + while (presets_splits_gen.size() < gencount) + presets_splits_gen.add(null); + while (presets_splits_mod.size() < modcount) + presets_splits_mod.add(null); + count--; + } + + int offset = presets_bagNdx.get(0); + // Offset should be 0 (but just case) + for (int i = 0; i < offset; i++) { + if (count == 0) + throw new RIFFInvalidDataException(); + int gencount = chunk.readUnsignedShort(); + int modcount = chunk.readUnsignedShort(); + while (presets_splits_gen.size() < gencount) + presets_splits_gen.add(null); + while (presets_splits_mod.size() < modcount) + presets_splits_mod.add(null); + count--; + } + + for (int i = 0; i < presets_bagNdx.size() - 1; i++) { + int zone_count = presets_bagNdx.get(i + 1) + - presets_bagNdx.get(i); + SF2Instrument preset = presets.get(i); + for (int ii = 0; ii < zone_count; ii++) { + if (count == 0) + throw new RIFFInvalidDataException(); + int gencount = chunk.readUnsignedShort(); + int modcount = chunk.readUnsignedShort(); + SF2InstrumentRegion split = new SF2InstrumentRegion(); + preset.regions.add(split); + while (presets_splits_gen.size() < gencount) + presets_splits_gen.add(split); + while (presets_splits_mod.size() < modcount) + presets_splits_mod.add(split); + count--; + } + } + } else if (format.equals("pmod")) { + // Preset Modulators / Split Modulators + for (int i = 0; i < presets_splits_mod.size(); i++) { + SF2Modulator modulator = new SF2Modulator(); + modulator.sourceOperator = chunk.readUnsignedShort(); + modulator.destinationOperator = chunk.readUnsignedShort(); + modulator.amount = chunk.readShort(); + modulator.amountSourceOperator = chunk.readUnsignedShort(); + modulator.transportOperator = chunk.readUnsignedShort(); + SF2InstrumentRegion split = presets_splits_mod.get(i); + if (split != null) + split.modulators.add(modulator); + } + } else if (format.equals("pgen")) { + // Preset Generators / Split Generators + for (int i = 0; i < presets_splits_gen.size(); i++) { + int operator = chunk.readUnsignedShort(); + short amount = chunk.readShort(); + SF2InstrumentRegion split = presets_splits_gen.get(i); + if (split != null) + split.generators.put(operator, amount); + } + } else if (format.equals("inst")) { + // Instrument Header / Layers + if (chunk.available() % 22 != 0) + throw new RIFFInvalidDataException(); + int count = chunk.available() / 22; + for (int i = 0; i < count; i++) { + SF2Layer layer = new SF2Layer(this); + layer.name = chunk.readString(20); + instruments_bagNdx.add(chunk.readUnsignedShort()); + instruments.add(layer); + if (i != count - 1) + this.layers.add(layer); + } + } else if (format.equals("ibag")) { + // Instrument Zones / Layer splits + if (chunk.available() % 4 != 0) + throw new RIFFInvalidDataException(); + int count = chunk.available() / 4; + + // Skip first record + { + int gencount = chunk.readUnsignedShort(); + int modcount = chunk.readUnsignedShort(); + while (instruments_splits_gen.size() < gencount) + instruments_splits_gen.add(null); + while (instruments_splits_mod.size() < modcount) + instruments_splits_mod.add(null); + count--; + } + + int offset = instruments_bagNdx.get(0); + // Offset should be 0 (but just case) + for (int i = 0; i < offset; i++) { + if (count == 0) + throw new RIFFInvalidDataException(); + int gencount = chunk.readUnsignedShort(); + int modcount = chunk.readUnsignedShort(); + while (instruments_splits_gen.size() < gencount) + instruments_splits_gen.add(null); + while (instruments_splits_mod.size() < modcount) + instruments_splits_mod.add(null); + count--; + } + + for (int i = 0; i < instruments_bagNdx.size() - 1; i++) { + int zone_count = instruments_bagNdx.get(i + 1) - instruments_bagNdx.get(i); + SF2Layer layer = layers.get(i); + for (int ii = 0; ii < zone_count; ii++) { + if (count == 0) + throw new RIFFInvalidDataException(); + int gencount = chunk.readUnsignedShort(); + int modcount = chunk.readUnsignedShort(); + SF2LayerRegion split = new SF2LayerRegion(); + layer.regions.add(split); + while (instruments_splits_gen.size() < gencount) + instruments_splits_gen.add(split); + while (instruments_splits_mod.size() < modcount) + instruments_splits_mod.add(split); + count--; + } + } + + } else if (format.equals("imod")) { + // Instrument Modulators / Split Modulators + for (int i = 0; i < instruments_splits_mod.size(); i++) { + SF2Modulator modulator = new SF2Modulator(); + modulator.sourceOperator = chunk.readUnsignedShort(); + modulator.destinationOperator = chunk.readUnsignedShort(); + modulator.amount = chunk.readShort(); + modulator.amountSourceOperator = chunk.readUnsignedShort(); + modulator.transportOperator = chunk.readUnsignedShort(); + SF2LayerRegion split = instruments_splits_gen.get(i); + if (split != null) + split.modulators.add(modulator); + } + } else if (format.equals("igen")) { + // Instrument Generators / Split Generators + for (int i = 0; i < instruments_splits_gen.size(); i++) { + int operator = chunk.readUnsignedShort(); + short amount = chunk.readShort(); + SF2LayerRegion split = instruments_splits_gen.get(i); + if (split != null) + split.generators.put(operator, amount); + } + } else if (format.equals("shdr")) { + // Sample Headers + if (chunk.available() % 46 != 0) + throw new RIFFInvalidDataException(); + int count = chunk.available() / 46; + for (int i = 0; i < count; i++) { + SF2Sample sample = new SF2Sample(this); + sample.name = chunk.readString(20); + long start = chunk.readUnsignedInt(); + long end = chunk.readUnsignedInt(); + sample.data = sampleData.subbuffer(start * 2, end * 2, true); + if (sampleData24 != null) + sample.data24 = sampleData24.subbuffer(start, end, true); + /* + sample.data = new ModelByteBuffer(sampleData, (int)(start*2), + (int)((end - start)*2)); + if (sampleData24 != null) + sample.data24 = new ModelByteBuffer(sampleData24, + (int)start, (int)(end - start)); + */ + sample.startLoop = chunk.readUnsignedInt() - start; + sample.endLoop = chunk.readUnsignedInt() - start; + if (sample.startLoop < 0) + sample.startLoop = -1; + if (sample.endLoop < 0) + sample.endLoop = -1; + sample.sampleRate = chunk.readUnsignedInt(); + sample.originalPitch = chunk.readUnsignedByte(); + sample.pitchCorrection = chunk.readByte(); + sample.sampleLink = chunk.readUnsignedShort(); + sample.sampleType = chunk.readUnsignedShort(); + if (i != count - 1) + this.samples.add(sample); + } + } + } + + Iterator liter = this.layers.iterator(); + while (liter.hasNext()) { + SF2Layer layer = liter.next(); + Iterator siter = layer.regions.iterator(); + SF2Region globalsplit = null; + while (siter.hasNext()) { + SF2LayerRegion split = siter.next(); + if (split.generators.get(SF2LayerRegion.GENERATOR_SAMPLEID) != null) { + int sampleid = split.generators.get( + SF2LayerRegion.GENERATOR_SAMPLEID); + split.generators.remove(SF2LayerRegion.GENERATOR_SAMPLEID); + split.sample = samples.get(sampleid); + } else { + globalsplit = split; + } + } + if (globalsplit != null) { + layer.getRegions().remove(globalsplit); + SF2GlobalRegion gsplit = new SF2GlobalRegion(); + gsplit.generators = globalsplit.generators; + gsplit.modulators = globalsplit.modulators; + layer.setGlobalZone(gsplit); + } + } + + + Iterator iiter = this.instruments.iterator(); + while (iiter.hasNext()) { + SF2Instrument instrument = iiter.next(); + Iterator siter = instrument.regions.iterator(); + SF2Region globalsplit = null; + while (siter.hasNext()) { + SF2InstrumentRegion split = siter.next(); + if (split.generators.get(SF2LayerRegion.GENERATOR_INSTRUMENT) != null) { + int instrumentid = split.generators.get( + SF2InstrumentRegion.GENERATOR_INSTRUMENT); + split.generators.remove(SF2LayerRegion.GENERATOR_INSTRUMENT); + split.layer = layers.get(instrumentid); + } else { + globalsplit = split; + } + } + + if (globalsplit != null) { + instrument.getRegions().remove(globalsplit); + SF2GlobalRegion gsplit = new SF2GlobalRegion(); + gsplit.generators = globalsplit.generators; + gsplit.modulators = globalsplit.modulators; + instrument.setGlobalZone(gsplit); + } + } + + } + + public void save(String name) throws IOException { + writeSoundbank(new RIFFWriter(name, "sfbk")); + } + + public void save(File file) throws IOException { + writeSoundbank(new RIFFWriter(file, "sfbk")); + } + + public void save(OutputStream out) throws IOException { + writeSoundbank(new RIFFWriter(out, "sfbk")); + } + + private void writeSoundbank(RIFFWriter writer) throws IOException { + writeInfo(writer.writeList("INFO")); + writeSdtaChunk(writer.writeList("sdta")); + writePdtaChunk(writer.writeList("pdta")); + writer.close(); + } + + private void writeInfoStringChunk(RIFFWriter writer, String name, + String value) throws IOException { + if (value == null) + return; + RIFFWriter chunk = writer.writeChunk(name); + chunk.writeString(value); + int len = value.getBytes("ascii").length; + chunk.write(0); + len++; + if (len % 2 != 0) + chunk.write(0); + } + + private void writeInfo(RIFFWriter writer) throws IOException { + if (this.targetEngine == null) + this.targetEngine = "EMU8000"; + if (this.name == null) + this.name = ""; + + RIFFWriter ifil_chunk = writer.writeChunk("ifil"); + ifil_chunk.writeUnsignedShort(this.major); + ifil_chunk.writeUnsignedShort(this.minor); + writeInfoStringChunk(writer, "isng", this.targetEngine); + writeInfoStringChunk(writer, "INAM", this.name); + writeInfoStringChunk(writer, "irom", this.romName); + if (romVersionMajor != -1) { + RIFFWriter iver_chunk = writer.writeChunk("iver"); + iver_chunk.writeUnsignedShort(this.romVersionMajor); + iver_chunk.writeUnsignedShort(this.romVersionMinor); + } + writeInfoStringChunk(writer, "ICRD", this.creationDate); + writeInfoStringChunk(writer, "IENG", this.engineers); + writeInfoStringChunk(writer, "IPRD", this.product); + writeInfoStringChunk(writer, "ICOP", this.copyright); + writeInfoStringChunk(writer, "ICMT", this.comments); + writeInfoStringChunk(writer, "ISFT", this.tools); + + writer.close(); + } + + private void writeSdtaChunk(RIFFWriter writer) throws IOException { + + byte[] pad = new byte[32]; + + RIFFWriter smpl_chunk = writer.writeChunk("smpl"); + for (SF2Sample sample : samples) { + ModelByteBuffer data = sample.getDataBuffer(); + data.writeTo(smpl_chunk); + /* + smpl_chunk.write(data.array(), + data.arrayOffset(), + data.capacity()); + */ + smpl_chunk.write(pad); + smpl_chunk.write(pad); + } + if (major < 2) + return; + if (major == 2 && minor < 4) + return; + + + for (SF2Sample sample : samples) { + ModelByteBuffer data24 = sample.getData24Buffer(); + if (data24 == null) + return; + } + + RIFFWriter sm24_chunk = writer.writeChunk("sm24"); + for (SF2Sample sample : samples) { + ModelByteBuffer data = sample.getData24Buffer(); + data.writeTo(sm24_chunk); + /* + sm24_chunk.write(data.array(), + data.arrayOffset(), + data.capacity());*/ + smpl_chunk.write(pad); + } + } + + private void writeModulators(RIFFWriter writer, List modulators) + throws IOException { + for (SF2Modulator modulator : modulators) { + writer.writeUnsignedShort(modulator.sourceOperator); + writer.writeUnsignedShort(modulator.destinationOperator); + writer.writeShort(modulator.amount); + writer.writeUnsignedShort(modulator.amountSourceOperator); + writer.writeUnsignedShort(modulator.transportOperator); + } + } + + private void writeGenerators(RIFFWriter writer, Map generators) + throws IOException { + Short keyrange = (Short) generators.get(SF2Region.GENERATOR_KEYRANGE); + Short velrange = (Short) generators.get(SF2Region.GENERATOR_VELRANGE); + if (keyrange != null) { + writer.writeUnsignedShort(SF2Region.GENERATOR_KEYRANGE); + writer.writeShort(keyrange); + } + if (velrange != null) { + writer.writeUnsignedShort(SF2Region.GENERATOR_VELRANGE); + writer.writeShort(velrange); + } + for (Map.Entry generator : generators.entrySet()) { + if (generator.getKey() == SF2Region.GENERATOR_KEYRANGE) + continue; + if (generator.getKey() == SF2Region.GENERATOR_VELRANGE) + continue; + writer.writeUnsignedShort(generator.getKey()); + writer.writeShort(generator.getValue()); + } + } + + private void writePdtaChunk(RIFFWriter writer) throws IOException { + + RIFFWriter phdr_chunk = writer.writeChunk("phdr"); + int phdr_zone_count = 0; + for (SF2Instrument preset : this.instruments) { + phdr_chunk.writeString(preset.name, 20); + phdr_chunk.writeUnsignedShort(preset.preset); + phdr_chunk.writeUnsignedShort(preset.bank); + phdr_chunk.writeUnsignedShort(phdr_zone_count); + if (preset.getGlobalRegion() != null) + phdr_zone_count += 1; + phdr_zone_count += preset.getRegions().size(); + phdr_chunk.writeUnsignedInt(preset.library); + phdr_chunk.writeUnsignedInt(preset.genre); + phdr_chunk.writeUnsignedInt(preset.morphology); + } + phdr_chunk.writeString("EOP", 20); + phdr_chunk.writeUnsignedShort(0); + phdr_chunk.writeUnsignedShort(0); + phdr_chunk.writeUnsignedShort(phdr_zone_count); + phdr_chunk.writeUnsignedInt(0); + phdr_chunk.writeUnsignedInt(0); + phdr_chunk.writeUnsignedInt(0); + + + RIFFWriter pbag_chunk = writer.writeChunk("pbag"); + int pbag_gencount = 0; + int pbag_modcount = 0; + for (SF2Instrument preset : this.instruments) { + if (preset.getGlobalRegion() != null) { + pbag_chunk.writeUnsignedShort(pbag_gencount); + pbag_chunk.writeUnsignedShort(pbag_modcount); + pbag_gencount += preset.getGlobalRegion().getGenerators().size(); + pbag_modcount += preset.getGlobalRegion().getModulators().size(); + } + for (SF2InstrumentRegion region : preset.getRegions()) { + pbag_chunk.writeUnsignedShort(pbag_gencount); + pbag_chunk.writeUnsignedShort(pbag_modcount); + if (layers.indexOf(region.layer) != -1) { + // One generator is used to reference to instrument record + pbag_gencount += 1; + } + pbag_gencount += region.getGenerators().size(); + pbag_modcount += region.getModulators().size(); + + } + } + pbag_chunk.writeUnsignedShort(pbag_gencount); + pbag_chunk.writeUnsignedShort(pbag_modcount); + + RIFFWriter pmod_chunk = writer.writeChunk("pmod"); + for (SF2Instrument preset : this.instruments) { + if (preset.getGlobalRegion() != null) { + writeModulators(pmod_chunk, + preset.getGlobalRegion().getModulators()); + } + for (SF2InstrumentRegion region : preset.getRegions()) + writeModulators(pmod_chunk, region.getModulators()); + } + pmod_chunk.write(new byte[10]); + + RIFFWriter pgen_chunk = writer.writeChunk("pgen"); + for (SF2Instrument preset : this.instruments) { + if (preset.getGlobalRegion() != null) { + writeGenerators(pgen_chunk, + preset.getGlobalRegion().getGenerators()); + } + for (SF2InstrumentRegion region : preset.getRegions()) { + writeGenerators(pgen_chunk, region.getGenerators()); + int ix = (int) layers.indexOf(region.layer); + if (ix != -1) { + pgen_chunk.writeUnsignedShort(SF2Region.GENERATOR_INSTRUMENT); + pgen_chunk.writeShort((short) ix); + } + } + } + pgen_chunk.write(new byte[4]); + + RIFFWriter inst_chunk = writer.writeChunk("inst"); + int inst_zone_count = 0; + for (SF2Layer instrument : this.layers) { + inst_chunk.writeString(instrument.name, 20); + inst_chunk.writeUnsignedShort(inst_zone_count); + if (instrument.getGlobalRegion() != null) + inst_zone_count += 1; + inst_zone_count += instrument.getRegions().size(); + } + inst_chunk.writeString("EOI", 20); + inst_chunk.writeUnsignedShort(inst_zone_count); + + + RIFFWriter ibag_chunk = writer.writeChunk("ibag"); + int ibag_gencount = 0; + int ibag_modcount = 0; + for (SF2Layer instrument : this.layers) { + if (instrument.getGlobalRegion() != null) { + ibag_chunk.writeUnsignedShort(ibag_gencount); + ibag_chunk.writeUnsignedShort(ibag_modcount); + ibag_gencount + += instrument.getGlobalRegion().getGenerators().size(); + ibag_modcount + += instrument.getGlobalRegion().getModulators().size(); + } + for (SF2LayerRegion region : instrument.getRegions()) { + ibag_chunk.writeUnsignedShort(ibag_gencount); + ibag_chunk.writeUnsignedShort(ibag_modcount); + if (samples.indexOf(region.sample) != -1) { + // One generator is used to reference to instrument record + ibag_gencount += 1; + } + ibag_gencount += region.getGenerators().size(); + ibag_modcount += region.getModulators().size(); + + } + } + ibag_chunk.writeUnsignedShort(ibag_gencount); + ibag_chunk.writeUnsignedShort(ibag_modcount); + + + RIFFWriter imod_chunk = writer.writeChunk("imod"); + for (SF2Layer instrument : this.layers) { + if (instrument.getGlobalRegion() != null) { + writeModulators(imod_chunk, + instrument.getGlobalRegion().getModulators()); + } + for (SF2LayerRegion region : instrument.getRegions()) + writeModulators(imod_chunk, region.getModulators()); + } + imod_chunk.write(new byte[10]); + + RIFFWriter igen_chunk = writer.writeChunk("igen"); + for (SF2Layer instrument : this.layers) { + if (instrument.getGlobalRegion() != null) { + writeGenerators(igen_chunk, + instrument.getGlobalRegion().getGenerators()); + } + for (SF2LayerRegion region : instrument.getRegions()) { + writeGenerators(igen_chunk, region.getGenerators()); + int ix = samples.indexOf(region.sample); + if (ix != -1) { + igen_chunk.writeUnsignedShort(SF2Region.GENERATOR_SAMPLEID); + igen_chunk.writeShort((short) ix); + } + } + } + igen_chunk.write(new byte[4]); + + + RIFFWriter shdr_chunk = writer.writeChunk("shdr"); + long sample_pos = 0; + for (SF2Sample sample : samples) { + shdr_chunk.writeString(sample.name, 20); + long start = sample_pos; + sample_pos += sample.data.capacity() / 2; + long end = sample_pos; + long startLoop = sample.startLoop + start; + long endLoop = sample.endLoop + start; + if (startLoop < start) + startLoop = start; + if (endLoop > end) + endLoop = end; + shdr_chunk.writeUnsignedInt(start); + shdr_chunk.writeUnsignedInt(end); + shdr_chunk.writeUnsignedInt(startLoop); + shdr_chunk.writeUnsignedInt(endLoop); + shdr_chunk.writeUnsignedInt(sample.sampleRate); + shdr_chunk.writeUnsignedByte(sample.originalPitch); + shdr_chunk.writeByte(sample.pitchCorrection); + shdr_chunk.writeUnsignedShort(sample.sampleLink); + shdr_chunk.writeUnsignedShort(sample.sampleType); + sample_pos += 32; + } + shdr_chunk.writeString("EOS", 20); + shdr_chunk.write(new byte[26]); + + } + + public String getName() { + return name; + } + + public String getVersion() { + return major + "." + minor; + } + + public String getVendor() { + return engineers; + } + + public String getDescription() { + return comments; + } + + public void setName(String s) { + name = s; + } + + public void setVendor(String s) { + engineers = s; + } + + public void setDescription(String s) { + comments = s; + } + + public SoundbankResource[] getResources() { + SoundbankResource[] resources + = new SoundbankResource[layers.size() + samples.size()]; + int j = 0; + for (int i = 0; i < layers.size(); i++) + resources[j++] = layers.get(i); + for (int i = 0; i < samples.size(); i++) + resources[j++] = samples.get(i); + return resources; + } + + public SF2Instrument[] getInstruments() { + SF2Instrument[] inslist_array + = instruments.toArray(new SF2Instrument[instruments.size()]); + Arrays.sort(inslist_array, new ModelInstrumentComparator()); + return inslist_array; + } + + public SF2Layer[] getLayers() { + return layers.toArray(new SF2Layer[layers.size()]); + } + + public SF2Sample[] getSamples() { + return samples.toArray(new SF2Sample[samples.size()]); + } + + public Instrument getInstrument(Patch patch) { + int program = patch.getProgram(); + int bank = patch.getBank(); + boolean percussion = false; + if (patch instanceof ModelPatch) + percussion = ((ModelPatch)patch).isPercussion(); + for (Instrument instrument : instruments) { + Patch patch2 = instrument.getPatch(); + int program2 = patch2.getProgram(); + int bank2 = patch2.getBank(); + if (program == program2 && bank == bank2) { + boolean percussion2 = false; + if (patch2 instanceof ModelPatch) + percussion2 = ((ModelPatch) patch2).isPercussion(); + if (percussion == percussion2) + return instrument; + } + } + return null; + } + + public String getCreationDate() { + return creationDate; + } + + public void setCreationDate(String creationDate) { + this.creationDate = creationDate; + } + + public String getProduct() { + return product; + } + + public void setProduct(String product) { + this.product = product; + } + + public String getRomName() { + return romName; + } + + public void setRomName(String romName) { + this.romName = romName; + } + + public int getRomVersionMajor() { + return romVersionMajor; + } + + public void setRomVersionMajor(int romVersionMajor) { + this.romVersionMajor = romVersionMajor; + } + + public int getRomVersionMinor() { + return romVersionMinor; + } + + public void setRomVersionMinor(int romVersionMinor) { + this.romVersionMinor = romVersionMinor; + } + + public String getTargetEngine() { + return targetEngine; + } + + public void setTargetEngine(String targetEngine) { + this.targetEngine = targetEngine; + } + + public String getTools() { + return tools; + } + + public void setTools(String tools) { + this.tools = tools; + } + + public void addResource(SoundbankResource resource) { + if (resource instanceof SF2Instrument) + instruments.add((SF2Instrument)resource); + if (resource instanceof SF2Layer) + layers.add((SF2Layer)resource); + if (resource instanceof SF2Sample) + samples.add((SF2Sample)resource); + } + + public void removeResource(SoundbankResource resource) { + if (resource instanceof SF2Instrument) + instruments.remove((SF2Instrument)resource); + if (resource instanceof SF2Layer) + layers.remove((SF2Layer)resource); + if (resource instanceof SF2Sample) + samples.remove((SF2Sample)resource); + } + + public void addInstrument(SF2Instrument resource) { + instruments.add(resource); + } + + public void removeInstrument(SF2Instrument resource) { + instruments.remove(resource); + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SF2SoundbankReader.java b/jdk/src/share/classes/com/sun/media/sound/SF2SoundbankReader.java new file mode 100644 index 00000000000..942752df21e --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SF2SoundbankReader.java @@ -0,0 +1,73 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import javax.sound.midi.InvalidMidiDataException; +import javax.sound.midi.Soundbank; +import javax.sound.midi.spi.SoundbankReader; + +/** + * This class is used to connect the SF2SoundBank class + * to the SoundbankReader SPI interface. + * + * @author Karl Helgason + */ +public class SF2SoundbankReader extends SoundbankReader { + + public Soundbank getSoundbank(URL url) + throws InvalidMidiDataException, IOException { + try { + return new SF2Soundbank(url); + } catch (RIFFInvalidFormatException e) { + return null; + } catch(IOException ioe) { + return null; + } + } + + public Soundbank getSoundbank(InputStream stream) + throws InvalidMidiDataException, IOException { + try { + stream.mark(512); + return new SF2Soundbank(stream); + } catch (RIFFInvalidFormatException e) { + stream.reset(); + return null; + } + } + + public Soundbank getSoundbank(File file) + throws InvalidMidiDataException, IOException { + try { + return new SF2Soundbank(file); + } catch (RIFFInvalidFormatException e) { + return null; + } + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SimpleInstrument.java b/jdk/src/share/classes/com/sun/media/sound/SimpleInstrument.java new file mode 100644 index 00000000000..92c60810599 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SimpleInstrument.java @@ -0,0 +1,196 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.ArrayList; +import java.util.List; +import javax.sound.midi.Patch; + +/** + * A simple instrument that is made of other ModelInstrument, ModelPerformer + * objects. + * + * @author Karl Helgason + */ +public class SimpleInstrument extends ModelInstrument { + + private static class SimpleInstrumentPart { + ModelPerformer[] performers; + int keyFrom; + int keyTo; + int velFrom; + int velTo; + int exclusiveClass; + } + protected int preset = 0; + protected int bank = 0; + protected boolean percussion = false; + protected String name = ""; + protected List parts + = new ArrayList(); + + public SimpleInstrument() { + super(null, null, null, null); + } + + public void clear() { + parts.clear(); + } + + public void add(ModelPerformer[] performers, int keyFrom, int keyTo, + int velFrom, int velTo, int exclusiveClass) { + SimpleInstrumentPart part = new SimpleInstrumentPart(); + part.performers = performers; + part.keyFrom = keyFrom; + part.keyTo = keyTo; + part.velFrom = velFrom; + part.velTo = velTo; + part.exclusiveClass = exclusiveClass; + parts.add(part); + } + + public void add(ModelPerformer[] performers, int keyFrom, int keyTo, + int velFrom, int velTo) { + add(performers, keyFrom, keyTo, velFrom, velTo, -1); + } + + public void add(ModelPerformer[] performers, int keyFrom, int keyTo) { + add(performers, keyFrom, keyTo, 0, 127, -1); + } + + public void add(ModelPerformer[] performers) { + add(performers, 0, 127, 0, 127, -1); + } + + public void add(ModelPerformer performer, int keyFrom, int keyTo, + int velFrom, int velTo, int exclusiveClass) { + add(new ModelPerformer[]{performer}, keyFrom, keyTo, velFrom, velTo, + exclusiveClass); + } + + public void add(ModelPerformer performer, int keyFrom, int keyTo, + int velFrom, int velTo) { + add(new ModelPerformer[]{performer}, keyFrom, keyTo, velFrom, velTo); + } + + public void add(ModelPerformer performer, int keyFrom, int keyTo) { + add(new ModelPerformer[]{performer}, keyFrom, keyTo); + } + + public void add(ModelPerformer performer) { + add(new ModelPerformer[]{performer}); + } + + public void add(ModelInstrument ins, int keyFrom, int keyTo, int velFrom, + int velTo, int exclusiveClass) { + add(ins.getPerformers(), keyFrom, keyTo, velFrom, velTo, exclusiveClass); + } + + public void add(ModelInstrument ins, int keyFrom, int keyTo, int velFrom, + int velTo) { + add(ins.getPerformers(), keyFrom, keyTo, velFrom, velTo); + } + + public void add(ModelInstrument ins, int keyFrom, int keyTo) { + add(ins.getPerformers(), keyFrom, keyTo); + } + + public void add(ModelInstrument ins) { + add(ins.getPerformers()); + } + + public ModelPerformer[] getPerformers() { + + int percount = 0; + for (SimpleInstrumentPart part : parts) + if (part.performers != null) + percount += part.performers.length; + + ModelPerformer[] performers = new ModelPerformer[percount]; + int px = 0; + for (SimpleInstrumentPart part : parts) { + if (part.performers != null) { + for (ModelPerformer mperfm : part.performers) { + ModelPerformer performer = new ModelPerformer(); + performer.setName(getName()); + performers[px++] = performer; + + performer.setDefaultConnectionsEnabled( + mperfm.isDefaultConnectionsEnabled()); + performer.setKeyFrom(mperfm.getKeyFrom()); + performer.setKeyTo(mperfm.getKeyTo()); + performer.setVelFrom(mperfm.getVelFrom()); + performer.setVelTo(mperfm.getVelTo()); + performer.setExclusiveClass(mperfm.getExclusiveClass()); + performer.setSelfNonExclusive(mperfm.isSelfNonExclusive()); + performer.setReleaseTriggered(mperfm.isReleaseTriggered()); + if (part.exclusiveClass != -1) + performer.setExclusiveClass(part.exclusiveClass); + if (part.keyFrom > performer.getKeyFrom()) + performer.setKeyFrom(part.keyFrom); + if (part.keyTo < performer.getKeyTo()) + performer.setKeyTo(part.keyTo); + if (part.velFrom > performer.getVelFrom()) + performer.setVelFrom(part.velFrom); + if (part.velTo < performer.getVelTo()) + performer.setVelTo(part.velTo); + performer.getOscillators().addAll(mperfm.getOscillators()); + performer.getConnectionBlocks().addAll( + mperfm.getConnectionBlocks()); + } + } + } + + return performers; + } + + public Object getData() { + return null; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public ModelPatch getPatch() { + return new ModelPatch(bank, preset, percussion); + } + + public void setPatch(Patch patch) { + if (patch instanceof ModelPatch && ((ModelPatch)patch).isPercussion()) { + percussion = true; + bank = patch.getBank(); + preset = patch.getProgram(); + } else { + percussion = false; + bank = patch.getBank(); + preset = patch.getProgram(); + } + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SimpleSoundbank.java b/jdk/src/share/classes/com/sun/media/sound/SimpleSoundbank.java new file mode 100644 index 00000000000..c5dea6e73da --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SimpleSoundbank.java @@ -0,0 +1,145 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import javax.sound.midi.Instrument; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; +import javax.sound.midi.SoundbankResource; + +/** + * A simple soundbank that contains instruments and soundbankresources. + * + * @author Karl Helgason + */ +public class SimpleSoundbank implements Soundbank { + + String name = ""; + String version = ""; + String vendor = ""; + String description = ""; + List resources = new ArrayList(); + List instruments = new ArrayList(); + + public String getName() { + return name; + } + + public String getVersion() { + return version; + } + + public String getVendor() { + return vendor; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public void setName(String name) { + this.name = name; + } + + public void setVendor(String vendor) { + this.vendor = vendor; + } + + public void setVersion(String version) { + this.version = version; + } + + public SoundbankResource[] getResources() { + return resources.toArray(new SoundbankResource[resources.size()]); + } + + public Instrument[] getInstruments() { + Instrument[] inslist_array + = instruments.toArray(new Instrument[resources.size()]); + Arrays.sort(inslist_array, new ModelInstrumentComparator()); + return inslist_array; + } + + public Instrument getInstrument(Patch patch) { + int program = patch.getProgram(); + int bank = patch.getBank(); + boolean percussion = false; + if (patch instanceof ModelPatch) + percussion = ((ModelPatch)patch).isPercussion(); + for (Instrument instrument : instruments) { + Patch patch2 = instrument.getPatch(); + int program2 = patch2.getProgram(); + int bank2 = patch2.getBank(); + if (program == program2 && bank == bank2) { + boolean percussion2 = false; + if (patch2 instanceof ModelPatch) + percussion2 = ((ModelPatch)patch2).isPercussion(); + if (percussion == percussion2) + return instrument; + } + } + return null; + } + + public void addResource(SoundbankResource resource) { + if (resource instanceof Instrument) + instruments.add((Instrument) resource); + else + resources.add(resource); + } + + public void removeResource(SoundbankResource resource) { + if (resource instanceof Instrument) + instruments.remove((Instrument) resource); + else + resources.remove(resource); + } + + public void addInstrument(Instrument resource) { + instruments.add(resource); + } + + public void removeInstrument(Instrument resource) { + instruments.remove(resource); + } + + public void addAllInstruments(Soundbank soundbank) { + for (Instrument ins : soundbank.getInstruments()) + addInstrument(ins); + } + + public void removeAllInstruments(Soundbank soundbank) { + for (Instrument ins : soundbank.getInstruments()) + removeInstrument(ins); + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftAbstractResampler.java b/jdk/src/share/classes/com/sun/media/sound/SoftAbstractResampler.java new file mode 100644 index 00000000000..4fcb26c4543 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftAbstractResampler.java @@ -0,0 +1,390 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.IOException; +import java.util.Arrays; + +import javax.sound.midi.MidiChannel; +import javax.sound.midi.VoiceStatus; + +/** + * Abstract resampler class. + * + * @author Karl Helgason + */ +public abstract class SoftAbstractResampler implements SoftResampler { + + private class ModelAbstractResamplerStream implements SoftResamplerStreamer { + + AudioFloatInputStream stream; + boolean stream_eof = false; + int loopmode; + boolean loopdirection = true; // true = forward + float loopstart; + float looplen; + float target_pitch; + float[] current_pitch = new float[1]; + boolean started; + boolean eof; + int sector_pos = 0; + int sector_size = 400; + int sector_loopstart = -1; + boolean markset = false; + int marklimit = 0; + int streampos = 0; + int nrofchannels = 2; + boolean noteOff_flag = false; + float[][] ibuffer; + boolean ibuffer_order = true; + float[] sbuffer; + int pad; + int pad2; + float[] ix = new float[1]; + int[] ox = new int[1]; + float samplerateconv = 1; + float pitchcorrection = 0; + + public ModelAbstractResamplerStream() { + pad = getPadding(); + pad2 = getPadding() * 2; + ibuffer = new float[2][sector_size + pad2]; + ibuffer_order = true; + } + + public void noteOn(MidiChannel channel, VoiceStatus voice, + int noteNumber, int velocity) { + } + + public void noteOff(int velocity) { + noteOff_flag = true; + } + + public void open(ModelWavetable osc, float outputsamplerate) + throws IOException { + + eof = false; + nrofchannels = osc.getChannels(); + if (ibuffer.length < nrofchannels) { + ibuffer = new float[nrofchannels][sector_size + pad2]; + } + + stream = osc.openStream(); + streampos = 0; + stream_eof = false; + pitchcorrection = osc.getPitchcorrection(); + samplerateconv + = stream.getFormat().getSampleRate() / outputsamplerate; + looplen = osc.getLoopLength(); + loopstart = osc.getLoopStart(); + sector_loopstart = (int) (loopstart / sector_size); + sector_loopstart = sector_loopstart - 1; + + sector_pos = 0; + + if (sector_loopstart < 0) + sector_loopstart = 0; + started = false; + loopmode = osc.getLoopType(); + + if (loopmode != 0) { + markset = false; + marklimit = nrofchannels * (int) (looplen + pad2 + 1); + } else + markset = true; + // loopmode = 0; + + target_pitch = samplerateconv; + current_pitch[0] = samplerateconv; + + ibuffer_order = true; + loopdirection = true; + noteOff_flag = false; + + for (int i = 0; i < nrofchannels; i++) + Arrays.fill(ibuffer[i], sector_size, sector_size + pad2, 0); + ix[0] = pad; + eof = false; + + ix[0] = sector_size + pad; + sector_pos = -1; + streampos = -sector_size; + + nextBuffer(); + } + + public void setPitch(float pitch) { + /* + this.pitch = (float) Math.pow(2f, + (pitchcorrection + pitch) / 1200.0f) + * samplerateconv; + */ + this.target_pitch = (float)Math.exp( + (pitchcorrection + pitch) * (Math.log(2.0) / 1200.0)) + * samplerateconv; + + if (!started) + current_pitch[0] = this.target_pitch; + } + + public void nextBuffer() throws IOException { + if (ix[0] < pad) { + if (markset) { + // reset to target sector + stream.reset(); + ix[0] += streampos - (sector_loopstart * sector_size); + sector_pos = sector_loopstart; + streampos = sector_pos * sector_size; + + // and go one sector backward + ix[0] += sector_size; + sector_pos -= 1; + streampos -= sector_size; + stream_eof = false; + } + } + + if (ix[0] >= sector_size + pad) { + if (stream_eof) { + eof = true; + return; + } + } + + if (ix[0] >= sector_size * 4 + pad) { + int skips = (int)((ix[0] - sector_size * 4 + pad) / sector_size); + ix[0] -= sector_size * skips; + sector_pos += skips; + streampos += sector_size * skips; + stream.skip(sector_size * skips); + } + + while (ix[0] >= sector_size + pad) { + if (!markset) { + if (sector_pos + 1 == sector_loopstart) { + stream.mark(marklimit); + markset = true; + } + } + ix[0] -= sector_size; + sector_pos++; + streampos += sector_size; + + for (int c = 0; c < nrofchannels; c++) { + float[] cbuffer = ibuffer[c]; + for (int i = 0; i < pad2; i++) + cbuffer[i] = cbuffer[i + sector_size]; + } + + int ret; + if (nrofchannels == 1) + ret = stream.read(ibuffer[0], pad2, sector_size); + else { + int slen = sector_size * nrofchannels; + if (sbuffer == null || sbuffer.length < slen) + sbuffer = new float[slen]; + int sret = stream.read(sbuffer, 0, slen); + if (sret == -1) + ret = -1; + else { + ret = sret / nrofchannels; + for (int i = 0; i < nrofchannels; i++) { + float[] buff = ibuffer[i]; + int ix = i; + int ix_step = nrofchannels; + int ox = pad2; + for (int j = 0; j < ret; j++, ix += ix_step, ox++) + buff[ox] = sbuffer[ix]; + } + } + + } + + if (ret == -1) { + ret = 0; + stream_eof = true; + for (int i = 0; i < nrofchannels; i++) + Arrays.fill(ibuffer[i], pad2, pad2 + sector_size, 0f); + return; + } + if (ret != sector_size) { + for (int i = 0; i < nrofchannels; i++) + Arrays.fill(ibuffer[i], pad2 + ret, pad2 + sector_size, 0f); + } + + ibuffer_order = true; + + } + + } + + public void reverseBuffers() { + ibuffer_order = !ibuffer_order; + for (int c = 0; c < nrofchannels; c++) { + float[] cbuff = ibuffer[c]; + int len = cbuff.length - 1; + int len2 = cbuff.length / 2; + for (int i = 0; i < len2; i++) { + float x = cbuff[i]; + cbuff[i] = cbuff[len - i]; + cbuff[len - i] = x; + } + } + } + + public int read(float[][] buffer, int offset, int len) + throws IOException { + + if (eof) + return -1; + + if (noteOff_flag) + if ((loopmode & 2) != 0) + if (loopdirection) + loopmode = 0; + + + float pitchstep = (target_pitch - current_pitch[0]) / len; + float[] current_pitch = this.current_pitch; + started = true; + + int[] ox = this.ox; + ox[0] = offset; + int ox_end = len + offset; + + float ixend = sector_size + pad; + if (!loopdirection) + ixend = pad; + while (ox[0] != ox_end) { + nextBuffer(); + if (!loopdirection) { + // If we are in backward playing part of pingpong + // or reverse loop + + if (streampos < (loopstart + pad)) { + ixend = loopstart - streampos + pad2; + if (ix[0] <= ixend) { + if ((loopmode & 4) != 0) { + // Ping pong loop, change loopdirection + loopdirection = true; + ixend = sector_size + pad; + continue; + } + + ix[0] += looplen; + ixend = pad; + continue; + } + } + + if (ibuffer_order != loopdirection) + reverseBuffers(); + + ix[0] = (sector_size + pad2) - ix[0]; + ixend = (sector_size + pad2) - ixend; + ixend++; + + float bak_ix = ix[0]; + int bak_ox = ox[0]; + float bak_pitch = current_pitch[0]; + for (int i = 0; i < nrofchannels; i++) { + if (buffer[i] != null) { + ix[0] = bak_ix; + ox[0] = bak_ox; + current_pitch[0] = bak_pitch; + interpolate(ibuffer[i], ix, ixend, current_pitch, + pitchstep, buffer[i], ox, ox_end); + } + } + + ix[0] = (sector_size + pad2) - ix[0]; + ixend--; + ixend = (sector_size + pad2) - ixend; + + if (eof) { + current_pitch[0] = this.target_pitch; + return ox[0] - offset; + } + + continue; + } + if (loopmode != 0) { + if (streampos + sector_size > (looplen + loopstart + pad)) { + ixend = loopstart + looplen - streampos + pad2; + if (ix[0] >= ixend) { + if ((loopmode & 4) != 0 || (loopmode & 8) != 0) { + // Ping pong or revese loop, change loopdirection + loopdirection = false; + ixend = pad; + continue; + } + ixend = sector_size + pad; + ix[0] -= looplen; + continue; + } + } + } + + if (ibuffer_order != loopdirection) + reverseBuffers(); + + float bak_ix = ix[0]; + int bak_ox = ox[0]; + float bak_pitch = current_pitch[0]; + for (int i = 0; i < nrofchannels; i++) { + if (buffer[i] != null) { + ix[0] = bak_ix; + ox[0] = bak_ox; + current_pitch[0] = bak_pitch; + interpolate(ibuffer[i], ix, ixend, current_pitch, + pitchstep, buffer[i], ox, ox_end); + } + } + + if (eof) { + current_pitch[0] = this.target_pitch; + return ox[0] - offset; + } + } + + current_pitch[0] = this.target_pitch; + return len; + } + + public void close() throws IOException { + stream.close(); + } + } + + public abstract int getPadding(); + + public abstract void interpolate(float[] in, float[] in_offset, + float in_end, float[] pitch, float pitchstep, float[] out, + int[] out_offset, int out_end); + + public SoftResamplerStreamer openStreamer() { + return new ModelAbstractResamplerStream(); + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftAudioBuffer.java b/jdk/src/share/classes/com/sun/media/sound/SoftAudioBuffer.java new file mode 100644 index 00000000000..ccc94899f61 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftAudioBuffer.java @@ -0,0 +1,104 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.Arrays; + +import javax.sound.sampled.AudioFormat; + +/** + * This class is used to store audio buffer. + * + * @author Karl Helgason + */ +public class SoftAudioBuffer { + + private int size; + private float[] buffer; + private boolean empty = true; + private AudioFormat format; + private AudioFloatConverter converter; + private byte[] converter_buffer; + + public SoftAudioBuffer(int size, AudioFormat format) { + this.size = size; + this.format = format; + converter = AudioFloatConverter.getConverter(format); + } + + public AudioFormat getFormat() { + return format; + } + + public int getSize() { + return size; + } + + public void clear() { + if (!empty) { + Arrays.fill(buffer, 0); + empty = true; + } + } + + public boolean isSilent() { + return empty; + } + + public float[] array() { + empty = false; + if (buffer == null) + buffer = new float[size]; + return buffer; + } + + public void get(byte[] buffer, int channel) { + + int framesize_pc = (format.getFrameSize() / format.getChannels()); + int c_len = size * framesize_pc; + if (converter_buffer == null || converter_buffer.length < c_len) + converter_buffer = new byte[c_len]; + + if (format.getChannels() == 1) { + converter.toByteArray(array(), size, buffer); + } else { + converter.toByteArray(array(), size, converter_buffer); + if (channel >= format.getChannels()) + return; + int z_stepover = format.getChannels() * framesize_pc; + int k_stepover = framesize_pc; + for (int j = 0; j < framesize_pc; j++) { + int k = j; + int z = channel * framesize_pc + j; + for (int i = 0; i < size; i++) { + buffer[z] = converter_buffer[k]; + z += z_stepover; + k += k_stepover; + } + } + } + + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftAudioProcessor.java b/jdk/src/share/classes/com/sun/media/sound/SoftAudioProcessor.java new file mode 100644 index 00000000000..1e8a53f721b --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftAudioProcessor.java @@ -0,0 +1,48 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * Audio processor interface. + * + * @author Karl Helgason + */ +public interface SoftAudioProcessor { + + public void globalParameterControlChange(int[] slothpath, long param, + long value); + + public void init(float samplerate, float controlrate); + + public void setInput(int pin, SoftAudioBuffer input); + + public void setOutput(int pin, SoftAudioBuffer output); + + public void setMixMode(boolean mix); + + public void processAudio(); + + public void processControlLogic(); +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftAudioPusher.java b/jdk/src/share/classes/com/sun/media/sound/SoftAudioPusher.java new file mode 100644 index 00000000000..d19ff412bd8 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftAudioPusher.java @@ -0,0 +1,91 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.IOException; + +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.SourceDataLine; + +/** + * This is a processor object that writes into SourceDataLine + * + * @author Karl Helgason + */ +public class SoftAudioPusher implements Runnable { + + private volatile boolean active = false; + private SourceDataLine sourceDataLine = null; + private Thread audiothread; + private AudioInputStream ais; + private byte[] buffer; + + public SoftAudioPusher(SourceDataLine sourceDataLine, AudioInputStream ais, + int workbuffersizer) { + this.ais = ais; + this.buffer = new byte[workbuffersizer]; + this.sourceDataLine = sourceDataLine; + } + + public synchronized void start() { + if (active) + return; + active = true; + audiothread = new Thread(this); + audiothread.setPriority(Thread.MAX_PRIORITY); + audiothread.start(); + } + + public synchronized void stop() { + if (!active) + return; + active = false; + try { + audiothread.join(); + } catch (InterruptedException e) { + //e.printStackTrace(); + } + } + + public void run() { + byte[] buffer = SoftAudioPusher.this.buffer; + AudioInputStream ais = SoftAudioPusher.this.ais; + SourceDataLine sourceDataLine = SoftAudioPusher.this.sourceDataLine; + + try { + while (active) { + // Read from audio source + int count = ais.read(buffer); + if(count < 0) break; + // Write byte buffer to source output + sourceDataLine.write(buffer, 0, count); + } + } catch (IOException e) { + active = false; + //e.printStackTrace(); + } + + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftChannel.java b/jdk/src/share/classes/com/sun/media/sound/SoftChannel.java new file mode 100644 index 00000000000..8bb5f2ef66a --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftChannel.java @@ -0,0 +1,1548 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import javax.sound.midi.MidiChannel; +import javax.sound.midi.Patch; + +/** + * Software Synthesizer MIDI channel class. + * + * @author Karl Helgason + */ +public class SoftChannel implements MidiChannel, ModelDirectedPlayer { + + private static boolean[] dontResetControls = new boolean[128]; + static { + for (int i = 0; i < dontResetControls.length; i++) + dontResetControls[i] = false; + + dontResetControls[0] = true; // Bank Select (MSB) + dontResetControls[32] = true; // Bank Select (LSB) + dontResetControls[7] = true; // Channel Volume (MSB) + dontResetControls[8] = true; // Balance (MSB) + dontResetControls[10] = true; // Pan (MSB) + dontResetControls[11] = true; // Expression (MSB) + dontResetControls[91] = true; // Effects 1 Depth (default: Reverb Send) + dontResetControls[92] = true; // Effects 2 Depth (default: Tremolo Depth) + dontResetControls[93] = true; // Effects 3 Depth (default: Chorus Send) + dontResetControls[94] = true; // Effects 4 Depth (default: Celeste [Detune] Depth) + dontResetControls[95] = true; // Effects 5 Depth (default: Phaser Depth) + dontResetControls[70] = true; // Sound Controller 1 (default: Sound Variation) + dontResetControls[71] = true; // Sound Controller 2 (default: Timbre / Harmonic Quality) + dontResetControls[72] = true; // Sound Controller 3 (default: Release Time) + dontResetControls[73] = true; // Sound Controller 4 (default: Attack Time) + dontResetControls[74] = true; // Sound Controller 5 (default: Brightness) + dontResetControls[75] = true; // Sound Controller 6 (GM2 default: Decay Time) + dontResetControls[76] = true; // Sound Controller 7 (GM2 default: Vibrato Rate) + dontResetControls[77] = true; // Sound Controller 8 (GM2 default: Vibrato Depth) + dontResetControls[78] = true; // Sound Controller 9 (GM2 default: Vibrato Delay) + dontResetControls[79] = true; // Sound Controller 10 (GM2 default: Undefined) + dontResetControls[120] = true; // All Sound Off + dontResetControls[121] = true; // Reset All Controllers + dontResetControls[122] = true; // Local Control On/Off + dontResetControls[123] = true; // All Notes Off + dontResetControls[124] = true; // Omni Mode Off + dontResetControls[125] = true; // Omni Mode On + dontResetControls[126] = true; // Poly Mode Off + dontResetControls[127] = true; // Poly Mode On + + dontResetControls[6] = true; // Data Entry (MSB) + dontResetControls[38] = true; // Data Entry (LSB) + dontResetControls[96] = true; // Data Increment + dontResetControls[97] = true; // Data Decrement + dontResetControls[98] = true; // Non-Registered Parameter Number (LSB) + dontResetControls[99] = true; // Non-Registered Parameter Number(MSB) + dontResetControls[100] = true; // RPN = Null + dontResetControls[101] = true; // RPN = Null + + } + + private static final int RPN_NULL_VALUE = (127 << 7) + 127; + private int rpn_control = RPN_NULL_VALUE; + private int nrpn_control = RPN_NULL_VALUE; + protected double portamento_time = 1; // keyschanges per control buffer time + protected int[] portamento_lastnote = new int[128]; + protected int portamento_lastnote_ix = 0; + private int portamento_control_note = -1; + private boolean portamento = false; + private boolean mono = false; + private boolean mute = false; + private boolean solo = false; + private boolean solomute = false; + private Object control_mutex; + private int channel; + private SoftVoice[] voices; + private int bank; + private int program; + private SoftSynthesizer synthesizer; + private SoftMainMixer mainmixer; + private int[] polypressure = new int[128]; + private int channelpressure = 0; + private int[] controller = new int[128]; + private int pitchbend; + private double[] co_midi_pitch = new double[1]; + private double[] co_midi_channel_pressure = new double[1]; + protected SoftTuning tuning = new SoftTuning(); + protected int tuning_bank = 0; + protected int tuning_program = 0; + protected SoftInstrument current_instrument = null; + protected ModelChannelMixer current_mixer = null; + private ModelDirector current_director = null; + + // Controller Destination Settings + protected int cds_control_number = -1; + protected ModelConnectionBlock[] cds_control_connections = null; + protected ModelConnectionBlock[] cds_channelpressure_connections = null; + protected ModelConnectionBlock[] cds_polypressure_connections = null; + protected boolean sustain = false; + protected boolean[][] keybasedcontroller_active = null; + protected double[][] keybasedcontroller_value = null; + + private class MidiControlObject implements SoftControl { + double[] pitch = co_midi_pitch; + double[] channel_pressure = co_midi_channel_pressure; + double[] poly_pressure = new double[1]; + + public double[] get(int instance, String name) { + if (name == null) + return null; + if (name.equals("pitch")) + return pitch; + if (name.equals("channel_pressure")) + return channel_pressure; + if (name.equals("poly_pressure")) + return poly_pressure; + return null; + } + } + + private SoftControl[] co_midi = new SoftControl[128]; + { + for (int i = 0; i < co_midi.length; i++) { + co_midi[i] = new MidiControlObject(); + } + } + + private double[][] co_midi_cc_cc = new double[128][1]; + private SoftControl co_midi_cc = new SoftControl() { + double[][] cc = co_midi_cc_cc; + public double[] get(int instance, String name) { + if (name == null) + return null; + return cc[Integer.parseInt(name)]; + } + }; + Map co_midi_rpn_rpn_i = new HashMap(); + Map co_midi_rpn_rpn = new HashMap(); + private SoftControl co_midi_rpn = new SoftControl() { + Map rpn = co_midi_rpn_rpn; + public double[] get(int instance, String name) { + if (name == null) + return null; + int iname = Integer.parseInt(name); + double[] v = rpn.get(iname); + if (v == null) { + v = new double[1]; + rpn.put(iname, v); + } + return v; + } + }; + Map co_midi_nrpn_nrpn_i = new HashMap(); + Map co_midi_nrpn_nrpn = new HashMap(); + private SoftControl co_midi_nrpn = new SoftControl() { + Map nrpn = co_midi_nrpn_nrpn; + public double[] get(int instance, String name) { + if (name == null) + return null; + int iname = Integer.parseInt(name); + double[] v = nrpn.get(iname); + if (v == null) { + v = new double[1]; + nrpn.put(iname, v); + } + return v; + } + }; + + private static int restrict7Bit(int value) + { + if(value < 0) return 0; + if(value > 127) return 127; + return value; + } + + private static int restrict14Bit(int value) + { + if(value < 0) return 0; + if(value > 16256) return 16256; + return value; + } + + public SoftChannel(SoftSynthesizer synth, int channel) { + this.channel = channel; + this.voices = synth.getVoices(); + this.synthesizer = synth; + this.mainmixer = synth.getMainMixer(); + control_mutex = synth.control_mutex; + resetAllControllers(true); + } + + private int findFreeVoice(int x) { + for (int i = x; i < voices.length; i++) + if (!voices[i].active) + return i; + + // No free voice was found, we must steal one + + int vmode = synthesizer.getVoiceAllocationMode(); + if (vmode == 1) { + // DLS Static Voice Allocation + + // * priority ( 10, 1-9, 11-16) + // Search for channel to steal from + int steal_channel = channel; + for (int j = 0; j < voices.length; j++) { + if (voices[j].stealer_channel == null) { + if (steal_channel == 9) { + steal_channel = voices[j].channel; + } else { + if (voices[j].channel != 9) { + if (voices[j].channel > steal_channel) + steal_channel = voices[j].channel; + } + } + } + } + + int voiceNo = -1; + + SoftVoice v = null; + // Search for oldest voice in off state on steal_channel + for (int j = 0; j < voices.length; j++) { + if (voices[j].channel == steal_channel) { + if (voices[j].stealer_channel == null && !voices[j].on) { + if (v == null) { + v = voices[j]; + voiceNo = j; + } + if (voices[j].voiceID < v.voiceID) { + v = voices[j]; + voiceNo = j; + } + } + } + } + // Search for oldest voice in on state on steal_channel + if (voiceNo == -1) { + for (int j = 0; j < voices.length; j++) { + if (voices[j].channel == steal_channel) { + if (voices[j].stealer_channel == null) { + if (v == null) { + v = voices[j]; + voiceNo = j; + } + if (voices[j].voiceID < v.voiceID) { + v = voices[j]; + voiceNo = j; + } + } + } + } + } + + return voiceNo; + + } else { + // Default Voice Allocation + // * Find voice that is on + // and Find voice which has lowest voiceID ( oldest voice) + // * Or find voice that is off + // and Find voice which has lowest voiceID ( oldest voice) + + int voiceNo = -1; + + SoftVoice v = null; + // Search for oldest voice in off state + for (int j = 0; j < voices.length; j++) { + if (voices[j].stealer_channel == null && !voices[j].on) { + if (v == null) { + v = voices[j]; + voiceNo = j; + } + if (voices[j].voiceID < v.voiceID) { + v = voices[j]; + voiceNo = j; + } + } + } + // Search for oldest voice in on state + if (voiceNo == -1) { + + for (int j = 0; j < voices.length; j++) { + if (voices[j].stealer_channel == null) { + if (v == null) { + v = voices[j]; + voiceNo = j; + } + if (voices[j].voiceID < v.voiceID) { + v = voices[j]; + voiceNo = j; + } + } + } + } + + return voiceNo; + } + + } + + protected void initVoice(SoftVoice voice, SoftPerformer p, int voiceID, + int noteNumber, int velocity, ModelConnectionBlock[] connectionBlocks, + ModelChannelMixer channelmixer, boolean releaseTriggered) { + if (voice.active) { + // Voice is active , we must steal the voice + voice.stealer_channel = this; + voice.stealer_performer = p; + voice.stealer_voiceID = voiceID; + voice.stealer_noteNumber = noteNumber; + voice.stealer_velocity = velocity; + voice.stealer_extendedConnectionBlocks = connectionBlocks; + voice.stealer_channelmixer = channelmixer; + voice.stealer_releaseTriggered = releaseTriggered; + for (int i = 0; i < voices.length; i++) + if (voices[i].active && voices[i].voiceID == voice.voiceID) + voices[i].soundOff(); + return; + } + + voice.extendedConnectionBlocks = connectionBlocks; + voice.channelmixer = channelmixer; + voice.releaseTriggered = releaseTriggered; + voice.voiceID = voiceID; + voice.tuning = tuning; + voice.exclusiveClass = p.exclusiveClass; + voice.softchannel = this; + voice.channel = channel; + voice.bank = bank; + voice.program = program; + voice.instrument = current_instrument; + voice.performer = p; + voice.objects.clear(); + voice.objects.put("midi", co_midi[noteNumber]); + voice.objects.put("midi_cc", co_midi_cc); + voice.objects.put("midi_rpn", co_midi_rpn); + voice.objects.put("midi_nrpn", co_midi_nrpn); + voice.noteOn(noteNumber, velocity); + voice.setMute(mute); + voice.setSoloMute(solomute); + if (releaseTriggered) + return; + if (portamento_control_note != -1) { + voice.co_noteon_keynumber[0] + = (tuning.getTuning(portamento_control_note) / 100.0) + * (1f / 128f); + voice.portamento = true; + portamento_control_note = -1; + } else if (portamento) { + if (mono) { + if (portamento_lastnote[0] != -1) { + voice.co_noteon_keynumber[0] + = (tuning.getTuning(portamento_lastnote[0]) / 100.0) + * (1f / 128f); + voice.portamento = true; + portamento_control_note = -1; + } + portamento_lastnote[0] = noteNumber; + } else { + if (portamento_lastnote_ix != 0) { + portamento_lastnote_ix--; + voice.co_noteon_keynumber[0] + = (tuning.getTuning( + portamento_lastnote[portamento_lastnote_ix]) + / 100.0) + * (1f / 128f); + voice.portamento = true; + } + } + } + } + + public void noteOn(int noteNumber, int velocity) { + noteNumber = restrict7Bit(noteNumber); + velocity = restrict7Bit(velocity); + noteOn_internal(noteNumber, velocity); + if (current_mixer != null) + current_mixer.noteOn(noteNumber, velocity); + } + + private void noteOn_internal(int noteNumber, int velocity) { + + if (velocity == 0) { + noteOff_internal(noteNumber, 64); + return; + } + + synchronized (control_mutex) { + if (sustain) { + sustain = false; + for (int i = 0; i < voices.length; i++) { + if ((voices[i].sustain || voices[i].on) + && voices[i].channel == channel && voices[i].active + && voices[i].note == noteNumber) { + voices[i].sustain = false; + voices[i].on = true; + voices[i].noteOff(0); + } + } + sustain = true; + } + + mainmixer.activity(); + + if (mono) { + if (portamento) { + boolean n_found = false; + for (int i = 0; i < voices.length; i++) { + if (voices[i].on && voices[i].channel == channel + && voices[i].active + && voices[i].releaseTriggered == false) { + voices[i].portamento = true; + voices[i].setNote(noteNumber); + n_found = true; + } + } + if (n_found) { + portamento_lastnote[0] = noteNumber; + return; + } + } + + if (portamento_control_note != -1) { + boolean n_found = false; + for (int i = 0; i < voices.length; i++) { + if (voices[i].on && voices[i].channel == channel + && voices[i].active + && voices[i].note == portamento_control_note + && voices[i].releaseTriggered == false) { + voices[i].portamento = true; + voices[i].setNote(noteNumber); + n_found = true; + } + } + portamento_control_note = -1; + if (n_found) + return; + } + } + + if (mono) + allNotesOff(); + + if (current_instrument == null) { + current_instrument + = synthesizer.findInstrument(program, bank, channel); + if (current_instrument == null) + return; + if (current_mixer != null) + mainmixer.stopMixer(current_mixer); + current_mixer = current_instrument.getSourceInstrument() + .getChannelMixer(this, synthesizer.getFormat()); + if (current_mixer != null) + mainmixer.registerMixer(current_mixer); + current_director = current_instrument.getDirector(this, this); + applyInstrumentCustomization(); + } + prevVoiceID = synthesizer.voiceIDCounter++; + firstVoice = true; + voiceNo = 0; + + int tunedKey = (int)(Math.round(tuning.getTuning()[noteNumber]/100.0)); + play_noteNumber = noteNumber; + play_velocity = velocity; + play_releasetriggered = false; + lastVelocity[noteNumber] = velocity; + current_director.noteOn(tunedKey, velocity); + + /* + SoftPerformer[] performers = current_instrument.getPerformers(); + for (int i = 0; i < performers.length; i++) { + SoftPerformer p = performers[i]; + if (p.keyFrom <= tunedKey && p.keyTo >= tunedKey) { + if (p.velFrom <= velocity && p.velTo >= velocity) { + if (firstVoice) { + firstVoice = false; + if (p.exclusiveClass != 0) { + int x = p.exclusiveClass; + for (int j = 0; j < voices.length; j++) { + if (voices[j].active + && voices[j].channel == channel + && voices[j].exclusiveClass == x) { + if (!(p.selfNonExclusive + && voices[j].note == noteNumber)) + voices[j].shutdown(); + } + } + } + } + voiceNo = findFreeVoice(voiceNo); + if (voiceNo == -1) + return; + initVoice(voices[voiceNo], p, prevVoiceID, noteNumber, + velocity); + } + } + } + */ + } + } + + public void noteOff(int noteNumber, int velocity) { + noteNumber = restrict7Bit(noteNumber); + velocity = restrict7Bit(velocity); + noteOff_internal(noteNumber, velocity); + + if (current_mixer != null) + current_mixer.noteOff(noteNumber, velocity); + } + + private void noteOff_internal(int noteNumber, int velocity) { + synchronized (control_mutex) { + + if (!mono) { + if (portamento) { + if (portamento_lastnote_ix != 127) { + portamento_lastnote[portamento_lastnote_ix] = noteNumber; + portamento_lastnote_ix++; + } + } + } + + mainmixer.activity(); + for (int i = 0; i < voices.length; i++) { + if (voices[i].on && voices[i].channel == channel + && voices[i].note == noteNumber + && voices[i].releaseTriggered == false) { + voices[i].noteOff(velocity); + } + } + + // Try play back note-off triggered voices, + + if (current_instrument == null) { + current_instrument + = synthesizer.findInstrument(program, bank, channel); + if (current_instrument == null) + return; + if (current_mixer != null) + mainmixer.stopMixer(current_mixer); + current_mixer = current_instrument.getSourceInstrument() + .getChannelMixer(this, synthesizer.getFormat()); + if (current_mixer != null) + mainmixer.registerMixer(current_mixer); + current_director = current_instrument.getDirector(this, this); + applyInstrumentCustomization(); + + } + prevVoiceID = synthesizer.voiceIDCounter++; + firstVoice = true; + voiceNo = 0; + + int tunedKey = (int)(Math.round(tuning.getTuning()[noteNumber]/100.0)); + play_noteNumber = noteNumber; + play_velocity = lastVelocity[noteNumber]; + play_releasetriggered = true; + current_director.noteOff(tunedKey, velocity); + + } + } + private int[] lastVelocity = new int[128]; + private int prevVoiceID; + private boolean firstVoice = true; + private int voiceNo = 0; + private int play_noteNumber = 0; + private int play_velocity = 0; + private boolean play_releasetriggered = false; + + public void play(int performerIndex, ModelConnectionBlock[] connectionBlocks) { + + int noteNumber = play_noteNumber; + int velocity = play_velocity; + boolean releasetriggered = play_releasetriggered; + + SoftPerformer p = current_instrument.getPerformers()[performerIndex]; + + if (firstVoice) { + firstVoice = false; + if (p.exclusiveClass != 0) { + int x = p.exclusiveClass; + for (int j = 0; j < voices.length; j++) { + if (voices[j].active && voices[j].channel == channel + && voices[j].exclusiveClass == x) { + if (!(p.selfNonExclusive && voices[j].note == noteNumber)) + voices[j].shutdown(); + } + } + } + } + + voiceNo = findFreeVoice(voiceNo); + + if (voiceNo == -1) + return; + + initVoice(voices[voiceNo], p, prevVoiceID, noteNumber, velocity, + connectionBlocks, current_mixer, releasetriggered); + } + + public void noteOff(int noteNumber) { + if(noteNumber < 0 || noteNumber > 127) return; + noteOff_internal(noteNumber, 64); + } + + public void setPolyPressure(int noteNumber, int pressure) { + noteNumber = restrict7Bit(noteNumber); + pressure = restrict7Bit(pressure); + + if (current_mixer != null) + current_mixer.setPolyPressure(noteNumber, pressure); + + synchronized (control_mutex) { + mainmixer.activity(); + co_midi[noteNumber].get(0, "poly_pressure")[0] = pressure*(1.0/128.0); + polypressure[noteNumber] = pressure; + for (int i = 0; i < voices.length; i++) { + if (voices[i].active && voices[i].note == noteNumber) + voices[i].setPolyPressure(pressure); + } + } + } + + public int getPolyPressure(int noteNumber) { + synchronized (control_mutex) { + return polypressure[noteNumber]; + } + } + + public void setChannelPressure(int pressure) { + pressure = restrict7Bit(pressure); + if (current_mixer != null) + current_mixer.setChannelPressure(pressure); + synchronized (control_mutex) { + mainmixer.activity(); + co_midi_channel_pressure[0] = pressure * (1.0 / 128.0); + channelpressure = pressure; + for (int i = 0; i < voices.length; i++) { + if (voices[i].active) + voices[i].setChannelPressure(pressure); + } + } + } + + public int getChannelPressure() { + synchronized (control_mutex) { + return channelpressure; + } + } + + protected void applyInstrumentCustomization() { + if (cds_control_connections == null + && cds_channelpressure_connections == null + && cds_polypressure_connections == null) { + return; + } + + ModelInstrument src_instrument = current_instrument.getSourceInstrument(); + ModelPerformer[] performers = src_instrument.getPerformers(); + ModelPerformer[] new_performers = new ModelPerformer[performers.length]; + for (int i = 0; i < new_performers.length; i++) { + ModelPerformer performer = performers[i]; + ModelPerformer new_performer = new ModelPerformer(); + new_performer.setName(performer.getName()); + new_performer.setExclusiveClass(performer.getExclusiveClass()); + new_performer.setKeyFrom(performer.getKeyFrom()); + new_performer.setKeyTo(performer.getKeyTo()); + new_performer.setVelFrom(performer.getVelFrom()); + new_performer.setVelTo(performer.getVelTo()); + new_performer.getOscillators().addAll(performer.getOscillators()); + new_performer.getConnectionBlocks().addAll( + performer.getConnectionBlocks()); + new_performers[i] = new_performer; + + List connblocks = + new_performer.getConnectionBlocks(); + + if (cds_control_connections != null) { + String cc = Integer.toString(cds_control_number); + Iterator iter = connblocks.iterator(); + while (iter.hasNext()) { + ModelConnectionBlock conn = iter.next(); + ModelSource[] sources = conn.getSources(); + boolean removeok = false; + if (sources != null) { + for (int j = 0; j < sources.length; j++) { + ModelSource src = sources[j]; + if ("midi_cc".equals(src.getIdentifier().getObject()) + && cc.equals(src.getIdentifier().getVariable())) { + removeok = true; + } + } + } + if (removeok) + iter.remove(); + } + for (int j = 0; j < cds_control_connections.length; j++) + connblocks.add(cds_control_connections[j]); + } + + if (cds_polypressure_connections != null) { + Iterator iter = connblocks.iterator(); + while (iter.hasNext()) { + ModelConnectionBlock conn = iter.next(); + ModelSource[] sources = conn.getSources(); + boolean removeok = false; + if (sources != null) { + for (int j = 0; j < sources.length; j++) { + ModelSource src = sources[j]; + if ("midi".equals(src.getIdentifier().getObject()) + && "poly_pressure".equals( + src.getIdentifier().getVariable())) { + removeok = true; + } + } + } + if (removeok) + iter.remove(); + } + for (int j = 0; j < cds_polypressure_connections.length; j++) + connblocks.add(cds_polypressure_connections[j]); + } + + + if (cds_channelpressure_connections != null) { + Iterator iter = connblocks.iterator(); + while (iter.hasNext()) { + ModelConnectionBlock conn = iter.next(); + ModelSource[] sources = conn.getSources(); + boolean removeok = false; + if (sources != null) { + for (int j = 0; j < sources.length; j++) { + ModelIdentifier srcid = sources[j].getIdentifier(); + if ("midi".equals(srcid.getObject()) && + "channel_pressure".equals(srcid.getVariable())) { + removeok = true; + } + } + } + if (removeok) + iter.remove(); + } + for (int j = 0; j < cds_channelpressure_connections.length; j++) + connblocks.add(cds_channelpressure_connections[j]); + } + + } + + current_instrument = new SoftInstrument(src_instrument, new_performers); + + } + + private ModelConnectionBlock[] createModelConnections(ModelIdentifier sid, + int[] destination, int[] range) { + + /* + controlled parameter (pp)|range (rr)| Description |Default + -------------------------|----------|-------------------------|------- + 00 Pitch Control | 28H..58H | -24..+24 semitones | 40H + 01 Filter Cutoff Control | 00H..7FH | -9600..+9450 cents | 40H + 02 Amplitude Control | 00H..7FH | 0..(127/64)*100 percent | 40H + 03 LFO Pitch Depth | 00H..7FH | 0..600 cents | 0 + 04 LFO Filter Depth | 00H..7FH | 0..2400 cents | 0 + 05 LFO Amplitude Depth | 00H..7FH | 0..100 percent | 0 + */ + + List conns = new ArrayList(); + + for (int i = 0; i < destination.length; i++) { + int d = destination[i]; + int r = range[i]; + if (d == 0) { + double scale = (r - 64) * 100; + ModelConnectionBlock conn = new ModelConnectionBlock( + new ModelSource(sid, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + scale, + new ModelDestination( + new ModelIdentifier("osc", "pitch"))); + conns.add(conn); + + } + if (d == 1) { + double scale = (r / 64.0 - 1.0) * 9600.0; + ModelConnectionBlock conn; + if (scale > 0) { + conn = new ModelConnectionBlock( + new ModelSource(sid, + ModelStandardTransform.DIRECTION_MAX2MIN, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + -scale, + new ModelDestination( + ModelDestination.DESTINATION_FILTER_FREQ)); + } else { + conn = new ModelConnectionBlock( + new ModelSource(sid, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + scale, + new ModelDestination( + ModelDestination.DESTINATION_FILTER_FREQ)); + } + conns.add(conn); + } + if (d == 2) { + final double scale = (r / 64.0); + ModelTransform mt = new ModelTransform() { + double s = scale; + public double transform(double value) { + if (s < 1) + value = s + (value * (1.0 - s)); + else if (s > 1) + value = 1 + (value * (s - 1.0)); + else + return 0; + return -((5.0 / 12.0) / Math.log(10)) * Math.log(value); + } + }; + + ModelConnectionBlock conn = new ModelConnectionBlock( + new ModelSource(sid, mt), -960, + new ModelDestination(ModelDestination.DESTINATION_GAIN)); + conns.add(conn); + + } + if (d == 3) { + double scale = (r / 64.0 - 1.0) * 9600.0; + ModelConnectionBlock conn = new ModelConnectionBlock( + new ModelSource(ModelSource.SOURCE_LFO1, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + new ModelSource(sid, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + scale, + new ModelDestination( + ModelDestination.DESTINATION_PITCH)); + conns.add(conn); + } + if (d == 4) { + double scale = (r / 128.0) * 2400.0; + ModelConnectionBlock conn = new ModelConnectionBlock( + new ModelSource(ModelSource.SOURCE_LFO1, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + new ModelSource(sid, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + scale, + new ModelDestination( + ModelDestination.DESTINATION_FILTER_FREQ)); + conns.add(conn); + } + if (d == 5) { + final double scale = (r / 127.0); + + ModelTransform mt = new ModelTransform() { + double s = scale; + public double transform(double value) { + return -((5.0 / 12.0) / Math.log(10)) + * Math.log(1 - value * s); + } + }; + + ModelConnectionBlock conn = new ModelConnectionBlock( + new ModelSource(ModelSource.SOURCE_LFO1, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + new ModelSource(sid, mt), + -960, + new ModelDestination( + ModelDestination.DESTINATION_GAIN)); + conns.add(conn); + } + } + + return conns.toArray(new ModelConnectionBlock[conns.size()]); + } + + public void mapPolyPressureToDestination(int[] destination, int[] range) { + current_instrument = null; + if (destination.length == 0) { + cds_polypressure_connections = null; + return; + } + cds_polypressure_connections + = createModelConnections( + new ModelIdentifier("midi", "poly_pressure"), + destination, range); + } + + public void mapChannelPressureToDestination(int[] destination, int[] range) { + current_instrument = null; + if (destination.length == 0) { + cds_channelpressure_connections = null; + return; + } + cds_channelpressure_connections + = createModelConnections( + new ModelIdentifier("midi", "channel_pressure"), + destination, range); + } + + public void mapControlToDestination(int control, int[] destination, int[] range) { + + if (!((control >= 0x01 && control <= 0x1F) + || (control >= 0x40 && control <= 0x5F))) { + cds_control_connections = null; + return; + } + + current_instrument = null; + cds_control_number = control; + if (destination.length == 0) { + cds_control_connections = null; + return; + } + cds_control_connections + = createModelConnections( + new ModelIdentifier("midi_cc", Integer.toString(control)), + destination, range); + } + + public void controlChangePerNote(int noteNumber, int controller, int value) { + +/* + CC# | nn | Name | vv | default | description +-----|------|-------------------------|----------------|------------|------------------------------- +7 |07H |Note Volume |00H-40H-7FH |40H |0-100-(127/64)*100(%)(Relative) +10 |0AH |*Pan |00H-7FH absolute|Preset Value|Left-Center-Right (absolute) +33-63|21-3FH|LSB for |01H-1FH | | +71 |47H |Timbre/Harmonic Intensity|00H-40H-7FH |40H (???) | +72 |48H |Release Time |00H-40H-7FH |40H (???) | +73 |49H |Attack Time |00H-40H-7FH |40H (???) | +74 |4AH |Brightness |00H-40H-7FH |40H (???) | +75 |4BH |Decay Time |00H-40H-7FH |40H (???) | +76 |4CH |Vibrato Rate |00H-40H-7FH |40H (???) | +77 |4DH |Vibrato Depth |00H-40H-7FH |40H (???) | +78 |4EH |Vibrato Delay |00H-40H-7FH |40H (???) | +91 |5BH |*Reverb Send |00H-7FH absolute|Preset Value|Left-Center-Right (absolute) +93 |5DH |*Chorus Send |00H-7FH absolute|Preset Value|Left-Center-Right (absolute) +120 |78H |**Fine Tuning |00H-40H-7FH |40H (???) | +121 |79H |**Coarse Tuning |00H-40H-7FH |40H (???) | +*/ + + if (keybasedcontroller_active == null) { + keybasedcontroller_active = new boolean[128][]; + keybasedcontroller_value = new double[128][]; + } + if (keybasedcontroller_active[noteNumber] == null) { + keybasedcontroller_active[noteNumber] = new boolean[128]; + Arrays.fill(keybasedcontroller_active[noteNumber], false); + keybasedcontroller_value[noteNumber] = new double[128]; + Arrays.fill(keybasedcontroller_value[noteNumber], 0); + } + + if (value == -1) { + keybasedcontroller_active[noteNumber][controller] = false; + } else { + keybasedcontroller_active[noteNumber][controller] = true; + keybasedcontroller_value[noteNumber][controller] = value / 128.0; + } + + if (controller < 120) { + for (int i = 0; i < voices.length; i++) + if (voices[i].active) + voices[i].controlChange(controller, -1); + } else if (controller == 120) { + for (int i = 0; i < voices.length; i++) + if (voices[i].active) + voices[i].rpnChange(1, -1); + } else if (controller == 121) { + for (int i = 0; i < voices.length; i++) + if (voices[i].active) + voices[i].rpnChange(2, -1); + } + + } + + public int getControlPerNote(int noteNumber, int controller) { + if (keybasedcontroller_active == null) + return -1; + if (keybasedcontroller_active[noteNumber] == null) + return -1; + if (!keybasedcontroller_active[noteNumber][controller]) + return -1; + return (int)(keybasedcontroller_value[noteNumber][controller] * 128); + } + + public void controlChange(int controller, int value) { + controller = restrict7Bit(controller); + value = restrict7Bit(value); + if (current_mixer != null) + current_mixer.controlChange(controller, value); + + synchronized (control_mutex) { + switch (controller) { + /* + Mapco_midi_rpn_rpn_i = new HashMap(); + Mapco_midi_rpn_rpn = new HashMap(); + Mapco_midi_nrpn_nrpn_i = new HashMap(); + Mapco_midi_nrpn_nrpn = new HashMap(); + */ + + case 5: + // This produce asin-like curve + // as described in General Midi Level 2 Specification, page 6 + double x = -Math.asin((value / 128.0) * 2 - 1) / Math.PI + 0.5; + x = Math.pow(100000.0, x) / 100.0; // x is now cent/msec + // Convert x from cent/msec to key/controlbuffertime + x = x / 100.0; // x is now keys/msec + x = x * 1000.0; // x is now keys/sec + x = x / synthesizer.getControlRate(); // x is now keys/controlbuffertime + portamento_time = x; + break; + case 6: + case 38: + case 96: + case 97: + int val = 0; + if (nrpn_control != RPN_NULL_VALUE) { + int[] val_i = co_midi_nrpn_nrpn_i.get(nrpn_control); + if (val_i != null) + val = val_i[0]; + } + if (rpn_control != RPN_NULL_VALUE) { + int[] val_i = co_midi_rpn_rpn_i.get(rpn_control); + if (val_i != null) + val = val_i[0]; + } + + if (controller == 6) + val = (val & 127) + (value << 7); + else if (controller == 38) + val = (val & (127 << 7)) + value; + else if (controller == 96 || controller == 97) { + int step = 1; + if (rpn_control == 2 || rpn_control == 3 || rpn_control == 4) + step = 128; + if (controller == 96) + val += step; + if (controller == 97) + val -= step; + } + + if (nrpn_control != RPN_NULL_VALUE) + nrpnChange(nrpn_control, val); + if (rpn_control != RPN_NULL_VALUE) + rpnChange(rpn_control, val); + + break; + case 64: // Hold1 (Damper) (cc#64) + boolean on = value >= 64; + if (sustain != on) { + sustain = on; + if (!on) { + for (int i = 0; i < voices.length; i++) { + if (voices[i].active && voices[i].sustain && + voices[i].channel == channel) { + voices[i].sustain = false; + if (!voices[i].on) { + voices[i].on = true; + voices[i].noteOff(0); + } + } + } + } else { + for (int i = 0; i < voices.length; i++) + if (voices[i].active && voices[i].channel == channel) + voices[i].redamp(); + } + } + break; + case 65: + //allNotesOff(); + portamento = value >= 64; + portamento_lastnote[0] = -1; + /* + for (int i = 0; i < portamento_lastnote.length; i++) + portamento_lastnote[i] = -1; + */ + portamento_lastnote_ix = 0; + break; + case 66: // Sostenuto (cc#66) + on = value >= 64; + if (on) { + for (int i = 0; i < voices.length; i++) { + if (voices[i].active && voices[i].on && + voices[i].channel == channel) { + voices[i].sostenuto = true; + } + } + } + if (!on) { + for (int i = 0; i < voices.length; i++) { + if (voices[i].active && voices[i].sostenuto && + voices[i].channel == channel) { + voices[i].sostenuto = false; + if (!voices[i].on) { + voices[i].on = true; + voices[i].noteOff(0); + } + } + } + } + break; + case 84: + portamento_control_note = value; + break; + case 98: + nrpn_control = (nrpn_control & (127 << 7)) + value; + rpn_control = RPN_NULL_VALUE; + break; + case 99: + nrpn_control = (nrpn_control & 127) + (value << 7); + rpn_control = RPN_NULL_VALUE; + break; + case 100: + rpn_control = (rpn_control & (127 << 7)) + value; + nrpn_control = RPN_NULL_VALUE; + break; + case 101: + rpn_control = (rpn_control & 127) + (value << 7); + nrpn_control = RPN_NULL_VALUE; + break; + case 120: + allSoundOff(); + break; + case 121: + resetAllControllers(value == 127); + break; + case 122: + localControl(value >= 64); + break; + case 123: + allNotesOff(); + break; + case 124: + setOmni(false); + break; + case 125: + setOmni(true); + break; + case 126: + if (value == 1) + setMono(true); + break; + case 127: + setMono(false); + break; + + default: + break; + } + + co_midi_cc_cc[controller][0] = value * (1.0 / 128.0); + + if (controller == 0x00) { + bank = /*(bank & 127) +*/ (value << 7); + return; + } + + if (controller == 0x20) { + bank = (bank & (127 << 7)) + value; + return; + } + + this.controller[controller] = value; + if(controller < 0x20) + this.controller[controller + 0x20] = 0; + + for (int i = 0; i < voices.length; i++) + if (voices[i].active) + voices[i].controlChange(controller, value); + + } + } + + public int getController(int controller) { + synchronized (control_mutex) { + // Should only return lower 7 bits, + // even when controller is "boosted" higher. + return this.controller[controller] & 127; + } + } + + public void tuningChange(int program) { + tuningChange(0, program); + } + + public void tuningChange(int bank, int program) { + synchronized (control_mutex) { + tuning = synthesizer.getTuning(new Patch(bank, program)); + } + } + + public void programChange(int program) { + programChange(bank, program); + } + + public void programChange(int bank, int program) { + bank = restrict7Bit(bank); + program = restrict7Bit(program); + synchronized (control_mutex) { + mainmixer.activity(); + this.bank = bank; + this.program = program; + current_instrument = null; + } + } + + public int getProgram() { + synchronized (control_mutex) { + return program; + } + } + + public void setPitchBend(int bend) { + bend = restrict14Bit(bend); + if (current_mixer != null) + current_mixer.setPitchBend(bend); + synchronized (control_mutex) { + mainmixer.activity(); + co_midi_pitch[0] = bend * (1.0 / 16384.0); + pitchbend = bend; + for (int i = 0; i < voices.length; i++) + if (voices[i].active) + voices[i].setPitchBend(bend); + } + } + + public int getPitchBend() { + synchronized (control_mutex) { + return pitchbend; + } + } + + public void nrpnChange(int controller, int value) { + + /* + System.out.println("(" + channel + ").nrpnChange(" + + Integer.toHexString(controller >> 7) + + " " + Integer.toHexString(controller & 127) + + ", " + Integer.toHexString(value >> 7) + + " " + Integer.toHexString(value & 127) + ")"); + */ + + if (synthesizer.getGeneralMidiMode() == 0) { + if (controller == (0x01 << 7) + (0x08)) // Vibrato Rate + controlChange(76, value >> 7); + if (controller == (0x01 << 7) + (0x09)) // Vibrato Depth + controlChange(77, value >> 7); + if (controller == (0x01 << 7) + (0x0A)) // Vibrato Delay + controlChange(78, value >> 7); + if (controller == (0x01 << 7) + (0x20)) // Brightness + controlChange(74, value >> 7); + if (controller == (0x01 << 7) + (0x21)) // Filter Resonance + controlChange(71, value >> 7); + if (controller == (0x01 << 7) + (0x63)) // Attack Time + controlChange(73, value >> 7); + if (controller == (0x01 << 7) + (0x64)) // Decay Time + controlChange(75, value >> 7); + if (controller == (0x01 << 7) + (0x66)) // Release Time + controlChange(72, value >> 7); + + if (controller >> 7 == 0x18) // Pitch coarse + controlChangePerNote(controller % 128, 120, value >> 7); + if (controller >> 7 == 0x1A) // Volume + controlChangePerNote(controller % 128, 7, value >> 7); + if (controller >> 7 == 0x1C) // Panpot + controlChangePerNote(controller % 128, 10, value >> 7); + if (controller >> 7 == 0x1D) // Reverb + controlChangePerNote(controller % 128, 91, value >> 7); + if (controller >> 7 == 0x1E) // Chorus + controlChangePerNote(controller % 128, 93, value >> 7); + } + + int[] val_i = co_midi_nrpn_nrpn_i.get(controller); + double[] val_d = co_midi_nrpn_nrpn.get(controller); + if (val_i == null) { + val_i = new int[1]; + co_midi_nrpn_nrpn_i.put(controller, val_i); + } + if (val_d == null) { + val_d = new double[1]; + co_midi_nrpn_nrpn.put(controller, val_d); + } + val_i[0] = value; + val_d[0] = val_i[0] * (1.0 / 16384.0); + + for (int i = 0; i < voices.length; i++) + if (voices[i].active) + voices[i].nrpnChange(controller, val_i[0]); + + } + + public void rpnChange(int controller, int value) { + + /* + System.out.println("(" + channel + ").rpnChange(" + + Integer.toHexString(controller >> 7) + + " " + Integer.toHexString(controller & 127) + + ", " + Integer.toHexString(value >> 7) + + " " + Integer.toHexString(value & 127) + ")"); + */ + + if (controller == 3) { + tuning_program = (value >> 7) & 127; + tuningChange(tuning_bank, tuning_program); + } + if (controller == 4) { + tuning_bank = (value >> 7) & 127; + } + + int[] val_i = co_midi_rpn_rpn_i.get(controller); + double[] val_d = co_midi_rpn_rpn.get(controller); + if (val_i == null) { + val_i = new int[1]; + co_midi_rpn_rpn_i.put(controller, val_i); + } + if (val_d == null) { + val_d = new double[1]; + co_midi_rpn_rpn.put(controller, val_d); + } + val_i[0] = value; + val_d[0] = val_i[0] * (1.0 / 16384.0); + + for (int i = 0; i < voices.length; i++) + if (voices[i].active) + voices[i].rpnChange(controller, val_i[0]); + } + + public void resetAllControllers() { + resetAllControllers(false); + } + + public void resetAllControllers(boolean allControls) { + synchronized (control_mutex) { + mainmixer.activity(); + + for (int i = 0; i < 128; i++) { + setPolyPressure(i, 0); + } + setChannelPressure(0); + setPitchBend(8192); + for (int i = 0; i < 128; i++) { + if (!dontResetControls[i]) + controlChange(i, 0); + } + + controlChange(71, 64); // Filter Resonance + controlChange(72, 64); // Release Time + controlChange(73, 64); // Attack Time + controlChange(74, 64); // Brightness + controlChange(75, 64); // Decay Time + controlChange(76, 64); // Vibrato Rate + controlChange(77, 64); // Vibrato Depth + controlChange(78, 64); // Vibrato Delay + + controlChange(8, 64); // Balance + controlChange(11, 127); // Expression + controlChange(98, 127); // NRPN Null + controlChange(99, 127); // NRPN Null + controlChange(100, 127); // RPN = Null + controlChange(101, 127); // RPN = Null + + // see DLS 2.1 (Power-on Default Values) + if (allControls) { + + keybasedcontroller_active = null; + keybasedcontroller_value = null; + + controlChange(7, 100); // Volume + controlChange(10, 64); // Pan + controlChange(91, 40); // Reverb + + for (int controller : co_midi_rpn_rpn.keySet()) { + // don't reset tuning settings + if (controller != 3 && controller != 4) + rpnChange(controller, 0); + } + for (int controller : co_midi_nrpn_nrpn.keySet()) + nrpnChange(controller, 0); + rpnChange(0, 2 << 7); // Bitch Bend sensitivity + rpnChange(1, 64 << 7); // Channel fine tunning + rpnChange(2, 64 << 7); // Channel Coarse Tuning + rpnChange(5, 64); // Modulation Depth, +/- 50 cent + + tuning_bank = 0; + tuning_program = 0; + tuning = new SoftTuning(); + + } + + } + } + + public void allNotesOff() { + if (current_mixer != null) + current_mixer.allNotesOff(); + synchronized (control_mutex) { + for (int i = 0; i < voices.length; i++) + if (voices[i].on && voices[i].channel == channel + && voices[i].releaseTriggered == false) { + voices[i].noteOff(0); + } + } + } + + public void allSoundOff() { + if (current_mixer != null) + current_mixer.allSoundOff(); + synchronized (control_mutex) { + for (int i = 0; i < voices.length; i++) + if (voices[i].on && voices[i].channel == channel) + voices[i].soundOff(); + } + } + + public boolean localControl(boolean on) { + return false; + } + + public void setMono(boolean on) { + if (current_mixer != null) + current_mixer.setMono(on); + synchronized (control_mutex) { + allNotesOff(); + mono = on; + } + } + + public boolean getMono() { + synchronized (control_mutex) { + return mono; + } + } + + public void setOmni(boolean on) { + if (current_mixer != null) + current_mixer.setOmni(on); + allNotesOff(); + // Omni is not supported by GM2 + } + + public boolean getOmni() { + return false; + } + + public void setMute(boolean mute) { + if (current_mixer != null) + current_mixer.setMute(mute); + synchronized (control_mutex) { + this.mute = mute; + for (int i = 0; i < voices.length; i++) + if (voices[i].active && voices[i].channel == channel) + voices[i].setMute(mute); + } + } + + public boolean getMute() { + synchronized (control_mutex) { + return mute; + } + } + + public void setSolo(boolean soloState) { + if (current_mixer != null) + current_mixer.setSolo(soloState); + + synchronized (control_mutex) { + this.solo = soloState; + + boolean soloinuse = false; + for (SoftChannel c : synthesizer.channels) { + if (c.solo) { + soloinuse = true; + break; + } + } + + if (!soloinuse) { + for (SoftChannel c : synthesizer.channels) + c.setSoloMute(false); + return; + } + + for (SoftChannel c : synthesizer.channels) + c.setSoloMute(!c.solo); + + } + + } + + private void setSoloMute(boolean mute) { + synchronized (control_mutex) { + if (solomute == mute) + return; + this.solomute = mute; + for (int i = 0; i < voices.length; i++) + if (voices[i].active && voices[i].channel == channel) + voices[i].setSoloMute(solomute); + } + } + + public boolean getSolo() { + synchronized (control_mutex) { + return solo; + } + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftChannelProxy.java b/jdk/src/share/classes/com/sun/media/sound/SoftChannelProxy.java new file mode 100644 index 00000000000..d4fcf886181 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftChannelProxy.java @@ -0,0 +1,202 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import javax.sound.midi.MidiChannel; + +/** + * A MidiChannel proxy object used for external access to synthesizer internal + * channel objects. + * + * @author Karl Helgason + */ +public class SoftChannelProxy implements MidiChannel { + + private MidiChannel channel = null; + + public MidiChannel getChannel() { + return channel; + } + + public void setChannel(MidiChannel channel) { + this.channel = channel; + } + + public void allNotesOff() { + if (channel == null) + return; + channel.allNotesOff(); + } + + public void allSoundOff() { + if (channel == null) + return; + channel.allSoundOff(); + } + + public void controlChange(int controller, int value) { + if (channel == null) + return; + channel.controlChange(controller, value); + } + + public int getChannelPressure() { + if (channel == null) + return 0; + return channel.getChannelPressure(); + } + + public int getController(int controller) { + if (channel == null) + return 0; + return channel.getController(controller); + } + + public boolean getMono() { + if (channel == null) + return false; + return channel.getMono(); + } + + public boolean getMute() { + if (channel == null) + return false; + return channel.getMute(); + } + + public boolean getOmni() { + if (channel == null) + return false; + return channel.getOmni(); + } + + public int getPitchBend() { + if (channel == null) + return 8192; + return channel.getPitchBend(); + } + + public int getPolyPressure(int noteNumber) { + if (channel == null) + return 0; + return channel.getPolyPressure(noteNumber); + } + + public int getProgram() { + if (channel == null) + return 0; + return channel.getProgram(); + } + + public boolean getSolo() { + if (channel == null) + return false; + return channel.getSolo(); + } + + public boolean localControl(boolean on) { + if (channel == null) + return false; + return channel.localControl(on); + } + + public void noteOff(int noteNumber) { + if (channel == null) + return; + channel.noteOff(noteNumber); + } + + public void noteOff(int noteNumber, int velocity) { + if (channel == null) + return; + channel.noteOff(noteNumber, velocity); + } + + public void noteOn(int noteNumber, int velocity) { + if (channel == null) + return; + channel.noteOn(noteNumber, velocity); + } + + public void programChange(int program) { + if (channel == null) + return; + channel.programChange(program); + } + + public void programChange(int bank, int program) { + if (channel == null) + return; + channel.programChange(bank, program); + } + + public void resetAllControllers() { + if (channel == null) + return; + channel.resetAllControllers(); + } + + public void setChannelPressure(int pressure) { + if (channel == null) + return; + channel.setChannelPressure(pressure); + } + + public void setMono(boolean on) { + if (channel == null) + return; + channel.setMono(on); + } + + public void setMute(boolean mute) { + if (channel == null) + return; + channel.setMute(mute); + } + + public void setOmni(boolean on) { + if (channel == null) + return; + channel.setOmni(on); + } + + public void setPitchBend(int bend) { + if (channel == null) + return; + channel.setPitchBend(bend); + } + + public void setPolyPressure(int noteNumber, int pressure) { + if (channel == null) + return; + channel.setPolyPressure(noteNumber, pressure); + } + + public void setSolo(boolean soloState) { + if (channel == null) + return; + channel.setSolo(soloState); + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftChorus.java b/jdk/src/share/classes/com/sun/media/sound/SoftChorus.java new file mode 100644 index 00000000000..0a9f6443950 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftChorus.java @@ -0,0 +1,341 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.Arrays; + +/** + * A chorus effect made using LFO and variable delay. One for each channel + * (left,right), with different starting phase for stereo effect. + * + * @author Karl Helgason + */ +public class SoftChorus implements SoftAudioProcessor { + + private static class VariableDelay { + + private float[] delaybuffer; + private int rovepos = 0; + private volatile float gain = 1; + private volatile float rgain = 0; + private volatile float delay = 0; + private float lastdelay = 0; + private volatile float feedback = 0; + + public VariableDelay(int maxbuffersize) { + delaybuffer = new float[maxbuffersize]; + } + + public void setDelay(float delay) { + this.delay = delay; + } + + public void setFeedBack(float feedback) { + this.feedback = feedback; + } + + public void setGain(float gain) { + this.gain = gain; + } + + public void setReverbSendGain(float rgain) { + this.rgain = rgain; + } + + public void processMix(float[] in, float[] out, float[] rout) { + float gain = this.gain; + float delay = this.delay; + float feedback = this.feedback; + + float[] delaybuffer = this.delaybuffer; + int len = in.length; + float delaydelta = (delay - lastdelay) / len; + int rnlen = delaybuffer.length; + int rovepos = this.rovepos; + + if (rout == null) + for (int i = 0; i < len; i++) { + float r = rovepos - (lastdelay + 2) + rnlen; + int ri = (int) r; + float s = r - ri; + float a = delaybuffer[ri % rnlen]; + float b = delaybuffer[(ri + 1) % rnlen]; + float o = a * (1 - s) + b * (s); + out[i] += o * gain; + delaybuffer[rovepos] = in[i] + o * feedback; + rovepos = (rovepos + 1) % rnlen; + lastdelay += delaydelta; + } + else + for (int i = 0; i < len; i++) { + float r = rovepos - (lastdelay + 2) + rnlen; + int ri = (int) r; + float s = r - ri; + float a = delaybuffer[ri % rnlen]; + float b = delaybuffer[(ri + 1) % rnlen]; + float o = a * (1 - s) + b * (s); + out[i] += o * gain; + rout[i] += o * rgain; + delaybuffer[rovepos] = in[i] + o * feedback; + rovepos = (rovepos + 1) % rnlen; + lastdelay += delaydelta; + } + this.rovepos = rovepos; + lastdelay = delay; + } + + public void processReplace(float[] in, float[] out, float[] rout) { + Arrays.fill(out, 0); + Arrays.fill(rout, 0); + processMix(in, out, rout); + } + } + + private static class LFODelay { + + private volatile double c_cos_delta; + private volatile double c_sin_delta; + private double c_cos = 1; + private double c_sin = 0; + private double depth = 0; + private VariableDelay vdelay; + private double samplerate; + private double controlrate; + + public LFODelay(double samplerate, double controlrate) { + this.samplerate = samplerate; + this.controlrate = controlrate; + // vdelay = new VariableDelay((int)(samplerate*4)); + vdelay = new VariableDelay((int) ((this.depth + 10) * 2)); + + } + + public void setDepth(double depth) { + this.depth = depth * samplerate; + vdelay = new VariableDelay((int) ((this.depth + 10) * 2)); + } + + public void setRate(double rate) { + double g = (Math.PI * 2) * (rate / controlrate); + c_cos_delta = Math.cos(g); + c_sin_delta = Math.sin(g); + } + + public void setPhase(double phase) { + c_cos = Math.cos(phase); + c_sin = Math.sin(phase); + } + + public void setFeedBack(float feedback) { + vdelay.setFeedBack(feedback); + } + + public void setGain(float gain) { + vdelay.setGain(gain); + } + + public void setReverbSendGain(float rgain) { + vdelay.setReverbSendGain(rgain); + } + + public void processMix(float[] in, float[] out, float[] rout) { + c_cos = c_cos * c_cos_delta - c_sin * c_sin_delta; + c_sin = c_cos * c_sin_delta + c_sin * c_cos_delta; + vdelay.setDelay((float) (depth * 0.5 * (c_cos + 2))); + vdelay.processMix(in, out, rout); + } + + public void processReplace(float[] in, float[] out, float[] rout) { + c_cos = c_cos * c_cos_delta - c_sin * c_sin_delta; + c_sin = c_cos * c_sin_delta + c_sin * c_cos_delta; + vdelay.setDelay((float) (depth * 0.5 * (c_cos + 2))); + vdelay.processReplace(in, out, rout); + + } + } + private boolean mix = true; + private SoftAudioBuffer inputA; + private SoftAudioBuffer left; + private SoftAudioBuffer right; + private SoftAudioBuffer reverb; + private LFODelay vdelay1L; + private LFODelay vdelay1R; + private float rgain = 0; + private boolean dirty = true; + private double dirty_vdelay1L_rate; + private double dirty_vdelay1R_rate; + private double dirty_vdelay1L_depth; + private double dirty_vdelay1R_depth; + private float dirty_vdelay1L_feedback; + private float dirty_vdelay1R_feedback; + private float dirty_vdelay1L_reverbsendgain; + private float dirty_vdelay1R_reverbsendgain; + private float controlrate; + + public void init(float samplerate, float controlrate) { + this.controlrate = controlrate; + vdelay1L = new LFODelay(samplerate, controlrate); + vdelay1R = new LFODelay(samplerate, controlrate); + vdelay1L.setGain(1.0f); // % + vdelay1R.setGain(1.0f); // % + vdelay1L.setPhase(0.5 * Math.PI); + vdelay1R.setPhase(0); + + globalParameterControlChange(new int[]{0x01 * 128 + 0x02}, 0, 2); + } + + public void globalParameterControlChange(int[] slothpath, long param, + long value) { + if (slothpath.length == 1) { + if (slothpath[0] == 0x01 * 128 + 0x02) { + if (param == 0) { // Chorus Type + switch ((int)value) { + case 0: // Chorus 1 0 (0%) 3 (0.4Hz) 5 (1.9ms) 0 (0%) + globalParameterControlChange(slothpath, 3, 0); + globalParameterControlChange(slothpath, 1, 3); + globalParameterControlChange(slothpath, 2, 5); + globalParameterControlChange(slothpath, 4, 0); + break; + case 1: // Chorus 2 5 (4%) 9 (1.1Hz) 19 (6.3ms) 0 (0%) + globalParameterControlChange(slothpath, 3, 5); + globalParameterControlChange(slothpath, 1, 9); + globalParameterControlChange(slothpath, 2, 19); + globalParameterControlChange(slothpath, 4, 0); + break; + case 2: // Chorus 3 8 (6%) 3 (0.4Hz) 19 (6.3ms) 0 (0%) + globalParameterControlChange(slothpath, 3, 8); + globalParameterControlChange(slothpath, 1, 3); + globalParameterControlChange(slothpath, 2, 19); + globalParameterControlChange(slothpath, 4, 0); + break; + case 3: // Chorus 4 16 (12%) 9 (1.1Hz) 16 (5.3ms) 0 (0%) + globalParameterControlChange(slothpath, 3, 16); + globalParameterControlChange(slothpath, 1, 9); + globalParameterControlChange(slothpath, 2, 16); + globalParameterControlChange(slothpath, 4, 0); + break; + case 4: // FB Chorus 64 (49%) 2 (0.2Hz) 24 (7.8ms) 0 (0%) + globalParameterControlChange(slothpath, 3, 64); + globalParameterControlChange(slothpath, 1, 2); + globalParameterControlChange(slothpath, 2, 24); + globalParameterControlChange(slothpath, 4, 0); + break; + case 5: // Flanger 112 (86%) 1 (0.1Hz) 5 (1.9ms) 0 (0%) + globalParameterControlChange(slothpath, 3, 112); + globalParameterControlChange(slothpath, 1, 1); + globalParameterControlChange(slothpath, 2, 5); + globalParameterControlChange(slothpath, 4, 0); + break; + default: + break; + } + } else if (param == 1) { // Mod Rate + dirty_vdelay1L_rate = (value * 0.122); + dirty_vdelay1R_rate = (value * 0.122); + dirty = true; + } else if (param == 2) { // Mod Depth + dirty_vdelay1L_depth = ((value + 1) / 3200.0); + dirty_vdelay1R_depth = ((value + 1) / 3200.0); + dirty = true; + } else if (param == 3) { // Feedback + dirty_vdelay1L_feedback = (value * 0.00763f); + dirty_vdelay1R_feedback = (value * 0.00763f); + dirty = true; + } + if (param == 4) { // Send to Reverb + rgain = value * 0.00787f; + dirty_vdelay1L_reverbsendgain = (value * 0.00787f); + dirty_vdelay1R_reverbsendgain = (value * 0.00787f); + dirty = true; + } + + } + } + } + + public void processControlLogic() { + if (dirty) { + dirty = false; + vdelay1L.setRate(dirty_vdelay1L_rate); + vdelay1R.setRate(dirty_vdelay1R_rate); + vdelay1L.setDepth(dirty_vdelay1L_depth); + vdelay1R.setDepth(dirty_vdelay1R_depth); + vdelay1L.setFeedBack(dirty_vdelay1L_feedback); + vdelay1R.setFeedBack(dirty_vdelay1R_feedback); + vdelay1L.setReverbSendGain(dirty_vdelay1L_reverbsendgain); + vdelay1R.setReverbSendGain(dirty_vdelay1R_reverbsendgain); + } + } + double silentcounter = 1000; + + public void processAudio() { + + if (inputA.isSilent()) { + silentcounter += 1 / controlrate; + + if (silentcounter > 1) { + if (!mix) { + left.clear(); + right.clear(); + } + return; + } + } else + silentcounter = 0; + + float[] inputA = this.inputA.array(); + float[] left = this.left.array(); + float[] right = this.right == null ? null : this.right.array(); + float[] reverb = rgain != 0 ? this.reverb.array() : null; + + if (mix) { + vdelay1L.processMix(inputA, left, reverb); + if (right != null) + vdelay1R.processMix(inputA, right, reverb); + } else { + vdelay1L.processReplace(inputA, left, reverb); + if (right != null) + vdelay1R.processReplace(inputA, right, reverb); + } + } + + public void setInput(int pin, SoftAudioBuffer input) { + if (pin == 0) + inputA = input; + } + + public void setMixMode(boolean mix) { + this.mix = mix; + } + + public void setOutput(int pin, SoftAudioBuffer output) { + if (pin == 0) + left = output; + if (pin == 1) + right = output; + if (pin == 2) + reverb = output; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftControl.java b/jdk/src/share/classes/com/sun/media/sound/SoftControl.java new file mode 100644 index 00000000000..7b521f39196 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftControl.java @@ -0,0 +1,36 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * SoftControl are the basic controls + * used for control-rate processing. + * + * @author Karl Helgason + */ +public interface SoftControl { + + public double[] get(int instance, String name); +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftCubicResampler.java b/jdk/src/share/classes/com/sun/media/sound/SoftCubicResampler.java new file mode 100644 index 00000000000..cc994111012 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftCubicResampler.java @@ -0,0 +1,87 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * A resampler that uses third-order (cubic) interpolation. + * + * @author Karl Helgason + */ +public class SoftCubicResampler extends SoftAbstractResampler { + + public int getPadding() { + return 3; + } + + public void interpolate(float[] in, float[] in_offset, float in_end, + float[] startpitch, float pitchstep, float[] out, int[] out_offset, + int out_end) { + float pitch = startpitch[0]; + float ix = in_offset[0]; + int ox = out_offset[0]; + float ix_end = in_end; + int ox_end = out_end; + if (pitchstep == 0) { + while (ix < ix_end && ox < ox_end) { + int iix = (int) ix; + float fix = ix - iix; + float y0 = in[iix - 1]; + float y1 = in[iix]; + float y2 = in[iix + 1]; + float y3 = in[iix + 2]; + float a0 = y3 - y2 + y1 - y0; + float a1 = y0 - y1 - a0; + float a2 = y2 - y0; + float a3 = y1; + //float fix2 = fix * fix; + //out[ox++] = (a0 * fix + a1) * fix2 + (a2 * fix + a3); + out[ox++] = ((a0 * fix + a1) * fix + a2) * fix + a3; + ix += pitch; + } + } else { + while (ix < ix_end && ox < ox_end) { + int iix = (int) ix; + float fix = ix - iix; + float y0 = in[iix - 1]; + float y1 = in[iix]; + float y2 = in[iix + 1]; + float y3 = in[iix + 2]; + float a0 = y3 - y2 + y1 - y0; + float a1 = y0 - y1 - a0; + float a2 = y2 - y0; + float a3 = y1; + //float fix2 = fix * fix; + //out[ox++] = (a0 * fix + a1) * fix2 + (a2 * fix + a3); + out[ox++] = ((a0 * fix + a1) * fix + a2) * fix + a3; + ix += pitch; + pitch += pitchstep; + } + } + in_offset[0] = ix; + out_offset[0] = ox; + startpitch[0] = pitch; + + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftEnvelopeGenerator.java b/jdk/src/share/classes/com/sun/media/sound/SoftEnvelopeGenerator.java new file mode 100644 index 00000000000..c5462ab91d2 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftEnvelopeGenerator.java @@ -0,0 +1,298 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * AHDSR control signal envelope generator. + * + * @author Karl Helgason + */ +public class SoftEnvelopeGenerator implements SoftProcess { + + public final static int EG_OFF = 0; + public final static int EG_DELAY = 1; + public final static int EG_ATTACK = 2; + public final static int EG_HOLD = 3; + public final static int EG_DECAY = 4; + public final static int EG_SUSTAIN = 5; + public final static int EG_RELEASE = 6; + public final static int EG_SHUTDOWN = 7; + public final static int EG_END = 8; + int max_count = 10; + int used_count = 0; + private int[] stage = new int[max_count]; + private int[] stage_ix = new int[max_count]; + private double[] stage_v = new double[max_count]; + private int[] stage_count = new int[max_count]; + private double[][] on = new double[max_count][1]; + private double[][] active = new double[max_count][1]; + private double[][] out = new double[max_count][1]; + private double[][] delay = new double[max_count][1]; + private double[][] attack = new double[max_count][1]; + private double[][] hold = new double[max_count][1]; + private double[][] decay = new double[max_count][1]; + private double[][] sustain = new double[max_count][1]; + private double[][] release = new double[max_count][1]; + private double[][] shutdown = new double[max_count][1]; + private double[][] release2 = new double[max_count][1]; + private double[][] attack2 = new double[max_count][1]; + private double[][] decay2 = new double[max_count][1]; + private double control_time = 0; + + public void reset() { + for (int i = 0; i < used_count; i++) { + stage[i] = 0; + on[i][0] = 0; + out[i][0] = 0; + delay[i][0] = 0; + attack[i][0] = 0; + hold[i][0] = 0; + decay[i][0] = 0; + sustain[i][0] = 0; + release[i][0] = 0; + shutdown[i][0] = 0; + attack2[i][0] = 0; + decay2[i][0] = 0; + release2[i][0] = 0; + } + used_count = 0; + } + + public void init(SoftSynthesizer synth) { + control_time = 1.0 / synth.getControlRate(); + processControlLogic(); + } + + public double[] get(int instance, String name) { + if (instance >= used_count) + used_count = instance + 1; + if (name == null) + return out[instance]; + if (name.equals("on")) + return on[instance]; + if (name.equals("active")) + return active[instance]; + if (name.equals("delay")) + return delay[instance]; + if (name.equals("attack")) + return attack[instance]; + if (name.equals("hold")) + return hold[instance]; + if (name.equals("decay")) + return decay[instance]; + if (name.equals("sustain")) + return sustain[instance]; + if (name.equals("release")) + return release[instance]; + if (name.equals("shutdown")) + return shutdown[instance]; + if (name.equals("attack2")) + return attack2[instance]; + if (name.equals("decay2")) + return decay2[instance]; + if (name.equals("release2")) + return release2[instance]; + + return null; + } + + public void processControlLogic() { + for (int i = 0; i < used_count; i++) { + + if (stage[i] == EG_END) + continue; + + if ((stage[i] > EG_OFF) && (stage[i] < EG_RELEASE)) { + if (on[i][0] < 0.5) { + if (on[i][0] < -0.5) { + stage_count[i] = (int)(Math.pow(2, + this.shutdown[i][0] / 1200.0) / control_time); + if (stage_count[i] < 0) + stage_count[i] = 0; + stage_v[i] = out[i][0]; + stage_ix[i] = 0; + stage[i] = EG_SHUTDOWN; + } else { + if ((release2[i][0] < 0.000001) && release[i][0] < 0 + && Double.isInfinite(release[i][0])) { + out[i][0] = 0; + active[i][0] = 0; + stage[i] = EG_END; + continue; + } + + stage_count[i] = (int)(Math.pow(2, + this.release[i][0] / 1200.0) / control_time); + stage_count[i] + += (int)(this.release2[i][0]/(control_time * 1000)); + if (stage_count[i] < 0) + stage_count[i] = 0; + // stage_v[i] = out[i][0]; + stage_ix[i] = 0; + + double m = 1 - out[i][0]; + stage_ix[i] = (int)(stage_count[i] * m); + + stage[i] = EG_RELEASE; + } + } + } + + switch (stage[i]) { + case EG_OFF: + active[i][0] = 1; + if (on[i][0] < 0.5) + break; + stage[i] = EG_DELAY; + stage_ix[i] = (int)(Math.pow(2, + this.delay[i][0] / 1200.0) / control_time); + if (stage_ix[i] < 0) + stage_ix[i] = 0; + case EG_DELAY: + if (stage_ix[i] == 0) { + double attack = this.attack[i][0]; + double attack2 = this.attack2[i][0]; + + if (attack2 < 0.000001 + && (attack < 0 && Double.isInfinite(attack))) { + out[i][0] = 1; + stage[i] = EG_HOLD; + stage_count[i] = (int)(Math.pow(2, + this.hold[i][0] / 1200.0) / control_time); + stage_ix[i] = 0; + } else { + stage[i] = EG_ATTACK; + stage_count[i] = (int)(Math.pow(2, + attack / 1200.0) / control_time); + stage_count[i] += (int)(attack2 / (control_time * 1000)); + if (stage_count[i] < 0) + stage_count[i] = 0; + stage_ix[i] = 0; + } + } else + stage_ix[i]--; + break; + case EG_ATTACK: + stage_ix[i]++; + if (stage_ix[i] >= stage_count[i]) { + out[i][0] = 1; + stage[i] = EG_HOLD; + } else { + // CONVEX attack + double a = ((double)stage_ix[i]) / ((double)stage_count[i]); + a = 1 + ((40.0 / 96.0) / Math.log(10)) * Math.log(a); + if (a < 0) + a = 0; + else if (a > 1) + a = 1; + out[i][0] = a; + } + break; + case EG_HOLD: + stage_ix[i]++; + if (stage_ix[i] >= stage_count[i]) { + stage[i] = EG_DECAY; + stage_count[i] = (int)(Math.pow(2, + this.decay[i][0] / 1200.0) / control_time); + stage_count[i] += (int)(this.decay2[i][0]/(control_time*1000)); + if (stage_count[i] < 0) + stage_count[i] = 0; + stage_ix[i] = 0; + } + break; + case EG_DECAY: + stage_ix[i]++; + double sustain = this.sustain[i][0] * (1.0 / 1000.0); + if (stage_ix[i] >= stage_count[i]) { + out[i][0] = sustain; + stage[i] = EG_SUSTAIN; + if (sustain < 0.001) { + out[i][0] = 0; + active[i][0] = 0; + stage[i] = EG_END; + } + } else { + double m = ((double)stage_ix[i]) / ((double)stage_count[i]); + out[i][0] = (1 - m) + sustain * m; + } + break; + case EG_SUSTAIN: + break; + case EG_RELEASE: + stage_ix[i]++; + if (stage_ix[i] >= stage_count[i]) { + out[i][0] = 0; + active[i][0] = 0; + stage[i] = EG_END; + } else { + double m = ((double)stage_ix[i]) / ((double)stage_count[i]); + out[i][0] = (1 - m); // *stage_v[i]; + + if (on[i][0] < -0.5) { + stage_count[i] = (int)(Math.pow(2, + this.shutdown[i][0] / 1200.0) / control_time); + if (stage_count[i] < 0) + stage_count[i] = 0; + stage_v[i] = out[i][0]; + stage_ix[i] = 0; + stage[i] = EG_SHUTDOWN; + } + + // re-damping + if (on[i][0] > 0.5) { + sustain = this.sustain[i][0] * (1.0 / 1000.0); + if (out[i][0] > sustain) { + stage[i] = EG_DECAY; + stage_count[i] = (int)(Math.pow(2, + this.decay[i][0] / 1200.0) / control_time); + stage_count[i] += + (int)(this.decay2[i][0]/(control_time*1000)); + if (stage_count[i] < 0) + stage_count[i] = 0; + m = (out[i][0] - 1) / (sustain - 1); + stage_ix[i] = (int) (stage_count[i] * m); + } + } + + } + break; + case EG_SHUTDOWN: + stage_ix[i]++; + if (stage_ix[i] >= stage_count[i]) { + out[i][0] = 0; + active[i][0] = 0; + stage[i] = EG_END; + } else { + double m = ((double)stage_ix[i]) / ((double)stage_count[i]); + out[i][0] = (1 - m) * stage_v[i]; + } + break; + default: + break; + } + } + + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftFilter.java b/jdk/src/share/classes/com/sun/media/sound/SoftFilter.java new file mode 100644 index 00000000000..0468f15bec0 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftFilter.java @@ -0,0 +1,614 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * Infinite impulse response (IIR) filter class. + * + * The filters where implemented and adapted using algorithms from musicdsp.org + * archive: 1-RC and C filter, Simple 2-pole LP LP and HP filter, biquad, + * tweaked butterworth RBJ Audio-EQ-Cookbook, EQ filter kookbook + * + * @author Karl Helgason + */ +public class SoftFilter { + + public final static int FILTERTYPE_LP6 = 0x00; + public final static int FILTERTYPE_LP12 = 0x01; + public final static int FILTERTYPE_HP12 = 0x11; + public final static int FILTERTYPE_BP12 = 0x21; + public final static int FILTERTYPE_NP12 = 0x31; + public final static int FILTERTYPE_LP24 = 0x03; + public final static int FILTERTYPE_HP24 = 0x13; + + // + // 0x0 = 1st-order, 6 dB/oct + // 0x1 = 2nd-order, 12 dB/oct + // 0x2 = 3rd-order, 18 dB/oct + // 0x3 = 4th-order, 24 db/oct + // + // 0x00 = LP, Low Pass Filter + // 0x10 = HP, High Pass Filter + // 0x20 = BP, Band Pass Filter + // 0x30 = NP, Notch or Band Elimination Filter + // + private int filtertype = FILTERTYPE_LP6; + private float samplerate; + private float x1; + private float x2; + private float y1; + private float y2; + private float xx1; + private float xx2; + private float yy1; + private float yy2; + private float a0; + private float a1; + private float a2; + private float b1; + private float b2; + private float q; + private float gain = 1; + private float wet = 0; + private float last_wet = 0; + private float last_a0; + private float last_a1; + private float last_a2; + private float last_b1; + private float last_b2; + private float last_q; + private float last_gain; + private boolean last_set = false; + private double cutoff = 44100; + private double resonancedB = 0; + private boolean dirty = true; + + public SoftFilter(float samplerate) { + this.samplerate = samplerate; + dirty = true; + } + + public void setFrequency(double cent) { + if (cutoff == cent) + return; + cutoff = cent; + dirty = true; + } + + public void setResonance(double db) { + if (resonancedB == db) + return; + resonancedB = db; + dirty = true; + } + + public void reset() { + dirty = true; + last_set = false; + x1 = 0; + x2 = 0; + y1 = 0; + y2 = 0; + xx1 = 0; + xx2 = 0; + yy1 = 0; + yy2 = 0; + wet = 0.0f; + gain = 1.0f; + a0 = 0; + a1 = 0; + a2 = 0; + b1 = 0; + b2 = 0; + } + + public void setFilterType(int filtertype) { + this.filtertype = filtertype; + } + + public void processAudio(SoftAudioBuffer sbuffer) { + if (filtertype == FILTERTYPE_LP6) + filter1(sbuffer); + if (filtertype == FILTERTYPE_LP12) + filter2(sbuffer); + if (filtertype == FILTERTYPE_HP12) + filter2(sbuffer); + if (filtertype == FILTERTYPE_BP12) + filter2(sbuffer); + if (filtertype == FILTERTYPE_NP12) + filter2(sbuffer); + if (filtertype == FILTERTYPE_LP24) + filter4(sbuffer); + if (filtertype == FILTERTYPE_HP24) + filter4(sbuffer); + } + + public void filter4(SoftAudioBuffer sbuffer) { + + float[] buffer = sbuffer.array(); + + if (dirty) { + filter2calc(); + dirty = false; + } + if (!last_set) { + last_a0 = a0; + last_a1 = a1; + last_a2 = a2; + last_b1 = b1; + last_b2 = b2; + last_gain = gain; + last_wet = wet; + last_set = true; + } + + if (wet > 0 || last_wet > 0) { + + int len = buffer.length; + float a0 = this.last_a0; + float a1 = this.last_a1; + float a2 = this.last_a2; + float b1 = this.last_b1; + float b2 = this.last_b2; + float gain = this.last_gain; + float wet = this.last_wet; + float a0_delta = (this.a0 - this.last_a0) / len; + float a1_delta = (this.a1 - this.last_a1) / len; + float a2_delta = (this.a2 - this.last_a2) / len; + float b1_delta = (this.b1 - this.last_b1) / len; + float b2_delta = (this.b2 - this.last_b2) / len; + float gain_delta = (this.gain - this.last_gain) / len; + float wet_delta = (this.wet - this.last_wet) / len; + float x1 = this.x1; + float x2 = this.x2; + float y1 = this.y1; + float y2 = this.y2; + float xx1 = this.xx1; + float xx2 = this.xx2; + float yy1 = this.yy1; + float yy2 = this.yy2; + + if (wet_delta != 0) { + for (int i = 0; i < len; i++) { + a0 += a0_delta; + a1 += a1_delta; + a2 += a2_delta; + b1 += b1_delta; + b2 += b2_delta; + gain += gain_delta; + wet += wet_delta; + float x = buffer[i]; + float y = (a0*x + a1*x1 + a2*x2 - b1*y1 - b2*y2); + float xx = (y * gain) * wet + (x) * (1 - wet); + x2 = x1; + x1 = x; + y2 = y1; + y1 = y; + float yy = (a0*xx + a1*xx1 + a2*xx2 - b1*yy1 - b2*yy2); + buffer[i] = (yy * gain) * wet + (xx) * (1 - wet); + xx2 = xx1; + xx1 = xx; + yy2 = yy1; + yy1 = yy; + } + } else if (a0_delta == 0 && a1_delta == 0 && a2_delta == 0 + && b1_delta == 0 && b2_delta == 0) { + for (int i = 0; i < len; i++) { + float x = buffer[i]; + float y = (a0*x + a1*x1 + a2*x2 - b1*y1 - b2*y2); + float xx = (y * gain) * wet + (x) * (1 - wet); + x2 = x1; + x1 = x; + y2 = y1; + y1 = y; + float yy = (a0*xx + a1*xx1 + a2*xx2 - b1*yy1 - b2*yy2); + buffer[i] = (yy * gain) * wet + (xx) * (1 - wet); + xx2 = xx1; + xx1 = xx; + yy2 = yy1; + yy1 = yy; + } + } else { + for (int i = 0; i < len; i++) { + a0 += a0_delta; + a1 += a1_delta; + a2 += a2_delta; + b1 += b1_delta; + b2 += b2_delta; + gain += gain_delta; + float x = buffer[i]; + float y = (a0*x + a1*x1 + a2*x2 - b1*y1 - b2*y2); + float xx = (y * gain) * wet + (x) * (1 - wet); + x2 = x1; + x1 = x; + y2 = y1; + y1 = y; + float yy = (a0*xx + a1*xx1 + a2*xx2 - b1*yy1 - b2*yy2); + buffer[i] = (yy * gain) * wet + (xx) * (1 - wet); + xx2 = xx1; + xx1 = xx; + yy2 = yy1; + yy1 = yy; + } + } + + if (Math.abs(x1) < 1.0E-8) + x1 = 0; + if (Math.abs(x2) < 1.0E-8) + x2 = 0; + if (Math.abs(y1) < 1.0E-8) + y1 = 0; + if (Math.abs(y2) < 1.0E-8) + y2 = 0; + this.x1 = x1; + this.x2 = x2; + this.y1 = y1; + this.y2 = y2; + this.xx1 = xx1; + this.xx2 = xx2; + this.yy1 = yy1; + this.yy2 = yy2; + } + + this.last_a0 = this.a0; + this.last_a1 = this.a1; + this.last_a2 = this.a2; + this.last_b1 = this.b1; + this.last_b2 = this.b2; + this.last_gain = this.gain; + this.last_wet = this.wet; + + } + + private double sinh(double x) { + return (Math.exp(x) - Math.exp(-x)) * 0.5; + } + + public void filter2calc() { + + double resonancedB = this.resonancedB; + if (resonancedB < 0) + resonancedB = 0; // Negative dB are illegal. + if (resonancedB > 30) + resonancedB = 30; // At least 22.5 dB is needed. + if (filtertype == FILTERTYPE_LP24 || filtertype == FILTERTYPE_HP24) + resonancedB *= 0.6; + + if (filtertype == FILTERTYPE_BP12) { + wet = 1; + double r = (cutoff / samplerate); + if (r > 0.45) + r = 0.45; + + double bandwidth = Math.PI * Math.pow(10.0, -(resonancedB / 20)); + + double omega = 2 * Math.PI * r; + double cs = Math.cos(omega); + double sn = Math.sin(omega); + double alpha = sn * sinh((Math.log(2)*bandwidth*omega) / (sn * 2)); + + double b0 = alpha; + double b1 = 0; + double b2 = -alpha; + double a0 = 1 + alpha; + double a1 = -2 * cs; + double a2 = 1 - alpha; + + double cf = 1.0 / a0; + this.b1 = (float) (a1 * cf); + this.b2 = (float) (a2 * cf); + this.a0 = (float) (b0 * cf); + this.a1 = (float) (b1 * cf); + this.a2 = (float) (b2 * cf); + } + + if (filtertype == FILTERTYPE_NP12) { + wet = 1; + double r = (cutoff / samplerate); + if (r > 0.45) + r = 0.45; + + double bandwidth = Math.PI * Math.pow(10.0, -(resonancedB / 20)); + + double omega = 2 * Math.PI * r; + double cs = Math.cos(omega); + double sn = Math.sin(omega); + double alpha = sn * sinh((Math.log(2)*bandwidth*omega) / (sn*2)); + + double b0 = 1; + double b1 = -2 * cs; + double b2 = 1; + double a0 = 1 + alpha; + double a1 = -2 * cs; + double a2 = 1 - alpha; + + double cf = 1.0 / a0; + this.b1 = (float)(a1 * cf); + this.b2 = (float)(a2 * cf); + this.a0 = (float)(b0 * cf); + this.a1 = (float)(b1 * cf); + this.a2 = (float)(b2 * cf); + } + + if (filtertype == FILTERTYPE_LP12 || filtertype == FILTERTYPE_LP24) { + double r = (cutoff / samplerate); + if (r > 0.45) { + if (wet == 0) { + if (resonancedB < 0.00001) + wet = 0.0f; + else + wet = 1.0f; + } + r = 0.45; + } else + wet = 1.0f; + + double c = 1.0 / (Math.tan(Math.PI * r)); + double csq = c * c; + double resonance = Math.pow(10.0, -(resonancedB / 20)); + double q = Math.sqrt(2.0f) * resonance; + double a0 = 1.0 / (1.0 + (q * c) + (csq)); + double a1 = 2.0 * a0; + double a2 = a0; + double b1 = (2.0 * a0) * (1.0 - csq); + double b2 = a0 * (1.0 - (q * c) + csq); + + this.a0 = (float)a0; + this.a1 = (float)a1; + this.a2 = (float)a2; + this.b1 = (float)b1; + this.b2 = (float)b2; + + } + + if (filtertype == FILTERTYPE_HP12 || filtertype == FILTERTYPE_HP24) { + double r = (cutoff / samplerate); + if (r > 0.45) + r = 0.45; + if (r < 0.0001) + r = 0.0001; + wet = 1.0f; + double c = (Math.tan(Math.PI * (r))); + double csq = c * c; + double resonance = Math.pow(10.0, -(resonancedB / 20)); + double q = Math.sqrt(2.0f) * resonance; + double a0 = 1.0 / (1.0 + (q * c) + (csq)); + double a1 = -2.0 * a0; + double a2 = a0; + double b1 = (2.0 * a0) * (csq - 1.0); + double b2 = a0 * (1.0 - (q * c) + csq); + + this.a0 = (float)a0; + this.a1 = (float)a1; + this.a2 = (float)a2; + this.b1 = (float)b1; + this.b2 = (float)b2; + + } + + } + + public void filter2(SoftAudioBuffer sbuffer) { + + float[] buffer = sbuffer.array(); + + if (dirty) { + filter2calc(); + dirty = false; + } + if (!last_set) { + last_a0 = a0; + last_a1 = a1; + last_a2 = a2; + last_b1 = b1; + last_b2 = b2; + last_q = q; + last_gain = gain; + last_wet = wet; + last_set = true; + } + + if (wet > 0 || last_wet > 0) { + + int len = buffer.length; + float a0 = this.last_a0; + float a1 = this.last_a1; + float a2 = this.last_a2; + float b1 = this.last_b1; + float b2 = this.last_b2; + float gain = this.last_gain; + float wet = this.last_wet; + float a0_delta = (this.a0 - this.last_a0) / len; + float a1_delta = (this.a1 - this.last_a1) / len; + float a2_delta = (this.a2 - this.last_a2) / len; + float b1_delta = (this.b1 - this.last_b1) / len; + float b2_delta = (this.b2 - this.last_b2) / len; + float gain_delta = (this.gain - this.last_gain) / len; + float wet_delta = (this.wet - this.last_wet) / len; + float x1 = this.x1; + float x2 = this.x2; + float y1 = this.y1; + float y2 = this.y2; + + if (wet_delta != 0) { + for (int i = 0; i < len; i++) { + a0 += a0_delta; + a1 += a1_delta; + a2 += a2_delta; + b1 += b1_delta; + b2 += b2_delta; + gain += gain_delta; + wet += wet_delta; + float x = buffer[i]; + float y = (a0*x + a1*x1 + a2*x2 - b1*y1 - b2*y2); + buffer[i] = (y * gain) * wet + (x) * (1 - wet); + x2 = x1; + x1 = x; + y2 = y1; + y1 = y; + } + } else if (a0_delta == 0 && a1_delta == 0 && a2_delta == 0 + && b1_delta == 0 && b2_delta == 0) { + for (int i = 0; i < len; i++) { + float x = buffer[i]; + float y = (a0*x + a1*x1 + a2*x2 - b1*y1 - b2*y2); + buffer[i] = y * gain; + x2 = x1; + x1 = x; + y2 = y1; + y1 = y; + } + } else { + for (int i = 0; i < len; i++) { + a0 += a0_delta; + a1 += a1_delta; + a2 += a2_delta; + b1 += b1_delta; + b2 += b2_delta; + gain += gain_delta; + float x = buffer[i]; + float y = (a0*x + a1*x1 + a2*x2 - b1*y1 - b2*y2); + buffer[i] = y * gain; + x2 = x1; + x1 = x; + y2 = y1; + y1 = y; + } + } + + if (Math.abs(x1) < 1.0E-8) + x1 = 0; + if (Math.abs(x2) < 1.0E-8) + x2 = 0; + if (Math.abs(y1) < 1.0E-8) + y1 = 0; + if (Math.abs(y2) < 1.0E-8) + y2 = 0; + this.x1 = x1; + this.x2 = x2; + this.y1 = y1; + this.y2 = y2; + } + + this.last_a0 = this.a0; + this.last_a1 = this.a1; + this.last_a2 = this.a2; + this.last_b1 = this.b1; + this.last_b2 = this.b2; + this.last_q = this.q; + this.last_gain = this.gain; + this.last_wet = this.wet; + + } + + public void filter1calc() { + if (cutoff < 120) + cutoff = 120; + double c = (7.0 / 6.0) * Math.PI * 2 * cutoff / samplerate; + if (c > 1) + c = 1; + a0 = (float)(Math.sqrt(1 - Math.cos(c)) * Math.sqrt(0.5 * Math.PI)); + if (resonancedB < 0) + resonancedB = 0; + if (resonancedB > 20) + resonancedB = 20; + q = (float)(Math.sqrt(0.5) * Math.pow(10.0, -(resonancedB / 20))); + gain = (float)Math.pow(10, -((resonancedB)) / 40.0); + if (wet == 0.0f) + if (resonancedB > 0.00001 || c < 0.9999999) + wet = 1.0f; + } + + public void filter1(SoftAudioBuffer sbuffer) { + + float[] buffer = sbuffer.array(); + + if (dirty) { + filter1calc(); + dirty = false; + } + if (!last_set) { + last_a0 = a0; + last_q = q; + last_gain = gain; + last_wet = wet; + last_set = true; + } + + if (wet > 0 || last_wet > 0) { + + int len = buffer.length; + float a0 = this.last_a0; + float q = this.last_q; + float gain = this.last_gain; + float wet = this.last_wet; + float a0_delta = (this.a0 - this.last_a0) / len; + float q_delta = (this.q - this.last_q) / len; + float gain_delta = (this.gain - this.last_gain) / len; + float wet_delta = (this.wet - this.last_wet) / len; + float y2 = this.y2; + float y1 = this.y1; + + if (wet_delta != 0) { + for (int i = 0; i < len; i++) { + a0 += a0_delta; + q += q_delta; + gain += gain_delta; + wet += wet_delta; + y1 = (1 - q * a0) * y1 - (a0) * y2 + (a0) * buffer[i]; + y2 = (1 - q * a0) * y2 + (a0) * y1; + buffer[i] = y2 * gain * wet + buffer[i] * (1 - wet); + } + } else if (a0_delta == 0 && q_delta == 0) { + for (int i = 0; i < len; i++) { + y1 = (1 - q * a0) * y1 - (a0) * y2 + (a0) * buffer[i]; + y2 = (1 - q * a0) * y2 + (a0) * y1; + buffer[i] = y2 * gain; + } + } else { + for (int i = 0; i < len; i++) { + a0 += a0_delta; + q += q_delta; + gain += gain_delta; + y1 = (1 - q * a0) * y1 - (a0) * y2 + (a0) * buffer[i]; + y2 = (1 - q * a0) * y2 + (a0) * y1; + buffer[i] = y2 * gain; + } + } + + if (Math.abs(y2) < 1.0E-8) + y2 = 0; + if (Math.abs(y1) < 1.0E-8) + y1 = 0; + this.y2 = y2; + this.y1 = y1; + } + + this.last_a0 = this.a0; + this.last_q = this.q; + this.last_gain = this.gain; + this.last_wet = this.wet; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftInstrument.java b/jdk/src/share/classes/com/sun/media/sound/SoftInstrument.java new file mode 100644 index 00000000000..fbeaf6b8d3e --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftInstrument.java @@ -0,0 +1,82 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import javax.sound.midi.Instrument; +import javax.sound.midi.MidiChannel; + +/** + * Software synthesizer internal instrument. + * + * @author Karl Helgason + */ +public class SoftInstrument extends Instrument { + + private SoftPerformer[] performers; + private ModelPerformer[] modelperformers; + private Object data; + private ModelInstrument ins; + + public SoftInstrument(ModelInstrument ins) { + super(ins.getSoundbank(), ins.getPatch(), ins.getName(), + ins.getDataClass()); + data = ins.getData(); + this.ins = ins; + initPerformers(((ModelInstrument)ins).getPerformers()); + } + + public SoftInstrument(ModelInstrument ins, + ModelPerformer[] overrideperformers) { + super(ins.getSoundbank(), ins.getPatch(), ins.getName(), + ins.getDataClass()); + data = ins.getData(); + this.ins = ins; + initPerformers(overrideperformers); + } + + private void initPerformers(ModelPerformer[] modelperformers) { + this.modelperformers = modelperformers; + performers = new SoftPerformer[modelperformers.length]; + for (int i = 0; i < modelperformers.length; i++) + performers[i] = new SoftPerformer(modelperformers[i]); + } + + public ModelDirector getDirector(MidiChannel channel, + ModelDirectedPlayer player) { + return ins.getDirector(modelperformers, channel, player); + } + + public ModelInstrument getSourceInstrument() { + return ins; + } + + public Object getData() { + return data; + } + + public SoftPerformer[] getPerformers() { + return performers; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftJitterCorrector.java b/jdk/src/share/classes/com/sun/media/sound/SoftJitterCorrector.java new file mode 100644 index 00000000000..98d205b6deb --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftJitterCorrector.java @@ -0,0 +1,276 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; + +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; + +/** + * A jitter corrector to be used with SoftAudioPusher. + * + * @author Karl Helgason + */ +public class SoftJitterCorrector extends AudioInputStream { + + private static class JitterStream extends InputStream { + + static int MAX_BUFFER_SIZE = 1048576; + boolean active = true; + Thread thread; + AudioInputStream stream; + // Cyclic buffer + int writepos = 0; + int readpos = 0; + byte[][] buffers; + Object buffers_mutex = new Object(); + + // Adapative Drift Statistics + int w_count = 1000; + int w_min_tol = 2; + int w_max_tol = 10; + int w = 0; + int w_min = -1; + // Current read buffer + int bbuffer_pos = 0; + int bbuffer_max = 0; + byte[] bbuffer = null; + + public byte[] nextReadBuffer() { + synchronized (buffers_mutex) { + if (writepos > readpos) { + int w_m = writepos - readpos; + if (w_m < w_min) + w_min = w_m; + + int buffpos = readpos; + readpos++; + return buffers[buffpos % buffers.length]; + } + w_min = -1; + w = w_count - 1; + } + while (true) { + try { + Thread.sleep(1); + } catch (InterruptedException e) { + //e.printStackTrace(); + return null; + } + synchronized (buffers_mutex) { + if (writepos > readpos) { + w = 0; + w_min = -1; + w = w_count - 1; + int buffpos = readpos; + readpos++; + return buffers[buffpos % buffers.length]; + } + } + } + } + + public byte[] nextWriteBuffer() { + synchronized (buffers_mutex) { + return buffers[writepos % buffers.length]; + } + } + + public void commit() { + synchronized (buffers_mutex) { + writepos++; + if ((writepos - readpos) > buffers.length) { + int newsize = (writepos - readpos) + 10; + newsize = Math.max(buffers.length * 2, newsize); + buffers = new byte[newsize][buffers[0].length]; + } + } + } + + public JitterStream(AudioInputStream s, int buffersize, + int smallbuffersize) { + this.w_count = 10 * (buffersize / smallbuffersize); + if (w_count < 100) + w_count = 100; + this.buffers + = new byte[(buffersize/smallbuffersize)+10][smallbuffersize]; + this.bbuffer_max = MAX_BUFFER_SIZE / smallbuffersize; + this.stream = s; + + + Runnable runnable = new Runnable() { + + public void run() { + AudioFormat format = stream.getFormat(); + int bufflen = buffers[0].length; + int frames = bufflen / format.getFrameSize(); + long nanos = (long) (frames * 1000000000.0 + / format.getSampleRate()); + long now = System.nanoTime(); + long next = now + nanos; + int correction = 0; + while (true) { + synchronized (JitterStream.this) { + if (!active) + break; + } + int curbuffsize; + synchronized (buffers) { + curbuffsize = writepos - readpos; + if (correction == 0) { + w++; + if (w_min != Integer.MAX_VALUE) { + if (w == w_count) { + correction = 0; + if (w_min < w_min_tol) { + correction = (w_min_tol + w_max_tol) + / 2 - w_min; + } + if (w_min > w_max_tol) { + correction = (w_min_tol + w_max_tol) + / 2 - w_min; + } + w = 0; + w_min = Integer.MAX_VALUE; + } + } + } + } + while (curbuffsize > bbuffer_max) { + synchronized (buffers) { + curbuffsize = writepos - readpos; + } + synchronized (JitterStream.this) { + if (!active) + break; + } + try { + Thread.sleep(1); + } catch (InterruptedException e) { + //e.printStackTrace(); + } + } + + if (correction < 0) + correction++; + else { + byte[] buff = nextWriteBuffer(); + try { + int n = 0; + while (n != buff.length) { + int s = stream.read(buff, n, buff.length + - n); + if (s < 0) + throw new EOFException(); + if (s == 0) + Thread.yield(); + n += s; + } + } catch (IOException e1) { + //e1.printStackTrace(); + } + commit(); + } + + if (correction > 0) { + correction--; + next = System.nanoTime() + nanos; + continue; + } + long wait = next - System.nanoTime(); + if (wait > 0) { + try { + Thread.sleep(wait / 1000000L); + } catch (InterruptedException e) { + //e.printStackTrace(); + } + } + next += nanos; + } + } + }; + + thread = new Thread(runnable); + thread.setPriority(Thread.MAX_PRIORITY); + thread.start(); + } + + public void close() throws IOException { + synchronized (this) { + active = false; + } + try { + thread.join(); + } catch (InterruptedException e) { + //e.printStackTrace(); + } + stream.close(); + } + + public int read() throws IOException { + byte[] b = new byte[1]; + if (read(b) == -1) + return -1; + return b[0] & 0xFF; + } + + public void fillBuffer() { + bbuffer = nextReadBuffer(); + bbuffer_pos = 0; + } + + public int read(byte[] b, int off, int len) { + if (bbuffer == null) + fillBuffer(); + int bbuffer_len = bbuffer.length; + int offlen = off + len; + while (off < offlen) { + if (available() == 0) + fillBuffer(); + else { + byte[] bbuffer = this.bbuffer; + int bbuffer_pos = this.bbuffer_pos; + while (off < offlen && bbuffer_pos < bbuffer_len) + b[off++] = bbuffer[bbuffer_pos++]; + this.bbuffer_pos = bbuffer_pos; + } + } + return len; + } + + public int available() { + return bbuffer.length - bbuffer_pos; + } + } + + public SoftJitterCorrector(AudioInputStream stream, int buffersize, + int smallbuffersize) { + super(new JitterStream(stream, buffersize, smallbuffersize), + stream.getFormat(), stream.getFrameLength()); + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftLanczosResampler.java b/jdk/src/share/classes/com/sun/media/sound/SoftLanczosResampler.java new file mode 100644 index 00000000000..526cd4327df --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftLanczosResampler.java @@ -0,0 +1,118 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * Lanczos interpolation resampler. + * + * @author Karl Helgason + */ +public class SoftLanczosResampler extends SoftAbstractResampler { + + float[][] sinc_table; + int sinc_table_fsize = 2000; + int sinc_table_size = 5; + int sinc_table_center = sinc_table_size / 2; + + public SoftLanczosResampler() { + super(); + sinc_table = new float[sinc_table_fsize][]; + for (int i = 0; i < sinc_table_fsize; i++) { + sinc_table[i] = sincTable(sinc_table_size, -i + / ((float) sinc_table_fsize)); + } + } + + // Normalized sinc function + public static double sinc(double x) { + return (x == 0.0) ? 1.0 : Math.sin(Math.PI * x) / (Math.PI * x); + } + + // Generate sinc table + public static float[] sincTable(int size, float offset) { + int center = size / 2; + float[] w = new float[size]; + for (int k = 0; k < size; k++) { + float x = (-center + k + offset); + if (x < -2 || x > 2) + w[k] = 0; + else if (x == 0) + w[k] = 1; + else { + w[k] = (float)(2.0 * Math.sin(Math.PI * x) + * Math.sin(Math.PI * x / 2.0) + / ((Math.PI * x) * (Math.PI * x))); + } + } + return w; + } + + public int getPadding() // must be at least half of sinc_table_size + { + return sinc_table_size / 2 + 2; + } + + public void interpolate(float[] in, float[] in_offset, float in_end, + float[] startpitch, float pitchstep, float[] out, int[] out_offset, + int out_end) { + float pitch = startpitch[0]; + float ix = in_offset[0]; + int ox = out_offset[0]; + float ix_end = in_end; + int ox_end = out_end; + + if (pitchstep == 0) { + while (ix < ix_end && ox < ox_end) { + int iix = (int) ix; + float[] sinc_table + = this.sinc_table[(int) ((ix - iix) * sinc_table_fsize)]; + int xx = iix - sinc_table_center; + float y = 0; + for (int i = 0; i < sinc_table_size; i++, xx++) + y += in[xx] * sinc_table[i]; + out[ox++] = y; + ix += pitch; + } + } else { + while (ix < ix_end && ox < ox_end) { + int iix = (int) ix; + float[] sinc_table + = this.sinc_table[(int) ((ix - iix) * sinc_table_fsize)]; + int xx = iix - sinc_table_center; + float y = 0; + for (int i = 0; i < sinc_table_size; i++, xx++) + y += in[xx] * sinc_table[i]; + out[ox++] = y; + + ix += pitch; + pitch += pitchstep; + } + } + in_offset[0] = ix; + out_offset[0] = ox; + startpitch[0] = pitch; + + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftLimiter.java b/jdk/src/share/classes/com/sun/media/sound/SoftLimiter.java new file mode 100644 index 00000000000..7ba0ac66002 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftLimiter.java @@ -0,0 +1,191 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * A simple look-ahead volume limiter with very fast attack and fast release. + * This filter is used for preventing clipping. + * + * @author Karl Helgason + */ +public class SoftLimiter implements SoftAudioProcessor { + + float lastmax = 0; + float gain = 1; + float[] temp_bufferL; + float[] temp_bufferR; + boolean mix = false; + SoftAudioBuffer bufferL; + SoftAudioBuffer bufferR; + SoftAudioBuffer bufferLout; + SoftAudioBuffer bufferRout; + float controlrate; + + public void init(float samplerate, float controlrate) { + this.controlrate = controlrate; + } + + public void setInput(int pin, SoftAudioBuffer input) { + if (pin == 0) + bufferL = input; + if (pin == 1) + bufferR = input; + } + + public void setOutput(int pin, SoftAudioBuffer output) { + if (pin == 0) + bufferLout = output; + if (pin == 1) + bufferRout = output; + } + + public void setMixMode(boolean mix) { + this.mix = mix; + } + + public void globalParameterControlChange(int[] slothpath, long param, + long value) { + } + + double silentcounter = 0; + + public void processAudio() { + if (this.bufferL.isSilent() + && (this.bufferR == null || this.bufferR.isSilent())) { + silentcounter += 1 / controlrate; + + if (silentcounter > 60) { + if (!mix) { + bufferLout.clear(); + bufferRout.clear(); + } + return; + } + } else + silentcounter = 0; + + float[] bufferL = this.bufferL.array(); + float[] bufferR = this.bufferR == null ? null : this.bufferR.array(); + float[] bufferLout = this.bufferLout.array(); + float[] bufferRout = this.bufferRout == null + ? null : this.bufferRout.array(); + + if (temp_bufferL == null || temp_bufferL.length < bufferL.length) + temp_bufferL = new float[bufferL.length]; + if (bufferR != null) + if (temp_bufferR == null || temp_bufferR.length < bufferR.length) + temp_bufferR = new float[bufferR.length]; + + float max = 0; + int len = bufferL.length; + + if (bufferR == null) { + for (int i = 0; i < len; i++) { + if (bufferL[i] > max) + max = bufferL[i]; + if (-bufferL[i] > max) + max = -bufferL[i]; + } + } else { + for (int i = 0; i < len; i++) { + if (bufferL[i] > max) + max = bufferL[i]; + if (bufferR[i] > max) + max = bufferR[i]; + if (-bufferL[i] > max) + max = -bufferL[i]; + if (-bufferR[i] > max) + max = -bufferR[i]; + } + } + + float lmax = lastmax; + lastmax = max; + if (lmax > max) + max = lmax; + + float newgain = 1; + if (max > 0.99f) + newgain = 0.99f / max; + else + newgain = 1; + + if (newgain > gain) + newgain = (newgain + gain * 9) / 10f; + + float gaindelta = (newgain - gain) / len; + if (mix) { + if (bufferR == null) { + for (int i = 0; i < len; i++) { + gain += gaindelta; + float bL = bufferL[i]; + float tL = temp_bufferL[i]; + temp_bufferL[i] = bL; + bufferLout[i] += tL * gain; + } + } else { + for (int i = 0; i < len; i++) { + gain += gaindelta; + float bL = bufferL[i]; + float bR = bufferR[i]; + float tL = temp_bufferL[i]; + float tR = temp_bufferR[i]; + temp_bufferL[i] = bL; + temp_bufferR[i] = bR; + bufferLout[i] += tL * gain; + bufferRout[i] += tR * gain; + } + } + + } else { + if (bufferR == null) { + for (int i = 0; i < len; i++) { + gain += gaindelta; + float bL = bufferL[i]; + float tL = temp_bufferL[i]; + temp_bufferL[i] = bL; + bufferLout[i] = tL * gain; + } + } else { + for (int i = 0; i < len; i++) { + gain += gaindelta; + float bL = bufferL[i]; + float bR = bufferR[i]; + float tL = temp_bufferL[i]; + float tR = temp_bufferR[i]; + temp_bufferL[i] = bL; + temp_bufferR[i] = bR; + bufferLout[i] = tL * gain; + bufferRout[i] = tR * gain; + } + } + + } + gain = newgain; + } + + public void processControlLogic() { + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftLinearResampler.java b/jdk/src/share/classes/com/sun/media/sound/SoftLinearResampler.java new file mode 100644 index 00000000000..29f714ad40b --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftLinearResampler.java @@ -0,0 +1,70 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * A resampler that uses first-order (linear) interpolation. + * + * @author Karl Helgason + */ +public class SoftLinearResampler extends SoftAbstractResampler { + + public int getPadding() { + return 2; + } + + public void interpolate(float[] in, float[] in_offset, float in_end, + float[] startpitch, float pitchstep, float[] out, int[] out_offset, + int out_end) { + + float pitch = startpitch[0]; + float ix = in_offset[0]; + int ox = out_offset[0]; + float ix_end = in_end; + int ox_end = out_end; + if (pitchstep == 0f) { + while (ix < ix_end && ox < ox_end) { + int iix = (int) ix; + float fix = ix - iix; + float i = in[iix]; + out[ox++] = i + (in[iix + 1] - i) * fix; + ix += pitch; + } + } else { + while (ix < ix_end && ox < ox_end) { + int iix = (int) ix; + float fix = ix - iix; + float i = in[iix]; + out[ox++] = i + (in[iix + 1] - i) * fix; + ix += pitch; + pitch += pitchstep; + } + } + in_offset[0] = ix; + out_offset[0] = ox; + startpitch[0] = pitch; + + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftLinearResampler2.java b/jdk/src/share/classes/com/sun/media/sound/SoftLinearResampler2.java new file mode 100644 index 00000000000..1838b4cfae1 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftLinearResampler2.java @@ -0,0 +1,108 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * A resampler that uses first-order (linear) interpolation. + * + * This one doesn't perform float to int casting inside the processing loop. + * + * @author Karl Helgason + */ +public class SoftLinearResampler2 extends SoftAbstractResampler { + + public int getPadding() { + return 2; + } + + public void interpolate(float[] in, float[] in_offset, float in_end, + float[] startpitch, float pitchstep, float[] out, int[] out_offset, + int out_end) { + + float pitch = startpitch[0]; + float ix = in_offset[0]; + int ox = out_offset[0]; + float ix_end = in_end; + int ox_end = out_end; + + // Check if we have do anything + if (!(ix < ix_end && ox < ox_end)) + return; + + // 15 bit shift was choosed because + // it resulted in no drift between p_ix and ix. + int p_ix = (int) (ix * (1 << 15)); + int p_ix_end = (int) (ix_end * (1 << 15)); + int p_pitch = (int) (pitch * (1 << 15)); + // Pitch needs to recalculated + // to ensure no drift between p_ix and ix. + pitch = p_pitch * (1f / (1 << 15)); + + if (pitchstep == 0f) { + + // To reduce + // while (p_ix < p_ix_end && ox < ox_end) + // into + // while (ox < ox_end) + // We need to calculate new ox_end value. + int p_ix_len = p_ix_end - p_ix; + int p_mod = p_ix_len % p_pitch; + if (p_mod != 0) + p_ix_len += p_pitch - p_mod; + int ox_end2 = ox + p_ix_len / p_pitch; + if (ox_end2 < ox_end) + ox_end = ox_end2; + + while (ox < ox_end) { + int iix = p_ix >> 15; + float fix = ix - iix; + float i = in[iix]; + out[ox++] = i + (in[iix + 1] - i) * fix; + p_ix += p_pitch; + ix += pitch; + } + + } else { + + int p_pitchstep = (int) (pitchstep * (1 << 15)); + pitchstep = p_pitchstep * (1f / (1 << 15)); + + while (p_ix < p_ix_end && ox < ox_end) { + int iix = p_ix >> 15; + float fix = ix - iix; + float i = in[iix]; + out[ox++] = i + (in[iix + 1] - i) * fix; + ix += pitch; + p_ix += p_pitch; + pitch += pitchstep; + p_pitch += p_pitchstep; + } + } + in_offset[0] = ix; + out_offset[0] = ox; + startpitch[0] = pitch; + + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftLowFrequencyOscillator.java b/jdk/src/share/classes/com/sun/media/sound/SoftLowFrequencyOscillator.java new file mode 100644 index 00000000000..adfe9e08de3 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftLowFrequencyOscillator.java @@ -0,0 +1,122 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * LFO control signal generator. + * + * @author Karl Helgason + */ +public class SoftLowFrequencyOscillator implements SoftProcess { + + private int max_count = 10; + private int used_count = 0; + private double[][] out = new double[max_count][1]; + private double[][] delay = new double[max_count][1]; + private double[][] delay2 = new double[max_count][1]; + private double[][] freq = new double[max_count][1]; + private int[] delay_counter = new int[max_count]; + private double[] sin_phase = new double[max_count]; + private double[] sin_stepfreq = new double[max_count]; + private double[] sin_step = new double[max_count]; + private double control_time = 0; + private double sin_factor = 0; + private static double PI2 = 2.0 * Math.PI; + + public void reset() { + for (int i = 0; i < used_count; i++) { + out[i][0] = 0; + delay[i][0] = 0; + delay2[i][0] = 0; + freq[i][0] = 0; + delay_counter[i] = 0; + sin_phase[i] = 0; + sin_stepfreq[i] = 0; + sin_step[i] = 0; + } + used_count = 0; + } + + public void init(SoftSynthesizer synth) { + control_time = 1.0 / synth.getControlRate(); + sin_factor = control_time * 2 * Math.PI; + for (int i = 0; i < used_count; i++) { + delay_counter[i] = (int)(Math.pow(2, + this.delay[i][0] / 1200.0) / control_time); + delay_counter[i] += (int)(delay2[i][0] / (control_time * 1000)); + } + processControlLogic(); + } + + public void processControlLogic() { + for (int i = 0; i < used_count; i++) { + if (delay_counter[i] > 0) { + delay_counter[i]--; + out[i][0] = 0.5; + } else { + double f = freq[i][0]; + + if (sin_stepfreq[i] != f) { + sin_stepfreq[i] = f; + double fr = 440.0 * Math.exp( + (f - 6900.0) * (Math.log(2) / 1200.0)); + sin_step[i] = fr * sin_factor; + } + /* + double fr = 440.0 * Math.pow(2.0, + (freq[i][0] - 6900.0) / 1200.0); + sin_phase[i] += fr * sin_factor; + */ + /* + sin_phase[i] += sin_step[i]; + while (sin_phase[i] > PI2) + sin_phase[i] -= PI2; + out[i][0] = 0.5 + Math.sin(sin_phase[i]) * 0.5; + */ + double p = sin_phase[i]; + p += sin_step[i]; + while (p > PI2) + p -= PI2; + out[i][0] = 0.5 + Math.sin(p) * 0.5; + sin_phase[i] = p; + + } + } + } + + public double[] get(int instance, String name) { + if (instance >= used_count) + used_count = instance + 1; + if (name == null) + return out[instance]; + if (name.equals("delay")) + return delay[instance]; + if (name.equals("delay2")) + return delay2[instance]; + if (name.equals("freq")) + return freq[instance]; + return null; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftMainMixer.java b/jdk/src/share/classes/com/sun/media/sound/SoftMainMixer.java new file mode 100644 index 00000000000..1f38058b052 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftMainMixer.java @@ -0,0 +1,982 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; +import java.util.TreeMap; +import java.util.Map.Entry; + +import javax.sound.midi.MidiMessage; +import javax.sound.midi.Patch; +import javax.sound.midi.ShortMessage; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; + +/** + * Software synthesizer main audio mixer. + * + * @author Karl Helgason + */ +public class SoftMainMixer { + + public final static int CHANNEL_LEFT = 0; + public final static int CHANNEL_RIGHT = 1; + public final static int CHANNEL_EFFECT1 = 2; + public final static int CHANNEL_EFFECT2 = 3; + public final static int CHANNEL_EFFECT3 = 4; + public final static int CHANNEL_EFFECT4 = 5; + public final static int CHANNEL_LEFT_DRY = 10; + public final static int CHANNEL_RIGHT_DRY = 11; + public final static int CHANNEL_SCRATCH1 = 12; + public final static int CHANNEL_SCRATCH2 = 13; + public final static int CHANNEL_CHANNELMIXER_LEFT = 14; + public final static int CHANNEL_CHANNELMIXER_RIGHT = 15; + protected boolean active_sensing_on = false; + private long msec_last_activity = -1; + private boolean pusher_silent = false; + private int pusher_silent_count = 0; + private long msec_pos = 0; + protected boolean readfully = true; + private Object control_mutex; + private SoftSynthesizer synth; + private int nrofchannels = 2; + private SoftVoice[] voicestatus = null; + private SoftAudioBuffer[] buffers; + private SoftReverb reverb; + private SoftAudioProcessor chorus; + private SoftAudioProcessor agc; + private long msec_buffer_len = 0; + protected TreeMap midimessages = new TreeMap(); + double last_volume_left = 1.0; + double last_volume_right = 1.0; + private double[] co_master_balance = new double[1]; + private double[] co_master_volume = new double[1]; + private double[] co_master_coarse_tuning = new double[1]; + private double[] co_master_fine_tuning = new double[1]; + private AudioInputStream ais; + private Set registeredMixers = null; + private Set stoppedMixers = null; + private ModelChannelMixer[] cur_registeredMixers = null; + protected SoftControl co_master = new SoftControl() { + + double[] balance = co_master_balance; + double[] volume = co_master_volume; + double[] coarse_tuning = co_master_coarse_tuning; + double[] fine_tuning = co_master_fine_tuning; + + public double[] get(int instance, String name) { + if (name == null) + return null; + if (name.equals("balance")) + return balance; + if (name.equals("volume")) + return volume; + if (name.equals("coarse_tuning")) + return coarse_tuning; + if (name.equals("fine_tuning")) + return fine_tuning; + return null; + } + }; + + private void processSystemExclusiveMessage(byte[] data) { + synchronized (synth.control_mutex) { + activity(); + + // Universal Non-Real-Time SysEx + if ((data[1] & 0xFF) == 0x7E) { + int deviceID = data[2] & 0xFF; + if (deviceID == 0x7F || deviceID == synth.getDeviceID()) { + int subid1 = data[3] & 0xFF; + int subid2; + switch (subid1) { + case 0x08: // MIDI Tuning Standard + subid2 = data[4] & 0xFF; + switch (subid2) { + case 0x01: // BULK TUNING DUMP + { + // http://www.midi.org/about-midi/tuning.shtml + SoftTuning tuning = synth.getTuning(new Patch(0, + data[5] & 0xFF)); + tuning.load(data); + break; + } + case 0x04: // KEY-BASED TUNING DUMP + case 0x05: // SCALE/OCTAVE TUNING DUMP, 1 byte format + case 0x06: // SCALE/OCTAVE TUNING DUMP, 2 byte format + case 0x07: // SINGLE NOTE TUNING CHANGE (NON REAL-TIME) + // (BANK) + { + // http://www.midi.org/about-midi/tuning_extens.shtml + SoftTuning tuning = synth.getTuning(new Patch( + data[5] & 0xFF, data[6] & 0xFF)); + tuning.load(data); + break; + } + case 0x08: // scale/octave tuning 1-byte form (Non + // Real-Time) + case 0x09: // scale/octave tuning 2-byte form (Non + // Real-Time) + { + // http://www.midi.org/about-midi/tuning-scale.shtml + SoftTuning tuning = new SoftTuning(data); + int channelmask = (data[5] & 0xFF) * 16384 + + (data[6] & 0xFF) * 128 + (data[7] & 0xFF); + SoftChannel[] channels = synth.channels; + for (int i = 0; i < channels.length; i++) + if ((channelmask & (1 << i)) != 0) + channels[i].tuning = tuning; + break; + } + default: + break; + } + break; + case 0x09: // General Midi Message + subid2 = data[4] & 0xFF; + switch (subid2) { + case 0x01: // General Midi 1 On + synth.setGeneralMidiMode(1); + reset(); + break; + case 0x02: // General Midi Off + synth.setGeneralMidiMode(0); + reset(); + break; + case 0x03: // General MidI Level 2 On + synth.setGeneralMidiMode(2); + reset(); + break; + default: + break; + } + break; + case 0x0A: // DLS Message + subid2 = data[4] & 0xFF; + switch (subid2) { + case 0x01: // DLS On + if (synth.getGeneralMidiMode() == 0) + synth.setGeneralMidiMode(1); + synth.voice_allocation_mode = 1; + reset(); + break; + case 0x02: // DLS Off + synth.setGeneralMidiMode(0); + synth.voice_allocation_mode = 0; + reset(); + break; + case 0x03: // DLS Static Voice Allocation Off + synth.voice_allocation_mode = 0; + break; + case 0x04: // DLS Static Voice Allocation On + synth.voice_allocation_mode = 1; + break; + default: + break; + } + break; + + default: + break; + } + } + } + + // Universal Real-Time SysEx + if ((data[1] & 0xFF) == 0x7F) { + int deviceID = data[2] & 0xFF; + if (deviceID == 0x7F || deviceID == synth.getDeviceID()) { + int subid1 = data[3] & 0xFF; + int subid2; + switch (subid1) { + case 0x04: // Device Control + + subid2 = data[4] & 0xFF; + switch (subid2) { + case 0x01: // Master Volume + case 0x02: // Master Balane + case 0x03: // Master fine tuning + case 0x04: // Master coarse tuning + int val = (data[5] & 0x7F) + + ((data[6] & 0x7F) * 128); + if (subid2 == 0x01) + setVolume(val); + else if (subid2 == 0x02) + setBalance(val); + else if (subid2 == 0x03) + setFineTuning(val); + else if (subid2 == 0x04) + setCoarseTuning(val); + break; + case 0x05: // Global Parameter Control + int ix = 5; + int slotPathLen = (data[ix++] & 0xFF); + int paramWidth = (data[ix++] & 0xFF); + int valueWidth = (data[ix++] & 0xFF); + int[] slotPath = new int[slotPathLen]; + for (int i = 0; i < slotPathLen; i++) { + int msb = (data[ix++] & 0xFF); + int lsb = (data[ix++] & 0xFF); + slotPath[i] = msb * 128 + lsb; + } + int paramCount = (data.length - 1 - ix) + / (paramWidth + valueWidth); + long[] params = new long[paramCount]; + long[] values = new long[paramCount]; + for (int i = 0; i < paramCount; i++) { + values[i] = 0; + for (int j = 0; j < paramWidth; j++) + params[i] = params[i] * 128 + + (data[ix++] & 0xFF); + for (int j = 0; j < valueWidth; j++) + values[i] = values[i] * 128 + + (data[ix++] & 0xFF); + + } + globalParameterControlChange(slotPath, params, values); + break; + default: + break; + } + break; + + case 0x08: // MIDI Tuning Standard + subid2 = data[4] & 0xFF; + switch (subid2) { + case 0x02: // SINGLE NOTE TUNING CHANGE (REAL-TIME) + { + // http://www.midi.org/about-midi/tuning.shtml + SoftTuning tuning = synth.getTuning(new Patch(0, + data[5] & 0xFF)); + tuning.load(data); + SoftVoice[] voices = synth.getVoices(); + for (int i = 0; i < voices.length; i++) + if (voices[i].active) + if (voices[i].tuning == tuning) + voices[i].updateTuning(tuning); + break; + } + case 0x07: // SINGLE NOTE TUNING CHANGE (REAL-TIME) + // (BANK) + { + // http://www.midi.org/about-midi/tuning_extens.shtml + SoftTuning tuning = synth.getTuning(new Patch( + data[5] & 0xFF, data[6] & 0xFF)); + tuning.load(data); + SoftVoice[] voices = synth.getVoices(); + for (int i = 0; i < voices.length; i++) + if (voices[i].active) + if (voices[i].tuning == tuning) + voices[i].updateTuning(tuning); + break; + } + case 0x08: // scale/octave tuning 1-byte form + //(Real-Time) + case 0x09: // scale/octave tuning 2-byte form + // (Real-Time) + { + // http://www.midi.org/about-midi/tuning-scale.shtml + SoftTuning tuning = new SoftTuning(data); + int channelmask = (data[5] & 0xFF) * 16384 + + (data[6] & 0xFF) * 128 + (data[7] & 0xFF); + SoftChannel[] channels = synth.channels; + for (int i = 0; i < channels.length; i++) + if ((channelmask & (1 << i)) != 0) + channels[i].tuning = tuning; + SoftVoice[] voices = synth.getVoices(); + for (int i = 0; i < voices.length; i++) + if (voices[i].active) + if ((channelmask & (1 << (voices[i].channel))) != 0) + voices[i].updateTuning(tuning); + break; + } + default: + break; + } + break; + case 0x09: // Control Destination Settings + subid2 = data[4] & 0xFF; + switch (subid2) { + case 0x01: // Channel Pressure + { + int[] destinations = new int[(data.length - 7) / 2]; + int[] ranges = new int[(data.length - 7) / 2]; + int ix = 0; + for (int j = 6; j < data.length - 1; j += 2) { + destinations[ix] = data[j] & 0xFF; + ranges[ix] = data[j + 1] & 0xFF; + ix++; + } + int channel = data[5] & 0xFF; + SoftChannel softchannel = synth.channels[channel]; + softchannel.mapChannelPressureToDestination( + destinations, ranges); + break; + } + case 0x02: // Poly Pressure + { + int[] destinations = new int[(data.length - 7) / 2]; + int[] ranges = new int[(data.length - 7) / 2]; + int ix = 0; + for (int j = 6; j < data.length - 1; j += 2) { + destinations[ix] = data[j] & 0xFF; + ranges[ix] = data[j + 1] & 0xFF; + ix++; + } + int channel = data[5] & 0xFF; + SoftChannel softchannel = synth.channels[channel]; + softchannel.mapPolyPressureToDestination( + destinations, ranges); + break; + } + case 0x03: // Control Change + { + int[] destinations = new int[(data.length - 7) / 2]; + int[] ranges = new int[(data.length - 7) / 2]; + int ix = 0; + for (int j = 7; j < data.length - 1; j += 2) { + destinations[ix] = data[j] & 0xFF; + ranges[ix] = data[j + 1] & 0xFF; + ix++; + } + int channel = data[5] & 0xFF; + SoftChannel softchannel = synth.channels[channel]; + int control = data[6] & 0xFF; + softchannel.mapControlToDestination(control, + destinations, ranges); + break; + } + default: + break; + } + break; + + case 0x0A: // Key Based Instrument Control + { + subid2 = data[4] & 0xFF; + switch (subid2) { + case 0x01: // Basic Message + int channel = data[5] & 0xFF; + int keynumber = data[6] & 0xFF; + SoftChannel softchannel = synth.channels[channel]; + for (int j = 7; j < data.length - 1; j += 2) { + int controlnumber = data[j] & 0xFF; + int controlvalue = data[j + 1] & 0xFF; + softchannel.controlChangePerNote(keynumber, + controlnumber, controlvalue); + } + break; + default: + break; + } + break; + } + default: + break; + } + } + } + + } + } + + private void processMessages(long timeStamp) { + Iterator> iter = midimessages.entrySet().iterator(); + while (iter.hasNext()) { + Entry entry = iter.next(); + if (entry.getKey() > (timeStamp + 100)) + return; + processMessage(entry.getValue()); + iter.remove(); + } + } + + protected void processAudioBuffers() { + for (int i = 0; i < buffers.length; i++) { + buffers[i].clear(); + } + + double volume_left; + double volume_right; + + ModelChannelMixer[] act_registeredMixers; + + // perform control logic + synchronized (control_mutex) { + + processMessages(msec_pos); + + if (active_sensing_on) { + // Active Sensing + // if no message occurs for max 1000 ms + // then do AllSoundOff on all channels + if ((msec_pos - msec_last_activity) > 1000000) { + active_sensing_on = false; + for (SoftChannel c : synth.channels) + c.allSoundOff(); + } + + } + + for (int i = 0; i < voicestatus.length; i++) + if (voicestatus[i].active) + voicestatus[i].processControlLogic(); + msec_pos += msec_buffer_len; + + double volume = co_master_volume[0]; + volume_left = volume; + volume_right = volume; + + double balance = co_master_balance[0]; + if (balance > 0.5) + volume_left *= (1 - balance) * 2; + else + volume_right *= balance * 2; + + chorus.processControlLogic(); + reverb.processControlLogic(); + agc.processControlLogic(); + + if (cur_registeredMixers == null) { + if (registeredMixers != null) { + cur_registeredMixers = + new ModelChannelMixer[registeredMixers.size()]; + registeredMixers.toArray(cur_registeredMixers); + } + } + + act_registeredMixers = cur_registeredMixers; + if (act_registeredMixers != null) + if (act_registeredMixers.length == 0) + act_registeredMixers = null; + + } + + if (act_registeredMixers != null) { + + // Reroute default left,right output + // to channelmixer left,right input/output + SoftAudioBuffer leftbak = buffers[CHANNEL_LEFT]; + SoftAudioBuffer rightbak = buffers[CHANNEL_RIGHT]; + buffers[CHANNEL_LEFT] = buffers[CHANNEL_CHANNELMIXER_LEFT]; + buffers[CHANNEL_RIGHT] = buffers[CHANNEL_CHANNELMIXER_LEFT]; + + int bufferlen = buffers[CHANNEL_LEFT].getSize(); + + float[][] cbuffer = new float[nrofchannels][]; + cbuffer[0] = buffers[CHANNEL_LEFT].array(); + if (nrofchannels != 1) + cbuffer[1] = buffers[CHANNEL_RIGHT].array(); + + float[][] obuffer = new float[nrofchannels][]; + obuffer[0] = leftbak.array(); + if (nrofchannels != 1) + obuffer[1] = rightbak.array(); + + for (ModelChannelMixer cmixer : act_registeredMixers) { + for (int i = 0; i < cbuffer.length; i++) + Arrays.fill(cbuffer[i], 0); + boolean hasactivevoices = false; + for (int i = 0; i < voicestatus.length; i++) + if (voicestatus[i].active) + if (voicestatus[i].channelmixer == cmixer) { + voicestatus[i].processAudioLogic(buffers); + hasactivevoices = true; + } + if (!cmixer.process(cbuffer, 0, bufferlen)) { + synchronized (control_mutex) { + registeredMixers.remove(cmixer); + cur_registeredMixers = null; + } + } + + for (int i = 0; i < cbuffer.length; i++) { + float[] cbuff = cbuffer[i]; + float[] obuff = obuffer[i]; + for (int j = 0; j < bufferlen; j++) + obuff[j] += cbuff[j]; + } + + if (!hasactivevoices) { + synchronized (control_mutex) { + if (stoppedMixers != null) { + if (stoppedMixers.contains(cmixer)) { + stoppedMixers.remove(cmixer); + cmixer.stop(); + } + } + } + } + + } + + buffers[CHANNEL_LEFT] = leftbak; + buffers[CHANNEL_RIGHT] = rightbak; + + } + + for (int i = 0; i < voicestatus.length; i++) + if (voicestatus[i].active) + if (voicestatus[i].channelmixer == null) + voicestatus[i].processAudioLogic(buffers); + + // Run effects + if (synth.chorus_on) + chorus.processAudio(); + + if (synth.reverb_on) + reverb.processAudio(); + + if (nrofchannels == 1) + volume_left = (volume_left + volume_right) / 2; + + // Set Volume / Balance + if (last_volume_left != volume_left || last_volume_right != volume_right) { + float[] left = buffers[CHANNEL_LEFT].array(); + float[] right = buffers[CHANNEL_RIGHT].array(); + int bufferlen = buffers[CHANNEL_LEFT].getSize(); + + float amp; + float amp_delta; + amp = (float)(last_volume_left * last_volume_left); + amp_delta = (float)((volume_left * volume_left - amp) / bufferlen); + for (int i = 0; i < bufferlen; i++) { + amp += amp_delta; + left[i] *= amp; + } + if (nrofchannels != 1) { + amp = (float)(last_volume_right * last_volume_right); + amp_delta = (float)((volume_right*volume_right - amp) / bufferlen); + for (int i = 0; i < bufferlen; i++) { + amp += amp_delta; + right[i] *= volume_right; + } + } + last_volume_left = volume_left; + last_volume_right = volume_right; + + } else { + if (volume_left != 1.0 || volume_right != 1.0) { + float[] left = buffers[CHANNEL_LEFT].array(); + float[] right = buffers[CHANNEL_RIGHT].array(); + int bufferlen = buffers[CHANNEL_LEFT].getSize(); + float amp; + amp = (float) (volume_left * volume_left); + for (int i = 0; i < bufferlen; i++) + left[i] *= amp; + if (nrofchannels != 1) { + amp = (float)(volume_right * volume_right); + for (int i = 0; i < bufferlen; i++) + right[i] *= amp; + } + + } + } + + if(buffers[CHANNEL_LEFT].isSilent() + && buffers[CHANNEL_RIGHT].isSilent()) + { + pusher_silent_count++; + if(pusher_silent_count > 5) + { + pusher_silent_count = 0; + synchronized (control_mutex) { + pusher_silent = true; + if(synth.weakstream != null) + synth.weakstream.setInputStream(null); + } + } + } + else + pusher_silent_count = 0; + + if (synth.agc_on) + agc.processAudio(); + + } + + // Must only we called within control_mutex synchronization + public void activity() + { + msec_last_activity = msec_pos; + if(pusher_silent) + { + pusher_silent = false; + if(synth.weakstream != null) + synth.weakstream.setInputStream(ais); + } + } + + public void stopMixer(ModelChannelMixer mixer) { + if (stoppedMixers == null) + stoppedMixers = new HashSet(); + stoppedMixers.add(mixer); + } + + public void registerMixer(ModelChannelMixer mixer) { + if (registeredMixers == null) + registeredMixers = new HashSet(); + registeredMixers.add(mixer); + cur_registeredMixers = null; + } + + public SoftMainMixer(SoftSynthesizer synth) { + this.synth = synth; + + msec_pos = 0; + + co_master_balance[0] = 0.5; + co_master_volume[0] = 1; + co_master_coarse_tuning[0] = 0.5; + co_master_fine_tuning[0] = 0.5; + + msec_buffer_len = (long) (1000000.0 / synth.getControlRate()); + + nrofchannels = synth.getFormat().getChannels(); + + int buffersize = (int) (synth.getFormat().getSampleRate() + / synth.getControlRate()); + + control_mutex = synth.control_mutex; + buffers = new SoftAudioBuffer[16]; + for (int i = 0; i < buffers.length; i++) { + buffers[i] = new SoftAudioBuffer(buffersize, synth.getFormat()); + } + voicestatus = synth.getVoices(); + + reverb = new SoftReverb(); + chorus = new SoftChorus(); + agc = new SoftLimiter(); + + float samplerate = synth.getFormat().getSampleRate(); + float controlrate = synth.getControlRate(); + reverb.init(samplerate, controlrate); + chorus.init(samplerate, controlrate); + agc.init(samplerate, controlrate); + + reverb.setLightMode(synth.reverb_light); + + reverb.setMixMode(true); + chorus.setMixMode(true); + agc.setMixMode(false); + + chorus.setInput(0, buffers[CHANNEL_EFFECT2]); + chorus.setOutput(0, buffers[CHANNEL_LEFT]); + if (nrofchannels != 1) + chorus.setOutput(1, buffers[CHANNEL_RIGHT]); + chorus.setOutput(2, buffers[CHANNEL_EFFECT1]); + + reverb.setInput(0, buffers[CHANNEL_EFFECT1]); + reverb.setOutput(0, buffers[CHANNEL_LEFT]); + if (nrofchannels != 1) + reverb.setOutput(1, buffers[CHANNEL_RIGHT]); + + agc.setInput(0, buffers[CHANNEL_LEFT]); + if (nrofchannels != 1) + agc.setInput(1, buffers[CHANNEL_RIGHT]); + agc.setOutput(0, buffers[CHANNEL_LEFT]); + if (nrofchannels != 1) + agc.setOutput(1, buffers[CHANNEL_RIGHT]); + + InputStream in = new InputStream() { + + private SoftAudioBuffer[] buffers = SoftMainMixer.this.buffers; + private int nrofchannels + = SoftMainMixer.this.synth.getFormat().getChannels(); + private int buffersize = buffers[0].getSize(); + private byte[] bbuffer = new byte[buffersize + * (SoftMainMixer.this.synth.getFormat() + .getSampleSizeInBits() / 8) + * nrofchannels]; + private int bbuffer_pos = 0; + private byte[] single = new byte[1]; + + public void fillBuffer() { + /* + boolean pusher_silent2; + synchronized (control_mutex) { + pusher_silent2 = pusher_silent; + } + if(!pusher_silent2)*/ + processAudioBuffers(); + for (int i = 0; i < nrofchannels; i++) + buffers[i].get(bbuffer, i); + bbuffer_pos = 0; + } + + public int read(byte[] b, int off, int len) { + int bbuffer_len = bbuffer.length; + int offlen = off + len; + int orgoff = off; + byte[] bbuffer = this.bbuffer; + while (off < offlen) { + if (available() == 0) + fillBuffer(); + else { + int bbuffer_pos = this.bbuffer_pos; + while (off < offlen && bbuffer_pos < bbuffer_len) + b[off++] = bbuffer[bbuffer_pos++]; + this.bbuffer_pos = bbuffer_pos; + if (!readfully) + return off - orgoff; + } + } + return len; + } + + public int read() throws IOException { + int ret = read(single); + if (ret == -1) + return -1; + return single[0] & 0xFF; + } + + public int available() { + return bbuffer.length - bbuffer_pos; + } + + public void close() { + SoftMainMixer.this.synth.close(); + } + }; + + ais = new AudioInputStream(in, synth.getFormat(), AudioSystem.NOT_SPECIFIED); + + } + + public AudioInputStream getInputStream() { + return ais; + } + + public void reset() { + + SoftChannel[] channels = synth.channels; + for (int i = 0; i < channels.length; i++) { + channels[i].allSoundOff(); + channels[i].resetAllControllers(true); + + if (synth.getGeneralMidiMode() == 2) { + if (i == 9) + channels[i].programChange(0, 0x78 * 128); + else + channels[i].programChange(0, 0x79 * 128); + } else + channels[i].programChange(0, 0); + } + setVolume(0x7F * 128 + 0x7F); + setBalance(0x40 * 128 + 0x00); + setCoarseTuning(0x40 * 128 + 0x00); + setFineTuning(0x40 * 128 + 0x00); + // Reset Reverb + globalParameterControlChange( + new int[]{0x01 * 128 + 0x01}, new long[]{0}, new long[]{4}); + // Reset Chorus + globalParameterControlChange( + new int[]{0x01 * 128 + 0x02}, new long[]{0}, new long[]{2}); + } + + public void setVolume(int value) { + synchronized (control_mutex) { + co_master_volume[0] = value / 16384.0; + } + } + + public void setBalance(int value) { + synchronized (control_mutex) { + co_master_balance[0] = value / 16384.0; + } + } + + public void setFineTuning(int value) { + synchronized (control_mutex) { + co_master_fine_tuning[0] = value / 16384.0; + } + } + + public void setCoarseTuning(int value) { + synchronized (control_mutex) { + co_master_coarse_tuning[0] = value / 16384.0; + } + } + + public int getVolume() { + synchronized (control_mutex) { + return (int) (co_master_volume[0] * 16384.0); + } + } + + public int getBalance() { + synchronized (control_mutex) { + return (int) (co_master_balance[0] * 16384.0); + } + } + + public int getFineTuning() { + synchronized (control_mutex) { + return (int) (co_master_fine_tuning[0] * 16384.0); + } + } + + public int getCoarseTuning() { + synchronized (control_mutex) { + return (int) (co_master_coarse_tuning[0] * 16384.0); + } + } + + public void globalParameterControlChange(int[] slothpath, long[] params, + long[] paramsvalue) { + if (slothpath.length == 0) + return; + + synchronized (control_mutex) { + + // slothpath: 01xx are reserved only for GM2 + + if (slothpath[0] == 0x01 * 128 + 0x01) { + for (int i = 0; i < paramsvalue.length; i++) { + reverb.globalParameterControlChange(slothpath, params[i], + paramsvalue[i]); + } + } + if (slothpath[0] == 0x01 * 128 + 0x02) { + for (int i = 0; i < paramsvalue.length; i++) { + chorus.globalParameterControlChange(slothpath, params[i], + paramsvalue[i]); + } + + } + + } + } + + public void processMessage(Object object) { + if (object instanceof byte[]) + processMessage((byte[]) object); + if (object instanceof MidiMessage) + processMessage((MidiMessage)object); + } + + public void processMessage(MidiMessage message) { + if (message instanceof ShortMessage) { + ShortMessage sms = (ShortMessage)message; + processMessage(sms.getChannel(), sms.getCommand(), + sms.getData1(), sms.getData2()); + return; + } + processMessage(message.getMessage()); + } + + public void processMessage(byte[] data) { + int status = 0; + if (data.length > 0) + status = data[0] & 0xFF; + + if (status == 0xF0) { + processSystemExclusiveMessage(data); + return; + } + + int cmd = (status & 0xF0); + int ch = (status & 0x0F); + + int data1; + int data2; + if (data.length > 1) + data1 = data[1] & 0xFF; + else + data1 = 0; + if (data.length > 2) + data2 = data[2] & 0xFF; + else + data2 = 0; + + processMessage(ch, cmd, data1, data2); + + } + + public void processMessage(int ch, int cmd, int data1, int data2) { + synchronized (synth.control_mutex) { + activity(); + } + + if (cmd == 0xF0) { + int status = cmd | ch; + switch (status) { + case ShortMessage.ACTIVE_SENSING: + synchronized (synth.control_mutex) { + active_sensing_on = true; + } + break; + default: + break; + } + return; + } + + SoftChannel[] channels = synth.channels; + if (ch >= channels.length) + return; + SoftChannel softchannel = channels[ch]; + + switch (cmd) { + case ShortMessage.NOTE_ON: + softchannel.noteOn(data1, data2); + break; + case ShortMessage.NOTE_OFF: + softchannel.noteOff(data1, data2); + break; + case ShortMessage.POLY_PRESSURE: + softchannel.setPolyPressure(data1, data2); + break; + case ShortMessage.CONTROL_CHANGE: + softchannel.controlChange(data1, data2); + break; + case ShortMessage.PROGRAM_CHANGE: + softchannel.programChange(data1); + break; + case ShortMessage.CHANNEL_PRESSURE: + softchannel.setChannelPressure(data1); + break; + case ShortMessage.PITCH_BEND: + softchannel.setPitchBend(data1 + data2 * 128); + break; + default: + break; + } + + } + + public long getMicrosecondPosition() { + return msec_pos; + } + + public void close() { + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftMidiAudioFileReader.java b/jdk/src/share/classes/com/sun/media/sound/SoftMidiAudioFileReader.java new file mode 100644 index 00000000000..caaa0bb98f5 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftMidiAudioFileReader.java @@ -0,0 +1,214 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +import javax.sound.midi.InvalidMidiDataException; +import javax.sound.midi.MetaMessage; +import javax.sound.midi.MidiEvent; +import javax.sound.midi.MidiMessage; +import javax.sound.midi.MidiSystem; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Receiver; +import javax.sound.midi.Sequence; +import javax.sound.midi.Track; +import javax.sound.sampled.AudioFileFormat; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.UnsupportedAudioFileException; +import javax.sound.sampled.AudioFileFormat.Type; +import javax.sound.sampled.spi.AudioFileReader; + +/** + * MIDI File Audio Renderer/Reader + * + * @author Karl Helgason + */ +public class SoftMidiAudioFileReader extends AudioFileReader { + + public static final Type MIDI = new Type("MIDI", "mid"); + private static AudioFormat format = new AudioFormat(44100, 16, 2, true, false); + + public AudioFileFormat getAudioFileFormat(Sequence seq) + throws UnsupportedAudioFileException, IOException { + + long totallen = seq.getMicrosecondLength() / 1000000; + long len = (long) (format.getFrameRate() * (totallen + 4)); + return new AudioFileFormat(MIDI, format, (int) len); + } + + public AudioInputStream getAudioInputStream(Sequence seq) + throws UnsupportedAudioFileException, IOException { + AudioSynthesizer synth = (AudioSynthesizer) new SoftSynthesizer(); + AudioInputStream stream; + Receiver recv; + try { + stream = synth.openStream(format, null); + recv = synth.getReceiver(); + } catch (MidiUnavailableException e) { + throw new IOException(e.toString()); + } + float divtype = seq.getDivisionType(); + Track[] tracks = seq.getTracks(); + int[] trackspos = new int[tracks.length]; + int mpq = 500000; + int seqres = seq.getResolution(); + long lasttick = 0; + long curtime = 0; + while (true) { + MidiEvent selevent = null; + int seltrack = -1; + for (int i = 0; i < tracks.length; i++) { + int trackpos = trackspos[i]; + Track track = tracks[i]; + if (trackpos < track.size()) { + MidiEvent event = track.get(trackpos); + if (selevent == null || event.getTick() < selevent.getTick()) { + selevent = event; + seltrack = i; + } + } + } + if (seltrack == -1) + break; + trackspos[seltrack]++; + long tick = selevent.getTick(); + if (divtype == Sequence.PPQ) + curtime += ((tick - lasttick) * mpq) / seqres; + else + curtime = (long) ((tick * 1000000.0 * divtype) / seqres); + lasttick = tick; + MidiMessage msg = selevent.getMessage(); + if (msg instanceof MetaMessage) { + if (divtype == Sequence.PPQ) { + if (((MetaMessage) msg).getType() == 0x51) { + byte[] data = ((MetaMessage) msg).getData(); + mpq = ((data[0] & 0xff) << 16) + | ((data[1] & 0xff) << 8) | (data[2] & 0xff); + } + } + } else { + recv.send(msg, curtime); + } + } + + long totallen = curtime / 1000000; + long len = (long) (stream.getFormat().getFrameRate() * (totallen + 4)); + stream = new AudioInputStream(stream, stream.getFormat(), len); + return stream; + } + + public AudioInputStream getAudioInputStream(InputStream inputstream) + throws UnsupportedAudioFileException, IOException { + + inputstream.mark(200); + Sequence seq; + try { + seq = MidiSystem.getSequence(inputstream); + } catch (InvalidMidiDataException e) { + inputstream.reset(); + throw new UnsupportedAudioFileException(); + } catch (IOException e) { + inputstream.reset(); + throw new UnsupportedAudioFileException(); + } + return getAudioInputStream(seq); + } + + public AudioFileFormat getAudioFileFormat(URL url) + throws UnsupportedAudioFileException, IOException { + Sequence seq; + try { + seq = MidiSystem.getSequence(url); + } catch (InvalidMidiDataException e) { + throw new UnsupportedAudioFileException(); + } catch (IOException e) { + throw new UnsupportedAudioFileException(); + } + return getAudioFileFormat(seq); + } + + public AudioFileFormat getAudioFileFormat(File file) + throws UnsupportedAudioFileException, IOException { + Sequence seq; + try { + seq = MidiSystem.getSequence(file); + } catch (InvalidMidiDataException e) { + throw new UnsupportedAudioFileException(); + } catch (IOException e) { + throw new UnsupportedAudioFileException(); + } + return getAudioFileFormat(seq); + } + + public AudioInputStream getAudioInputStream(URL url) + throws UnsupportedAudioFileException, IOException { + Sequence seq; + try { + seq = MidiSystem.getSequence(url); + } catch (InvalidMidiDataException e) { + throw new UnsupportedAudioFileException(); + } catch (IOException e) { + throw new UnsupportedAudioFileException(); + } + return getAudioInputStream(seq); + } + + public AudioInputStream getAudioInputStream(File file) + throws UnsupportedAudioFileException, IOException { + if (!file.getName().toLowerCase().endsWith(".mid")) + throw new UnsupportedAudioFileException(); + Sequence seq; + try { + seq = MidiSystem.getSequence(file); + } catch (InvalidMidiDataException e) { + throw new UnsupportedAudioFileException(); + } catch (IOException e) { + throw new UnsupportedAudioFileException(); + } + return getAudioInputStream(seq); + } + + public AudioFileFormat getAudioFileFormat(InputStream inputstream) + throws UnsupportedAudioFileException, IOException { + + inputstream.mark(200); + Sequence seq; + try { + seq = MidiSystem.getSequence(inputstream); + } catch (InvalidMidiDataException e) { + inputstream.reset(); + throw new UnsupportedAudioFileException(); + } catch (IOException e) { + inputstream.reset(); + throw new UnsupportedAudioFileException(); + } + return getAudioFileFormat(seq); + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftMixingClip.java b/jdk/src/share/classes/com/sun/media/sound/SoftMixingClip.java new file mode 100644 index 00000000000..5db16d91762 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftMixingClip.java @@ -0,0 +1,539 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; + +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.Clip; +import javax.sound.sampled.DataLine; +import javax.sound.sampled.LineEvent; +import javax.sound.sampled.LineUnavailableException; + +/** + * Clip implemention for the SoftMixingMixer. + * + * @author Karl Helgason + */ +public class SoftMixingClip extends SoftMixingDataLine implements Clip { + + private AudioFormat format; + + private int framesize; + + private byte[] data; + + private InputStream datastream = new InputStream() { + + public int read() throws IOException { + byte[] b = new byte[1]; + int ret = read(b); + if (ret < 0) + return ret; + return b[0] & 0xFF; + } + + public int read(byte[] b, int off, int len) throws IOException { + + if (_loopcount != 0) { + int bloopend = _loopend * framesize; + int bloopstart = _loopstart * framesize; + int pos = _frameposition * framesize; + + if (pos + len >= bloopend) + if (pos < bloopend) { + int offend = off + len; + int o = off; + while (off != offend) { + if (pos == bloopend) { + if (_loopcount == 0) + break; + pos = bloopstart; + if (_loopcount != LOOP_CONTINUOUSLY) + _loopcount--; + } + len = offend - off; + int left = bloopend - pos; + if (len > left) + len = left; + System.arraycopy(data, pos, b, off, len); + off += len; + } + if (_loopcount == 0) { + len = offend - off; + int left = bloopend - pos; + if (len > left) + len = left; + System.arraycopy(data, pos, b, off, len); + off += len; + } + _frameposition = pos / framesize; + return o - off; + } + } + + int pos = _frameposition * framesize; + int left = bufferSize - pos; + if (left == 0) + return -1; + if (len > left) + len = left; + System.arraycopy(data, pos, b, off, len); + _frameposition += len / framesize; + return len; + } + + }; + + private int offset; + + private int bufferSize; + + private float[] readbuffer; + + private boolean open = false; + + private AudioFormat outputformat; + + private int out_nrofchannels; + + private int in_nrofchannels; + + private int frameposition = 0; + + private boolean frameposition_sg = false; + + private boolean active_sg = false; + + private int loopstart = 0; + + private int loopend = -1; + + private boolean active = false; + + private int loopcount = 0; + + private boolean _active = false; + + private int _frameposition = 0; + + private boolean loop_sg = false; + + private int _loopcount = 0; + + private int _loopstart = 0; + + private int _loopend = -1; + + private float _rightgain; + + private float _leftgain; + + private float _eff1gain; + + private float _eff2gain; + + private AudioFloatInputStream afis; + + protected SoftMixingClip(SoftMixingMixer mixer, DataLine.Info info) { + super(mixer, info); + } + + protected void processControlLogic() { + + _rightgain = rightgain; + _leftgain = leftgain; + _eff1gain = eff1gain; + _eff2gain = eff2gain; + + if (active_sg) { + _active = active; + active_sg = false; + } else { + active = _active; + } + + if (frameposition_sg) { + _frameposition = frameposition; + frameposition_sg = false; + afis = null; + } else { + frameposition = _frameposition; + } + if (loop_sg) { + _loopcount = loopcount; + _loopstart = loopstart; + _loopend = loopend; + } + + if (afis == null) { + afis = AudioFloatInputStream.getInputStream(new AudioInputStream( + datastream, format, AudioSystem.NOT_SPECIFIED)); + + if (Math.abs(format.getSampleRate() - outputformat.getSampleRate()) > 0.000001) + afis = new AudioFloatInputStreamResampler(afis, outputformat); + } + + } + + protected void processAudioLogic(SoftAudioBuffer[] buffers) { + if (_active) { + float[] left = buffers[SoftMixingMainMixer.CHANNEL_LEFT].array(); + float[] right = buffers[SoftMixingMainMixer.CHANNEL_RIGHT].array(); + int bufferlen = buffers[SoftMixingMainMixer.CHANNEL_LEFT].getSize(); + + int readlen = bufferlen * in_nrofchannels; + if (readbuffer == null || readbuffer.length < readlen) { + readbuffer = new float[readlen]; + } + int ret = 0; + try { + ret = afis.read(readbuffer); + if (ret == -1) { + _active = false; + return; + } + if (ret != in_nrofchannels) + Arrays.fill(readbuffer, ret, readlen, 0); + } catch (IOException e) { + } + + int in_c = in_nrofchannels; + for (int i = 0, ix = 0; i < bufferlen; i++, ix += in_c) { + left[i] += readbuffer[ix] * _leftgain; + } + + if (out_nrofchannels != 1) { + if (in_nrofchannels == 1) { + for (int i = 0, ix = 0; i < bufferlen; i++, ix += in_c) { + right[i] += readbuffer[ix] * _rightgain; + } + } else { + for (int i = 0, ix = 1; i < bufferlen; i++, ix += in_c) { + right[i] += readbuffer[ix] * _rightgain; + } + } + + } + + if (_eff1gain > 0.0002) { + + float[] eff1 = buffers[SoftMixingMainMixer.CHANNEL_EFFECT1] + .array(); + for (int i = 0, ix = 0; i < bufferlen; i++, ix += in_c) { + eff1[i] += readbuffer[ix] * _eff1gain; + } + if (in_nrofchannels == 2) { + for (int i = 0, ix = 1; i < bufferlen; i++, ix += in_c) { + eff1[i] += readbuffer[ix] * _eff1gain; + } + } + } + + if (_eff2gain > 0.0002) { + float[] eff2 = buffers[SoftMixingMainMixer.CHANNEL_EFFECT2] + .array(); + for (int i = 0, ix = 0; i < bufferlen; i++, ix += in_c) { + eff2[i] += readbuffer[ix] * _eff2gain; + } + if (in_nrofchannels == 2) { + for (int i = 0, ix = 1; i < bufferlen; i++, ix += in_c) { + eff2[i] += readbuffer[ix] * _eff2gain; + } + } + } + + } + } + + public int getFrameLength() { + return bufferSize / format.getFrameSize(); + } + + public long getMicrosecondLength() { + return (long) (getFrameLength() * (1000000.0 / (double) getFormat() + .getSampleRate())); + } + + public void loop(int count) { + LineEvent event = null; + + synchronized (control_mutex) { + if (isOpen()) { + if (active) + return; + active = true; + active_sg = true; + loopcount = count; + event = new LineEvent(this, LineEvent.Type.START, + getLongFramePosition()); + } + } + + if (event != null) + sendEvent(event); + + } + + public void open(AudioInputStream stream) throws LineUnavailableException, + IOException { + if (isOpen()) { + throw new IllegalStateException("Clip is already open with format " + + getFormat() + " and frame lengh of " + getFrameLength()); + } + if (AudioFloatConverter.getConverter(stream.getFormat()) == null) + throw new IllegalArgumentException("Invalid format : " + + stream.getFormat().toString()); + + if (stream.getFrameLength() != AudioSystem.NOT_SPECIFIED) { + byte[] data = new byte[(int) stream.getFrameLength() + * stream.getFormat().getFrameSize()]; + int readsize = 512 * stream.getFormat().getFrameSize(); + int len = 0; + while (len != data.length) { + if (readsize > data.length - len) + readsize = data.length - len; + int ret = stream.read(data, len, readsize); + if (ret == -1) + break; + if (ret == 0) + Thread.yield(); + len += ret; + } + open(stream.getFormat(), data, 0, len); + } else { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + byte[] b = new byte[512 * stream.getFormat().getFrameSize()]; + int r = 0; + while ((r = stream.read(b)) != -1) { + if (r == 0) + Thread.yield(); + baos.write(b, 0, r); + } + open(stream.getFormat(), baos.toByteArray(), 0, baos.size()); + } + + } + + public void open(AudioFormat format, byte[] data, int offset, int bufferSize) + throws LineUnavailableException { + synchronized (control_mutex) { + if (isOpen()) { + throw new IllegalStateException( + "Clip is already open with format " + getFormat() + + " and frame lengh of " + getFrameLength()); + } + if (AudioFloatConverter.getConverter(format) == null) + throw new IllegalArgumentException("Invalid format : " + + format.toString()); + if (bufferSize % format.getFrameSize() != 0) + throw new IllegalArgumentException( + "Buffer size does not represent an integral number of sample frames!"); + + this.data = data; + this.offset = offset; + this.bufferSize = bufferSize; + this.format = format; + this.framesize = format.getFrameSize(); + + loopstart = 0; + loopend = -1; + loop_sg = true; + + if (!mixer.isOpen()) { + mixer.open(); + mixer.implicitOpen = true; + } + + outputformat = mixer.getFormat(); + out_nrofchannels = outputformat.getChannels(); + in_nrofchannels = format.getChannels(); + + open = true; + + mixer.getMainMixer().openLine(this); + } + + } + + public void setFramePosition(int frames) { + synchronized (control_mutex) { + frameposition_sg = true; + frameposition = frames; + } + } + + public void setLoopPoints(int start, int end) { + synchronized (control_mutex) { + if (end != -1) { + if (end < start) + throw new IllegalArgumentException("Invalid loop points : " + + start + " - " + end); + if (end * framesize > bufferSize) + throw new IllegalArgumentException("Invalid loop points : " + + start + " - " + end); + } + if (start * framesize > bufferSize) + throw new IllegalArgumentException("Invalid loop points : " + + start + " - " + end); + if (0 < start) + throw new IllegalArgumentException("Invalid loop points : " + + start + " - " + end); + loopstart = start; + loopend = end; + loop_sg = true; + } + } + + public void setMicrosecondPosition(long microseconds) { + setFramePosition((int) (microseconds * (((double) getFormat() + .getSampleRate()) / 1000000.0))); + } + + public int available() { + return 0; + } + + public void drain() { + } + + public void flush() { + } + + public int getBufferSize() { + return bufferSize; + } + + public AudioFormat getFormat() { + return format; + } + + public int getFramePosition() { + synchronized (control_mutex) { + return frameposition; + } + } + + public float getLevel() { + return AudioSystem.NOT_SPECIFIED; + } + + public long getLongFramePosition() { + return getFramePosition(); + } + + public long getMicrosecondPosition() { + return (long) (getFramePosition() * (1000000.0 / (double) getFormat() + .getSampleRate())); + } + + public boolean isActive() { + synchronized (control_mutex) { + return active; + } + } + + public boolean isRunning() { + synchronized (control_mutex) { + return active; + } + } + + public void start() { + + LineEvent event = null; + + synchronized (control_mutex) { + if (isOpen()) { + if (active) + return; + active = true; + active_sg = true; + loopcount = 0; + event = new LineEvent(this, LineEvent.Type.START, + getLongFramePosition()); + } + } + + if (event != null) + sendEvent(event); + } + + public void stop() { + LineEvent event = null; + + synchronized (control_mutex) { + if (isOpen()) { + if (!active) + return; + active = false; + active_sg = true; + event = new LineEvent(this, LineEvent.Type.STOP, + getLongFramePosition()); + } + } + + if (event != null) + sendEvent(event); + } + + public void close() { + LineEvent event = null; + + synchronized (control_mutex) { + if (!isOpen()) + return; + stop(); + + event = new LineEvent(this, LineEvent.Type.CLOSE, + getLongFramePosition()); + + open = false; + mixer.getMainMixer().closeLine(this); + } + + if (event != null) + sendEvent(event); + + } + + public boolean isOpen() { + return open; + } + + public void open() throws LineUnavailableException { + if (data == null) { + throw new IllegalArgumentException( + "Illegal call to open() in interface Clip"); + } + open(format, data, offset, bufferSize); + } + +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftMixingDataLine.java b/jdk/src/share/classes/com/sun/media/sound/SoftMixingDataLine.java new file mode 100644 index 00000000000..87af124821c --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftMixingDataLine.java @@ -0,0 +1,522 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.BooleanControl; +import javax.sound.sampled.Control; +import javax.sound.sampled.DataLine; +import javax.sound.sampled.FloatControl; +import javax.sound.sampled.LineEvent; +import javax.sound.sampled.LineListener; +import javax.sound.sampled.Control.Type; + +/** + * General software mixing line. + * + * @author Karl Helgason + */ +public abstract class SoftMixingDataLine implements DataLine { + + public static final FloatControl.Type CHORUS_SEND = new FloatControl.Type( + "Chorus Send") { + }; + + protected static class AudioFloatInputStreamResampler extends + AudioFloatInputStream { + + private AudioFloatInputStream ais; + + private AudioFormat targetFormat; + + private float[] skipbuffer; + + private SoftAbstractResampler resampler; + + private float[] pitch = new float[1]; + + private float[] ibuffer2; + + private float[][] ibuffer; + + private float ibuffer_index = 0; + + private int ibuffer_len = 0; + + private int nrofchannels = 0; + + private float[][] cbuffer; + + private int buffer_len = 512; + + private int pad; + + private int pad2; + + private float[] ix = new float[1]; + + private int[] ox = new int[1]; + + private float[][] mark_ibuffer = null; + + private float mark_ibuffer_index = 0; + + private int mark_ibuffer_len = 0; + + public AudioFloatInputStreamResampler(AudioFloatInputStream ais, + AudioFormat format) { + this.ais = ais; + AudioFormat sourceFormat = ais.getFormat(); + targetFormat = new AudioFormat(sourceFormat.getEncoding(), format + .getSampleRate(), sourceFormat.getSampleSizeInBits(), + sourceFormat.getChannels(), sourceFormat.getFrameSize(), + format.getSampleRate(), sourceFormat.isBigEndian()); + nrofchannels = targetFormat.getChannels(); + Object interpolation = format.getProperty("interpolation"); + if (interpolation != null && (interpolation instanceof String)) { + String resamplerType = (String) interpolation; + if (resamplerType.equalsIgnoreCase("point")) + this.resampler = new SoftPointResampler(); + if (resamplerType.equalsIgnoreCase("linear")) + this.resampler = new SoftLinearResampler2(); + if (resamplerType.equalsIgnoreCase("linear1")) + this.resampler = new SoftLinearResampler(); + if (resamplerType.equalsIgnoreCase("linear2")) + this.resampler = new SoftLinearResampler2(); + if (resamplerType.equalsIgnoreCase("cubic")) + this.resampler = new SoftCubicResampler(); + if (resamplerType.equalsIgnoreCase("lanczos")) + this.resampler = new SoftLanczosResampler(); + if (resamplerType.equalsIgnoreCase("sinc")) + this.resampler = new SoftSincResampler(); + } + if (resampler == null) + resampler = new SoftLinearResampler2(); // new + // SoftLinearResampler2(); + pitch[0] = sourceFormat.getSampleRate() / format.getSampleRate(); + pad = resampler.getPadding(); + pad2 = pad * 2; + ibuffer = new float[nrofchannels][buffer_len + pad2]; + ibuffer2 = new float[nrofchannels * buffer_len]; + ibuffer_index = buffer_len + pad; + ibuffer_len = buffer_len; + } + + public int available() throws IOException { + return 0; + } + + public void close() throws IOException { + ais.close(); + } + + public AudioFormat getFormat() { + return targetFormat; + } + + public long getFrameLength() { + return AudioSystem.NOT_SPECIFIED; // ais.getFrameLength(); + } + + public void mark(int readlimit) { + ais.mark((int) (readlimit * pitch[0])); + mark_ibuffer_index = ibuffer_index; + mark_ibuffer_len = ibuffer_len; + if (mark_ibuffer == null) { + mark_ibuffer = new float[ibuffer.length][ibuffer[0].length]; + } + for (int c = 0; c < ibuffer.length; c++) { + float[] from = ibuffer[c]; + float[] to = mark_ibuffer[c]; + for (int i = 0; i < to.length; i++) { + to[i] = from[i]; + } + } + } + + public boolean markSupported() { + return ais.markSupported(); + } + + private void readNextBuffer() throws IOException { + + if (ibuffer_len == -1) + return; + + for (int c = 0; c < nrofchannels; c++) { + float[] buff = ibuffer[c]; + int buffer_len_pad = ibuffer_len + pad2; + for (int i = ibuffer_len, ix = 0; i < buffer_len_pad; i++, ix++) { + buff[ix] = buff[i]; + } + } + + ibuffer_index -= (ibuffer_len); + + ibuffer_len = ais.read(ibuffer2); + if (ibuffer_len >= 0) { + while (ibuffer_len < ibuffer2.length) { + int ret = ais.read(ibuffer2, ibuffer_len, ibuffer2.length + - ibuffer_len); + if (ret == -1) + break; + ibuffer_len += ret; + } + Arrays.fill(ibuffer2, ibuffer_len, ibuffer2.length, 0); + ibuffer_len /= nrofchannels; + } else { + Arrays.fill(ibuffer2, 0, ibuffer2.length, 0); + } + + int ibuffer2_len = ibuffer2.length; + for (int c = 0; c < nrofchannels; c++) { + float[] buff = ibuffer[c]; + for (int i = c, ix = pad2; i < ibuffer2_len; i += nrofchannels, ix++) { + buff[ix] = ibuffer2[i]; + } + } + + } + + public int read(float[] b, int off, int len) throws IOException { + + if (cbuffer == null || cbuffer[0].length < len / nrofchannels) { + cbuffer = new float[nrofchannels][len / nrofchannels]; + } + if (ibuffer_len == -1) + return -1; + if (len < 0) + return 0; + int remain = len / nrofchannels; + int destPos = 0; + int in_end = ibuffer_len; + while (remain > 0) { + if (ibuffer_len >= 0) { + if (ibuffer_index >= (ibuffer_len + pad)) + readNextBuffer(); + in_end = ibuffer_len + pad; + } + + if (ibuffer_len < 0) { + in_end = pad2; + if (ibuffer_index >= in_end) + break; + } + + if (ibuffer_index < 0) + break; + int preDestPos = destPos; + for (int c = 0; c < nrofchannels; c++) { + ix[0] = ibuffer_index; + ox[0] = destPos; + float[] buff = ibuffer[c]; + resampler.interpolate(buff, ix, in_end, pitch, 0, + cbuffer[c], ox, len / nrofchannels); + } + ibuffer_index = ix[0]; + destPos = ox[0]; + remain -= destPos - preDestPos; + } + for (int c = 0; c < nrofchannels; c++) { + int ix = 0; + float[] buff = cbuffer[c]; + for (int i = c; i < b.length; i += nrofchannels) { + b[i] = buff[ix++]; + } + } + return len - remain * nrofchannels; + } + + public void reset() throws IOException { + ais.reset(); + if (mark_ibuffer == null) + return; + ibuffer_index = mark_ibuffer_index; + ibuffer_len = mark_ibuffer_len; + for (int c = 0; c < ibuffer.length; c++) { + float[] from = mark_ibuffer[c]; + float[] to = ibuffer[c]; + for (int i = 0; i < to.length; i++) { + to[i] = from[i]; + } + } + + } + + public long skip(long len) throws IOException { + if (len > 0) + return 0; + if (skipbuffer == null) + skipbuffer = new float[1024 * targetFormat.getFrameSize()]; + float[] l_skipbuffer = skipbuffer; + long remain = len; + while (remain > 0) { + int ret = read(l_skipbuffer, 0, (int) Math.min(remain, + skipbuffer.length)); + if (ret < 0) { + if (remain == len) + return ret; + break; + } + remain -= ret; + } + return len - remain; + + } + + } + + private class Gain extends FloatControl { + + private Gain() { + + super(FloatControl.Type.MASTER_GAIN, -80f, 6.0206f, 80f / 128.0f, + -1, 0.0f, "dB", "Minimum", "", "Maximum"); + } + + public void setValue(float newValue) { + super.setValue(newValue); + calcVolume(); + } + } + + private class Mute extends BooleanControl { + + private Mute() { + super(BooleanControl.Type.MUTE, false, "True", "False"); + } + + public void setValue(boolean newValue) { + super.setValue(newValue); + calcVolume(); + } + } + + private class ApplyReverb extends BooleanControl { + + private ApplyReverb() { + super(BooleanControl.Type.APPLY_REVERB, false, "True", "False"); + } + + public void setValue(boolean newValue) { + super.setValue(newValue); + calcVolume(); + } + + } + + private class Balance extends FloatControl { + + private Balance() { + super(FloatControl.Type.BALANCE, -1.0f, 1.0f, (1.0f / 128.0f), -1, + 0.0f, "", "Left", "Center", "Right"); + } + + public void setValue(float newValue) { + super.setValue(newValue); + calcVolume(); + } + + } + + private class Pan extends FloatControl { + + private Pan() { + super(FloatControl.Type.PAN, -1.0f, 1.0f, (1.0f / 128.0f), -1, + 0.0f, "", "Left", "Center", "Right"); + } + + public void setValue(float newValue) { + super.setValue(newValue); + balance_control.setValue(newValue); + } + + public float getValue() { + return balance_control.getValue(); + } + + } + + private class ReverbSend extends FloatControl { + + private ReverbSend() { + super(FloatControl.Type.REVERB_SEND, -80f, 6.0206f, 80f / 128.0f, + -1, -80f, "dB", "Minimum", "", "Maximum"); + } + + public void setValue(float newValue) { + super.setValue(newValue); + balance_control.setValue(newValue); + } + + } + + private class ChorusSend extends FloatControl { + + private ChorusSend() { + super(CHORUS_SEND, -80f, 6.0206f, 80f / 128.0f, -1, -80f, "dB", + "Minimum", "", "Maximum"); + } + + public void setValue(float newValue) { + super.setValue(newValue); + balance_control.setValue(newValue); + } + + } + + private Gain gain_control = new Gain(); + + private Mute mute_control = new Mute(); + + private Balance balance_control = new Balance(); + + private Pan pan_control = new Pan(); + + private ReverbSend reverbsend_control = new ReverbSend(); + + private ChorusSend chorussend_control = new ChorusSend(); + + private ApplyReverb apply_reverb = new ApplyReverb(); + + private Control[] controls; + + protected float leftgain = 1; + + protected float rightgain = 1; + + protected float eff1gain = 0; + + protected float eff2gain = 0; + + protected List listeners = new ArrayList(); + + protected Object control_mutex; + + protected SoftMixingMixer mixer; + + protected DataLine.Info info; + + protected abstract void processControlLogic(); + + protected abstract void processAudioLogic(SoftAudioBuffer[] buffers); + + protected SoftMixingDataLine(SoftMixingMixer mixer, DataLine.Info info) { + this.mixer = mixer; + this.info = info; + this.control_mutex = mixer.control_mutex; + + controls = new Control[] { gain_control, mute_control, balance_control, + pan_control, reverbsend_control, chorussend_control, + apply_reverb }; + calcVolume(); + } + + protected void calcVolume() { + synchronized (control_mutex) { + double gain = Math.pow(10.0, gain_control.getValue() / 20.0); + if (mute_control.getValue()) + gain = 0; + leftgain = (float) gain; + rightgain = (float) gain; + if (mixer.getFormat().getChannels() > 1) { + // -1 = Left, 0 Center, 1 = Right + double balance = balance_control.getValue(); + if (balance > 0) + leftgain *= (1 - balance); + else + rightgain *= (1 + balance); + + } + } + + eff1gain = (float) Math.pow(10.0, reverbsend_control.getValue() / 20.0); + eff2gain = (float) Math.pow(10.0, chorussend_control.getValue() / 20.0); + + if (!apply_reverb.getValue()) { + eff1gain = 0; + } + } + + protected void sendEvent(LineEvent event) { + if (listeners.size() == 0) + return; + LineListener[] listener_array = listeners + .toArray(new LineListener[listeners.size()]); + for (LineListener listener : listener_array) { + listener.update(event); + } + } + + public void addLineListener(LineListener listener) { + synchronized (control_mutex) { + listeners.add(listener); + } + } + + public void removeLineListener(LineListener listener) { + synchronized (control_mutex) { + listeners.add(listener); + } + } + + public javax.sound.sampled.Line.Info getLineInfo() { + return info; + } + + public Control getControl(Type control) { + if (control != null) { + for (int i = 0; i < controls.length; i++) { + if (controls[i].getType() == control) { + return controls[i]; + } + } + } + throw new IllegalArgumentException("Unsupported control type : " + + control); + } + + public Control[] getControls() { + return controls; + } + + public boolean isControlSupported(Type control) { + if (control != null) { + for (int i = 0; i < controls.length; i++) { + if (controls[i].getType() == control) { + return true; + } + } + } + return false; + } + +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftMixingMainMixer.java b/jdk/src/share/classes/com/sun/media/sound/SoftMixingMainMixer.java new file mode 100644 index 00000000000..e016d3f4b40 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftMixingMainMixer.java @@ -0,0 +1,259 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; + +/** + * Main mixer for SoftMixingMixer. + * + * @author Karl Helgason + */ +public class SoftMixingMainMixer { + + public final static int CHANNEL_LEFT = 0; + + public final static int CHANNEL_RIGHT = 1; + + public final static int CHANNEL_EFFECT1 = 2; + + public final static int CHANNEL_EFFECT2 = 3; + + public final static int CHANNEL_EFFECT3 = 4; + + public final static int CHANNEL_EFFECT4 = 5; + + public final static int CHANNEL_LEFT_DRY = 10; + + public final static int CHANNEL_RIGHT_DRY = 11; + + public final static int CHANNEL_SCRATCH1 = 12; + + public final static int CHANNEL_SCRATCH2 = 13; + + public final static int CHANNEL_CHANNELMIXER_LEFT = 14; + + public final static int CHANNEL_CHANNELMIXER_RIGHT = 15; + + private SoftMixingMixer mixer; + + private AudioInputStream ais; + + private SoftAudioBuffer[] buffers; + + private SoftAudioProcessor reverb; + + private SoftAudioProcessor chorus; + + private SoftAudioProcessor agc; + + private int nrofchannels; + + private Object control_mutex; + + private List openLinesList = new ArrayList(); + + private SoftMixingDataLine[] openLines = new SoftMixingDataLine[0]; + + public AudioInputStream getInputStream() { + return ais; + } + + protected void processAudioBuffers() { + for (int i = 0; i < buffers.length; i++) { + buffers[i].clear(); + } + + SoftMixingDataLine[] openLines; + synchronized (control_mutex) { + openLines = this.openLines; + for (int i = 0; i < openLines.length; i++) { + openLines[i].processControlLogic(); + } + chorus.processControlLogic(); + reverb.processControlLogic(); + agc.processControlLogic(); + } + for (int i = 0; i < openLines.length; i++) { + openLines[i].processAudioLogic(buffers); + } + + chorus.processAudio(); + reverb.processAudio(); + + agc.processAudio(); + + } + + public SoftMixingMainMixer(SoftMixingMixer mixer) { + this.mixer = mixer; + + nrofchannels = mixer.getFormat().getChannels(); + + int buffersize = (int) (mixer.getFormat().getSampleRate() / mixer + .getControlRate()); + + control_mutex = mixer.control_mutex; + buffers = new SoftAudioBuffer[16]; + for (int i = 0; i < buffers.length; i++) { + buffers[i] = new SoftAudioBuffer(buffersize, mixer.getFormat()); + + } + + reverb = new SoftReverb(); + chorus = new SoftChorus(); + agc = new SoftLimiter(); + + float samplerate = mixer.getFormat().getSampleRate(); + float controlrate = mixer.getControlRate(); + reverb.init(samplerate, controlrate); + chorus.init(samplerate, controlrate); + agc.init(samplerate, controlrate); + + reverb.setMixMode(true); + chorus.setMixMode(true); + agc.setMixMode(false); + + chorus.setInput(0, buffers[CHANNEL_EFFECT2]); + chorus.setOutput(0, buffers[CHANNEL_LEFT]); + if (nrofchannels != 1) + chorus.setOutput(1, buffers[CHANNEL_RIGHT]); + chorus.setOutput(2, buffers[CHANNEL_EFFECT1]); + + reverb.setInput(0, buffers[CHANNEL_EFFECT1]); + reverb.setOutput(0, buffers[CHANNEL_LEFT]); + if (nrofchannels != 1) + reverb.setOutput(1, buffers[CHANNEL_RIGHT]); + + agc.setInput(0, buffers[CHANNEL_LEFT]); + if (nrofchannels != 1) + agc.setInput(1, buffers[CHANNEL_RIGHT]); + agc.setOutput(0, buffers[CHANNEL_LEFT]); + if (nrofchannels != 1) + agc.setOutput(1, buffers[CHANNEL_RIGHT]); + + InputStream in = new InputStream() { + + private SoftAudioBuffer[] buffers = SoftMixingMainMixer.this.buffers; + + private int nrofchannels = SoftMixingMainMixer.this.mixer + .getFormat().getChannels(); + + private int buffersize = buffers[0].getSize(); + + private byte[] bbuffer = new byte[buffersize + * (SoftMixingMainMixer.this.mixer.getFormat() + .getSampleSizeInBits() / 8) * nrofchannels]; + + private int bbuffer_pos = 0; + + private byte[] single = new byte[1]; + + public void fillBuffer() { + processAudioBuffers(); + for (int i = 0; i < nrofchannels; i++) + buffers[i].get(bbuffer, i); + bbuffer_pos = 0; + } + + public int read(byte[] b, int off, int len) { + int bbuffer_len = bbuffer.length; + int offlen = off + len; + byte[] bbuffer = this.bbuffer; + while (off < offlen) + if (available() == 0) + fillBuffer(); + else { + int bbuffer_pos = this.bbuffer_pos; + while (off < offlen && bbuffer_pos < bbuffer_len) + b[off++] = bbuffer[bbuffer_pos++]; + this.bbuffer_pos = bbuffer_pos; + } + return len; + } + + public int read() throws IOException { + int ret = read(single); + if (ret == -1) + return -1; + return single[0] & 0xFF; + } + + public int available() { + return bbuffer.length - bbuffer_pos; + } + + public void close() { + SoftMixingMainMixer.this.mixer.close(); + } + + }; + + ais = new AudioInputStream(in, mixer.getFormat(), + AudioSystem.NOT_SPECIFIED); + + } + + public void openLine(SoftMixingDataLine line) { + synchronized (control_mutex) { + openLinesList.add(line); + openLines = openLinesList + .toArray(new SoftMixingDataLine[openLinesList.size()]); + } + } + + public void closeLine(SoftMixingDataLine line) { + synchronized (control_mutex) { + openLinesList.remove(line); + openLines = openLinesList + .toArray(new SoftMixingDataLine[openLinesList.size()]); + if (openLines.length == 0) + if (mixer.implicitOpen) + mixer.close(); + } + + } + + public SoftMixingDataLine[] getOpenLines() { + synchronized (control_mutex) { + return openLines; + } + + } + + public void close() { + SoftMixingDataLine[] openLines = this.openLines; + for (int i = 0; i < openLines.length; i++) { + openLines[i].close(); + } + } + +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftMixingMixer.java b/jdk/src/share/classes/com/sun/media/sound/SoftMixingMixer.java new file mode 100644 index 00000000000..6419109c402 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftMixingMixer.java @@ -0,0 +1,529 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.Clip; +import javax.sound.sampled.Control; +import javax.sound.sampled.DataLine; +import javax.sound.sampled.Line; +import javax.sound.sampled.LineEvent; +import javax.sound.sampled.LineListener; +import javax.sound.sampled.LineUnavailableException; +import javax.sound.sampled.Mixer; +import javax.sound.sampled.SourceDataLine; +import javax.sound.sampled.AudioFormat.Encoding; +import javax.sound.sampled.Control.Type; + +/** + * Software audio mixer + * + * @author Karl Helgason + */ +public class SoftMixingMixer implements Mixer { + + private static class Info extends Mixer.Info { + public Info() { + super(INFO_NAME, INFO_VENDOR, INFO_DESCRIPTION, INFO_VERSION); + } + } + + protected static final String INFO_NAME = "Gervill Sound Mixer"; + + protected static final String INFO_VENDOR = "OpenJDK Proposal"; + + protected static final String INFO_DESCRIPTION = "Software Sound Mixer"; + + protected static final String INFO_VERSION = "1.0"; + + protected final static Mixer.Info info = new Info(); + + protected Object control_mutex = this; + + protected boolean implicitOpen = false; + + private boolean open = false; + + private SoftMixingMainMixer mainmixer = null; + + private AudioFormat format = new AudioFormat(44100, 16, 2, true, false); + + private SourceDataLine sourceDataLine = null; + + private SoftAudioPusher pusher = null; + + private AudioInputStream pusher_stream = null; + + private float controlrate = 147f; + + private long latency = 100000; // 100 msec + + private boolean jitter_correction = false; + + private List listeners = new ArrayList(); + + private javax.sound.sampled.Line.Info[] sourceLineInfo; + + public SoftMixingMixer() { + + sourceLineInfo = new javax.sound.sampled.Line.Info[2]; + + ArrayList formats = new ArrayList(); + for (int channels = 1; channels <= 2; channels++) { + formats.add(new AudioFormat(Encoding.PCM_SIGNED, + AudioSystem.NOT_SPECIFIED, 8, channels, channels, + AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(Encoding.PCM_UNSIGNED, + AudioSystem.NOT_SPECIFIED, 8, channels, channels, + AudioSystem.NOT_SPECIFIED, false)); + for (int bits = 16; bits < 32; bits += 8) { + formats.add(new AudioFormat(Encoding.PCM_SIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(Encoding.PCM_UNSIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(Encoding.PCM_SIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, true)); + formats.add(new AudioFormat(Encoding.PCM_UNSIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, true)); + } + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 32, channels, channels * 4, + AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 32, channels, channels * 4, + AudioSystem.NOT_SPECIFIED, true)); + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 64, channels, channels * 8, + AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 64, channels, channels * 8, + AudioSystem.NOT_SPECIFIED, true)); + } + AudioFormat[] formats_array = formats.toArray(new AudioFormat[formats + .size()]); + sourceLineInfo[0] = new DataLine.Info(SourceDataLine.class, + formats_array, AudioSystem.NOT_SPECIFIED, + AudioSystem.NOT_SPECIFIED); + sourceLineInfo[1] = new DataLine.Info(Clip.class, formats_array, + AudioSystem.NOT_SPECIFIED, AudioSystem.NOT_SPECIFIED); + } + + public Line getLine(Line.Info info) throws LineUnavailableException { + + if (!isLineSupported(info)) + throw new IllegalArgumentException("Line unsupported: " + info); + + if ((info.getLineClass() == SourceDataLine.class)) { + return new SoftMixingSourceDataLine(this, (DataLine.Info) info); + } + if ((info.getLineClass() == Clip.class)) { + return new SoftMixingClip(this, (DataLine.Info) info); + } + + throw new IllegalArgumentException("Line unsupported: " + info); + } + + public int getMaxLines(Line.Info info) { + if (info.getLineClass() == SourceDataLine.class) + return AudioSystem.NOT_SPECIFIED; + if (info.getLineClass() == Clip.class) + return AudioSystem.NOT_SPECIFIED; + return 0; + } + + public javax.sound.sampled.Mixer.Info getMixerInfo() { + return info; + } + + public javax.sound.sampled.Line.Info[] getSourceLineInfo() { + Line.Info[] localArray = new Line.Info[sourceLineInfo.length]; + System.arraycopy(sourceLineInfo, 0, localArray, 0, + sourceLineInfo.length); + return localArray; + } + + public javax.sound.sampled.Line.Info[] getSourceLineInfo( + javax.sound.sampled.Line.Info info) { + int i; + ArrayList infos = new ArrayList(); + + for (i = 0; i < sourceLineInfo.length; i++) { + if (info.matches(sourceLineInfo[i])) { + infos.add(sourceLineInfo[i]); + } + } + return infos.toArray(new Line.Info[infos.size()]); + } + + public Line[] getSourceLines() { + + Line[] localLines; + + synchronized (control_mutex) { + + if (mainmixer == null) + return new Line[0]; + SoftMixingDataLine[] sourceLines = mainmixer.getOpenLines(); + + localLines = new Line[sourceLines.length]; + + for (int i = 0; i < localLines.length; i++) { + localLines[i] = sourceLines[i]; + } + } + + return localLines; + } + + public javax.sound.sampled.Line.Info[] getTargetLineInfo() { + return new javax.sound.sampled.Line.Info[0]; + } + + public javax.sound.sampled.Line.Info[] getTargetLineInfo( + javax.sound.sampled.Line.Info info) { + return new javax.sound.sampled.Line.Info[0]; + } + + public Line[] getTargetLines() { + return new Line[0]; + } + + public boolean isLineSupported(javax.sound.sampled.Line.Info info) { + if (info != null) { + for (int i = 0; i < sourceLineInfo.length; i++) { + if (info.matches(sourceLineInfo[i])) { + return true; + } + } + } + return false; + } + + public boolean isSynchronizationSupported(Line[] lines, boolean maintainSync) { + return false; + } + + public void synchronize(Line[] lines, boolean maintainSync) { + throw new IllegalArgumentException( + "Synchronization not supported by this mixer."); + } + + public void unsynchronize(Line[] lines) { + throw new IllegalArgumentException( + "Synchronization not supported by this mixer."); + } + + public void addLineListener(LineListener listener) { + synchronized (control_mutex) { + listeners.add(listener); + } + } + + private void sendEvent(LineEvent event) { + if (listeners.size() == 0) + return; + LineListener[] listener_array = listeners + .toArray(new LineListener[listeners.size()]); + for (LineListener listener : listener_array) { + listener.update(event); + } + } + + public void close() { + if (!isOpen()) + return; + + sendEvent(new LineEvent(this, LineEvent.Type.CLOSE, + AudioSystem.NOT_SPECIFIED)); + + SoftAudioPusher pusher_to_be_closed = null; + AudioInputStream pusher_stream_to_be_closed = null; + synchronized (control_mutex) { + if (pusher != null) { + pusher_to_be_closed = pusher; + pusher_stream_to_be_closed = pusher_stream; + pusher = null; + pusher_stream = null; + } + } + + if (pusher_to_be_closed != null) { + // Pusher must not be closed synchronized against control_mutex + // this may result in synchronized conflict between pusher and + // current thread. + pusher_to_be_closed.stop(); + + try { + pusher_stream_to_be_closed.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + synchronized (control_mutex) { + + if (mainmixer != null) + mainmixer.close(); + open = false; + + if (sourceDataLine != null) { + sourceDataLine.drain(); + sourceDataLine.close(); + sourceDataLine = null; + } + + } + + } + + public Control getControl(Type control) { + throw new IllegalArgumentException("Unsupported control type : " + + control); + } + + public Control[] getControls() { + return new Control[0]; + } + + public javax.sound.sampled.Line.Info getLineInfo() { + return new Line.Info(Mixer.class); + } + + public boolean isControlSupported(Type control) { + return false; + } + + public boolean isOpen() { + synchronized (control_mutex) { + return open; + } + } + + public void open() throws LineUnavailableException { + if (isOpen()) { + implicitOpen = false; + return; + } + open(null); + } + + public void open(SourceDataLine line) throws LineUnavailableException { + if (isOpen()) { + implicitOpen = false; + return; + } + synchronized (control_mutex) { + + try { + + if (line != null) + format = line.getFormat(); + + AudioInputStream ais = openStream(getFormat()); + + if (line == null) { + synchronized (SoftMixingMixerProvider.mutex) { + SoftMixingMixerProvider.lockthread = Thread + .currentThread(); + } + + try { + Mixer defaultmixer = AudioSystem.getMixer(null); + if (defaultmixer != null) + { + // Search for suitable line + + DataLine.Info idealinfo = null; + AudioFormat idealformat = null; + + Line.Info[] lineinfos = defaultmixer.getSourceLineInfo(); + idealFound: + for (int i = 0; i < lineinfos.length; i++) { + if(lineinfos[i].getLineClass() == SourceDataLine.class) + { + DataLine.Info info = (DataLine.Info)lineinfos[i]; + AudioFormat[] formats = info.getFormats(); + for (int j = 0; j < formats.length; j++) { + AudioFormat format = formats[j]; + if(format.getChannels() == 2 || + format.getChannels() == AudioSystem.NOT_SPECIFIED) + if(format.getEncoding().equals(Encoding.PCM_SIGNED) || + format.getEncoding().equals(Encoding.PCM_UNSIGNED)) + if(format.getSampleRate() == AudioSystem.NOT_SPECIFIED || + format.getSampleRate() == 48000.0) + if(format.getSampleSizeInBits() == AudioSystem.NOT_SPECIFIED || + format.getSampleSizeInBits() == 16) + { + idealinfo = info; + int ideal_channels = format.getChannels(); + boolean ideal_signed = format.getEncoding().equals(Encoding.PCM_SIGNED); + float ideal_rate = format.getSampleRate(); + boolean ideal_endian = format.isBigEndian(); + int ideal_bits = format.getSampleSizeInBits(); + if(ideal_bits == AudioSystem.NOT_SPECIFIED) ideal_bits = 16; + if(ideal_channels == AudioSystem.NOT_SPECIFIED) ideal_channels = 2; + if(ideal_rate == AudioSystem.NOT_SPECIFIED) ideal_rate = 48000; + idealformat = new AudioFormat(ideal_rate, ideal_bits, + ideal_channels, ideal_signed, ideal_endian); + break idealFound; + } + } + } + } + + if(idealformat != null) + { + format = idealformat; + line = (SourceDataLine) defaultmixer.getLine(idealinfo); + } + } + + if(line == null) + line = AudioSystem.getSourceDataLine(format); + } finally { + synchronized (SoftMixingMixerProvider.mutex) { + SoftMixingMixerProvider.lockthread = null; + } + } + + if (line == null) + throw new IllegalArgumentException("No line matching " + + info.toString() + " is supported."); + } + + double latency = this.latency; + + if (!line.isOpen()) { + int bufferSize = getFormat().getFrameSize() + * (int) (getFormat().getFrameRate() * (latency / 1000000f)); + line.open(getFormat(), bufferSize); + + // Remember that we opened that line + // so we can close again in SoftSynthesizer.close() + sourceDataLine = line; + } + if (!line.isActive()) + line.start(); + + int controlbuffersize = 512; + try { + controlbuffersize = ais.available(); + } catch (IOException e) { + } + + // Tell mixer not fill read buffers fully. + // This lowers latency, and tells DataPusher + // to read in smaller amounts. + // mainmixer.readfully = false; + // pusher = new DataPusher(line, ais); + + int buffersize = line.getBufferSize(); + buffersize -= buffersize % controlbuffersize; + + if (buffersize < 3 * controlbuffersize) + buffersize = 3 * controlbuffersize; + + if (jitter_correction) { + ais = new SoftJitterCorrector(ais, buffersize, + controlbuffersize); + } + pusher = new SoftAudioPusher(line, ais, controlbuffersize); + pusher_stream = ais; + pusher.start(); + + } catch (LineUnavailableException e) { + if (isOpen()) + close(); + throw new LineUnavailableException(e.toString()); + } + + } + } + + public AudioInputStream openStream(AudioFormat targetFormat) + throws LineUnavailableException { + + if (isOpen()) + throw new LineUnavailableException("Mixer is already open"); + + synchronized (control_mutex) { + + open = true; + + implicitOpen = false; + + if (targetFormat != null) + format = targetFormat; + + mainmixer = new SoftMixingMainMixer(this); + + sendEvent(new LineEvent(this, LineEvent.Type.OPEN, + AudioSystem.NOT_SPECIFIED)); + + return mainmixer.getInputStream(); + + } + + } + + public void removeLineListener(LineListener listener) { + synchronized (control_mutex) { + listeners.remove(listener); + } + } + + public long getLatency() { + synchronized (control_mutex) { + return latency; + } + } + + public AudioFormat getFormat() { + synchronized (control_mutex) { + return format; + } + } + + protected float getControlRate() { + return controlrate; + } + + protected SoftMixingMainMixer getMainMixer() { + if (!isOpen()) + return null; + return mainmixer; + } + +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftMixingMixerProvider.java b/jdk/src/share/classes/com/sun/media/sound/SoftMixingMixerProvider.java new file mode 100644 index 00000000000..8c805a707ac --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftMixingMixerProvider.java @@ -0,0 +1,66 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import javax.sound.sampled.Mixer; +import javax.sound.sampled.Mixer.Info; +import javax.sound.sampled.spi.MixerProvider; + +/** + * Provider for software audio mixer + * + * @author Karl Helgason + */ +public class SoftMixingMixerProvider extends MixerProvider { + + static SoftMixingMixer globalmixer = null; + + static Thread lockthread = null; + + protected final static Object mutex = new Object(); + + public Mixer getMixer(Info info) { + if (!(info == null || info == SoftMixingMixer.info)) { + throw new IllegalArgumentException("Mixer " + info.toString() + + " not supported by this provider."); + } + synchronized (mutex) { + if (lockthread != null) + if (Thread.currentThread() == lockthread) + throw new IllegalArgumentException("Mixer " + + info.toString() + + " not supported by this provider."); + if (globalmixer == null) + globalmixer = new SoftMixingMixer(); + return globalmixer; + } + + } + + public Info[] getMixerInfo() { + return new Info[] { SoftMixingMixer.info }; + } + +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftMixingSourceDataLine.java b/jdk/src/share/classes/com/sun/media/sound/SoftMixingSourceDataLine.java new file mode 100644 index 00000000000..c59fa0ad5fb --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftMixingSourceDataLine.java @@ -0,0 +1,519 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; + +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.DataLine; +import javax.sound.sampled.LineEvent; +import javax.sound.sampled.LineUnavailableException; +import javax.sound.sampled.SourceDataLine; + +/** + * SourceDataLine implemention for the SoftMixingMixer. + * + * @author Karl Helgason + */ +public class SoftMixingSourceDataLine extends SoftMixingDataLine implements + SourceDataLine { + + private boolean open = false; + + private AudioFormat format = new AudioFormat(44100.0f, 16, 2, true, false); + + private int framesize; + + private int bufferSize = -1; + + private float[] readbuffer; + + private boolean active = false; + + private byte[] cycling_buffer; + + private int cycling_read_pos = 0; + + private int cycling_write_pos = 0; + + private int cycling_avail = 0; + + private long cycling_framepos = 0; + + private AudioFloatInputStream afis; + + private static class NonBlockingFloatInputStream extends + AudioFloatInputStream { + AudioFloatInputStream ais; + + public NonBlockingFloatInputStream(AudioFloatInputStream ais) { + this.ais = ais; + } + + public int available() throws IOException { + return ais.available(); + } + + public void close() throws IOException { + ais.close(); + } + + public AudioFormat getFormat() { + return ais.getFormat(); + } + + public long getFrameLength() { + return ais.getFrameLength(); + } + + public void mark(int readlimit) { + ais.mark(readlimit); + } + + public boolean markSupported() { + return ais.markSupported(); + } + + public int read(float[] b, int off, int len) throws IOException { + int avail = available(); + if (len > avail) { + int ret = ais.read(b, off, avail); + Arrays.fill(b, off + ret, off + len, 0); + return len; + } + return ais.read(b, off, len); + } + + public void reset() throws IOException { + ais.reset(); + } + + public long skip(long len) throws IOException { + return ais.skip(len); + } + + } + + protected SoftMixingSourceDataLine(SoftMixingMixer mixer, DataLine.Info info) { + super(mixer, info); + } + + public int write(byte[] b, int off, int len) { + if (!isOpen()) + return 0; + if (len % framesize != 0) + throw new IllegalArgumentException( + "Number of bytes does not represent an integral number of sample frames."); + + byte[] buff = cycling_buffer; + int buff_len = cycling_buffer.length; + + int l = 0; + while (l != len) { + int avail; + synchronized (cycling_buffer) { + int pos = cycling_write_pos; + avail = cycling_avail; + while (l != len) { + if (avail == buff_len) + break; + buff[pos++] = b[off++]; + l++; + avail++; + if (pos == buff_len) + pos = 0; + } + cycling_avail = avail; + cycling_write_pos = pos; + if (l == len) + return l; + } + if (avail == buff_len) { + try { + Thread.sleep(1); + } catch (InterruptedException e) { + return l; + } + if (!isRunning()) + return l; + } + } + + return l; + } + + // + // BooleanControl.Type.APPLY_REVERB + // BooleanControl.Type.MUTE + // EnumControl.Type.REVERB + // + // FloatControl.Type.SAMPLE_RATE + // FloatControl.Type.REVERB_SEND + // FloatControl.Type.VOLUME + // FloatControl.Type.PAN + // FloatControl.Type.MASTER_GAIN + // FloatControl.Type.BALANCE + + private boolean _active = false; + + private AudioFormat outputformat; + + private int out_nrofchannels; + + private int in_nrofchannels; + + private float _rightgain; + + private float _leftgain; + + private float _eff1gain; + + private float _eff2gain; + + protected void processControlLogic() { + _active = active; + _rightgain = rightgain; + _leftgain = leftgain; + _eff1gain = eff1gain; + _eff2gain = eff2gain; + } + + protected void processAudioLogic(SoftAudioBuffer[] buffers) { + if (_active) { + float[] left = buffers[SoftMixingMainMixer.CHANNEL_LEFT].array(); + float[] right = buffers[SoftMixingMainMixer.CHANNEL_RIGHT].array(); + int bufferlen = buffers[SoftMixingMainMixer.CHANNEL_LEFT].getSize(); + + int readlen = bufferlen * in_nrofchannels; + if (readbuffer == null || readbuffer.length < readlen) { + readbuffer = new float[readlen]; + } + int ret = 0; + try { + ret = afis.read(readbuffer); + if (ret != in_nrofchannels) + Arrays.fill(readbuffer, ret, readlen, 0); + } catch (IOException e) { + } + + int in_c = in_nrofchannels; + for (int i = 0, ix = 0; i < bufferlen; i++, ix += in_c) { + left[i] += readbuffer[ix] * _leftgain; + } + if (out_nrofchannels != 1) { + if (in_nrofchannels == 1) { + for (int i = 0, ix = 0; i < bufferlen; i++, ix += in_c) { + right[i] += readbuffer[ix] * _rightgain; + } + } else { + for (int i = 0, ix = 1; i < bufferlen; i++, ix += in_c) { + right[i] += readbuffer[ix] * _rightgain; + } + } + + } + + if (_eff1gain > 0.0001) { + float[] eff1 = buffers[SoftMixingMainMixer.CHANNEL_EFFECT1] + .array(); + for (int i = 0, ix = 0; i < bufferlen; i++, ix += in_c) { + eff1[i] += readbuffer[ix] * _eff1gain; + } + if (in_nrofchannels == 2) { + for (int i = 0, ix = 1; i < bufferlen; i++, ix += in_c) { + eff1[i] += readbuffer[ix] * _eff1gain; + } + } + } + + if (_eff2gain > 0.0001) { + float[] eff2 = buffers[SoftMixingMainMixer.CHANNEL_EFFECT2] + .array(); + for (int i = 0, ix = 0; i < bufferlen; i++, ix += in_c) { + eff2[i] += readbuffer[ix] * _eff2gain; + } + if (in_nrofchannels == 2) { + for (int i = 0, ix = 1; i < bufferlen; i++, ix += in_c) { + eff2[i] += readbuffer[ix] * _eff2gain; + } + } + } + + } + } + + public void open() throws LineUnavailableException { + open(format); + } + + public void open(AudioFormat format) throws LineUnavailableException { + if (bufferSize == -1) + bufferSize = ((int) (format.getFrameRate() / 2)) + * format.getFrameSize(); + open(format, bufferSize); + } + + public void open(AudioFormat format, int bufferSize) + throws LineUnavailableException { + + LineEvent event = null; + + if (bufferSize < format.getFrameSize() * 32) + bufferSize = format.getFrameSize() * 32; + + synchronized (control_mutex) { + + if (!isOpen()) { + if (!mixer.isOpen()) { + mixer.open(); + mixer.implicitOpen = true; + } + + event = new LineEvent(this, LineEvent.Type.OPEN, 0); + + this.bufferSize = bufferSize - bufferSize + % format.getFrameSize(); + this.format = format; + this.framesize = format.getFrameSize(); + this.outputformat = mixer.getFormat(); + out_nrofchannels = outputformat.getChannels(); + in_nrofchannels = format.getChannels(); + + open = true; + + mixer.getMainMixer().openLine(this); + + cycling_buffer = new byte[framesize * bufferSize]; + cycling_read_pos = 0; + cycling_write_pos = 0; + cycling_avail = 0; + cycling_framepos = 0; + + InputStream cycling_inputstream = new InputStream() { + + public int read() throws IOException { + byte[] b = new byte[1]; + int ret = read(b); + if (ret < 0) + return ret; + return b[0] & 0xFF; + } + + public int available() throws IOException { + synchronized (cycling_buffer) { + return cycling_avail; + } + } + + public int read(byte[] b, int off, int len) + throws IOException { + + synchronized (cycling_buffer) { + if (len > cycling_avail) + len = cycling_avail; + int pos = cycling_read_pos; + byte[] buff = cycling_buffer; + int buff_len = buff.length; + for (int i = 0; i < len; i++) { + b[off++] = buff[pos]; + pos++; + if (pos == buff_len) + pos = 0; + } + cycling_read_pos = pos; + cycling_avail -= len; + cycling_framepos += len / framesize; + } + return len; + } + + }; + + afis = AudioFloatInputStream + .getInputStream(new AudioInputStream( + cycling_inputstream, format, + AudioSystem.NOT_SPECIFIED)); + afis = new NonBlockingFloatInputStream(afis); + + if (Math.abs(format.getSampleRate() + - outputformat.getSampleRate()) > 0.000001) + afis = new AudioFloatInputStreamResampler(afis, + outputformat); + + } else { + if (!format.matches(getFormat())) { + throw new IllegalStateException( + "Line is already open with format " + getFormat() + + " and bufferSize " + getBufferSize()); + } + } + + } + + if (event != null) + sendEvent(event); + + } + + public int available() { + synchronized (cycling_buffer) { + return cycling_buffer.length - cycling_avail; + } + } + + public void drain() { + while (true) { + int avail; + synchronized (cycling_buffer) { + avail = cycling_avail; + } + if (avail != 0) + return; + try { + Thread.sleep(1); + } catch (InterruptedException e) { + return; + } + } + } + + public void flush() { + synchronized (cycling_buffer) { + cycling_read_pos = 0; + cycling_write_pos = 0; + cycling_avail = 0; + } + } + + public int getBufferSize() { + synchronized (control_mutex) { + return bufferSize; + } + } + + public AudioFormat getFormat() { + synchronized (control_mutex) { + return format; + } + } + + public int getFramePosition() { + return (int) getLongFramePosition(); + } + + public float getLevel() { + return AudioSystem.NOT_SPECIFIED; + } + + public long getLongFramePosition() { + synchronized (cycling_buffer) { + return cycling_framepos; + } + } + + public long getMicrosecondPosition() { + return (long) (getLongFramePosition() * (1000000.0 / (double) getFormat() + .getSampleRate())); + } + + public boolean isActive() { + synchronized (control_mutex) { + return active; + } + } + + public boolean isRunning() { + synchronized (control_mutex) { + return active; + } + } + + public void start() { + + LineEvent event = null; + + synchronized (control_mutex) { + if (isOpen()) { + if (active) + return; + active = true; + event = new LineEvent(this, LineEvent.Type.START, + getLongFramePosition()); + } + } + + if (event != null) + sendEvent(event); + } + + public void stop() { + LineEvent event = null; + + synchronized (control_mutex) { + if (isOpen()) { + if (!active) + return; + active = false; + event = new LineEvent(this, LineEvent.Type.STOP, + getLongFramePosition()); + } + } + + if (event != null) + sendEvent(event); + } + + public void close() { + + LineEvent event = null; + + synchronized (control_mutex) { + if (!isOpen()) + return; + stop(); + + event = new LineEvent(this, LineEvent.Type.CLOSE, + getLongFramePosition()); + + open = false; + mixer.getMainMixer().closeLine(this); + } + + if (event != null) + sendEvent(event); + + } + + public boolean isOpen() { + synchronized (control_mutex) { + return open; + } + } + +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftPerformer.java b/jdk/src/share/classes/com/sun/media/sound/SoftPerformer.java new file mode 100644 index 00000000000..97024f29ad3 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftPerformer.java @@ -0,0 +1,775 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * This class decodes information from ModelPeformer for use in SoftVoice. + * It also adds default connections if they where missing in ModelPerformer. + * + * @author Karl Helgason + */ +public class SoftPerformer { + + static ModelConnectionBlock[] defaultconnections + = new ModelConnectionBlock[42]; + + static { + int o = 0; + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("noteon", "on", 0), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 1, new ModelDestination(new ModelIdentifier("eg", "on", 0))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("noteon", "on", 0), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 1, new ModelDestination(new ModelIdentifier("eg", "on", 1))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("eg", "active", 0), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 1, new ModelDestination(new ModelIdentifier("mixer", "active", 0))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("eg", 0), + ModelStandardTransform.DIRECTION_MAX2MIN, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + -960, new ModelDestination(new ModelIdentifier("mixer", "gain"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("noteon", "velocity"), + ModelStandardTransform.DIRECTION_MAX2MIN, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_CONCAVE), + -960, new ModelDestination(new ModelIdentifier("mixer", "gain"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi", "pitch"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + new ModelSource(new ModelIdentifier("midi_rpn", "0"), + new ModelTransform() { + public double transform(double value) { + int v = (int) (value * 16384.0); + int msb = v >> 7; + int lsb = v & 127; + return msb * 100 + lsb; + } + }), + new ModelDestination(new ModelIdentifier("osc", "pitch"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("noteon", "keynumber"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 12800, new ModelDestination(new ModelIdentifier("osc", "pitch"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi_cc", "7"), + ModelStandardTransform.DIRECTION_MAX2MIN, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_CONCAVE), + -960, new ModelDestination(new ModelIdentifier("mixer", "gain"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi_cc", "8"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 1000, new ModelDestination(new ModelIdentifier("mixer", "balance"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi_cc", "10"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 1000, new ModelDestination(new ModelIdentifier("mixer", "pan"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi_cc", "11"), + ModelStandardTransform.DIRECTION_MAX2MIN, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_CONCAVE), + -960, new ModelDestination(new ModelIdentifier("mixer", "gain"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi_cc", "91"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 1000, new ModelDestination(new ModelIdentifier("mixer", "reverb"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi_cc", "93"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 1000, new ModelDestination(new ModelIdentifier("mixer", "chorus"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi_cc", "71"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 200, new ModelDestination(new ModelIdentifier("filter", "q"))); + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi_cc", "74"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 9600, new ModelDestination(new ModelIdentifier("filter", "freq"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi_cc", "72"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 6000, new ModelDestination(new ModelIdentifier("eg", "release2"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi_cc", "73"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 2000, new ModelDestination(new ModelIdentifier("eg", "attack2"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi_cc", "75"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 6000, new ModelDestination(new ModelIdentifier("eg", "decay2"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi_cc", "67"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_SWITCH), + -50, new ModelDestination(ModelDestination.DESTINATION_GAIN)); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi_cc", "67"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_SWITCH), + -2400, new ModelDestination(ModelDestination.DESTINATION_FILTER_FREQ)); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi_rpn", "1"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 100, new ModelDestination(new ModelIdentifier("osc", "pitch"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("midi_rpn", "2"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 12800, new ModelDestination(new ModelIdentifier("osc", "pitch"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("master", "fine_tuning"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 100, new ModelDestination(new ModelIdentifier("osc", "pitch"))); + + defaultconnections[o++] = new ModelConnectionBlock( + new ModelSource( + new ModelIdentifier("master", "coarse_tuning"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 12800, new ModelDestination(new ModelIdentifier("osc", "pitch"))); + + defaultconnections[o++] = new ModelConnectionBlock(13500, + new ModelDestination(new ModelIdentifier("filter", "freq", 0))); + + defaultconnections[o++] = new ModelConnectionBlock( + Float.NEGATIVE_INFINITY, new ModelDestination( + new ModelIdentifier("eg", "delay", 0))); + defaultconnections[o++] = new ModelConnectionBlock( + Float.NEGATIVE_INFINITY, new ModelDestination( + new ModelIdentifier("eg", "attack", 0))); + defaultconnections[o++] = new ModelConnectionBlock( + Float.NEGATIVE_INFINITY, new ModelDestination( + new ModelIdentifier("eg", "hold", 0))); + defaultconnections[o++] = new ModelConnectionBlock( + Float.NEGATIVE_INFINITY, new ModelDestination( + new ModelIdentifier("eg", "decay", 0))); + defaultconnections[o++] = new ModelConnectionBlock(1000, + new ModelDestination(new ModelIdentifier("eg", "sustain", 0))); + defaultconnections[o++] = new ModelConnectionBlock( + Float.NEGATIVE_INFINITY, new ModelDestination( + new ModelIdentifier("eg", "release", 0))); + defaultconnections[o++] = new ModelConnectionBlock(1200.0 + * Math.log(0.015) / Math.log(2), new ModelDestination( + new ModelIdentifier("eg", "shutdown", 0))); // 15 msec default + + defaultconnections[o++] = new ModelConnectionBlock( + Float.NEGATIVE_INFINITY, new ModelDestination( + new ModelIdentifier("eg", "delay", 1))); + defaultconnections[o++] = new ModelConnectionBlock( + Float.NEGATIVE_INFINITY, new ModelDestination( + new ModelIdentifier("eg", "attack", 1))); + defaultconnections[o++] = new ModelConnectionBlock( + Float.NEGATIVE_INFINITY, new ModelDestination( + new ModelIdentifier("eg", "hold", 1))); + defaultconnections[o++] = new ModelConnectionBlock( + Float.NEGATIVE_INFINITY, new ModelDestination( + new ModelIdentifier("eg", "decay", 1))); + defaultconnections[o++] = new ModelConnectionBlock(1000, + new ModelDestination(new ModelIdentifier("eg", "sustain", 1))); + defaultconnections[o++] = new ModelConnectionBlock( + Float.NEGATIVE_INFINITY, new ModelDestination( + new ModelIdentifier("eg", "release", 1))); + + defaultconnections[o++] = new ModelConnectionBlock(-8.51318, + new ModelDestination(new ModelIdentifier("lfo", "freq", 0))); + defaultconnections[o++] = new ModelConnectionBlock( + Float.NEGATIVE_INFINITY, new ModelDestination( + new ModelIdentifier("lfo", "delay", 0))); + defaultconnections[o++] = new ModelConnectionBlock(-8.51318, + new ModelDestination(new ModelIdentifier("lfo", "freq", 1))); + defaultconnections[o++] = new ModelConnectionBlock( + Float.NEGATIVE_INFINITY, new ModelDestination( + new ModelIdentifier("lfo", "delay", 1))); + + } + public int keyFrom = 0; + public int keyTo = 127; + public int velFrom = 0; + public int velTo = 127; + public int exclusiveClass = 0; + public boolean selfNonExclusive = false; + public boolean forcedVelocity = false; + public boolean forcedKeynumber = false; + public ModelPerformer performer; + public ModelConnectionBlock[] connections; + public ModelOscillator[] oscillators; + public Map midi_rpn_connections = new HashMap(); + public Map midi_nrpn_connections = new HashMap(); + public int[][] midi_ctrl_connections; + public int[][] midi_connections; + public int[] ctrl_connections; + private List ctrl_connections_list = new ArrayList(); + + private static class KeySortComparator implements Comparator { + + public int compare(ModelSource o1, ModelSource o2) { + return o1.getIdentifier().toString().compareTo( + o2.getIdentifier().toString()); + } + } + private static KeySortComparator keySortComparator = new KeySortComparator(); + + private String extractKeys(ModelConnectionBlock conn) { + StringBuffer sb = new StringBuffer(); + if (conn.getSources() != null) { + sb.append("["); + ModelSource[] srcs = conn.getSources(); + ModelSource[] srcs2 = new ModelSource[srcs.length]; + for (int i = 0; i < srcs.length; i++) + srcs2[i] = srcs[i]; + Arrays.sort(srcs2, keySortComparator); + for (int i = 0; i < srcs.length; i++) { + sb.append(srcs[i].getIdentifier()); + sb.append(";"); + } + sb.append("]"); + } + sb.append(";"); + if (conn.getDestination() != null) { + sb.append(conn.getDestination().getIdentifier()); + } + sb.append(";"); + return sb.toString(); + } + + private void processSource(ModelSource src, int ix) { + ModelIdentifier id = src.getIdentifier(); + String o = id.getObject(); + if (o.equals("midi_cc")) + processMidiControlSource(src, ix); + else if (o.equals("midi_rpn")) + processMidiRpnSource(src, ix); + else if (o.equals("midi_nrpn")) + processMidiNrpnSource(src, ix); + else if (o.equals("midi")) + processMidiSource(src, ix); + else if (o.equals("noteon")) + processNoteOnSource(src, ix); + else if (o.equals("osc")) + return; + else if (o.equals("mixer")) + return; + else + ctrl_connections_list.add(ix); + } + + private void processMidiControlSource(ModelSource src, int ix) { + String v = src.getIdentifier().getVariable(); + if (v == null) + return; + int c = Integer.parseInt(v); + if (midi_ctrl_connections[c] == null) + midi_ctrl_connections[c] = new int[]{ix}; + else { + int[] olda = midi_ctrl_connections[c]; + int[] newa = new int[olda.length + 1]; + for (int i = 0; i < olda.length; i++) + newa[i] = olda[i]; + newa[newa.length - 1] = ix; + midi_ctrl_connections[c] = newa; + } + } + + private void processNoteOnSource(ModelSource src, int ix) { + String v = src.getIdentifier().getVariable(); + int c = -1; + if (v.equals("on")) + c = 3; + if (v.equals("keynumber")) + c = 4; + if (c == -1) + return; + if (midi_connections[c] == null) + midi_connections[c] = new int[]{ix}; + else { + int[] olda = midi_connections[c]; + int[] newa = new int[olda.length + 1]; + for (int i = 0; i < olda.length; i++) + newa[i] = olda[i]; + newa[newa.length - 1] = ix; + midi_connections[c] = newa; + } + } + + private void processMidiSource(ModelSource src, int ix) { + String v = src.getIdentifier().getVariable(); + int c = -1; + if (v.equals("pitch")) + c = 0; + if (v.equals("channel_pressure")) + c = 1; + if (v.equals("poly_pressure")) + c = 2; + if (c == -1) + return; + if (midi_connections[c] == null) + midi_connections[c] = new int[]{ix}; + else { + int[] olda = midi_connections[c]; + int[] newa = new int[olda.length + 1]; + for (int i = 0; i < olda.length; i++) + newa[i] = olda[i]; + newa[newa.length - 1] = ix; + midi_connections[c] = newa; + } + } + + private void processMidiRpnSource(ModelSource src, int ix) { + String v = src.getIdentifier().getVariable(); + if (v == null) + return; + int c = Integer.parseInt(v); + if (midi_rpn_connections.get(c) == null) + midi_rpn_connections.put(c, new int[]{ix}); + else { + int[] olda = midi_rpn_connections.get(c); + int[] newa = new int[olda.length + 1]; + for (int i = 0; i < olda.length; i++) + newa[i] = olda[i]; + newa[newa.length - 1] = ix; + midi_rpn_connections.put(c, newa); + } + } + + private void processMidiNrpnSource(ModelSource src, int ix) { + String v = src.getIdentifier().getVariable(); + if (v == null) + return; + int c = Integer.parseInt(v); + if (midi_nrpn_connections.get(c) == null) + midi_nrpn_connections.put(c, new int[]{ix}); + else { + int[] olda = midi_nrpn_connections.get(c); + int[] newa = new int[olda.length + 1]; + for (int i = 0; i < olda.length; i++) + newa[i] = olda[i]; + newa[newa.length - 1] = ix; + midi_nrpn_connections.put(c, newa); + } + } + + public SoftPerformer(ModelPerformer performer) { + this.performer = performer; + + keyFrom = performer.getKeyFrom(); + keyTo = performer.getKeyTo(); + velFrom = performer.getVelFrom(); + velTo = performer.getVelTo(); + exclusiveClass = performer.getExclusiveClass(); + selfNonExclusive = performer.isSelfNonExclusive(); + + Map connmap = new HashMap(); + + List performer_connections = new ArrayList(); + performer_connections.addAll(performer.getConnectionBlocks()); + + if (performer.isDefaultConnectionsEnabled()) { + + // Add modulation depth range (RPN 5) to the modulation wheel (cc#1) + + boolean isModulationWheelConectionFound = false; + for (int j = 0; j < performer_connections.size(); j++) { + ModelConnectionBlock connection = performer_connections.get(j); + ModelSource[] sources = connection.getSources(); + ModelDestination dest = connection.getDestination(); + boolean isModulationWheelConection = false; + if (dest != null && sources != null && sources.length > 1) { + for (int i = 0; i < sources.length; i++) { + // check if connection block has the source "modulation + // wheel cc#1" + if (sources[i].getIdentifier().getObject().equals( + "midi_cc")) { + if (sources[i].getIdentifier().getVariable() + .equals("1")) { + isModulationWheelConection = true; + isModulationWheelConectionFound = true; + break; + } + } + } + } + if (isModulationWheelConection) { + + ModelConnectionBlock newconnection = new ModelConnectionBlock(); + newconnection.setSources(connection.getSources()); + newconnection.setDestination(connection.getDestination()); + newconnection.addSource(new ModelSource( + new ModelIdentifier("midi_rpn", "5"))); + newconnection.setScale(connection.getScale() * 256.0); + performer_connections.set(j, newconnection); + } + } + + if (!isModulationWheelConectionFound) { + ModelConnectionBlock conn = new ModelConnectionBlock( + new ModelSource(ModelSource.SOURCE_LFO1, + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + new ModelSource(new ModelIdentifier("midi_cc", "1", 0), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_UNIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 50, + new ModelDestination(ModelDestination.DESTINATION_PITCH)); + conn.addSource(new ModelSource(new ModelIdentifier("midi_rpn", + "5"))); + conn.setScale(conn.getScale() * 256.0); + performer_connections.add(conn); + + } + + // Let Aftertouch to behave just like modulation wheel (cc#1) + boolean channel_pressure_set = false; + boolean poly_pressure = false; + ModelConnectionBlock mod_cc_1_connection = null; + int mod_cc_1_connection_src_ix = 0; + + for (ModelConnectionBlock connection : performer_connections) { + ModelSource[] sources = connection.getSources(); + ModelDestination dest = connection.getDestination(); + // if(dest != null && sources != null) + if (dest != null && sources != null) { + for (int i = 0; i < sources.length; i++) { + ModelIdentifier srcid = sources[i].getIdentifier(); + // check if connection block has the source "modulation + // wheel cc#1" + if (srcid.getObject().equals("midi_cc")) { + if (srcid.getVariable().equals("1")) { + mod_cc_1_connection = connection; + mod_cc_1_connection_src_ix = i; + } + } + // check if channel or poly pressure are already + // connected + if (srcid.getObject().equals("midi")) { + if (srcid.getVariable().equals("channel_pressure")) + channel_pressure_set = true; + if (srcid.getVariable().equals("poly_pressure")) + poly_pressure = true; + } + } + } + + } + + if (mod_cc_1_connection != null) { + if (!channel_pressure_set) { + ModelConnectionBlock mc = new ModelConnectionBlock(); + mc.setDestination(mod_cc_1_connection.getDestination()); + mc.setScale(mod_cc_1_connection.getScale()); + ModelSource[] src_list = mod_cc_1_connection.getSources(); + ModelSource[] src_list_new = new ModelSource[src_list.length]; + for (int i = 0; i < src_list_new.length; i++) + src_list_new[i] = src_list[i]; + src_list_new[mod_cc_1_connection_src_ix] = new ModelSource( + new ModelIdentifier("midi", "channel_pressure")); + mc.setSources(src_list_new); + connmap.put(extractKeys(mc), mc); + } + if (!poly_pressure) { + ModelConnectionBlock mc = new ModelConnectionBlock(); + mc.setDestination(mod_cc_1_connection.getDestination()); + mc.setScale(mod_cc_1_connection.getScale()); + ModelSource[] src_list = mod_cc_1_connection.getSources(); + ModelSource[] src_list_new = new ModelSource[src_list.length]; + for (int i = 0; i < src_list_new.length; i++) + src_list_new[i] = src_list[i]; + src_list_new[mod_cc_1_connection_src_ix] = new ModelSource( + new ModelIdentifier("midi", "poly_pressure")); + mc.setSources(src_list_new); + connmap.put(extractKeys(mc), mc); + } + } + + // Enable Vibration Sound Controllers : 76, 77, 78 + ModelConnectionBlock found_vib_connection = null; + for (ModelConnectionBlock connection : performer_connections) { + ModelSource[] sources = connection.getSources(); + if (sources.length != 0 + && sources[0].getIdentifier().getObject().equals("lfo")) { + if (connection.getDestination().getIdentifier().equals( + ModelDestination.DESTINATION_PITCH)) { + if (found_vib_connection == null) + found_vib_connection = connection; + else { + if (found_vib_connection.getSources().length > sources.length) + found_vib_connection = connection; + else if (found_vib_connection.getSources()[0] + .getIdentifier().getInstance() < 1) { + if (found_vib_connection.getSources()[0] + .getIdentifier().getInstance() > + sources[0].getIdentifier().getInstance()) { + found_vib_connection = connection; + } + } + } + + } + } + } + + int instance = 1; + + if (found_vib_connection != null) { + instance = found_vib_connection.getSources()[0].getIdentifier() + .getInstance(); + } + ModelConnectionBlock connection; + + connection = new ModelConnectionBlock( + new ModelSource(new ModelIdentifier("midi_cc", "78"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 2000, new ModelDestination( + new ModelIdentifier("lfo", "delay2", instance))); + connmap.put(extractKeys(connection), connection); + + final double scale = found_vib_connection == null ? 0 + : found_vib_connection.getScale(); + connection = new ModelConnectionBlock( + new ModelSource(new ModelIdentifier("lfo", instance)), + new ModelSource(new ModelIdentifier("midi_cc", "77"), + new ModelTransform() { + double s = scale; + public double transform(double value) { + value = value * 2 - 1; + value *= 600; + if (s == 0) { + return value; + } else if (s > 0) { + if (value < -s) + value = -s; + return value; + } else { + if (value < s) + value = -s; + return -value; + } + } + }), new ModelDestination(ModelDestination.DESTINATION_PITCH)); + connmap.put(extractKeys(connection), connection); + + connection = new ModelConnectionBlock( + new ModelSource(new ModelIdentifier("midi_cc", "76"), + ModelStandardTransform.DIRECTION_MIN2MAX, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_LINEAR), + 2400, new ModelDestination( + new ModelIdentifier("lfo", "freq", instance))); + connmap.put(extractKeys(connection), connection); + + } + + // Add default connection blocks + if (performer.isDefaultConnectionsEnabled()) + for (ModelConnectionBlock connection : defaultconnections) + connmap.put(extractKeys(connection), connection); + // Add connection blocks from modelperformer + for (ModelConnectionBlock connection : performer_connections) + connmap.put(extractKeys(connection), connection); + // seperate connection blocks : Init time, Midi Time, Midi/Control Time, + // Control Time + List connections = new ArrayList(); + + midi_ctrl_connections = new int[128][]; + for (int i = 0; i < midi_ctrl_connections.length; i++) { + midi_ctrl_connections[i] = null; + } + midi_connections = new int[5][]; + for (int i = 0; i < midi_connections.length; i++) { + midi_connections[i] = null; + } + + int ix = 0; + boolean mustBeOnTop = false; + + for (ModelConnectionBlock connection : connmap.values()) { + if (connection.getDestination() != null) { + ModelDestination dest = connection.getDestination(); + ModelIdentifier id = dest.getIdentifier(); + if (id.getObject().equals("noteon")) { + mustBeOnTop = true; + if (id.getVariable().equals("keynumber")) + forcedKeynumber = true; + if (id.getVariable().equals("velocity")) + forcedVelocity = true; + } + } + if (mustBeOnTop) { + connections.add(0, connection); + mustBeOnTop = false; + } else + connections.add(connection); + } + + for (ModelConnectionBlock connection : connections) { + if (connection.getSources() != null) { + ModelSource[] srcs = connection.getSources(); + for (int i = 0; i < srcs.length; i++) { + processSource(srcs[i], ix); + } + } + ix++; + } + + this.connections = new ModelConnectionBlock[connections.size()]; + connections.toArray(this.connections); + + this.ctrl_connections = new int[ctrl_connections_list.size()]; + + for (int i = 0; i < this.ctrl_connections.length; i++) + this.ctrl_connections[i] = ctrl_connections_list.get(i); + + oscillators = new ModelOscillator[performer.getOscillators().size()]; + performer.getOscillators().toArray(oscillators); + + for (ModelConnectionBlock conn : connections) { + if (conn.getDestination() != null) { + if (isUnnecessaryTransform(conn.getDestination().getTransform())) { + conn.getDestination().setTransform(null); + } + } + if (conn.getSources() != null) { + for (ModelSource src : conn.getSources()) { + if (isUnnecessaryTransform(src.getTransform())) { + src.setTransform(null); + } + } + } + } + + } + + private static boolean isUnnecessaryTransform(ModelTransform transform) { + if (transform == null) + return false; + if (!(transform instanceof ModelStandardTransform)) + return false; + ModelStandardTransform stransform = (ModelStandardTransform)transform; + if (stransform.getDirection() != ModelStandardTransform.DIRECTION_MIN2MAX) + return false; + if (stransform.getPolarity() != ModelStandardTransform.POLARITY_UNIPOLAR) + return false; + if (stransform.getTransform() != ModelStandardTransform.TRANSFORM_LINEAR) + return false; + return false; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftPointResampler.java b/jdk/src/share/classes/com/sun/media/sound/SoftPointResampler.java new file mode 100644 index 00000000000..56849ad4cf4 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftPointResampler.java @@ -0,0 +1,63 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * A resampler that uses 0-order (nearest-neighbor) interpolation. + * + * @author Karl Helgason + */ +public class SoftPointResampler extends SoftAbstractResampler { + + public int getPadding() { + return 100; + } + + public void interpolate(float[] in, float[] in_offset, float in_end, + float[] startpitch, float pitchstep, float[] out, int[] out_offset, + int out_end) { + float pitch = startpitch[0]; + float ix = in_offset[0]; + int ox = out_offset[0]; + float ix_end = in_end; + float ox_end = out_end; + if (pitchstep == 0) { + while (ix < ix_end && ox < ox_end) { + out[ox++] = in[(int) ix]; + ix += pitch; + } + } else { + while (ix < ix_end && ox < ox_end) { + out[ox++] = in[(int) ix]; + ix += pitch; + pitch += pitchstep; + } + } + in_offset[0] = ix; + out_offset[0] = ox; + startpitch[0] = pitch; + + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftProcess.java b/jdk/src/share/classes/com/sun/media/sound/SoftProcess.java new file mode 100644 index 00000000000..9b08ab06881 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftProcess.java @@ -0,0 +1,41 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * Control signal processor interface + * + * @author Karl Helgason + */ +public interface SoftProcess extends SoftControl { + + public void init(SoftSynthesizer synth); + + public double[] get(int instance, String name); + + public void processControlLogic(); + + public void reset(); +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftProvider.java b/jdk/src/share/classes/com/sun/media/sound/SoftProvider.java new file mode 100644 index 00000000000..9472d52d293 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftProvider.java @@ -0,0 +1,51 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiDevice.Info; +import javax.sound.midi.spi.MidiDeviceProvider; + +/** + * Software synthesizer provider class. + * + * @author Karl Helgason + */ +public class SoftProvider extends MidiDeviceProvider { + + protected final static Info softinfo = SoftSynthesizer.info; + private static Info[] softinfos = {softinfo}; + + public MidiDevice.Info[] getDeviceInfo() { + return softinfos; + } + + public MidiDevice getDevice(MidiDevice.Info info) { + if (info == softinfo) { + return new SoftSynthesizer(); + } + return null; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftReceiver.java b/jdk/src/share/classes/com/sun/media/sound/SoftReceiver.java new file mode 100644 index 00000000000..e7f1edcfae6 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftReceiver.java @@ -0,0 +1,83 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.TreeMap; + +import javax.sound.midi.MidiMessage; +import javax.sound.midi.Receiver; +import javax.sound.midi.ShortMessage; + +/** + * Software synthesizer MIDI receiver class. + * + * @author Karl Helgason + */ +public class SoftReceiver implements Receiver { + + protected boolean open = true; + private Object control_mutex; + private SoftSynthesizer synth; + protected TreeMap midimessages; + protected SoftMainMixer mainmixer; + + public SoftReceiver(SoftSynthesizer synth) { + this.control_mutex = synth.control_mutex; + this.synth = synth; + this.mainmixer = synth.getMainMixer(); + if (mainmixer != null) + this.midimessages = mainmixer.midimessages; + } + + public void send(MidiMessage message, long timeStamp) { + + synchronized (control_mutex) { + if (!open) + throw new IllegalStateException("Receiver is not open"); + } + + if (timeStamp != -1) { + synchronized (control_mutex) { + while (midimessages.get(timeStamp) != null) + timeStamp++; + if (message instanceof ShortMessage + && (((ShortMessage)message).getChannel() > 0xF)) { + midimessages.put(timeStamp, message.clone()); + } else { + midimessages.put(timeStamp, message.getMessage()); + } + } + } else { + mainmixer.processMessage(message); + } + } + + public void close() { + synchronized (control_mutex) { + open = false; + } + synth.removeReceiver(this); + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftResampler.java b/jdk/src/share/classes/com/sun/media/sound/SoftResampler.java new file mode 100644 index 00000000000..887f40845e8 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftResampler.java @@ -0,0 +1,35 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * Basic resampler interface. + * + * @author Karl Helgason + */ +public interface SoftResampler { + + public SoftResamplerStreamer openStreamer(); +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftResamplerStreamer.java b/jdk/src/share/classes/com/sun/media/sound/SoftResamplerStreamer.java new file mode 100644 index 00000000000..1662fceae7b --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftResamplerStreamer.java @@ -0,0 +1,38 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.IOException; + +/** + * Resampler stream interface. + * + * @author Karl Helgason + */ +public interface SoftResamplerStreamer extends ModelOscillatorStream { + + public void open(ModelWavetable osc, float outputsamplerate) + throws IOException; +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftReverb.java b/jdk/src/share/classes/com/sun/media/sound/SoftReverb.java new file mode 100644 index 00000000000..7dcb77252ac --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftReverb.java @@ -0,0 +1,515 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.util.Arrays; + +/** + * Reverb effect based on allpass/comb filters. First audio is send to 8 + * parelled comb filters and then mixed together and then finally send thru 3 + * different allpass filters. + * + * @author Karl Helgason + */ +public class SoftReverb implements SoftAudioProcessor { + + private final static class Delay { + + private float[] delaybuffer; + private int rovepos = 0; + + public Delay() { + delaybuffer = null; + } + + public void setDelay(int delay) { + if (delay == 0) + delaybuffer = null; + else + delaybuffer = new float[delay]; + rovepos = 0; + } + + public void processReplace(float[] inout) { + if (delaybuffer == null) + return; + int len = inout.length; + int rnlen = delaybuffer.length; + int rovepos = this.rovepos; + + for (int i = 0; i < len; i++) { + float x = inout[i]; + inout[i] = delaybuffer[rovepos]; + delaybuffer[rovepos] = x; + if (++rovepos == rnlen) + rovepos = 0; + } + this.rovepos = rovepos; + } + } + + private final static class AllPass { + + private final float[] delaybuffer; + private final int delaybuffersize; + private int rovepos = 0; + private float feedback; + + public AllPass(int size) { + delaybuffer = new float[size]; + delaybuffersize = size; + } + + public void setFeedBack(float feedback) { + this.feedback = feedback; + } + + public void processReplace(float inout[]) { + int len = inout.length; + int delaybuffersize = this.delaybuffersize; + int rovepos = this.rovepos; + for (int i = 0; i < len; i++) { + float delayout = delaybuffer[rovepos]; + float input = inout[i]; + inout[i] = delayout - input; + delaybuffer[rovepos] = input + delayout * feedback; + if (++rovepos == delaybuffersize) + rovepos = 0; + } + this.rovepos = rovepos; + } + + public void processReplace(float in[], float out[]) { + int len = in.length; + int delaybuffersize = this.delaybuffersize; + int rovepos = this.rovepos; + for (int i = 0; i < len; i++) { + float delayout = delaybuffer[rovepos]; + float input = in[i]; + out[i] = delayout - input; + delaybuffer[rovepos] = input + delayout * feedback; + if (++rovepos == delaybuffersize) + rovepos = 0; + } + this.rovepos = rovepos; + } + } + + private final static class Comb { + + private final float[] delaybuffer; + private final int delaybuffersize; + private int rovepos = 0; + private float feedback; + private float filtertemp = 0; + private float filtercoeff1 = 0; + private float filtercoeff2 = 1; + + public Comb(int size) { + delaybuffer = new float[size]; + delaybuffersize = size; + } + + public void setFeedBack(float feedback) { + this.feedback = feedback; + filtercoeff2 = (1 - filtercoeff1)* feedback; + } + + public void processMix(float in[], float out[]) { + int len = in.length; + int delaybuffersize = this.delaybuffersize; + int rovepos = this.rovepos; + float filtertemp = this.filtertemp; + float filtercoeff1 = this.filtercoeff1; + float filtercoeff2 = this.filtercoeff2; + for (int i = 0; i < len; i++) { + float delayout = delaybuffer[rovepos]; + // One Pole Lowpass Filter + filtertemp = (delayout * filtercoeff2) + + (filtertemp * filtercoeff1); + out[i] += delayout; + delaybuffer[rovepos] = in[i] + filtertemp; + if (++rovepos == delaybuffersize) + rovepos = 0; + } + this.filtertemp = filtertemp; + this.rovepos = rovepos; + } + + public void processReplace(float in[], float out[]) { + int len = in.length; + int delaybuffersize = this.delaybuffersize; + int rovepos = this.rovepos; + float filtertemp = this.filtertemp; + float filtercoeff1 = this.filtercoeff1; + float filtercoeff2 = this.filtercoeff2; + for (int i = 0; i < len; i++) { + float delayout = delaybuffer[rovepos]; + // One Pole Lowpass Filter + filtertemp = (delayout * filtercoeff2) + + (filtertemp * filtercoeff1); + out[i] = delayout; + delaybuffer[rovepos] = in[i] + filtertemp; + if (++rovepos == delaybuffersize) + rovepos = 0; + } + this.filtertemp = filtertemp; + this.rovepos = rovepos; + } + + public void setDamp(float val) { + filtercoeff1 = val; + filtercoeff2 = (1 - filtercoeff1)* feedback; + } + } + private float roomsize; + private float damp; + private float gain = 1; + private Delay delay; + private Comb[] combL; + private Comb[] combR; + private AllPass[] allpassL; + private AllPass[] allpassR; + private float[] input; + private float[] out; + private float[] pre1; + private float[] pre2; + private float[] pre3; + private boolean denormal_flip = false; + private boolean mix = true; + private SoftAudioBuffer inputA; + private SoftAudioBuffer left; + private SoftAudioBuffer right; + private boolean dirty = true; + private float dirty_roomsize; + private float dirty_damp; + private float dirty_predelay; + private float dirty_gain; + private float samplerate; + private boolean light = true; + + public void init(float samplerate, float controlrate) { + this.samplerate = samplerate; + + double freqscale = ((double) samplerate) / 44100.0; + // freqscale = 1.0/ freqscale; + + int stereospread = 23; + + delay = new Delay(); + + combL = new Comb[8]; + combR = new Comb[8]; + combL[0] = new Comb((int) (freqscale * (1116))); + combR[0] = new Comb((int) (freqscale * (1116 + stereospread))); + combL[1] = new Comb((int) (freqscale * (1188))); + combR[1] = new Comb((int) (freqscale * (1188 + stereospread))); + combL[2] = new Comb((int) (freqscale * (1277))); + combR[2] = new Comb((int) (freqscale * (1277 + stereospread))); + combL[3] = new Comb((int) (freqscale * (1356))); + combR[3] = new Comb((int) (freqscale * (1356 + stereospread))); + combL[4] = new Comb((int) (freqscale * (1422))); + combR[4] = new Comb((int) (freqscale * (1422 + stereospread))); + combL[5] = new Comb((int) (freqscale * (1491))); + combR[5] = new Comb((int) (freqscale * (1491 + stereospread))); + combL[6] = new Comb((int) (freqscale * (1557))); + combR[6] = new Comb((int) (freqscale * (1557 + stereospread))); + combL[7] = new Comb((int) (freqscale * (1617))); + combR[7] = new Comb((int) (freqscale * (1617 + stereospread))); + + allpassL = new AllPass[4]; + allpassR = new AllPass[4]; + allpassL[0] = new AllPass((int) (freqscale * (556))); + allpassR[0] = new AllPass((int) (freqscale * (556 + stereospread))); + allpassL[1] = new AllPass((int) (freqscale * (441))); + allpassR[1] = new AllPass((int) (freqscale * (441 + stereospread))); + allpassL[2] = new AllPass((int) (freqscale * (341))); + allpassR[2] = new AllPass((int) (freqscale * (341 + stereospread))); + allpassL[3] = new AllPass((int) (freqscale * (225))); + allpassR[3] = new AllPass((int) (freqscale * (225 + stereospread))); + + for (int i = 0; i < allpassL.length; i++) { + allpassL[i].setFeedBack(0.5f); + allpassR[i].setFeedBack(0.5f); + } + + /* Init other settings */ + globalParameterControlChange(new int[]{0x01 * 128 + 0x01}, 0, 4); + + } + + public void setInput(int pin, SoftAudioBuffer input) { + if (pin == 0) + inputA = input; + } + + public void setOutput(int pin, SoftAudioBuffer output) { + if (pin == 0) + left = output; + if (pin == 1) + right = output; + } + + public void setMixMode(boolean mix) { + this.mix = mix; + } + + private boolean silent = true; + + public void processAudio() { + boolean silent_input = this.inputA.isSilent(); + if(!silent_input) + silent = false; + if(silent) + { + if (!mix) { + left.clear(); + right.clear(); + } + return; + } + + float[] inputA = this.inputA.array(); + float[] left = this.left.array(); + float[] right = this.right == null ? null : this.right.array(); + + int numsamples = inputA.length; + if (input == null || input.length < numsamples) + input = new float[numsamples]; + + float again = gain * 0.018f / 2; + + denormal_flip = !denormal_flip; + if(denormal_flip) + for (int i = 0; i < numsamples; i++) + input[i] = inputA[i] * again + 1E-20f; + else + for (int i = 0; i < numsamples; i++) + input[i] = inputA[i] * again - 1E-20f; + + delay.processReplace(input); + + if(light && (right != null)) + { + if (pre1 == null || pre1.length < numsamples) + { + pre1 = new float[numsamples]; + pre2 = new float[numsamples]; + pre3 = new float[numsamples]; + } + + for (int i = 0; i < allpassL.length; i++) + allpassL[i].processReplace(input); + + combL[0].processReplace(input, pre3); + combL[1].processReplace(input, pre3); + + combL[2].processReplace(input, pre1); + for (int i = 4; i < combL.length-2; i+=2) + combL[i].processMix(input, pre1); + + combL[3].processReplace(input, pre2);; + for (int i = 5; i < combL.length-2; i+=2) + combL[i].processMix(input, pre2); + + if (!mix) + { + Arrays.fill(right, 0); + Arrays.fill(left, 0); + } + for (int i = combR.length-2; i < combR.length; i++) + combR[i].processMix(input, right); + for (int i = combL.length-2; i < combL.length; i++) + combL[i].processMix(input, left); + + for (int i = 0; i < numsamples; i++) + { + float p = pre1[i] - pre2[i]; + float m = pre3[i]; + left[i] += m + p; + right[i] += m - p; + } + } + else + { + if (out == null || out.length < numsamples) + out = new float[numsamples]; + + if (right != null) { + if (!mix) + Arrays.fill(right, 0); + allpassR[0].processReplace(input, out); + for (int i = 1; i < allpassR.length; i++) + allpassR[i].processReplace(out); + for (int i = 0; i < combR.length; i++) + combR[i].processMix(out, right); + } + + if (!mix) + Arrays.fill(left, 0); + allpassL[0].processReplace(input, out); + for (int i = 1; i < allpassL.length; i++) + allpassL[i].processReplace(out); + for (int i = 0; i < combL.length; i++) + combL[i].processMix(out, left); + } + + + + + + + if (silent_input) { + silent = true; + for (int i = 0; i < numsamples; i++) + { + float v = left[i]; + if(v > 1E-10 || v < -1E-10) + { + silent = false; + break; + } + } + } + + } + + public void globalParameterControlChange(int[] slothpath, long param, + long value) { + if (slothpath.length == 1) { + if (slothpath[0] == 0x01 * 128 + 0x01) { + + if (param == 0) { + if (value == 0) { + // Small Room A small size room with a length + // of 5m or so. + dirty_roomsize = (1.1f); + dirty_damp = (5000); + dirty_predelay = (0); + dirty_gain = (4); + dirty = true; + } + if (value == 1) { + // Medium Room A medium size room with a length + // of 10m or so. + dirty_roomsize = (1.3f); + dirty_damp = (5000); + dirty_predelay = (0); + dirty_gain = (3); + dirty = true; + } + if (value == 2) { + // Large Room A large size room suitable for + // live performances. + dirty_roomsize = (1.5f); + dirty_damp = (5000); + dirty_predelay = (0); + dirty_gain = (2); + dirty = true; + } + if (value == 3) { + // Medium Hall A medium size concert hall. + dirty_roomsize = (1.8f); + dirty_damp = (24000); + dirty_predelay = (0.02f); + dirty_gain = (1.5f); + dirty = true; + } + if (value == 4) { + // Large Hall A large size concert hall + // suitable for a full orchestra. + dirty_roomsize = (1.8f); + dirty_damp = (24000); + dirty_predelay = (0.03f); + dirty_gain = (1.5f); + dirty = true; + } + if (value == 8) { + // Plate A plate reverb simulation. + dirty_roomsize = (1.3f); + dirty_damp = (2500); + dirty_predelay = (0); + dirty_gain = (6); + dirty = true; + } + } else if (param == 1) { + dirty_roomsize = ((float) (Math.exp((value - 40) * 0.025))); + dirty = true; + } + + } + } + } + + public void processControlLogic() { + if (dirty) { + dirty = false; + setRoomSize(dirty_roomsize); + setDamp(dirty_damp); + setPreDelay(dirty_predelay); + setGain(dirty_gain); + } + } + + public void setRoomSize(float value) { + roomsize = 1 - (0.17f / value); + + for (int i = 0; i < combL.length; i++) { + combL[i].feedback = roomsize; + combR[i].feedback = roomsize; + } + } + + public void setPreDelay(float value) { + delay.setDelay((int)(value * samplerate)); + } + + public void setGain(float gain) { + this.gain = gain; + } + + public void setDamp(float value) { + double x = (value / samplerate) * (2 * Math.PI); + double cx = 2 - Math.cos(x); + damp = (float)(cx - Math.sqrt(cx * cx - 1)); + if (damp > 1) + damp = 1; + if (damp < 0) + damp = 0; + + // damp = value * 0.4f; + for (int i = 0; i < combL.length; i++) { + combL[i].setDamp(damp); + combR[i].setDamp(damp); + } + + } + + public void setLightMode(boolean light) + { + this.light = light; + } +} + diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftShortMessage.java b/jdk/src/share/classes/com/sun/media/sound/SoftShortMessage.java new file mode 100644 index 00000000000..9d16e82ac19 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftShortMessage.java @@ -0,0 +1,58 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import javax.sound.midi.InvalidMidiDataException; +import javax.sound.midi.ShortMessage; + +/** + * A short message class that support for than 16 midi channels. + * + * @author Karl Helgason + */ +public class SoftShortMessage extends ShortMessage { + + int channel = 0; + + public int getChannel() { + return channel; + } + + public void setMessage(int command, int channel, int data1, int data2) + throws InvalidMidiDataException { + this.channel = channel; + super.setMessage(command, channel & 0xF, data1, data2); + } + + public Object clone() { + SoftShortMessage clone = new SoftShortMessage(); + try { + clone.setMessage(getCommand(), getChannel(), getData1(), getData2()); + } catch (InvalidMidiDataException e) { + throw new IllegalArgumentException(e); + } + return clone; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftSincResampler.java b/jdk/src/share/classes/com/sun/media/sound/SoftSincResampler.java new file mode 100644 index 00000000000..e4e039214f2 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftSincResampler.java @@ -0,0 +1,139 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +/** + * Hann windowed sinc interpolation resampler with anti-alias filtering. + * + * Using 30 points for the interpolation. + * + * @author Karl Helgason + */ +public class SoftSincResampler extends SoftAbstractResampler { + + float[][][] sinc_table; + int sinc_scale_size = 100; + int sinc_table_fsize = 800; + int sinc_table_size = 30; + int sinc_table_center = sinc_table_size / 2; + + public SoftSincResampler() { + super(); + sinc_table = new float[sinc_scale_size][sinc_table_fsize][]; + for (int s = 0; s < sinc_scale_size; s++) { + float scale = (float) (1.0 / (1.0 + Math.pow(s, 1.1) / 10.0)); + for (int i = 0; i < sinc_table_fsize; i++) { + sinc_table[s][i] = sincTable(sinc_table_size, + -i / ((float)sinc_table_fsize), scale); + } + } + } + + // Normalized sinc function + public static double sinc(double x) { + return (x == 0.0) ? 1.0 : Math.sin(Math.PI * x) / (Math.PI * x); + } + + // Generate hann window suitable for windowing sinc + public static float[] wHanning(int size, float offset) { + float[] window_table = new float[size]; + for (int k = 0; k < size; k++) { + window_table[k] = (float)(-0.5 + * Math.cos(2.0 * Math.PI * (double)(k + offset) + / (double) size) + 0.5); + } + return window_table; + } + + // Generate sinc table + public static float[] sincTable(int size, float offset, float scale) { + int center = size / 2; + float[] w = wHanning(size, offset); + for (int k = 0; k < size; k++) + w[k] *= sinc((-center + k + offset) * scale) * scale; + return w; + } + + public int getPadding() // must be at least half of sinc_table_size + { + return sinc_table_size / 2 + 2; + } + + public void interpolate(float[] in, float[] in_offset, float in_end, + float[] startpitch, float pitchstep, float[] out, int[] out_offset, + int out_end) { + float pitch = startpitch[0]; + float ix = in_offset[0]; + int ox = out_offset[0]; + float ix_end = in_end; + int ox_end = out_end; + int max_p = sinc_scale_size - 1; + if (pitchstep == 0) { + + int p = (int) ((pitch - 1) * 10.0f); + if (p < 0) + p = 0; + else if (p > max_p) + p = max_p; + float[][] sinc_table_f = this.sinc_table[p]; + while (ix < ix_end && ox < ox_end) { + int iix = (int) ix; + float[] sinc_table = + sinc_table_f[(int)((ix - iix) * sinc_table_fsize)]; + int xx = iix - sinc_table_center; + float y = 0; + for (int i = 0; i < sinc_table_size; i++, xx++) + y += in[xx] * sinc_table[i]; + out[ox++] = y; + ix += pitch; + } + } else { + while (ix < ix_end && ox < ox_end) { + int iix = (int) ix; + int p = (int) ((pitch - 1) * 10.0f); + if (p < 0) + p = 0; + else if (p > max_p) + p = max_p; + float[][] sinc_table_f = this.sinc_table[p]; + + float[] sinc_table = + sinc_table_f[(int)((ix - iix) * sinc_table_fsize)]; + int xx = iix - sinc_table_center; + float y = 0; + for (int i = 0; i < sinc_table_size; i++, xx++) + y += in[xx] * sinc_table[i]; + out[ox++] = y; + + ix += pitch; + pitch += pitchstep; + } + } + in_offset[0] = ix; + out_offset[0] = ox; + startpitch[0] = pitch; + + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftSynthesizer.java b/jdk/src/share/classes/com/sun/media/sound/SoftSynthesizer.java new file mode 100644 index 00000000000..3f6c12fc765 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftSynthesizer.java @@ -0,0 +1,1179 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package com.sun.media.sound; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.lang.ref.WeakReference; +import java.security.AccessControlException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.sound.midi.Instrument; +import javax.sound.midi.MidiChannel; +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiSystem; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.midi.Receiver; +import javax.sound.midi.Soundbank; +import javax.sound.midi.Transmitter; +import javax.sound.midi.VoiceStatus; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.LineUnavailableException; +import javax.sound.sampled.SourceDataLine; + +/** + * The software synthesizer class. + * + * @author Karl Helgason + */ +public class SoftSynthesizer implements AudioSynthesizer, + ReferenceCountingDevice { + + protected static class WeakAudioStream extends InputStream + { + private volatile AudioInputStream stream; + public SoftAudioPusher pusher = null; + public AudioInputStream jitter_stream = null; + public SourceDataLine sourceDataLine = null; + private WeakReference weak_stream_link; + private AudioFloatConverter converter; + private float[] silentbuffer = null; + private int samplesize; + + public void setInputStream(AudioInputStream stream) + { + this.stream = stream; + } + + public int available() throws IOException { + AudioInputStream local_stream = stream; + if(local_stream != null) + return local_stream.available(); + return 0; + } + + public int read() throws IOException { + byte[] b = new byte[1]; + if (read(b) == -1) + return -1; + return b[0] & 0xFF; + } + + public int read(byte[] b, int off, int len) throws IOException { + AudioInputStream local_stream = stream; + if(local_stream != null) + return local_stream.read(b, off, len); + else + { + int flen = len / samplesize; + if(silentbuffer == null || silentbuffer.length < flen) + silentbuffer = new float[flen]; + converter.toByteArray(silentbuffer, flen, b, off); + + if(pusher != null) + if(weak_stream_link.get() == null) + { + Runnable runnable = new Runnable() + { + SoftAudioPusher _pusher = pusher; + AudioInputStream _jitter_stream = jitter_stream; + SourceDataLine _sourceDataLine = sourceDataLine; + public void run() + { + _pusher.stop(); + if(_jitter_stream != null) + try { + _jitter_stream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + if(_sourceDataLine != null) + _sourceDataLine.close(); + } + }; + pusher = null; + jitter_stream = null; + sourceDataLine = null; + new Thread(runnable).start(); + } + return len; + } + } + + public WeakAudioStream(AudioInputStream stream) { + this.stream = stream; + weak_stream_link = new WeakReference(stream); + converter = AudioFloatConverter.getConverter(stream.getFormat()); + samplesize = stream.getFormat().getFrameSize() / stream.getFormat().getChannels(); + } + + public AudioInputStream getAudioInputStream() + { + return new AudioInputStream(this, stream.getFormat(), AudioSystem.NOT_SPECIFIED); + } + + public void close() throws IOException + { + AudioInputStream astream = weak_stream_link.get(); + if(astream != null) + astream.close(); + } + } + + private static class Info extends MidiDevice.Info { + public Info() { + super(INFO_NAME, INFO_VENDOR, INFO_DESCRIPTION, INFO_VERSION); + } + } + + protected static final String INFO_NAME = "Gervill"; + protected static final String INFO_VENDOR = "OpenJDK"; + protected static final String INFO_DESCRIPTION = "Software MIDI Synthesizer"; + protected static final String INFO_VERSION = "1.0"; + protected final static MidiDevice.Info info = new Info(); + + private static SourceDataLine testline = null; + + private static Soundbank defaultSoundBank = null; + + protected WeakAudioStream weakstream = null; + + protected Object control_mutex = this; + + protected int voiceIDCounter = 0; + + // 0: default + // 1: DLS Voice Allocation + protected int voice_allocation_mode = 0; + + protected boolean reverb_light = true; + protected boolean reverb_on = true; + protected boolean chorus_on = true; + protected boolean agc_on = true; + + protected SoftChannel[] channels; + protected SoftChannelProxy[] external_channels = null; + + private boolean largemode = false; + + // 0: GM Mode off (default) + // 1: GM Level 1 + // 2: GM Level 2 + private int gmmode = 0; + + private int deviceid = 0; + + private AudioFormat format = new AudioFormat(44100, 16, 2, true, false); + + private SourceDataLine sourceDataLine = null; + + private SoftAudioPusher pusher = null; + private AudioInputStream pusher_stream = null; + + private float controlrate = 147f; + + private boolean open = false; + private boolean implicitOpen = false; + + private String resamplerType = "linear"; + private SoftResampler resampler = new SoftLinearResampler(); + + private int number_of_midi_channels = 16; + private int maxpoly = 64; + private long latency = 200000; // 200 msec + private boolean jitter_correction = false; + + private SoftMainMixer mainmixer; + private SoftVoice[] voices; + + private Map tunings + = new HashMap(); + private Map inslist + = new HashMap(); + private Map availlist + = new HashMap(); + private Map loadedlist + = new HashMap(); + + private ArrayList recvslist = new ArrayList(); + + private void getBuffers(ModelInstrument instrument, + List buffers) { + for (ModelPerformer performer : instrument.getPerformers()) { + if (performer.getOscillators() != null) { + for (ModelOscillator osc : performer.getOscillators()) { + if (osc instanceof ModelByteBufferWavetable) { + ModelByteBufferWavetable w = (ModelByteBufferWavetable)osc; + ModelByteBuffer buff = w.getBuffer(); + if (buff != null) + buffers.add(buff); + buff = w.get8BitExtensionBuffer(); + if (buff != null) + buffers.add(buff); + } + } + } + } + } + + private boolean loadSamples(List instruments) { + if (largemode) + return true; + List buffers = new ArrayList(); + for (ModelInstrument instrument : instruments) + getBuffers(instrument, buffers); + try { + ModelByteBuffer.loadAll(buffers); + } catch (IOException e) { + return false; + } + return true; + } + + private boolean loadInstruments(List instruments) { + if (!isOpen()) + return false; + if (!loadSamples(instruments)) + return false; + + synchronized (control_mutex) { + if (channels != null) + for (SoftChannel c : channels) + c.current_instrument = null; + for (Instrument instrument : instruments) { + String pat = patchToString(instrument.getPatch()); + availlist.remove(pat); + SoftInstrument softins + = new SoftInstrument((ModelInstrument) instrument); + inslist.put(pat, softins); + loadedlist.put(pat, (ModelInstrument) instrument); + } + } + + return true; + } + + private void processPropertyInfo(Map info) { + AudioSynthesizerPropertyInfo[] items = getPropertyInfo(info); + + String resamplerType = (String)items[0].value; + if (resamplerType.equalsIgnoreCase("point")) + { + this.resampler = new SoftPointResampler(); + this.resamplerType = "point"; + } + else if (resamplerType.equalsIgnoreCase("linear")) + { + this.resampler = new SoftLinearResampler2(); + this.resamplerType = "linear"; + } + else if (resamplerType.equalsIgnoreCase("linear1")) + { + this.resampler = new SoftLinearResampler(); + this.resamplerType = "linear1"; + } + else if (resamplerType.equalsIgnoreCase("linear2")) + { + this.resampler = new SoftLinearResampler2(); + this.resamplerType = "linear2"; + } + else if (resamplerType.equalsIgnoreCase("cubic")) + { + this.resampler = new SoftCubicResampler(); + this.resamplerType = "cubic"; + } + else if (resamplerType.equalsIgnoreCase("lanczos")) + { + this.resampler = new SoftLanczosResampler(); + this.resamplerType = "lanczos"; + } + else if (resamplerType.equalsIgnoreCase("sinc")) + { + this.resampler = new SoftSincResampler(); + this.resamplerType = "sinc"; + } + + setFormat((AudioFormat)items[2].value); + controlrate = (Float)items[1].value; + latency = (Long)items[3].value; + deviceid = (Integer)items[4].value; + maxpoly = (Integer)items[5].value; + reverb_on = (Boolean)items[6].value; + chorus_on = (Boolean)items[7].value; + agc_on = (Boolean)items[8].value; + largemode = (Boolean)items[9].value; + number_of_midi_channels = (Integer)items[10].value; + jitter_correction = (Boolean)items[11].value; + reverb_light = (Boolean)items[12].value; + } + + private String patchToString(Patch patch) { + if (patch instanceof ModelPatch && ((ModelPatch) patch).isPercussion()) + return "p." + patch.getProgram() + "." + patch.getBank(); + else + return patch.getProgram() + "." + patch.getBank(); + } + + private void setFormat(AudioFormat format) { + if (format.getChannels() > 2) { + throw new IllegalArgumentException( + "Only mono and stereo audio supported."); + } + if (AudioFloatConverter.getConverter(format) == null) + throw new IllegalArgumentException("Audio format not supported."); + this.format = format; + } + + protected void removeReceiver(Receiver recv) { + boolean perform_close = false; + synchronized (control_mutex) { + if (recvslist.remove(recv)) { + if (implicitOpen && recvslist.isEmpty()) + perform_close = true; + } + } + if (perform_close) + close(); + } + + protected SoftMainMixer getMainMixer() { + if (!isOpen()) + return null; + return mainmixer; + } + + protected SoftInstrument findInstrument(int program, int bank, int channel) { + + // Add support for GM2 banks 0x78 and 0x79 + // as specified in DLS 2.2 in Section 1.4.6 + // which allows using percussion and melodic instruments + // on all channels + if (bank >> 7 == 0x78 || bank >> 7 == 0x79) { + SoftInstrument current_instrument + = inslist.get(program + "." + bank); + if (current_instrument != null) + return current_instrument; + + String p_plaf; + if (bank >> 7 == 0x78) + p_plaf = "p."; + else + p_plaf = ""; + + // Instrument not found fallback to MSB:bank, LSB:0 + current_instrument = inslist.get(p_plaf + program + "." + + ((bank & 128) << 7)); + if (current_instrument != null) + return current_instrument; + // Instrument not found fallback to MSB:0, LSB:bank + current_instrument = inslist.get(p_plaf + program + "." + + (bank & 128)); + if (current_instrument != null) + return current_instrument; + // Instrument not found fallback to MSB:0, LSB:0 + current_instrument = inslist.get(p_plaf + program + ".0"); + if (current_instrument != null) + return current_instrument; + // Instrument not found fallback to MSB:0, LSB:0, program=0 + current_instrument = inslist.get(p_plaf + program + "0.0"); + if (current_instrument != null) + return current_instrument; + return null; + } + + // Channel 10 uses percussion instruments + String p_plaf; + if (channel == 9) + p_plaf = "p."; + else + p_plaf = ""; + + SoftInstrument current_instrument + = inslist.get(p_plaf + program + "." + bank); + if (current_instrument != null) + return current_instrument; + // Instrument not found fallback to MSB:0, LSB:0 + current_instrument = inslist.get(p_plaf + program + ".0"); + if (current_instrument != null) + return current_instrument; + // Instrument not found fallback to MSB:0, LSB:0, program=0 + current_instrument = inslist.get(p_plaf + "0.0"); + if (current_instrument != null) + return current_instrument; + return null; + } + + protected int getVoiceAllocationMode() { + return voice_allocation_mode; + } + + protected int getGeneralMidiMode() { + return gmmode; + } + + protected void setGeneralMidiMode(int gmmode) { + this.gmmode = gmmode; + } + + protected int getDeviceID() { + return deviceid; + } + + protected float getControlRate() { + return controlrate; + } + + protected SoftVoice[] getVoices() { + return voices; + } + + protected SoftTuning getTuning(Patch patch) { + String t_id = patchToString(patch); + SoftTuning tuning = tunings.get(t_id); + if (tuning == null) { + tuning = new SoftTuning(patch); + tunings.put(t_id, tuning); + } + return tuning; + } + + public long getLatency() { + synchronized (control_mutex) { + return latency; + } + } + + public AudioFormat getFormat() { + synchronized (control_mutex) { + return format; + } + } + + public int getMaxPolyphony() { + synchronized (control_mutex) { + return maxpoly; + } + } + + public MidiChannel[] getChannels() { + + synchronized (control_mutex) { + // if (external_channels == null) => the synthesizer is not open, + // create 16 proxy channels + // otherwise external_channels has the same length as channels array + if (external_channels == null) { + external_channels = new SoftChannelProxy[16]; + for (int i = 0; i < external_channels.length; i++) + external_channels[i] = new SoftChannelProxy(); + } + MidiChannel[] ret; + if (isOpen()) + ret = new MidiChannel[channels.length]; + else + ret = new MidiChannel[16]; + for (int i = 0; i < ret.length; i++) + ret[i] = external_channels[i]; + return ret; + } + } + + public VoiceStatus[] getVoiceStatus() { + if (!isOpen()) { + VoiceStatus[] tempVoiceStatusArray + = new VoiceStatus[getMaxPolyphony()]; + for (int i = 0; i < tempVoiceStatusArray.length; i++) { + VoiceStatus b = new VoiceStatus(); + b.active = false; + b.bank = 0; + b.channel = 0; + b.note = 0; + b.program = 0; + b.volume = 0; + tempVoiceStatusArray[i] = b; + } + return tempVoiceStatusArray; + } + + synchronized (control_mutex) { + VoiceStatus[] tempVoiceStatusArray = new VoiceStatus[voices.length]; + for (int i = 0; i < voices.length; i++) { + VoiceStatus a = voices[i]; + VoiceStatus b = new VoiceStatus(); + b.active = a.active; + b.bank = a.bank; + b.channel = a.channel; + b.note = a.note; + b.program = a.program; + b.volume = a.volume; + tempVoiceStatusArray[i] = b; + } + return tempVoiceStatusArray; + } + } + + public boolean isSoundbankSupported(Soundbank soundbank) { + for (Instrument ins: soundbank.getInstruments()) + if (!(ins instanceof ModelInstrument)) + return false; + return true; + } + + public boolean loadInstrument(Instrument instrument) { + if (instrument == null || (!(instrument instanceof ModelInstrument))) { + throw new IllegalArgumentException("Unsupported instrument: " + + instrument); + } + List instruments = new ArrayList(); + instruments.add((ModelInstrument)instrument); + return loadInstruments(instruments); + } + + public void unloadInstrument(Instrument instrument) { + if (instrument == null || (!(instrument instanceof ModelInstrument))) { + throw new IllegalArgumentException("Unsupported instrument: " + + instrument); + } + if (!isOpen()) + return; + + String pat = patchToString(instrument.getPatch()); + synchronized (control_mutex) { + for (SoftChannel c: channels) + c.current_instrument = null; + inslist.remove(pat); + loadedlist.remove(pat); + availlist.remove(pat); + } + } + + public boolean remapInstrument(Instrument from, Instrument to) { + + if (from == null) + throw new NullPointerException(); + if (to == null) + throw new NullPointerException(); + if (!(from instanceof ModelInstrument)) { + throw new IllegalArgumentException("Unsupported instrument: " + + from.toString()); + } + if (!(to instanceof ModelInstrument)) { + throw new IllegalArgumentException("Unsupported instrument: " + + to.toString()); + } + if (!isOpen()) + return false; + + synchronized (control_mutex) { + if (!loadedlist.containsValue(to) && !availlist.containsValue(to)) + throw new IllegalArgumentException("Instrument to is not loaded."); + unloadInstrument(from); + ModelMappedInstrument mfrom = new ModelMappedInstrument( + (ModelInstrument)to, from.getPatch()); + return loadInstrument(mfrom); + } + } + + public synchronized Soundbank getDefaultSoundbank() { + if (defaultSoundBank == null) { + try { + File javahome = new File(System.getProperties().getProperty( + "java.home")); + File libaudio = new File(new File(javahome, "lib"), "audio"); + + if (libaudio.exists()) { + File foundfile = null; + File[] files = libaudio.listFiles(); + if (files != null) { + for (int i = 0; i < files.length; i++) { + File file = files[i]; + if (file.isFile()) { + String lname = file.getName().toLowerCase(); + if (lname.endsWith(".sf2") || + lname.endsWith(".dls")) { + if (foundfile == null || (file.length() > + foundfile.length())) { + foundfile = file; + } + } + } + } + } + if (foundfile != null) { + try { + Soundbank sbk = MidiSystem.getSoundbank(foundfile); + defaultSoundBank = sbk; + return defaultSoundBank; + } catch (Exception e) { + //e.printStackTrace(); + } + } + } + + if (System.getProperties().getProperty("os.name") + .startsWith("Windows")) { + File gm_dls = new File(System.getenv("SystemRoot") + + "\\system32\\drivers\\gm.dls"); + if (gm_dls.exists()) { + try { + Soundbank sbk = MidiSystem.getSoundbank(gm_dls); + defaultSoundBank = sbk; + return defaultSoundBank; + } catch (Exception e) { + //e.printStackTrace(); + } + } + } + } catch (AccessControlException e) { + } catch (Exception e) { + //e.printStackTrace(); + } + + File userhome = null; + File emg_soundbank_file = null; + + /* + * Try to load saved generated soundbank + */ + try { + userhome = new File(System.getProperty("user.home"), + ".gervill"); + emg_soundbank_file = new File(userhome, "soundbank-emg.sf2"); + Soundbank sbk = MidiSystem.getSoundbank(emg_soundbank_file); + defaultSoundBank = sbk; + return defaultSoundBank; + } catch (AccessControlException e) { + } catch (Exception e) { + //e.printStackTrace(); + } + + try { + + /* + * Generate emergency soundbank + */ + defaultSoundBank = EmergencySoundbank.createSoundbank(); + + /* + * Save generated soundbank to disk for faster future use. + */ + if(defaultSoundBank != null) + { + if(!userhome.exists()) userhome.mkdirs(); + if(!emg_soundbank_file.exists()) + ((SF2Soundbank)defaultSoundBank).save(emg_soundbank_file); + } + } catch (Exception e) { + //e.printStackTrace(); + } + + } + return defaultSoundBank; + } + + public Instrument[] getAvailableInstruments() { + if (!isOpen()) { + Soundbank defsbk = getDefaultSoundbank(); + if (defsbk == null) + return new Instrument[0]; + return defsbk.getInstruments(); + } + + synchronized (control_mutex) { + ModelInstrument[] inslist_array = + new ModelInstrument[availlist.values().size()]; + availlist.values().toArray(inslist_array); + Arrays.sort(inslist_array, new ModelInstrumentComparator()); + return inslist_array; + } + } + + public Instrument[] getLoadedInstruments() { + if (!isOpen()) + return new Instrument[0]; + + synchronized (control_mutex) { + ModelInstrument[] inslist_array = + new ModelInstrument[loadedlist.values().size()]; + loadedlist.values().toArray(inslist_array); + Arrays.sort(inslist_array, new ModelInstrumentComparator()); + return inslist_array; + } + } + + public boolean loadAllInstruments(Soundbank soundbank) { + List instruments = new ArrayList(); + for (Instrument ins: soundbank.getInstruments()) { + if (ins == null || !(ins instanceof ModelInstrument)) { + throw new IllegalArgumentException( + "Unsupported instrument: " + ins); + } + instruments.add((ModelInstrument)ins); + } + return loadInstruments(instruments); + } + + public void unloadAllInstruments(Soundbank soundbank) { + if (soundbank == null || !isSoundbankSupported(soundbank)) + throw new IllegalArgumentException("Unsupported soundbank: " + soundbank); + + if (!isOpen()) + return; + + for (Instrument ins: soundbank.getInstruments()) { + if (ins instanceof ModelInstrument) { + unloadInstrument(ins); + } + } + } + + public boolean loadInstruments(Soundbank soundbank, Patch[] patchList) { + List instruments = new ArrayList(); + for (Patch patch: patchList) { + Instrument ins = soundbank.getInstrument(patch); + if (ins == null || !(ins instanceof ModelInstrument)) { + throw new IllegalArgumentException( + "Unsupported instrument: " + ins); + } + instruments.add((ModelInstrument)ins); + } + return loadInstruments(instruments); + } + + public void unloadInstruments(Soundbank soundbank, Patch[] patchList) { + if (soundbank == null || !isSoundbankSupported(soundbank)) + throw new IllegalArgumentException("Unsupported soundbank: " + soundbank); + + if (!isOpen()) + return; + + for (Patch pat: patchList) { + Instrument ins = soundbank.getInstrument(pat); + if (ins instanceof ModelInstrument) { + unloadInstrument(ins); + } + } + } + + public MidiDevice.Info getDeviceInfo() { + return info; + } + + public AudioSynthesizerPropertyInfo[] getPropertyInfo(Map info) { + List list = + new ArrayList(); + + AudioSynthesizerPropertyInfo item; + + // If info != null or synthesizer is closed + // we return how the synthesizer will be set on next open + // If info == null and synthesizer is open + // we return current synthesizer properties. + boolean o = info == null && open; + + item = new AudioSynthesizerPropertyInfo("interpolation", o?resamplerType:"linear"); + item.choices = new String[]{"linear", "linear1", "linear2", "cubic", + "lanczos", "sinc", "point"}; + item.description = "Interpolation method"; + list.add(item); + + item = new AudioSynthesizerPropertyInfo("control rate", o?controlrate:147f); + item.description = "Control rate"; + list.add(item); + + item = new AudioSynthesizerPropertyInfo("format", + o?format:new AudioFormat(44100, 16, 2, true, false)); + item.description = "Default audio format"; + list.add(item); + + item = new AudioSynthesizerPropertyInfo("latency", o?latency:120000L); + item.description = "Default latency"; + list.add(item); + + item = new AudioSynthesizerPropertyInfo("device id", o?deviceid:0); + item.description = "Device ID for SysEx Messages"; + list.add(item); + + item = new AudioSynthesizerPropertyInfo("max polyphony", o?maxpoly:64); + item.description = "Maximum polyphony"; + list.add(item); + + item = new AudioSynthesizerPropertyInfo("reverb", o?reverb_on:true); + item.description = "Turn reverb effect on or off"; + list.add(item); + + item = new AudioSynthesizerPropertyInfo("chorus", o?chorus_on:true); + item.description = "Turn chorus effect on or off"; + list.add(item); + + item = new AudioSynthesizerPropertyInfo("auto gain control", o?agc_on:true); + item.description = "Turn auto gain control on or off"; + list.add(item); + + item = new AudioSynthesizerPropertyInfo("large mode", o?largemode:false); + item.description = "Turn large mode on or off."; + list.add(item); + + item = new AudioSynthesizerPropertyInfo("midi channels", o?channels.length:16); + item.description = "Number of midi channels."; + list.add(item); + + item = new AudioSynthesizerPropertyInfo("jitter correction", o?jitter_correction:true); + item.description = "Turn jitter correction on or off."; + list.add(item); + + item = new AudioSynthesizerPropertyInfo("light reverb", o?reverb_light:true); + item.description = "Turn light reverb mode on or off"; + list.add(item); + + AudioSynthesizerPropertyInfo[] items; + items = list.toArray(new AudioSynthesizerPropertyInfo[list.size()]); + + if (info != null) + for (AudioSynthesizerPropertyInfo item2: items) { + Object v = info.get(item2.name); + Class c = (item2.valueClass); + if (v != null) + if (c.isInstance(v)) + item2.value = v; + } + + return items; + } + + public void open() throws MidiUnavailableException { + if (isOpen()) { + synchronized (control_mutex) { + implicitOpen = false; + } + return; + } + open(null, null); + } + + public void open(SourceDataLine line, Map info) throws MidiUnavailableException { + if (isOpen()) { + synchronized (control_mutex) { + implicitOpen = false; + } + return; + } + synchronized (control_mutex) { + try { + if (line != null) + setFormat(line.getFormat()); + + AudioInputStream ais = openStream(getFormat(), info); + + weakstream = new WeakAudioStream(ais); + ais = weakstream.getAudioInputStream(); + + if (line == null) + { + if(testline != null) + line = testline; + else + line = AudioSystem.getSourceDataLine(getFormat()); + } + + double latency = this.latency; + + if (!line.isOpen()) { + int bufferSize = getFormat().getFrameSize() + * (int)(getFormat().getFrameRate() * (latency/1000000f)); + line.open(getFormat(), bufferSize); + + // Remember that we opened that line + // so we can close again in SoftSynthesizer.close() + sourceDataLine = line; + } + if (!line.isActive()) + line.start(); + + int controlbuffersize = 512; + try { + controlbuffersize = ais.available(); + } catch (IOException e) { + } + + // Tell mixer not fill read buffers fully. + // This lowers latency, and tells DataPusher + // to read in smaller amounts. + //mainmixer.readfully = false; + //pusher = new DataPusher(line, ais); + + int buffersize = line.getBufferSize(); + buffersize -= buffersize % controlbuffersize; + + if (buffersize < 3 * controlbuffersize) + buffersize = 3 * controlbuffersize; + + if (jitter_correction) { + ais = new SoftJitterCorrector(ais, buffersize, + controlbuffersize); + if(weakstream != null) + weakstream.jitter_stream = ais; + } + pusher = new SoftAudioPusher(line, ais, controlbuffersize); + pusher_stream = ais; + pusher.start(); + + if(weakstream != null) + { + weakstream.pusher = pusher; + weakstream.sourceDataLine = sourceDataLine; + } + + + + } catch (LineUnavailableException e) { + if (isOpen()) + close(); + // am: need MidiUnavailableException(Throwable) ctor! + throw new MidiUnavailableException(e.toString()); + } + + } + } + + public AudioInputStream openStream(AudioFormat targetFormat, + Map info) throws MidiUnavailableException { + + if (isOpen()) + throw new MidiUnavailableException("Synthesizer is already open"); + + synchronized (control_mutex) { + + gmmode = 0; + voice_allocation_mode = 0; + + processPropertyInfo(info); + + open = true; + implicitOpen = false; + + if (targetFormat != null) + setFormat(targetFormat); + + Soundbank defbank = getDefaultSoundbank(); + if (defbank != null) { + loadAllInstruments(defbank); + availlist.putAll(loadedlist); + loadedlist.clear(); + } + + voices = new SoftVoice[maxpoly]; + for (int i = 0; i < maxpoly; i++) + voices[i] = new SoftVoice(this); + + mainmixer = new SoftMainMixer(this); + + channels = new SoftChannel[number_of_midi_channels]; + for (int i = 0; i < channels.length; i++) + channels[i] = new SoftChannel(this, i); + + if (external_channels == null) { + // Always create external_channels array + // with 16 or more channels + // so getChannels works correctly + // when the synhtesizer is closed. + if (channels.length < 16) + external_channels = new SoftChannelProxy[16]; + else + external_channels = new SoftChannelProxy[channels.length]; + for (int i = 0; i < external_channels.length; i++) + external_channels[i] = new SoftChannelProxy(); + } else { + // We must resize external_channels array + // but we must also copy the old SoftChannelProxy + // into the new one + if (channels.length > external_channels.length) { + SoftChannelProxy[] new_external_channels + = new SoftChannelProxy[channels.length]; + for (int i = 0; i < external_channels.length; i++) + new_external_channels[i] = external_channels[i]; + for (int i = external_channels.length; + i < new_external_channels.length; i++) { + new_external_channels[i] = new SoftChannelProxy(); + } + } + } + + for (int i = 0; i < channels.length; i++) + external_channels[i].setChannel(channels[i]); + + for (SoftVoice voice: getVoices()) + voice.resampler = resampler.openStreamer(); + + for (Receiver recv: getReceivers()) { + SoftReceiver srecv = ((SoftReceiver)recv); + srecv.open = open; + srecv.mainmixer = mainmixer; + srecv.midimessages = mainmixer.midimessages; + } + + return mainmixer.getInputStream(); + } + } + + public void close() { + + if (!isOpen()) + return; + + SoftAudioPusher pusher_to_be_closed = null; + AudioInputStream pusher_stream_to_be_closed = null; + synchronized (control_mutex) { + if (pusher != null) { + pusher_to_be_closed = pusher; + pusher_stream_to_be_closed = pusher_stream; + pusher = null; + pusher_stream = null; + } + } + + if (pusher_to_be_closed != null) { + // Pusher must not be closed synchronized against control_mutex, + // this may result in synchronized conflict between pusher + // and current thread. + pusher_to_be_closed.stop(); + + try { + pusher_stream_to_be_closed.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + } + + synchronized (control_mutex) { + + if (mainmixer != null) + mainmixer.close(); + open = false; + implicitOpen = false; + mainmixer = null; + voices = null; + channels = null; + + if (external_channels != null) + for (int i = 0; i < external_channels.length; i++) + external_channels[i].setChannel(null); + + if (sourceDataLine != null) { + sourceDataLine.close(); + sourceDataLine = null; + } + + inslist.clear(); + availlist.clear(); + loadedlist.clear(); + tunings.clear(); + + while (recvslist.size() != 0) + recvslist.get(recvslist.size() - 1).close(); + + } + } + + public boolean isOpen() { + synchronized (control_mutex) { + return open; + } + } + + public long getMicrosecondPosition() { + + if (!isOpen()) + return 0; + + synchronized (control_mutex) { + return mainmixer.getMicrosecondPosition(); + } + } + + public int getMaxReceivers() { + return -1; + } + + public int getMaxTransmitters() { + return 0; + } + + public Receiver getReceiver() throws MidiUnavailableException { + + synchronized (control_mutex) { + SoftReceiver receiver = new SoftReceiver(this); + receiver.open = open; + recvslist.add(receiver); + return receiver; + } + } + + public List getReceivers() { + + synchronized (control_mutex) { + ArrayList recvs = new ArrayList(); + recvs.addAll(recvslist); + return recvs; + } + } + + public Transmitter getTransmitter() throws MidiUnavailableException { + + throw new MidiUnavailableException("No transmitter available"); + } + + public List getTransmitters() { + + return new ArrayList(); + } + + public Receiver getReceiverReferenceCounting() + throws MidiUnavailableException { + + if (!isOpen()) { + open(); + synchronized (control_mutex) { + implicitOpen = true; + } + } + + return getReceiver(); + } + + public Transmitter getTransmitterReferenceCounting() + throws MidiUnavailableException { + + throw new MidiUnavailableException("No transmitter available"); + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftTuning.java b/jdk/src/share/classes/com/sun/media/sound/SoftTuning.java new file mode 100644 index 00000000000..a5a1eafe1a4 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftTuning.java @@ -0,0 +1,256 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.UnsupportedEncodingException; + +import javax.sound.midi.Patch; + +/** + * A tuning program container, for use with MIDI Tuning. + * See: http://www.midi.org + * + * @author Karl Helgason + */ +public class SoftTuning { + + private String name = null; + private double[] tuning = new double[128]; + private Patch patch = null; + + public SoftTuning() { + name = "12-TET"; + for (int i = 0; i < tuning.length; i++) + tuning[i] = i * 100; + } + + public SoftTuning(byte[] data) { + for (int i = 0; i < tuning.length; i++) + tuning[i] = i * 100; + load(data); + } + + public SoftTuning(Patch patch) { + this.patch = patch; + name = "12-TET"; + for (int i = 0; i < tuning.length; i++) + tuning[i] = i * 100; + } + + public SoftTuning(Patch patch, byte[] data) { + this.patch = patch; + for (int i = 0; i < tuning.length; i++) + tuning[i] = i * 100; + load(data); + } + + private boolean checksumOK(byte[] data) { + int x = data[1] & 0xFF; + for (int i = 2; i < data.length - 2; i++) + x = x ^ (data[i] & 0xFF); + return (data[data.length - 2] & 0xFF) == (x & 127); + } + + /* + private boolean checksumOK2(byte[] data) { + int x = data[1] & 0xFF; // 7E + x = x ^ (data[2] & 0xFF); // + x = x ^ (data[4] & 0xFF); // nn + x = x ^ (data[5] & 0xFF); // tt + for (int i = 22; i < data.length - 2; i++) + x = x ^ (data[i] & 0xFF); + return (data[data.length - 2] & 0xFF) == (x & 127); + } + */ + public void load(byte[] data) { + // Universal Non-Real-Time / Real-Time SysEx + if ((data[1] & 0xFF) == 0x7E || (data[1] & 0xFF) == 0x7F) { + int subid1 = data[3] & 0xFF; + switch (subid1) { + case 0x08: // MIDI Tuning Standard + int subid2 = data[4] & 0xFF; + switch (subid2) { + case 0x01: // BULK TUNING DUMP (NON-REAL-TIME) + { + // http://www.midi.org/about-midi/tuning.shtml + //if (!checksumOK2(data)) + // break; + try { + name = new String(data, 6, 16, "ascii"); + } catch (UnsupportedEncodingException e) { + name = null; + } + int r = 22; + for (int i = 0; i < 128; i++) { + int xx = data[r++] & 0xFF; + int yy = data[r++] & 0xFF; + int zz = data[r++] & 0xFF; + if (!(xx == 127 && yy == 127 && zz == 127)) + tuning[i] = 100.0 * + (((xx * 16384) + (yy * 128) + zz) / 16384.0); + } + break; + } + case 0x02: // SINGLE NOTE TUNING CHANGE (REAL-TIME) + { + // http://www.midi.org/about-midi/tuning.shtml + int ll = data[6] & 0xFF; + int r = 7; + for (int i = 0; i < ll; i++) { + int kk = data[r++] & 0xFF; + int xx = data[r++] & 0xFF; + int yy = data[r++] & 0xFF; + int zz = data[r++] & 0xFF; + if (!(xx == 127 && yy == 127 && zz == 127)) + tuning[kk] = 100.0*(((xx*16384) + (yy*128) + zz)/16384.0); + } + break; + } + case 0x04: // KEY-BASED TUNING DUMP (NON-REAL-TIME) + { + // http://www.midi.org/about-midi/tuning_extens.shtml + if (!checksumOK(data)) + break; + try { + name = new String(data, 7, 16, "ascii"); + } catch (UnsupportedEncodingException e) { + name = null; + } + int r = 23; + for (int i = 0; i < 128; i++) { + int xx = data[r++] & 0xFF; + int yy = data[r++] & 0xFF; + int zz = data[r++] & 0xFF; + if (!(xx == 127 && yy == 127 && zz == 127)) + tuning[i] = 100.0*(((xx*16384) + (yy*128) + zz)/16384.0); + } + break; + } + case 0x05: // SCALE/OCTAVE TUNING DUMP, 1 byte format + // (NON-REAL-TIME) + { + // http://www.midi.org/about-midi/tuning_extens.shtml + if (!checksumOK(data)) + break; + try { + name = new String(data, 7, 16, "ascii"); + } catch (UnsupportedEncodingException e) { + name = null; + } + int[] octave_tuning = new int[12]; + for (int i = 0; i < 12; i++) + octave_tuning[i] = (data[i + 23] & 0xFF) - 64; + for (int i = 0; i < tuning.length; i++) + tuning[i] = i * 100 + octave_tuning[i % 12]; + break; + } + case 0x06: // SCALE/OCTAVE TUNING DUMP, 2 byte format + // (NON-REAL-TIME) + { + // http://www.midi.org/about-midi/tuning_extens.shtml + if (!checksumOK(data)) + break; + try { + name = new String(data, 7, 16, "ascii"); + } catch (UnsupportedEncodingException e) { + name = null; + } + double[] octave_tuning = new double[12]; + for (int i = 0; i < 12; i++) { + int v = (data[i * 2 + 23] & 0xFF) * 128 + + (data[i * 2 + 24] & 0xFF); + octave_tuning[i] = (v / 8192.0 - 1) * 100.0; + } + for (int i = 0; i < tuning.length; i++) + tuning[i] = i * 100 + octave_tuning[i % 12]; + break; + } + case 0x07: // SINGLE NOTE TUNING CHANGE (NON + // REAL-TIME/REAL-TIME) (BANK) + // http://www.midi.org/about-midi/tuning_extens.shtml + int ll = data[7] & 0xFF; + int r = 8; + for (int i = 0; i < ll; i++) { + int kk = data[r++] & 0xFF; + int xx = data[r++] & 0xFF; + int yy = data[r++] & 0xFF; + int zz = data[r++] & 0xFF; + if (!(xx == 127 && yy == 127 && zz == 127)) + tuning[kk] = 100.0 + * (((xx*16384) + (yy*128) + zz) / 16384.0); + } + break; + case 0x08: // scale/octave tuning 1-byte form (Non + // Real-Time/REAL-TIME) + { + // http://www.midi.org/about-midi/tuning-scale.shtml + int[] octave_tuning = new int[12]; + for (int i = 0; i < 12; i++) + octave_tuning[i] = (data[i + 8] & 0xFF) - 64; + for (int i = 0; i < tuning.length; i++) + tuning[i] = i * 100 + octave_tuning[i % 12]; + break; + } + case 0x09: // scale/octave tuning 2-byte form (Non + // Real-Time/REAL-TIME) + { + // http://www.midi.org/about-midi/tuning-scale.shtml + double[] octave_tuning = new double[12]; + for (int i = 0; i < 12; i++) { + int v = (data[i * 2 + 8] & 0xFF) * 128 + + (data[i * 2 + 9] & 0xFF); + octave_tuning[i] = (v / 8192.0 - 1) * 100.0; + } + for (int i = 0; i < tuning.length; i++) + tuning[i] = i * 100 + octave_tuning[i % 12]; + break; + } + default: + break; + } + } + } + } + + public double[] getTuning() { + return tuning; + } + + public double getTuning(int noteNumber) { + return tuning[noteNumber]; + } + + public Patch getPatch() { + return patch; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/SoftVoice.java b/jdk/src/share/classes/com/sun/media/sound/SoftVoice.java new file mode 100644 index 00000000000..49662b78706 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/SoftVoice.java @@ -0,0 +1,841 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.IOException; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import javax.sound.midi.VoiceStatus; + +/** + * Software synthesizer voice class. + * + * @author Karl Helgason + */ +public class SoftVoice extends VoiceStatus { + + public int exclusiveClass = 0; + public boolean releaseTriggered = false; + private int noteOn_noteNumber = 0; + private int noteOn_velocity = 0; + private int noteOff_velocity = 0; + protected ModelChannelMixer channelmixer = null; + protected double tunedKey = 0; + protected SoftTuning tuning = null; + protected SoftChannel stealer_channel = null; + protected ModelConnectionBlock[] stealer_extendedConnectionBlocks = null; + protected SoftPerformer stealer_performer = null; + protected ModelChannelMixer stealer_channelmixer = null; + protected int stealer_voiceID = -1; + protected int stealer_noteNumber = 0; + protected int stealer_velocity = 0; + protected boolean stealer_releaseTriggered = false; + protected int voiceID = -1; + protected boolean sustain = false; + protected boolean sostenuto = false; + protected boolean portamento = false; + private SoftFilter filter_left; + private SoftFilter filter_right; + private SoftProcess eg = new SoftEnvelopeGenerator(); + private SoftProcess lfo = new SoftLowFrequencyOscillator(); + protected Map objects = + new HashMap(); + protected SoftSynthesizer synthesizer; + protected SoftInstrument instrument; + protected SoftPerformer performer; + protected SoftChannel softchannel = null; + protected boolean on = false; + private boolean audiostarted = false; + private boolean started = false; + private boolean stopping = false; + private float osc_attenuation = 0.0f; + private ModelOscillatorStream osc_stream; + private int osc_stream_nrofchannels; + private float[][] osc_buff = new float[2][]; + private boolean osc_stream_off_transmitted = false; + private boolean out_mixer_end = false; + private float out_mixer_left = 0; + private float out_mixer_right = 0; + private float out_mixer_effect1 = 0; + private float out_mixer_effect2 = 0; + private float last_out_mixer_left = 0; + private float last_out_mixer_right = 0; + private float last_out_mixer_effect1 = 0; + private float last_out_mixer_effect2 = 0; + protected ModelConnectionBlock[] extendedConnectionBlocks = null; + private ModelConnectionBlock[] connections; + // Last value added to destination + private double[] connections_last = new double[50]; + // Pointer to source value + private double[][][] connections_src = new double[50][3][]; + // Key-based override (if any) + private int[][] connections_src_kc = new int[50][3]; + // Pointer to destination value + private double[][] connections_dst = new double[50][]; + private boolean soundoff = false; + private float lastMuteValue = 0; + private float lastSoloMuteValue = 0; + protected double[] co_noteon_keynumber = new double[1]; + protected double[] co_noteon_velocity = new double[1]; + protected double[] co_noteon_on = new double[1]; + private SoftControl co_noteon = new SoftControl() { + double[] keynumber = co_noteon_keynumber; + double[] velocity = co_noteon_velocity; + double[] on = co_noteon_on; + public double[] get(int instance, String name) { + if (name == null) + return null; + if (name.equals("keynumber")) + return keynumber; + if (name.equals("velocity")) + return velocity; + if (name.equals("on")) + return on; + return null; + } + }; + private double[] co_mixer_active = new double[1]; + private double[] co_mixer_gain = new double[1]; + private double[] co_mixer_pan = new double[1]; + private double[] co_mixer_balance = new double[1]; + private double[] co_mixer_reverb = new double[1]; + private double[] co_mixer_chorus = new double[1]; + private SoftControl co_mixer = new SoftControl() { + double[] active = co_mixer_active; + double[] gain = co_mixer_gain; + double[] pan = co_mixer_pan; + double[] balance = co_mixer_balance; + double[] reverb = co_mixer_reverb; + double[] chorus = co_mixer_chorus; + public double[] get(int instance, String name) { + if (name == null) + return null; + if (name.equals("active")) + return active; + if (name.equals("gain")) + return gain; + if (name.equals("pan")) + return pan; + if (name.equals("balance")) + return balance; + if (name.equals("reverb")) + return reverb; + if (name.equals("chorus")) + return chorus; + return null; + } + }; + private double[] co_osc_pitch = new double[1]; + private SoftControl co_osc = new SoftControl() { + double[] pitch = co_osc_pitch; + public double[] get(int instance, String name) { + if (name == null) + return null; + if (name.equals("pitch")) + return pitch; + return null; + } + }; + private double[] co_filter_freq = new double[1]; + private double[] co_filter_type = new double[1]; + private double[] co_filter_q = new double[1]; + private SoftControl co_filter = new SoftControl() { + double[] freq = co_filter_freq; + double[] ftype = co_filter_type; + double[] q = co_filter_q; + public double[] get(int instance, String name) { + if (name == null) + return null; + if (name.equals("freq")) + return freq; + if (name.equals("type")) + return ftype; + if (name.equals("q")) + return q; + return null; + } + }; + protected SoftResamplerStreamer resampler; + private int nrofchannels; + + public SoftVoice(SoftSynthesizer synth) { + synthesizer = synth; + filter_left = new SoftFilter(synth.getFormat().getSampleRate()); + filter_right = new SoftFilter(synth.getFormat().getSampleRate()); + nrofchannels = synth.getFormat().getChannels(); + } + + private int getValueKC(ModelIdentifier id) { + if (id.getObject().equals("midi_cc")) { + int ic = Integer.parseInt(id.getVariable()); + if (ic != 0 && ic != 32) { + if (ic < 120) + return ic; + } + } else if (id.getObject().equals("midi_rpn")) { + if (id.getVariable().equals("1")) + return 120; // Fine tuning + if (id.getVariable().equals("2")) + return 121; // Coarse tuning + } + return -1; + } + + private double[] getValue(ModelIdentifier id) { + SoftControl o = objects.get(id.getObject()); + if (o == null) + return null; + return o.get(id.getInstance(), id.getVariable()); + } + + private double transformValue(double value, ModelSource src) { + if (src.getTransform() != null) + return src.getTransform().transform(value); + else + return value; + } + + private double transformValue(double value, ModelDestination dst) { + if (dst.getTransform() != null) + return dst.getTransform().transform(value); + else + return value; + } + + private double processKeyBasedController(double value, int keycontrol) { + if (keycontrol == -1) + return value; + if (softchannel.keybasedcontroller_active != null) + if (softchannel.keybasedcontroller_active[note] != null) + if (softchannel.keybasedcontroller_active[note][keycontrol]) { + double key_controlvalue = + softchannel.keybasedcontroller_value[note][keycontrol]; + if (keycontrol == 10 || keycontrol == 91 || keycontrol == 93) + return key_controlvalue; + value += key_controlvalue * 2.0 - 1.0; + if (value > 1) + value = 1; + else if (value < 0) + value = 0; + } + return value; + } + + private void processConnection(int ix) { + ModelConnectionBlock conn = connections[ix]; + double[][] src = connections_src[ix]; + double[] dst = connections_dst[ix]; + if (dst == null || Double.isInfinite(dst[0])) + return; + + double value = conn.getScale(); + if (softchannel.keybasedcontroller_active == null) { + ModelSource[] srcs = conn.getSources(); + for (int i = 0; i < srcs.length; i++) { + value *= transformValue(src[i][0], srcs[i]); + if (value == 0) + break; + } + } else { + ModelSource[] srcs = conn.getSources(); + int[] src_kc = connections_src_kc[ix]; + for (int i = 0; i < srcs.length; i++) { + value *= transformValue(processKeyBasedController(src[i][0], + src_kc[i]), srcs[i]); + if (value == 0) + break; + } + } + + value = transformValue(value, conn.getDestination()); + dst[0] = dst[0] - connections_last[ix] + value; + connections_last[ix] = value; + // co_mixer_gain[0] = 0; + } + + protected void updateTuning(SoftTuning newtuning) { + tunedKey = tuning.getTuning(note) / 100.0; + if (!portamento) { + co_noteon_keynumber[0] = tunedKey * (1.0 / 128.0); + int[] c = performer.midi_connections[4]; + if (c == null) + return; + for (int i = 0; i < c.length; i++) + processConnection(c[i]); + } + } + + protected void setNote(int noteNumber) { + note = noteNumber; + tunedKey = tuning.getTuning(noteNumber) / 100.0; + } + + protected void noteOn(int noteNumber, int velocity) { + + sustain = false; + sostenuto = false; + portamento = false; + + soundoff = false; + on = true; + active = true; + started = true; + // volume = velocity; + + noteOn_noteNumber = noteNumber; + noteOn_velocity = velocity; + + lastMuteValue = 0; + lastSoloMuteValue = 0; + + setNote(noteNumber); + + if (performer.forcedKeynumber) + co_noteon_keynumber[0] = 0; + else + co_noteon_keynumber[0] = tunedKey * (1f / 128f); + if (performer.forcedVelocity) + co_noteon_velocity[0] = 0; + else + co_noteon_velocity[0] = velocity * (1f / 128f); + co_mixer_active[0] = 0; + co_mixer_gain[0] = 0; + co_mixer_pan[0] = 0; + co_mixer_balance[0] = 0; + co_mixer_reverb[0] = 0; + co_mixer_chorus[0] = 0; + co_osc_pitch[0] = 0; + co_filter_freq[0] = 0; + co_filter_q[0] = 0; + co_filter_type[0] = 0; + co_noteon_on[0] = 1; + + eg.reset(); + lfo.reset(); + filter_left.reset(); + filter_right.reset(); + + objects.put("master", synthesizer.getMainMixer().co_master); + objects.put("eg", eg); + objects.put("lfo", lfo); + objects.put("noteon", co_noteon); + objects.put("osc", co_osc); + objects.put("mixer", co_mixer); + objects.put("filter", co_filter); + + connections = performer.connections; + + if (connections_last == null + || connections_last.length < connections.length) { + connections_last = new double[connections.length]; + } + if (connections_src == null + || connections_src.length < connections.length) { + connections_src = new double[connections.length][][]; + connections_src_kc = new int[connections.length][]; + } + if (connections_dst == null + || connections_dst.length < connections.length) { + connections_dst = new double[connections.length][]; + } + for (int i = 0; i < connections.length; i++) { + ModelConnectionBlock conn = connections[i]; + connections_last[i] = 0; + if (conn.getSources() != null) { + ModelSource[] srcs = conn.getSources(); + if (connections_src[i] == null + || connections_src[i].length < srcs.length) { + connections_src[i] = new double[srcs.length][]; + connections_src_kc[i] = new int[srcs.length]; + } + double[][] src = connections_src[i]; + int[] src_kc = connections_src_kc[i]; + connections_src[i] = src; + for (int j = 0; j < srcs.length; j++) { + src_kc[j] = getValueKC(srcs[j].getIdentifier()); + src[j] = getValue(srcs[j].getIdentifier()); + } + } + + if (conn.getDestination() != null) + connections_dst[i] = getValue(conn.getDestination() + .getIdentifier()); + else + connections_dst[i] = null; + } + + for (int i = 0; i < connections.length; i++) + processConnection(i); + + if (extendedConnectionBlocks != null) { + for (ModelConnectionBlock connection: extendedConnectionBlocks) { + double value = 0; + + if (softchannel.keybasedcontroller_active == null) { + for (ModelSource src: connection.getSources()) { + double x = getValue(src.getIdentifier())[0]; + ModelTransform t = src.getTransform(); + if (t == null) + value += x; + else + value += t.transform(x); + } + } else { + for (ModelSource src: connection.getSources()) { + double x = getValue(src.getIdentifier())[0]; + x = processKeyBasedController(x, + getValueKC(src.getIdentifier())); + ModelTransform t = src.getTransform(); + if (t == null) + value += x; + else + value += t.transform(x); + } + } + + ModelDestination dest = connection.getDestination(); + ModelTransform t = dest.getTransform(); + if (t != null) + value = t.transform(value); + getValue(dest.getIdentifier())[0] += value; + } + } + + eg.init(synthesizer); + lfo.init(synthesizer); + + } + + protected void setPolyPressure(int pressure) { + int[] c = performer.midi_connections[2]; + if (c == null) + return; + for (int i = 0; i < c.length; i++) + processConnection(c[i]); + } + + protected void setChannelPressure(int pressure) { + int[] c = performer.midi_connections[1]; + if (c == null) + return; + for (int i = 0; i < c.length; i++) + processConnection(c[i]); + } + + protected void controlChange(int controller, int value) { + int[] c = performer.midi_ctrl_connections[controller]; + if (c == null) + return; + for (int i = 0; i < c.length; i++) + processConnection(c[i]); + } + + protected void nrpnChange(int controller, int value) { + int[] c = performer.midi_nrpn_connections.get(controller); + if (c == null) + return; + for (int i = 0; i < c.length; i++) + processConnection(c[i]); + } + + protected void rpnChange(int controller, int value) { + int[] c = performer.midi_rpn_connections.get(controller); + if (c == null) + return; + for (int i = 0; i < c.length; i++) + processConnection(c[i]); + } + + protected void setPitchBend(int bend) { + int[] c = performer.midi_connections[0]; + if (c == null) + return; + for (int i = 0; i < c.length; i++) + processConnection(c[i]); + } + + protected void setMute(boolean mute) { + co_mixer_gain[0] -= lastMuteValue; + lastMuteValue = mute ? -960 : 0; + co_mixer_gain[0] += lastMuteValue; + } + + protected void setSoloMute(boolean mute) { + co_mixer_gain[0] -= lastSoloMuteValue; + lastSoloMuteValue = mute ? -960 : 0; + co_mixer_gain[0] += lastSoloMuteValue; + } + + protected void shutdown() { + if (co_noteon_on[0] < -0.5) + return; + on = false; + + co_noteon_on[0] = -1; + + int[] c = performer.midi_connections[3]; + if (c == null) + return; + for (int i = 0; i < c.length; i++) + processConnection(c[i]); + } + + protected void soundOff() { + on = false; + soundoff = true; + } + + protected void noteOff(int velocity) { + if (!on) + return; + on = false; + + noteOff_velocity = velocity; + + if (softchannel.sustain) { + sustain = true; + return; + } + if (sostenuto) + return; + + co_noteon_on[0] = 0; + + int[] c = performer.midi_connections[3]; + if (c == null) + return; + for (int i = 0; i < c.length; i++) + processConnection(c[i]); + } + + protected void redamp() { + if (co_noteon_on[0] > 0.5) + return; + if (co_noteon_on[0] < -0.5) + return; // don't redamp notes in shutdown stage + + sustain = true; + co_noteon_on[0] = 1; + + int[] c = performer.midi_connections[3]; + if (c == null) + return; + for (int i = 0; i < c.length; i++) + processConnection(c[i]); + } + + protected void processControlLogic() { + if (stopping) { + active = false; + stopping = false; + audiostarted = false; + if (osc_stream != null) + try { + osc_stream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + + if (stealer_channel != null) { + stealer_channel.initVoice(this, stealer_performer, + stealer_voiceID, stealer_noteNumber, stealer_velocity, + stealer_extendedConnectionBlocks, stealer_channelmixer, + stealer_releaseTriggered); + stealer_releaseTriggered = false; + stealer_channel = null; + stealer_performer = null; + stealer_voiceID = -1; + stealer_noteNumber = 0; + stealer_velocity = 0; + stealer_extendedConnectionBlocks = null; + stealer_channelmixer = null; + } + } + if (started) { + audiostarted = true; + + ModelOscillator osc = performer.oscillators[0]; + + osc_stream_off_transmitted = false; + if (osc instanceof ModelWavetable) { + try { + resampler.open((ModelWavetable)osc, + synthesizer.getFormat().getSampleRate()); + osc_stream = resampler; + } catch (IOException e) { + //e.printStackTrace(); + } + } else { + osc_stream = osc.open(synthesizer.getFormat().getSampleRate()); + } + osc_attenuation = osc.getAttenuation(); + osc_stream_nrofchannels = osc.getChannels(); + if (osc_buff == null || osc_buff.length < osc_stream_nrofchannels) + osc_buff = new float[osc_stream_nrofchannels][]; + + if (osc_stream != null) + osc_stream.noteOn(softchannel, this, noteOn_noteNumber, + noteOn_velocity); + + + } + if (audiostarted) { + if (portamento) { + double note_delta = tunedKey - (co_noteon_keynumber[0] * 128); + double note_delta_a = Math.abs(note_delta); + if (note_delta_a < 0.0000000001) { + co_noteon_keynumber[0] = tunedKey * (1.0 / 128.0); + portamento = false; + } else { + if (note_delta_a > softchannel.portamento_time) + note_delta = Math.signum(note_delta) + * softchannel.portamento_time; + co_noteon_keynumber[0] += note_delta * (1.0 / 128.0); + } + + int[] c = performer.midi_connections[4]; + if (c == null) + return; + for (int i = 0; i < c.length; i++) + processConnection(c[i]); + } + + eg.processControlLogic(); + lfo.processControlLogic(); + + for (int i = 0; i < performer.ctrl_connections.length; i++) + processConnection(performer.ctrl_connections[i]); + + osc_stream.setPitch((float)co_osc_pitch[0]); + + int filter_type = (int)co_filter_type[0]; + double filter_freq; + + if (co_filter_freq[0] == 13500.0) + filter_freq = 19912.126958213175; + else + filter_freq = 440.0 * Math.exp( + ((co_filter_freq[0]) - 6900.0) * + (Math.log(2.0) / 1200.0)); + /* + filter_freq = 440.0 * Math.pow(2.0, + ((co_filter_freq[0]) - 6900.0) / 1200.0);*/ + /* + * double velocity = co_noteon_velocity[0]; if(velocity < 0.5) + * filter_freq *= ((velocity * 2)*0.75 + 0.25); + */ + + double q = co_filter_q[0] / 10.0; + filter_left.setFilterType(filter_type); + filter_left.setFrequency(filter_freq); + filter_left.setResonance(q); + filter_right.setFilterType(filter_type); + filter_right.setFrequency(filter_freq); + filter_right.setResonance(q); + /* + float gain = (float) Math.pow(10, + (-osc_attenuation + co_mixer_gain[0]) / 200.0); + */ + float gain = (float)Math.exp( + (-osc_attenuation + co_mixer_gain[0])*(Math.log(10) / 200.0)); + + if (co_mixer_gain[0] <= -960) + gain = 0; + + if (soundoff) { + stopping = true; + gain = 0; + /* + * if(co_mixer_gain[0] > -960) + * co_mixer_gain[0] -= 960; + */ + } + + volume = (int)(Math.sqrt(gain) * 128); + + // gain *= 0.2; + + double pan = co_mixer_pan[0] * (1.0 / 1000.0); + // System.out.println("pan = " + pan); + if (pan < 0) + pan = 0; + else if (pan > 1) + pan = 1; + + if (pan == 0.5) { + out_mixer_left = gain * 0.7071067811865476f; + out_mixer_right = out_mixer_left; + } else { + out_mixer_left = gain * (float)Math.cos(pan * Math.PI * 0.5); + out_mixer_right = gain * (float)Math.sin(pan * Math.PI * 0.5); + } + + double balance = co_mixer_balance[0] * (1.0 / 1000.0); + if (balance != 0.5) { + if (balance > 0.5) + out_mixer_left *= (1 - balance) * 2; + else + out_mixer_right *= balance * 2; + } + + if (synthesizer.reverb_on) { + out_mixer_effect1 = (float)(co_mixer_reverb[0] * (1.0 / 1000.0)); + out_mixer_effect1 *= gain; + } else + out_mixer_effect1 = 0; + if (synthesizer.chorus_on) { + out_mixer_effect2 = (float)(co_mixer_chorus[0] * (1.0 / 1000.0)); + out_mixer_effect2 *= gain; + } else + out_mixer_effect2 = 0; + out_mixer_end = co_mixer_active[0] < 0.5; + + if (!on) + if (!osc_stream_off_transmitted) { + osc_stream_off_transmitted = true; + if (osc_stream != null) + osc_stream.noteOff(noteOff_velocity); + } + + } + if (started) { + last_out_mixer_left = out_mixer_left; + last_out_mixer_right = out_mixer_right; + last_out_mixer_effect1 = out_mixer_effect1; + last_out_mixer_effect2 = out_mixer_effect2; + started = false; + } + + } + + protected void mixAudioStream(SoftAudioBuffer in, SoftAudioBuffer out, + float amp_from, float amp_to) { + int bufferlen = in.getSize(); + if (amp_from < 0.000000001 && amp_to < 0.000000001) + return; + if (amp_from == amp_to) { + float[] fout = out.array(); + float[] fin = in.array(); + for (int i = 0; i < bufferlen; i++) + fout[i] += fin[i] * amp_to; + } else { + float amp = amp_from; + float amp_delta = (amp_to - amp_from) / bufferlen; + float[] fout = out.array(); + float[] fin = in.array(); + for (int i = 0; i < bufferlen; i++) { + amp += amp_delta; + fout[i] += fin[i] * amp; + } + } + + } + + protected void processAudioLogic(SoftAudioBuffer[] buffer) { + if (!audiostarted) + return; + + int bufferlen = buffer[0].getSize(); + + try { + osc_buff[0] = buffer[SoftMainMixer.CHANNEL_LEFT_DRY].array(); + if (nrofchannels != 1) + osc_buff[1] = buffer[SoftMainMixer.CHANNEL_RIGHT_DRY].array(); + int ret = osc_stream.read(osc_buff, 0, bufferlen); + if (ret == -1) { + stopping = true; + return; + } + if (ret != bufferlen) { + Arrays.fill(osc_buff[0], ret, bufferlen, 0f); + if (nrofchannels != 1) + Arrays.fill(osc_buff[1], ret, bufferlen, 0f); + } + + } catch (IOException e) { + //e.printStackTrace(); + } + + SoftAudioBuffer left = buffer[SoftMainMixer.CHANNEL_LEFT]; + SoftAudioBuffer right = buffer[SoftMainMixer.CHANNEL_RIGHT]; + SoftAudioBuffer eff1 = buffer[SoftMainMixer.CHANNEL_EFFECT1]; + SoftAudioBuffer eff2 = buffer[SoftMainMixer.CHANNEL_EFFECT2]; + SoftAudioBuffer leftdry = buffer[SoftMainMixer.CHANNEL_LEFT_DRY]; + SoftAudioBuffer rightdry = buffer[SoftMainMixer.CHANNEL_RIGHT_DRY]; + + if (osc_stream_nrofchannels == 1) + rightdry = null; + + if (!Double.isInfinite(co_filter_freq[0])) { + filter_left.processAudio(leftdry); + if (rightdry != null) + filter_right.processAudio(rightdry); + } + + if (nrofchannels == 1) { + out_mixer_left = (out_mixer_left + out_mixer_right) / 2; + mixAudioStream(leftdry, left, last_out_mixer_left, out_mixer_left); + if (rightdry != null) + mixAudioStream(rightdry, left, last_out_mixer_left, + out_mixer_left); + } else { + mixAudioStream(leftdry, left, last_out_mixer_left, out_mixer_left); + if (rightdry != null) + mixAudioStream(rightdry, right, last_out_mixer_right, + out_mixer_right); + else + mixAudioStream(leftdry, right, last_out_mixer_right, + out_mixer_right); + } + + if (rightdry == null) { + mixAudioStream(leftdry, eff1, last_out_mixer_effect1, + out_mixer_effect1); + mixAudioStream(leftdry, eff2, last_out_mixer_effect2, + out_mixer_effect2); + } else { + mixAudioStream(leftdry, eff1, last_out_mixer_effect1 * 0.5f, + out_mixer_effect1 * 0.5f); + mixAudioStream(leftdry, eff2, last_out_mixer_effect2 * 0.5f, + out_mixer_effect2 * 0.5f); + mixAudioStream(rightdry, eff1, last_out_mixer_effect1 * 0.5f, + out_mixer_effect1 * 0.5f); + mixAudioStream(rightdry, eff2, last_out_mixer_effect2 * 0.5f, + out_mixer_effect2 * 0.5f); + } + + last_out_mixer_left = out_mixer_left; + last_out_mixer_right = out_mixer_right; + last_out_mixer_effect1 = out_mixer_effect1; + last_out_mixer_effect2 = out_mixer_effect2; + + if (out_mixer_end) { + stopping = true; + } + + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/WaveExtensibleFileReader.java b/jdk/src/share/classes/com/sun/media/sound/WaveExtensibleFileReader.java new file mode 100644 index 00000000000..8f9effee351 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/WaveExtensibleFileReader.java @@ -0,0 +1,339 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +import javax.sound.sampled.AudioFileFormat; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.UnsupportedAudioFileException; +import javax.sound.sampled.AudioFormat.Encoding; +import javax.sound.sampled.spi.AudioFileReader; + +/** + * WAVE file reader for files using format WAVE_FORMAT_EXTENSIBLE (0xFFFE). + * + * @author Karl Helgason + */ +public class WaveExtensibleFileReader extends AudioFileReader { + + static private class GUID { + long i1; + + int s1; + + int s2; + + int x1; + + int x2; + + int x3; + + int x4; + + int x5; + + int x6; + + int x7; + + int x8; + + private GUID() { + } + + public GUID(long i1, int s1, int s2, int x1, int x2, int x3, int x4, + int x5, int x6, int x7, int x8) { + this.i1 = i1; + this.s1 = s1; + this.s2 = s2; + this.x1 = x1; + this.x2 = x2; + this.x3 = x3; + this.x4 = x4; + this.x5 = x5; + this.x6 = x6; + this.x7 = x7; + this.x8 = x8; + } + + public static GUID read(RIFFReader riff) throws IOException { + GUID d = new GUID(); + d.i1 = riff.readUnsignedInt(); + d.s1 = riff.readUnsignedShort(); + d.s2 = riff.readUnsignedShort(); + d.x1 = riff.readUnsignedByte(); + d.x2 = riff.readUnsignedByte(); + d.x3 = riff.readUnsignedByte(); + d.x4 = riff.readUnsignedByte(); + d.x5 = riff.readUnsignedByte(); + d.x6 = riff.readUnsignedByte(); + d.x7 = riff.readUnsignedByte(); + d.x8 = riff.readUnsignedByte(); + return d; + } + + public int hashCode() { + return (int) i1; + } + + public boolean equals(Object obj) { + if (!(obj instanceof GUID)) + return false; + GUID t = (GUID) obj; + if (i1 != t.i1) + return false; + if (s1 != t.s1) + return false; + if (s2 != t.s2) + return false; + if (x1 != t.x1) + return false; + if (x2 != t.x2) + return false; + if (x3 != t.x3) + return false; + if (x4 != t.x4) + return false; + if (x5 != t.x5) + return false; + if (x6 != t.x6) + return false; + if (x7 != t.x7) + return false; + if (x8 != t.x8) + return false; + return true; + } + + } + + private static String[] channelnames = { "FL", "FR", "FC", "LF", + "BL", + "BR", // 5.1 + "FLC", "FLR", "BC", "SL", "SR", "TC", "TFL", "TFC", "TFR", "TBL", + "TBC", "TBR" }; + + private static String[] allchannelnames = { "w1", "w2", "w3", "w4", "w5", + "w6", "w7", "w8", "w9", "w10", "w11", "w12", "w13", "w14", "w15", + "w16", "w17", "w18", "w19", "w20", "w21", "w22", "w23", "w24", + "w25", "w26", "w27", "w28", "w29", "w30", "w31", "w32", "w33", + "w34", "w35", "w36", "w37", "w38", "w39", "w40", "w41", "w42", + "w43", "w44", "w45", "w46", "w47", "w48", "w49", "w50", "w51", + "w52", "w53", "w54", "w55", "w56", "w57", "w58", "w59", "w60", + "w61", "w62", "w63", "w64" }; + + private static GUID SUBTYPE_PCM = new GUID(0x00000001, 0x0000, 0x0010, + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); + + private static GUID SUBTYPE_IEEE_FLOAT = new GUID(0x00000003, 0x0000, + 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); + + private String decodeChannelMask(long channelmask) { + StringBuffer sb = new StringBuffer(); + long m = 1; + for (int i = 0; i < allchannelnames.length; i++) { + if ((channelmask & m) != 0L) { + if (i < channelnames.length) { + sb.append(channelnames[i] + " "); + } else { + sb.append(allchannelnames[i] + " "); + } + } + m *= 2L; + } + if (sb.length() == 0) + return null; + return sb.substring(0, sb.length() - 1); + + } + + public AudioFileFormat getAudioFileFormat(InputStream stream) + throws UnsupportedAudioFileException, IOException { + + stream.mark(200); + AudioFileFormat format; + try { + format = internal_getAudioFileFormat(stream); + } finally { + stream.reset(); + } + return format; + } + + private AudioFileFormat internal_getAudioFileFormat(InputStream stream) + throws UnsupportedAudioFileException, IOException { + + RIFFReader riffiterator = new RIFFReader(stream); + if (!riffiterator.getFormat().equals("RIFF")) + throw new UnsupportedAudioFileException(); + if (!riffiterator.getType().equals("WAVE")) + throw new UnsupportedAudioFileException(); + + boolean fmt_found = false; + boolean data_found = false; + + int channels = 1; + long samplerate = 1; + // long framerate = 1; + int framesize = 1; + int bits = 1; + int validBitsPerSample = 1; + long channelMask = 0; + GUID subFormat = null; + + while (riffiterator.hasNextChunk()) { + RIFFReader chunk = riffiterator.nextChunk(); + + if (chunk.getFormat().equals("fmt ")) { + fmt_found = true; + + int format = chunk.readUnsignedShort(); + if (format != 0xFFFE) + throw new UnsupportedAudioFileException(); // WAVE_FORMAT_EXTENSIBLE + // only + channels = chunk.readUnsignedShort(); + samplerate = chunk.readUnsignedInt(); + /* framerate = */chunk.readUnsignedInt(); + framesize = chunk.readUnsignedShort(); + bits = chunk.readUnsignedShort(); + int cbSize = chunk.readUnsignedShort(); + if (cbSize != 22) + throw new UnsupportedAudioFileException(); + validBitsPerSample = chunk.readUnsignedShort(); + if (validBitsPerSample > bits) + throw new UnsupportedAudioFileException(); + channelMask = chunk.readUnsignedInt(); + subFormat = GUID.read(chunk); + + } + if (chunk.getFormat().equals("data")) { + data_found = true; + break; + } + } + + if (!fmt_found) + throw new UnsupportedAudioFileException(); + if (!data_found) + throw new UnsupportedAudioFileException(); + + Map p = new HashMap(); + String s_channelmask = decodeChannelMask(channelMask); + if (s_channelmask != null) + p.put("channelOrder", s_channelmask); + if (channelMask != 0) + p.put("channelMask", channelMask); + // validBitsPerSample is only informational for PCM data, + // data is still encode according to SampleSizeInBits. + p.put("validBitsPerSample", validBitsPerSample); + + AudioFormat audioformat = null; + if (subFormat.equals(SUBTYPE_PCM)) { + if (bits == 8) { + audioformat = new AudioFormat(Encoding.PCM_UNSIGNED, + samplerate, bits, channels, framesize, samplerate, + false, p); + } else { + audioformat = new AudioFormat(Encoding.PCM_SIGNED, samplerate, + bits, channels, framesize, samplerate, false, p); + } + } else if (subFormat.equals(SUBTYPE_IEEE_FLOAT)) { + audioformat = new AudioFormat(AudioFloatConverter.PCM_FLOAT, + samplerate, bits, channels, framesize, samplerate, false, p); + } else + throw new UnsupportedAudioFileException(); + + AudioFileFormat fileformat = new AudioFileFormat( + AudioFileFormat.Type.WAVE, audioformat, + AudioSystem.NOT_SPECIFIED); + return fileformat; + } + + public AudioInputStream getAudioInputStream(InputStream stream) + throws UnsupportedAudioFileException, IOException { + + AudioFileFormat format = getAudioFileFormat(stream); + RIFFReader riffiterator = new RIFFReader(stream); + if (!riffiterator.getFormat().equals("RIFF")) + throw new UnsupportedAudioFileException(); + if (!riffiterator.getType().equals("WAVE")) + throw new UnsupportedAudioFileException(); + while (riffiterator.hasNextChunk()) { + RIFFReader chunk = riffiterator.nextChunk(); + if (chunk.getFormat().equals("data")) { + return new AudioInputStream(chunk, format.getFormat(), chunk + .getSize()); + } + } + throw new UnsupportedAudioFileException(); + } + + public AudioFileFormat getAudioFileFormat(URL url) + throws UnsupportedAudioFileException, IOException { + InputStream stream = url.openStream(); + AudioFileFormat format; + try { + format = getAudioFileFormat(new BufferedInputStream(stream)); + } finally { + stream.close(); + } + return format; + } + + public AudioFileFormat getAudioFileFormat(File file) + throws UnsupportedAudioFileException, IOException { + InputStream stream = new FileInputStream(file); + AudioFileFormat format; + try { + format = getAudioFileFormat(new BufferedInputStream(stream)); + } finally { + stream.close(); + } + return format; + } + + public AudioInputStream getAudioInputStream(URL url) + throws UnsupportedAudioFileException, IOException { + return getAudioInputStream(new BufferedInputStream(url.openStream())); + } + + public AudioInputStream getAudioInputStream(File file) + throws UnsupportedAudioFileException, IOException { + return getAudioInputStream(new BufferedInputStream(new FileInputStream( + file))); + } + +} diff --git a/jdk/src/share/classes/com/sun/media/sound/WaveFloatFileReader.java b/jdk/src/share/classes/com/sun/media/sound/WaveFloatFileReader.java new file mode 100644 index 00000000000..b096e4a5172 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/WaveFloatFileReader.java @@ -0,0 +1,166 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +import javax.sound.sampled.AudioFileFormat; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.UnsupportedAudioFileException; +import javax.sound.sampled.spi.AudioFileReader; + +/** + * Floating-point encoded (format 3) WAVE file loader. + * + * @author Karl Helgason + */ +public class WaveFloatFileReader extends AudioFileReader { + + public AudioFileFormat getAudioFileFormat(InputStream stream) + throws UnsupportedAudioFileException, IOException { + + stream.mark(200); + AudioFileFormat format; + try { + format = internal_getAudioFileFormat(stream); + } finally { + stream.reset(); + } + return format; + } + + private AudioFileFormat internal_getAudioFileFormat(InputStream stream) + throws UnsupportedAudioFileException, IOException { + + RIFFReader riffiterator = new RIFFReader(stream); + if (!riffiterator.getFormat().equals("RIFF")) + throw new UnsupportedAudioFileException(); + if (!riffiterator.getType().equals("WAVE")) + throw new UnsupportedAudioFileException(); + + boolean fmt_found = false; + boolean data_found = false; + + int channels = 1; + long samplerate = 1; + int framesize = 1; + int bits = 1; + + while (riffiterator.hasNextChunk()) { + RIFFReader chunk = riffiterator.nextChunk(); + + if (chunk.getFormat().equals("fmt ")) { + fmt_found = true; + + int format = chunk.readUnsignedShort(); + if (format != 3) // WAVE_FORMAT_IEEE_FLOAT only + throw new UnsupportedAudioFileException(); + channels = chunk.readUnsignedShort(); + samplerate = chunk.readUnsignedInt(); + /* framerate = */chunk.readUnsignedInt(); + framesize = chunk.readUnsignedShort(); + bits = chunk.readUnsignedShort(); + } + if (chunk.getFormat().equals("data")) { + data_found = true; + break; + } + } + + if (!fmt_found) + throw new UnsupportedAudioFileException(); + if (!data_found) + throw new UnsupportedAudioFileException(); + + AudioFormat audioformat = new AudioFormat( + AudioFloatConverter.PCM_FLOAT, samplerate, bits, channels, + framesize, samplerate, false); + AudioFileFormat fileformat = new AudioFileFormat( + AudioFileFormat.Type.WAVE, audioformat, + AudioSystem.NOT_SPECIFIED); + return fileformat; + } + + public AudioInputStream getAudioInputStream(InputStream stream) + throws UnsupportedAudioFileException, IOException { + + AudioFileFormat format = getAudioFileFormat(stream); + RIFFReader riffiterator = new RIFFReader(stream); + if (!riffiterator.getFormat().equals("RIFF")) + throw new UnsupportedAudioFileException(); + if (!riffiterator.getType().equals("WAVE")) + throw new UnsupportedAudioFileException(); + while (riffiterator.hasNextChunk()) { + RIFFReader chunk = riffiterator.nextChunk(); + if (chunk.getFormat().equals("data")) { + return new AudioInputStream(chunk, format.getFormat(), + chunk.getSize()); + } + } + throw new UnsupportedAudioFileException(); + } + + public AudioFileFormat getAudioFileFormat(URL url) + throws UnsupportedAudioFileException, IOException { + InputStream stream = url.openStream(); + AudioFileFormat format; + try { + format = getAudioFileFormat(new BufferedInputStream(stream)); + } finally { + stream.close(); + } + return format; + } + + public AudioFileFormat getAudioFileFormat(File file) + throws UnsupportedAudioFileException, IOException { + InputStream stream = new FileInputStream(file); + AudioFileFormat format; + try { + format = getAudioFileFormat(new BufferedInputStream(stream)); + } finally { + stream.close(); + } + return format; + } + + public AudioInputStream getAudioInputStream(URL url) + throws UnsupportedAudioFileException, IOException { + return getAudioInputStream(new BufferedInputStream(url.openStream())); + } + + public AudioInputStream getAudioInputStream(File file) + throws UnsupportedAudioFileException, IOException { + return getAudioInputStream(new BufferedInputStream(new FileInputStream( + file))); + } +} diff --git a/jdk/src/share/classes/com/sun/media/sound/WaveFloatFileWriter.java b/jdk/src/share/classes/com/sun/media/sound/WaveFloatFileWriter.java new file mode 100644 index 00000000000..ff11bd46459 --- /dev/null +++ b/jdk/src/share/classes/com/sun/media/sound/WaveFloatFileWriter.java @@ -0,0 +1,147 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +package com.sun.media.sound; + +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; + +import javax.sound.sampled.AudioFileFormat; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.AudioFileFormat.Type; +import javax.sound.sampled.spi.AudioFileWriter; + +/** + * Floating-point encoded (format 3) WAVE file writer. + * + * @author Karl Helgason + */ +public class WaveFloatFileWriter extends AudioFileWriter { + + public Type[] getAudioFileTypes() { + return new Type[] { Type.WAVE }; + } + + public Type[] getAudioFileTypes(AudioInputStream stream) { + + if (!stream.getFormat().getEncoding().equals( + AudioFloatConverter.PCM_FLOAT)) + return new Type[0]; + return new Type[] { Type.WAVE }; + } + + private void checkFormat(AudioFileFormat.Type type, AudioInputStream stream) { + if (!Type.WAVE.equals(type)) + throw new IllegalArgumentException("File type " + type + + " not supported."); + if (!stream.getFormat().getEncoding().equals( + AudioFloatConverter.PCM_FLOAT)) + throw new IllegalArgumentException("File format " + + stream.getFormat() + " not supported."); + } + + public void write(AudioInputStream stream, RIFFWriter writer) + throws IOException { + + RIFFWriter fmt_chunk = writer.writeChunk("fmt "); + + AudioFormat format = stream.getFormat(); + fmt_chunk.writeUnsignedShort(3); // WAVE_FORMAT_IEEE_FLOAT + fmt_chunk.writeUnsignedShort(format.getChannels()); + fmt_chunk.writeUnsignedInt((int) format.getSampleRate()); + fmt_chunk.writeUnsignedInt(((int) format.getFrameRate()) + * format.getFrameSize()); + fmt_chunk.writeUnsignedShort(format.getFrameSize()); + fmt_chunk.writeUnsignedShort(format.getSampleSizeInBits()); + fmt_chunk.close(); + RIFFWriter data_chunk = writer.writeChunk("data"); + byte[] buff = new byte[1024]; + int len; + while ((len = stream.read(buff, 0, buff.length)) != -1) + data_chunk.write(buff, 0, len); + data_chunk.close(); + } + + private static class NoCloseOutputStream extends OutputStream { + OutputStream out; + + public NoCloseOutputStream(OutputStream out) { + this.out = out; + } + + public void write(int b) throws IOException { + out.write(b); + } + + public void flush() throws IOException { + out.flush(); + } + + public void write(byte[] b, int off, int len) throws IOException { + out.write(b, off, len); + } + + public void write(byte[] b) throws IOException { + out.write(b); + } + } + + private AudioInputStream toLittleEndian(AudioInputStream ais) { + AudioFormat format = ais.getFormat(); + AudioFormat targetFormat = new AudioFormat(format.getEncoding(), format + .getSampleRate(), format.getSampleSizeInBits(), format + .getChannels(), format.getFrameSize(), format.getFrameRate(), + false); + return AudioSystem.getAudioInputStream(targetFormat, ais); + } + + public int write(AudioInputStream stream, Type fileType, OutputStream out) + throws IOException { + + checkFormat(fileType, stream); + if (stream.getFormat().isBigEndian()) + stream = toLittleEndian(stream); + RIFFWriter writer = new RIFFWriter(new NoCloseOutputStream(out), "WAVE"); + write(stream, writer); + int fpointer = (int) writer.getFilePointer(); + writer.close(); + return fpointer; + } + + public int write(AudioInputStream stream, Type fileType, File out) + throws IOException { + checkFormat(fileType, stream); + if (stream.getFormat().isBigEndian()) + stream = toLittleEndian(stream); + RIFFWriter writer = new RIFFWriter(out, "WAVE"); + write(stream, writer); + int fpointer = (int) writer.getFilePointer(); + writer.close(); + return fpointer; + } + +} diff --git a/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.midi.spi.MidiDeviceProvider b/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.midi.spi.MidiDeviceProvider index e0bbb102530..bffb952eb65 100644 --- a/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.midi.spi.MidiDeviceProvider +++ b/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.midi.spi.MidiDeviceProvider @@ -1,5 +1,5 @@ # Providers for midi devices -com.sun.media.sound.MixerSynthProvider com.sun.media.sound.RealTimeSequencerProvider com.sun.media.sound.MidiOutDeviceProvider com.sun.media.sound.MidiInDeviceProvider +com.sun.media.sound.SoftProvider diff --git a/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.midi.spi.MidiFileReader b/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.midi.spi.MidiFileReader index 2daf82731a6..1d643a0e42e 100644 --- a/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.midi.spi.MidiFileReader +++ b/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.midi.spi.MidiFileReader @@ -1,3 +1,2 @@ # Providers for midi sequences com.sun.media.sound.StandardMidiFileReader -com.sun.media.sound.RmfFileReader diff --git a/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.midi.spi.SoundbankReader b/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.midi.spi.SoundbankReader index 85a8af274f3..03c3df8201e 100644 --- a/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.midi.spi.SoundbankReader +++ b/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.midi.spi.SoundbankReader @@ -1,2 +1,5 @@ # Providers for Soundbanks -com.sun.media.sound.HsbParser +com.sun.media.sound.SF2SoundbankReader +com.sun.media.sound.DLSSoundbankReader +com.sun.media.sound.AudioFileSoundbankReader +com.sun.media.sound.JARSoundbankReader diff --git a/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.sampled.spi.AudioFileReader b/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.sampled.spi.AudioFileReader index db1cd3044f6..624dac1c026 100644 --- a/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.sampled.spi.AudioFileReader +++ b/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.sampled.spi.AudioFileReader @@ -2,3 +2,5 @@ com.sun.media.sound.AuFileReader com.sun.media.sound.AiffFileReader com.sun.media.sound.WaveFileReader +com.sun.media.sound.WaveFloatFileReader +com.sun.media.sound.SoftMidiAudioFileReader diff --git a/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.sampled.spi.FormatConversionProvider b/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.sampled.spi.FormatConversionProvider index 7f452444c64..2ea4f8b8040 100644 --- a/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.sampled.spi.FormatConversionProvider +++ b/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.sampled.spi.FormatConversionProvider @@ -2,3 +2,4 @@ com.sun.media.sound.UlawCodec com.sun.media.sound.AlawCodec com.sun.media.sound.PCMtoPCMCodec +com.sun.media.sound.AudioFloatFormatConverter diff --git a/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.sampled.spi.MixerProvider b/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.sampled.spi.MixerProvider index fc551ed398d..5414bee18fb 100644 --- a/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.sampled.spi.MixerProvider +++ b/jdk/src/share/classes/com/sun/media/sound/services/javax.sound.sampled.spi.MixerProvider @@ -1,5 +1,3 @@ # last mixer is default mixer com.sun.media.sound.PortMixerProvider -com.sun.media.sound.SimpleInputDeviceProvider -com.sun.media.sound.HeadspaceMixerProvider com.sun.media.sound.DirectAudioDeviceProvider diff --git a/jdk/src/share/classes/java/awt/Choice.java b/jdk/src/share/classes/java/awt/Choice.java index ea46b8d772e..64c46b53da4 100644 --- a/jdk/src/share/classes/java/awt/Choice.java +++ b/jdk/src/share/classes/java/awt/Choice.java @@ -228,7 +228,7 @@ public class Choice extends Component implements ItemSelectable, Accessible { pItems.insertElementAt(item, index); ChoicePeer peer = (ChoicePeer)this.peer; if (peer != null) { - peer.addItem(item, index); + peer.add(item, index); } // no selection or selection shifted up if (selectedIndex < 0 || selectedIndex >= index) { diff --git a/jdk/src/share/classes/java/awt/Component.java b/jdk/src/share/classes/java/awt/Component.java index 8896ec248b4..afe091dccef 100644 --- a/jdk/src/share/classes/java/awt/Component.java +++ b/jdk/src/share/classes/java/awt/Component.java @@ -65,8 +65,10 @@ import java.applet.Applet; import sun.security.action.GetPropertyAction; import sun.awt.AppContext; +import sun.awt.AWTAccessor; import sun.awt.ConstrainableGraphics; import sun.awt.SubRegionShowable; +import sun.awt.SunToolkit; import sun.awt.WindowClosingListener; import sun.awt.CausedFocusEvent; import sun.awt.EmbeddedFrame; @@ -758,22 +760,26 @@ public abstract class Component implements ImageObserver, MenuContainer, * The shape set with the applyCompoundShape() method. It uncludes the result * of the HW/LW mixing related shape computation. It may also include * the user-specified shape of the component. + * The 'null' value means the component has normal shape (or has no shape at all) + * and applyCompoundShape() will skip the following shape identical to normal. */ private transient Region compoundShape = null; + /* + * Represents the shape of this lightweight component to be cut out from + * heavyweight components should they intersect. Possible values: + * 1. null - consider the shape rectangular + * 2. EMPTY_REGION - nothing gets cut out (children still get cut out) + * 3. non-empty - this shape gets cut out. + */ + private transient Region mixingCutoutRegion = null; + /* * Indicates whether addNotify() is complete * (i.e. the peer is created). */ private transient boolean isAddNotifyComplete = false; - private static final PropertyChangeListener opaquePropertyChangeListener = - new PropertyChangeListener() { - public void propertyChange(java.beans.PropertyChangeEvent evt) { - ((Component)evt.getSource()).mixOnOpaqueChanging(); - } - }; - /** * Should only be used in subclass getBounds to check that part of bounds * is actualy changing @@ -793,6 +799,39 @@ public abstract class Component implements ImageObserver, MenuContainer, } } + static { + AWTAccessor.setComponentAccessor(new AWTAccessor.ComponentAccessor() { + public void setMixingCutoutShape(Component comp, Shape shape) { + Region region = shape == null ? null : + Region.getInstance(shape, null); + + synchronized (comp.getTreeLock()) { + boolean needShowing = false; + boolean needHiding = false; + + if (!comp.isNonOpaqueForMixing()) { + needHiding = true; + } + + comp.mixingCutoutRegion = region; + + if (!comp.isNonOpaqueForMixing()) { + needShowing = true; + } + + if (comp.isMixingNeeded()) { + if (needHiding) { + comp.mixOnHiding(comp.isLightweight()); + } + if (needShowing) { + comp.mixOnShowing(); + } + } + } + } + }); + } + /** * Constructs a new component. Class Component can be * extended directly to create a lightweight component that does not @@ -1306,7 +1345,7 @@ public abstract class Component implements ImageObserver, MenuContainer, enabled = true; ComponentPeer peer = this.peer; if (peer != null) { - peer.enable(); + peer.setEnabled(true); if (visible) { updateCursorImmediately(); } @@ -1355,7 +1394,7 @@ public abstract class Component implements ImageObserver, MenuContainer, } ComponentPeer peer = this.peer; if (peer != null) { - peer.disable(); + peer.setEnabled(false); if (visible) { updateCursorImmediately(); } @@ -1447,7 +1486,7 @@ public abstract class Component implements ImageObserver, MenuContainer, mixOnShowing(); ComponentPeer peer = this.peer; if (peer != null) { - peer.show(); + peer.setVisible(true); createHierarchyEvents(HierarchyEvent.HIERARCHY_CHANGED, this, parent, HierarchyEvent.SHOWING_CHANGED, @@ -1517,7 +1556,7 @@ public abstract class Component implements ImageObserver, MenuContainer, } ComponentPeer peer = this.peer; if (peer != null) { - peer.hide(); + peer.setVisible(false); createHierarchyEvents(HierarchyEvent.HIERARCHY_CHANGED, this, parent, HierarchyEvent.SHOWING_CHANGED, @@ -2414,7 +2453,7 @@ public abstract class Component implements ImageObserver, MenuContainer, if (dim == null || !(isPreferredSizeSet() || isValid())) { synchronized (getTreeLock()) { prefSize = (peer != null) ? - peer.preferredSize() : + peer.getPreferredSize() : getMinimumSize(); dim = prefSize; } @@ -2484,7 +2523,7 @@ public abstract class Component implements ImageObserver, MenuContainer, if (dim == null || !(isMinimumSizeSet() || isValid())) { synchronized (getTreeLock()) { minSize = (peer != null) ? - peer.minimumSize() : + peer.getMinimumSize() : size(); dim = minSize; } @@ -3171,7 +3210,7 @@ public abstract class Component implements ImageObserver, MenuContainer, private Insets getInsets_NoClientCode() { ComponentPeer peer = this.peer; if (peer instanceof ContainerPeer) { - return (Insets)((ContainerPeer)peer).insets().clone(); + return (Insets)((ContainerPeer)peer).getInsets().clone(); } return new Insets(0, 0, 0, 0); } @@ -6643,7 +6682,6 @@ public abstract class Component implements ImageObserver, MenuContainer, } if (!isAddNotifyComplete) { - addPropertyChangeListener("opaque", opaquePropertyChangeListener); mixOnShowing(); } @@ -6722,7 +6760,7 @@ public abstract class Component implements ImageObserver, MenuContainer, // Hide peer first to stop system events such as cursor moves. if (visible) { - p.hide(); + p.setVisible(false); } peer = null; // Stop peer updates. @@ -6735,9 +6773,11 @@ public abstract class Component implements ImageObserver, MenuContainer, p.dispose(); mixOnHiding(isLightweight); - removePropertyChangeListener("opaque", opaquePropertyChangeListener); isAddNotifyComplete = false; + // Nullifying compoundShape means that the component has normal shape + // (or has no shape at all). + this.compoundShape = null; } if (hierarchyListener != null || @@ -9401,10 +9441,9 @@ public abstract class Component implements ImageObserver, MenuContainer, * Null-layout of the container or absence of the container mean * the bounds of the component are final and can be trusted. */ - private boolean areBoundsValid() { + final boolean areBoundsValid() { Container cont = getContainer(); - return cont == null || cont.isValid() - || cont.getLayout() == null; + return cont == null || cont.isValid() || cont.getLayout() == null; } /** @@ -9413,6 +9452,14 @@ public abstract class Component implements ImageObserver, MenuContainer, */ void applyCompoundShape(Region shape) { checkTreeLock(); + + if (!areBoundsValid()) { + if (mixingLog.isLoggable(Level.FINE)) { + mixingLog.fine("this = " + this + "; areBoundsValid = " + areBoundsValid()); + } + return; + } + if (!isLightweight()) { ComponentPeer peer = getPeer(); if (peer != null) { @@ -9422,22 +9469,31 @@ public abstract class Component implements ImageObserver, MenuContainer, // with some incorrect Region object with loX being // greater than the hiX for instance. if (shape.isEmpty()) { - shape = Region.getInstanceXYWH(0, 0, 0, 0); + shape = Region.EMPTY_REGION; } + // Note: the shape is not really copied/cloned. We create // the Region object ourselves, so there's no any possibility // to modify the object outside of the mixing code. - this.compoundShape = shape; - - if (areBoundsValid()) { + // Nullifying compoundShape means that the component has normal shape + // (or has no shape at all). + if (shape.equals(getNormalShape())) { + if (this.compoundShape == null) { + return; + } + this.compoundShape = null; + peer.applyShape(null); + } else { + if (shape.equals(getAppliedShape())) { + return; + } + this.compoundShape = shape; Point compAbsolute = getLocationOnWindow(); - if (mixingLog.isLoggable(Level.FINER)) { mixingLog.fine("this = " + this + - "; compAbsolute=" + compAbsolute + "; shape=" + shape); + "; compAbsolute=" + compAbsolute + "; shape=" + shape); } - peer.applyShape(shape.getTranslatedRegion(-compAbsolute.x, -compAbsolute.y)); } } @@ -9460,7 +9516,7 @@ public abstract class Component implements ImageObserver, MenuContainer, Point curLocation = getLocation(); for (Container parent = getContainer(); - parent != null; + parent != null && !(parent instanceof Window); parent = parent.getContainer()) { curLocation.x += parent.getX(); @@ -9486,7 +9542,28 @@ public abstract class Component implements ImageObserver, MenuContainer, ); } - private int getSiblingIndexAbove() { + /** + * Returns the "opaque shape" of the component. + * + * The opaque shape of a lightweight components is the actual shape that + * needs to be cut off of the heavyweight components in order to mix this + * lightweight component correctly with them. + * + * The method is overriden in the java.awt.Container to handle non-opaque + * containers containing opaque children. + * + * See 6637655 for details. + */ + Region getOpaqueShape() { + checkTreeLock(); + if (mixingCutoutRegion != null) { + return mixingCutoutRegion; + } else { + return getNormalShape(); + } + } + + final int getSiblingIndexAbove() { checkTreeLock(); Container parent = getContainer(); if (parent == null) { @@ -9498,7 +9575,7 @@ public abstract class Component implements ImageObserver, MenuContainer, return nextAbove < 0 ? -1 : nextAbove; } - private int getSiblingIndexBelow() { + final int getSiblingIndexBelow() { checkTreeLock(); Container parent = getContainer(); if (parent == null) { @@ -9510,6 +9587,11 @@ public abstract class Component implements ImageObserver, MenuContainer, return nextBelow >= parent.getComponentCount() ? -1 : nextBelow; } + final boolean isNonOpaqueForMixing() { + return mixingCutoutRegion != null && + mixingCutoutRegion.isEmpty(); + } + private Region calculateCurrentShape() { checkTreeLock(); Region s = getNormalShape(); @@ -9532,8 +9614,8 @@ public abstract class Component implements ImageObserver, MenuContainer, * implementation of the Container class. */ Component c = cont.getComponent(index); - if (c.isLightweight() && c.isShowing() && c.isOpaque()) { - s = s.getDifference(c.getNormalShape()); + if (c.isLightweight() && c.isShowing()) { + s = s.getDifference(c.getOpaqueShape()); } } @@ -9558,6 +9640,9 @@ public abstract class Component implements ImageObserver, MenuContainer, void applyCurrentShape() { checkTreeLock(); if (!areBoundsValid()) { + if (mixingLog.isLoggable(Level.FINE)) { + mixingLog.fine("this = " + this + "; areBoundsValid = " + areBoundsValid()); + } return; // Because applyCompoundShape() ignores such components anyway } if (mixingLog.isLoggable(Level.FINE)) { @@ -9576,16 +9661,54 @@ public abstract class Component implements ImageObserver, MenuContainer, applyCompoundShape(getAppliedShape().getDifference(s)); } + private final void applyCurrentShapeBelowMe() { + checkTreeLock(); + Container parent = getContainer(); + if (parent != null && parent.isShowing()) { + // First, reapply shapes of my siblings + parent.recursiveApplyCurrentShape(getSiblingIndexBelow()); + + // Second, if my container is non-opaque, reapply shapes of siblings of my container + Container parent2 = parent.getContainer(); + while (!parent.isOpaque() && parent2 != null) { + parent2.recursiveApplyCurrentShape(parent.getSiblingIndexBelow()); + + parent = parent2; + parent2 = parent.getContainer(); + } + } + } + + final void subtractAndApplyShapeBelowMe() { + checkTreeLock(); + Container parent = getContainer(); + if (parent != null && isShowing()) { + Region opaqueShape = getOpaqueShape(); + + // First, cut my siblings + parent.recursiveSubtractAndApplyShape(opaqueShape, getSiblingIndexBelow()); + + // Second, if my container is non-opaque, cut siblings of my container + Container parent2 = parent.getContainer(); + while (!parent.isOpaque() && parent2 != null) { + parent2.recursiveSubtractAndApplyShape(opaqueShape, parent.getSiblingIndexBelow()); + + parent = parent2; + parent2 = parent.getContainer(); + } + } + } + void mixOnShowing() { synchronized (getTreeLock()) { if (mixingLog.isLoggable(Level.FINE)) { mixingLog.fine("this = " + this); } + if (!isMixingNeeded()) { + return; + } if (isLightweight()) { - Container parent = getContainer(); - if (parent != null && isShowing() && isOpaque()) { - parent.recursiveSubtractAndApplyShape(getNormalShape(), getSiblingIndexBelow()); - } + subtractAndApplyShapeBelowMe(); } else { applyCurrentShape(); } @@ -9599,12 +9722,12 @@ public abstract class Component implements ImageObserver, MenuContainer, if (mixingLog.isLoggable(Level.FINE)) { mixingLog.fine("this = " + this + "; isLightweight = " + isLightweight); } + if (!isMixingNeeded()) { + return; + } if (isLightweight) { - Container parent = getContainer(); - if (parent != null) { - parent.recursiveApplyCurrentShape(getSiblingIndexBelow()); - } - } //XXX: else applyNormalShape() ??? + applyCurrentShapeBelowMe(); + } } } @@ -9613,11 +9736,11 @@ public abstract class Component implements ImageObserver, MenuContainer, if (mixingLog.isLoggable(Level.FINE)) { mixingLog.fine("this = " + this); } + if (!isMixingNeeded()) { + return; + } if (isLightweight()) { - Container parent = getContainer(); - if (parent != null) { - parent.recursiveApplyCurrentShape(parent.getComponentZOrder(this)); - } + applyCurrentShapeBelowMe(); } else { applyCurrentShape(); } @@ -9633,11 +9756,13 @@ public abstract class Component implements ImageObserver, MenuContainer, mixingLog.fine("this = " + this + "; oldZorder=" + oldZorder + "; newZorder=" + newZorder + "; parent=" + parent); } - + if (!isMixingNeeded()) { + return; + } if (isLightweight()) { if (becameHigher) { - if (parent != null && isShowing() && isOpaque()) { - parent.recursiveSubtractAndApplyShape(getNormalShape(), getSiblingIndexBelow(), oldZorder); + if (parent != null && isShowing()) { + parent.recursiveSubtractAndApplyShape(getOpaqueShape(), getSiblingIndexBelow(), oldZorder); } } else { if (parent != null) { @@ -9653,8 +9778,8 @@ public abstract class Component implements ImageObserver, MenuContainer, for (int index = oldZorder; index < newZorder; index++) { Component c = parent.getComponent(index); - if (c.isLightweight() && c.isShowing() && c.isOpaque()) { - shape = shape.getDifference(c.getNormalShape()); + if (c.isLightweight() && c.isShowing()) { + shape = shape.getDifference(c.getOpaqueShape()); } } applyCompoundShape(shape); @@ -9664,21 +9789,42 @@ public abstract class Component implements ImageObserver, MenuContainer, } } - void mixOnOpaqueChanging() { - if (mixingLog.isLoggable(Level.FINE)) { - mixingLog.fine("this = " + this); - } - if (isOpaque()) { - mixOnShowing(); - } else { - mixOnHiding(isLightweight()); - } - } - void mixOnValidating() { // This method gets overriden in the Container. Obviously, a plain // non-container components don't need to handle validation. } + final boolean isMixingNeeded() { + if (SunToolkit.getSunAwtDisableMixing()) { + if (mixingLog.isLoggable(Level.FINEST)) { + mixingLog.finest("this = " + this + "; Mixing disabled via sun.awt.disableMixing"); + } + return false; + } + if (!areBoundsValid()) { + if (mixingLog.isLoggable(Level.FINE)) { + mixingLog.fine("this = " + this + "; areBoundsValid = " + areBoundsValid()); + } + return false; + } + Window window = getContainingWindow(); + if (window != null) { + if (!window.hasHeavyweightDescendants() || !window.hasLightweightDescendants()) { + if (mixingLog.isLoggable(Level.FINE)) { + mixingLog.fine("containing window = " + window + + "; has h/w descendants = " + window.hasHeavyweightDescendants() + + "; has l/w descendants = " + window.hasLightweightDescendants()); + } + return false; + } + } else { + if (mixingLog.isLoggable(Level.FINE)) { + mixingLog.finest("this = " + this + "; containing window is null"); + } + return false; + } + return true; + } + // ****************** END OF MIXING CODE ******************************** } diff --git a/jdk/src/share/classes/java/awt/Container.java b/jdk/src/share/classes/java/awt/Container.java index c302e4b0edc..04425d5a45a 100644 --- a/jdk/src/share/classes/java/awt/Container.java +++ b/jdk/src/share/classes/java/awt/Container.java @@ -343,7 +343,7 @@ public class Container extends Component { ComponentPeer peer = this.peer; if (peer instanceof ContainerPeer) { ContainerPeer cpeer = (ContainerPeer)peer; - return (Insets)cpeer.insets().clone(); + return (Insets)cpeer.getInsets().clone(); } return new Insets(0, 0, 0, 0); } @@ -569,7 +569,7 @@ public class Container extends Component { * @return true if there is at least one heavyweight children in a container, false otherwise * @since 1.5 */ - private boolean hasHeavyweightDescendants() { + final boolean hasHeavyweightDescendants() { checkTreeLock(); return numOfHWComponents > 0; } @@ -580,7 +580,7 @@ public class Container extends Component { * @return true if there is at least one lightweight children in a container, false otherwise * @since 1.7 */ - private boolean hasLightweightDescendants() { + final boolean hasLightweightDescendants() { checkTreeLock(); return numOfLWComponents > 0; } @@ -3861,6 +3861,28 @@ public class Container extends Component { return -1; } + /* + * This method is overriden to handle opaque children in non-opaque + * containers. + */ + @Override + final Region getOpaqueShape() { + checkTreeLock(); + if (isLightweight() && isNonOpaqueForMixing() + && hasLightweightDescendants()) + { + Region s = Region.EMPTY_REGION; + for (int index = 0; index < getComponentCount(); index++) { + Component c = getComponent(index); + if (c.isLightweight() && c.isShowing()) { + s = s.getUnion(c.getOpaqueShape()); + } + } + return s.getIntersection(getNormalShape()); + } + return super.getOpaqueShape(); + } + final void recursiveSubtractAndApplyShape(Region shape) { recursiveSubtractAndApplyShape(shape, getTopmostComponentIndex(), getBottommostComponentIndex()); } @@ -3878,6 +3900,15 @@ public class Container extends Component { if (fromZorder == -1) { return; } + if (shape.isEmpty()) { + return; + } + // An invalid container with not-null layout should be ignored + // by the mixing code, the container will be validated later + // and the mixing code will be executed later. + if (getLayout() != null && !isValid()) { + return; + } for (int index = fromZorder; index <= toZorder; index++) { Component comp = getComponent(index); if (!comp.isLightweight()) { @@ -3906,10 +3937,19 @@ public class Container extends Component { if (fromZorder == -1) { return; } + // An invalid container with not-null layout should be ignored + // by the mixing code, the container will be validated later + // and the mixing code will be executed later. + if (getLayout() != null && !isValid()) { + return; + } for (int index = fromZorder; index <= toZorder; index++) { Component comp = getComponent(index); if (!comp.isLightweight()) { comp.applyCurrentShape(); + if (comp instanceof Container && ((Container)comp).getLayout() == null) { + ((Container)comp).recursiveApplyCurrentShape(); + } } else if (comp instanceof Container && ((Container)comp).hasHeavyweightDescendants()) { ((Container)comp).recursiveApplyCurrentShape(); @@ -3931,7 +3971,7 @@ public class Container extends Component { if (comp.isVisible()) { ComponentPeer peer = comp.getPeer(); if (peer != null) { - peer.show(); + peer.setVisible(true); } } } @@ -3952,7 +3992,7 @@ public class Container extends Component { if (comp.isVisible()) { ComponentPeer peer = comp.getPeer(); if (peer != null) { - peer.hide(); + peer.setVisible(false); } } } @@ -4000,6 +4040,10 @@ public class Container extends Component { mixingLog.fine("this = " + this); } + if (!isMixingNeeded()) { + return; + } + boolean isLightweight = isLightweight(); if (isLightweight && isRecursivelyVisibleUpToHeavyweightContainer()) { @@ -4034,6 +4078,9 @@ public class Container extends Component { if (mixingLog.isLoggable(Level.FINE)) { mixingLog.fine("this = " + this); } + + boolean isMixingNeeded = isMixingNeeded(); + if (isLightweight() && hasHeavyweightDescendants()) { final Point origin = new Point(getX(), getY()); for (Container cont = getContainer(); @@ -4044,7 +4091,18 @@ public class Container extends Component { } recursiveRelocateHeavyweightChildren(origin); + + if (!isMixingNeeded) { + return; + } + + recursiveApplyCurrentShape(); } + + if (!isMixingNeeded) { + return; + } + super.mixOnReshaping(); } } @@ -4057,6 +4115,10 @@ public class Container extends Component { "; oldZ=" + oldZorder + "; newZ=" + newZorder); } + if (!isMixingNeeded()) { + return; + } + boolean becameHigher = newZorder < oldZorder; if (becameHigher && isLightweight() && hasHeavyweightDescendants()) { @@ -4073,10 +4135,18 @@ public class Container extends Component { mixingLog.fine("this = " + this); } + if (!isMixingNeeded()) { + return; + } + if (hasHeavyweightDescendants()) { recursiveApplyCurrentShape(); } + if (isLightweight() && isNonOpaqueForMixing()) { + subtractAndApplyShapeBelowMe(); + } + super.mixOnValidating(); } } diff --git a/jdk/src/share/classes/java/awt/Dialog.java b/jdk/src/share/classes/java/awt/Dialog.java index 2104a64b742..310e52350e1 100644 --- a/jdk/src/share/classes/java/awt/Dialog.java +++ b/jdk/src/share/classes/java/awt/Dialog.java @@ -941,7 +941,7 @@ public class Dialog extends Window { // does not invoke the super.show(). So wried... :( mixOnShowing(); - peer.show(); // now guaranteed never to block + peer.setVisible(true); // now guaranteed never to block if (isModalBlocked()) { modalBlocker.toFront(); } diff --git a/jdk/src/share/classes/java/awt/EventDispatchThread.java b/jdk/src/share/classes/java/awt/EventDispatchThread.java index c9b77b0b27e..f35ff913a7d 100644 --- a/jdk/src/share/classes/java/awt/EventDispatchThread.java +++ b/jdk/src/share/classes/java/awt/EventDispatchThread.java @@ -300,119 +300,19 @@ class EventDispatchThread extends Thread { } // Can get and throw only unchecked exceptions catch (RuntimeException e) { - processException(e, modalFiltersCount > 0); + processException(e); } catch (Error e) { - processException(e, modalFiltersCount > 0); + processException(e); } return true; } - private void processException(Throwable e, boolean isModal) { + private void processException(Throwable e) { if (eventLog.isLoggable(Level.FINE)) { - eventLog.log(Level.FINE, "Processing exception: " + e + - ", isModal = " + isModal); + eventLog.log(Level.FINE, "Processing exception: " + e); } - if (!handleException(e)) { - // See bug ID 4499199. - // If we are in a modal dialog, we cannot throw - // an exception for the ThreadGroup to handle (as added - // in RFE 4063022). If we did, the message pump of - // the modal dialog would be interrupted. - // We instead choose to handle the exception ourselves. - // It may be useful to add either a runtime flag or API - // later if someone would like to instead dispose the - // dialog and allow the thread group to handle it. - if (isModal) { - System.err.println( - "Exception occurred during event dispatching:"); - e.printStackTrace(); - } else if (e instanceof RuntimeException) { - throw (RuntimeException)e; - } else if (e instanceof Error) { - throw (Error)e; - } - } - } - - private static final String handlerPropName = "sun.awt.exception.handler"; - private static String handlerClassName = null; - private static String NO_HANDLER = new String(); - - /** - * Handles an exception thrown in the event-dispatch thread. - * - *

    If the system property "sun.awt.exception.handler" is defined, then - * when this method is invoked it will attempt to do the following: - * - *

      - *
    1. Load the class named by the value of that property, using the - * current thread's context class loader, - *
    2. Instantiate that class using its zero-argument constructor, - *
    3. Find the resulting handler object's public void handle - * method, which should take a single argument of type - * Throwable, and - *
    4. Invoke the handler's handle method, passing it the - * thrown argument that was passed to this method. - *
    - * - * If any of the first three steps fail then this method will return - * false and all following invocations of this method will return - * false immediately. An exception thrown by the handler object's - * handle will be caught, and will cause this method to return - * false. If the handler's handle method is successfully - * invoked, then this method will return true. This method will - * never throw any sort of exception. - * - *

    Note: This method is a temporary hack to work around the - * absence of a real API that provides the ability to replace the - * event-dispatch thread. The magic "sun.awt.exception.handler" property - * will be removed in a future release. - * - * @param thrown The Throwable that was thrown in the event-dispatch - * thread - * - * @return false if any of the above steps failed, otherwise - * true - */ - private boolean handleException(Throwable thrown) { - - try { - - if (handlerClassName == NO_HANDLER) { - return false; /* Already tried, and failed */ - } - - /* Look up the class name */ - if (handlerClassName == null) { - handlerClassName = ((String) AccessController.doPrivileged( - new GetPropertyAction(handlerPropName))); - if (handlerClassName == null) { - handlerClassName = NO_HANDLER; /* Do not try this again */ - return false; - } - } - - /* Load the class, instantiate it, and find its handle method */ - Method m; - Object h; - try { - ClassLoader cl = Thread.currentThread().getContextClassLoader(); - Class c = Class.forName(handlerClassName, true, cl); - m = c.getMethod("handle", new Class[] { Throwable.class }); - h = c.newInstance(); - } catch (Throwable x) { - handlerClassName = NO_HANDLER; /* Do not try this again */ - return false; - } - - /* Finally, invoke the handler */ - m.invoke(h, new Object[] { thrown }); - - } catch (Throwable x) { - return false; - } - - return true; + getUncaughtExceptionHandler().uncaughtException(this, e); + // don't rethrow the exception to avoid EDT recreation } boolean isDispatching(EventQueue eq) { diff --git a/jdk/src/share/classes/java/awt/List.java b/jdk/src/share/classes/java/awt/List.java index 2ce9af6c0a6..5fd4e46313f 100644 --- a/jdk/src/share/classes/java/awt/List.java +++ b/jdk/src/share/classes/java/awt/List.java @@ -378,7 +378,7 @@ public class List extends Component implements ItemSelectable, Accessible { ListPeer peer = (ListPeer)this.peer; if (peer != null) { - peer.addItem(item, index); + peer.add(item, index); } } @@ -413,7 +413,7 @@ public class List extends Component implements ItemSelectable, Accessible { public synchronized void clear() { ListPeer peer = (ListPeer)this.peer; if (peer != null) { - peer.clear(); + peer.removeAll(); } items = new Vector(); selected = new int[0]; @@ -718,7 +718,7 @@ public class List extends Component implements ItemSelectable, Accessible { multipleMode = b; ListPeer peer = (ListPeer)this.peer; if (peer != null) { - peer.setMultipleSelections(b); + peer.setMultipleMode(b); } } } @@ -768,7 +768,7 @@ public class List extends Component implements ItemSelectable, Accessible { synchronized (getTreeLock()) { ListPeer peer = (ListPeer)this.peer; return (peer != null) ? - peer.preferredSize(rows) : + peer.getPreferredSize(rows) : super.preferredSize(); } } @@ -818,7 +818,7 @@ public class List extends Component implements ItemSelectable, Accessible { synchronized (getTreeLock()) { ListPeer peer = (ListPeer)this.peer; return (peer != null) ? - peer.minimumSize(rows) : + peer.getMinimumSize(rows) : super.minimumSize(); } } diff --git a/jdk/src/share/classes/java/awt/MenuItem.java b/jdk/src/share/classes/java/awt/MenuItem.java index 99ddac75d15..71dd760a9bd 100644 --- a/jdk/src/share/classes/java/awt/MenuItem.java +++ b/jdk/src/share/classes/java/awt/MenuItem.java @@ -268,7 +268,7 @@ public class MenuItem extends MenuComponent implements Accessible { enabled = true; MenuItemPeer peer = (MenuItemPeer)this.peer; if (peer != null) { - peer.enable(); + peer.setEnabled(true); } } @@ -294,7 +294,7 @@ public class MenuItem extends MenuComponent implements Accessible { enabled = false; MenuItemPeer peer = (MenuItemPeer)this.peer; if (peer != null) { - peer.disable(); + peer.setEnabled(false); } } diff --git a/jdk/src/share/classes/java/awt/Robot.java b/jdk/src/share/classes/java/awt/Robot.java index 2ce6a2686f1..94c71283cee 100644 --- a/jdk/src/share/classes/java/awt/Robot.java +++ b/jdk/src/share/classes/java/awt/Robot.java @@ -70,10 +70,7 @@ public class Robot { private RobotPeer peer; private boolean isAutoWaitForIdle = false; private int autoDelay = 0; - private static final int LEGAL_BUTTON_MASK = - InputEvent.BUTTON1_MASK| - InputEvent.BUTTON2_MASK| - InputEvent.BUTTON3_MASK; + private static int LEGAL_BUTTON_MASK; // location of robot's GC, used in mouseMove(), getPixelColor() and captureScreenImage() private Point gdLoc; @@ -98,6 +95,19 @@ public class Robot { } init(GraphicsEnvironment.getLocalGraphicsEnvironment() .getDefaultScreenDevice()); + int tmpMask = 0; + if (Toolkit.getDefaultToolkit().areExtraMouseButtonsEnabled()){ + for (int i = 0; i < peer.getNumberOfButtons(); i++){ + tmpMask |= InputEvent.getMaskForButton(i+1); + } + } + tmpMask |= InputEvent.BUTTON1_MASK| + InputEvent.BUTTON2_MASK| + InputEvent.BUTTON3_MASK| + InputEvent.BUTTON1_DOWN_MASK| + InputEvent.BUTTON2_DOWN_MASK| + InputEvent.BUTTON3_DOWN_MASK; + LEGAL_BUTTON_MASK = tmpMask; } /** @@ -187,18 +197,55 @@ public class Robot { /** * Presses one or more mouse buttons. The mouse buttons should - * be released using the mouseRelease method. + * be released using the {@link #mouseRelease(int)} method. * - * @param buttons the Button mask; a combination of one or more - * of these flags: + * @param buttons the Button mask; a combination of one or more + * mouse button masks. + *

    + * It is allowed to use only a combination of valid values as a {@code buttons} parameter. + * A valid combination consists of {@code InputEvent.BUTTON1_DOWN_MASK}, + * {@code InputEvent.BUTTON2_DOWN_MASK}, {@code InputEvent.BUTTON3_DOWN_MASK} + * and values returned by the + * {@link InputEvent#getMaskForButton(int) InputEvent.getMaskForButton(button)} method. + * + * The valid combination also depends on a + * {@link Toolkit#areExtraMouseButtonsEnabled() Toolkit.areExtraMouseButtonsEnabled()} value as follows: *

      - *
    • InputEvent.BUTTON1_MASK - *
    • InputEvent.BUTTON2_MASK - *
    • InputEvent.BUTTON3_MASK + *
    • If support for extended mouse buttons is + * {@link Toolkit#areExtraMouseButtonsEnabled() disabled} by Java + * then it is allowed to use only the following standard button masks: + * {@code InputEvent.BUTTON1_DOWN_MASK}, {@code InputEvent.BUTTON2_DOWN_MASK}, + * {@code InputEvent.BUTTON3_DOWN_MASK}. + *
    • If support for extended mouse buttons is + * {@link Toolkit#areExtraMouseButtonsEnabled() enabled} by Java + * then it is allowed to use the standard button masks + * and masks for existing extended mouse buttons, if the mouse has more then three buttons. + * In that way, it is allowed to use the button masks corresponding to the buttons + * in the range from 1 to {@link java.awt.MouseInfo#getNumberOfButtons() MouseInfo.getNumberOfButtons()}. + *
      + * It is recommended to use the {@link InputEvent#getMaskForButton(int) InputEvent.getMaskForButton(button)} + * method to obtain the mask for any mouse button by its number. *
    - * @throws IllegalArgumentException if the button mask is not a - * valid combination + *

    + * The following standard button masks are also accepted: + *

      + *
    • {@code InputEvent.BUTTON1_MASK} + *
    • {@code InputEvent.BUTTON2_MASK} + *
    • {@code InputEvent.BUTTON3_MASK} + *
    + * However, it is recommended to use {@code InputEvent.BUTTON1_DOWN_MASK}, + * {@code InputEvent.BUTTON2_DOWN_MASK}, {@code InputEvent.BUTTON3_DOWN_MASK} instead. + * Either extended {@code _DOWN_MASK} or old {@code _MASK} values + * should be used, but both those models should not be mixed. + * @throws IllegalArgumentException if the {@code buttons} mask contains the mask for extra mouse button + * and support for extended mouse buttons is {@link Toolkit#areExtraMouseButtonsEnabled() disabled} by Java + * @throws IllegalArgumentException if the {@code buttons} mask contains the mask for extra mouse button + * that does not exist on the mouse and support for extended mouse buttons is {@link Toolkit#areExtraMouseButtonsEnabled() enabled} by Java * @see #mouseRelease(int) + * @see InputEvent#getMaskForButton(int) + * @see Toolkit#areExtraMouseButtonsEnabled() + * @see java.awt.MouseInfo#getNumberOfButtons() + * @see java.awt.event.MouseEvent */ public synchronized void mousePress(int buttons) { checkButtonsArgument(buttons); @@ -209,16 +256,53 @@ public class Robot { /** * Releases one or more mouse buttons. * - * @param buttons the Button mask; a combination of one or more - * of these flags: + * @param buttons the Button mask; a combination of one or more + * mouse button masks. + *

    + * It is allowed to use only a combination of valid values as a {@code buttons} parameter. + * A valid combination consists of {@code InputEvent.BUTTON1_DOWN_MASK}, + * {@code InputEvent.BUTTON2_DOWN_MASK}, {@code InputEvent.BUTTON3_DOWN_MASK} + * and values returned by the + * {@link InputEvent#getMaskForButton(int) InputEvent.getMaskForButton(button)} method. + * + * The valid combination also depends on a + * {@link Toolkit#areExtraMouseButtonsEnabled() Toolkit.areExtraMouseButtonsEnabled()} value as follows: *

      - *
    • InputEvent.BUTTON1_MASK - *
    • InputEvent.BUTTON2_MASK - *
    • InputEvent.BUTTON3_MASK + *
    • If the support for extended mouse buttons is + * {@link Toolkit#areExtraMouseButtonsEnabled() disabled} by Java + * then it is allowed to use only the following standard button masks: + * {@code InputEvent.BUTTON1_DOWN_MASK}, {@code InputEvent.BUTTON2_DOWN_MASK}, + * {@code InputEvent.BUTTON3_DOWN_MASK}. + *
    • If the support for extended mouse buttons is + * {@link Toolkit#areExtraMouseButtonsEnabled() enabled} by Java + * then it is allowed to use the standard button masks + * and masks for existing extended mouse buttons, if the mouse has more then three buttons. + * In that way, it is allowed to use the button masks corresponding to the buttons + * in the range from 1 to {@link java.awt.MouseInfo#getNumberOfButtons() MouseInfo.getNumberOfButtons()}. + *
      + * It is recommended to use the {@link InputEvent#getMaskForButton(int) InputEvent.getMaskForButton(button)} + * method to obtain the mask for any mouse button by its number. *
    + *

    + * The following standard button masks are also accepted: + *

      + *
    • {@code InputEvent.BUTTON1_MASK} + *
    • {@code InputEvent.BUTTON2_MASK} + *
    • {@code InputEvent.BUTTON3_MASK} + *
    + * However, it is recommended to use {@code InputEvent.BUTTON1_DOWN_MASK}, + * {@code InputEvent.BUTTON2_DOWN_MASK}, {@code InputEvent.BUTTON3_DOWN_MASK} instead. + * Either extended {@code _DOWN_MASK} or old {@code _MASK} values + * should be used, but both those models should not be mixed. + * @throws IllegalArgumentException if the {@code buttons} mask contains the mask for extra mouse button + * and support for extended mouse buttons is {@link Toolkit#areExtraMouseButtonsEnabled() disabled} by Java + * @throws IllegalArgumentException if the {@code buttons} mask contains the mask for extra mouse button + * that does not exist on the mouse and support for extended mouse buttons is {@link Toolkit#areExtraMouseButtonsEnabled() enabled} by Java * @see #mousePress(int) - * @throws IllegalArgumentException if the button mask is not a valid - * combination + * @see InputEvent#getMaskForButton(int) + * @see Toolkit#areExtraMouseButtonsEnabled() + * @see java.awt.MouseInfo#getNumberOfButtons() + * @see java.awt.event.MouseEvent */ public synchronized void mouseRelease(int buttons) { checkButtonsArgument(buttons); diff --git a/jdk/src/share/classes/java/awt/TextArea.java b/jdk/src/share/classes/java/awt/TextArea.java index 6d2f8ca0ced..8cf1c2ced00 100644 --- a/jdk/src/share/classes/java/awt/TextArea.java +++ b/jdk/src/share/classes/java/awt/TextArea.java @@ -321,7 +321,7 @@ public class TextArea extends TextComponent { public synchronized void insertText(String str, int pos) { TextAreaPeer peer = (TextAreaPeer)this.peer; if (peer != null) { - peer.insertText(str, pos); + peer.insert(str, pos); } else { text = text.substring(0, pos) + str + text.substring(pos); } @@ -385,7 +385,7 @@ public class TextArea extends TextComponent { public synchronized void replaceText(String str, int start, int end) { TextAreaPeer peer = (TextAreaPeer)this.peer; if (peer != null) { - peer.replaceText(str, start, end); + peer.replaceRange(str, start, end); } else { text = text.substring(0, start) + str + text.substring(end); } @@ -500,7 +500,7 @@ public class TextArea extends TextComponent { synchronized (getTreeLock()) { TextAreaPeer peer = (TextAreaPeer)this.peer; return (peer != null) ? - peer.preferredSize(rows, columns) : + peer.getPreferredSize(rows, columns) : super.preferredSize(); } } @@ -552,7 +552,7 @@ public class TextArea extends TextComponent { synchronized (getTreeLock()) { TextAreaPeer peer = (TextAreaPeer)this.peer; return (peer != null) ? - peer.minimumSize(rows, columns) : + peer.getMinimumSize(rows, columns) : super.minimumSize(); } } diff --git a/jdk/src/share/classes/java/awt/TextField.java b/jdk/src/share/classes/java/awt/TextField.java index b2659aa99f0..e5e809e1744 100644 --- a/jdk/src/share/classes/java/awt/TextField.java +++ b/jdk/src/share/classes/java/awt/TextField.java @@ -281,7 +281,7 @@ public class TextField extends TextComponent { echoChar = c; TextFieldPeer peer = (TextFieldPeer)this.peer; if (peer != null) { - peer.setEchoCharacter(c); + peer.setEchoChar(c); } } } @@ -376,7 +376,7 @@ public class TextField extends TextComponent { synchronized (getTreeLock()) { TextFieldPeer peer = (TextFieldPeer)this.peer; return (peer != null) ? - peer.preferredSize(columns) : + peer.getPreferredSize(columns) : super.preferredSize(); } } @@ -424,7 +424,7 @@ public class TextField extends TextComponent { synchronized (getTreeLock()) { TextFieldPeer peer = (TextFieldPeer)this.peer; return (peer != null) ? - peer.minimumSize(columns) : + peer.getMinimumSize(columns) : super.minimumSize(); } } diff --git a/jdk/src/share/classes/java/awt/Toolkit.java b/jdk/src/share/classes/java/awt/Toolkit.java index 5ac97013d1a..aaa6afdd5a0 100644 --- a/jdk/src/share/classes/java/awt/Toolkit.java +++ b/jdk/src/share/classes/java/awt/Toolkit.java @@ -1,5 +1,5 @@ /* - * Copyright 1995-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1995-2008 Sun Microsystems, Inc. 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 @@ -2550,4 +2550,37 @@ public abstract class Toolkit { } } } + + /** + * Reports whether events from extra mouse buttons are allowed to be processed and posted into + * {@code EventQueue}. + *
    + * To change the returned value it is necessary to set the {@code sun.awt.enableExtraMouseButtons} + * property before the {@code Toolkit} class initialization. This setting could be done on the application + * startup by the following command: + *
    +    * java -Dsun.awt.enableExtraMouseButtons=false Application
    +    * 
    + * Alternatively, the property could be set in the application by using the following code: + *
    +    * System.setProperty("sun.awt.enableExtraMouseButtons", "true");
    +    * 
    + * before the {@code Toolkit} class initialization. + * If not set by the time of the {@code Toolkit} class initialization, this property will be + * initialized with {@code true}. + * Changing this value after the {@code Toolkit} class initialization will have no effect. + *

    + * The current value could be queried by using the + * {@code System.getProperty("sun.awt.enableExtraMouseButtons")} method. + * @exception HeadlessException if GraphicsEnvironment.isHeadless() returns true + * @return {@code true} if events from extra mouse buttons are allowed to be processed and posted; + * {@code false} otherwise + * @see System#getProperty(String propertyName) + * @see System#setProperty(String propertyName, String value) + * @see java.awt.EventQueue + * @since 1.7 + */ + public boolean areExtraMouseButtonsEnabled() throws HeadlessException { + return Toolkit.getDefaultToolkit().areExtraMouseButtonsEnabled(); + } } diff --git a/jdk/src/share/classes/java/awt/Window.java b/jdk/src/share/classes/java/awt/Window.java index 94a8ff2ed5b..2651729f20d 100644 --- a/jdk/src/share/classes/java/awt/Window.java +++ b/jdk/src/share/classes/java/awt/Window.java @@ -53,6 +53,7 @@ import sun.awt.AppContext; import sun.awt.CausedFocusEvent; import sun.awt.SunToolkit; import sun.awt.util.IdentityArrayList; +import sun.java2d.Disposer; import sun.java2d.pipe.Region; import sun.security.action.GetPropertyAction; import sun.security.util.SecurityConstants; @@ -409,8 +410,6 @@ public class Window extends Container implements Accessible { } modalExclusionType = Dialog.ModalExclusionType.NO_EXCLUDE; - - sun.java2d.Disposer.addRecord(anchor, new WindowDisposerRecord(appContext, this)); } /** @@ -540,6 +539,10 @@ public class Window extends Container implements Accessible { if (owner != null) { owner.addOwnedWindow(weakThis); } + + // Fix for 6758673: this call is moved here from init(gc), because + // WindowDisposerRecord requires a proper value of parent field. + Disposer.addRecord(anchor, new WindowDisposerRecord(appContext, this)); } /** diff --git a/jdk/src/share/classes/java/awt/doc-files/DesktopProperties.html b/jdk/src/share/classes/java/awt/doc-files/DesktopProperties.html index f699ba2fa7a..5f3afb37442 100644 --- a/jdk/src/share/classes/java/awt/doc-files/DesktopProperties.html +++ b/jdk/src/share/classes/java/awt/doc-files/DesktopProperties.html @@ -1,5 +1,5 @@ + diff --git a/jdk/src/share/classes/java/net/CookieManager.java b/jdk/src/share/classes/java/net/CookieManager.java index e262dd8c2c0..6b7b1165329 100644 --- a/jdk/src/share/classes/java/net/CookieManager.java +++ b/jdk/src/share/classes/java/net/CookieManager.java @@ -107,8 +107,9 @@ import java.io.IOException; *

* * - *

The implementation conforms to RFC 2965, section 3.3. + *

The implementation conforms to RFC 2965, section 3.3. * + * @see CookiePolicy * @author Edward Wang * @since 1.6 */ diff --git a/jdk/src/share/classes/java/net/DatagramSocket.java b/jdk/src/share/classes/java/net/DatagramSocket.java index 4558632c214..40c95ef5aee 100644 --- a/jdk/src/share/classes/java/net/DatagramSocket.java +++ b/jdk/src/share/classes/java/net/DatagramSocket.java @@ -41,10 +41,11 @@ import java.security.PrivilegedExceptionAction; * one machine to another may be routed differently, and may arrive in * any order. * - *

UDP broadcasts sends are always enabled on a DatagramSocket. - * In order to receive broadcast packets a DatagramSocket - * should be bound to the wildcard address. In some - * implementations, broadcast packets may also be received when + *

Where possible, a newly constructed {@code DatagramSocket} has the + * {@link SocketOptions#SO_BROADCAST SO_BROADCAST} socket option enabled so as + * to allow the transmission of broadcast datagrams. In order to receive + * broadcast packets a DatagramSocket should be bound to the wildcard address. + * In some implementations, broadcast packets may also be received when * a DatagramSocket is bound to a more specific address. *

* Example: @@ -1017,9 +1018,18 @@ class DatagramSocket implements java.io.Closeable { /** * Enable/disable SO_BROADCAST. - * @param on whether or not to have broadcast turned on. - * @exception SocketException if there is an error - * in the underlying protocol, such as an UDP error. + * + *

Some operating systems may require that the Java virtual machine be + * started with implementation specific privileges to enable this option or + * send broadcast datagrams. + * + * @param on + * whether or not to have broadcast turned on. + * + * @throws SocketException + * if there is an error in the underlying protocol, such as an UDP + * error. + * * @since 1.4 * @see #getBroadcast() */ diff --git a/jdk/src/share/classes/java/net/HttpCookie.java b/jdk/src/share/classes/java/net/HttpCookie.java index 1fcdd6c51da..bd16d4f2723 100644 --- a/jdk/src/share/classes/java/net/HttpCookie.java +++ b/jdk/src/share/classes/java/net/HttpCookie.java @@ -33,6 +33,7 @@ import java.util.TimeZone; import java.util.Date; import java.lang.NullPointerException; // for javadoc +import java.util.Locale; /** * An HttpCookie object represents an http cookie, which carries state @@ -1058,8 +1059,7 @@ public final class HttpCookie implements Cloneable { if (assignor != null) { assignor.assign(cookie, attrName, attrValue); } else { - // must be an error - throw new IllegalArgumentException("Illegal cookie attribute"); + // Ignore the attribute as per RFC 2965 } } @@ -1097,7 +1097,7 @@ public final class HttpCookie implements Cloneable { static { cDateFormats = new SimpleDateFormat[COOKIE_DATE_FORMATS.length]; for (int i = 0; i < COOKIE_DATE_FORMATS.length; i++) { - cDateFormats[i] = new SimpleDateFormat(COOKIE_DATE_FORMATS[i]); + cDateFormats[i] = new SimpleDateFormat(COOKIE_DATE_FORMATS[i], Locale.US); cDateFormats[i].setTimeZone(TimeZone.getTimeZone("GMT")); } } diff --git a/jdk/src/share/classes/java/net/URLClassLoader.java b/jdk/src/share/classes/java/net/URLClassLoader.java index 9ffd0287c36..afb92b8c938 100644 --- a/jdk/src/share/classes/java/net/URLClassLoader.java +++ b/jdk/src/share/classes/java/net/URLClassLoader.java @@ -31,10 +31,12 @@ import java.io.File; import java.io.FilePermission; import java.io.InputStream; import java.io.IOException; +import java.io.Closeable; import java.net.URL; import java.net.URLConnection; import java.net.URLStreamHandlerFactory; import java.util.Enumeration; +import java.util.List; import java.util.NoSuchElementException; import java.util.StringTokenizer; import java.util.jar.Manifest; @@ -70,7 +72,7 @@ import sun.security.util.SecurityConstants; * @author David Connelly * @since 1.2 */ -public class URLClassLoader extends SecureClassLoader { +public class URLClassLoader extends SecureClassLoader implements Closeable { /* The search path for classes and resources */ URLClassPath ucp; @@ -85,13 +87,13 @@ public class URLClassLoader extends SecureClassLoader { * to refer to a JAR file which will be downloaded and opened as needed. * *

If there is a security manager, this method first - * calls the security manager's checkCreateClassLoader method + * calls the security manager's {@code checkCreateClassLoader} method * to ensure creation of a class loader is allowed. * * @param urls the URLs from which to load classes and resources * @param parent the parent class loader for delegation * @exception SecurityException if a security manager exists and its - * checkCreateClassLoader method doesn't allow + * {@code checkCreateClassLoader} method doesn't allow * creation of a class loader. * @see SecurityManager#checkCreateClassLoader */ @@ -169,12 +171,65 @@ public class URLClassLoader extends SecureClassLoader { acc = AccessController.getContext(); } + + /** + * Closes this URLClassLoader, so that it can no longer be used to load + * new classes or resources that are defined by this loader. + * Classes and resources defined by any of this loader's parents in the + * delegation hierarchy are still accessible. Also, any classes or resources + * that are already loaded, are still accessible. + *

+ * In the case of jar: and file: URLs, it also closes any class files, + * or JAR files that were opened by it. If another thread is loading a + * class when the {@code close} method is invoked, then the result of + * that load is undefined. + *

+ * The method makes a best effort attempt to close all opened files, + * by catching {@link IOException}s internally. Unchecked exceptions + * and errors are not caught. Calling close on an already closed + * loader has no effect. + *

+ * @throws IOException if closing any file opened by this class loader + * resulted in an IOException. Any such exceptions are caught, and a + * single IOException is thrown after the last file has been closed. + * If only one exception was thrown, it will be set as the cause + * of this IOException. + * + * @throws SecurityException if a security manager is set, and it denies + * {@link RuntimePermission}("closeClassLoader") + * + * @since 1.7 + */ + public void close() throws IOException { + SecurityManager security = System.getSecurityManager(); + if (security != null) { + security.checkPermission(new RuntimePermission("closeClassLoader")); + } + List errors = ucp.closeLoaders(); + if (errors.isEmpty()) { + return; + } + if (errors.size() == 1) { + throw new IOException ( + "Error closing URLClassLoader resource", + errors.get(0) + ); + } + // Several exceptions. So, just combine the error messages + String errormsg = "Error closing resources: "; + for (IOException error: errors) { + errormsg = errormsg + "[" + error.toString() + "] "; + } + throw new IOException (errormsg); + } + /** * Appends the specified URL to the list of URLs to search for * classes and resources. *

* If the URL specified is null or is already in the - * list of URLs, then invoking this method has no effect. + * list of URLs, or if this loader is closed, then invoking this + * method has no effect. * * @param url the URL to be added to the search path of URLs */ @@ -199,7 +254,8 @@ public class URLClassLoader extends SecureClassLoader { * * @param name the name of the class * @return the resulting class - * @exception ClassNotFoundException if the class could not be found + * @exception ClassNotFoundException if the class could not be found, + * or if the loader is closed. */ protected Class findClass(final String name) throws ClassNotFoundException @@ -370,7 +426,7 @@ public class URLClassLoader extends SecureClassLoader { * * @param name the name of the resource * @return a URL for the resource, or null - * if the resource could not be found. + * if the resource could not be found, or if the loader is closed. */ public URL findResource(final String name) { /* @@ -393,6 +449,7 @@ public class URLClassLoader extends SecureClassLoader { * @param name the resource name * @exception IOException if an I/O exception occurs * @return an Enumeration of URLs + * If the loader is closed, the Enumeration will be empty. */ public Enumeration findResources(final String name) throws IOException diff --git a/jdk/src/share/classes/java/util/Calendar.java b/jdk/src/share/classes/java/util/Calendar.java index e1f65e6a885..7fa8296433c 100644 --- a/jdk/src/share/classes/java/util/Calendar.java +++ b/jdk/src/share/classes/java/util/Calendar.java @@ -1190,7 +1190,9 @@ public abstract class Calendar implements Serializable, Cloneable, Comparable extends Iterable { * contract for the Object.hashCode method, programmers should * take note that any class that overrides the Object.equals * method must also override the Object.hashCode method in order - * to satisfy the general contract for the Object.hashCodemethod. + * to satisfy the general contract for the Object.hashCode method. * In particular, c1.equals(c2) implies that * c1.hashCode()==c2.hashCode(). * diff --git a/jdk/src/share/classes/java/util/CurrencyData.properties b/jdk/src/share/classes/java/util/CurrencyData.properties index 15c45302e96..cbb96d8ab49 100644 --- a/jdk/src/share/classes/java/util/CurrencyData.properties +++ b/jdk/src/share/classes/java/util/CurrencyData.properties @@ -441,12 +441,16 @@ RO=ROL;2005-06-30-21-00-00;RON RU=RUB # RWANDA RW=RWF +# SAINT BARTHELEMY +BL=EUR # SAINT HELENA SH=SHP # SAINT KITTS AND NEVIS KN=XCD # SAINT LUCIA LC=XCD +# SAINT MARTIN +MF=EUR # SAINT PIERRE AND MIQUELON PM=EUR # SAINT VINCENT AND THE GRENADINES diff --git a/jdk/src/share/classes/java/util/Formatter.java b/jdk/src/share/classes/java/util/Formatter.java index ad4dca1d3e6..eb49ec9c5da 100644 --- a/jdk/src/share/classes/java/util/Formatter.java +++ b/jdk/src/share/classes/java/util/Formatter.java @@ -39,6 +39,7 @@ import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.math.BigInteger; import java.math.MathContext; +import java.math.RoundingMode; import java.nio.charset.Charset; import java.text.DateFormatSymbols; import java.text.DecimalFormat; @@ -58,7 +59,7 @@ import sun.misc.FormattedFloatingDecimal; * An interpreter for printf-style format strings. This class provides support * for layout justification and alignment, common formats for numeric, string, * and date/time data, and locale-specific output. Common Java types such as - * byte, {@link java.math.BigDecimal BigDecimal}, and {@link Calendar} + * {@code byte}, {@link java.math.BigDecimal BigDecimal}, and {@link Calendar} * are supported. Limited formatting customization for arbitrary user types is * provided through the {@link Formattable} interface. * @@ -67,7 +68,7 @@ import sun.misc.FormattedFloatingDecimal; * class. * *

Formatted printing for the Java language is heavily inspired by C's - * printf. Although the format strings are similar to C, some + * {@code printf}. Although the format strings are similar to C, some * customizations have been made to accommodate the Java language and exploit * some of its features. Also, Java formatting is more strict than C's; for * example, if a conversion is incompatible with a flag, an exception will be @@ -114,7 +115,7 @@ import sun.misc.FormattedFloatingDecimal; * // -> "Unable to open file 'food': No such file or directory" * * - *

Like C's sprintf(3), Strings may be formatted using the static + *

Like C's {@code sprintf(3)}, Strings may be formatted using the static * method {@link String#format(String,Object...) String.format}: * *

@@ -156,16 +157,16 @@ import sun.misc.FormattedFloatingDecimal;
  *   String s = String.format("Duke's Birthday: %1$tm %1$te,%1$tY", c);
  * 
* - * This format string is the first argument to the format method. It - * contains three format specifiers "%1$tm", "%1$te", and - * "%1$tY" which indicate how the arguments should be processed and + * This format string is the first argument to the {@code format} method. It + * contains three format specifiers "{@code %1$tm}", "{@code %1$te}", and + * "{@code %1$tY}" which indicate how the arguments should be processed and * where they should be inserted in the text. The remaining portions of the - * format string are fixed text including "Dukes Birthday: " and any + * format string are fixed text including {@code "Dukes Birthday: "} and any * other spaces or punctuation. * * The argument list consists of all arguments passed to the method after the * format string. In the above example, the argument list is of size one and - * consists of the {@link java.util.Calendar Calendar} object c. + * consists of the {@link java.util.Calendar Calendar} object {@code c}. * *
    * @@ -178,7 +179,7 @@ import sun.misc.FormattedFloatingDecimal; * *

    The optional argument_index is a decimal integer indicating the * position of the argument in the argument list. The first argument is - * referenced by "1$", the second by "2$", etc. + * referenced by "{@code 1$}", the second by "{@code 2$}", etc. * *

    The optional flags is a set of characters that modify the output * format. The set of valid flags depends on the conversion. @@ -205,10 +206,10 @@ import sun.misc.FormattedFloatingDecimal; * defined as above. * *

    The required conversion is a two character sequence. The first - * character is 't' or 'T'. The second character indicates + * character is {@code 't'} or {@code 'T'}. The second character indicates * the format to be used. These characters are similar to but not completely - * identical to those defined by GNU date and POSIX - * strftime(3c). + * identical to those defined by GNU {@code date} and POSIX + * {@code strftime(3c)}. * *

  • The format specifiers which do not correspond to arguments have the * following syntax: @@ -234,31 +235,31 @@ import sun.misc.FormattedFloatingDecimal; * type * *
  • Character - may be applied to basic types which represent - * Unicode characters: char, {@link Character}, byte, {@link - * Byte}, short, and {@link Short}. This conversion may also be - * applied to the types int and {@link Integer} when {@link - * Character#isValidCodePoint} returns true + * Unicode characters: {@code char}, {@link Character}, {@code byte}, {@link + * Byte}, {@code short}, and {@link Short}. This conversion may also be + * applied to the types {@code int} and {@link Integer} when {@link + * Character#isValidCodePoint} returns {@code true} * *
  • Numeric * *
      * - *
    1. Integral - may be applied to Java integral types: byte, - * {@link Byte}, short, {@link Short}, int and {@link - * Integer}, long, {@link Long}, and {@link java.math.BigInteger + *
    2. Integral - may be applied to Java integral types: {@code byte}, + * {@link Byte}, {@code short}, {@link Short}, {@code int} and {@link + * Integer}, {@code long}, {@link Long}, and {@link java.math.BigInteger * BigInteger} * *
    3. Floating Point - may be applied to Java floating-point types: - * float, {@link Float}, double, {@link Double}, and {@link + * {@code float}, {@link Float}, {@code double}, {@link Double}, and {@link * java.math.BigDecimal BigDecimal} * *
    * *
  • Date/Time - may be applied to Java types which are capable of - * encoding a date or time: long, {@link Long}, {@link Calendar}, and + * encoding a date or time: {@code long}, {@link Long}, {@link Calendar}, and * {@link Date}. * - *
  • Percent - produces a literal '%' + *
  • Percent - produces a literal {@code '%'} * ('\u0025') * *
  • Line Separator - produces the platform-specific line separator @@ -266,9 +267,9 @@ import sun.misc.FormattedFloatingDecimal; * * *

    The following table summarizes the supported conversions. Conversions - * denoted by an upper-case character (i.e. 'B', 'H', - * 'S', 'C', 'X', 'E', 'G', - * 'A', and 'T') are the same as those for the corresponding + * denoted by an upper-case character (i.e. {@code 'B'}, {@code 'H'}, + * {@code 'S'}, {@code 'C'}, {@code 'X'}, {@code 'E'}, {@code 'G'}, + * {@code 'A'}, and {@code 'T'}) are the same as those for the corresponding * lower-case conversion characters except that the result is converted to * upper case according to the rules of the prevailing {@link java.util.Locale * Locale}. The result is equivalent to the following invocation of {@link @@ -283,72 +284,72 @@ import sun.misc.FormattedFloatingDecimal; * Argument Category * Description * - * 'b', 'B' + * {@code 'b'}, {@code 'B'} * general - * If the argument arg is null, then the result is - * "false". If arg is a boolean or {@link + * If the argument arg is {@code null}, then the result is + * "{@code false}". If arg is a {@code boolean} or {@link * Boolean}, then the result is the string returned by {@link * String#valueOf(boolean) String.valueOf(arg)}. Otherwise, the result is * "true". * - * 'h', 'H' + * {@code 'h'}, {@code 'H'} * general - * If the argument arg is null, then the result is - * "null". Otherwise, the result is obtained by invoking - * Integer.toHexString(arg.hashCode()). + * If the argument arg is {@code null}, then the result is + * "{@code null}". Otherwise, the result is obtained by invoking + * {@code Integer.toHexString(arg.hashCode())}. * - * 's', 'S' + * {@code 's'}, {@code 'S'} * general - * If the argument arg is null, then the result is - * "null". If arg implements {@link Formattable}, then + * If the argument arg is {@code null}, then the result is + * "{@code null}". If arg implements {@link Formattable}, then * {@link Formattable#formatTo arg.formatTo} is invoked. Otherwise, the - * result is obtained by invoking arg.toString(). + * result is obtained by invoking {@code arg.toString()}. * - * 'c', 'C' + * {@code 'c'}, {@code 'C'} * character * The result is a Unicode character * - * 'd' + * {@code 'd'} * integral * The result is formatted as a decimal integer * - * 'o' + * {@code 'o'} * integral * The result is formatted as an octal integer * - * 'x', 'X' + * {@code 'x'}, {@code 'X'} * integral * The result is formatted as a hexadecimal integer * - * 'e', 'E' + * {@code 'e'}, {@code 'E'} * floating point * The result is formatted as a decimal number in computerized * scientific notation * - * 'f' + * {@code 'f'} * floating point * The result is formatted as a decimal number * - * 'g', 'G' + * {@code 'g'}, {@code 'G'} * floating point * The result is formatted using computerized scientific notation or * decimal format, depending on the precision and the value after rounding. * - * 'a', 'A' + * {@code 'a'}, {@code 'A'} * floating point * The result is formatted as a hexadecimal floating-point number with * a significand and an exponent * - * 't', 'T' + * {@code 't'}, {@code 'T'} * date/time * Prefix for date and time conversion characters. See Date/Time Conversions. * - * '%' + * {@code '%'} * percent - * The result is a literal '%' ('\u0025') + * The result is a literal {@code '%'} ('\u0025') * - * 'n' + * {@code 'n'} * line separator * The result is the platform-specific line separator * @@ -360,78 +361,78 @@ import sun.misc.FormattedFloatingDecimal; *

    Date/Time Conversions

    * *

    The following date and time conversion suffix characters are defined for - * the 't' and 'T' conversions. The types are similar to but - * not completely identical to those defined by GNU date and POSIX - * strftime(3c). Additional conversion types are provided to access - * Java-specific functionality (e.g. 'L' for milliseconds within the + * the {@code 't'} and {@code 'T'} conversions. The types are similar to but + * not completely identical to those defined by GNU {@code date} and POSIX + * {@code strftime(3c)}. Additional conversion types are provided to access + * Java-specific functionality (e.g. {@code 'L'} for milliseconds within the * second). * *

    The following conversion characters are used for formatting times: * * * - *
    'H' + *
    {@code 'H'} * Hour of the day for the 24-hour clock, formatted as two digits with - * a leading zero as necessary i.e. 00 - 23. + * a leading zero as necessary i.e. {@code 00 - 23}. * - *
    'I' + *
    {@code 'I'} * Hour for the 12-hour clock, formatted as two digits with a leading - * zero as necessary, i.e. 01 - 12. + * zero as necessary, i.e. {@code 01 - 12}. * - *
    'k' - * Hour of the day for the 24-hour clock, i.e. 0 - 23. + *
    {@code 'k'} + * Hour of the day for the 24-hour clock, i.e. {@code 0 - 23}. * - *
    'l' - * Hour for the 12-hour clock, i.e. 1 - 12. + *
    {@code 'l'} + * Hour for the 12-hour clock, i.e. {@code 1 - 12}. * - *
    'M' + *
    {@code 'M'} * Minute within the hour formatted as two digits with a leading zero - * as necessary, i.e. 00 - 59. + * as necessary, i.e. {@code 00 - 59}. * - *
    'S' + *
    {@code 'S'} * Seconds within the minute, formatted as two digits with a leading - * zero as necessary, i.e. 00 - 60 ("60" is a special + * zero as necessary, i.e. {@code 00 - 60} ("{@code 60}" is a special * value required to support leap seconds). * - *
    'L' + *
    {@code 'L'} * Millisecond within the second formatted as three digits with - * leading zeros as necessary, i.e. 000 - 999. + * leading zeros as necessary, i.e. {@code 000 - 999}. * - *
    'N' + *
    {@code 'N'} * Nanosecond within the second, formatted as nine digits with leading - * zeros as necessary, i.e. 000000000 - 999999999. + * zeros as necessary, i.e. {@code 000000000 - 999999999}. * - *
    'p' + *
    {@code 'p'} * Locale-specific {@linkplain * java.text.DateFormatSymbols#getAmPmStrings morning or afternoon} marker - * in lower case, e.g."am" or "pm". Use of the conversion - * prefix 'T' forces this output to upper case. + * in lower case, e.g."{@code am}" or "{@code pm}". Use of the conversion + * prefix {@code 'T'} forces this output to upper case. * - *
    'z' + *
    {@code 'z'} * RFC 822 - * style numeric time zone offset from GMT, e.g. -0800. This + * style numeric time zone offset from GMT, e.g. {@code -0800}. This * value will be adjusted as necessary for Daylight Saving Time. For - * long, {@link Long}, and {@link Date} the time zone used is - * the {@plainlink TimeZone#getDefault() default time zone} for this + * {@code long}, {@link Long}, and {@link Date} the time zone used is + * the {@linkplain TimeZone#getDefault() default time zone} for this * instance of the Java virtual machine. * - *
    'Z' + *
    {@code 'Z'} * A string representing the abbreviation for the time zone. This * value will be adjusted as necessary for Daylight Saving Time. For - * long, {@link Long}, and {@link Date} the time zone used is - * the {@plainlink TimeZone#getDefault() default time zone} for this + * {@code long}, {@link Long}, and {@link Date} the time zone used is + * the {@linkplain TimeZone#getDefault() default time zone} for this * instance of the Java virtual machine. The Formatter's locale will * supersede the locale of the argument (if any). * - *
    's' + *
    {@code 's'} * Seconds since the beginning of the epoch starting at 1 January 1970 - * 00:00:00 UTC, i.e. Long.MIN_VALUE/1000 to - * Long.MAX_VALUE/1000. + * {@code 00:00:00} UTC, i.e. {@code Long.MIN_VALUE/1000} to + * {@code Long.MAX_VALUE/1000}. * - *
    'Q' + *
    {@code 'Q'} * Milliseconds since the beginning of the epoch starting at 1 January - * 1970 00:00:00 UTC, i.e. Long.MIN_VALUE to - * Long.MAX_VALUE. + * 1970 {@code 00:00:00} UTC, i.e. {@code Long.MIN_VALUE} to + * {@code Long.MAX_VALUE}. * *
    * @@ -439,55 +440,55 @@ import sun.misc.FormattedFloatingDecimal; * * * - *
    'B' + *
    {@code 'B'} * Locale-specific {@linkplain java.text.DateFormatSymbols#getMonths - * full month name}, e.g. "January", "February". + * full month name}, e.g. {@code "January"}, {@code "February"}. * - *
    'b' + *
    {@code 'b'} * Locale-specific {@linkplain * java.text.DateFormatSymbols#getShortMonths abbreviated month name}, - * e.g. "Jan", "Feb". + * e.g. {@code "Jan"}, {@code "Feb"}. * - *
    'h' - * Same as 'b'. + *
    {@code 'h'} + * Same as {@code 'b'}. * - *
    'A' + *
    {@code 'A'} * Locale-specific full name of the {@linkplain * java.text.DateFormatSymbols#getWeekdays day of the week}, - * e.g. "Sunday", "Monday" + * e.g. {@code "Sunday"}, {@code "Monday"} * - *
    'a' + *
    {@code 'a'} * Locale-specific short name of the {@linkplain * java.text.DateFormatSymbols#getShortWeekdays day of the week}, - * e.g. "Sun", "Mon" + * e.g. {@code "Sun"}, {@code "Mon"} * - *
    'C' - * Four-digit year divided by 100, formatted as two digits - * with leading zero as necessary, i.e. 00 - 99 + *
    {@code 'C'} + * Four-digit year divided by {@code 100}, formatted as two digits + * with leading zero as necessary, i.e. {@code 00 - 99} * - *
    'Y' + *
    {@code 'Y'} * Year, formatted as at least four digits with leading zeros as - * necessary, e.g. 0092 equals 92 CE for the Gregorian + * necessary, e.g. {@code 0092} equals {@code 92} CE for the Gregorian * calendar. * - *
    'y' + *
    {@code 'y'} * Last two digits of the year, formatted with leading zeros as - * necessary, i.e. 00 - 99. + * necessary, i.e. {@code 00 - 99}. * - *
    'j' + *
    {@code 'j'} * Day of year, formatted as three digits with leading zeros as - * necessary, e.g. 001 - 366 for the Gregorian calendar. + * necessary, e.g. {@code 001 - 366} for the Gregorian calendar. * - *
    'm' + *
    {@code 'm'} * Month, formatted as two digits with leading zeros as necessary, - * i.e. 01 - 13. + * i.e. {@code 01 - 13}. * - *
    'd' + *
    {@code 'd'} * Day of month, formatted as two digits with leading zeros as - * necessary, i.e. 01 - 31 + * necessary, i.e. {@code 01 - 31} * - *
    'e' - * Day of month, formatted as two digits, i.e. 1 - 31. + *
    {@code 'e'} + * Day of month, formatted as two digits, i.e. {@code 1 - 31}. * *
    * @@ -496,27 +497,27 @@ import sun.misc.FormattedFloatingDecimal; * * * - *
    'R' - * Time formatted for the 24-hour clock as "%tH:%tM" + *
    {@code 'R'} + * Time formatted for the 24-hour clock as {@code "%tH:%tM"} * - *
    'T' - * Time formatted for the 24-hour clock as "%tH:%tM:%tS". + *
    {@code 'T'} + * Time formatted for the 24-hour clock as {@code "%tH:%tM:%tS"}. * - *
    'r' - * Time formatted for the 12-hour clock as "%tI:%tM:%tS %Tp". - * The location of the morning or afternoon marker ('%Tp') may be + *
    {@code 'r'} + * Time formatted for the 12-hour clock as {@code "%tI:%tM:%tS %Tp"}. + * The location of the morning or afternoon marker ({@code '%Tp'}) may be * locale-dependent. * - *
    'D' - * Date formatted as "%tm/%td/%ty". + *
    {@code 'D'} + * Date formatted as {@code "%tm/%td/%ty"}. * - *
    'F' + *
    {@code 'F'} * ISO 8601 - * complete date formatted as "%tY-%tm-%td". + * complete date formatted as {@code "%tY-%tm-%td"}. * - *
    'c' - * Date and time formatted as "%ta %tb %td %tT %tZ %tY", - * e.g. "Sun Jul 20 16:17:00 EDT 1969". + *
    {@code 'c'} + * Date and time formatted as {@code "%ta %tb %td %tT %tZ %tY"}, + * e.g. {@code "Sun Jul 20 16:17:00 EDT 1969"}. * *
    * @@ -590,18 +591,18 @@ import sun.misc.FormattedFloatingDecimal; * *

    1 Depends on the definition of {@link Formattable}. * - *

    2 For 'd' conversion only. + *

    2 For {@code 'd'} conversion only. * - *

    3 For 'o', 'x', and 'X' + *

    3 For {@code 'o'}, {@code 'x'}, and {@code 'X'} * conversions only. * - *

    4 For 'd', 'o', 'x', and - * 'X' conversions applied to {@link java.math.BigInteger BigInteger} - * or 'd' applied to byte, {@link Byte}, short, {@link - * Short}, int and {@link Integer}, long, and {@link Long}. + *

    4 For {@code 'd'}, {@code 'o'}, {@code 'x'}, and + * {@code 'X'} conversions applied to {@link java.math.BigInteger BigInteger} + * or {@code 'd'} applied to {@code byte}, {@link Byte}, {@code short}, {@link + * Short}, {@code int} and {@link Integer}, {@code long}, and {@link Long}. * - *

    5 For 'e', 'E', 'f', - * 'g', and 'G' conversions only. + *

    5 For {@code 'e'}, {@code 'E'}, {@code 'f'}, + * {@code 'g'}, and {@code 'G'} conversions only. * *

    Any characters not explicitly defined as flags are illegal and are * reserved for future extensions. @@ -617,11 +618,11 @@ import sun.misc.FormattedFloatingDecimal; *

    For general argument types, the precision is the maximum number of * characters to be written to the output. * - *

    For the floating-point conversions 'e', 'E', and - * 'f' the precision is the number of digits after the decimal - * separator. If the conversion is 'g' or 'G', then the + *

    For the floating-point conversions {@code 'e'}, {@code 'E'}, and + * {@code 'f'} the precision is the number of digits after the decimal + * separator. If the conversion is {@code 'g'} or {@code 'G'}, then the * precision is the total number of digits in the resulting magnitude after - * rounding. If the conversion is 'a' or 'A', then the + * rounding. If the conversion is {@code 'a'} or {@code 'A'}, then the * precision must not be specified. * *

    For character, integral, and date/time argument types and the percent @@ -632,10 +633,10 @@ import sun.misc.FormattedFloatingDecimal; * *

    The argument index is a decimal integer indicating the position of the * argument in the argument list. The first argument is referenced by - * "1$", the second by "2$", etc. + * "{@code 1$}", the second by "{@code 2$}", etc. * *

    Another way to reference arguments by position is to use the - * '<' ('\u003c') flag, which causes the argument for + * {@code '<'} ('\u003c') flag, which causes the argument for * the previous format specifier to be re-used. For example, the following two * statements would produce identical strings: * @@ -669,14 +670,14 @@ import sun.misc.FormattedFloatingDecimal; * applicable to the corresponding argument, then an {@link * IllegalFormatConversionException} will be thrown. * - *

    All specified exceptions may be thrown by any of the format - * methods of Formatter as well as by any format convenience + *

    All specified exceptions may be thrown by any of the {@code format} + * methods of {@code Formatter} as well as by any {@code format} convenience * methods such as {@link String#format(String,Object...) String.format} and * {@link java.io.PrintStream#printf(String,Object...) PrintStream.printf}. * - *

    Conversions denoted by an upper-case character (i.e. 'B', - * 'H', 'S', 'C', 'X', 'E', - * 'G', 'A', and 'T') are the same as those for the + *

    Conversions denoted by an upper-case character (i.e. {@code 'B'}, + * {@code 'H'}, {@code 'S'}, {@code 'C'}, {@code 'X'}, {@code 'E'}, + * {@code 'G'}, {@code 'A'}, and {@code 'T'}) are the same as those for the * corresponding lower-case conversion characters except that the result is * converted to upper case according to the rules of the prevailing {@link * java.util.Locale Locale}. The result is equivalent to the following @@ -691,56 +692,56 @@ import sun.misc.FormattedFloatingDecimal; * * * - *
    'b' + *
    {@code 'b'} * '\u0062' - * Produces either "true" or "false" as returned by + * Produces either "{@code true}" or "{@code false}" as returned by * {@link Boolean#toString(boolean)}. * - *

    If the argument is null, then the result is - * "false". If the argument is a boolean or {@link + *

    If the argument is {@code null}, then the result is + * "{@code false}". If the argument is a {@code boolean} or {@link * Boolean}, then the result is the string returned by {@link * String#valueOf(boolean) String.valueOf()}. Otherwise, the result is - * "true". + * "{@code true}". * - *

    If the '#' flag is given, then a {@link + *

    If the {@code '#'} flag is given, then a {@link * FormatFlagsConversionMismatchException} will be thrown. * - *

    'B' + *
    {@code 'B'} * '\u0042' - * The upper-case variant of 'b'. + * The upper-case variant of {@code 'b'}. * - *
    'h' + *
    {@code 'h'} * '\u0068' * Produces a string representing the hash code value of the object. * - *

    If the argument, arg is null, then the - * result is "null". Otherwise, the result is obtained - * by invoking Integer.toHexString(arg.hashCode()). + *

    If the argument, arg is {@code null}, then the + * result is "{@code null}". Otherwise, the result is obtained + * by invoking {@code Integer.toHexString(arg.hashCode())}. * - *

    If the '#' flag is given, then a {@link + *

    If the {@code '#'} flag is given, then a {@link * FormatFlagsConversionMismatchException} will be thrown. * - *

    'H' + *
    {@code 'H'} * '\u0048' - * The upper-case variant of 'h'. + * The upper-case variant of {@code 'h'}. * - *
    's' + *
    {@code 's'} * '\u0073' * Produces a string. * - *

    If the argument is null, then the result is - * "null". If the argument implements {@link Formattable}, then + *

    If the argument is {@code null}, then the result is + * "{@code null}". If the argument implements {@link Formattable}, then * its {@link Formattable#formatTo formatTo} method is invoked. * Otherwise, the result is obtained by invoking the argument's - * toString() method. + * {@code toString()} method. * - *

    If the '#' flag is given and the argument is not a {@link + *

    If the {@code '#'} flag is given and the argument is not a {@link * Formattable} , then a {@link FormatFlagsConversionMismatchException} * will be thrown. * - *

    'S' + *
    {@code 'S'} * '\u0053' - * The upper-case variant of 's'. + * The upper-case variant of {@code 's'}. * *
    * @@ -748,7 +749,7 @@ import sun.misc.FormattedFloatingDecimal; * * * - *
    '-' + *
    {@code '-'} * '\u002d' * Left justifies the output. Spaces ('\u0020') will be * added at the end of the converted value as required to fill the minimum @@ -756,7 +757,7 @@ import sun.misc.FormattedFloatingDecimal; * MissingFormatWidthException} will be thrown. If this flag is not given * then the output will be right-justified. * - *
    '#' + *
    {@code '#'} * '\u0023' * Requires the output use an alternate form. The definition of the * form is specified by the conversion. @@ -766,47 +767,47 @@ import sun.misc.FormattedFloatingDecimal; *

    The width is the minimum number of characters to * be written to the * output. If the length of the converted value is less than the width then - * the output will be padded by '  ' (\u0020') + * the output will be padded by '  ' ('\u0020') * until the total number of characters equals the width. The padding is on - * the left by default. If the '-' flag is given, then the padding + * the left by default. If the {@code '-'} flag is given, then the padding * will be on the right. If the width is not specified then there is no * minimum. * *

    The precision is the maximum number of characters to be written to the * output. The precision is applied before the width, thus the output will be - * truncated to precision characters even if the width is greater than + * truncated to {@code precision} characters even if the width is greater than * the precision. If the precision is not specified then there is no explicit * limit on the number of characters. * *

    Character

    * - * This conversion may be applied to char and {@link Character}. It - * may also be applied to the types byte, {@link Byte}, - * short, and {@link Short}, int and {@link Integer} when - * {@link Character#isValidCodePoint} returns true. If it returns - * false then an {@link IllegalFormatCodePointException} will be + * This conversion may be applied to {@code char} and {@link Character}. It + * may also be applied to the types {@code byte}, {@link Byte}, + * {@code short}, and {@link Short}, {@code int} and {@link Integer} when + * {@link Character#isValidCodePoint} returns {@code true}. If it returns + * {@code false} then an {@link IllegalFormatCodePointException} will be * thrown. * * * - *
    'c' + *
    {@code 'c'} * '\u0063' * Formats the argument as a Unicode character as described in Unicode Character - * Representation. This may be more than one 16-bit char in + * Representation. This may be more than one 16-bit {@code char} in * the case where the argument represents a supplementary character. * - *

    If the '#' flag is given, then a {@link + *

    If the {@code '#'} flag is given, then a {@link * FormatFlagsConversionMismatchException} will be thrown. * - *

    'C' + *
    {@code 'C'} * '\u0043' - * The upper-case variant of 'c'. + * The upper-case variant of {@code 'c'}. * *
    * - *

    The '-' flag defined for General - * conversions applies. If the '#' flag is given, then a {@link + *

    The {@code '-'} flag defined for General + * conversions applies. If the {@code '#'} flag is given, then a {@link * FormatFlagsConversionMismatchException} will be thrown. * *

    The width is defined as for General conversions. @@ -843,14 +844,14 @@ import sun.misc.FormattedFloatingDecimal; *

  • Each digit character d in the string is replaced by a * locale-specific digit computed relative to the current locale's * {@linkplain java.text.DecimalFormatSymbols#getZeroDigit() zero digit} - * z; that is d -  '0' + * z; that is d -  {@code '0'} *  + z. * *
  • If a decimal separator is present, a locale-specific {@linkplain * java.text.DecimalFormatSymbols#getDecimalSeparator decimal separator} is * substituted. * - *
  • If the ',' ('\u002c') + *
  • If the {@code ','} ('\u002c') * flag is given, then the locale-specific {@linkplain * java.text.DecimalFormatSymbols#getGroupingSeparator grouping separator} is * inserted by scanning the integer part of the string from least significant @@ -858,111 +859,111 @@ import sun.misc.FormattedFloatingDecimal; * the locale's {@linkplain java.text.DecimalFormat#getGroupingSize() grouping * size}. * - *
  • If the '0' flag is given, then the locale-specific {@linkplain + *
  • If the {@code '0'} flag is given, then the locale-specific {@linkplain * java.text.DecimalFormatSymbols#getZeroDigit() zero digits} are inserted * after the sign character, if any, and before the first non-zero digit, until * the length of the string is equal to the requested field width. * - *
  • If the value is negative and the '(' flag is given, then a - * '(' ('\u0028') is prepended and a ')' + *
  • If the value is negative and the {@code '('} flag is given, then a + * {@code '('} ('\u0028') is prepended and a {@code ')'} * ('\u0029') is appended. * *
  • If the value is negative (or floating-point negative zero) and - * '(' flag is not given, then a '-' ('\u002d') + * {@code '('} flag is not given, then a {@code '-'} ('\u002d') * is prepended. * - *
  • If the '+' flag is given and the value is positive or zero (or - * floating-point positive zero), then a '+' ('\u002b') + *
  • If the {@code '+'} flag is given and the value is positive or zero (or + * floating-point positive zero), then a {@code '+'} ('\u002b') * will be prepended. * * * *

    If the value is NaN or positive infinity the literal strings "NaN" or * "Infinity" respectively, will be output. If the value is negative infinity, - * then the output will be "(Infinity)" if the '(' flag is given + * then the output will be "(Infinity)" if the {@code '('} flag is given * otherwise the output will be "-Infinity". These values are not localized. * *

    Byte, Short, Integer, and Long * - *

    The following conversions may be applied to byte, {@link Byte}, - * short, {@link Short}, int and {@link Integer}, - * long, and {@link Long}. + *

    The following conversions may be applied to {@code byte}, {@link Byte}, + * {@code short}, {@link Short}, {@code int} and {@link Integer}, + * {@code long}, and {@link Long}. * * * - *
    'd' + *
    {@code 'd'} * '\u0054' * Formats the argument as a decimal integer. The localization algorithm is applied. * - *

    If the '0' flag is given and the value is negative, then + *

    If the {@code '0'} flag is given and the value is negative, then * the zero padding will occur after the sign. * - *

    If the '#' flag is given then a {@link + *

    If the {@code '#'} flag is given then a {@link * FormatFlagsConversionMismatchException} will be thrown. * - *

    'o' + *
    {@code 'o'} * '\u006f' * Formats the argument as an integer in base eight. No localization * is applied. * *

    If x is negative then the result will be an unsigned value - * generated by adding 2n to the value where n is the - * number of bits in the type as returned by the static SIZE field + * generated by adding 2n to the value where {@code n} is the + * number of bits in the type as returned by the static {@code SIZE} field * in the {@linkplain Byte#SIZE Byte}, {@linkplain Short#SIZE Short}, * {@linkplain Integer#SIZE Integer}, or {@linkplain Long#SIZE Long} * classes as appropriate. * - *

    If the '#' flag is given then the output will always begin - * with the radix indicator '0'. + *

    If the {@code '#'} flag is given then the output will always begin + * with the radix indicator {@code '0'}. * - *

    If the '0' flag is given then the output will be padded + *

    If the {@code '0'} flag is given then the output will be padded * with leading zeros to the field width following any indication of sign. * - *

    If '(', '+', '  ', or ',' flags + *

    If {@code '('}, {@code '+'}, '  ', or {@code ','} flags * are given then a {@link FormatFlagsConversionMismatchException} will be * thrown. * - *

    'x' + *
    {@code 'x'} * '\u0078' * Formats the argument as an integer in base sixteen. No * localization is applied. * *

    If x is negative then the result will be an unsigned value - * generated by adding 2n to the value where n is the - * number of bits in the type as returned by the static SIZE field + * generated by adding 2n to the value where {@code n} is the + * number of bits in the type as returned by the static {@code SIZE} field * in the {@linkplain Byte#SIZE Byte}, {@linkplain Short#SIZE Short}, * {@linkplain Integer#SIZE Integer}, or {@linkplain Long#SIZE Long} * classes as appropriate. * - *

    If the '#' flag is given then the output will always begin - * with the radix indicator "0x". + *

    If the {@code '#'} flag is given then the output will always begin + * with the radix indicator {@code "0x"}. * - *

    If the '0' flag is given then the output will be padded to + *

    If the {@code '0'} flag is given then the output will be padded to * the field width with leading zeros after the radix indicator or sign (if * present). * - *

    If '(', '  ', '+', or - * ',' flags are given then a {@link + *

    If {@code '('}, '  ', {@code '+'}, or + * {@code ','} flags are given then a {@link * FormatFlagsConversionMismatchException} will be thrown. * - *

    'X' + *
    {@code 'X'} * '\u0058' - * The upper-case variant of 'x'. The entire string + * The upper-case variant of {@code 'x'}. The entire string * representing the number will be converted to {@linkplain - * String#toUpperCase upper case} including the 'x' (if any) and - * all hexadecimal digits 'a' - 'f' + * String#toUpperCase upper case} including the {@code 'x'} (if any) and + * all hexadecimal digits {@code 'a'} - {@code 'f'} * ('\u0061' - '\u0066'). * *
    * - *

    If the conversion is 'o', 'x', or 'X' and - * both the '#' and the '0' flags are given, then result will - * contain the radix indicator ('0' for octal and "0x" or - * "0X" for hexadecimal), some number of zeros (based on the width), + *

    If the conversion is {@code 'o'}, {@code 'x'}, or {@code 'X'} and + * both the {@code '#'} and the {@code '0'} flags are given, then result will + * contain the radix indicator ({@code '0'} for octal and {@code "0x"} or + * {@code "0X"} for hexadecimal), some number of zeros (based on the width), * and the value. * - *

    If the '-' flag is not given, then the space padding will occur + *

    If the {@code '-'} flag is not given, then the space padding will occur * before the sign. * *

    The following flags apply to numeric integral @@ -970,13 +971,13 @@ import sun.misc.FormattedFloatingDecimal; * * * - *
    '+' + *
    {@code '+'} * '\u002b' * Requires the output to include a positive sign for all positive * numbers. If this flag is not given then only negative values will * include a sign. * - *

    If both the '+' and '  ' flags are given + *

    If both the {@code '+'} and '  ' flags are given * then an {@link IllegalFormatFlagsException} will be thrown. * *

    '  ' @@ -984,10 +985,10 @@ import sun.misc.FormattedFloatingDecimal; * Requires the output to include a single extra space * ('\u0020') for non-negative values. * - *

    If both the '+' and '  ' flags are given + *

    If both the {@code '+'} and '  ' flags are given * then an {@link IllegalFormatFlagsException} will be thrown. * - *

    '0' + *
    {@code '0'} * '\u0030' * Requires the output to be padded with leading {@linkplain * java.text.DecimalFormatSymbols#getZeroDigit zeros} to the minimum field @@ -995,20 +996,20 @@ import sun.misc.FormattedFloatingDecimal; * or infinity. If the width is not provided, then a {@link * MissingFormatWidthException} will be thrown. * - *

    If both the '-' and '0' flags are given then an + *

    If both the {@code '-'} and {@code '0'} flags are given then an * {@link IllegalFormatFlagsException} will be thrown. * - *

    ',' + *
    {@code ','} * '\u002c' * Requires the output to include the locale-specific {@linkplain * java.text.DecimalFormatSymbols#getGroupingSeparator group separators} as * described in the "group" section of the * localization algorithm. * - *
    '(' + *
    {@code '('} * '\u0028' - * Requires the output to prepend a '(' - * ('\u0028') and append a ')' + * Requires the output to prepend a {@code '('} + * ('\u0028') and append a {@code ')'} * ('\u0029') to negative values. * *
    @@ -1018,9 +1019,9 @@ import sun.misc.FormattedFloatingDecimal; * *

      * - *
    • The output is right-justified within the width + *
    • The output is right-justified within the {@code width} * - *
    • Negative numbers begin with a '-' ('\u002d') + *
    • Negative numbers begin with a {@code '-'} ('\u002d') * *
    • Positive numbers and zero do not include a sign or extra leading * space @@ -1034,7 +1035,7 @@ import sun.misc.FormattedFloatingDecimal; * separators, radix indicator, and parentheses. If the length of the * converted value is less than the width then the output will be padded by * spaces ('\u0020') until the total number of characters equals - * width. The padding is on the left by default. If '-' flag is + * width. The padding is on the left by default. If {@code '-'} flag is * given then the padding will be on the right. If width is not specified then * there is no minimum. * @@ -1048,81 +1049,81 @@ import sun.misc.FormattedFloatingDecimal; * * * - *
      'd' + *
      {@code 'd'} * '\u0054' * Requires the output to be formatted as a decimal integer. The localization algorithm is applied. * - *

      If the '#' flag is given {@link + *

      If the {@code '#'} flag is given {@link * FormatFlagsConversionMismatchException} will be thrown. * - *

      'o' + *
      {@code 'o'} * '\u006f' * Requires the output to be formatted as an integer in base eight. * No localization is applied. * *

      If x is negative then the result will be a signed value - * beginning with '-' ('\u002d'). Signed output is + * beginning with {@code '-'} ('\u002d'). Signed output is * allowed for this type because unlike the primitive types it is not * possible to create an unsigned equivalent without assuming an explicit * data-type size. * - *

      If x is positive or zero and the '+' flag is given - * then the result will begin with '+' ('\u002b'). + *

      If x is positive or zero and the {@code '+'} flag is given + * then the result will begin with {@code '+'} ('\u002b'). * - *

      If the '#' flag is given then the output will always begin - * with '0' prefix. + *

      If the {@code '#'} flag is given then the output will always begin + * with {@code '0'} prefix. * - *

      If the '0' flag is given then the output will be padded + *

      If the {@code '0'} flag is given then the output will be padded * with leading zeros to the field width following any indication of sign. * - *

      If the ',' flag is given then a {@link + *

      If the {@code ','} flag is given then a {@link * FormatFlagsConversionMismatchException} will be thrown. * - *

      'x' + *
      {@code 'x'} * '\u0078' * Requires the output to be formatted as an integer in base * sixteen. No localization is applied. * *

      If x is negative then the result will be a signed value - * beginning with '-' ('\u002d'). Signed output is + * beginning with {@code '-'} ('\u002d'). Signed output is * allowed for this type because unlike the primitive types it is not * possible to create an unsigned equivalent without assuming an explicit * data-type size. * - *

      If x is positive or zero and the '+' flag is given - * then the result will begin with '+' ('\u002b'). + *

      If x is positive or zero and the {@code '+'} flag is given + * then the result will begin with {@code '+'} ('\u002b'). * - *

      If the '#' flag is given then the output will always begin - * with the radix indicator "0x". + *

      If the {@code '#'} flag is given then the output will always begin + * with the radix indicator {@code "0x"}. * - *

      If the '0' flag is given then the output will be padded to + *

      If the {@code '0'} flag is given then the output will be padded to * the field width with leading zeros after the radix indicator or sign (if * present). * - *

      If the ',' flag is given then a {@link + *

      If the {@code ','} flag is given then a {@link * FormatFlagsConversionMismatchException} will be thrown. * - *

      'X' + *
      {@code 'X'} * '\u0058' - * The upper-case variant of 'x'. The entire string + * The upper-case variant of {@code 'x'}. The entire string * representing the number will be converted to {@linkplain - * String#toUpperCase upper case} including the 'x' (if any) and - * all hexadecimal digits 'a' - 'f' + * String#toUpperCase upper case} including the {@code 'x'} (if any) and + * all hexadecimal digits {@code 'a'} - {@code 'f'} * ('\u0061' - '\u0066'). * *
      * - *

      If the conversion is 'o', 'x', or 'X' and - * both the '#' and the '0' flags are given, then result will - * contain the base indicator ('0' for octal and "0x" or - * "0X" for hexadecimal), some number of zeros (based on the width), + *

      If the conversion is {@code 'o'}, {@code 'x'}, or {@code 'X'} and + * both the {@code '#'} and the {@code '0'} flags are given, then result will + * contain the base indicator ({@code '0'} for octal and {@code "0x"} or + * {@code "0X"} for hexadecimal), some number of zeros (based on the width), * and the value. * - *

      If the '0' flag is given and the value is negative, then the + *

      If the {@code '0'} flag is given and the value is negative, then the * zero padding will occur after the sign. * - *

      If the '-' flag is not given, then the space padding will occur + *

      If the {@code '-'} flag is not given, then the space padding will occur * before the sign. * *

      All flags defined for Byte, Short, Integer, and @@ -1137,12 +1138,12 @@ import sun.misc.FormattedFloatingDecimal; * *

      Float and Double * - *

      The following conversions may be applied to float, {@link - * Float}, double and {@link Double}. + *

      The following conversions may be applied to {@code float}, {@link + * Float}, {@code double} and {@link Double}. * * * - *
      'e' + *
      {@code 'e'} * '\u0065' * Requires the output to be formatted using computerized scientific notation. The If m is positive-zero or negative-zero, then the exponent - * will be "+00". + * will be {@code "+00"}. * *

      Otherwise, the result is a string that represents the sign and * magnitude (absolute value) of the argument. The formatting of the sign @@ -1169,7 +1170,7 @@ import sun.misc.FormattedFloatingDecimal; * that 1 <= a < 10. The magnitude is then represented as the * integer part of a, as a single decimal digit, followed by the * decimal separator followed by decimal digits representing the fractional - * part of a, followed by the exponent symbol 'e' + * part of a, followed by the exponent symbol {@code 'e'} * ('\u0065'), followed by the sign of the exponent, followed * by a representation of n as a decimal integer, as produced by the * method {@link Long#toString(long, int)}, and zero-padded to include at @@ -1177,7 +1178,7 @@ import sun.misc.FormattedFloatingDecimal; * *

      The number of digits in the result for the fractional part of * m or a is equal to the precision. If the precision is not - * specified then the default value is 6. If the precision is less + * specified then the default value is {@code 6}. If the precision is less * than the number of digits which would appear after the decimal point in * the string returned by {@link Float#toString(float)} or {@link * Double#toString(double)} respectively, then the value will be rounded @@ -1187,15 +1188,15 @@ import sun.misc.FormattedFloatingDecimal; * Float#toString(float)} or {@link Double#toString(double)} as * appropriate. * - *

      If the ',' flag is given, then an {@link + *

      If the {@code ','} flag is given, then an {@link * FormatFlagsConversionMismatchException} will be thrown. * - *

      'E' + *
      {@code 'E'} * '\u0045' - * The upper-case variant of 'e'. The exponent symbol - * will be 'E' ('\u0045'). + * The upper-case variant of {@code 'e'}. The exponent symbol + * will be {@code 'E'} ('\u0045'). * - *
      'g' + *
      {@code 'g'} * '\u0067' * Requires the output to be formatted in general scientific notation * as described below. The localization @@ -1214,17 +1215,17 @@ import sun.misc.FormattedFloatingDecimal; * *

      The total number of significant digits in m is equal to the * precision. If the precision is not specified, then the default value is - * 6. If the precision is 0, then it is taken to be - * 1. + * {@code 6}. If the precision is {@code 0}, then it is taken to be + * {@code 1}. * - *

      If the '#' flag is given then an {@link + *

      If the {@code '#'} flag is given then an {@link * FormatFlagsConversionMismatchException} will be thrown. * - *

      'G' + *
      {@code 'G'} * '\u0047' - * The upper-case variant of 'g'. + * The upper-case variant of {@code 'g'}. * - *
      'f' + *
      {@code 'f'} * '\u0066' * Requires the output to be formatted using decimal * format. The localization algorithm is @@ -1246,17 +1247,17 @@ import sun.misc.FormattedFloatingDecimal; * *

      The number of digits in the result for the fractional part of * m or a is equal to the precision. If the precision is not - * specified then the default value is 6. If the precision is less + * specified then the default value is {@code 6}. If the precision is less * than the number of digits which would appear after the decimal point in * the string returned by {@link Float#toString(float)} or {@link * Double#toString(double)} respectively, then the value will be rounded * using the {@linkplain java.math.BigDecimal#ROUND_HALF_UP round half up * algorithm}. Otherwise, zeros may be appended to reach the precision. - * For a canonical representation of the value,use {@link + * For a canonical representation of the value, use {@link * Float#toString(float)} or {@link Double#toString(double)} as * appropriate. * - *

      'a' + *
      {@code 'a'} * '\u0061' * Requires the output to be formatted in hexadecimal exponential * form. No localization is applied. @@ -1265,10 +1266,10 @@ import sun.misc.FormattedFloatingDecimal; * (absolute value) of the argument x. * *

      If x is negative or a negative-zero value then the result - * will begin with '-' ('\u002d'). + * will begin with {@code '-'} ('\u002d'). * *

      If x is positive or a positive-zero value and the - * '+' flag is given then the result will begin with '+' + * {@code '+'} flag is given then the result will begin with {@code '+'} * ('\u002b'). * *

      The formatting of the magnitude m depends upon its value. @@ -1279,43 +1280,43 @@ import sun.misc.FormattedFloatingDecimal; * "Infinity", respectively, will be output. * *

    • If m is zero then it is represented by the string - * "0x0.0p0". + * {@code "0x0.0p0"}. * - *
    • If m is a double value with a normalized + *
    • If m is a {@code double} value with a normalized * representation then substrings are used to represent the significand and * exponent fields. The significand is represented by the characters - * "0x1." followed by the hexadecimal representation of the rest + * {@code "0x1."} followed by the hexadecimal representation of the rest * of the significand as a fraction. The exponent is represented by - * 'p' ('\u0070') followed by a decimal string of the + * {@code 'p'} ('\u0070') followed by a decimal string of the * unbiased exponent as if produced by invoking {@link * Integer#toString(int) Integer.toString} on the exponent value. * - *
    • If m is a double value with a subnormal + *
    • If m is a {@code double} value with a subnormal * representation then the significand is represented by the characters - * '0x0.' followed by the hexadecimal representation of the rest + * {@code '0x0.'} followed by the hexadecimal representation of the rest * of the significand as a fraction. The exponent is represented by - * 'p-1022'. Note that there must be at least one nonzero digit + * {@code 'p-1022'}. Note that there must be at least one nonzero digit * in a subnormal significand. * * * - *

      If the '(' or ',' flags are given, then a {@link + *

      If the {@code '('} or {@code ','} flags are given, then a {@link * FormatFlagsConversionMismatchException} will be thrown. * - *

    • 'A' + *
      {@code 'A'} * '\u0041' - * The upper-case variant of 'a'. The entire string + * The upper-case variant of {@code 'a'}. The entire string * representing the number will be converted to upper case including the - * 'x' ('\u0078') and 'p' - * ('\u0070' and all hexadecimal digits 'a' - - * 'f' ('\u0061' - '\u0066'). + * {@code 'x'} ('\u0078') and {@code 'p'} + * ('\u0070' and all hexadecimal digits {@code 'a'} - + * {@code 'f'} ('\u0061' - '\u0066'). * *
      * *

      All flags defined for Byte, Short, Integer, and * Long apply. * - *

      If the '#' flag is given, then the decimal separator will + *

      If the {@code '#'} flag is given, then the decimal separator will * always be present. * *

      If no flags are given the default formatting @@ -1323,9 +1324,9 @@ import sun.misc.FormattedFloatingDecimal; * *

        * - *
      • The output is right-justified within the width + *
      • The output is right-justified within the {@code width} * - *
      • Negative numbers begin with a '-' + *
      • Negative numbers begin with a {@code '-'} * *
      • Positive numbers and positive zero do not include a sign or extra * leading space @@ -1343,21 +1344,21 @@ import sun.misc.FormattedFloatingDecimal; * the length of the converted value is less than the width then the output * will be padded by spaces ('\u0020') until the total number of * characters equals width. The padding is on the left by default. If the - * '-' flag is given then the padding will be on the right. If width + * {@code '-'} flag is given then the padding will be on the right. If width * is not specified then there is no minimum. * - *

        If the conversion is 'e', - * 'E' or 'f', then the precision is the number of digits + *

        If the conversion is {@code 'e'}, + * {@code 'E'} or {@code 'f'}, then the precision is the number of digits * after the decimal separator. If the precision is not specified, then it is - * assumed to be 6. + * assumed to be {@code 6}. * - *

        If the conversion is 'g' or 'G', then the precision is + *

        If the conversion is {@code 'g'} or {@code 'G'}, then the precision is * the total number of significant digits in the resulting magnitude after * rounding. If the precision is not specified, then the default value is - * 6. If the precision is 0, then it is taken to be - * 1. + * {@code 6}. If the precision is {@code 0}, then it is taken to be + * {@code 1}. * - *

        If the conversion is 'a' or 'A', then the precision + *

        If the conversion is {@code 'a'} or {@code 'A'}, then the precision * is the number of hexadecimal digits after the decimal separator. If the * precision is not provided, then all of the digits as returned by {@link * Double#toHexString(double)} will be output. @@ -1369,7 +1370,7 @@ import sun.misc.FormattedFloatingDecimal; * * * - *
        'e' + *
        {@code 'e'} * '\u0065' * Requires the output to be formatted using computerized scientific notation. The The formatting of the magnitude m depends upon its value. * *

        If m is positive-zero or negative-zero, then the exponent - * will be "+00". + * will be {@code "+00"}. * *

        Otherwise, the result is a string that represents the sign and * magnitude (absolute value) of the argument. The formatting of the sign @@ -1392,7 +1393,7 @@ import sun.misc.FormattedFloatingDecimal; * that 1 <= a < 10. The magnitude is then represented as the * integer part of a, as a single decimal digit, followed by the * decimal separator followed by decimal digits representing the fractional - * part of a, followed by the exponent symbol 'e' + * part of a, followed by the exponent symbol {@code 'e'} * ('\u0065'), followed by the sign of the exponent, followed * by a representation of n as a decimal integer, as produced by the * method {@link Long#toString(long, int)}, and zero-padded to include at @@ -1400,7 +1401,7 @@ import sun.misc.FormattedFloatingDecimal; * *

        The number of digits in the result for the fractional part of * m or a is equal to the precision. If the precision is not - * specified then the default value is 6. If the precision is + * specified then the default value is {@code 6}. If the precision is * less than the number of digits which would appear after the decimal * point in the string returned by {@link Float#toString(float)} or {@link * Double#toString(double)} respectively, then the value will be rounded @@ -1409,15 +1410,15 @@ import sun.misc.FormattedFloatingDecimal; * For a canonical representation of the value, use {@link * BigDecimal#toString()}. * - *

        If the ',' flag is given, then an {@link + *

        If the {@code ','} flag is given, then an {@link * FormatFlagsConversionMismatchException} will be thrown. * - *

        'E' + *
        {@code 'E'} * '\u0045' - * The upper-case variant of 'e'. The exponent symbol - * will be 'E' ('\u0045'). + * The upper-case variant of {@code 'e'}. The exponent symbol + * will be {@code 'E'} ('\u0045'). * - *
        'g' + *
        {@code 'g'} * '\u0067' * Requires the output to be formatted in general scientific notation * as described below. The localization @@ -1436,17 +1437,17 @@ import sun.misc.FormattedFloatingDecimal; * *

        The total number of significant digits in m is equal to the * precision. If the precision is not specified, then the default value is - * 6. If the precision is 0, then it is taken to be - * 1. + * {@code 6}. If the precision is {@code 0}, then it is taken to be + * {@code 1}. * - *

        If the '#' flag is given then an {@link + *

        If the {@code '#'} flag is given then an {@link * FormatFlagsConversionMismatchException} will be thrown. * - *

        'G' + *
        {@code 'G'} * '\u0047' - * The upper-case variant of 'g'. + * The upper-case variant of {@code 'g'}. * - *
        'f' + *
        {@code 'f'} * '\u0066' * Requires the output to be formatted using decimal * format. The localization algorithm is @@ -1464,7 +1465,7 @@ import sun.misc.FormattedFloatingDecimal; * *

        The number of digits in the result for the fractional part of * m or a is equal to the precision. If the precision is not - * specified then the default value is 6. If the precision is + * specified then the default value is {@code 6}. If the precision is * less than the number of digits which would appear after the decimal * point in the string returned by {@link Float#toString(float)} or {@link * Double#toString(double)} respectively, then the value will be rounded @@ -1478,7 +1479,7 @@ import sun.misc.FormattedFloatingDecimal; *

        All flags defined for Byte, Short, Integer, and * Long apply. * - *

        If the '#' flag is given, then the decimal separator will + *

        If the {@code '#'} flag is given, then the decimal separator will * always be present. * *

        The default behavior when no flags are @@ -1490,114 +1491,114 @@ import sun.misc.FormattedFloatingDecimal; * *

        Date/Time

        * - *

        This conversion may be applied to long, {@link Long}, {@link + *

        This conversion may be applied to {@code long}, {@link Long}, {@link * Calendar}, and {@link Date}. * * * - *
        't' + *
        {@code 't'} * '\u0074' * Prefix for date and time conversion characters. - *
        'T' + *
        {@code 'T'} * '\u0054' - * The upper-case variant of 't'. + * The upper-case variant of {@code 't'}. * *
        * *

        The following date and time conversion character suffixes are defined - * for the 't' and 'T' conversions. The types are similar to - * but not completely identical to those defined by GNU date and - * POSIX strftime(3c). Additional conversion types are provided to - * access Java-specific functionality (e.g. 'L' for milliseconds + * for the {@code 't'} and {@code 'T'} conversions. The types are similar to + * but not completely identical to those defined by GNU {@code date} and + * POSIX {@code strftime(3c)}. Additional conversion types are provided to + * access Java-specific functionality (e.g. {@code 'L'} for milliseconds * within the second). * *

        The following conversion characters are used for formatting times: * * * - *
        'H' + *
        {@code 'H'} * '\u0048' * Hour of the day for the 24-hour clock, formatted as two digits with - * a leading zero as necessary i.e. 00 - 23. 00 + * a leading zero as necessary i.e. {@code 00 - 23}. {@code 00} * corresponds to midnight. * - *
        'I' + *
        {@code 'I'} * '\u0049' * Hour for the 12-hour clock, formatted as two digits with a leading - * zero as necessary, i.e. 01 - 12. 01 corresponds to + * zero as necessary, i.e. {@code 01 - 12}. {@code 01} corresponds to * one o'clock (either morning or afternoon). * - *
        'k' + *
        {@code 'k'} * '\u006b' - * Hour of the day for the 24-hour clock, i.e. 0 - 23. - * 0 corresponds to midnight. + * Hour of the day for the 24-hour clock, i.e. {@code 0 - 23}. + * {@code 0} corresponds to midnight. * - *
        'l' + *
        {@code 'l'} * '\u006c' - * Hour for the 12-hour clock, i.e. 1 - 12. 1 + * Hour for the 12-hour clock, i.e. {@code 1 - 12}. {@code 1} * corresponds to one o'clock (either morning or afternoon). * - *
        'M' + *
        {@code 'M'} * '\u004d' * Minute within the hour formatted as two digits with a leading zero - * as necessary, i.e. 00 - 59. + * as necessary, i.e. {@code 00 - 59}. * - *
        'S' + *
        {@code 'S'} * '\u0053' * Seconds within the minute, formatted as two digits with a leading - * zero as necessary, i.e. 00 - 60 ("60" is a special + * zero as necessary, i.e. {@code 00 - 60} ("{@code 60}" is a special * value required to support leap seconds). * - *
        'L' + *
        {@code 'L'} * '\u004c' * Millisecond within the second formatted as three digits with - * leading zeros as necessary, i.e. 000 - 999. + * leading zeros as necessary, i.e. {@code 000 - 999}. * - *
        'N' + *
        {@code 'N'} * '\u004e' * Nanosecond within the second, formatted as nine digits with leading - * zeros as necessary, i.e. 000000000 - 999999999. The precision + * zeros as necessary, i.e. {@code 000000000 - 999999999}. The precision * of this value is limited by the resolution of the underlying operating * system or hardware. * - *
        'p' + *
        {@code 'p'} * '\u0070' * Locale-specific {@linkplain * java.text.DateFormatSymbols#getAmPmStrings morning or afternoon} marker - * in lower case, e.g."am" or "pm". Use of the - * conversion prefix 'T' forces this output to upper case. (Note - * that 'p' produces lower-case output. This is different from - * GNU date and POSIX strftime(3c) which produce + * in lower case, e.g."{@code am}" or "{@code pm}". Use of the + * conversion prefix {@code 'T'} forces this output to upper case. (Note + * that {@code 'p'} produces lower-case output. This is different from + * GNU {@code date} and POSIX {@code strftime(3c)} which produce * upper-case output.) * - *
        'z' + *
        {@code 'z'} * '\u007a' * RFC 822 - * style numeric time zone offset from GMT, e.g. -0800. This + * style numeric time zone offset from GMT, e.g. {@code -0800}. This * value will be adjusted as necessary for Daylight Saving Time. For - * long, {@link Long}, and {@link Date} the time zone used is - * the {@plainlink TimeZone#getDefault() default time zone} for this + * {@code long}, {@link Long}, and {@link Date} the time zone used is + * the {@linkplain TimeZone#getDefault() default time zone} for this * instance of the Java virtual machine. * - *
        'Z' + *
        {@code 'Z'} * A string representing the abbreviation for the time zone. This * value will be adjusted as necessary for Daylight Saving Time. For - * long, {@link Long}, and {@link Date} the time zone used is - * the {@plainlink TimeZone#getDefault() default time zone} for this + * {@code long}, {@link Long}, and {@link Date} the time zone used is + * the {@linkplain TimeZone#getDefault() default time zone} for this * instance of the Java virtual machine. The Formatter's locale will * supersede the locale of the argument (if any). * - *
        's' + *
        {@code 's'} * '\u0073' * Seconds since the beginning of the epoch starting at 1 January 1970 - * 00:00:00 UTC, i.e. Long.MIN_VALUE/1000 to - * Long.MAX_VALUE/1000. + * {@code 00:00:00} UTC, i.e. {@code Long.MIN_VALUE/1000} to + * {@code Long.MAX_VALUE/1000}. * - *
        'Q' + *
        {@code 'Q'} * '\u004f' * Milliseconds since the beginning of the epoch starting at 1 January - * 1970 00:00:00 UTC, i.e. Long.MIN_VALUE to - * Long.MAX_VALUE. The precision of this value is limited by + * 1970 {@code 00:00:00} UTC, i.e. {@code Long.MIN_VALUE} to + * {@code Long.MAX_VALUE}. The precision of this value is limited by * the resolution of the underlying operating system or hardware. * *
        @@ -1606,71 +1607,71 @@ import sun.misc.FormattedFloatingDecimal; * * * - *
        'B' + *
        {@code 'B'} * '\u0042' * Locale-specific {@linkplain java.text.DateFormatSymbols#getMonths - * full month name}, e.g. "January", "February". + * full month name}, e.g. {@code "January"}, {@code "February"}. * - *
        'b' + *
        {@code 'b'} * '\u0062' * Locale-specific {@linkplain * java.text.DateFormatSymbols#getShortMonths abbreviated month name}, - * e.g. "Jan", "Feb". + * e.g. {@code "Jan"}, {@code "Feb"}. * - *
        'h' + *
        {@code 'h'} * '\u0068' - * Same as 'b'. + * Same as {@code 'b'}. * - *
        'A' + *
        {@code 'A'} * '\u0041' * Locale-specific full name of the {@linkplain * java.text.DateFormatSymbols#getWeekdays day of the week}, - * e.g. "Sunday", "Monday" + * e.g. {@code "Sunday"}, {@code "Monday"} * - *
        'a' + *
        {@code 'a'} * '\u0061' * Locale-specific short name of the {@linkplain * java.text.DateFormatSymbols#getShortWeekdays day of the week}, - * e.g. "Sun", "Mon" + * e.g. {@code "Sun"}, {@code "Mon"} * - *
        'C' + *
        {@code 'C'} * '\u0043' - * Four-digit year divided by 100, formatted as two digits - * with leading zero as necessary, i.e. 00 - 99 + * Four-digit year divided by {@code 100}, formatted as two digits + * with leading zero as necessary, i.e. {@code 00 - 99} * - *
        'Y' + *
        {@code 'Y'} * '\u0059' Year, formatted to at least - * four digits with leading zeros as necessary, e.g. 0092 equals - * 92 CE for the Gregorian calendar. + * four digits with leading zeros as necessary, e.g. {@code 0092} equals + * {@code 92} CE for the Gregorian calendar. * - *
        'y' + *
        {@code 'y'} * '\u0079' * Last two digits of the year, formatted with leading zeros as - * necessary, i.e. 00 - 99. + * necessary, i.e. {@code 00 - 99}. * - *
        'j' + *
        {@code 'j'} * '\u006a' * Day of year, formatted as three digits with leading zeros as - * necessary, e.g. 001 - 366 for the Gregorian calendar. - * 001 corresponds to the first day of the year. + * necessary, e.g. {@code 001 - 366} for the Gregorian calendar. + * {@code 001} corresponds to the first day of the year. * - *
        'm' + *
        {@code 'm'} * '\u006d' * Month, formatted as two digits with leading zeros as necessary, - * i.e. 01 - 13, where "01" is the first month of the - * year and ("13" is a special value required to support lunar + * i.e. {@code 01 - 13}, where "{@code 01}" is the first month of the + * year and ("{@code 13}" is a special value required to support lunar * calendars). * - *
        'd' + *
        {@code 'd'} * '\u0064' * Day of month, formatted as two digits with leading zeros as - * necessary, i.e. 01 - 31, where "01" is the first day + * necessary, i.e. {@code 01 - 31}, where "{@code 01}" is the first day * of the month. * - *
        'e' + *
        {@code 'e'} * '\u0065' - * Day of month, formatted as two digits, i.e. 1 - 31 where - * "1" is the first day of the month. + * Day of month, formatted as two digits, i.e. {@code 1 - 31} where + * "{@code 1}" is the first day of the month. * *
        * @@ -1679,45 +1680,45 @@ import sun.misc.FormattedFloatingDecimal; * * * - *
        'R' + *
        {@code 'R'} * '\u0052' - * Time formatted for the 24-hour clock as "%tH:%tM" + * Time formatted for the 24-hour clock as {@code "%tH:%tM"} * - *
        'T' + *
        {@code 'T'} * '\u0054' - * Time formatted for the 24-hour clock as "%tH:%tM:%tS". + * Time formatted for the 24-hour clock as {@code "%tH:%tM:%tS"}. * - *
        'r' + *
        {@code 'r'} * '\u0072' - * Time formatted for the 12-hour clock as "%tI:%tM:%tS - * %Tp". The location of the morning or afternoon marker - * ('%Tp') may be locale-dependent. + * Time formatted for the 12-hour clock as {@code "%tI:%tM:%tS + * %Tp"}. The location of the morning or afternoon marker + * ({@code '%Tp'}) may be locale-dependent. * - *
        'D' + *
        {@code 'D'} * '\u0044' - * Date formatted as "%tm/%td/%ty". + * Date formatted as {@code "%tm/%td/%ty"}. * - *
        'F' + *
        {@code 'F'} * '\u0046' * ISO 8601 - * complete date formatted as "%tY-%tm-%td". + * complete date formatted as {@code "%tY-%tm-%td"}. * - *
        'c' + *
        {@code 'c'} * '\u0063' - * Date and time formatted as "%ta %tb %td %tT %tZ %tY", - * e.g. "Sun Jul 20 16:17:00 EDT 1969". + * Date and time formatted as {@code "%ta %tb %td %tT %tZ %tY"}, + * e.g. {@code "Sun Jul 20 16:17:00 EDT 1969"}. * *
        * - *

        The '-' flag defined for General - * conversions applies. If the '#' flag is given, then a {@link + *

        The {@code '-'} flag defined for General + * conversions applies. If the {@code '#'} flag is given, then a {@link * FormatFlagsConversionMismatchException} will be thrown. * *

        The width is the minimum number of characters to * be written to the output. If the length of the converted value is less than - * the width then the output will be padded by spaces + * the {@code width} then the output will be padded by spaces * ('\u0020') until the total number of characters equals width. - * The padding is on the left by default. If the '-' flag is given + * The padding is on the left by default. If the {@code '-'} flag is given * then the padding will be on the right. If width is not specified then there * is no minimum. * @@ -1730,17 +1731,17 @@ import sun.misc.FormattedFloatingDecimal; * * * - *
        '%' - * The result is a literal '%' ('\u0025') + *
        {@code '%'} + * The result is a literal {@code '%'} ('\u0025') * *

        The width is the minimum number of characters to - * be written to the output including the '%'. If the length of the - * converted value is less than the width then the output will be + * be written to the output including the {@code '%'}. If the length of the + * converted value is less than the {@code width} then the output will be * padded by spaces ('\u0020') until the total number of * characters equals width. The padding is on the left. If width is not - * specified then just the '%' is output. + * specified then just the {@code '%'} is output. * - *

        The '-' flag defined for General + *

        The {@code '-'} flag defined for General * conversions applies. If any other flags are provided, then a * {@link FormatFlagsConversionMismatchException} will be thrown. * @@ -1755,7 +1756,7 @@ import sun.misc.FormattedFloatingDecimal; * * * - *
        'n' + *
        {@code 'n'} * the platform-specific line separator as returned by {@link * System#getProperty System.getProperty("line.separator")}. * @@ -1774,7 +1775,7 @@ import sun.misc.FormattedFloatingDecimal; *
      • Explicit indexing is used when the format specifier contains an * argument index. The argument index is a decimal integer indicating the * position of the argument in the argument list. The first argument is - * referenced by "1$", the second by "2$", etc. An argument + * referenced by "{@code 1$}", the second by "{@code 2$}", etc. An argument * may be referenced more than once. * *

        For example: @@ -1786,7 +1787,7 @@ import sun.misc.FormattedFloatingDecimal; * * *

      • Relative indexing is used when the format specifier contains a - * '<' ('\u003c') flag which causes the argument for + * {@code '<'} ('\u003c') flag which causes the argument for * the previous format specifier to be re-used. If there is no previous * argument, then a {@link MissingFormatArgumentException} is thrown. * @@ -1797,7 +1798,7 @@ import sun.misc.FormattedFloatingDecimal; * * *
      • Ordinary indexing is used when the format specifier contains - * neither an argument index nor a '<' flag. Each format specifier + * neither an argument index nor a {@code '<'} flag. Each format specifier * which uses ordinary indexing is assigned a sequential implicit index into * argument list which is independent of the indices used by explicit or * relative indexing. @@ -1827,7 +1828,7 @@ import sun.misc.FormattedFloatingDecimal; *

        If there are more arguments than format specifiers, the extra arguments * are ignored. * - *

        Unless otherwise specified, passing a null argument to any + *

        Unless otherwise specified, passing a {@code null} argument to any * method or constructor in this class will cause a {@link * NullPointerException} to be thrown. * @@ -1875,8 +1876,8 @@ public final class Formatter implements Closeable, Flushable { * locale} for this instance of the Java virtual machine. * * @param a - * Destination for the formatted output. If a is - * null then a {@link StringBuilder} will be created. + * Destination for the formatted output. If {@code a} is + * {@code null} then a {@link StringBuilder} will be created. */ public Formatter(Appendable a) { if (a == null) @@ -1894,7 +1895,7 @@ public final class Formatter implements Closeable, Flushable { * * @param l * The {@linkplain java.util.Locale locale} to apply during - * formatting. If l is null then no localization + * formatting. If {@code l} is {@code null} then no localization * is applied. */ public Formatter(Locale l) { @@ -1905,12 +1906,12 @@ public final class Formatter implements Closeable, Flushable { * Constructs a new formatter with the specified destination and locale. * * @param a - * Destination for the formatted output. If a is - * null then a {@link StringBuilder} will be created. + * Destination for the formatted output. If {@code a} is + * {@code null} then a {@link StringBuilder} will be created. * * @param l * The {@linkplain java.util.Locale locale} to apply during - * formatting. If l is null then no localization + * formatting. If {@code l} is {@code null} then no localization * is applied. */ public Formatter(Appendable a, Locale l) { @@ -2003,7 +2004,7 @@ public final class Formatter implements Closeable, Flushable { * * @param l * The {@linkplain java.util.Locale locale} to apply during - * formatting. If l is null then no localization + * formatting. If {@code l} is {@code null} then no localization * is applied. * * @throws FileNotFoundException @@ -2111,7 +2112,7 @@ public final class Formatter implements Closeable, Flushable { * * @param l * The {@linkplain java.util.Locale locale} to apply during - * formatting. If l is null then no localization + * formatting. If {@code l} is {@code null} then no localization * is applied. * * @throws FileNotFoundException @@ -2211,7 +2212,7 @@ public final class Formatter implements Closeable, Flushable { * * @param l * The {@linkplain java.util.Locale locale} to apply during - * formatting. If l is null then no localization + * formatting. If {@code l} is {@code null} then no localization * is applied. * * @throws UnsupportedEncodingException @@ -2236,7 +2237,7 @@ public final class Formatter implements Closeable, Flushable { *

        The {@link #format(java.util.Locale,String,Object...) format} method * for this object which has a locale argument does not change this value. * - * @return null if no localization is applied, otherwise a + * @return {@code null} if no localization is applied, otherwise a * locale * * @throws FormatterClosedException @@ -2263,7 +2264,7 @@ public final class Formatter implements Closeable, Flushable { } /** - * Returns the result of invoking toString() on the destination + * Returns the result of invoking {@code toString()} on the destination * for the output. For example, the following code formats text into a * {@link StringBuilder} then retrieves the resultant string: * @@ -2280,13 +2281,13 @@ public final class Formatter implements Closeable, Flushable { *

              *     out().toString() 
        * - *

        Depending on the specification of toString for the {@link + *

        Depending on the specification of {@code toString} for the {@link * Appendable}, the returned string may or may not contain the characters * written to the destination. For instance, buffers typically return - * their contents in toString(), but streams cannot since the + * their contents in {@code toString()}, but streams cannot since the * data is discarded. * - * @return The result of invoking toString() on the destination + * @return The result of invoking {@code toString()} on the destination * for the output * * @throws FormatterClosedException @@ -2300,7 +2301,7 @@ public final class Formatter implements Closeable, Flushable { /** * Flushes this formatter. If the destination implements the {@link - * java.io.Flushable} interface, its flush method will be invoked. + * java.io.Flushable} interface, its {@code flush} method will be invoked. * *

        Flushing a formatter writes any buffered output in the destination * to the underlying stream. @@ -2322,7 +2323,7 @@ public final class Formatter implements Closeable, Flushable { /** * Closes this formatter. If the destination implements the {@link - * java.io.Closeable} interface, its close method will be invoked. + * java.io.Closeable} interface, its {@code close} method will be invoked. * *

        Closing a formatter allows it to release resources it may be holding * (such as open files). If the formatter is already closed, then invoking @@ -2351,13 +2352,13 @@ public final class Formatter implements Closeable, Flushable { } /** - * Returns the IOException last thrown by this formatter's {@link + * Returns the {@code IOException} last thrown by this formatter's {@link * Appendable}. * - *

        If the destination's append() method never throws - * IOException, then this method will always return null. + *

        If the destination's {@code append()} method never throws + * {@code IOException}, then this method will always return {@code null}. * - * @return The last exception thrown by the Appendable or null if + * @return The last exception thrown by the Appendable or {@code null} if * no such exception exists. */ public IOException ioException() { @@ -2405,7 +2406,7 @@ public final class Formatter implements Closeable, Flushable { * * @param l * The {@linkplain java.util.Locale locale} to apply during - * formatting. If l is null then no localization + * formatting. If {@code l} is {@code null} then no localization * is applied. This does not change this object's locale that was * set during construction. * @@ -3569,15 +3570,23 @@ public final class Formatter implements Closeable, Flushable { // Create a new BigDecimal with the desired precision. int prec = (precision == -1 ? 6 : precision); int scale = value.scale(); - int compPrec = value.precision(); - if (scale > prec) - compPrec -= (scale - prec); - MathContext mc = new MathContext(compPrec); - BigDecimal v - = new BigDecimal(value.unscaledValue(), scale, mc); - BigDecimalLayout bdl - = new BigDecimalLayout(v.unscaledValue(), v.scale(), + if (scale > prec) { + // more "scale" digits than the requested "precision + int compPrec = value.precision(); + if (compPrec <= scale) { + // case of 0.xxxxxx + value = value.setScale(prec, RoundingMode.HALF_UP); + } else { + compPrec -= (scale - prec); + value = new BigDecimal(value.unscaledValue(), + scale, + new MathContext(compPrec)); + } + } + BigDecimalLayout bdl = new BigDecimalLayout( + value.unscaledValue(), + value.scale(), BigDecimalLayoutForm.DECIMAL_FLOAT); char mant[] = bdl.mantissa(); @@ -4187,7 +4196,7 @@ public final class Formatter implements Closeable, Flushable { } } - // Returns a string representation of the current Flags. + // Returns a string representation of the current {@code Flags}. public static String toString(Flags f) { return f.toString(); } diff --git a/jdk/src/share/classes/java/util/LocaleISOData.java b/jdk/src/share/classes/java/util/LocaleISOData.java index 2dc1e37e9b3..c7eca492b93 100644 --- a/jdk/src/share/classes/java/util/LocaleISOData.java +++ b/jdk/src/share/classes/java/util/LocaleISOData.java @@ -250,6 +250,7 @@ class LocaleISOData { + "BH" + "BHR" // Bahrain, Kingdom of + "BI" + "BDI" // Burundi, Republic of + "BJ" + "BEN" // Benin, People's Republic of + + "BL" + "BLM" // Saint Barth\u00e9lemy + "BM" + "BMU" // Bermuda + "BN" + "BRN" // Brunei Darussalam + "BO" + "BOL" // Bolivia, Republic of @@ -273,7 +274,7 @@ class LocaleISOData { + "CN" + "CHN" // China, People's Republic of + "CO" + "COL" // Colombia, Republic of + "CR" + "CRI" // Costa Rica, Republic of - + "CS" + "SCG" // Serbia and Montenegro +// + "CS" + "SCG" // Serbia and Montenegro + "CU" + "CUB" // Cuba, Republic of + "CV" + "CPV" // Cape Verde, Republic of + "CX" + "CXR" // Christmas Island @@ -363,6 +364,7 @@ class LocaleISOData { + "MC" + "MCO" // Monaco, Principality of + "MD" + "MDA" // Moldova, Republic of + "ME" + "MNE" // Montenegro, Republic of + + "MF" + "MAF" // Saint Martin + "MG" + "MDG" // Madagascar, Republic of + "MH" + "MHL" // Marshall Islands + "MK" + "MKD" // Macedonia, the former Yugoslav Republic of diff --git a/jdk/src/share/classes/java/util/Random.java b/jdk/src/share/classes/java/util/Random.java index 26cc4e234e0..cfa48248166 100644 --- a/jdk/src/share/classes/java/util/Random.java +++ b/jdk/src/share/classes/java/util/Random.java @@ -32,7 +32,7 @@ import sun.misc.Unsafe; * An instance of this class is used to generate a stream of * pseudorandom numbers. The class uses a 48-bit seed, which is * modified using a linear congruential formula. (See Donald Knuth, - * The Art of Computer Programming, Volume 3, Section 3.2.1.) + * The Art of Computer Programming, Volume 2, Section 3.2.1.) *

        * If two instances of {@code Random} are created with the same * seed, and the same sequence of method calls is made for each, they diff --git a/jdk/src/share/classes/java/util/logging/Logger.java b/jdk/src/share/classes/java/util/logging/Logger.java index 155db02d9f1..28f942a0f2a 100644 --- a/jdk/src/share/classes/java/util/logging/Logger.java +++ b/jdk/src/share/classes/java/util/logging/Logger.java @@ -27,6 +27,7 @@ package java.util.logging; import java.util.*; +import java.util.concurrent.CopyOnWriteArrayList; import java.security.*; import java.lang.ref.WeakReference; @@ -165,10 +166,11 @@ public class Logger { private static final int offValue = Level.OFF.intValue(); private LogManager manager; private String name; - private ArrayList handlers; + private final CopyOnWriteArrayList handlers = + new CopyOnWriteArrayList(); private String resourceBundleName; - private boolean useParentHandlers = true; - private Filter filter; + private volatile boolean useParentHandlers = true; + private volatile Filter filter; private boolean anonymous; private ResourceBundle catalog; // Cached resource bundle @@ -180,9 +182,9 @@ public class Logger { private static Object treeLock = new Object(); // We keep weak references from parents to children, but strong // references from children to parents. - private Logger parent; // our nearest parent. + private volatile Logger parent; // our nearest parent. private ArrayList> kids; // WeakReferences to loggers that have us as parent - private Level levelObject; + private volatile Level levelObject; private volatile int levelValue; // current effective level value /** @@ -438,7 +440,7 @@ public class Logger { * @exception SecurityException if a security manager exists and if * the caller does not have LoggingPermission("control"). */ - public synchronized void setFilter(Filter newFilter) throws SecurityException { + public void setFilter(Filter newFilter) throws SecurityException { checkAccess(); filter = newFilter; } @@ -448,7 +450,7 @@ public class Logger { * * @return a filter object (may be null) */ - public synchronized Filter getFilter() { + public Filter getFilter() { return filter; } @@ -465,10 +467,9 @@ public class Logger { if (record.getLevel().intValue() < levelValue || levelValue == offValue) { return; } - synchronized (this) { - if (filter != null && !filter.isLoggable(record)) { - return; - } + Filter theFilter = filter; + if (theFilter != null && !theFilter.isLoggable(record)) { + return; } // Post the LogRecord to all our Handlers, and then to @@ -476,12 +477,8 @@ public class Logger { Logger logger = this; while (logger != null) { - Handler targets[] = logger.getHandlers(); - - if (targets != null) { - for (int i = 0; i < targets.length; i++) { - targets[i].publish(record); - } + for (Handler handler : logger.handlers) { + handler.publish(record); } if (!logger.getUseParentHandlers()) { @@ -1182,13 +1179,10 @@ public class Logger { * @exception SecurityException if a security manager exists and if * the caller does not have LoggingPermission("control"). */ - public synchronized void addHandler(Handler handler) throws SecurityException { + public void addHandler(Handler handler) throws SecurityException { // Check for null handler handler.getClass(); checkAccess(); - if (handlers == null) { - handlers = new ArrayList(); - } handlers.add(handler); } @@ -1201,14 +1195,11 @@ public class Logger { * @exception SecurityException if a security manager exists and if * the caller does not have LoggingPermission("control"). */ - public synchronized void removeHandler(Handler handler) throws SecurityException { + public void removeHandler(Handler handler) throws SecurityException { checkAccess(); if (handler == null) { return; } - if (handlers == null) { - return; - } handlers.remove(handler); } @@ -1217,11 +1208,8 @@ public class Logger { *

        * @return an array of all registered Handlers */ - public synchronized Handler[] getHandlers() { - if (handlers == null) { - return emptyHandlers; - } - return handlers.toArray(new Handler[handlers.size()]); + public Handler[] getHandlers() { + return handlers.toArray(emptyHandlers); } /** @@ -1235,7 +1223,7 @@ public class Logger { * @exception SecurityException if a security manager exists and if * the caller does not have LoggingPermission("control"). */ - public synchronized void setUseParentHandlers(boolean useParentHandlers) { + public void setUseParentHandlers(boolean useParentHandlers) { checkAccess(); this.useParentHandlers = useParentHandlers; } @@ -1246,7 +1234,7 @@ public class Logger { * * @return true if output is to be sent to the logger's parent */ - public synchronized boolean getUseParentHandlers() { + public boolean getUseParentHandlers() { return useParentHandlers; } @@ -1354,9 +1342,12 @@ public class Logger { * @return nearest existing parent Logger */ public Logger getParent() { - synchronized (treeLock) { - return parent; - } + // Note: this used to be synchronized on treeLock. However, this only + // provided memory semantics, as there was no guarantee that the caller + // would synchronize on treeLock (in fact, there is no way for external + // callers to so synchronize). Therefore, we have made parent volatile + // instead. + return parent; } /** diff --git a/jdk/src/share/classes/javax/swing/ImageIcon.java b/jdk/src/share/classes/javax/swing/ImageIcon.java index 74788f1a803..7f1fd02e003 100644 --- a/jdk/src/share/classes/javax/swing/ImageIcon.java +++ b/jdk/src/share/classes/javax/swing/ImageIcon.java @@ -86,7 +86,7 @@ public class ImageIcon implements Icon, Serializable, Accessible { static { component = new Component() {}; - AccessController.doPrivileged(new PrivilegedAction() { + AccessController.doPrivileged(new PrivilegedAction() { public Object run() { try { // 6482575 - clear the appContext field so as not to leak it diff --git a/jdk/src/share/classes/javax/swing/JRootPane.java b/jdk/src/share/classes/javax/swing/JRootPane.java index c9696246e06..a210c3791c4 100644 --- a/jdk/src/share/classes/javax/swing/JRootPane.java +++ b/jdk/src/share/classes/javax/swing/JRootPane.java @@ -34,6 +34,7 @@ import javax.swing.plaf.RootPaneUI; import java.util.Vector; import java.io.Serializable; import javax.swing.border.*; +import sun.awt.AWTAccessor; import sun.security.action.GetBooleanAction; @@ -688,6 +689,9 @@ public class JRootPane extends JComponent implements Accessible { throw new NullPointerException("glassPane cannot be set to null."); } + AWTAccessor.getComponentAccessor().setMixingCutoutShape(glass, + new Rectangle()); + boolean visible = false; if (glassPane != null && glassPane.getParent() == this) { this.remove(glassPane); diff --git a/jdk/src/share/classes/javax/swing/ProgressMonitor.java b/jdk/src/share/classes/javax/swing/ProgressMonitor.java index 36366df170c..73a2b656b0d 100644 --- a/jdk/src/share/classes/javax/swing/ProgressMonitor.java +++ b/jdk/src/share/classes/javax/swing/ProgressMonitor.java @@ -78,7 +78,7 @@ import javax.swing.text.*; * @author James Gosling * @author Lynn Monsanto (accessibility) */ -public class ProgressMonitor extends Object implements Accessible +public class ProgressMonitor implements Accessible { private ProgressMonitor root; private JDialog dialog; @@ -186,7 +186,7 @@ public class ProgressMonitor extends Object implements Accessible } if (window instanceof SwingUtilities.SharedOwnerFrame) { WindowListener ownerShutdownListener = - (WindowListener)SwingUtilities.getSharedOwnerFrameShutdownListener(); + SwingUtilities.getSharedOwnerFrameShutdownListener(); dialog.addWindowListener(ownerShutdownListener); } Container contentPane = dialog.getContentPane(); @@ -273,7 +273,7 @@ public class ProgressMonitor extends Object implements Accessible if (dT >= millisToDecideToPopup) { int predictedCompletionTime; if (nv > min) { - predictedCompletionTime = (int)((long)dT * + predictedCompletionTime = (int)(dT * (max - min) / (nv - min)); } @@ -691,10 +691,7 @@ public class ProgressMonitor extends Object implements Accessible * object does not have an Accessible parent */ public Accessible getAccessibleParent() { - if (dialog != null) { - return (Accessible)dialog; - } - return null; + return dialog; } /* @@ -768,7 +765,7 @@ public class ProgressMonitor extends Object implements Accessible if (myBar != null) { Component c = myBar.getParent(); if (c instanceof Accessible) { - return ((Accessible)c).getAccessibleContext(); + return c.getAccessibleContext(); } } return null; diff --git a/jdk/src/share/classes/javax/swing/RepaintManager.java b/jdk/src/share/classes/javax/swing/RepaintManager.java index f051acdc675..f51bf4ec27a 100644 --- a/jdk/src/share/classes/javax/swing/RepaintManager.java +++ b/jdk/src/share/classes/javax/swing/RepaintManager.java @@ -1305,9 +1305,12 @@ public class RepaintManager if (doubleBufferingEnabled && !nativeDoubleBuffering) { switch (bufferStrategyType) { case BUFFER_STRATEGY_NOT_SPECIFIED: - if (((SunToolkit)Toolkit.getDefaultToolkit()). - useBufferPerWindow()) { - paintManager = new BufferStrategyPaintManager(); + Toolkit tk = Toolkit.getDefaultToolkit(); + if (tk instanceof SunToolkit) { + SunToolkit stk = (SunToolkit) tk; + if (stk.useBufferPerWindow()) { + paintManager = new BufferStrategyPaintManager(); + } } break; case BUFFER_STRATEGY_SPECIFIED_ON: @@ -1329,9 +1332,16 @@ public class RepaintManager private void scheduleProcessingRunnable(AppContext context) { if (processingRunnable.markPending()) { - SunToolkit.getSystemEventQueueImplPP(context). - postEvent(new InvocationEvent(Toolkit.getDefaultToolkit(), - processingRunnable)); + Toolkit tk = Toolkit.getDefaultToolkit(); + if (tk instanceof SunToolkit) { + SunToolkit.getSystemEventQueueImplPP(context). + postEvent(new InvocationEvent(Toolkit.getDefaultToolkit(), + processingRunnable)); + } else { + Toolkit.getDefaultToolkit().getSystemEventQueue(). + postEvent(new InvocationEvent(Toolkit.getDefaultToolkit(), + processingRunnable)); + } } } diff --git a/jdk/src/share/classes/javax/swing/SwingWorker.java b/jdk/src/share/classes/javax/swing/SwingWorker.java index de00ddc381d..9eca7d535f6 100644 --- a/jdk/src/share/classes/javax/swing/SwingWorker.java +++ b/jdk/src/share/classes/javax/swing/SwingWorker.java @@ -282,7 +282,7 @@ public abstract class SwingWorker implements RunnableFuture { * is finished. */ DONE - }; + } /** * Constructs this {@code SwingWorker}. @@ -825,7 +825,7 @@ public abstract class SwingWorker implements RunnableFuture { } private static class DoSubmitAccumulativeRunnable extends AccumulativeRunnable implements ActionListener { - private final static int DELAY = (int) (1000 / 30); + private final static int DELAY = 1000 / 30; @Override protected void run(List args) { for (Runnable runnable : args) { diff --git a/jdk/src/share/classes/javax/swing/colorchooser/AbstractColorChooserPanel.java b/jdk/src/share/classes/javax/swing/colorchooser/AbstractColorChooserPanel.java index c9ea9d77494..3980a40a6c1 100644 --- a/jdk/src/share/classes/javax/swing/colorchooser/AbstractColorChooserPanel.java +++ b/jdk/src/share/classes/javax/swing/colorchooser/AbstractColorChooserPanel.java @@ -26,6 +26,8 @@ package javax.swing.colorchooser; import java.awt.*; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import javax.swing.*; /** @@ -47,6 +49,15 @@ import javax.swing.*; */ public abstract class AbstractColorChooserPanel extends JPanel { + private final PropertyChangeListener enabledListener = new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent event) { + Object value = event.getNewValue(); + if (value instanceof Boolean) { + setEnabled((Boolean) value); + } + } + }; + /** * */ @@ -142,6 +153,8 @@ public abstract class AbstractColorChooserPanel extends JPanel { throw new RuntimeException ("This chooser panel is already installed"); } chooser = enclosingChooser; + chooser.addPropertyChangeListener("enabled", enabledListener); + setEnabled(chooser.isEnabled()); buildChooser(); updateChooser(); } @@ -151,6 +164,7 @@ public abstract class AbstractColorChooserPanel extends JPanel { * If override this, be sure to call super. */ public void uninstallChooserPanel(JColorChooser enclosingChooser) { + chooser.removePropertyChangeListener("enabled", enabledListener); chooser = null; } diff --git a/jdk/src/share/classes/javax/swing/colorchooser/ColorChooserPanel.java b/jdk/src/share/classes/javax/swing/colorchooser/ColorChooserPanel.java index acd6cdcc3fc..cc4fa5d53f2 100644 --- a/jdk/src/share/classes/javax/swing/colorchooser/ColorChooserPanel.java +++ b/jdk/src/share/classes/javax/swing/colorchooser/ColorChooserPanel.java @@ -26,6 +26,8 @@ package javax.swing.colorchooser; import java.awt.Color; +import java.awt.Component; +import java.awt.Container; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.beans.PropertyChangeEvent; @@ -56,6 +58,21 @@ final class ColorChooserPanel extends AbstractColorChooserPanel implements Prope ValueFormatter.init(6, true, this.text); } + @Override + public void setEnabled(boolean enabled) { + super.setEnabled(enabled); + setEnabled(this, enabled); + } + + private static void setEnabled(Container container, boolean enabled) { + for (Component component : container.getComponents()) { + component.setEnabled(enabled); + if (component instanceof Container) { + setEnabled((Container) component, enabled); + } + } + } + @Override public void updateChooser() { Color color = getColorFromModel(); diff --git a/jdk/src/share/classes/javax/swing/colorchooser/DefaultColorSelectionModel.java b/jdk/src/share/classes/javax/swing/colorchooser/DefaultColorSelectionModel.java index e3cf261bd02..e437dd96dd3 100644 --- a/jdk/src/share/classes/javax/swing/colorchooser/DefaultColorSelectionModel.java +++ b/jdk/src/share/classes/javax/swing/colorchooser/DefaultColorSelectionModel.java @@ -128,8 +128,7 @@ public class DefaultColorSelectionModel implements ColorSelectionModel, Serializ * @since 1.4 */ public ChangeListener[] getChangeListeners() { - return (ChangeListener[])listenerList.getListeners( - ChangeListener.class); + return listenerList.getListeners(ChangeListener.class); } /** diff --git a/jdk/src/share/classes/javax/swing/colorchooser/DefaultSwatchChooserPanel.java b/jdk/src/share/classes/javax/swing/colorchooser/DefaultSwatchChooserPanel.java index 3cbd0df3b85..76896a90c64 100644 --- a/jdk/src/share/classes/javax/swing/colorchooser/DefaultSwatchChooserPanel.java +++ b/jdk/src/share/classes/javax/swing/colorchooser/DefaultSwatchChooserPanel.java @@ -170,7 +170,6 @@ class DefaultSwatchChooserPanel extends AbstractColorChooserPanel { superHolder.add(mainHolder, gbc); gbc.insets = oldInsets; - recentSwatchPanel.addMouseListener(recentSwatchListener); recentSwatchPanel.setInheritsPopupMenu(true); JPanel recentHolder = new JPanel( new BorderLayout() ); recentHolder.setBorder(border); @@ -212,16 +211,20 @@ class DefaultSwatchChooserPanel extends AbstractColorChooserPanel { class RecentSwatchListener extends MouseAdapter implements Serializable { public void mousePressed(MouseEvent e) { - Color color = recentSwatchPanel.getColorForLocation(e.getX(), e.getY()); - setSelectedColor(color); + if (isEnabled()) { + Color color = recentSwatchPanel.getColorForLocation(e.getX(), e.getY()); + setSelectedColor(color); + } } } class MainSwatchListener extends MouseAdapter implements Serializable { public void mousePressed(MouseEvent e) { - Color color = swatchPanel.getColorForLocation(e.getX(), e.getY()); - setSelectedColor(color); - recentSwatchPanel.setMostRecentColor(color); + if (isEnabled()) { + Color color = swatchPanel.getColorForLocation(e.getX(), e.getY()); + setSelectedColor(color); + recentSwatchPanel.setMostRecentColor(color); + } } } diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicFileChooserUI.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicFileChooserUI.java index 13d13cdcefe..44f99d6d3e3 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicFileChooserUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicFileChooserUI.java @@ -1132,13 +1132,18 @@ public class BasicFileChooserUI extends FileChooserUI { private void changeDirectory(File dir) { JFileChooser fc = getFileChooser(); // Traverse shortcuts on Windows - if (dir != null && File.separatorChar == '\\' && dir.getPath().endsWith(".lnk")) { + if (dir != null && FilePane.usesShellFolder(fc)) { try { - File linkedTo = ShellFolder.getShellFolder(dir).getLinkLocation(); - if (linkedTo != null && fc.isTraversable(linkedTo)) { - dir = linkedTo; - } else { - return; + ShellFolder shellFolder = ShellFolder.getShellFolder(dir); + + if (shellFolder.isLink()) { + File linkedTo = shellFolder.getLinkLocation(); + + if (linkedTo != null && fc.isTraversable(linkedTo)) { + dir = linkedTo; + } else { + return; + } } } catch (FileNotFoundException ex) { return; diff --git a/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java b/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java index 1d16e1d8893..864ad13264a 100644 --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java @@ -836,18 +836,24 @@ public class BasicSliderUI extends SliderUI{ */ protected Integer getHighestValue() { Dictionary dictionary = slider.getLabelTable(); - if (dictionary != null) { - Enumeration keys = dictionary.keys(); - int max = slider.getMinimum() - 1; - while (keys.hasMoreElements()) { - max = Math.max(max, ((Integer)keys.nextElement()).intValue()); - } - if (max == slider.getMinimum() - 1) { - return null; - } - return max; + + if (dictionary == null) { + return null; } - return null; + + Enumeration keys = dictionary.keys(); + + Integer max = null; + + while (keys.hasMoreElements()) { + Integer i = (Integer) keys.nextElement(); + + if (max == null || i > max) { + max = i; + } + } + + return max; } /** @@ -859,18 +865,24 @@ public class BasicSliderUI extends SliderUI{ */ protected Integer getLowestValue() { Dictionary dictionary = slider.getLabelTable(); - if (dictionary != null) { - Enumeration keys = dictionary.keys(); - int min = slider.getMaximum() + 1; - while (keys.hasMoreElements()) { - min = Math.min(min, ((Integer)keys.nextElement()).intValue()); - } - if (min == slider.getMaximum() + 1) { - return null; - } - return min; + + if (dictionary == null) { + return null; } - return null; + + Enumeration keys = dictionary.keys(); + + Integer min = null; + + while (keys.hasMoreElements()) { + Integer i = (Integer) keys.nextElement(); + + if (min == null || i < min) { + min = i; + } + } + + return min; } diff --git a/jdk/src/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java b/jdk/src/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java index 763dfdc3fc1..4636e07c4fd 100644 --- a/jdk/src/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java +++ b/jdk/src/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java @@ -68,8 +68,6 @@ public class MetalFileChooserUI extends BasicFileChooserUI { private JToggleButton listViewButton; private JToggleButton detailsViewButton; - private boolean useShellFolder; - private JButton approveButton; private JButton cancelButton; @@ -204,10 +202,6 @@ public class MetalFileChooserUI extends BasicFileChooserUI { public ListSelectionListener createListSelectionListener() { return MetalFileChooserUI.this.createListSelectionListener(getFileChooser()); } - - public boolean usesShellFolder() { - return useShellFolder; - } } public void installComponents(JFileChooser fc) { @@ -219,8 +213,6 @@ public class MetalFileChooserUI extends BasicFileChooserUI { filePane = new FilePane(new MetalFileChooserUIAccessor()); fc.addPropertyChangeListener(filePane); - updateUseShellFolder(); - // ********************************* // // **** Construct the top panel **** // // ********************************* // @@ -448,19 +440,6 @@ public class MetalFileChooserUI extends BasicFileChooserUI { groupLabels(new AlignedLabel[] { fileNameLabel, filesOfTypeLabel }); } - private void updateUseShellFolder() { - // Decide whether to use the ShellFolder class to populate shortcut - // panel and combobox. - JFileChooser fc = getFileChooser(); - Boolean prop = - (Boolean)fc.getClientProperty("FileChooser.useShellFolder"); - if (prop != null) { - useShellFolder = prop.booleanValue(); - } else { - useShellFolder = fc.getFileSystemView().equals(FileSystemView.getFileSystemView()); - } - } - protected JPanel getButtonPanel() { if (buttonPanel == null) { buttonPanel = new JPanel(); @@ -786,7 +765,6 @@ public class MetalFileChooserUI extends BasicFileChooserUI { cc.applyComponentOrientation(o); } } else if (s == "FileChooser.useShellFolder") { - updateUseShellFolder(); doDirectoryChanged(e); } else if (s.equals("ancestor")) { if (e.getOldValue() == null && e.getNewValue() != null) { @@ -953,6 +931,8 @@ public class MetalFileChooserUI extends BasicFileChooserUI { return; } + boolean useShellFolder = FilePane.usesShellFolder(chooser); + directories.clear(); File[] baseFolders; diff --git a/jdk/src/share/classes/javax/swing/plaf/synth/SynthParser.java b/jdk/src/share/classes/javax/swing/plaf/synth/SynthParser.java index 0ff3307cdb5..7fe2278fd20 100644 --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthParser.java +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthParser.java @@ -59,16 +59,16 @@ import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; -import org.xml.sax.AttributeList; -import org.xml.sax.HandlerBase; +import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; +import org.xml.sax.helpers.DefaultHandler; -import com.sun.beans.ObjectHandler; +import com.sun.beans.decoder.DocumentHandler; -class SynthParser extends HandlerBase { +class SynthParser extends DefaultHandler { // // Known element names // @@ -119,7 +119,7 @@ class SynthParser extends HandlerBase { /** * Lazily created, used for anything we don't understand. */ - private ObjectHandler _handler; + private DocumentHandler _handler; /** * Indicates the depth of how many elements we've encountered but don't @@ -292,8 +292,9 @@ class SynthParser extends HandlerBase { /** * Handles beans persistance. */ - private ObjectHandler getHandler() { + private DocumentHandler getHandler() { if (_handler == null) { + _handler = new DocumentHandler(); if (_urlResourceBase != null) { // getHandler() is never called before parse() so it is safe // to create a URLClassLoader with _resourceBase. @@ -304,14 +305,13 @@ class SynthParser extends HandlerBase { URL[] urls = new URL[] { getResource(".") }; ClassLoader parent = Thread.currentThread().getContextClassLoader(); ClassLoader urlLoader = new URLClassLoader(urls, parent); - _handler = new ObjectHandler(null, urlLoader); + _handler.setClassLoader(urlLoader); } else { - _handler = new ObjectHandler(null, - _classResourceBase.getClassLoader()); + _handler.setClassLoader(_classResourceBase.getClassLoader()); } for (String key : _mapping.keySet()) { - _handler.register(key, _mapping.get(key)); + _handler.setVariable(key, _mapping.get(key)); } } return _handler; @@ -336,8 +336,8 @@ class SynthParser extends HandlerBase { private Object lookup(String key, Class type) throws SAXException { Object value; if (_handler != null) { - if ((value = _handler.lookup(key)) != null) { - return checkCast(value, type); + if (_handler.hasVariable(key)) { + return checkCast(_handler.getVariable(key), type); } } value = _mapping.get(key); @@ -354,11 +354,11 @@ class SynthParser extends HandlerBase { private void register(String key, Object value) throws SAXException { if (key != null) { if (_mapping.get(key) != null || - (_handler != null && _handler.lookup(key) != null)) { + (_handler != null && _handler.hasVariable(key))) { throw new SAXException("ID " + key + " is already defined"); } if (_handler != null) { - _handler.register(key, value); + _handler.setVariable(key, value); } else { _mapping.put(key, value); @@ -400,12 +400,12 @@ class SynthParser extends HandlerBase { // The following methods are invoked from startElement/stopElement // - private void startStyle(AttributeList attributes) throws SAXException { + private void startStyle(Attributes attributes) throws SAXException { String id = null; _style = null; for(int i = attributes.getLength() - 1; i >= 0; i--) { - String key = attributes.getName(i); + String key = attributes.getQName(i); if (key.equals(ATTRIBUTE_CLONE)) { _style = (ParsedSynthStyle)((ParsedSynthStyle)lookup( attributes.getValue(i), ParsedSynthStyle.class)). @@ -421,7 +421,7 @@ class SynthParser extends HandlerBase { register(id, _style); } - private void endStyle() throws SAXException { + private void endStyle() { int size = _stylePainters.size(); if (size > 0) { _style.setPainters(_stylePainters.toArray(new ParsedSynthStyle.PainterInfo[size])); @@ -435,14 +435,14 @@ class SynthParser extends HandlerBase { _style = null; } - private void startState(AttributeList attributes) throws SAXException { + private void startState(Attributes attributes) throws SAXException { ParsedSynthStyle.StateInfo stateInfo = null; int state = 0; String id = null; _stateInfo = null; for(int i = attributes.getLength() - 1; i >= 0; i--) { - String key = attributes.getName(i); + String key = attributes.getQName(i); if (key.equals(ATTRIBUTE_ID)) { id = attributes.getValue(i); } @@ -496,7 +496,7 @@ class SynthParser extends HandlerBase { _stateInfos.add(_stateInfo); } - private void endState() throws SAXException { + private void endState() { int size = _statePainters.size(); if (size > 0) { _stateInfo.setPainters(_statePainters.toArray(new ParsedSynthStyle.PainterInfo[size])); @@ -505,7 +505,7 @@ class SynthParser extends HandlerBase { _stateInfo = null; } - private void startFont(AttributeList attributes) throws SAXException { + private void startFont(Attributes attributes) throws SAXException { Font font = null; int style = Font.PLAIN; int size = 0; @@ -513,7 +513,7 @@ class SynthParser extends HandlerBase { String name = null; for(int i = attributes.getLength() - 1; i >= 0; i--) { - String key = attributes.getName(i); + String key = attributes.getQName(i); if (key.equals(ATTRIBUTE_ID)) { id = attributes.getValue(i); } @@ -568,13 +568,13 @@ class SynthParser extends HandlerBase { } } - private void startColor(AttributeList attributes) throws SAXException { + private void startColor(Attributes attributes) throws SAXException { Color color = null; String id = null; _colorTypes.clear(); for(int i = attributes.getLength() - 1; i >= 0; i--) { - String key = attributes.getName(i); + String key = attributes.getQName(i); if (key.equals(ATTRIBUTE_ID)) { id = attributes.getValue(i); } @@ -697,7 +697,7 @@ class SynthParser extends HandlerBase { } } - private void startProperty(AttributeList attributes, + private void startProperty(Attributes attributes, Object property) throws SAXException { Object value = null; String key = null; @@ -707,7 +707,7 @@ class SynthParser extends HandlerBase { String aValue = null; for(int i = attributes.getLength() - 1; i >= 0; i--) { - String aName = attributes.getName(i); + String aName = attributes.getQName(i); if (aName.equals(ATTRIBUTE_TYPE)) { String type = attributes.getValue(i).toUpperCase(); if (type.equals("IDREF")) { @@ -795,11 +795,11 @@ class SynthParser extends HandlerBase { } } - private void startGraphics(AttributeList attributes) throws SAXException { + private void startGraphics(Attributes attributes) throws SAXException { SynthGraphicsUtils graphics = null; for(int i = attributes.getLength() - 1; i >= 0; i--) { - String key = attributes.getName(i); + String key = attributes.getQName(i); if (key.equals(ATTRIBUTE_IDREF)) { graphics = (SynthGraphicsUtils)lookup(attributes.getValue(i), SynthGraphicsUtils.class); @@ -813,7 +813,7 @@ class SynthParser extends HandlerBase { } } - private void startInsets(AttributeList attributes) throws SAXException { + private void startInsets(Attributes attributes) throws SAXException { int top = 0; int bottom = 0; int left = 0; @@ -822,7 +822,7 @@ class SynthParser extends HandlerBase { String id = null; for(int i = attributes.getLength() - 1; i >= 0; i--) { - String key = attributes.getName(i); + String key = attributes.getQName(i); try { if (key.equals(ATTRIBUTE_IDREF)) { @@ -858,13 +858,13 @@ class SynthParser extends HandlerBase { } } - private void startBind(AttributeList attributes) throws SAXException { + private void startBind(Attributes attributes) throws SAXException { ParsedSynthStyle style = null; String path = null; int type = -1; for(int i = attributes.getLength() - 1; i >= 0; i--) { - String key = attributes.getName(i); + String key = attributes.getQName(i); if (key.equals(ATTRIBUTE_STYLE)) { style = (ParsedSynthStyle)lookup(attributes.getValue(i), @@ -899,7 +899,7 @@ class SynthParser extends HandlerBase { } } - private void startPainter(AttributeList attributes, String type) throws SAXException { + private void startPainter(Attributes attributes, String type) throws SAXException { Insets sourceInsets = null; Insets destInsets = null; String path = null; @@ -915,7 +915,7 @@ class SynthParser extends HandlerBase { boolean paintCenterSpecified = false; for(int i = attributes.getLength() - 1; i >= 0; i--) { - String key = attributes.getName(i); + String key = attributes.getQName(i); String value = attributes.getValue(i); if (key.equals(ATTRIBUTE_ID)) { @@ -1042,12 +1042,12 @@ class SynthParser extends HandlerBase { painters.add(painterInfo); } - private void startImageIcon(AttributeList attributes) throws SAXException { + private void startImageIcon(Attributes attributes) throws SAXException { String path = null; String id = null; for(int i = attributes.getLength() - 1; i >= 0; i--) { - String key = attributes.getName(i); + String key = attributes.getQName(i); if (key.equals(ATTRIBUTE_ID)) { id = attributes.getValue(i); @@ -1062,12 +1062,11 @@ class SynthParser extends HandlerBase { register(id, new LazyImageIcon(getResource(path))); } - private void startOpaque(AttributeList attributes) throws - SAXException { + private void startOpaque(Attributes attributes) { if (_style != null) { _style.setOpaque(true); for(int i = attributes.getLength() - 1; i >= 0; i--) { - String key = attributes.getName(i); + String key = attributes.getQName(i); if (key.equals(ATTRIBUTE_VALUE)) { _style.setOpaque("true".equals(attributes.getValue(i). @@ -1077,12 +1076,12 @@ class SynthParser extends HandlerBase { } } - private void startInputMap(AttributeList attributes) throws SAXException { + private void startInputMap(Attributes attributes) throws SAXException { _inputMapBindings.clear(); _inputMapID = null; if (_style != null) { for(int i = attributes.getLength() - 1; i >= 0; i--) { - String key = attributes.getName(i); + String key = attributes.getQName(i); if (key.equals(ATTRIBUTE_ID)) { _inputMapID = attributes.getValue(i); @@ -1101,7 +1100,7 @@ class SynthParser extends HandlerBase { _inputMapID = null; } - private void startBindKey(AttributeList attributes) throws SAXException { + private void startBindKey(Attributes attributes) throws SAXException { if (_inputMapID == null) { // Not in an inputmap, bail. return; @@ -1110,7 +1109,7 @@ class SynthParser extends HandlerBase { String key = null; String value = null; for(int i = attributes.getLength() - 1; i >= 0; i--) { - String aKey = attributes.getName(i); + String aKey = attributes.getQName(i); if (aKey.equals(ATTRIBUTE_KEY)) { key = attributes.getValue(i); @@ -1129,26 +1128,26 @@ class SynthParser extends HandlerBase { } // - // SAX methods, these forward to the ObjectHandler if we don't know + // SAX methods, these forward to the DocumentHandler if we don't know // the element name. // public InputSource resolveEntity(String publicId, String systemId) - throws SAXException { + throws IOException, SAXException { if (isForwarding()) { return getHandler().resolveEntity(publicId, systemId); } return null; } - public void notationDecl(String name, String publicId, String systemId) { + public void notationDecl(String name, String publicId, String systemId) throws SAXException { if (isForwarding()) { getHandler().notationDecl(name, publicId, systemId); } } public void unparsedEntityDecl(String name, String publicId, - String systemId, String notationName) { + String systemId, String notationName) throws SAXException { if (isForwarding()) { getHandler().unparsedEntityDecl(name, publicId, systemId, notationName); @@ -1173,7 +1172,7 @@ class SynthParser extends HandlerBase { } } - public void startElement(String name, AttributeList attributes) + public void startElement(String uri, String local, String name, Attributes attributes) throws SAXException { name = name.intern(); if (name == ELEMENT_STYLE) { @@ -1223,18 +1222,18 @@ class SynthParser extends HandlerBase { } else if (name != ELEMENT_SYNTH) { if (_depth++ == 0) { - getHandler().reset(); + getHandler().startDocument(); } - getHandler().startElement(name, attributes); + getHandler().startElement(uri, local, name, attributes); } } - public void endElement(String name) throws SAXException { + public void endElement(String uri, String local, String name) throws SAXException { if (isForwarding()) { - getHandler().endElement(name); + getHandler().endElement(uri, local, name); _depth--; if (!isForwarding()) { - getHandler().reset(); + getHandler().startDocument(); } } else { diff --git a/jdk/src/share/classes/javax/swing/table/DefaultTableColumnModel.java b/jdk/src/share/classes/javax/swing/table/DefaultTableColumnModel.java index 846001b35b1..d3ae8cdd63f 100644 --- a/jdk/src/share/classes/javax/swing/table/DefaultTableColumnModel.java +++ b/jdk/src/share/classes/javax/swing/table/DefaultTableColumnModel.java @@ -190,7 +190,7 @@ public class DefaultTableColumnModel implements TableColumnModel, fireColumnMoved(new TableColumnModelEvent(this, columnIndex, newIndex)); return; } - aColumn = (TableColumn)tableColumns.elementAt(columnIndex); + aColumn = tableColumns.elementAt(columnIndex); tableColumns.removeElementAt(columnIndex); boolean selected = selectionModel.isSelectedIndex(columnIndex); @@ -291,7 +291,7 @@ public class DefaultTableColumnModel implements TableColumnModel, * at columnIndex */ public TableColumn getColumn(int columnIndex) { - return (TableColumn)tableColumns.elementAt(columnIndex); + return tableColumns.elementAt(columnIndex); } /** @@ -504,8 +504,7 @@ public class DefaultTableColumnModel implements TableColumnModel, * @since 1.4 */ public TableColumnModelListener[] getColumnModelListeners() { - return (TableColumnModelListener[])listenerList.getListeners( - TableColumnModelListener.class); + return listenerList.getListeners(TableColumnModelListener.class); } // diff --git a/jdk/src/share/classes/javax/swing/tree/DefaultMutableTreeNode.java b/jdk/src/share/classes/javax/swing/tree/DefaultMutableTreeNode.java index 11ed3bdd582..34c36ba8957 100644 --- a/jdk/src/share/classes/javax/swing/tree/DefaultMutableTreeNode.java +++ b/jdk/src/share/classes/javax/swing/tree/DefaultMutableTreeNode.java @@ -84,7 +84,7 @@ import java.util.*; * * @author Rob Davis */ -public class DefaultMutableTreeNode extends Object implements Cloneable, +public class DefaultMutableTreeNode implements Cloneable, MutableTreeNode, Serializable { private static final long serialVersionUID = -4298474751201349152L; @@ -1251,7 +1251,7 @@ public class DefaultMutableTreeNode extends Object implements Cloneable, * @return a copy of this node */ public Object clone() { - DefaultMutableTreeNode newNode = null; + DefaultMutableTreeNode newNode; try { newNode = (DefaultMutableTreeNode)super.clone(); @@ -1297,24 +1297,22 @@ public class DefaultMutableTreeNode extends Object implements Cloneable, userObject = tValues[1]; } - final class PreorderEnumeration implements Enumeration { - protected Stack stack; + private final class PreorderEnumeration implements Enumeration { + private final Stack stack = new Stack(); public PreorderEnumeration(TreeNode rootNode) { super(); - Vector v = new Vector(1); + Vector v = new Vector(1); v.addElement(rootNode); // PENDING: don't really need a vector - stack = new Stack(); stack.push(v.elements()); } public boolean hasMoreElements() { - return (!stack.empty() && - ((Enumeration)stack.peek()).hasMoreElements()); + return (!stack.empty() && stack.peek().hasMoreElements()); } public TreeNode nextElement() { - Enumeration enumer = (Enumeration)stack.peek(); + Enumeration enumer = stack.peek(); TreeNode node = (TreeNode)enumer.nextElement(); Enumeration children = node.children(); @@ -1353,8 +1351,7 @@ public class DefaultMutableTreeNode extends Object implements Cloneable, if (subtree.hasMoreElements()) { retval = subtree.nextElement(); } else if (children.hasMoreElements()) { - subtree = new PostorderEnumeration( - (TreeNode)children.nextElement()); + subtree = new PostorderEnumeration(children.nextElement()); retval = subtree.nextElement(); } else { retval = root; @@ -1373,7 +1370,7 @@ public class DefaultMutableTreeNode extends Object implements Cloneable, public BreadthFirstEnumeration(TreeNode rootNode) { super(); - Vector v = new Vector(1); + Vector v = new Vector(1); v.addElement(rootNode); // PENDING: don't really need a vector queue = new Queue(); queue.enqueue(v.elements()); diff --git a/jdk/src/share/classes/javax/swing/undo/CompoundEdit.java b/jdk/src/share/classes/javax/swing/undo/CompoundEdit.java index 6bc66156029..7aa21d3af8d 100644 --- a/jdk/src/share/classes/javax/swing/undo/CompoundEdit.java +++ b/jdk/src/share/classes/javax/swing/undo/CompoundEdit.java @@ -59,7 +59,7 @@ public class CompoundEdit extends AbstractUndoableEdit { super.undo(); int i = edits.size(); while (i-- > 0) { - UndoableEdit e = (UndoableEdit)edits.elementAt(i); + UndoableEdit e = edits.elementAt(i); e.undo(); } } @@ -85,7 +85,7 @@ public class CompoundEdit extends AbstractUndoableEdit { protected UndoableEdit lastEdit() { int count = edits.size(); if (count > 0) - return (UndoableEdit)edits.elementAt(count-1); + return edits.elementAt(count-1); else return null; } @@ -98,7 +98,7 @@ public class CompoundEdit extends AbstractUndoableEdit { int size = edits.size(); for (int i = size-1; i >= 0; i--) { - UndoableEdit e = (UndoableEdit)edits.elementAt(i); + UndoableEdit e = edits.elementAt(i); // System.out.println("CompoundEdit(" + i + "): Discarding " + // e.getUndoPresentationName()); e.die(); diff --git a/jdk/src/share/classes/sun/awt/AWTAccessor.java b/jdk/src/share/classes/sun/awt/AWTAccessor.java new file mode 100644 index 00000000000..41b933c4a61 --- /dev/null +++ b/jdk/src/share/classes/sun/awt/AWTAccessor.java @@ -0,0 +1,77 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package sun.awt; + +import java.awt.*; +import sun.misc.Unsafe; + +/** The AWTAccessor utility class. + * The main purpose of this class is to enable accessing + * private and package-private fields of classes from + * different classes/packages. See sun.misc.SharedSecretes + * for another example. + */ +public final class AWTAccessor { + private static final Unsafe unsafe = Unsafe.getUnsafe(); + + /** We don't need any objects of this class. + * It's rather a collection of static methods + * and interfaces. + */ + private AWTAccessor() { + } + + /** An accessor for the java.awt.Component class. + */ + public interface ComponentAccessor { + // See 6797587 + // Also see: 6776743, 6768307, and 6768332. + /** + * Sets the shape of a lw component to cut out from hw components. + */ + void setMixingCutoutShape(Component comp, Shape shape); + } + + /* The java.awt.Component class accessor object. + */ + private static ComponentAccessor componentAccessor; + + /** Set an accessor object for the java.awt.Component class. + */ + public static void setComponentAccessor(ComponentAccessor ca) { + componentAccessor = ca; + } + + /** Retrieve the accessor object for the java.awt.Window class. + */ + public static ComponentAccessor getComponentAccessor() { + if (componentAccessor == null) { + unsafe.ensureClassInitialized(Component.class); + } + + return componentAccessor; + } +} diff --git a/jdk/src/share/classes/sun/awt/HeadlessToolkit.java b/jdk/src/share/classes/sun/awt/HeadlessToolkit.java index 97a7686605f..18ccc446be5 100644 --- a/jdk/src/share/classes/sun/awt/HeadlessToolkit.java +++ b/jdk/src/share/classes/sun/awt/HeadlessToolkit.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. 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 @@ -456,6 +456,10 @@ public class HeadlessToolkit extends Toolkit return tk.getAWTEventListeners(); } + public AWTEventListener[] getAWTEventListeners(long eventMask) { + return tk.getAWTEventListeners(eventMask); + } + public boolean isDesktopSupported() { return false; } @@ -464,4 +468,8 @@ public class HeadlessToolkit extends Toolkit throws HeadlessException{ throw new HeadlessException(); } + + public boolean areExtraMouseButtonsEnabled() throws HeadlessException{ + throw new HeadlessException(); + } } diff --git a/jdk/src/share/classes/sun/awt/SunToolkit.java b/jdk/src/share/classes/sun/awt/SunToolkit.java index 20da8ffe766..7c6f74856a9 100644 --- a/jdk/src/share/classes/sun/awt/SunToolkit.java +++ b/jdk/src/share/classes/sun/awt/SunToolkit.java @@ -1972,6 +1972,21 @@ public abstract class SunToolkit extends Toolkit AWTAutoShutdown.getInstance().dumpPeers(aLog); } + private static Boolean sunAwtDisableMixing = null; + + /** + * Returns the value of "sun.awt.disableMixing" property. Default + * value is {@code false}. + */ + public synchronized static boolean getSunAwtDisableMixing() { + if (sunAwtDisableMixing == null) { + sunAwtDisableMixing = Boolean.valueOf( + AccessController.doPrivileged( + new GetBooleanAction("sun.awt.disableMixing"))); + } + return sunAwtDisableMixing.booleanValue(); + } + /** * Returns true if the native GTK libraries are available. The * default implementation returns false, but UNIXToolkit overrides this @@ -2008,26 +2023,12 @@ class PostEventQueue { /* * Continually post pending AWTEvents to the Java EventQueue. */ - public void flush() { - if (queueHead != null) { - EventQueueItem tempQueue; - /* - * We have to execute the loop inside the synchronized block - * to ensure that the flush is completed before a new event - * can be posted to this queue. - */ - synchronized (this) { - tempQueue = queueHead; - queueHead = queueTail = null; - /* - * If this PostEventQueue is flushed in parallel on two - * different threads tempQueue will be null for one of them. - */ - while (tempQueue != null) { - eventQueue.postEvent(tempQueue.event); - tempQueue = tempQueue.next; - } - } + public synchronized void flush() { + EventQueueItem tempQueue = queueHead; + queueHead = queueTail = null; + while (tempQueue != null) { + eventQueue.postEvent(tempQueue.event); + tempQueue = tempQueue.next; } } diff --git a/jdk/src/share/classes/sun/beans/editors/EnumEditor.java b/jdk/src/share/classes/sun/beans/editors/EnumEditor.java index 6a465785c17..201c6f24b81 100644 --- a/jdk/src/share/classes/sun/beans/editors/EnumEditor.java +++ b/jdk/src/share/classes/sun/beans/editors/EnumEditor.java @@ -67,7 +67,7 @@ public final class EnumEditor implements PropertyEditor { } public void setValue( Object value ) { - if ( ( value != null ) && ( this.type != value.getClass() ) ) { + if ( ( value != null ) && !this.type.isInstance( value ) ) { throw new IllegalArgumentException( "Unsupported value: " + value ); } Object oldValue; diff --git a/jdk/src/share/classes/sun/java2d/pipe/Region.java b/jdk/src/share/classes/sun/java2d/pipe/Region.java index 765c4251030..9f395c3b540 100644 --- a/jdk/src/share/classes/sun/java2d/pipe/Region.java +++ b/jdk/src/share/classes/sun/java2d/pipe/Region.java @@ -28,6 +28,7 @@ package sun.java2d.pipe; import java.awt.Rectangle; import java.awt.Shape; import java.awt.geom.AffineTransform; +import java.awt.geom.RectangularShape; /** * This class encapsulates a definition of a two dimensional region which @@ -63,11 +64,28 @@ public class Region { static final int INIT_SIZE = 50; static final int GROW_SIZE = 50; - static final Region EMPTY_REGION = new Region(0, 0, 0, 0); - static final Region WHOLE_REGION = new Region(Integer.MIN_VALUE, - Integer.MIN_VALUE, - Integer.MAX_VALUE, - Integer.MAX_VALUE); + /** + * Immutable Region. + */ + private static final class ImmutableRegion extends Region { + protected ImmutableRegion(int lox, int loy, int hix, int hiy) { + super(lox, loy, hix, hiy); + } + + // Override all the methods that mutate the object + public void appendSpans(sun.java2d.pipe.SpanIterator si) {} + public void setOutputArea(java.awt.Rectangle r) {} + public void setOutputAreaXYWH(int x, int y, int w, int h) {} + public void setOutputArea(int[] box) {} + public void setOutputAreaXYXY(int lox, int loy, int hix, int hiy) {} + } + + public static final Region EMPTY_REGION = new ImmutableRegion(0, 0, 0, 0); + public static final Region WHOLE_REGION = new ImmutableRegion( + Integer.MIN_VALUE, + Integer.MIN_VALUE, + Integer.MAX_VALUE, + Integer.MAX_VALUE); int lox; int loy; @@ -113,7 +131,7 @@ public class Region { return newv; } - private Region(int lox, int loy, int hix, int hiy) { + protected Region(int lox, int loy, int hix, int hiy) { this.lox = lox; this.loy = loy; this.hix = hix; @@ -194,6 +212,13 @@ public class Region { public static Region getInstance(Region devBounds, boolean normalize, Shape s, AffineTransform at) { + // Optimize for empty shapes to avoid involving the SpanIterator + if (s instanceof RectangularShape && + ((RectangularShape)s).isEmpty()) + { + return EMPTY_REGION; + } + int box[] = new int[4]; ShapeSpanIterator sr = new ShapeSpanIterator(normalize); try { @@ -1206,7 +1231,7 @@ public class Region { return false; } if (r.lox != this.lox || r.loy != this.loy || - r.hiy != this.hiy || r.hiy != this.hiy) + r.hix != this.hix || r.hiy != this.hiy) { return false; } diff --git a/jdk/src/share/classes/sun/misc/URLClassPath.java b/jdk/src/share/classes/sun/misc/URLClassPath.java index 5e38c767135..28b4441d35d 100644 --- a/jdk/src/share/classes/sun/misc/URLClassPath.java +++ b/jdk/src/share/classes/sun/misc/URLClassPath.java @@ -25,17 +25,7 @@ package sun.misc; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.Hashtable; -import java.util.NoSuchElementException; -import java.util.Stack; -import java.util.Set; -import java.util.HashSet; -import java.util.StringTokenizer; -import java.util.ArrayList; -import java.util.Iterator; +import java.util.*; import java.util.jar.JarFile; import sun.misc.JarIndex; import sun.misc.InvalidJarIndexException; @@ -52,12 +42,7 @@ import java.net.URLConnection; import java.net.HttpURLConnection; import java.net.URLStreamHandler; import java.net.URLStreamHandlerFactory; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.InputStream; -import java.io.DataOutputStream; -import java.io.IOException; +import java.io.*; import java.security.AccessController; import java.security.AccessControlException; import java.security.CodeSigner; @@ -100,6 +85,9 @@ public class URLClassPath { /* The jar protocol handler to use when creating new URLs */ private URLStreamHandler jarHandler; + /* Whether this URLClassLoader has been closed yet */ + private boolean closed = false; + /** * Creates a new URLClassPath for the given URLs. The URLs will be * searched in the order specified for classes and resources. A URL @@ -124,6 +112,22 @@ public class URLClassPath { this(urls, null); } + public synchronized List closeLoaders() { + if (closed) { + return Collections.emptyList(); + } + List result = new LinkedList(); + for (Loader loader : loaders) { + try { + loader.close(); + } catch (IOException e) { + result.add (e); + } + } + closed = true; + return result; + } + /** * Appends the specified URL to the search path of directory and JAR * file URLs from which to load classes and resources. @@ -293,6 +297,9 @@ public class URLClassPath { * if the specified index is out of range. */ private synchronized Loader getLoader(int index) { + if (closed) { + return null; + } // Expand URL search path until the request can be satisfied // or the URL stack is empty. while (loaders.size() < index + 1) { @@ -453,7 +460,7 @@ public class URLClassPath { * Inner class used to represent a loader of resources and classes * from a base URL. */ - private static class Loader { + private static class Loader implements Closeable { private final URL base; /* @@ -544,6 +551,12 @@ public class URLClassPath { return getResource(name, true); } + /* + * close this loader and release all resources + * method overridden in sub-classes + */ + public void close () throws IOException {} + /* * Returns the local class path for this loader, or null if none. */ @@ -562,6 +575,7 @@ public class URLClassPath { private MetaIndex metaIndex; private URLStreamHandler handler; private HashMap lmap; + private boolean closed = false; /* * Creates a new JarLoader for the specified URL referring to @@ -604,6 +618,17 @@ public class URLClassPath { } } + @Override + public void close () throws IOException { + // closing is synchronized at higher level + if (!closed) { + closed = true; + // in case not already open. + ensureOpen(); + jar.close(); + } + } + JarFile getJarFile () { return jar; } diff --git a/jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java b/jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java index 894c489cd85..4d0543e4b1c 100644 --- a/jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java +++ b/jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java @@ -60,9 +60,6 @@ public class FileChannelImpl // Memory allocation size for mapping buffers private static final long allocationGranularity; - // Cached field for MappedByteBuffer.isAMappedBuffer - private static final Field isAMappedBufferField; - // File descriptor private final FileDescriptor fd; @@ -1315,8 +1312,6 @@ public class FileChannelImpl Util.load(); allocationGranularity = initIDs(); nd = new FileDispatcher(); - isAMappedBufferField = Reflect.lookupField("java.nio.MappedByteBuffer", - "isAMappedBuffer"); } } diff --git a/jdk/src/share/classes/sun/security/krb5/Config.java b/jdk/src/share/classes/sun/security/krb5/Config.java index 2a16b983f33..07c78e2959a 100644 --- a/jdk/src/share/classes/sun/security/krb5/Config.java +++ b/jdk/src/share/classes/sun/security/krb5/Config.java @@ -1,5 +1,5 @@ /* - * Portions Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2000-2009 Sun Microsystems, Inc. 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 @@ -39,7 +39,6 @@ import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.util.Enumeration; -import java.util.List; import java.util.StringTokenizer; import java.net.InetAddress; import java.net.UnknownHostException; @@ -74,7 +73,7 @@ public class Config { private String defaultRealm; // default kdc realm. // used for native interface - private static native String getWindowsDirectory(); + private static native String getWindowsDirectory(boolean isSystem); /** @@ -156,11 +155,7 @@ public class Config { configFile = loadConfigFile(); stanzaTable = parseStanzaTable(configFile); } catch (IOException ioe) { - KrbException ke = new KrbException("Could not load " + - "configuration file " + - ioe.getMessage()); - ke.initCause(ioe); - throw(ke); + // No krb5.conf, no problem. We'll use DNS etc. } } } @@ -661,38 +656,37 @@ public class Config { } /** - * Gets the default configuration file name. The file will be searched - * in a list of possible loations in the following order: - * 1. the location and file name defined by system property - * "java.security.krb5.conf", - * 2. at Java home lib\security directory with "krb5.conf" name, - * 3. "krb5.ini" at Java home, - * 4. at windows directory with the name of "krb5.ini" for Windows, - * /etc/krb5/krb5.conf for Solaris, /etc/krb5.conf for Linux. + * Gets the default configuration file name. This method will never + * return null. + * + * If the system property "java.security.krb5.conf" is defined, we'll + * use its value, no matter if the file exists or not. Otherwise, + * the file will be searched in a list of possible loations in the + * following order: + * + * 1. at Java home lib\security directory with "krb5.conf" name, + * 2. at windows directory with the name of "krb5.ini" for Windows, + * /etc/krb5/krb5.conf for Solaris, /etc/krb5.conf otherwise. + * + * Note: When the Terminal Service is started in Windows (from 2003), + * there are two kinds of Windows directories: A system one (say, + * C:\Windows), and a user-private one (say, C:\Users\Me\Windows). + * We will first look for krb5.ini in the user-private one. If not + * found, try the system one instead. */ private String getFileName() { String name = java.security.AccessController.doPrivileged( new sun.security.action. GetPropertyAction("java.security.krb5.conf")); - if (name != null) { - boolean temp = - java.security.AccessController.doPrivileged( - new FileExistsAction(name)); - if (temp) - return name; - } else { + if (name == null) { name = java.security.AccessController.doPrivileged( new sun.security.action. GetPropertyAction("java.home")) + File.separator + "lib" + File.separator + "security" + File.separator + "krb5.conf"; - boolean temp = - java.security.AccessController.doPrivileged( - new FileExistsAction(name)); - if (temp) { - return name; - } else { + if (!fileExists(name)) { + name = null; String osname = java.security.AccessController.doPrivileged( new sun.security.action.GetPropertyAction("os.name")); @@ -703,19 +697,35 @@ public class Config { // ignore exceptions } if (Credentials.alreadyLoaded) { - if ((name = getWindowsDirectory()) == null) { - name = "c:\\winnt\\krb5.ini"; - } else if (name.endsWith("\\")) { - name += "krb5.ini"; - } else { - name += "\\krb5.ini"; + String path = getWindowsDirectory(false); + if (path != null) { + if (path.endsWith("\\")) { + path = path + "krb5.ini"; + } else { + path = path + "\\krb5.ini"; + } + if (fileExists(path)) { + name = path; + } } - } else { + if (name == null) { + path = getWindowsDirectory(true); + if (path != null) { + if (path.endsWith("\\")) { + path = path + "krb5.ini"; + } else { + path = path + "\\krb5.ini"; + } + name = path; + } + } + } + if (name == null) { name = "c:\\winnt\\krb5.ini"; } } else if (osname.startsWith("SunOS")) { name = "/etc/krb5/krb5.conf"; - } else if (osname.startsWith("Linux")) { + } else { name = "/etc/krb5.conf"; } } @@ -1042,7 +1052,12 @@ public class Config { public boolean useDNS(String name) { String value = getDefault(name, "libdefaults"); if (value == null) { - return getDefaultBooleanValue("dns_fallback", "libdefaults"); + value = getDefault("dns_fallback", "libdefaults"); + if ("false".equalsIgnoreCase(value)) { + return false; + } else { + return true; + } } else { return value.equalsIgnoreCase("true"); } @@ -1064,12 +1079,39 @@ public class Config { /** * Gets default realm. + * @throws KrbException where no realm can be located + * @return the default realm, always non null */ public String getDefaultRealm() throws KrbException { + Exception cause = null; String realm = getDefault("default_realm", "libdefaults"); if ((realm == null) && useDNS_Realm()) { // use DNS to locate Kerberos realm - realm = getRealmFromDNS(); + try { + realm = getRealmFromDNS(); + } catch (KrbException ke) { + cause = ke; + } + } + if (realm == null) { + realm = java.security.AccessController.doPrivileged( + new java.security.PrivilegedAction() { + @Override + public String run() { + String osname = System.getProperty("os.name"); + if (osname.startsWith("Windows")) { + return System.getenv("USERDNSDOMAIN"); + } + return null; + } + }); + } + if (realm == null) { + KrbException ke = new KrbException("Cannot locate default realm"); + if (cause != null) { + ke.initCause(cause); + } + throw ke; } return realm; } @@ -1077,17 +1119,48 @@ public class Config { /** * Returns a list of KDC's with each KDC separated by a space * - * @param realm the realm for which the master KDC is desired - * @return the list of KDCs + * @param realm the realm for which the KDC list is desired + * @throws KrbException if there's no way to find KDC for the realm + * @return the list of KDCs separated by a space, always non null */ public String getKDCList(String realm) throws KrbException { if (realm == null) { realm = getDefaultRealm(); } + Exception cause = null; String kdcs = getDefault("kdc", realm); if ((kdcs == null) && useDNS_KDC()) { // use DNS to locate KDC - kdcs = getKDCFromDNS(realm); + try { + kdcs = getKDCFromDNS(realm); + } catch (KrbException ke) { + cause = ke; + } + } + if (kdcs == null) { + kdcs = java.security.AccessController.doPrivileged( + new java.security.PrivilegedAction() { + @Override + public String run() { + String osname = System.getProperty("os.name"); + if (osname.startsWith("Windows")) { + String logonServer = System.getenv("LOGONSERVER"); + if (logonServer != null + && logonServer.startsWith("\\\\")) { + logonServer = logonServer.substring(2); + } + return logonServer; + } + return null; + } + }); + } + if (kdcs == null) { + KrbException ke = new KrbException("Cannot locate KDC"); + if (cause != null) { + ke.initCause(cause); + } + throw ke; } return kdcs; } @@ -1102,7 +1175,7 @@ public class Config { String realm = null; String hostName = null; try { - hostName = InetAddress.getLocalHost().getHostName(); + hostName = InetAddress.getLocalHost().getCanonicalHostName(); } catch (UnknownHostException e) { KrbException ke = new KrbException(Krb5.KRB_ERR_GENERIC, "Unable to locate Kerberos realm: " + e.getMessage()); @@ -1171,6 +1244,11 @@ public class Config { return kdcs; } + private boolean fileExists(String name) { + return java.security.AccessController.doPrivileged( + new FileExistsAction(name)); + } + static class FileExistsAction implements java.security.PrivilegedAction { diff --git a/jdk/src/share/classes/sun/security/krb5/KrbServiceLocator.java b/jdk/src/share/classes/sun/security/krb5/KrbServiceLocator.java index 0efe37d1aa4..fefcdbde054 100644 --- a/jdk/src/share/classes/sun/security/krb5/KrbServiceLocator.java +++ b/jdk/src/share/classes/sun/security/krb5/KrbServiceLocator.java @@ -1,5 +1,5 @@ /* - * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2006-2009 Sun Microsystems, Inc. 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 @@ -133,7 +133,7 @@ class KrbServiceLocator { */ static String[] getKerberosService(String realmName, String protocol) { - String dnsUrl = "dns:///_kerberos." + protocol + realmName; + String dnsUrl = "dns:///_kerberos." + protocol + "." + realmName; String[] hostports = null; try { diff --git a/jdk/src/share/classes/sun/swing/FilePane.java b/jdk/src/share/classes/sun/swing/FilePane.java index 298fd42b146..de5ad7c4831 100644 --- a/jdk/src/share/classes/sun/swing/FilePane.java +++ b/jdk/src/share/classes/sun/swing/FilePane.java @@ -689,7 +689,7 @@ public class FilePane extends JPanel implements PropertyChangeListener { void updateColumnInfo() { File dir = chooser.getCurrentDirectory(); - if (dir != null && fileChooserUIAccessor.usesShellFolder()) { + if (dir != null && usesShellFolder(chooser)) { try { dir = ShellFolder.getShellFolder(dir); } catch (FileNotFoundException e) { @@ -1947,7 +1947,7 @@ public class FilePane extends JPanel implements PropertyChangeListener { if (f instanceof ShellFolder) { return ((ShellFolder) f).isFileSystem(); } else { - if (fileChooserUIAccessor.usesShellFolder()) { + if (usesShellFolder(getFileChooser())) { try { return ShellFolder.getShellFolder(f).isFileSystem(); } catch (FileNotFoundException ex) { @@ -1961,6 +1961,16 @@ public class FilePane extends JPanel implements PropertyChangeListener { } } + /** + * Returns true if specified FileChooser should use ShellFolder + */ + public static boolean usesShellFolder(JFileChooser chooser) { + Boolean prop = (Boolean) chooser.getClientProperty("FileChooser.useShellFolder"); + + return prop == null ? chooser.getFileSystemView().equals(FileSystemView.getFileSystemView()) + : prop.booleanValue(); + } + // This interface is used to access methods in the FileChooserUI // that are not public. public interface FileChooserUIAccessor { @@ -1975,6 +1985,5 @@ public class FilePane extends JPanel implements PropertyChangeListener { public Action getNewFolderAction(); public MouseListener createDoubleClickListener(JList list); public ListSelectionListener createListSelectionListener(); - public boolean usesShellFolder(); } } diff --git a/jdk/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java b/jdk/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java index 95fac33386a..5ded9d729a4 100644 --- a/jdk/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java +++ b/jdk/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java @@ -71,8 +71,6 @@ public class SynthFileChooserUIImpl extends SynthFileChooserUI { private JToggleButton listViewButton; private JToggleButton detailsViewButton; - private boolean useShellFolder; - private boolean readOnly; private JPanel buttonPanel; @@ -185,10 +183,6 @@ public class SynthFileChooserUIImpl extends SynthFileChooserUI { public ListSelectionListener createListSelectionListener() { return SynthFileChooserUIImpl.this.createListSelectionListener(getFileChooser()); } - - public boolean usesShellFolder() { - return useShellFolder; - } } protected void installDefaults(JFileChooser fc) { @@ -201,8 +195,6 @@ public class SynthFileChooserUIImpl extends SynthFileChooserUI { SynthContext context = getContext(fc, ENABLED); - updateUseShellFolder(); - fc.setLayout(new BorderLayout(0, 11)); // ********************************* // @@ -432,20 +424,6 @@ public class SynthFileChooserUIImpl extends SynthFileChooserUI { super.uninstallListeners(fc); } - private void updateUseShellFolder() { - // Decide whether to use the ShellFolder class to populate shortcut - // panel and combobox. - JFileChooser fc = getFileChooser(); - Boolean prop = - (Boolean)fc.getClientProperty("FileChooser.useShellFolder"); - if (prop != null) { - useShellFolder = prop.booleanValue(); - } else { - useShellFolder = fc.getFileSystemView().equals(FileSystemView.getFileSystemView()); - } - } - - private String fileNameString(File file) { if (file == null) { return null; @@ -761,6 +739,8 @@ public class SynthFileChooserUIImpl extends SynthFileChooserUI { return; } + boolean useShellFolder = FilePane.usesShellFolder(chooser); + int oldSize = directories.size(); directories.clear(); if (oldSize > 0) { diff --git a/jdk/src/share/classes/sun/text/resources/FormatData_th.java b/jdk/src/share/classes/sun/text/resources/FormatData_th.java index 18e1da8ffbb..e1fe418f597 100644 --- a/jdk/src/share/classes/sun/text/resources/FormatData_th.java +++ b/jdk/src/share/classes/sun/text/resources/FormatData_th.java @@ -47,6 +47,19 @@ public class FormatData_th extends ListResourceBundle { * Overrides ListResourceBundle */ protected final Object[][] getContents() { + String[] dateTimePatterns = new String[] { + "H' \u0e19\u0e32\u0e2c\u0e34\u0e01\u0e32 'm' \u0e19\u0e32\u0e17\u0e35 'ss' \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35'", // full time pattern + "H' \u0e19\u0e32\u0e2c\u0e34\u0e01\u0e32 'm' \u0e19\u0e32\u0e17\u0e35'", // long time pattern + "H:mm:ss", // medium time pattern + "H:mm' \u0e19.'", // short time pattern (modified) -- add ' \u0e19.' + // (it means something like "o'clock" in english) + "EEEE'\u0e17\u0e35\u0e48 'd MMMM G yyyy", // full date pattern + "d MMMM yyyy", // long date pattern + "d MMM yyyy", // medium date pattern + "d/M/yyyy", // short date pattern + "{1}, {0}" // date-time pattern + }; + return new Object[][] { { "MonthNames", new String[] { @@ -129,18 +142,10 @@ public class FormatData_th extends ListResourceBundle { } }, { "sun.util.BuddhistCalendar.DateTimePatterns", - new String[] { - "H' \u0e19\u0e32\u0e2c\u0e34\u0e01\u0e32 'm' \u0e19\u0e32\u0e17\u0e35 'ss' \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35'", // full time pattern - "H' \u0e19\u0e32\u0e2c\u0e34\u0e01\u0e32 'm' \u0e19\u0e32\u0e17\u0e35'", // long time pattern - "H:mm:ss", // medium time pattern - "H:mm' \u0e19.'", // short time pattern (modified) -- add ' \u0e19.' - // (it means something like "o'clock" in english) - "EEEE'\u0e17\u0e35\u0e48 'd MMMM G yyyy", // full date pattern - "d MMMM yyyy", // long date pattern - "d MMM yyyy", // medium date pattern - "d/M/yyyy", // short date pattern - "{1}, {0}" // date-time pattern - } + dateTimePatterns + }, + { "DateTimePatterns", + dateTimePatterns }, { "DateTimePatternChars", "GanjkHmsSEDFwWxhKzZ" }, }; diff --git a/jdk/src/share/classes/sun/tools/jar/Main.java b/jdk/src/share/classes/sun/tools/jar/Main.java index 693866e1866..6d2a67810fe 100644 --- a/jdk/src/share/classes/sun/tools/jar/Main.java +++ b/jdk/src/share/classes/sun/tools/jar/Main.java @@ -74,7 +74,6 @@ class Main { static final String MANIFEST = JarFile.MANIFEST_NAME; static final String MANIFEST_DIR = "META-INF/"; static final String VERSION = "1.0"; - static final char SEPARATOR = File.separatorChar; static final String INDEX = JarIndex.INDEX_NAME; private static ResourceBundle rsrc; @@ -227,19 +226,32 @@ class Main { } tmpFile.delete(); } - } else if (xflag || tflag) { - InputStream in; + } else if (tflag) { + replaceFSC(files); if (fname != null) { - in = new FileInputStream(fname); + list(fname, files); } else { - in = new FileInputStream(FileDescriptor.in); + InputStream in = new FileInputStream(FileDescriptor.in); + try{ + list(new BufferedInputStream(in), files); + } finally { + in.close(); + } } - if (xflag) { - extract(new BufferedInputStream(in), files); + } else if (xflag) { + replaceFSC(files); + if (fname != null && files != null) { + extract(fname, files); } else { - list(new BufferedInputStream(in), files); + InputStream in = (fname == null) + ? new FileInputStream(FileDescriptor.in) + : new FileInputStream(fname); + try { + extract(new BufferedInputStream(in), files); + } finally { + in.close(); + } } - in.close(); } else if (iflag) { genIndex(rootjar, files); } @@ -760,6 +772,31 @@ class Main { e.setCrc(crc32.getValue()); } + void replaceFSC(String files[]) { + if (files != null) { + for (String file : files) { + file = file.replace(File.separatorChar, '/'); + } + } + } + + Set newDirSet() { + return new HashSet() { + public boolean add(ZipEntry e) { + return ((e == null || useExtractionTime) ? false : super.add(e)); + }}; + } + + void updateLastModifiedTime(Set zes) throws IOException { + for (ZipEntry ze : zes) { + long lastModified = ze.getTime(); + if (lastModified != -1) { + File f = new File(ze.getName().replace('/', File.separatorChar)); + f.setLastModified(lastModified); + } + } + } + /* * Extracts specified entries from JAR file. */ @@ -768,19 +805,13 @@ class Main { ZipEntry e; // Set of all directory entries specified in archive. Disallows // null entries. Disallows all entries if using pre-6.0 behavior. - Set dirs = new HashSet() { - public boolean add(ZipEntry e) { - return ((e == null || useExtractionTime) ? false : super.add(e)); - }}; - + Set dirs = newDirSet(); while ((e = zis.getNextEntry()) != null) { if (files == null) { dirs.add(extractFile(zis, e)); - } else { String name = e.getName(); - for (int i = 0; i < files.length; i++) { - String file = files[i].replace(File.separatorChar, '/'); + for (String file : files) { if (name.startsWith(file)) { dirs.add(extractFile(zis, e)); break; @@ -793,13 +824,33 @@ class Main { // timestamps as given in the archive. We do this after extraction, // instead of during, because creating a file in a directory changes // that directory's timestamp. - for (ZipEntry dirEntry : dirs) { - long lastModified = dirEntry.getTime(); - if (lastModified != -1) { - File dir = new File(dirEntry.getName().replace('/', File.separatorChar)); - dir.setLastModified(lastModified); + updateLastModifiedTime(dirs); + } + + /* + * Extracts specified entries from JAR file, via ZipFile. + */ + void extract(String fname, String files[]) throws IOException { + ZipFile zf = new ZipFile(fname); + Set dirs = newDirSet(); + Enumeration zes = zf.entries(); + while (zes.hasMoreElements()) { + ZipEntry e = zes.nextElement(); + InputStream is; + if (files == null) { + dirs.add(extractFile(zf.getInputStream(e), e)); + } else { + String name = e.getName(); + for (String file : files) { + if (name.startsWith(file)) { + dirs.add(extractFile(zf.getInputStream(e), e)); + break; + } + } } } + zf.close(); + updateLastModifiedTime(dirs); } /* @@ -807,7 +858,7 @@ class Main { * the entry is for a directory which doesn't exist prior to this * invocation, returns that entry, otherwise returns null. */ - ZipEntry extractFile(ZipInputStream zis, ZipEntry e) throws IOException { + ZipEntry extractFile(InputStream is, ZipEntry e) throws IOException { ZipEntry rc = null; String name = e.getName(); File f = new File(e.getName().replace('/', File.separatorChar)); @@ -838,13 +889,19 @@ class Main { } } OutputStream os = new FileOutputStream(f); - byte[] b = new byte[512]; + byte[] b = new byte[8192]; int len; - while ((len = zis.read(b, 0, b.length)) != -1) { - os.write(b, 0, len); + try { + while ((len = is.read(b, 0, b.length)) != -1) { + os.write(b, 0, len); + } + } finally { + if (is instanceof ZipInputStream) + ((ZipInputStream)is).closeEntry(); + else + is.close(); + os.close(); } - zis.closeEntry(); - os.close(); if (vflag) { if (e.getMethod() == ZipEntry.DEFLATED) { output(formatMsg("out.inflated", name)); @@ -869,7 +926,6 @@ class Main { ZipInputStream zis = new ZipInputStream(in); ZipEntry e; while ((e = zis.getNextEntry()) != null) { - String name = e.getName(); /* * In the case of a compressed (deflated) entry, the entry size * is stored immediately following the entry data and cannot be @@ -877,20 +933,22 @@ class Main { * the entry first before printing out its attributes. */ zis.closeEntry(); - if (files == null) { - printEntry(e); - } else { - for (int i = 0; i < files.length; i++) { - String file = files[i].replace(File.separatorChar, '/'); - if (name.startsWith(file)) { - printEntry(e); - break; - } - } - } + printEntry(e, files); } } + /* + * Lists contents of JAR file, via ZipFile. + */ + void list(String fname, String files[]) throws IOException { + ZipFile zf = new ZipFile(fname); + Enumeration zes = zf.entries(); + while (zes.hasMoreElements()) { + printEntry(zes.nextElement(), files); + } + zf.close(); + } + /** * Output the class index table to the INDEX.LIST file of the * root jar file. @@ -974,13 +1032,29 @@ class Main { dumpIndex(rootjar, index); } + /* + * Prints entry information, if requested. + */ + void printEntry(ZipEntry e, String[] files) throws IOException { + if (files == null) { + printEntry(e); + } else { + String name = e.getName(); + for (String file : files) { + if (name.startsWith(file)) { + printEntry(e); + return; + } + } + } + } /* * Prints entry information. */ void printEntry(ZipEntry e) throws IOException { if (vflag) { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); String s = Long.toString(e.getSize()); for (int i = 6 - s.length(); i > 0; --i) { sb.append(' '); diff --git a/jdk/src/share/classes/sun/util/resources/LocaleNames.properties b/jdk/src/share/classes/sun/util/resources/LocaleNames.properties index 15466144bf9..440f21534b5 100644 --- a/jdk/src/share/classes/sun/util/resources/LocaleNames.properties +++ b/jdk/src/share/classes/sun/util/resources/LocaleNames.properties @@ -257,6 +257,7 @@ BG=Bulgaria BH=Bahrain BI=Burundi BJ=Benin +BL=Saint Barth\u00e9lemy BM=Bermuda BN=Brunei BO=Bolivia @@ -370,6 +371,7 @@ MA=Morocco MC=Monaco MD=Moldova ME=Montenegro +MF=Saint Martin MG=Madagascar MH=Marshall Islands MK=Macedonia diff --git a/jdk/src/share/classes/sun/util/resources/TimeZoneNames.java b/jdk/src/share/classes/sun/util/resources/TimeZoneNames.java index aae4dd35ea2..7b820ecd7c7 100644 --- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames.java +++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames.java @@ -141,6 +141,8 @@ public final class TimeZoneNames extends TimeZoneNamesBundle { "Malaysia Summer Time", "MYST"}; String NORONHA[] = new String[] {"Fernando de Noronha Time", "FNT", "Fernando de Noronha Summer Time", "FNST"}; + String NPT[] = new String[] {"Nepal Time", "NPT", + "Nepal Summer Time", "NPST"}; String NST[] = new String[] {"Newfoundland Standard Time", "NST", "Newfoundland Daylight Time", "NDT"}; String NZST[] = new String[] {"New Zealand Standard Time", "NZST", @@ -151,6 +153,8 @@ public final class TimeZoneNames extends TimeZoneNamesBundle { "Pakistan Summer Time", "PKST"}; String PST[] = new String[] {"Pacific Standard Time", "PST", "Pacific Daylight Time", "PDT"}; + String RST[] = new String[] {"Eastern Standard Time", "EST", + "Central Daylight Time", "CDT"}; String SAST[] = new String[] {"South Africa Standard Time", "SAST", "South Africa Summer Time", "SAST"}; String SBT[] = new String[] {"Solomon Is. Time", "SBT", @@ -290,6 +294,7 @@ public final class TimeZoneNames extends TimeZoneNamesBundle { {"America/Argentina/La_Rioja", AGT}, {"America/Argentina/Mendoza", AGT}, {"America/Argentina/Rio_Gallegos", AGT}, + {"America/Argentina/Salta", AGT}, {"America/Argentina/San_Juan", AGT}, {"America/Argentina/San_Luis", AGT}, {"America/Argentina/Tucuman", AGT}, @@ -407,7 +412,7 @@ public final class TimeZoneNames extends TimeZoneNamesBundle { {"America/Rankin_Inlet", CST}, {"America/Recife", BRT}, {"America/Regina", CST}, - {"America/Resolute", EST}, + {"America/Resolute", RST}, {"America/Rio_Branco", AMT}, {"America/Rosario", AGT}, {"America/Santarem", BRT}, @@ -505,8 +510,8 @@ public final class TimeZoneNames extends TimeZoneNamesBundle { "Petropavlovsk-Kamchatski Summer Time", "PETST"}}, {"Asia/Karachi", PKT}, {"Asia/Kashgar", CTT}, - {"Asia/Katmandu", new String[] {"Nepal Time", "NPT", - "Nepal Summer Time", "NPST"}}, + {"Asia/Kathmandu", NPT}, + {"Asia/Katmandu", NPT}, {"Asia/Kolkata", IST}, {"Asia/Krasnoyarsk", new String[] {"Krasnoyarsk Time", "KRAT", "Krasnoyarsk Summer Time", "KRAST"}}, diff --git a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_de.java b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_de.java index cdcb454601a..f8bd8ba84fa 100644 --- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_de.java +++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_de.java @@ -141,6 +141,8 @@ public final class TimeZoneNames_de extends TimeZoneNamesBundle { "Malaysische Sommerzeit", "MYST"}; String NORONHA[] = new String[] {"Fernando de Noronha Zeit", "FNT", "Fernando de Noronha Sommerzeit", "FNST"}; + String NPT[] = new String[] {"Nepalesische Zeit", "NPT", + "Nepalesische Sommerzeit", "NPST"}; String NST[] = new String[] {"Neufundland Normalzeit", "NST", "Neufundland Sommerzeit", "NDT"}; String NZST[] = new String[] {"Neuseeland Normalzeit", "NZST", @@ -151,6 +153,8 @@ public final class TimeZoneNames_de extends TimeZoneNamesBundle { "Pakistanische Sommerzeit", "PKST"}; String PST[] = new String[] {"Pazifische Normalzeit", "PST", "Pazifische Sommerzeit", "PDT"}; + String RST[] = new String[] {"\u00d6stliche Normalzeit", "EST", + "Zentrale Sommerzeit", "CDT"}; String SAST[] = new String[] {"S\u00fcdafrikanische Normalzeit", "SAST", "S\u00fcdafrikanische Sommerzeit", "SAST"}; String SBT[] = new String[] {"Salomoninseln Zeit", "SBT", @@ -290,6 +294,7 @@ public final class TimeZoneNames_de extends TimeZoneNamesBundle { {"America/Argentina/La_Rioja", AGT}, {"America/Argentina/Mendoza", AGT}, {"America/Argentina/Rio_Gallegos", AGT}, + {"America/Argentina/Salta", AGT}, {"America/Argentina/San_Juan", AGT}, {"America/Argentina/San_Luis", AGT}, {"America/Argentina/Tucuman", AGT}, @@ -407,7 +412,7 @@ public final class TimeZoneNames_de extends TimeZoneNamesBundle { {"America/Rankin_Inlet", CST}, {"America/Recife", BRT}, {"America/Regina", CST}, - {"America/Resolute", EST}, + {"America/Resolute", RST}, {"America/Rio_Branco", AMT}, {"America/Rosario", AGT}, {"America/Santarem", BRT}, @@ -505,8 +510,8 @@ public final class TimeZoneNames_de extends TimeZoneNamesBundle { "Petropawlowsk-Kamtschatkische Sommerzeit", "PETST"}}, {"Asia/Karachi", PKT}, {"Asia/Kashgar", CTT}, - {"Asia/Katmandu", new String[] {"Nepalesische Zeit", "NPT", - "Nepalesische Sommerzeit", "NPST"}}, + {"Asia/Kathmandu", NPT}, + {"Asia/Katmandu", NPT}, {"Asia/Kolkata", IST}, {"Asia/Krasnoyarsk", new String[] {"Krasnojarsker Zeit", "KRAT", "Krasnojarsker Sommerzeit", "KRAST"}}, diff --git a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_es.java b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_es.java index 557ea90c8d0..54651d69226 100644 --- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_es.java +++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_es.java @@ -141,6 +141,8 @@ public final class TimeZoneNames_es extends TimeZoneNamesBundle { "Hora de verano de Malasia", "MYST"}; String NORONHA[] = new String[] {"Hora de Fernando de Noronha", "FNT", "Hora de verano de Fernando de Noronha", "FNST"}; + String NPT[] = new String[] {"Hora de Nepal", "NPT", + "Hora de verano de Nepal", "NPST"}; String NST[] = new String[] {"Hora est\u00e1ndar de Terranova", "NST", "Hora de verano de Terranova", "NDT"}; String NZST[] = new String[] {"Hora est\u00e1ndar de Nueva Zelanda", "NZST", @@ -151,6 +153,8 @@ public final class TimeZoneNames_es extends TimeZoneNamesBundle { "Hora de verano de Pakist\u00e1n", "PKST"}; String PST[] = new String[] {"Hora est\u00e1ndar del Pac\u00edfico", "PST", "Hora de verano del Pac\u00edfico", "PDT"}; + String RST[] = new String[] {"Hora est\u00e1ndar Oriental", "EST", + "Hora de verano Central", "CDT"}; String SAST[] = new String[] {"Hora est\u00e1ndar de Sud\u00e1frica", "SAST", "Hora de verano de Sud\u00e1frica", "SAST"}; String SBT[] = new String[] {"Hora de las Islas Solomon", "SBT", @@ -290,6 +294,7 @@ public final class TimeZoneNames_es extends TimeZoneNamesBundle { {"America/Argentina/La_Rioja", AGT}, {"America/Argentina/Mendoza", AGT}, {"America/Argentina/Rio_Gallegos", AGT}, + {"America/Argentina/Salta", AGT}, {"America/Argentina/San_Juan", AGT}, {"America/Argentina/San_Luis", AGT}, {"America/Argentina/Tucuman", AGT}, @@ -407,7 +412,7 @@ public final class TimeZoneNames_es extends TimeZoneNamesBundle { {"America/Rankin_Inlet", CST}, {"America/Recife", BRT}, {"America/Regina", CST}, - {"America/Resolute", EST}, + {"America/Resolute", RST}, {"America/Rio_Branco", AMT}, {"America/Rosario", AGT}, {"America/Santarem", BRT}, @@ -505,8 +510,8 @@ public final class TimeZoneNames_es extends TimeZoneNamesBundle { "Hora de verano de Petropavlovsk-Kamchatski", "PETST"}}, {"Asia/Karachi", PKT}, {"Asia/Kashgar", CTT}, - {"Asia/Katmandu", new String[] {"Hora de Nepal", "NPT", - "Hora de verano de Nepal", "NPST"}}, + {"Asia/Kathmandu", NPT}, + {"Asia/Katmandu", NPT}, {"Asia/Kolkata", IST}, {"Asia/Krasnoyarsk", new String[] {"Hora de Krasnoyarsk", "KRAT", "Hora de verano de Krasnoyarsk", "KRAST"}}, diff --git a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_fr.java b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_fr.java index ec537df4671..0a91a783058 100644 --- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_fr.java +++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_fr.java @@ -141,6 +141,8 @@ public final class TimeZoneNames_fr extends TimeZoneNamesBundle { "Heure d'\u00e9t\u00e9 de Malaisie", "MYST"}; String NORONHA[] = new String[] {"Heure de Fernando de Noronha", "FNT", "Heure d'\u00e9t\u00e9 de Fernando de Noronha", "FNST"}; + String NPT[] = new String[] {"Heure du N\u00e9pal", "NPT", + "Heure d'\u00e9t\u00e9 du N\u00e9pal", "NPST"}; String NST[] = new String[] {"Heure normale de Terre-Neuve", "NST", "Heure avanc\u00e9e de Terre-Neuve", "NDT"} ; String NZST[] = new String[] {"Heure normale de Nouvelle-Z\u00e9lande", "NZST", @@ -151,6 +153,8 @@ public final class TimeZoneNames_fr extends TimeZoneNamesBundle { "Heure d'\u00e9t\u00e9 du Pakistan", "PKST"} ; String PST[] = new String[] {"Heure normale du Pacifique", "PST", "Heure avanc\u00e9e du Pacifique", "PDT"} ; + String RST[] = new String[] {"Heure normale de l'Est", "EST", + "Heure avanc\u00e9e du Centre", "CDT"} ; String SAST[] = new String[] {"Heure normale d'Afrique du Sud", "SAST", "Heure d'\u00e9t\u00e9 d'Afrique du Sud", "SAST"} ; String SBT[] = new String[] {"Heure des \u00celes Salomon", "SBT", @@ -290,6 +294,7 @@ public final class TimeZoneNames_fr extends TimeZoneNamesBundle { {"America/Argentina/La_Rioja", AGT}, {"America/Argentina/Mendoza", AGT}, {"America/Argentina/Rio_Gallegos", AGT}, + {"America/Argentina/Salta", AGT}, {"America/Argentina/San_Juan", AGT}, {"America/Argentina/San_Luis", AGT}, {"America/Argentina/Tucuman", AGT}, @@ -407,7 +412,7 @@ public final class TimeZoneNames_fr extends TimeZoneNamesBundle { {"America/Rankin_Inlet", CST}, {"America/Recife", BRT}, {"America/Regina", CST}, - {"America/Resolute", EST}, + {"America/Resolute", RST}, {"America/Rio_Branco", AMT}, {"America/Rosario", AGT}, {"America/Santarem", BRT}, @@ -505,8 +510,8 @@ public final class TimeZoneNames_fr extends TimeZoneNamesBundle { "Heure d'\u00e9t\u00e9 de Petropavlovsk-Kamchatski", "PETST"}}, {"Asia/Karachi", PKT}, {"Asia/Kashgar", CTT}, - {"Asia/Katmandu", new String[] {"Heure du N\u00e9pal", "NPT", - "Heure d'\u00e9t\u00e9 du N\u00e9pal", "NPST"}}, + {"Asia/Kathmandu", NPT}, + {"Asia/Katmandu", NPT}, {"Asia/Kolkata", IST}, {"Asia/Krasnoyarsk", new String[] {"Heure de Krasno\u00efarsk", "KRAT", "Heure d'\u00e9t\u00e9 de Krasno\u00efarsk", "KRAST"}}, diff --git a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_it.java b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_it.java index 4c7d79a8a7c..197dd5e8729 100644 --- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_it.java +++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_it.java @@ -141,6 +141,8 @@ public final class TimeZoneNames_it extends TimeZoneNamesBundle { "Ora estiva della Malaysia", "MYST"}; String NORONHA[] = new String[] {"Ora di Fernando de Noronha", "FNT", "Ora estiva di Fernando de Noronha", "FNST"}; + String NPT[] = new String[] {"Ora del Nepal", "NPT", + "Ora estiva del Nepal", "NPST"}; String NST[] = new String[] {"Ora solare di Terranova", "NST", "Ora legale di Terranova", "NDT"}; String NZST[] = new String[] {"Ora solare della Nuova Zelanda", "NZST", @@ -151,6 +153,8 @@ public final class TimeZoneNames_it extends TimeZoneNamesBundle { "Ora estiva del Pakistan", "PKST"}; String PST[] = new String[] {"Ora solare della costa occidentale USA", "PST", "Ora legale della costa occidentale USA", "PDT"}; + String RST[] = new String[] {"Ora solare USA orientale", "EST", + "Ora legale USA centrale", "CDT"}; String SAST[] = new String[] {"Ora solare del Sudafrica", "SAST", "Ora estiva del Sudafrica", "SAST"}; String SBT[] = new String[] {"Ora delle Isole Salomone", "SBT", @@ -290,6 +294,7 @@ public final class TimeZoneNames_it extends TimeZoneNamesBundle { {"America/Argentina/La_Rioja", AGT}, {"America/Argentina/Mendoza", AGT}, {"America/Argentina/Rio_Gallegos", AGT}, + {"America/Argentina/Salta", AGT}, {"America/Argentina/San_Juan", AGT}, {"America/Argentina/San_Luis", AGT}, {"America/Argentina/Tucuman", AGT}, @@ -407,7 +412,7 @@ public final class TimeZoneNames_it extends TimeZoneNamesBundle { {"America/Rankin_Inlet", CST}, {"America/Recife", BRT}, {"America/Regina", CST}, - {"America/Resolute", EST}, + {"America/Resolute", RST}, {"America/Rio_Branco", AMT}, {"America/Rosario", AGT}, {"America/Santarem", BRT}, @@ -505,8 +510,8 @@ public final class TimeZoneNames_it extends TimeZoneNamesBundle { "Ora estiva di Petropavlovsk-Kamchatski", "PETST"}}, {"Asia/Karachi", PKT}, {"Asia/Kashgar", CTT}, - {"Asia/Katmandu", new String[] {"Ora del Nepal", "NPT", - "Ora estiva del Nepal", "NPST"}}, + {"Asia/Kathmandu", NPT}, + {"Asia/Katmandu", NPT}, {"Asia/Kolkata", IST}, {"Asia/Krasnoyarsk", new String[] {"Ora di Krasnojarsk", "KRAT", "Ora estiva di Krasnojarsk", "KRAST"}}, diff --git a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_ja.java b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_ja.java index 2eb8063cbc7..3cf518acf41 100644 --- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_ja.java +++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_ja.java @@ -141,6 +141,8 @@ public final class TimeZoneNames_ja extends TimeZoneNamesBundle { "\u30de\u30ec\u30fc\u30b7\u30a2\u590f\u6642\u9593", "MYST"}; String NORONHA[] = new String[] {"\u30d5\u30a7\u30eb\u30ca\u30f3\u30c9\u30fb\u30c7\u30fb\u30ce\u30ed\u30fc\u30cb\u30e3\u6642\u9593", "FNT", "\u30d5\u30a7\u30eb\u30ca\u30f3\u30c9\u30fb\u30c7\u30fb\u30ce\u30ed\u30fc\u30cb\u30e3\u590f\u6642\u9593", "FNST"}; + String NPT[] = new String[] {"\u30cd\u30d1\u30fc\u30eb\u6642\u9593", "NPT", + "\u30cd\u30d1\u30fc\u30eb\u590f\u6642\u9593", "NPST"}; String NST[] = new String[] {"\u30cb\u30e5\u30fc\u30d5\u30a1\u30f3\u30c9\u30e9\u30f3\u30c9\u6a19\u6e96\u6642", "NST", "\u30cb\u30e5\u30fc\u30d5\u30a1\u30f3\u30c9\u30e9\u30f3\u30c9\u590f\u6642\u9593", "NDT"}; String NZST[] = new String[] {"\u30cb\u30e5\u30fc\u30b8\u30fc\u30e9\u30f3\u30c9\u6a19\u6e96\u6642", "NZST", @@ -151,6 +153,8 @@ public final class TimeZoneNames_ja extends TimeZoneNamesBundle { "\u30d1\u30ad\u30b9\u30bf\u30f3\u590f\u6642\u9593", "PKST"}; String PST[] = new String[] {"\u592a\u5e73\u6d0b\u6a19\u6e96\u6642", "PST", "\u592a\u5e73\u6d0b\u590f\u6642\u9593", "PDT"}; + String RST[] = new String[] {"\u6771\u90e8\u6a19\u6e96\u6642", "EST", + "\u4e2d\u90e8\u590f\u6642\u9593", "CDT"}; String SAST[] = new String[] {"\u5357\u30a2\u30d5\u30ea\u30ab\u6a19\u6e96\u6642", "SAST", "\u5357\u30a2\u30d5\u30ea\u30ab\u590f\u6642\u9593", "SAST"}; String SBT[] = new String[] {"\u30bd\u30ed\u30e2\u30f3\u8af8\u5cf6\u6642\u9593", "SBT", @@ -290,6 +294,7 @@ public final class TimeZoneNames_ja extends TimeZoneNamesBundle { {"America/Argentina/La_Rioja", AGT}, {"America/Argentina/Mendoza", AGT}, {"America/Argentina/Rio_Gallegos", AGT}, + {"America/Argentina/Salta", AGT}, {"America/Argentina/San_Juan", AGT}, {"America/Argentina/San_Luis", AGT}, {"America/Argentina/Tucuman", AGT}, @@ -407,7 +412,7 @@ public final class TimeZoneNames_ja extends TimeZoneNamesBundle { {"America/Rankin_Inlet", CST}, {"America/Recife", BRT}, {"America/Regina", CST}, - {"America/Resolute", EST}, + {"America/Resolute", RST}, {"America/Rio_Branco", AMT}, {"America/Rosario", AGT}, {"America/Santarem", BRT}, @@ -505,8 +510,8 @@ public final class TimeZoneNames_ja extends TimeZoneNamesBundle { "\u30da\u30c8\u30ed\u30d1\u30d6\u30ed\u30d5\u30b9\u30af\u30ab\u30e0\u30c1\u30e3\u30c4\u30ad\u30fc\u590f\u6642\u9593", "PETST"}}, {"Asia/Karachi", PKT}, {"Asia/Kashgar", CTT}, - {"Asia/Katmandu", new String[] {"\u30cd\u30d1\u30fc\u30eb\u6642\u9593", "NPT", - "\u30cd\u30d1\u30fc\u30eb\u590f\u6642\u9593", "NPST"}}, + {"Asia/Kathmandu", NPT}, + {"Asia/Katmandu", NPT}, {"Asia/Kolkata", IST}, {"Asia/Krasnoyarsk", new String[] {"\u30af\u30e9\u30b9\u30ce\u30e4\u30eb\u30b9\u30af\u6642\u9593", "KRAT", "\u30af\u30e9\u30b9\u30ce\u30e4\u30eb\u30b9\u30af\u590f\u6642\u9593", "KRAST"}}, diff --git a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_ko.java b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_ko.java index 81a23dd01e2..d03e1504491 100644 --- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_ko.java +++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_ko.java @@ -141,6 +141,8 @@ public final class TimeZoneNames_ko extends TimeZoneNamesBundle { "\ub9d0\ub808\uc774\uc2dc\uc544 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "MYST"}; String NORONHA[] = new String[] {"Fernando de Noronha \uc2dc\uac04", "FNT", "Fernando de Noronha \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "FNST"}; + String NPT[] = new String[] {"\ub124\ud314 \uc2dc\uac04", "NPT", + "\ub124\ud314 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "NPST"}; String NST[] = new String[] {"\ub274\ud380\ub4e4\ub79c\ub4dc \ud45c\uc900\uc2dc", "NST", "\ub274\ud380\ub4e4\ub79c\ub4dc \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "NDT"}; String NZST[] = new String[] {"\ub274\uc9c8\ub79c\ub4dc \ud45c\uc900\uc2dc", "NZST", @@ -151,6 +153,8 @@ public final class TimeZoneNames_ko extends TimeZoneNamesBundle { "\ud30c\ud0a4\uc2a4\ud0c4 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "PKST"}; String PST[] = new String[] {"\ud0dc\ud3c9\uc591 \ud45c\uc900\uc2dc", "PST", "\ud0dc\ud3c9\uc591 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "PDT"}; + String RST[] = new String[] {"\ub3d9\ubd80 \ud45c\uc900\uc2dc", "EST", + "\uc911\ubd80 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "CDT"}; String SAST[] = new String[] {"\ub0a8\uc544\ud504\ub9ac\uce74 \ud45c\uc900\uc2dc", "SAST", "\ub0a8\uc544\ud504\ub9ac\uce74 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "SAST"}; String SBT[] = new String[] {"\uc194\ub85c\ubaac \uad70\ub3c4 \uc2dc\uac04", "SBT", @@ -290,6 +294,7 @@ public final class TimeZoneNames_ko extends TimeZoneNamesBundle { {"America/Argentina/La_Rioja", AGT}, {"America/Argentina/Mendoza", AGT}, {"America/Argentina/Rio_Gallegos", AGT}, + {"America/Argentina/Salta", AGT}, {"America/Argentina/San_Juan", AGT}, {"America/Argentina/San_Luis", AGT}, {"America/Argentina/Tucuman", AGT}, @@ -407,7 +412,7 @@ public final class TimeZoneNames_ko extends TimeZoneNamesBundle { {"America/Rankin_Inlet", CST}, {"America/Recife", BRT}, {"America/Regina", CST}, - {"America/Resolute", EST}, + {"America/Resolute", RST}, {"America/Rio_Branco", AMT}, {"America/Rosario", AGT}, {"America/Santarem", BRT}, @@ -505,8 +510,8 @@ public final class TimeZoneNames_ko extends TimeZoneNamesBundle { "\ud398\ud2b8\ub85c\ud30c\ube14\ub85c\ud504\uc2a4\ud06c-\uce84\ucc28\uce20\ud0a4 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "PETST"}}, {"Asia/Karachi", PKT}, {"Asia/Kashgar", CTT}, - {"Asia/Katmandu", new String[] {"\ub124\ud314 \uc2dc\uac04", "NPT", - "\ub124\ud314 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "NPST"}}, + {"Asia/Kathmandu", NPT}, + {"Asia/Katmandu", NPT}, {"Asia/Kolkata", IST}, {"Asia/Krasnoyarsk", new String[] {"\ud06c\ub77c\uc2a4\ub178\uc57c\ub974\uc2a4\ud06c \uc2dc\uac04", "KRAT", "\ud06c\ub77c\uc2a4\ub178\uc57c\ub974\uc2a4\ud06c \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "KRAST"}}, diff --git a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_sv.java b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_sv.java index e56a8dbff30..2ede6f80801 100644 --- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_sv.java +++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_sv.java @@ -141,6 +141,8 @@ public final class TimeZoneNames_sv extends TimeZoneNamesBundle { "Malaysia, sommartid", "MYST"}; String NORONHA[] = new String[] {"Fernando de Noronha, normaltid", "FNT", "Fernando de Noronha, sommartid", "FNST"}; + String NPT[] = new String[] {"Nepal, normaltid", "NPT", + "Nepal, sommartid", "NPST"}; String NST[] = new String[] {"Newfoundland, normaltid", "NST", "Newfoundland, sommartid", "NDT"}; String NZST[] = new String[] {"Nya Zeeland, normaltid", "NZST", @@ -151,6 +153,8 @@ public final class TimeZoneNames_sv extends TimeZoneNamesBundle { "Pakistan, sommartid", "PKST"}; String PST[] = new String[] {"Stilla havet, normaltid", "PST", "Stilla havet, sommartid", "PDT"}; + String RST[] = new String[] {"Eastern, normaltid", "EST", + "Central sommartid", "CDT"}; String SAST[] = new String[] {"Sydafrika, normaltid", "SAST", "Sydafrika, sommartid", "SAST"}; String SBT[] = new String[] {"Salomon\u00f6arna, normaltid", "SBT", @@ -290,6 +294,7 @@ public final class TimeZoneNames_sv extends TimeZoneNamesBundle { {"America/Argentina/La_Rioja", AGT}, {"America/Argentina/Mendoza", AGT}, {"America/Argentina/Rio_Gallegos", AGT}, + {"America/Argentina/Salta", AGT}, {"America/Argentina/San_Juan", AGT}, {"America/Argentina/San_Luis", AGT}, {"America/Argentina/Tucuman", AGT}, @@ -407,7 +412,7 @@ public final class TimeZoneNames_sv extends TimeZoneNamesBundle { {"America/Rankin_Inlet", CST}, {"America/Recife", BRT}, {"America/Regina", CST}, - {"America/Resolute", EST}, + {"America/Resolute", RST}, {"America/Rio_Branco", AMT}, {"America/Rosario", AGT}, {"America/Santarem", BRT}, @@ -505,8 +510,8 @@ public final class TimeZoneNames_sv extends TimeZoneNamesBundle { "Petropavlovsk-Kamtjatka, sommartid", "PETST"}}, {"Asia/Karachi", PKT}, {"Asia/Kashgar", CTT}, - {"Asia/Katmandu", new String[] {"Nepal, normaltid", "NPT", - "Nepal, sommartid", "NPST"}}, + {"Asia/Kathmandu", NPT}, + {"Asia/Katmandu", NPT}, {"Asia/Kolkata", IST}, {"Asia/Krasnoyarsk", new String[] {"Krasnojarsk, normaltid", "KRAT", "Krasnojarsk, sommartid", "KRAST"}}, diff --git a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_CN.java b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_CN.java index 41fec630ecd..121492ce4ab 100644 --- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_CN.java +++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_CN.java @@ -141,6 +141,8 @@ public final class TimeZoneNames_zh_CN extends TimeZoneNamesBundle { "\u9a6c\u6765\u897f\u4e9a\u590f\u4ee4\u65f6", "MYST"}; String NORONHA[] = new String[] {"\u8d39\u5c14\u5357\u591a\u5fb7\u8bfa\u7f57\u5c3c\u4e9a\u65f6\u95f4", "FNT", "\u8d39\u5c14\u5357\u591a\u5fb7\u8bfa\u7f57\u5c3c\u4e9a\u590f\u4ee4\u65f6", "FNST"}; + String NPT[] = new String[] {"\u5c3c\u6cca\u5c14\u65f6\u95f4", "NPT", + "\u5c3c\u6cca\u5c14\u590f\u4ee4\u65f6", "NPST"}; String NST[] = new String[] {"\u7ebd\u82ac\u5170\u6807\u51c6\u65f6\u95f4", "NST", "\u7ebd\u82ac\u5170\u590f\u4ee4\u65f6", "NDT"}; String NZST[] = new String[] {"\u65b0\u897f\u5170\u6807\u51c6\u65f6\u95f4", "NZST", @@ -151,6 +153,8 @@ public final class TimeZoneNames_zh_CN extends TimeZoneNamesBundle { "\u5df4\u57fa\u65af\u5766\u590f\u4ee4\u65f6", "PKST"}; String PST[] = new String[] {"\u592a\u5e73\u6d0b\u6807\u51c6\u65f6\u95f4", "PST", "\u592a\u5e73\u6d0b\u590f\u4ee4\u65f6", "PDT"}; + String RST[] = new String[] {"\u4e1c\u90e8\u6807\u51c6\u65f6\u95f4", "EST", + "\u4e2d\u592e\u590f\u4ee4\u65f6", "CDT"}; String SAST[] = new String[] {"\u5357\u975e\u6807\u51c6\u65f6\u95f4", "SAST", "\u5357\u975e\u590f\u4ee4\u65f6", "SAST"}; String SBT[] = new String[] {"\u6240\u7f57\u95e8\u7fa4\u5c9b\u65f6\u95f4", "SBT", @@ -290,6 +294,7 @@ public final class TimeZoneNames_zh_CN extends TimeZoneNamesBundle { {"America/Argentina/La_Rioja", AGT}, {"America/Argentina/Mendoza", AGT}, {"America/Argentina/Rio_Gallegos", AGT}, + {"America/Argentina/Salta", AGT}, {"America/Argentina/San_Juan", AGT}, {"America/Argentina/San_Luis", AGT}, {"America/Argentina/Tucuman", AGT}, @@ -407,7 +412,7 @@ public final class TimeZoneNames_zh_CN extends TimeZoneNamesBundle { {"America/Rankin_Inlet", CST}, {"America/Recife", BRT}, {"America/Regina", CST}, - {"America/Resolute", EST}, + {"America/Resolute", RST}, {"America/Rio_Branco", AMT}, {"America/Rosario", AGT}, {"America/Santarem", BRT}, @@ -505,8 +510,8 @@ public final class TimeZoneNames_zh_CN extends TimeZoneNamesBundle { "\u5f7c\u5f97\u7f57\u5df4\u752b\u6d1b\u592b\u65af\u514b\u590f\u4ee4\u65f6", "PETST"}}, {"Asia/Karachi", PKT}, {"Asia/Kashgar", CTT}, - {"Asia/Katmandu", new String[] {"\u5c3c\u6cca\u5c14\u65f6\u95f4", "NPT", - "\u5c3c\u6cca\u5c14\u590f\u4ee4\u65f6", "NPST"}}, + {"Asia/Kathmandu", NPT}, + {"Asia/Katmandu", NPT}, {"Asia/Kolkata", IST}, {"Asia/Krasnoyarsk", new String[] {"\u514b\u62c9\u65af\u8bfa\u4e9a\u5c14\u65af\u514b\u65f6\u95f4", "KRAT", "\u514b\u62c9\u65af\u8bfa\u4e9a\u5c14\u65af\u514b\u590f\u4ee4\u65f6", "KRAST"}}, diff --git a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_TW.java b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_TW.java index 1bd6bf739d9..afd61097653 100644 --- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_TW.java +++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_TW.java @@ -141,6 +141,8 @@ public final class TimeZoneNames_zh_TW extends TimeZoneNamesBundle { "\u99ac\u4f86\u897f\u4e9e\u590f\u4ee4\u6642\u9593", "MYST"}; String NORONHA[] = new String[] {"\u8cbb\u723e\u5357\u591a-\u8fea\u8afe\u7f85\u5c3c\u4e9e\u6642\u9593", "FNT", "\u8cbb\u723e\u5357\u591a-\u8fea\u8afe\u7f85\u5c3c\u4e9e\u590f\u4ee4\u6642\u9593", "FNST"}; + String NPT[] = new String[] {"\u5c3c\u6cca\u723e\u6642\u9593", "NPT", + "\u5c3c\u6cca\u723e\u590f\u4ee4\u6642\u9593", "NPST"}; String NST[] = new String[] {"\u7d10\u82ac\u862d\u6a19\u6e96\u6642\u9593", "NST", "\u7d10\u82ac\u862d\u65e5\u5149\u7bc0\u7d04\u6642\u9593", "NDT"}; String NZST[] = new String[] {"\u7d10\u897f\u862d\u6a19\u6e96\u6642\u9593", "NZST", @@ -151,6 +153,8 @@ public final class TimeZoneNames_zh_TW extends TimeZoneNamesBundle { "\u5df4\u57fa\u65af\u5766\u590f\u4ee4\u6642\u9593", "PKST"}; String PST[] = new String[] {"\u592a\u5e73\u6d0b\u6a19\u6e96\u6642\u9593", "PST", "\u592a\u5e73\u6d0b\u65e5\u5149\u7bc0\u7d04\u6642\u9593", "PDT"}; + String RST[] = new String[] {"\u6771\u65b9\u6a19\u6e96\u6642\u9593", "EST", + "\u4e2d\u592e\u65e5\u5149\u7bc0\u7d04\u6642\u9593", "CDT"}; String SAST[] = new String[] {"\u5357\u975e\u6a19\u6e96\u6642\u9593", "SAST", "\u5357\u975e\u590f\u4ee4\u6642\u9593", "SAST"}; String SBT[] = new String[] {"\u6240\u7f85\u9580\u7fa4\u5cf6\u6642\u9593", "SBT", @@ -290,6 +294,7 @@ public final class TimeZoneNames_zh_TW extends TimeZoneNamesBundle { {"America/Argentina/La_Rioja", AGT}, {"America/Argentina/Mendoza", AGT}, {"America/Argentina/Rio_Gallegos", AGT}, + {"America/Argentina/Salta", AGT}, {"America/Argentina/San_Juan", AGT}, {"America/Argentina/San_Luis", AGT}, {"America/Argentina/Tucuman", AGT}, @@ -407,7 +412,7 @@ public final class TimeZoneNames_zh_TW extends TimeZoneNamesBundle { {"America/Rankin_Inlet", CST}, {"America/Recife", BRT}, {"America/Regina", CST}, - {"America/Resolute", EST}, + {"America/Resolute", RST}, {"America/Rio_Branco", AMT}, {"America/Rosario", AGT}, {"America/Santarem", BRT}, @@ -505,8 +510,8 @@ public final class TimeZoneNames_zh_TW extends TimeZoneNamesBundle { "Petropavlovsk-Kamchatski \u590f\u4ee4\u6642\u9593", "PETST"}}, {"Asia/Karachi", PKT}, {"Asia/Kashgar", CTT}, - {"Asia/Katmandu", new String[] {"\u5c3c\u6cca\u723e\u6642\u9593", "NPT", - "\u5c3c\u6cca\u723e\u590f\u4ee4\u6642\u9593", "NPST"}}, + {"Asia/Kathmandu", NPT}, + {"Asia/Katmandu", NPT}, {"Asia/Kolkata", IST}, {"Asia/Krasnoyarsk", new String[] {"\u514b\u62c9\u65af\u8afe\u4e9e\u723e\u65af\u514b\u6642\u9593", "KRAT", "\u514b\u62c9\u65af\u8afe\u4e9e\u723e\u65af\u514b\u590f\u4ee4\u6642\u9593", "KRAST"}}, diff --git a/jdk/src/share/lib/audio/soundbank.gm b/jdk/src/share/lib/audio/soundbank.gm deleted file mode 100644 index 83c2f878d80..00000000000 Binary files a/jdk/src/share/lib/audio/soundbank.gm and /dev/null differ diff --git a/jdk/src/solaris/classes/sun/awt/X11/WindowDimensions.java b/jdk/src/solaris/classes/sun/awt/X11/WindowDimensions.java index 08511f9e67a..70447fee3ef 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/WindowDimensions.java +++ b/jdk/src/solaris/classes/sun/awt/X11/WindowDimensions.java @@ -32,10 +32,18 @@ class WindowDimensions { private Insets insets; private boolean isClientSizeSet; + /** + * If isClient is true, the bounds represent the client window area. + * Otherwise, they represent the entire window area, with the insets included + */ public WindowDimensions(int x, int y, int width, int height, boolean isClient) { this(new Rectangle(x, y, width, height), null, isClient); } + /** + * If isClient is true, the bounds represent the client window area. + * Otherwise, they represent the entire window area, with the insets included + */ public WindowDimensions(Rectangle rec, Insets ins, boolean isClient) { if (rec == null) { throw new IllegalArgumentException("Client bounds can't be null"); @@ -46,10 +54,18 @@ class WindowDimensions { setInsets(ins); } + /** + * If isClient is true, the bounds represent the client window area. + * Otherwise, they represent the entire window area, with the insets included + */ public WindowDimensions(Point loc, Dimension size, Insets in, boolean isClient) { this(new Rectangle(loc, size), in, isClient); } + /** + * If isClient is true, the bounds represent the client window area. + * Otherwise, they represent the entire window area, with the insets included + */ public WindowDimensions(Rectangle bounds, boolean isClient) { this(bounds, null, isClient); } diff --git a/jdk/src/solaris/classes/sun/awt/X11/XBaseWindow.java b/jdk/src/solaris/classes/sun/awt/X11/XBaseWindow.java index f853d506784..ace8b583077 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XBaseWindow.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XBaseWindow.java @@ -979,8 +979,13 @@ public class XBaseWindow { */ public void handleButtonPressRelease(XEvent xev) { XButtonEvent xbe = xev.get_xbutton(); - final int buttonState = xbe.get_state() & (XConstants.Button1Mask | XConstants.Button2Mask - | XConstants.Button3Mask | XConstants.Button4Mask | XConstants.Button5Mask); + int buttonState = 0; + for (int i = 0; i XToolkit.getNumMouseButtons()) { + return buttonState == 0; + } else { + return buttonState == XConstants.buttonsMask[button - 1]; } - return buttonState == 0; } static boolean isGrabbedEvent(XEvent ev, XBaseWindow target) { diff --git a/jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java b/jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java index 651d10a2905..8a14cfe5f0f 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XComponentPeer.java @@ -1534,13 +1534,23 @@ public class XComponentPeer extends XWindow implements ComponentPeer, DropTarget } XToolkit.awtLock(); try { - XlibWrapper.SetRectangularShape( - XToolkit.getDisplay(), - getWindow(), - shape.getLoX(), shape.getLoY(), - shape.getHiX(), shape.getHiY(), - (shape.isRectangular() ? null : shape) - ); + if (shape != null) { + XlibWrapper.SetRectangularShape( + XToolkit.getDisplay(), + getWindow(), + shape.getLoX(), shape.getLoY(), + shape.getHiX(), shape.getHiY(), + (shape.isRectangular() ? null : shape) + ); + } else { + XlibWrapper.SetRectangularShape( + XToolkit.getDisplay(), + getWindow(), + 0, 0, + 0, 0, + null + ); + } } finally { XToolkit.awtUnlock(); } diff --git a/jdk/src/solaris/classes/sun/awt/X11/XConstants.java b/jdk/src/solaris/classes/sun/awt/X11/XConstants.java index e9de6804bea..7d9077ee6a9 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XConstants.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XConstants.java @@ -197,12 +197,30 @@ final public class XConstants { /* button masks. Used in same manner as Key masks above. Not to be confused with button names below. */ - - public static final int Button1Mask = (1<<8) ; - public static final int Button2Mask = (1<<9) ; - public static final int Button3Mask = (1<<10) ; - public static final int Button4Mask = (1<<11) ; - public static final int Button5Mask = (1<<12) ; + public static final int [] buttonsMask = new int []{ 1<<8, + 1<<9, + 1<<10, + 1<<11, + 1<<12, + 1<<13, + 1<<14, + 1<<15, + 1<<16, + 1<<17, + 1<<18, + 1<<19, + 1<<20, + 1<<21, + 1<<22, + 1<<23, + 1<<24, + 1<<25, + 1<<26, + 1<<27, + 1<<28, + 1<<29, + 1<<30, + 1<<31 }; public static final int AnyModifier = (1<<15) ; /* used in GrabButton, GrabKey */ @@ -211,11 +229,7 @@ final public class XConstants { and ButtonRelease events. Not to be confused with button masks above. Note that 0 is already defined above as "AnyButton". */ - public static final int Button1 = 1 ; - public static final int Button2 = 2 ; - public static final int Button3 = 3 ; - public static final int Button4 = 4 ; - public static final int Button5 = 5 ; + public static final int buttons [] = new int [] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24}; /* Notify modes */ diff --git a/jdk/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java b/jdk/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java index 5984db22493..42ccabee313 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java @@ -492,7 +492,14 @@ abstract class XDecoratedPeer extends XWindowPeer { // do nothing but accept it. Rectangle reqBounds = newDimensions.getBounds(); Rectangle newBounds = constrainBounds(reqBounds.x, reqBounds.y, reqBounds.width, reqBounds.height); - newDimensions = new WindowDimensions(newBounds, newDimensions.getInsets(), newDimensions.isClientSizeSet()); + Insets insets = newDimensions.getInsets(); + // Inherit isClientSizeSet from newDimensions + if (newDimensions.isClientSizeSet()) { + newBounds = new Rectangle(newBounds.x, newBounds.y, + newBounds.width - insets.left - insets.right, + newBounds.height - insets.top - insets.bottom); + } + newDimensions = new WindowDimensions(newBounds, insets, newDimensions.isClientSizeSet()); } XToolkit.awtLock(); try { diff --git a/jdk/src/solaris/classes/sun/awt/X11/XDragSourceContextPeer.java b/jdk/src/solaris/classes/sun/awt/X11/XDragSourceContextPeer.java index af3a3219cff..a079fdb2bab 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XDragSourceContextPeer.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XDragSourceContextPeer.java @@ -694,8 +694,8 @@ public final class XDragSourceContextPeer } finally { xmotion.dispose(); } - if (xbutton.get_button() == XConstants.Button1 - || xbutton.get_button() == XConstants.Button2) { + if (xbutton.get_button() == XConstants.buttons[0] + || xbutton.get_button() == XConstants.buttons[1]) { // drag is initiated with Button1 or Button2 pressed and // ended on release of either of these buttons (as the same // behavior was with our old Motif DnD-based implementation) diff --git a/jdk/src/solaris/classes/sun/awt/X11/XEmbedClientHelper.java b/jdk/src/solaris/classes/sun/awt/X11/XEmbedClientHelper.java index 139f375fa40..8be2390754c 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XEmbedClientHelper.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XEmbedClientHelper.java @@ -31,6 +31,9 @@ import sun.awt.SunToolkit; import java.awt.Component; import java.awt.Container; +import sun.awt.X11GraphicsConfig; +import sun.awt.X11GraphicsDevice; + /** * Helper class implementing XEmbed protocol handling routines(client side) * Window which wants to participate in a protocol should create an instance, @@ -39,20 +42,34 @@ import java.awt.Container; public class XEmbedClientHelper extends XEmbedHelper implements XEventDispatcher { private static final Logger xembedLog = Logger.getLogger("sun.awt.X11.xembed.XEmbedClientHelper"); - private XEmbeddedFramePeer embedded; + private XEmbeddedFramePeer embedded; // XEmbed client + private long server; // XEmbed server + private boolean active; - private long server; private boolean applicationActive; XEmbedClientHelper() { super(); } - void install(XEmbeddedFramePeer embedded) { - this.embedded = embedded; + void setClient(XEmbeddedFramePeer client) { + if (xembedLog.isLoggable(Level.FINE)) { + xembedLog.fine("XEmbed client: " + client); + } + if (embedded != null) { + XToolkit.removeEventDispatcher(embedded.getWindow(), this); + active = false; + } + embedded = client; + if (embedded != null) { + XToolkit.addEventDispatcher(embedded.getWindow(), this); + } + } - if (xembedLog.isLoggable(Level.FINE)) xembedLog.fine("Installing xembedder on " + embedded); - XToolkit.addEventDispatcher(embedded.getWindow(), this); + void install() { + if (xembedLog.isLoggable(Level.FINE)) { + xembedLog.fine("Installing xembedder on " + embedded); + } long[] info = new long[] { XEMBED_VERSION, XEMBED_MAPPED }; long data = Native.card32ToData(info); try { @@ -155,7 +172,24 @@ public class XEmbedClientHelper extends XEmbedHelper implements XEventDispatcher } public void handleReparentNotify(XEvent xev) { XReparentEvent re = xev.get_xreparent(); - server = re.get_parent(); + long newParent = re.get_parent(); + if (active) { + // unregister accelerators, etc. for old parent + embedded.notifyStopped(); + // check if newParent is a root window + X11GraphicsConfig gc = (X11GraphicsConfig)embedded.getGraphicsConfiguration(); + X11GraphicsDevice gd = (X11GraphicsDevice)gc.getDevice(); + if ((newParent == XlibUtil.getRootWindow(gd.getScreen())) || + (newParent == XToolkit.getDefaultRootWindow())) + { + // reparenting to root means XEmbed termination + active = false; + } else { + // continue XEmbed with a new parent + server = newParent; + embedded.notifyStarted(); + } + } } boolean requestFocus() { if (active && embedded.focusAllowedFor()) { @@ -201,12 +235,16 @@ public class XEmbedClientHelper extends XEmbedHelper implements XEventDispatcher } void registerAccelerator(AWTKeyStroke stroke, int id) { - long sym = getX11KeySym(stroke); - long mods = getX11Mods(stroke); - sendMessage(server, XEMBED_REGISTER_ACCELERATOR, id, sym, mods); + if (active) { + long sym = getX11KeySym(stroke); + long mods = getX11Mods(stroke); + sendMessage(server, XEMBED_REGISTER_ACCELERATOR, id, sym, mods); + } } void unregisterAccelerator(int id) { - sendMessage(server, XEMBED_UNREGISTER_ACCELERATOR, id, 0, 0); + if (active) { + sendMessage(server, XEMBED_UNREGISTER_ACCELERATOR, id, 0, 0); + } } long getX11KeySym(AWTKeyStroke stroke) { diff --git a/jdk/src/solaris/classes/sun/awt/X11/XEmbeddedFramePeer.java b/jdk/src/solaris/classes/sun/awt/X11/XEmbeddedFramePeer.java index 90eb7ff8ddc..892d7c94e99 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XEmbeddedFramePeer.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XEmbeddedFramePeer.java @@ -63,7 +63,10 @@ public class XEmbeddedFramePeer extends XFramePeer { void postInit(XCreateWindowParams params) { super.postInit(params); if (embedder != null) { - embedder.install(this); + // install X11 event dispatcher + embedder.setClient(this); + // reparent to XEmbed server + embedder.install(); } else if (getParentWindowHandle() != 0) { XToolkit.awtLock(); try { @@ -77,6 +80,15 @@ public class XEmbeddedFramePeer extends XFramePeer { } } + @Override + public void dispose() { + if (embedder != null) { + // uninstall X11 event dispatcher + embedder.setClient(null); + } + super.dispose(); + } + public void updateMinimumSize() { } @@ -249,6 +261,14 @@ public class XEmbeddedFramePeer extends XFramePeer { // XEmbed. updateDropTarget(); } + void notifyStopped() { + if (embedder != null && embedder.isActive()) { + for (int i = strokes.size() - 1; i >= 0; i--) { + embedder.unregisterAccelerator(i); + } + } + } + long getFocusTargetWindow() { return getWindow(); } diff --git a/jdk/src/solaris/classes/sun/awt/X11/XKeysym.java b/jdk/src/solaris/classes/sun/awt/X11/XKeysym.java index 4dae66c0183..9ec3d1c7109 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XKeysym.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XKeysym.java @@ -63,6 +63,8 @@ public class XKeysym { // TODO: or not to do: add reverse lookup javakeycode2keysym, // for robot only it seems to me. After that, we can remove lookup table // from XWindow.c altogether. + // Another use for reverse lookup: query keyboard state, for some keys. + static Hashtable javaKeycode2KeysymHash = new Hashtable(); static long keysym_lowercase = unsafe.allocateMemory(Native.getLongSize()); static long keysym_uppercase = unsafe.allocateMemory(Native.getLongSize()); public static char convertKeysym( long ks, int state ) { @@ -196,6 +198,10 @@ public class XKeysym { Keysym2JavaKeycode jkc = getJavaKeycode( ev ); return jkc == null ? java.awt.event.KeyEvent.VK_UNDEFINED : jkc.getJavaKeycode(); } + static long javaKeycode2Keysym( int jkey ) { + Long ks = javaKeycode2KeysymHash.get( jkey ); + return (ks == null ? 0 : ks.longValue()); + } /** Return keysym derived from a keycode and modifiers. Usually an input method does this. However non-system input methods (e.g. Java IMs) do not. @@ -1583,6 +1589,14 @@ public class XKeysym { keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.hpXK_mute_asciitilde), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_DEAD_TILDE, java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); keysym2JavaKeycodeHash.put( Long.valueOf(XConstants.NoSymbol), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_UNDEFINED, java.awt.event.KeyEvent.KEY_LOCATION_UNKNOWN)); + + /* Reverse search of keysym by keycode. */ + + /* Add keyboard locking codes. */ + javaKeycode2KeysymHash.put( java.awt.event.KeyEvent.VK_CAPS_LOCK, XKeySymConstants.XK_Caps_Lock); + javaKeycode2KeysymHash.put( java.awt.event.KeyEvent.VK_NUM_LOCK, XKeySymConstants.XK_Num_Lock); + javaKeycode2KeysymHash.put( java.awt.event.KeyEvent.VK_SCROLL_LOCK, XKeySymConstants.XK_Scroll_Lock); + javaKeycode2KeysymHash.put( java.awt.event.KeyEvent.VK_KANA_LOCK, XKeySymConstants.XK_Kana_Lock); }; } diff --git a/jdk/src/solaris/classes/sun/awt/X11/XRobotPeer.java b/jdk/src/solaris/classes/sun/awt/X11/XRobotPeer.java index 12084bf1a6a..2bfe6854f3f 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XRobotPeer.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XRobotPeer.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. 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 @@ -81,11 +81,16 @@ class XRobotPeer implements RobotPeer { return pixelArray; } + public int getNumberOfButtons(){ + return getNumberOfButtonsImpl(); + } + private static native synchronized void setup(); private static native synchronized void mouseMoveImpl(X11GraphicsConfig xgc, int x, int y); private static native synchronized void mousePressImpl(int buttons); private static native synchronized void mouseReleaseImpl(int buttons); + private static native synchronized int getNumberOfButtonsImpl(); private static native synchronized void mouseWheelImpl(int wheelAmt); private static native synchronized void keyPressImpl(int keycode); diff --git a/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java b/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java index 9349ee8d1c9..c3011dfa6a2 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java @@ -27,6 +27,7 @@ package sun.awt.X11; import java.awt.*; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; +import java.awt.event.KeyEvent; import java.awt.datatransfer.Clipboard; import java.awt.dnd.DragSource; import java.awt.dnd.DragGestureListener; @@ -61,6 +62,10 @@ public final class XToolkit extends UNIXToolkit implements Runnable { private static Logger keyEventLog = Logger.getLogger("sun.awt.X11.kye.XToolkit"); private static final Logger backingStoreLog = Logger.getLogger("sun.awt.X11.backingStore.XToolkit"); + //There is 400 ms is set by default on Windows and 500 by default on KDE and GNOME. + //We use the same hardcoded constant. + private final static int AWT_MULTICLICK_DEFAULT_TIME = 500; + static final boolean PRIMARY_LOOP = false; static final boolean SECONDARY_LOOP = true; @@ -74,6 +79,25 @@ public final class XToolkit extends UNIXToolkit implements Runnable { // Dynamic Layout Resize client code setting protected static boolean dynamicLayoutSetting = false; + //Is it allowed to generate events assigned to extra mouse buttons. + //Set to true by default. + private static boolean areExtraMouseButtonsEnabled = true; + + /** + * Number of buttons. + * By default it's taken from the system. If system value does not + * fit into int type range, use our own MAX_BUTTONS_SUPPORT value. + */ + private static int numberOfButtons = 0; + + /* XFree standard mention 24 buttons as maximum: + * http://www.xfree86.org/current/mouse.4.html + * We workaround systems supporting more than 24 buttons. + * Otherwise, we have to use long type values as masks + * which leads to API change. + */ + private static int MAX_BUTTONS_SUPPORT = 24; + /** * True when the x settings have been loaded. */ @@ -273,6 +297,9 @@ public final class XToolkit extends UNIXToolkit implements Runnable { arrowCursor = XlibWrapper.XCreateFontCursor(XToolkit.getDisplay(), XCursorFontConstants.XC_arrow); + areExtraMouseButtonsEnabled = Boolean.parseBoolean(System.getProperty("sun.awt.enableExtraMouseButtons", "true")); + //set system property if not yet assigned + System.setProperty("sun.awt.enableExtraMouseButtons", ""+areExtraMouseButtonsEnabled); } finally { awtUnlock(); } @@ -1080,6 +1107,19 @@ public final class XToolkit extends UNIXToolkit implements Runnable { public Map mapInputMethodHighlight(InputMethodHighlight highlight) { return XInputMethod.mapInputMethodHighlight(highlight); } + @Override + public boolean getLockingKeyState(int key) { + if (! (key == KeyEvent.VK_CAPS_LOCK || key == KeyEvent.VK_NUM_LOCK || + key == KeyEvent.VK_SCROLL_LOCK || key == KeyEvent.VK_KANA_LOCK)) { + throw new IllegalArgumentException("invalid key for Toolkit.getLockingKeyState"); + } + awtLock(); + try { + return getModifierState( key ); + } finally { + awtUnlock(); + } + } public Clipboard getSystemClipboard() { SecurityManager security = System.getSecurityManager(); @@ -1216,7 +1256,6 @@ public final class XToolkit extends UNIXToolkit implements Runnable { String multiclick_time_query = XlibWrapper.XGetDefault(XToolkit.getDisplay(), "*", "multiClickTime"); if (multiclick_time_query != null) { awt_multiclick_time = (int)Long.parseLong(multiclick_time_query); - // awt_multiclick_time = XtGetMultiClickTime(awt_display); } else { multiclick_time_query = XlibWrapper.XGetDefault(XToolkit.getDisplay(), "OpenWindows", "MultiClickTimeout"); @@ -1226,20 +1265,19 @@ public final class XToolkit extends UNIXToolkit implements Runnable { milliseconds */ awt_multiclick_time = (int)Long.parseLong(multiclick_time_query) * 100; } else { - awt_multiclick_time = 200; - // awt_multiclick_time = XtGetMultiClickTime(awt_display); + awt_multiclick_time = AWT_MULTICLICK_DEFAULT_TIME; } } } catch (NumberFormatException nf) { - awt_multiclick_time = 200; + awt_multiclick_time = AWT_MULTICLICK_DEFAULT_TIME; } catch (NullPointerException npe) { - awt_multiclick_time = 200; + awt_multiclick_time = AWT_MULTICLICK_DEFAULT_TIME; } } finally { awtUnlock(); } if (awt_multiclick_time == 0) { - awt_multiclick_time = 200; + awt_multiclick_time = AWT_MULTICLICK_DEFAULT_TIME; } } @@ -1383,10 +1421,15 @@ public final class XToolkit extends UNIXToolkit implements Runnable { } } - private int getNumMouseButtons() { + public static int getNumMouseButtons() { awtLock(); try { - return XlibWrapper.XGetPointerMapping(XToolkit.getDisplay(), 0, 0); + if (numberOfButtons == 0) { + numberOfButtons = Math.min( + XlibWrapper.XGetPointerMapping(XToolkit.getDisplay(), 0, 0), + MAX_BUTTONS_SUPPORT); + } + return numberOfButtons; } finally { awtUnlock(); } @@ -1542,6 +1585,66 @@ public final class XToolkit extends UNIXToolkit implements Runnable { awtUnlock(); } } + static boolean getModifierState( int jkc ) { + int iKeyMask = 0; + long ks = XKeysym.javaKeycode2Keysym( jkc ); + int kc = XlibWrapper.XKeysymToKeycode(getDisplay(), ks); + if (kc == 0) { + return false; + } + awtLock(); + try { + XModifierKeymap modmap = new XModifierKeymap( + XlibWrapper.XGetModifierMapping(getDisplay())); + + int nkeys = modmap.get_max_keypermod(); + + long map_ptr = modmap.get_modifiermap(); + for( int k = 0; k < 8; k++ ) { + for (int i = 0; i < nkeys; ++i) { + int keycode = Native.getUByte(map_ptr, k * nkeys + i); + if (keycode == 0) { + continue; // ignore zero keycode + } + if (kc == keycode) { + iKeyMask = 1 << k; + break; + } + } + if( iKeyMask != 0 ) { + break; + } + } + XlibWrapper.XFreeModifiermap(modmap.pData); + if (iKeyMask == 0 ) { + return false; + } + // Now we know to which modifier is assigned the keycode + // correspondent to the keysym correspondent to the java + // keycode. We are going to check a state of this modifier. + // If a modifier is a weird one, we cannot help it. + long window = 0; + try{ + // get any application window + window = ((Long)(winMap.firstKey())).longValue(); + }catch(NoSuchElementException nex) { + // get root window + window = getDefaultRootWindow(); + } + boolean res = XlibWrapper.XQueryPointer(getDisplay(), window, + XlibWrapper.larg1, //root + XlibWrapper.larg2, //child + XlibWrapper.larg3, //root_x + XlibWrapper.larg4, //root_y + XlibWrapper.larg5, //child_x + XlibWrapper.larg6, //child_y + XlibWrapper.larg7);//mask + int mask = Native.getInt(XlibWrapper.larg7); + return ((mask & iKeyMask) != 0); + } finally { + awtUnlock(); + } + } /* Assign meaning - alt, meta, etc. - to X modifiers mod1 ... mod5. * Only consider primary symbols on keycodes attached to modifiers. @@ -2166,4 +2269,8 @@ public final class XToolkit extends UNIXToolkit implements Runnable { } public static native void setNoisyXErrorHandler(); + + public boolean areExtraMouseButtonsEnabled() throws HeadlessException { + return areExtraMouseButtonsEnabled; + } } diff --git a/jdk/src/solaris/classes/sun/awt/X11/XWindow.java b/jdk/src/solaris/classes/sun/awt/X11/XWindow.java index 2c894ce1b20..5601273d879 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XWindow.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XWindow.java @@ -553,6 +553,10 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { } static int getModifiers(int state, int button, int keyCode) { + return getModifiers(state, button, keyCode, 0, false); + } + + static int getModifiers(int state, int button, int keyCode, int type, boolean wheel_mouse) { int modifiers = 0; if (((state & XConstants.ShiftMask) != 0) ^ (keyCode == KeyEvent.VK_SHIFT)) { @@ -570,14 +574,23 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { if (((state & XToolkit.modeSwitchMask) != 0) ^ (keyCode == KeyEvent.VK_ALT_GRAPH)) { modifiers |= InputEvent.ALT_GRAPH_DOWN_MASK; } - if (((state & XConstants.Button1Mask) != 0) ^ (button == MouseEvent.BUTTON1)) { - modifiers |= InputEvent.BUTTON1_DOWN_MASK; - } - if (((state & XConstants.Button2Mask) != 0) ^ (button == MouseEvent.BUTTON2)) { - modifiers |= InputEvent.BUTTON2_DOWN_MASK; - } - if (((state & XConstants.Button3Mask) != 0) ^ (button == MouseEvent.BUTTON3)) { - modifiers |= InputEvent.BUTTON3_DOWN_MASK; + //InputEvent.BUTTON_DOWN_MASK array is starting from BUTTON1_DOWN_MASK on index == 0. + // button currently reflects a real button number and starts from 1. (except NOBUTTON which is zero ) + + /* this is an attempt to refactor button IDs in : MouseEvent, InputEvent, XlibWrapper and XWindow.*/ + + //reflects a button number similar to MouseEvent.BUTTON1, 2, 3 etc. + for (int i = 0; i < XConstants.buttonsMask.length; i ++){ + //modifier should be added if : + // 1) current button is now still in PRESSED state (means that user just pressed mouse but not released yet) or + // 2) if Xsystem reports that "state" represents that button was just released. This only happens on RELEASE with 1,2,3 buttons. + // ONLY one of these conditions should be TRUE to add that modifier. + if (((state & XConstants.buttonsMask[i]) != 0) != (button == XConstants.buttons[i])){ + //exclude wheel buttons from adding their numbers as modifiers + if (!wheel_mouse) { + modifiers |= InputEvent.getMaskForButton(i+1); + } + } } return modifiers; } @@ -603,17 +616,6 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { return res; } - private static int getButtonMask(long mouseButton) { - if (mouseButton == XConstants.Button1) { - return XConstants.Button1Mask; - } else if (mouseButton == XConstants.Button2) { - return XConstants.Button2Mask; - } else if (mouseButton == XConstants.Button3) { - return XConstants.Button3Mask; - } - return 0; - } - /** * Returns true if this event is disabled and shouldn't be passed to Java. * Default implementation returns false for all events. @@ -648,7 +650,7 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { boolean popupTrigger = false; int button=0; boolean wheel_mouse = false; - long lbutton = xbe.get_button(); + int lbutton = xbe.get_button(); int type = xev.get_type(); when = xbe.get_time(); long jWhen = XToolkit.nowMillisUTC_offset(when); @@ -663,7 +665,7 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { if (type == XConstants.ButtonPress) { //Allow this mouse button to generate CLICK event on next ButtonRelease - mouseButtonClickAllowed |= getButtonMask(lbutton); + mouseButtonClickAllowed |= XConstants.buttonsMask[lbutton]; XWindow lastWindow = (lastWindowRef != null) ? ((XWindow)lastWindowRef.get()):(null); /* multiclick checking @@ -693,21 +695,22 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { } } - if (lbutton == XConstants.Button1) - button = MouseEvent.BUTTON1; - else if (lbutton == XConstants.Button2 ) - button = MouseEvent.BUTTON2; - else if (lbutton == XConstants.Button3) - button = MouseEvent.BUTTON3; - else if (lbutton == XConstants.Button4) { - button = 4; - wheel_mouse = true; - } else if (lbutton == XConstants.Button5) { - button = 5; + button = XConstants.buttons[lbutton - 1]; + // 4 and 5 buttons are usually considered assigned to a first wheel + if (lbutton == XConstants.buttons[3] || + lbutton == XConstants.buttons[4]) { wheel_mouse = true; } - modifiers = getModifiers(xbe.get_state(),button,0); + // mapping extra buttons to numbers starting from 4. + if ((button > XConstants.buttons[4]) && (!Toolkit.getDefaultToolkit().areExtraMouseButtonsEnabled())){ + return; + } + + if (button > XConstants.buttons[4]){ + button -= 2; + } + modifiers = getModifiers(xbe.get_state(),button,0, type, wheel_mouse); if (!wheel_mouse) { MouseEvent me = new MouseEvent((Component)getEventSource(), @@ -720,7 +723,7 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { postEventToEventQueue(me); if ((type == XConstants.ButtonRelease) && - ((mouseButtonClickAllowed & getButtonMask(lbutton)) != 0) ) // No up-button in the drag-state + ((mouseButtonClickAllowed & XConstants.buttonsMask[lbutton]) != 0) ) // No up-button in the drag-state { postEventToEventQueue(me = new MouseEvent((Component)getEventSource(), MouseEvent.MOUSE_CLICKED, @@ -750,7 +753,7 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { /* Update the state variable AFTER the CLICKED event post. */ if (type == XConstants.ButtonRelease) { /* Exclude this mouse button from allowed list.*/ - mouseButtonClickAllowed &= ~getButtonMask(lbutton); + mouseButtonClickAllowed &= ~XConstants.buttonsMask[lbutton]; } } @@ -761,7 +764,19 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { return; } - int mouseKeyState = (xme.get_state() & (XConstants.Button1Mask | XConstants.Button2Mask | XConstants.Button3Mask)); + int mouseKeyState = 0; //(xme.get_state() & (XConstants.buttonsMask[0] | XConstants.buttonsMask[1] | XConstants.buttonsMask[2])); + + //this doesn't work for extra buttons because Xsystem is sending state==0 for every extra button event. + // we can't correct it in MouseEvent class as we done it with modifiers, because exact type (DRAG|MOVE) + // should be passed from XWindow. + //TODO: eliminate it with some other value obtained w/o AWTLock. + for (int i = 0; i < XToolkit.getNumMouseButtons(); i++){ + // TODO : here is the bug in WM: extra buttons doesn't have state!=0 as they should. + if ((i != 4) && (i != 5)) { + mouseKeyState = mouseKeyState | (xme.get_state() & XConstants.buttonsMask[i]); + } + } + boolean isDragging = (mouseKeyState != 0); int mouseEventType = 0; diff --git a/jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java b/jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java index 77b39c13d90..5666cab8cda 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java @@ -1936,7 +1936,13 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, new Object[] {xme, isGrabbed(), containsGlobal(xme.get_x_root(), xme.get_y_root())}); } if (isGrabbed()) { - boolean dragging = (xme.get_state() & (XConstants.Button1Mask | XConstants.Button2Mask | XConstants.Button3Mask)) != 0; + boolean dragging = false; + for (int i = 0; i uppercaseHash = new Hashtable javaKeycode2KeysymHash = new Hashtable(); tojava static long keysym_lowercase = unsafe.allocateMemory(Native.getLongSize()); tojava static long keysym_uppercase = unsafe.allocateMemory(Native.getLongSize()); tojava public static char convertKeysym( long ks, int state ) { @@ -234,6 +236,10 @@ tojava static int getJavaKeycodeOnly( XKeyEvent ev ) { tojava Keysym2JavaKeycode jkc = getJavaKeycode( ev ); tojava return jkc == null ? java.awt.event.KeyEvent.VK_UNDEFINED : jkc.getJavaKeycode(); tojava } +tojava static long javaKeycode2Keysym( int jkey ) { +tojava Long ks = javaKeycode2KeysymHash.get( jkey ); +tojava return (ks == null ? 0 : ks.longValue()); +tojava } tojava /** tojava Return keysym derived from a keycode and modifiers. tojava Usually an input method does this. However non-system input methods (e.g. Java IMs) do not. @@ -2634,6 +2640,14 @@ tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.hpXK_mu tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.hpXK_mute_asciitilde), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_DEAD_TILDE, java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); tojava tojava keysym2JavaKeycodeHash.put( Long.valueOf(XConstants.NoSymbol), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_UNDEFINED, java.awt.event.KeyEvent.KEY_LOCATION_UNKNOWN)); +tojava +tojava /* Reverse search of keysym by keycode. */ +tojava +tojava /* Add keyboard locking codes. */ +tojava javaKeycode2KeysymHash.put( java.awt.event.KeyEvent.VK_CAPS_LOCK, XKeySymConstants.XK_Caps_Lock); +tojava javaKeycode2KeysymHash.put( java.awt.event.KeyEvent.VK_NUM_LOCK, XKeySymConstants.XK_Num_Lock); +tojava javaKeycode2KeysymHash.put( java.awt.event.KeyEvent.VK_SCROLL_LOCK, XKeySymConstants.XK_Scroll_Lock); +tojava javaKeycode2KeysymHash.put( java.awt.event.KeyEvent.VK_KANA_LOCK, XKeySymConstants.XK_Kana_Lock); tojava }; tojava tojava } diff --git a/jdk/src/solaris/native/java/lang/UNIXProcess_md.c b/jdk/src/solaris/native/java/lang/UNIXProcess_md.c index 8390a2baad5..9cfe22a1f16 100644 --- a/jdk/src/solaris/native/java/lang/UNIXProcess_md.c +++ b/jdk/src/solaris/native/java/lang/UNIXProcess_md.c @@ -259,6 +259,12 @@ Java_java_lang_UNIXProcess_waitForProcessExit(JNIEnv* env, } } +static int +isAsciiDigit(char c) +{ + return c >= '0' && c <= '9'; +} + static int closeDescriptors(void) { @@ -284,7 +290,7 @@ closeDescriptors(void) */ while ((dirp = readdir64(dp)) != NULL) { int fd; - if (isdigit(dirp->d_name[0]) && + if (isAsciiDigit(dirp->d_name[0]) && (fd = strtol(dirp->d_name, NULL, 10)) >= from_fd + 2) close(fd); } diff --git a/jdk/src/solaris/native/sun/awt/awt_Robot.c b/jdk/src/solaris/native/sun/awt/awt_Robot.c index 07c053bce28..6fce85dc7bc 100644 --- a/jdk/src/solaris/native/sun/awt/awt_Robot.c +++ b/jdk/src/solaris/native/sun/awt/awt_Robot.c @@ -1,5 +1,5 @@ /* - * Copyright 1999-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. 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 @@ -54,6 +54,7 @@ extern struct X11GraphicsConfigIDs x11GraphicsConfigIDs; // 2 would be more correct, however that's how Robot originally worked // and tests start to fail if this value is changed static int32_t num_buttons = 3; +static jint * masks; static int32_t isXTestAvailable() { int32_t major_opcode, first_event, first_error; @@ -208,6 +209,26 @@ JNIEXPORT void JNICALL Java_sun_awt_X11_XRobotPeer_setup (JNIEnv * env, jclass cls) { int32_t xtestAvailable; +// this should be called from XRobotPeer constructor + jclass inputEventClazz = (*env)->FindClass(env, "java/awt/event/InputEvent"); + jmethodID getButtonDownMasksID = (*env)->GetStaticMethodID(env, inputEventClazz, "getButtonDownMasks", "()[I"); + jintArray obj = (jintArray)(*env)->CallStaticObjectMethod(env, inputEventClazz, getButtonDownMasksID); + jsize len = (*env)->GetArrayLength(env, obj); + jint * tmp = (*env)->GetIntArrayElements(env, obj, JNI_FALSE); + + masks = (jint *)malloc(sizeof(jint)*len); + if (masks == (jint *) NULL) { + JNU_ThrowOutOfMemoryError((JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2), NULL); + goto finally; + } + + int i; + for (i = 0; i < len; i++) { + masks[i] = tmp[i]; + } + (*env)->ReleaseIntArrayElements(env, obj, tmp, 0); + (*env)->DeleteLocalRef(env, obj); + DTRACE_PRINTLN("RobotPeer: setup()"); AWT_LOCK(); @@ -221,10 +242,17 @@ Java_sun_awt_X11_XRobotPeer_setup (JNIEnv * env, jclass cls) { } getNumButtons(); - + finally: AWT_UNLOCK(); } +JNIEXPORT jint JNICALL +Java_sun_awt_X11_XRobotPeer_getNumberOfButtonsImpl(JNIEnv *env, + jclass cls) { + // At the moment this routine being called we already should have an initialized num_buttons variable. + return num_buttons; +} + JNIEXPORT void JNICALL Java_sun_awt_X11_XRobotPeer_getRGBPixelsImpl( JNIEnv *env, jclass cls, @@ -348,52 +376,65 @@ Java_sun_awt_X11_XRobotPeer_mouseMoveImpl (JNIEnv *env, AWT_UNLOCK(); } +/* + * Function joining the code of mousePressImpl and mouseReleaseImpl + */ +void mouseAction(JNIEnv *env, + jclass cls, + jint buttonMask, + Bool isMousePress) +{ + AWT_LOCK(); + + DTRACE_PRINTLN1("RobotPeer: mouseAction(%i)", buttonMask); + DTRACE_PRINTLN1("RobotPeer: mouseAction, press = %d", isMousePress); + + if (buttonMask & java_awt_event_InputEvent_BUTTON1_MASK || + buttonMask & java_awt_event_InputEvent_BUTTON1_DOWN_MASK ) + { + XTestFakeButtonEvent(awt_display, 1, isMousePress, CurrentTime); + } + if ((buttonMask & java_awt_event_InputEvent_BUTTON2_MASK || + buttonMask & java_awt_event_InputEvent_BUTTON2_DOWN_MASK) && + (num_buttons >= 2)) { + XTestFakeButtonEvent(awt_display, 2, isMousePress, CurrentTime); + } + if ((buttonMask & java_awt_event_InputEvent_BUTTON3_MASK || + buttonMask & java_awt_event_InputEvent_BUTTON3_DOWN_MASK) && + (num_buttons >= 3)) { + XTestFakeButtonEvent(awt_display, 3, isMousePress, CurrentTime); + } + + if (num_buttons > 3){ + int32_t i; + int32_t button = 0; + for (i = 3; i +1 + // users wants to affect 4 or 5 button but they are assigned + // to the wheel so => we have to shift it to the right by 2. + button = i + 3; + XTestFakeButtonEvent(awt_display, button, isMousePress, CurrentTime); + } + } + } + + XSync(awt_display, False); + AWT_UNLOCK(); +} + JNIEXPORT void JNICALL Java_sun_awt_X11_XRobotPeer_mousePressImpl (JNIEnv *env, jclass cls, jint buttonMask) { - AWT_LOCK(); - - DTRACE_PRINTLN1("RobotPeer: mousePressImpl(%i)", buttonMask); - - if (buttonMask & java_awt_event_InputEvent_BUTTON1_MASK) { - XTestFakeButtonEvent(awt_display, 1, True, CurrentTime); - } - if ((buttonMask & java_awt_event_InputEvent_BUTTON2_MASK) && - (num_buttons >= 2)) { - XTestFakeButtonEvent(awt_display, 2, True, CurrentTime); - } - if ((buttonMask & java_awt_event_InputEvent_BUTTON3_MASK) && - (num_buttons >= 3)) { - XTestFakeButtonEvent(awt_display, 3, True, CurrentTime); - } - XSync(awt_display, False); - - AWT_UNLOCK(); + mouseAction(env, cls, buttonMask, True); } JNIEXPORT void JNICALL Java_sun_awt_X11_XRobotPeer_mouseReleaseImpl (JNIEnv *env, jclass cls, jint buttonMask) { - AWT_LOCK(); - - DTRACE_PRINTLN1("RobotPeer: mouseReleaseImpl(%i)", buttonMask); - - if (buttonMask & java_awt_event_InputEvent_BUTTON1_MASK) { - XTestFakeButtonEvent(awt_display, 1, False, CurrentTime); - } - if ((buttonMask & java_awt_event_InputEvent_BUTTON2_MASK) && - (num_buttons >= 2)) { - XTestFakeButtonEvent(awt_display, 2, False, CurrentTime); - } - if ((buttonMask & java_awt_event_InputEvent_BUTTON3_MASK) && - (num_buttons >= 3)) { - XTestFakeButtonEvent(awt_display, 3, False, CurrentTime); - } - XSync(awt_display, False); - - AWT_UNLOCK(); + mouseAction(env, cls, buttonMask, False); } JNIEXPORT void JNICALL diff --git a/jdk/src/solaris/native/sun/xawt/XlibWrapper.c b/jdk/src/solaris/native/sun/xawt/XlibWrapper.c index 6801dd94701..aee5cf9b080 100644 --- a/jdk/src/solaris/native/sun/xawt/XlibWrapper.c +++ b/jdk/src/solaris/native/sun/xawt/XlibWrapper.c @@ -1641,6 +1641,13 @@ JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XdbeSwapBuffers AWT_CHECK_HAVE_LOCK(); return XdbeSwapBuffers((Display*) jlong_to_ptr(display), (XdbeSwapInfo *) jlong_to_ptr(swap_info), num_windows); } +JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XQueryKeymap +(JNIEnv *env, jclass clazz, jlong display, jlong vector) +{ + + AWT_CHECK_HAVE_LOCK(); + XQueryKeymap( (Display *) jlong_to_ptr(display), (char *) jlong_to_ptr(vector)); +} JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XKeycodeToKeysym(JNIEnv *env, jclass clazz, @@ -1911,19 +1918,30 @@ Java_sun_awt_X11_XlibWrapper_SetRectangularShape jint x1, jint y1, jint x2, jint y2, jobject region) { - XRectangle rects[256]; - XRectangle *pRect = rects; - int numrects; - AWT_CHECK_HAVE_LOCK(); - numrects = RegionToYXBandedRectangles(env, x1, y1, x2, y2, region, - &pRect, 256); + // If all the params are zeros, the shape must be simply reset. + // Otherwise, the shape may be not rectangular. + if (region || x1 || x2 || y1 || y2) { + XRectangle rects[256]; + XRectangle *pRect = rects; - XShapeCombineRectangles((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window), + int numrects = RegionToYXBandedRectangles(env, x1, y1, x2, y2, region, + &pRect, 256); + + XShapeCombineRectangles((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window), + ShapeClip, 0, 0, pRect, numrects, ShapeSet, YXBanded); + XShapeCombineRectangles((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window), ShapeBounding, 0, 0, pRect, numrects, ShapeSet, YXBanded); - if (pRect != rects) { - free(pRect); + if (pRect != rects) { + free(pRect); + } + } else { + // Reset the shape to a rectangular form. + XShapeCombineMask((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window), + ShapeClip, 0, 0, None, ShapeSet); + XShapeCombineMask((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window), + ShapeBounding, 0, 0, None, ShapeSet); } } diff --git a/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java b/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java index 0f71eda29de..afbd170cc7f 100644 --- a/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java +++ b/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java @@ -68,13 +68,6 @@ public abstract class WComponentPeer extends WObjectPeer private static final Logger log = Logger.getLogger("sun.awt.windows.WComponentPeer"); private static final Logger shapeLog = Logger.getLogger("sun.awt.windows.shape.WComponentPeer"); - static { - wheelInit(); - } - - // Only actually does stuff if running on 95 - native static void wheelInit(); - // ComponentPeer implementation SurfaceData surfaceData; @@ -964,8 +957,12 @@ public abstract class WComponentPeer extends WObjectPeer + "; SHAPE: " + shape); } - setRectangularShape(shape.getLoX(), shape.getLoY(), shape.getHiX(), shape.getHiY(), - (shape.isRectangular() ? null : shape)); + if (shape != null) { + setRectangularShape(shape.getLoX(), shape.getLoY(), shape.getHiX(), shape.getHiY(), + (shape.isRectangular() ? null : shape)); + } else { + setRectangularShape(0, 0, 0, 0, null); + } } } diff --git a/jdk/src/windows/classes/sun/awt/windows/WInputMethod.java b/jdk/src/windows/classes/sun/awt/windows/WInputMethod.java index 33be7f8b4be..6cec225db97 100644 --- a/jdk/src/windows/classes/sun/awt/windows/WInputMethod.java +++ b/jdk/src/windows/classes/sun/awt/windows/WInputMethod.java @@ -548,11 +548,15 @@ public class WInputMethod extends InputMethodAdapter public void inquireCandidatePosition() { + Component source = getClientComponent(); + if (source == null) { + return; + } // This call should return immediately just to cause // InputMethodRequests.getTextLocation be called within // AWT Event thread. Otherwise, a potential deadlock // could happen. - java.awt.EventQueue.invokeLater(new Runnable() { + Runnable r = new Runnable() { public void run() { int x = 0; int y = 0; @@ -573,7 +577,9 @@ public class WInputMethod extends InputMethodAdapter openCandidateWindow(awtFocussedComponentPeer, x, y); } - }); + }; + WToolkit.postEvent(WToolkit.targetToAppContext(source), + new InvocationEvent(source, r)); } // java.awt.Toolkit#getNativeContainer() is not available diff --git a/jdk/src/windows/classes/sun/awt/windows/WRobotPeer.java b/jdk/src/windows/classes/sun/awt/windows/WRobotPeer.java index 1fb8ce2b51e..4cd3d2d3c26 100644 --- a/jdk/src/windows/classes/sun/awt/windows/WRobotPeer.java +++ b/jdk/src/windows/classes/sun/awt/windows/WRobotPeer.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. 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 @@ -60,6 +60,8 @@ class WRobotPeer extends WObjectPeer implements RobotPeer } public native int getRGBPixelImpl(int x, int y); + public native int getNumberOfButtons(); + public int [] getRGBPixels(Rectangle bounds) { int pixelArray[] = new int[bounds.width*bounds.height]; getRGBPixels(bounds.x, bounds.y, bounds.width, bounds.height, pixelArray); diff --git a/jdk/src/windows/classes/sun/awt/windows/WToolkit.java b/jdk/src/windows/classes/sun/awt/windows/WToolkit.java index 5ea8ca3acc5..55c1dde092d 100644 --- a/jdk/src/windows/classes/sun/awt/windows/WToolkit.java +++ b/jdk/src/windows/classes/sun/awt/windows/WToolkit.java @@ -80,6 +80,10 @@ public class WToolkit extends SunToolkit implements Runnable { // Dynamic Layout Resize client code setting protected boolean dynamicLayoutSetting = false; + //Is it allowed to generate events assigned to extra mouse buttons. + //Set to true by default. + private static boolean areExtraMouseButtonsEnabled = true; + /** * Initialize JNI field and method IDs */ @@ -249,6 +253,11 @@ public class WToolkit extends SunToolkit implements Runnable { // Enabled "live resizing" by default. It remains controlled // by the native system though. setDynamicLayout(true); + + areExtraMouseButtonsEnabled = Boolean.parseBoolean(System.getProperty("sun.awt.enableExtraMouseButtons", "true")); + //set system property if not yet assigned + System.setProperty("sun.awt.enableExtraMouseButtons", ""+areExtraMouseButtonsEnabled); + setExtraMouseButtonsEnabledNative(areExtraMouseButtonsEnabled); } public void run() { @@ -961,4 +970,9 @@ public class WToolkit extends SunToolkit implements Runnable { return new WDesktopPeer(); } + public static native void setExtraMouseButtonsEnabledNative(boolean enable); + + public boolean areExtraMouseButtonsEnabled() throws HeadlessException { + return areExtraMouseButtonsEnabled; + } } diff --git a/jdk/src/windows/native/sun/awt/splashscreen/splashscreen_sys.c b/jdk/src/windows/native/sun/awt/splashscreen/splashscreen_sys.c index 069cf301d3b..c5b42b9f4b5 100644 --- a/jdk/src/windows/native/sun/awt/splashscreen/splashscreen_sys.c +++ b/jdk/src/windows/native/sun/awt/splashscreen/splashscreen_sys.c @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. 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 @@ -23,24 +23,21 @@ * have any questions. */ +// copy from awt.h +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0600 +#endif + +// copy from awt.h +#ifndef _WIN32_IE +#define _WIN32_IE 0x0600 +#endif + #include "splashscreen_impl.h" #include #include #include -/* layered windows api prototypes. wouldn't be needed if we could use an updated version of the MS PSDK. */ - -typedef BOOL WINAPI UpdateLayeredWindowT(HWND hwnd, // handle to layered window - HDC hdcDst, // handle to screen DC - POINT * pptDst, // new screen position - SIZE * psize, // new size of the layered window - HDC hdcSrc, // handle to surface DC - POINT * pptSrc, // layer position - COLORREF crKey, // color key - BLENDFUNCTION * pblend, // blend function - DWORD dwFlags // options - ); - #ifndef WS_EX_LAYERED #define WS_EX_LAYERED 0x80000 #endif @@ -57,21 +54,6 @@ typedef BOOL WINAPI UpdateLayeredWindowT(HWND hwnd, // handle to layered win #define AC_SRC_ALPHA 0x01 #endif -static UpdateLayeredWindowT *UpdateLayeredWindow = NULL; - -/* Get/SetWindowLongPtr prototypes, for the case we're compiling with old headers for a 32-bit platform - copied from Component.cpp - FIXME: remove this as soon as the build process is using up-to-date headers */ -#if !defined(__int3264) -#define GetWindowLongPtr GetWindowLong -#define SetWindowLongPtr SetWindowLong -#define GWLP_USERDATA GWL_USERDATA -#define GWLP_WNDPROC GWL_WNDPROC -typedef __int32 LONG_PTR; -typedef unsigned __int32 ULONG_PTR; -#endif // __int3264 - - #define WM_SPLASHUPDATE WM_USER+1 #define WM_SPLASHRECONFIGURE WM_USER+2 @@ -436,16 +418,11 @@ SplashUnlock(Splash * splash) void SplashInitPlatform(Splash * splash) { - HMODULE user32 = LoadLibrary("user32.dll"); HDC hdc; int paletteMode; InitializeCriticalSection(&splash->lock); splash->isLayered = FALSE; - if (user32) { - UpdateLayeredWindow = (UpdateLayeredWindowT *) - GetProcAddress(user32, "UpdateLayeredWindow"); - } hdc = GetDC(NULL); paletteMode = (GetDeviceCaps(hdc, RASTERCAPS) & RC_PALETTE) != 0; if (UpdateLayeredWindow && !paletteMode) { diff --git a/jdk/src/windows/native/sun/java2d/d3d/D3DPipelineManager.cpp b/jdk/src/windows/native/sun/java2d/d3d/D3DPipelineManager.cpp index f0838dd5625..bee55638ddd 100644 --- a/jdk/src/windows/native/sun/java2d/d3d/D3DPipelineManager.cpp +++ b/jdk/src/windows/native/sun/java2d/d3d/D3DPipelineManager.cpp @@ -184,7 +184,7 @@ void D3DPipelineManager::NotifyAdapterEventListeners(UINT adapter, pMgr = D3DPipelineManager::GetInstance(); RETURN_IF_NULL(pMgr); hMon = pMgr->pd3d9->GetAdapterMonitor(adapter); - gdiScreen = AwtWin32GraphicsDevice::GetScreenFromMHND((MHND)hMon); + gdiScreen = AwtWin32GraphicsDevice::GetScreenFromHMONITOR(hMon); JNU_CallStaticMethodByName(env, NULL, "sun/java2d/pipe/hw/AccelDeviceEventNotifier", @@ -194,21 +194,21 @@ void D3DPipelineManager::NotifyAdapterEventListeners(UINT adapter, UINT D3DPipelineManager::GetAdapterOrdinalForScreen(jint gdiScreen) { - MHND mHnd = AwtWin32GraphicsDevice::GetMonitor(gdiScreen); - if (mHnd == (MHND)0) { + HMONITOR mHnd = AwtWin32GraphicsDevice::GetMonitor(gdiScreen); + if (mHnd == (HMONITOR)0) { return D3DADAPTER_DEFAULT; } return GetAdapterOrdinalByHmon((HMONITOR)mHnd); } // static -HRESULT D3DPipelineManager::HandleAdaptersChange(HMONITOR *pMHNDs, UINT monNum) +HRESULT D3DPipelineManager::HandleAdaptersChange(HMONITOR *pHMONITORs, UINT monNum) { HRESULT res = S_OK; BOOL bResetD3D = FALSE, bFound; D3DPipelineManager *pMgr = D3DPipelineManager::GetInstance(); - RETURN_STATUS_IF_NULL(pMHNDs, E_FAIL); + RETURN_STATUS_IF_NULL(pHMONITORs, E_FAIL); if (pMgr == NULL) { // NULL pMgr is valid when the pipeline is not enabled or if it hasn't // been created yet @@ -234,7 +234,7 @@ HRESULT D3DPipelineManager::HandleAdaptersChange(HMONITOR *pMHNDs, UINT monNum) } bFound = FALSE; for (UINT mon = 0; mon < monNum; mon++) { - if (pMHNDs[mon] == hMon) { + if (pHMONITORs[mon] == hMon) { J2dTraceLn3(J2D_TRACE_VERBOSE, " adapter %d: found hmnd[%d]=0x%x", i, mon, hMon); bFound = TRUE; @@ -364,8 +364,8 @@ D3DPipelineManager::CheckOSVersion() HRESULT D3DPipelineManager::GDICheckForBadHardware() { - _DISPLAY_DEVICE dd; - dd.dwSize = sizeof(DISPLAY_DEVICE); + DISPLAY_DEVICE dd; + dd.cb = sizeof(DISPLAY_DEVICE); int failedDevices = 0; int attachedDevices = 0; @@ -379,9 +379,9 @@ D3DPipelineManager::GDICheckForBadHardware() // i<20 is to guard against buggy drivers while (EnumDisplayDevices(NULL, i, &dd, 0) && i < 20) { - if (dd.dwFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) { + if (dd.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) { attachedDevices++; - id = dd.deviceID; + id = dd.DeviceID; if (wcslen(id) > 21) { // get vendor ID wcsncpy(vendorId, id+8, 4); @@ -796,7 +796,7 @@ HWND D3DPipelineManager::CreateDefaultFocusWindow() ZeroMemory(&mi, sizeof(MONITORINFO)); mi.cbSize = sizeof(MONITORINFO); HMONITOR hMon = pd3d9->GetAdapterMonitor(adapterOrdinal); - if (hMon == 0 || !GetMonitorInfo(hMon, (PMONITOR_INFO)&mi)) { + if (hMon == 0 || !GetMonitorInfo(hMon, (LPMONITORINFO)&mi)) { J2dRlsTraceLn1(J2D_TRACE_ERROR, "D3DPPLM::CreateDefaultFocusWindow: "\ "error getting monitor info for adapter=%d", adapterOrdinal); diff --git a/jdk/src/windows/native/sun/java2d/d3d/D3DRenderQueue.cpp b/jdk/src/windows/native/sun/java2d/d3d/D3DRenderQueue.cpp index e33f1c4e1db..d9222ff8ba3 100644 --- a/jdk/src/windows/native/sun/java2d/d3d/D3DRenderQueue.cpp +++ b/jdk/src/windows/native/sun/java2d/d3d/D3DRenderQueue.cpp @@ -23,8 +23,8 @@ * have any questions. */ +#include "D3DPipeline.h" #include -#include #include "sun_java2d_pipe_BufferedOpCodes.h" #include "jlong.h" diff --git a/jdk/src/windows/native/sun/java2d/d3d/D3DRenderer.cpp b/jdk/src/windows/native/sun/java2d/d3d/D3DRenderer.cpp index 8da2398ebcf..f9351da4c4e 100644 --- a/jdk/src/windows/native/sun/java2d/d3d/D3DRenderer.cpp +++ b/jdk/src/windows/native/sun/java2d/d3d/D3DRenderer.cpp @@ -23,6 +23,8 @@ * have any questions. */ +#include "D3DPipeline.h" + #include "sun_java2d_d3d_D3DRenderer.h" #include "D3DContext.h" diff --git a/jdk/src/windows/native/sun/java2d/d3d/D3DSurfaceData.cpp b/jdk/src/windows/native/sun/java2d/d3d/D3DSurfaceData.cpp index 0cadb3bd677..9c865dc971b 100644 --- a/jdk/src/windows/native/sun/java2d/d3d/D3DSurfaceData.cpp +++ b/jdk/src/windows/native/sun/java2d/d3d/D3DSurfaceData.cpp @@ -23,8 +23,7 @@ * have any questions. */ -#include -#include +#include "D3DPipeline.h" #include #include "D3DSurfaceData.h" #include "D3DPipelineManager.h" diff --git a/jdk/src/windows/native/sun/java2d/windows/GDIBlitLoops.cpp b/jdk/src/windows/native/sun/java2d/windows/GDIBlitLoops.cpp index 06d3c5f3fb5..736f39b5860 100644 --- a/jdk/src/windows/native/sun/java2d/windows/GDIBlitLoops.cpp +++ b/jdk/src/windows/native/sun/java2d/windows/GDIBlitLoops.cpp @@ -23,6 +23,7 @@ * have any questions. */ +#include "awt.h" #include #include "gdefs.h" #include "Trace.h" diff --git a/jdk/src/windows/native/sun/java2d/windows/GDIRenderer.cpp b/jdk/src/windows/native/sun/java2d/windows/GDIRenderer.cpp index 5a06df00bcc..b2dc4a0e7af 100644 --- a/jdk/src/windows/native/sun/java2d/windows/GDIRenderer.cpp +++ b/jdk/src/windows/native/sun/java2d/windows/GDIRenderer.cpp @@ -23,6 +23,7 @@ * have any questions. */ +#include "awt.h" #include "sun_java2d_windows_GDIRenderer.h" #include "java_awt_geom_PathIterator.h" @@ -31,11 +32,8 @@ #include "awt_Pen.h" #include "awt_Brush.h" -#include "jni.h" - #include "GraphicsPrimitiveMgr.h" -#include #include /* for cos(), sin(), etc */ #define MAX_CLAMP_BND (1<<26) diff --git a/jdk/src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.cpp b/jdk/src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.cpp index b7032df7b3c..9acabfc66e9 100644 --- a/jdk/src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.cpp +++ b/jdk/src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.cpp @@ -246,7 +246,7 @@ static BOOL GDIWinSD_CheckMonitorArea(GDIWinSDOps *wsdo, } if( numScreens > 1 ) { - MONITOR_INFO *miInfo; + LPMONITORINFO miInfo; RECT rSect ={0,0,0,0}; RECT rView ={bounds->x1, bounds->y1, bounds->x2, bounds->y2}; retCode = FALSE; @@ -258,7 +258,7 @@ static BOOL GDIWinSD_CheckMonitorArea(GDIWinSDOps *wsdo, ::OffsetRect(&rView, (ptOrig.x), (ptOrig.y)); - ::IntersectRect(&rSect,&rView,&(miInfo->rMonitor)); + ::IntersectRect(&rSect,&rView,&(miInfo->rcMonitor)); if( FALSE == ::IsRectEmpty(&rSect) ) { if( TRUE == ::EqualRect(&rSect,&rView) ) { diff --git a/jdk/src/windows/native/sun/java2d/windows/WindowsFlags.cpp b/jdk/src/windows/native/sun/java2d/windows/WindowsFlags.cpp index b7040b8d803..01c0f6d8fc4 100644 --- a/jdk/src/windows/native/sun/java2d/windows/WindowsFlags.cpp +++ b/jdk/src/windows/native/sun/java2d/windows/WindowsFlags.cpp @@ -23,8 +23,6 @@ * have any questions. */ - -#include #include #include "Trace.h" #include "WindowsFlags.h" diff --git a/jdk/src/windows/native/sun/security/krb5/WindowsDirectory.c b/jdk/src/windows/native/sun/security/krb5/WindowsDirectory.c index dc96bad91ab..7b11163863d 100644 --- a/jdk/src/windows/native/sun/security/krb5/WindowsDirectory.c +++ b/jdk/src/windows/native/sun/security/krb5/WindowsDirectory.c @@ -1,5 +1,5 @@ /* - * Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2009 Sun Microsystems, Inc. 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 @@ -23,6 +23,7 @@ * have any questions. */ +#define UNICODE #include #include #include @@ -30,22 +31,20 @@ /* * Class: sun_security_krb5_Config * Method: getWindowsDirectory - * Signature: ()Ljava/lang/String; + * Signature: (Z)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_sun_security_krb5_Config_getWindowsDirectory( - JNIEnv* env, jclass configClass) { - LPTSTR lpPath = NULL; - UINT uLength ; - jstring path = NULL; - - if (uLength = GetWindowsDirectory(lpPath, 0)) { - lpPath = (LPTSTR)malloc(sizeof(TCHAR) * uLength); - if (lpPath != NULL) { - if (GetWindowsDirectory(lpPath, uLength)) { - path = (*env)->NewStringUTF(env, lpPath); - } - free(lpPath); - } + JNIEnv* env, jclass configClass, jboolean isSystem) { + TCHAR lpPath[MAX_PATH+1]; + UINT len; + if (isSystem) { + len = GetSystemWindowsDirectory(lpPath, MAX_PATH); + } else { + len = GetWindowsDirectory(lpPath, MAX_PATH); + } + if (len) { + return (*env)->NewString(env, lpPath, len); + } else { + return NULL; } - return path; } diff --git a/jdk/src/windows/native/sun/windows/ComCtl32Util.cpp b/jdk/src/windows/native/sun/windows/ComCtl32Util.cpp index a36ac6df9fc..ac69cf3af60 100644 --- a/jdk/src/windows/native/sun/windows/ComCtl32Util.cpp +++ b/jdk/src/windows/native/sun/windows/ComCtl32Util.cpp @@ -23,54 +23,26 @@ * have any questions. */ +#include "awt.h" #include "ComCtl32Util.h" ComCtl32Util::ComCtl32Util() { - hModComCtl32 = NULL; - m_bNewSubclassing = FALSE; - - m_lpfnSetWindowSubclass = NULL; - m_lpfnRemoveWindowSubclass = NULL; - m_lpfnDefSubclassProc = NULL; } ComCtl32Util::~ComCtl32Util() { - DASSERT(hModComCtl32 == NULL); } void ComCtl32Util::InitLibraries() { - if (hModComCtl32 == NULL) { - hModComCtl32 = ::LoadLibrary(TEXT("comctl32.dll")); - if (hModComCtl32 != NULL) { - m_lpfnSetWindowSubclass = (PFNSETWINDOWSUBCLASS)::GetProcAddress(hModComCtl32, "SetWindowSubclass"); - m_lpfnRemoveWindowSubclass = (PFNREMOVEWINDOWSUBCLASS)::GetProcAddress(hModComCtl32, "RemoveWindowSubclass"); - m_lpfnDefSubclassProc = (PFNDEFSUBCLASSPROC)::GetProcAddress(hModComCtl32, "DefSubclassProc"); - - m_bNewSubclassing = (m_lpfnSetWindowSubclass != NULL) && - (m_lpfnRemoveWindowSubclass != NULL) && - (m_lpfnDefSubclassProc != NULL); - - fn_InitCommonControlsEx = (ComCtl32Util::InitCommonControlsExType)::GetProcAddress(hModComCtl32, "InitCommonControlsEx"); - InitCommonControls(); - } - } -} - -void ComCtl32Util::FreeLibraries() { - if (hModComCtl32 != NULL) { - m_lpfnSetWindowSubclass = NULL; - m_lpfnRemoveWindowSubclass = NULL; - m_lpfnDefSubclassProc = NULL; - ::FreeLibrary(hModComCtl32); - hModComCtl32 = NULL; - } + INITCOMMONCONTROLSEX iccex; + memset(&iccex, 0, sizeof(INITCOMMONCONTROLSEX)); + iccex.dwSize = sizeof(INITCOMMONCONTROLSEX); + ::InitCommonControlsEx(&iccex); } WNDPROC ComCtl32Util::SubclassHWND(HWND hwnd, WNDPROC _WindowProc) { - if (m_bNewSubclassing) { - DASSERT(hModComCtl32 != NULL); + if (IS_WINXP) { const SUBCLASSPROC p = SharedWindowProc; // let compiler check type of SharedWindowProc - m_lpfnSetWindowSubclass(hwnd, p, (UINT_PTR)_WindowProc, NULL); // _WindowProc is used as subclass ID + ::SetWindowSubclass(hwnd, p, (UINT_PTR)_WindowProc, NULL); // _WindowProc is used as subclass ID return NULL; } else { return (WNDPROC)::SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)_WindowProc); @@ -78,21 +50,17 @@ WNDPROC ComCtl32Util::SubclassHWND(HWND hwnd, WNDPROC _WindowProc) { } void ComCtl32Util::UnsubclassHWND(HWND hwnd, WNDPROC _WindowProc, WNDPROC _DefWindowProc) { - if (m_bNewSubclassing) { - DASSERT(hModComCtl32 != NULL); - DASSERT(_DefWindowProc == NULL); + if (IS_WINXP) { const SUBCLASSPROC p = SharedWindowProc; // let compiler check type of SharedWindowProc - m_lpfnRemoveWindowSubclass(hwnd, p, (UINT_PTR)_WindowProc); // _WindowProc is used as subclass ID + ::RemoveWindowSubclass(hwnd, p, (UINT_PTR)_WindowProc); // _WindowProc is used as subclass ID } else { ::SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)_DefWindowProc); } } LRESULT ComCtl32Util::DefWindowProc(WNDPROC _DefWindowProc, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { - if (m_bNewSubclassing) { - DASSERT(hModComCtl32 != NULL); - DASSERT(_DefWindowProc == NULL); - return m_lpfnDefSubclassProc(hwnd, msg, wParam, lParam); + if (IS_WINXP) { + return ::DefSubclassProc(hwnd, msg, wParam, lParam); } else if (_DefWindowProc != NULL) { return ::CallWindowProc(_DefWindowProc, hwnd, msg, wParam, lParam); } else { @@ -111,15 +79,3 @@ LRESULT ComCtl32Util::SharedWindowProc(HWND hwnd, UINT msg, CATCH_BAD_ALLOC_RET(0); } - -void ComCtl32Util::InitCommonControls() -{ - if (fn_InitCommonControlsEx == NULL) { - return; - } - - INITCOMMONCONTROLSEX iccex; - memset(&iccex, 0, sizeof(INITCOMMONCONTROLSEX)); - iccex.dwSize = sizeof(INITCOMMONCONTROLSEX); - fn_InitCommonControlsEx(&iccex); -} diff --git a/jdk/src/windows/native/sun/windows/ComCtl32Util.h b/jdk/src/windows/native/sun/windows/ComCtl32Util.h index 888a14db1ba..e137b43d0df 100644 --- a/jdk/src/windows/native/sun/windows/ComCtl32Util.h +++ b/jdk/src/windows/native/sun/windows/ComCtl32Util.h @@ -30,20 +30,6 @@ #ifndef _COMCTL32UTIL_H #define _COMCTL32UTIL_H - -/* - * comctl32.dll version 6 subclassing - taken from PlatformSDK/Include/commctrl.h - */ -typedef LRESULT (CALLBACK *SUBCLASSPROC)(HWND hWnd, UINT uMsg, WPARAM wParam, \ - LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData); - -typedef BOOL (WINAPI *PFNSETWINDOWSUBCLASS)(HWND hWnd, SUBCLASSPROC pfnSubclass, UINT_PTR uIdSubclass, \ - DWORD_PTR dwRefData); -typedef BOOL (WINAPI *PFNREMOVEWINDOWSUBCLASS)(HWND hWnd, SUBCLASSPROC pfnSubclass, \ - UINT_PTR uIdSubclass); - -typedef LRESULT (WINAPI *PFNDEFSUBCLASSPROC)(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); - class ComCtl32Util { public: @@ -52,21 +38,8 @@ class ComCtl32Util return theInstance; } - // loads comctl32.dll and checks if required routines are available - // called from AwtToolkit::AwtToolkit() void InitLibraries(); - // unloads comctl32.dll - // called from AwtToolkit::Dispose() - void FreeLibraries(); - //-- comctl32.dll version 6 subclassing API --// - - INLINE BOOL IsNewSubclassing() { - return m_bNewSubclassing; - } - - // if comctl32.dll version 6 is used returns NULL, otherwise - // returns default window proc WNDPROC SubclassHWND(HWND hwnd, WNDPROC _WindowProc); // DefWindowProc is the same as returned from SubclassHWND void UnsubclassHWND(HWND hwnd, WNDPROC _WindowProc, WNDPROC _DefWindowProc); @@ -77,19 +50,6 @@ class ComCtl32Util ComCtl32Util(); ~ComCtl32Util(); - HMODULE hModComCtl32; - - PFNSETWINDOWSUBCLASS m_lpfnSetWindowSubclass; - PFNREMOVEWINDOWSUBCLASS m_lpfnRemoveWindowSubclass; - PFNDEFSUBCLASSPROC m_lpfnDefSubclassProc; - - typedef BOOL (WINAPI * InitCommonControlsExType)(const LPINITCOMMONCONTROLSEX lpInitCtrls); - InitCommonControlsExType fn_InitCommonControlsEx; - - void InitCommonControls(); - - BOOL m_bNewSubclassing; - // comctl32.dll version 6 window proc static LRESULT CALLBACK SharedWindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, diff --git a/jdk/src/windows/native/sun/windows/Devices.cpp b/jdk/src/windows/native/sun/windows/Devices.cpp index 8bcee15b877..79b36b3f1a8 100644 --- a/jdk/src/windows/native/sun/windows/Devices.cpp +++ b/jdk/src/windows/native/sun/windows/Devices.cpp @@ -83,9 +83,83 @@ #include "Devices.h" #include "Trace.h" -#include "awt_Multimon.h" #include "D3DPipelineManager.h" + +/* Some helper functions (from awt_MMStub.h/cpp) */ + +int g_nMonitorCounter; +int g_nMonitorLimit; +HMONITOR* g_hmpMonitors; + +// Callback for CountMonitors below +BOOL WINAPI clb_fCountMonitors(HMONITOR hMon, HDC hDC, LPRECT rRect, LPARAM lP) +{ + g_nMonitorCounter ++; + return TRUE; +} + +int WINAPI CountMonitors(void) +{ + g_nMonitorCounter = 0; + ::EnumDisplayMonitors(NULL, NULL, clb_fCountMonitors, 0L); + return g_nMonitorCounter; + +} + +// Callback for CollectMonitors below +BOOL WINAPI clb_fCollectMonitors(HMONITOR hMon, HDC hDC, LPRECT rRect, LPARAM lP) +{ + + if ((g_nMonitorCounter < g_nMonitorLimit) && (NULL != g_hmpMonitors)) { + g_hmpMonitors[g_nMonitorCounter] = hMon; + g_nMonitorCounter ++; + } + + return TRUE; +} + +int WINAPI CollectMonitors(HMONITOR* hmpMonitors, int nNum) +{ + int retCode = 0; + + if (NULL != hmpMonitors) { + + g_nMonitorCounter = 0; + g_nMonitorLimit = nNum; + g_hmpMonitors = hmpMonitors; + + ::EnumDisplayMonitors(NULL, NULL, clb_fCollectMonitors, 0L); + + retCode = g_nMonitorCounter; + + g_nMonitorCounter = 0; + g_nMonitorLimit = 0; + g_hmpMonitors = NULL; + + } + return retCode; +} + +BOOL WINAPI MonitorBounds(HMONITOR hmMonitor, RECT* rpBounds) +{ + BOOL retCode = FALSE; + + if ((NULL != hmMonitor) && (NULL != rpBounds)) { + MONITORINFOEX miInfo; + + memset((void*)(&miInfo), 0, sizeof(MONITORINFOEX)); + miInfo.cbSize = sizeof(MONITORINFOEX); + + if (TRUE == (retCode = ::GetMonitorInfo(hmMonitor, &miInfo))) { + (*rpBounds) = miInfo.rcMonitor; + } + } + return retCode; +} + +/* End of helper functions */ + Devices* Devices::theInstance = NULL; CriticalSection Devices::arrayLock; @@ -113,9 +187,9 @@ BOOL Devices::UpdateInstance(JNIEnv *env) { J2dTraceLn(J2D_TRACE_INFO, "Devices::UpdateInstance"); - int numScreens = ::CountMonitors(); - MHND *monHds = (MHND *)safe_Malloc(numScreens * sizeof(MHND)); - if (numScreens != ::CollectMonitors(monHds, numScreens)) { + int numScreens = CountMonitors(); + HMONITOR *monHds = (HMONITOR *)safe_Malloc(numScreens * sizeof(HMONITOR)); + if (numScreens != CollectMonitors(monHds, numScreens)) { J2dRlsTraceLn(J2D_TRACE_ERROR, "Devices::UpdateInstance: Failed to get all "\ "monitor handles."); diff --git a/jdk/src/windows/native/sun/windows/Devices.h b/jdk/src/windows/native/sun/windows/Devices.h index 949bfdb2d26..34e359aa446 100644 --- a/jdk/src/windows/native/sun/windows/Devices.h +++ b/jdk/src/windows/native/sun/windows/Devices.h @@ -1,5 +1,5 @@ /* - * Copyright 2001-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. 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 @@ -70,4 +70,8 @@ static CriticalSection arrayLock; }; +// Some helper functions (from awt_MMStub.h/cpp) + +BOOL WINAPI MonitorBounds (HMONITOR, RECT*); + #endif _DEVICES_H_ diff --git a/jdk/src/windows/native/sun/windows/GDIHashtable.cpp b/jdk/src/windows/native/sun/windows/GDIHashtable.cpp index a3bc8ebe7b6..25c0dac4507 100644 --- a/jdk/src/windows/native/sun/windows/GDIHashtable.cpp +++ b/jdk/src/windows/native/sun/windows/GDIHashtable.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. 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 @@ -25,7 +25,6 @@ #include "GDIHashtable.h" #include "awt_GDIObject.h" -#include "awt_dlls.h" GDIHashtable::BatchDestructionManager GDIHashtable::manager; @@ -46,7 +45,6 @@ void GDIHashtable::release(void* key) { DASSERT(value != NULL); m_deleteProc(value); } - manager.update(); } void GDIHashtable::flush() { @@ -128,9 +126,6 @@ void GDIHashtable::List::clear() { } } -#undef GFSR_GDIRESOURCES -#define GFSR_GDIRESOURCES 0x0001 - GDIHashtable::BatchDestructionManager::BatchDestructionManager(UINT nFirstThreshold, UINT nSecondThreshold, UINT nDestroyPeriod) : @@ -138,48 +133,6 @@ GDIHashtable::BatchDestructionManager::BatchDestructionManager(UINT nFirstThresh m_nSecondThreshold(nSecondThreshold), m_nDestroyPeriod(nDestroyPeriod), m_nCounter(0), - m_bBatchingEnabled(TRUE) { - load_rsrc32_procs(); -} - -void GDIHashtable::BatchDestructionManager::update() { - - if (get_free_system_resources != NULL) { - - CriticalSection::Lock l(m_managerLock); - - if (m_nCounter < 0) { - UINT nFreeResources = (*get_free_system_resources)(GFSR_GDIRESOURCES); - /* - * If m_bBatchingEnabled is FALSE there is no need - * to flush since we have been destroying all - * GDI resources as soon as they were released. - */ - if (m_bBatchingEnabled) { - if (nFreeResources < m_nFirstThreshold) { - flushAll(); - nFreeResources = (*get_free_system_resources)(GFSR_GDIRESOURCES); - } - } - if (nFreeResources < m_nSecondThreshold) { - m_bBatchingEnabled = FALSE; - m_nCounter = m_nDestroyPeriod; - } else { - m_bBatchingEnabled = TRUE; - /* - * The frequency of checks must depend on the currect amount - * of free space in GDI heaps. Otherwise we can run into the - * Resource Meter warning dialog when GDI resources are low. - * This is a heuristic rule that provides this dependency. - * These numbers have been chosen because: - * Resource Meter posts a warning dialog when less than 10% - * of GDI resources are free. - * 5 pens/brushes take 1%. So 3 is the upper bound. - * When changing this rule you should check that performance - * isn't affected (with Caffeine Mark and JMark). - */ - m_nCounter = (nFreeResources - 10) * 3; - } - } - } + m_bBatchingEnabled(TRUE) +{ } diff --git a/jdk/src/windows/native/sun/windows/GDIHashtable.h b/jdk/src/windows/native/sun/windows/GDIHashtable.h index 406a59e230a..a324fd97e24 100644 --- a/jdk/src/windows/native/sun/windows/GDIHashtable.h +++ b/jdk/src/windows/native/sun/windows/GDIHashtable.h @@ -1,5 +1,5 @@ /* - * Copyright 1999 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. 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 @@ -151,12 +151,6 @@ class GDIHashtable : public Hashtable { */ INLINE void decrementCounter() { m_nCounter--; } - /** - * Depending on the amount of free space in GDI heaps flushes - * all GDIHashtables and sets the initial counter value. - */ - void update(); - INLINE CriticalSection& getLock() { return m_managerLock; } }; diff --git a/jdk/src/windows/native/sun/windows/ShellFolder2.cpp b/jdk/src/windows/native/sun/windows/ShellFolder2.cpp index 7ed24aadb8a..3baf5bcf9b9 100644 --- a/jdk/src/windows/native/sun/windows/ShellFolder2.cpp +++ b/jdk/src/windows/native/sun/windows/ShellFolder2.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2008 Sun Microsystems, Inc. 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 @@ -31,17 +31,27 @@ // This file should stand independent of AWT and should ultimately be // put into its own DLL. #include -#endif +#else +// Include jni_util.h first, so JNU_* macros can be redefined +#include "jni_util.h" +// Borrow some macros from awt.h +#define JNU_NewStringPlatform(env, x) env->NewString(reinterpret_cast(x), static_cast(_tcslen(x))) +#define JNU_GetStringPlatformChars(env, x, y) reinterpret_cast(env->GetStringChars(x, y)) +#define JNU_ReleaseStringPlatformChars(env, x, y) env->ReleaseStringChars(x, reinterpret_cast(y)) +#endif // DEBUG #include #include #include -#include "jni_util.h" #include "jlong.h" #include "alloc.h" #include "stdhdrs.h" -#include "UnicowsLoader.h" + +// Copy from shlguid.h which is no longer in PlatformSDK +#ifndef DEFINE_SHLGUID +#define DEFINE_SHLGUID(name, l, w1, w2) DEFINE_GUID(name, l, w1, w2, 0xC0, 0, 0, 0, 0, 0, 0, 0x46) +#endif // {93F2F68C-1D1B-11d3-A30E-00C04F79ABD1} DEFINE_GUID(IID_IShellFolder2, 0x93f2f68c, 0x1d1b, 0x11d3, 0xa3, 0xe, 0x0, 0xc0, 0x4f, 0x79, 0xab, 0xd1); @@ -86,13 +96,15 @@ static jfieldID FID_folderType; static IMalloc* pMalloc; static IShellFolder* pDesktop; -static BOOL isXP; - -// copied from awt.h, because it is not included in release -#if defined (WIN32) - #define IS_WINVISTA (!(::GetVersion() & 0x80000000) && LOBYTE(LOWORD(::GetVersion())) >= 6) -#else - #define IS_WINVISTA FALSE +// Some macros from awt.h, because it is not included in release +#ifndef IS_WIN2000 +#define IS_WIN2000 (LOBYTE(LOWORD(::GetVersion())) >= 5) +#endif +#ifndef IS_WINXP +#define IS_WINXP ((IS_WIN2000 && HIBYTE(LOWORD(::GetVersion())) >= 1) || LOBYTE(LOWORD(::GetVersion())) > 5) +#endif +#ifndef IS_WINVISTA +#define IS_WINVISTA (!(::GetVersion() & 0x80000000) && LOBYTE(LOWORD(::GetVersion())) >= 6) #endif @@ -103,7 +115,6 @@ static BOOL initShellProcs() static HMODULE libShell32 = NULL; static HMODULE libUser32 = NULL; static HMODULE libComCtl32 = NULL; - static HMODULE libUnicows = UnicowsLoader::GetModuleHandle(); // If already initialized, return TRUE if (libShell32 != NULL && libUser32 != NULL) { return TRUE; @@ -130,7 +141,7 @@ static BOOL initShellProcs() // Set up procs - libShell32 fn_FindExecutable = (FindExecutableType)GetProcAddress( - (libUnicows ? libUnicows : libShell32), "FindExecutableW"); + libShell32, "FindExecutableW"); if (fn_FindExecutable == NULL) { return FALSE; } @@ -140,7 +151,7 @@ static BOOL initShellProcs() return FALSE; } fn_SHGetFileInfo = (SHGetFileInfoType)GetProcAddress( - (libUnicows ? libUnicows : libShell32), "SHGetFileInfoW"); + libShell32, "SHGetFileInfoW"); if (fn_SHGetFileInfo == NULL) { return FALSE; } @@ -154,7 +165,7 @@ static BOOL initShellProcs() return FALSE; } fn_SHGetPathFromIDList = (SHGetPathFromIDListType)GetProcAddress( - (libUnicows ? libUnicows : libShell32), "SHGetPathFromIDListW"); + libShell32, "SHGetPathFromIDListW"); if (fn_SHGetPathFromIDList == NULL) { return FALSE; } @@ -181,19 +192,19 @@ static BOOL initShellProcs() static jstring jstringFromSTRRET(JNIEnv* env, LPITEMIDLIST pidl, STRRET* pStrret) { switch (pStrret->uType) { case STRRET_CSTR : - return JNU_NewStringPlatform(env, pStrret->cStr); + return JNU_NewStringPlatform(env, reinterpret_cast(pStrret->cStr)); case STRRET_OFFSET : // Note : this may need to be WCHAR instead return JNU_NewStringPlatform(env, (CHAR*)pidl + pStrret->uOffset); case STRRET_WSTR : - return env->NewString(pStrret->pOleStr, + return env->NewString(reinterpret_cast(pStrret->pOleStr), static_cast(wcslen(pStrret->pOleStr))); } return NULL; } // restoring the original definition -#define JNU_NewStringPlatform(env, x) env->NewString(x, static_cast(_tcslen(x))) +#define JNU_NewStringPlatform(env, x) env->NewString(reinterpret_cast(x), static_cast(_tcslen(x))) /* * Class: sun_awt_shell_Win32ShellFolder2 @@ -212,13 +223,6 @@ JNIEXPORT void JNICALL Java_sun_awt_shell_Win32ShellFolder2_initIDs MID_relativePIDL = env->GetMethodID(cls, "setRelativePIDL", "(J)V"); FID_displayName = env->GetFieldID(cls, "displayName", "Ljava/lang/String;"); FID_folderType = env->GetFieldID(cls, "folderType", "Ljava/lang/String;"); - - // Find out if we are on XP or later - long version = GetVersion(); - isXP = (!(version & 0x80000000) && - (LOBYTE(LOWORD(version)) == 5 && - HIBYTE(LOWORD(version)) >= 1) || - LOBYTE(LOWORD(version)) > 5); } static IShellIcon* getIShellIcon(IShellFolder* pIShellFolder) { @@ -669,46 +673,24 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_getLinkLocation if (!CoInit(doCoUninit)) { return 0; } - if (IS_NT) { - IShellLinkW* psl; - hres = ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkW, (LPVOID *)&psl); + IShellLinkW* psl; + hres = ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkW, (LPVOID *)&psl); + if (SUCCEEDED(hres)) { + IPersistFile* ppf; + hres = psl->QueryInterface(IID_IPersistFile, (void**)&ppf); if (SUCCEEDED(hres)) { - IPersistFile* ppf; - hres = psl->QueryInterface(IID_IPersistFile, (void**)&ppf); + hres = ppf->Load(wstr, STGM_READ); if (SUCCEEDED(hres)) { - hres = ppf->Load(wstr, STGM_READ); - if (SUCCEEDED(hres)) { - if (resolve) { - hres = psl->Resolve(NULL, 0); - // Ignore failure - } - pidl = (LPITEMIDLIST)NULL; - hres = psl->GetIDList(&pidl); + if (resolve) { + hres = psl->Resolve(NULL, 0); + // Ignore failure } - ppf->Release(); + pidl = (LPITEMIDLIST)NULL; + hres = psl->GetIDList(&pidl); } - psl->Release(); - } - } else { - IShellLinkA* psl; - hres = ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkA, (LPVOID *)&psl); - if (SUCCEEDED(hres)) { - IPersistFile* ppf; - hres = psl->QueryInterface(IID_IPersistFile, (void**)&ppf); - if (SUCCEEDED(hres)) { - hres = ppf->Load(wstr, STGM_READ); - if (SUCCEEDED(hres)) { - if (resolve) { - hres = psl->Resolve(NULL, 0); - // Ignore failure - } - pidl = (LPITEMIDLIST)NULL; - hres = psl->GetIDList(&pidl); - } - ppf->Release(); - } - psl->Release(); + ppf->Release(); } + psl->Release(); } if (doCoUninit) { ::CoUninitialize(); @@ -742,10 +724,10 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_parseDisplayName0 int nLength = env->GetStringLength(jname); jchar* wszPath = new jchar[nLength + 1]; const jchar* strPath = env->GetStringChars(jname, NULL); - wcsncpy(wszPath, strPath, nLength); + wcsncpy(reinterpret_cast(wszPath), reinterpret_cast(strPath), nLength); wszPath[nLength] = 0; HRESULT res = pIShellFolder->ParseDisplayName(NULL, NULL, - const_cast(wszPath), NULL, &pIDL, NULL); + reinterpret_cast(wszPath), NULL, &pIDL, NULL); if (res != S_OK) { JNU_ThrowIOException(env, "Could not parse name"); pIDL = 0; @@ -804,7 +786,7 @@ JNIEXPORT jstring JNICALL Java_sun_awt_shell_Win32ShellFolder2_getExecutableType (JNIEnv* env, jobject folder, jstring path) { TCHAR szBuf[MAX_PATH]; - LPCTSTR szPath = (LPCTSTR)JNU_GetStringPlatformChars(env, path, NULL); + LPCTSTR szPath = JNU_GetStringPlatformChars(env, path, NULL); if (szPath == NULL) { return NULL; } @@ -827,7 +809,7 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_getIcon { HICON hIcon = NULL; SHFILEINFO fileInfo; - LPCTSTR pathStr = (LPCTSTR)JNU_GetStringPlatformChars(env, absolutePath, NULL); + LPCTSTR pathStr = JNU_GetStringPlatformChars(env, absolutePath, NULL); if (fn_SHGetFileInfo(pathStr, 0L, &fileInfo, sizeof(fileInfo), SHGFI_ICON | (getLargeIcon ? 0 : SHGFI_SMALLICON)) != 0) { hIcon = fileInfo.hIcon; @@ -890,52 +872,27 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_extractIcon } HRESULT hres; - if (IS_NT) { - IExtractIconW* pIcon; - hres = pIShellFolder->GetUIObjectOf(NULL, 1, const_cast(&pidl), + IExtractIconW* pIcon; + hres = pIShellFolder->GetUIObjectOf(NULL, 1, const_cast(&pidl), IID_IExtractIconW, NULL, (void**)&pIcon); + if (SUCCEEDED(hres)) { + WCHAR szBuf[MAX_PATH]; + INT index; + UINT flags; + hres = pIcon->GetIconLocation(GIL_FORSHELL, szBuf, MAX_PATH, &index, &flags); if (SUCCEEDED(hres)) { - WCHAR szBuf[MAX_PATH]; - INT index; - UINT flags; - hres = pIcon->GetIconLocation(GIL_FORSHELL, szBuf, MAX_PATH, &index, &flags); + HICON hIconLarge; + hres = pIcon->Extract(szBuf, index, &hIconLarge, &hIcon, (16 << 16) + 32); if (SUCCEEDED(hres)) { - HICON hIconLarge; - hres = pIcon->Extract(szBuf, index, &hIconLarge, &hIcon, (16 << 16) + 32); - if (SUCCEEDED(hres)) { - if (getLargeIcon) { - fn_DestroyIcon((HICON)hIcon); - hIcon = hIconLarge; - } else { - fn_DestroyIcon((HICON)hIconLarge); - } + if (getLargeIcon) { + fn_DestroyIcon((HICON)hIcon); + hIcon = hIconLarge; + } else { + fn_DestroyIcon((HICON)hIconLarge); } } - pIcon->Release(); - } - } else { - IExtractIconA* pIcon; - hres = pIShellFolder->GetUIObjectOf(NULL, 1, const_cast(&pidl), - IID_IExtractIconA, NULL, (void**)&pIcon); - if (SUCCEEDED(hres)) { - CHAR szBuf[MAX_PATH]; - INT index; - UINT flags; - hres = pIcon->GetIconLocation(GIL_FORSHELL, szBuf, MAX_PATH, &index, &flags); - if (SUCCEEDED(hres)) { - HICON hIconLarge; - hres = pIcon->Extract(szBuf, index, &hIconLarge, &hIcon, (16 << 16) + 32); - if (SUCCEEDED(hres)) { - if (getLargeIcon) { - fn_DestroyIcon((HICON)hIcon); - hIcon = hIconLarge; - } else { - fn_DestroyIcon((HICON)hIconLarge); - } - } - } - pIcon->Release(); } + pIcon->Release(); } if (doCoUninit) { ::CoUninitialize(); @@ -987,7 +944,7 @@ JNIEXPORT jintArray JNICALL Java_sun_awt_shell_Win32ShellFolder2_getIconBits // XP supports alpha in some icons, and depending on device. // This should take precedence over the icon mask bits. BOOL hasAlpha = FALSE; - if (isXP) { + if (IS_WINXP) { for (int i = 0; i < nBits; i++) { if ((colorBits[i] & 0xff000000) != 0) { hasAlpha = TRUE; @@ -1127,9 +1084,9 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_getIconResource (JNIEnv* env, jclass cls, jstring libName, jint iconID, jint cxDesired, jint cyDesired, jboolean useVGAColors) { - HINSTANCE libHandle = LoadLibrary(env->GetStringChars(libName, NULL)); + HINSTANCE libHandle = LoadLibrary(JNU_GetStringPlatformChars(env, libName, NULL)); if (libHandle != NULL) { - UINT fuLoad = (useVGAColors && !isXP) ? LR_VGACOLOR : 0; + UINT fuLoad = (useVGAColors && !IS_WINXP) ? LR_VGACOLOR : 0; return ptr_to_jlong(LoadImage(libHandle, MAKEINTRESOURCE(iconID), IMAGE_ICON, cxDesired, cyDesired, fuLoad)); diff --git a/jdk/src/windows/native/sun/windows/UnicowsLoader.cpp b/jdk/src/windows/native/sun/windows/UnicowsLoader.cpp deleted file mode 100644 index 7e147e209e6..00000000000 --- a/jdk/src/windows/native/sun/windows/UnicowsLoader.cpp +++ /dev/null @@ -1,430 +0,0 @@ -/* - * Copyright 2003-2005 Sun Microsystems, Inc. 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 - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - */ - -#include -#include "alloc.h" -#include "UnicowsLoader.h" - -/* - * Support functions for the Microsoft Layer for Unicode (MSLU). - * - * The MSLU maps the wide char version of Windows APIs with strings - * to their ANSI version equivalent on Win98/ME platforms. - * - * For more details on the MSLU, please refer to the MSDN webpage at: - * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/mslu/winprog/microsoft_layer_for_unicode_on_windows_95_98_me_systems.asp - */ - -// The MSLU module handle. Only initialized on Win9x/ME. -HMODULE UnicowsLoader::hmodUnicows = NULL; - -// MSLU loader entry point, which is called when the module -// is initialized. -extern "C" HMODULE (__stdcall *_PfnLoadUnicows)(void) = - &UnicowsLoader::LoadUnicows; - -// Overriede APIs that are not supported by MSLU. -extern "C" FARPROC Unicows_GetPrinterW = - (FARPROC)&UnicowsLoader::GetPrinterWImpl; -extern "C" FARPROC Unicows_EnumPrintersW = - (FARPROC)&UnicowsLoader::EnumPrintersWImpl; - -HMODULE __stdcall UnicowsLoader::LoadUnicows(void) -{ - if (hmodUnicows != NULL) { - return hmodUnicows; - } - - // Unfortunately, some DLLs that are loaded in conjunction with - // unicows.dll may blow the FPU's control word. So save it here. - unsigned int fpu_cw = _CW_DEFAULT; - fpu_cw = _control87(0, 0); - - // Loads the DLL, assuming that the DLL resides in the same directory - // as the AWT(_G).DLL. We cannot use "sun.boot.library.path" system - // property since there is no way to issue JNI calls at this point - // (JNI_OnLoad is not yet called so it cannot obtain JavaVM structure) - // - // To obtain the AWT module handle, call GetModuleHandleA() directly, - // instead of AwtToolkit.GetModuleHandle(). Otherwise it could cause - // an infinite loop if some W call were made inside AwtToolkit class - // initialization. - HMODULE hmodAWT = GetModuleHandleA("awt"); - LPSTR abspath = (LPSTR)safe_Malloc(MAX_PATH); - if (abspath != NULL) { - GetModuleFileNameA(hmodAWT, abspath, MAX_PATH); - *strrchr(abspath, '\\') = '\0'; - strcat(abspath, "\\unicows.dll"); - hmodUnicows = LoadLibraryA(abspath); - free(abspath); - } - - // Restore the FPU control word if needed. - if ( _control87(0, 0) != fpu_cw) { - _control87(fpu_cw, 0xfffff); - } - - return hmodUnicows; -} - -HMODULE UnicowsLoader::GetModuleHandle(void) -{ - return hmodUnicows; -} - - -// Convenient functions to convert DEVMODEA -> DEVMODEW -void UnicowsLoader::DevModeA2DevModeW( - const DEVMODEA * dma, - DEVMODEW * dmw) -{ - // convert string portions - ::MultiByteToWideChar(CP_ACP, 0, (CHAR *)dma->dmDeviceName, CCHDEVICENAME, - dmw->dmDeviceName, CCHDEVICENAME); - ::MultiByteToWideChar(CP_ACP, 0, (CHAR *)dma->dmFormName, CCHDEVICENAME, - dmw->dmFormName, CCHDEVICENAME); - - // copy driver specific data if exists - if (dma->dmDriverExtra != 0) { - PBYTE pExtraA = (PBYTE)(dma + 1); - PBYTE pExtraW = (PBYTE)(dmw + 1); - memcpy(pExtraW, pExtraA, dma->dmDriverExtra); - } - - // copy normal struct members - dmw->dmSpecVersion = dma->dmSpecVersion; - dmw->dmDriverVersion = dma->dmDriverVersion; - dmw->dmSize = dma->dmSize; - dmw->dmDriverExtra = dma->dmDriverExtra; - dmw->dmFields = dma->dmFields; - dmw->dmPosition = dma->dmPosition; - dmw->dmScale = dma->dmScale; - dmw->dmCopies = dma->dmCopies; - dmw->dmDefaultSource = dma->dmDefaultSource; - dmw->dmPrintQuality = dma->dmPrintQuality; - dmw->dmColor = dma->dmColor; - dmw->dmDuplex = dma->dmDuplex; - dmw->dmYResolution = dma->dmYResolution; - dmw->dmTTOption = dma->dmTTOption; - dmw->dmCollate = dma->dmCollate; - dmw->dmLogPixels = dma->dmLogPixels; - dmw->dmBitsPerPel = dma->dmBitsPerPel; - dmw->dmPelsWidth = dma->dmPelsWidth; - dmw->dmPelsHeight = dma->dmPelsHeight; - dmw->dmDisplayFlags = dma->dmDisplayFlags; - dmw->dmDisplayFrequency = dma->dmDisplayFrequency; -#if(WINVER >= 0x0400) - dmw->dmICMMethod = dma->dmICMMethod; - dmw->dmICMIntent = dma->dmICMIntent; - dmw->dmMediaType = dma->dmMediaType; - dmw->dmDitherType = dma->dmDitherType; - dmw->dmReserved1 = dma->dmReserved1; - dmw->dmReserved2 = dma->dmReserved2; -#if (WINVER >= 0x0500) || (_WIN32_WINNT >= 0x0400) - dmw->dmPanningWidth = dma->dmPanningWidth; - dmw->dmPanningHeight = dma->dmPanningHeight; -#endif -#endif /* WINVER >= 0x0400 */ -} - -// PRINTER_INFO_1 struct converter -void UnicowsLoader::PrinterInfo1A2W( - const LPPRINTER_INFO_1A pi1A, - LPPRINTER_INFO_1W pi1W, - const DWORD num) -{ - LPWSTR pwstrbuf = (LPWSTR)(pi1W + num); - DWORD current; - - // loop through all structures - for (current = 0; current < num; current ++) { - LPPRINTER_INFO_1A curPi1A = pi1A + current; - LPPRINTER_INFO_1W curPi1W = pi1W + current; - - // copy the structure itself - memcpy(curPi1W, curPi1A, sizeof(_PRINTER_INFO_1W)); - - // copy string members - StringA2W(curPi1A->pDescription, &(curPi1W->pDescription), &pwstrbuf); - StringA2W(curPi1A->pName, &(curPi1W->pName), &pwstrbuf); - StringA2W(curPi1A->pComment, &(curPi1W->pComment), &pwstrbuf); - } -} - -// PRINTER_INFO_2 struct converter -void UnicowsLoader::PrinterInfo2A2W( - const LPPRINTER_INFO_2A pi2A, - LPPRINTER_INFO_2W pi2W, - const DWORD num) -{ - PBYTE pbytebuf = (PBYTE)(pi2W + num); - DWORD current; - - // loop through all structures - for (current = 0; current < num; current ++) { - LPPRINTER_INFO_2A curPi2A = pi2A + current; - LPPRINTER_INFO_2W curPi2W = pi2W + current; - // copy the structure itself - memcpy(curPi2W, curPi2A, sizeof(_PRINTER_INFO_2W)); - - // copy string members - StringA2W(curPi2A->pServerName, &(curPi2W->pServerName), (LPWSTR *)&pbytebuf); - StringA2W(curPi2A->pPrinterName, &(curPi2W->pPrinterName), (LPWSTR *)&pbytebuf); - StringA2W(curPi2A->pShareName, &(curPi2W->pShareName), (LPWSTR *)&pbytebuf); - StringA2W(curPi2A->pPortName, &(curPi2W->pPortName), (LPWSTR *)&pbytebuf); - StringA2W(curPi2A->pDriverName, &(curPi2W->pDriverName), (LPWSTR *)&pbytebuf); - StringA2W(curPi2A->pComment, &(curPi2W->pComment), (LPWSTR *)&pbytebuf); - StringA2W(curPi2A->pLocation, &(curPi2W->pLocation), (LPWSTR *)&pbytebuf); - StringA2W(curPi2A->pSepFile, &(curPi2W->pSepFile), (LPWSTR *)&pbytebuf); - StringA2W(curPi2A->pPrintProcessor, &(curPi2W->pPrintProcessor), (LPWSTR *)&pbytebuf); - StringA2W(curPi2A->pDatatype, &(curPi2W->pDatatype), (LPWSTR *)&pbytebuf); - StringA2W(curPi2A->pParameters, &(curPi2W->pParameters), (LPWSTR *)&pbytebuf); - - // copy DEVMODE structure - if (curPi2A->pDevMode != NULL) { - curPi2W->pDevMode = (LPDEVMODEW)pbytebuf; - DevModeA2DevModeW(curPi2A->pDevMode, curPi2W->pDevMode); - pbytebuf += sizeof(DEVMODEW) + curPi2A->pDevMode->dmDriverExtra; - } - } -} - -// PRINTER_INFO_5 struct converter -void UnicowsLoader::PrinterInfo5A2W( - const LPPRINTER_INFO_5A pi5A, - LPPRINTER_INFO_5W pi5W, - const DWORD num) -{ - LPWSTR pbuf = (LPWSTR)(pi5W + num); - DWORD current; - - // loop through all structures - for (current = 0; current < num; current ++) { - LPPRINTER_INFO_5A curPi5A = pi5A + current; - LPPRINTER_INFO_5W curPi5W = pi5W + current; - - // copy the structure itself - memcpy(curPi5W, curPi5A, sizeof(_PRINTER_INFO_5W)); - - // copy string members - StringA2W(curPi5A->pPrinterName, &(curPi5W->pPrinterName), &pbuf); - StringA2W(curPi5A->pPortName, &(curPi5W->pPortName), &pbuf); - } -} - -// PRINTER_INFO_* struct converter. Supported levels are 1, 2, and 5. -void UnicowsLoader::PrinterInfoA2W( - const PVOID piA, - PVOID piW, - const DWORD Level, - const DWORD num) -{ - switch (Level) { - case 1: - PrinterInfo1A2W((LPPRINTER_INFO_1A)piA, (LPPRINTER_INFO_1W)piW, num); - break; - - case 2: - PrinterInfo2A2W((LPPRINTER_INFO_2A)piA, (LPPRINTER_INFO_2W)piW, num); - break; - - case 5: - PrinterInfo5A2W((LPPRINTER_INFO_5A)piA, (LPPRINTER_INFO_5W)piW, num); - break; - } -} - -// converts string members in PRINTER_INFO_* struct. -void UnicowsLoader::StringA2W( - LPCSTR pSrcA, - LPWSTR * ppwstrDest, - LPWSTR * ppwstrbuf) -{ - if (pSrcA != NULL) { - DWORD cchWideChar = ::MultiByteToWideChar(CP_ACP, 0, pSrcA, -1, NULL, 0); - *ppwstrDest = *ppwstrbuf; - ::MultiByteToWideChar(CP_ACP, 0, pSrcA, -1, *ppwstrbuf, cchWideChar); - *ppwstrbuf += cchWideChar; - } else { - *ppwstrDest = NULL; - } -} - -// GetPrinterW implementation. Level 1, 2, and 5 are the only supported levels. -BOOL __stdcall UnicowsLoader::GetPrinterWImpl( - HANDLE hPrinter, - DWORD Level, - LPBYTE pPrinter, - DWORD cbBuf, - LPDWORD pcbNeeded) -{ - if ((Level != 1) && (Level != 2) && (Level != 5)) { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; - } - - DWORD cbBufA = (cbBuf != 0 ? cbBuf / 2 : 0); // dirty estimation... - LPBYTE pPrinterA = NULL; - DWORD cbNeededA = 0; - BOOL ret; - - if (cbBufA != 0) { - pPrinterA = (LPBYTE)safe_Malloc(cbBufA); - memset(pPrinterA, 0, cbBufA); - } - - ret = ::GetPrinterA(hPrinter, Level, pPrinterA, cbBufA, &cbNeededA); - *pcbNeeded = cbNeededA * 2; // dirty estimation... - - if (pPrinterA != NULL) { - if (ret) { - PrinterInfoA2W(pPrinterA, pPrinter, Level, 1); - } - free(pPrinterA); - } - - return ret; -} - -// EnumPrintersW implementation. Level 1, 2, and 5 are the only supported levels. -BOOL __stdcall UnicowsLoader::EnumPrintersWImpl( - DWORD Flags, - LPWSTR Name, - DWORD Level, - LPBYTE pPrinterEnum, - DWORD cbBuf, - LPDWORD pcbNeeded, - LPDWORD pcReturned) -{ - if ((Level != 1) && (Level != 2) && (Level != 5)) { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; - } - - LPSTR pNameA = NULL; - DWORD cbBufA = (cbBuf != 0 ? cbBuf / 2 : 0); // dirty estimation... - LPBYTE pPrinterEnumA = NULL; - DWORD cbNeededA = 0; - BOOL ret; - - if (Name != NULL) { - DWORD len = static_cast(wcslen(Name)) + 1; - pNameA = (LPSTR)safe_Malloc(len); - ::WideCharToMultiByte(CP_ACP, 0, Name, -1, pNameA, len, NULL, NULL); - } - - if (cbBufA != 0) { - pPrinterEnumA = (LPBYTE)safe_Malloc(cbBufA); - memset(pPrinterEnumA, 0, cbBufA); - } - - ret = ::EnumPrintersA(Flags, pNameA, Level, pPrinterEnumA, - cbBufA, &cbNeededA, pcReturned); - *pcbNeeded = cbNeededA * 2; // dirty estimation... - - if (pPrinterEnumA != NULL) { - if (ret) { - PrinterInfoA2W(pPrinterEnumA, pPrinterEnum, Level, *pcReturned); - } - free(pPrinterEnumA); - } - - if (pNameA != NULL) { - free(pNameA); - } - - return ret; -} - -// wchar CRT implementations that VC6 does not support on Win9x. -// These implementations are used on both Win9x/ME *and* WinNT/2K/XP. -#undef _waccess -#undef _wchmod -#undef _wfullpath -#undef _wremove -#undef _wrename -#undef _wstat -#undef _wstati64 -#undef _wstat64 -#undef _wunlink -#undef _wfopen -#undef _wfreopen -#undef _wfsopen -#undef _wcreat -#undef _wopen -#undef _wsopen -#undef _wfindfirst -#undef _wfindfirst64 -#undef _wfindnext -#undef _wfindnext64 -#undef _wsystem -#undef _wexcel -#undef _wexcele -#undef _wexelp -#undef _wexelpe -#undef _wexecv -#undef _wexecve -#undef _wexecvp -#undef _wexecvpe -#undef _wpopen -#undef _wputenv -#undef _wspawnl -#undef _wspawnle -#undef _wspawnlp -#undef _wspawnlpe -#undef _wspawnv -#undef _wspawnve -#undef _wspawnvp -#undef _wspawnvpe - -// _wfullpath implementation -wchar_t * __cdecl UnicowsLoader::_wfullpathImpl( - wchar_t * absPath, - const wchar_t * relPath, - size_t maxLength) -{ - if (IS_NT) { - return _wfullpath(absPath, relPath, maxLength); - } else { - wchar_t * ret = NULL; - char * absPathA = (char *)safe_Malloc(maxLength); - char * relPathA = (char *)safe_Malloc(maxLength); - ::WideCharToMultiByte(CP_ACP, 0, relPath, -1, relPathA, - static_cast(maxLength), NULL, NULL); - - char * retA = _fullpath(absPathA, relPathA, maxLength); - - if (retA != NULL) { - ::MultiByteToWideChar(CP_ACP, 0, absPathA, -1, - absPath, static_cast(maxLength)); - ret = absPath; - } - - free(absPathA); - free(relPathA); - - return ret; - } -} diff --git a/jdk/src/windows/native/sun/windows/UnicowsLoader.h b/jdk/src/windows/native/sun/windows/UnicowsLoader.h deleted file mode 100644 index 50c48ca91a2..00000000000 --- a/jdk/src/windows/native/sun/windows/UnicowsLoader.h +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Copyright 2003-2004 Sun Microsystems, Inc. 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 - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - */ - -#ifndef UNICOWSLOADER_H -#define UNICOWSLOADER_H - -#if !defined(UNICODE) || !defined(_UNICODE) -#error UnicowsLoader module needs UNICODE and _UNICODE flags to be set on compiling -#endif - -#include - -// A class to load the Microsoft Layer for Unicode (unicows.dll) -class UnicowsLoader { -public: - // this is called when the client DLL (this case, AWT) is loaded - static HMODULE __stdcall LoadUnicows(void); - - // this is provided to pass the MSLU module handle - static HMODULE GetModuleHandle(void); - - // member functions that implements functions that MSLU does not support - static BOOL __stdcall GetPrinterWImpl(HANDLE, DWORD, LPBYTE, DWORD, LPDWORD); - static BOOL __stdcall EnumPrintersWImpl(DWORD, LPWSTR, DWORD, LPBYTE, - DWORD, LPDWORD, LPDWORD); - - // member functions that implements functions that VC6 CRT does not support - // on Win9x - static wchar_t * __cdecl _wfullpathImpl(wchar_t *, const wchar_t *, size_t); - -private: - // The module handle - static HMODULE hmodUnicows; - - // utility member functions - static void DevModeA2DevModeW(const DEVMODEA *, DEVMODEW *); - static void PrinterInfo1A2W(const LPPRINTER_INFO_1A, LPPRINTER_INFO_1W, const DWORD); - static void PrinterInfo2A2W(const LPPRINTER_INFO_2A, LPPRINTER_INFO_2W, const DWORD); - static void PrinterInfo5A2W(const LPPRINTER_INFO_5A, LPPRINTER_INFO_5W, const DWORD); - static void PrinterInfoA2W(const PVOID, PVOID, DWORD, DWORD); - static void StringA2W(LPCSTR, LPWSTR *, LPWSTR *); -}; - -#ifndef AWT_H -// copied from awt.h -#if defined (WIN32) - #define IS_WIN32 TRUE -#else - #define IS_WIN32 FALSE -#endif -#define IS_NT (IS_WIN32 && !(::GetVersion() & 0x80000000)) -#endif // AWT_H - -// Now the platform encoding is Unicode (UTF-16), re-define JNU_ functions -// to proper JNI functions. -#define JNU_NewStringPlatform(env, x) env->NewString(x, static_cast(_tcslen(x))) -#define JNU_GetStringPlatformChars(env, x, y) (LPWSTR)env->GetStringChars(x, y) -#define JNU_ReleaseStringPlatformChars(env, x, y) env->ReleaseStringChars(x, y) - -// The following Windows W-APIs are not supported by the MSLU. -// You need to implement a stub to use these APIs. Or, if it is -// apparent that the API is used only on WindowsNT/2K/XP, wrap -// the call site with #undef - #define, e.g: -// -// #undef SomeFunctionW -// call SomeFunctionW -// #define SomeFunctionW NotSupportedByMSLU - -#define AcquireCredentialsHandleW NotSupportedByMSLU -#define CreateNamedPipeW NotSupportedByMSLU -#define CryptAcquireContextW NotSupportedByMSLU -#define CryptEnumProvidersW NotSupportedByMSLU -#define CryptEnumProviderTypesW NotSupportedByMSLU -#define CryptGetDefaultProviderW NotSupportedByMSLU -#define CryptSetProviderW NotSupportedByMSLU -#define CryptSetProviderExW NotSupportedByMSLU -#define CryptSignHashW NotSupportedByMSLU -#define CryptVerifySignatureW NotSupportedByMSLU -#define EnumerateSecurityPackagesW NotSupportedByMSLU -#define EnumMonitorsW NotSupportedByMSLU -#define EnumPortsW NotSupportedByMSLU -#define EnumPrinterDriversW NotSupportedByMSLU -//#define EnumPrintersW NotSupportedByMSLU -#define EnumPrintProcessorDatatypesW NotSupportedByMSLU -#define EnumPrintProcessorsW NotSupportedByMSLU -#define FreeContextBufferW NotSupportedByMSLU -#define GetCharABCWidthsFloatW NotSupportedByMSLU -#define GetJobW NotSupportedByMSLU -#define GetOpenFileNamePreviewW NotSupportedByMSLU -//#define GetPrinterW NotSupportedByMSLU -#define GetPrinterDataW NotSupportedByMSLU -#define GetPrinterDriverW NotSupportedByMSLU -#define GetSaveFileNamePreviewW NotSupportedByMSLU -#define InitializeSecurityContextW NotSupportedByMSLU -#define mciSendCommandW NotSupportedByMSLU -#define mixerGetControlDetailsW NotSupportedByMSLU -#define mixerGetLineControlsW NotSupportedByMSLU -#define mixerGetLineInfoW NotSupportedByMSLU -#define mmioInstallIOProcW NotSupportedByMSLU -#define OleUIChangeSourceW NotSupportedByMSLU -#define OleUIConvertW NotSupportedByMSLU -#define OleUIEditLinksW NotSupportedByMSLU -#define OleUIInsertObjectW NotSupportedByMSLU -#define OleUIObjectPropertiesW NotSupportedByMSLU -#define OleUIPasteSpecialW NotSupportedByMSLU -#define OleUIPromptUserW NotSupportedByMSLU -#define OleUIUpdateLinksW NotSupportedByMSLU -#define PolyTextOutW NotSupportedByMSLU -#define QueryContextAttributesW NotSupportedByMSLU -#define QueryCredentialsAttributesW NotSupportedByMSLU -#define QuerySecurityPackageInfoW NotSupportedByMSLU -#define RasDeleteSubEntryW NotSupportedByMSLU -#define RasSetSubEntryPropertiesW NotSupportedByMSLU -#define ResetPrinterW NotSupportedByMSLU - -// The following Shell COM interfaces are not supported by the MSLU. -// See ShellFolder2.cpp -#define IID_IFileViewerW NotSupportedByMSLU -#define IID_IShellLinkW NotSupportedByMSLU -#define IID_IExtractIconW NotSupportedByMSLU -#define IID_IShellCopyHookW NotSupportedByMSLU -#define IID_IShellExecuteHookW NotSupportedByMSLU -#define IID_INewShortcutHookW NotSupportedByMSLU - -// The following CRT functions should fail on compiling, as it does not work on -// Win9x/ME platform. If you need these CRTs, write a wrapper for ANSI version -// equivalents, in which it converts to/from Unicode using WideCharToMultiByte. -// -// Or, if it is apparent that the function is used only on WindowsNT/2K/XP, wrap -// the call site with #undef - #define, e.g: -// -// #undef _wsomefunc -// call _wsomefunc -// #define _wsomefunc NotSupportedOnWin9X - -#define _waccess NotSupportedOnWin9X -#define _wchmod NotSupportedOnWin9X -#define _wfullpath UnicowsLoader::_wfullpathImpl -#define _wremove NotSupportedOnWin9X -#define _wrename NotSupportedOnWin9X -#define _wstat NotSupportedOnWin9X -#define _wstati64 NotSupportedOnWin9X -#define _wstat64 NotSupportedOnWin9X -#define _wunlink NotSupportedOnWin9X -#define _wfopen NotSupportedOnWin9X -#define _wfreopen NotSupportedOnWin9X -#define _wfsopen NotSupportedOnWin9X -#define _wcreat NotSupportedOnWin9X -#define _wopen NotSupportedOnWin9X -#define _wsopen NotSupportedOnWin9X -#define _wfindfirst NotSupportedOnWin9X -#define _wfindfirst64 NotSupportedOnWin9X -#define _wfindnext NotSupportedOnWin9X -#define _wfindnext64 NotSupportedOnWin9X -#define _wsystem NotSupportedOnWin9X -#define _wexcel NotSupportedOnWin9X -#define _wexcele NotSupportedOnWin9X -#define _wexelp NotSupportedOnWin9X -#define _wexelpe NotSupportedOnWin9X -#define _wexecv NotSupportedOnWin9X -#define _wexecve NotSupportedOnWin9X -#define _wexecvp NotSupportedOnWin9X -#define _wexecvpe NotSupportedOnWin9X -#define _wpopen NotSupportedOnWin9X -#define _wputenv NotSupportedOnWin9X -#define _wspawnl NotSupportedOnWin9X -#define _wspawnle NotSupportedOnWin9X -#define _wspawnlp NotSupportedOnWin9X -#define _wspawnlpe NotSupportedOnWin9X -#define _wspawnv NotSupportedOnWin9X -#define _wspawnve NotSupportedOnWin9X -#define _wspawnvp NotSupportedOnWin9X -#define _wspawnvpe NotSupportedOnWin9X - - -#endif // UNICOWSLOADER_H diff --git a/jdk/src/windows/native/sun/windows/WPrinterJob.cpp b/jdk/src/windows/native/sun/windows/WPrinterJob.cpp index 33395e43a49..d64a8e314f2 100644 --- a/jdk/src/windows/native/sun/windows/WPrinterJob.cpp +++ b/jdk/src/windows/native/sun/windows/WPrinterJob.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. 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 @@ -23,14 +23,14 @@ * have any questions. */ +#include "awt.h" + #include "stdhdrs.h" #include #include #include #include -#include "awt.h" -#include "awt_dlls.h" #include "awt_Toolkit.h" #include "awt_PrintControl.h" @@ -74,7 +74,6 @@ Java_sun_print_Win32PrintServiceLookup_getDefaultPrinterName(JNIEnv *env, TRY; TCHAR cBuffer[250]; - BOOL bFlag; OSVERSIONINFO osv; PRINTER_INFO_2 *ppi2 = NULL; DWORD dwNeeded = 0; @@ -86,39 +85,8 @@ Java_sun_print_Win32PrintServiceLookup_getDefaultPrinterName(JNIEnv *env, osv.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&osv); - // If Windows 95 or 98, use EnumPrinters... - if (osv.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { - - // The first EnumPrinters() tells you how big our buffer should - // be in order to hold ALL of PRINTER_INFO_2. Note that this will - // usually return FALSE. This only means that the buffer (the 4th - // parameter) was not filled in. You don't want it filled in here... - - EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 2, - NULL, 0, &dwNeeded, &dwReturned); - if (dwNeeded == 0) { - return NULL; - } - - // Allocate enough space for PRINTER_INFO_2... - ppi2 = (PRINTER_INFO_2 *)GlobalAlloc(GPTR, dwNeeded); - if (!ppi2) { - return NULL; - } - - // The second EnumPrinters() will fill in all the current information. - bFlag = EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 2, - (LPBYTE)ppi2, dwNeeded, &dwNeeded, &dwReturned); - if (!bFlag) { - GlobalFree(ppi2); - return NULL; - } - - jPrinterName = JNU_NewStringPlatform(env, ppi2->pPrinterName); - GlobalFree(ppi2); - return jPrinterName; - - } else if (osv.dwPlatformId == VER_PLATFORM_WIN32_NT) { + // If Windows 2000, XP, Vista + if (osv.dwPlatformId == VER_PLATFORM_WIN32_NT) { // Retrieve the default string from Win.ini (the registry). // String will be in form "printername,drivername,portname". @@ -165,62 +133,32 @@ Java_sun_print_Win32PrintServiceLookup_getAllPrinterNames(JNIEnv *env, jobjectArray nameArray; try { - if (IS_NT) { - ::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, - NULL, 4, NULL, 0, &cbNeeded, &cReturned); - pPrinterEnum = new BYTE[cbNeeded]; - ::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, - NULL, 4, pPrinterEnum, cbNeeded, &cbNeeded, - &cReturned); + ::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, + NULL, 4, NULL, 0, &cbNeeded, &cReturned); + pPrinterEnum = new BYTE[cbNeeded]; + ::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, + NULL, 4, pPrinterEnum, cbNeeded, &cbNeeded, + &cReturned); - if (cReturned > 0) { - nameArray = env->NewObjectArray(cReturned, clazz, NULL); - if (nameArray == NULL) { - throw std::bad_alloc(); - } - } else { - nameArray = NULL; - } - - - for (DWORD i = 0; i < cReturned; i++) { - PRINTER_INFO_4 *info4 = (PRINTER_INFO_4 *) - (pPrinterEnum + i * sizeof(PRINTER_INFO_4)); - utf_str = JNU_NewStringPlatform(env, info4->pPrinterName); - if (utf_str == NULL) { - throw std::bad_alloc(); - } - env->SetObjectArrayElement(nameArray, i, utf_str); - env->DeleteLocalRef(utf_str); + if (cReturned > 0) { + nameArray = env->NewObjectArray(cReturned, clazz, NULL); + if (nameArray == NULL) { + throw std::bad_alloc(); } } else { - ::EnumPrinters(PRINTER_ENUM_LOCAL, - NULL, 5, NULL, 0, &cbNeeded, &cReturned); - pPrinterEnum = new BYTE[cbNeeded]; - ::EnumPrinters(PRINTER_ENUM_LOCAL, - NULL, 5, pPrinterEnum, cbNeeded, &cbNeeded, - &cReturned); + nameArray = NULL; + } - if (cReturned > 0) { - nameArray = env->NewObjectArray(cReturned, clazz, NULL); - if (nameArray == NULL) { - throw std::bad_alloc(); - } - } else { - nameArray = NULL; - } - - - for (DWORD i = 0; i < cReturned; i++) { - PRINTER_INFO_5 *info5 = (PRINTER_INFO_5 *) - (pPrinterEnum + i * sizeof(PRINTER_INFO_5)); - utf_str = JNU_NewStringPlatform(env, info5->pPrinterName); - if (utf_str == NULL) { - throw std::bad_alloc(); - } - env->SetObjectArrayElement(nameArray, i, utf_str); - env->DeleteLocalRef(utf_str); + + for (DWORD i = 0; i < cReturned; i++) { + PRINTER_INFO_4 *info4 = (PRINTER_INFO_4 *) + (pPrinterEnum + i * sizeof(PRINTER_INFO_4)); + utf_str = JNU_NewStringPlatform(env, info4->pPrinterName); + if (utf_str == NULL) { + throw std::bad_alloc(); } + env->SetObjectArrayElement(nameArray, i, utf_str); + env->DeleteLocalRef(utf_str); } } catch (std::bad_alloc&) { delete [] pPrinterEnum; @@ -872,7 +810,7 @@ Java_sun_print_Win32PrintService_getDefaultSettings(JNIEnv *env, int numSizes = ::DeviceCapabilities(printerName, printerPort, DC_PAPERS, NULL, NULL); if (numSizes > 0) { - LPWORD papers = (LPWORD)safe_Malloc(numSizes * sizeof(WORD)); + LPTSTR papers = (LPTSTR)safe_Malloc(numSizes * sizeof(WORD)); if (papers != NULL && ::DeviceCapabilities(printerName, printerPort, DC_PAPERS, papers, NULL) != -1) { diff --git a/jdk/src/windows/native/sun/windows/awt.h b/jdk/src/windows/native/sun/windows/awt.h index 389aba67db3..cd4791fd257 100644 --- a/jdk/src/windows/native/sun/windows/awt.h +++ b/jdk/src/windows/native/sun/windows/awt.h @@ -26,10 +26,21 @@ #ifndef _AWT_H_ #define _AWT_H_ +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0600 +#endif + +#ifndef _WIN32_IE +#define _WIN32_IE 0x0600 +#endif + +//#ifndef NTDDI_VERSION +//#define NTDDI_VERSION NTDDI_LONGHORN +//#endif + #include "stdhdrs.h" #include "alloc.h" #include "awt_Debug.h" -#include "UnicowsLoader.h" extern COLORREF DesktopColor2RGB(int colorIndex); @@ -129,40 +140,23 @@ typedef AwtObject* PDATA; /* /NEW JNI */ /* - * IS_NT returns TRUE on NT, 2000, XP - * IS_WIN2000 returns TRUE on 2000, XP - * IS_WINXP returns TRUE on XP - * IS_WIN95 returns TRUE on 95, 98, ME - * IS_WIN98 returns TRUE on 98, ME - * IS_WINME returns TRUE on ME - * IS_WIN32 returns TRUE on 32-bit Pentium and - * 64-bit Itanium. * IS_WIN64 returns TRUE on 64-bit Itanium - * - * uname -s returns Windows_95 on 95 - * uname -s returns Windows_98 on 98 and ME - * uname -s returns Windows_NT on NT and 2000 and XP */ -#if defined (WIN32) - #define IS_WIN32 TRUE -#else - #define IS_WIN32 FALSE -#endif #if defined (_WIN64) #define IS_WIN64 TRUE #else #define IS_WIN64 FALSE #endif -#define IS_NT (IS_WIN32 && !(::GetVersion() & 0x80000000)) -#define IS_WIN2000 (IS_NT && LOBYTE(LOWORD(::GetVersion())) >= 5) -#define IS_WIN2003 (IS_NT && LOBYTE(LOWORD(::GetVersion())) == 5 && HIBYTE(LOWORD(::GetVersion())) >= 2) -#define IS_WINXP (IS_NT && (IS_WIN2000 && HIBYTE(LOWORD(::GetVersion())) >= 1) || LOBYTE(LOWORD(::GetVersion())) > 5) -#define IS_WINVISTA (IS_NT && LOBYTE(LOWORD(::GetVersion())) >= 6) -#define IS_WIN32S (IS_WIN32 && !IS_NT && LOBYTE(LOWORD(::GetVersion())) < 4) -#define IS_WIN95 (IS_WIN32 && !IS_NT && LOBYTE(LOWORD(::GetVersion())) >= 4) -#define IS_WIN98 (IS_WIN95 && HIBYTE(LOWORD(::GetVersion())) >= 10) -#define IS_WINME (IS_WIN95 && HIBYTE(LOWORD(::GetVersion())) >= 90) -#define IS_WIN4X (IS_WIN32 && LOBYTE(::GetVersion()) >= 4) + +/* + * IS_WIN2000 returns TRUE on 2000, XP and Vista + * IS_WINXP returns TRUE on XP and Vista + * IS_WINVISTA returns TRUE on Vista + */ +#define IS_WIN2000 (LOBYTE(LOWORD(::GetVersion())) >= 5) +#define IS_WINXP ((IS_WIN2000 && HIBYTE(LOWORD(::GetVersion())) >= 1) || LOBYTE(LOWORD(::GetVersion())) > 5) +#define IS_WINVISTA (LOBYTE(LOWORD(::GetVersion())) >= 6) + #define IS_WINVER_ATLEAST(maj, min) \ ((maj) < LOBYTE(LOWORD(::GetVersion())) || \ (maj) == LOBYTE(LOWORD(::GetVersion())) && \ @@ -177,6 +171,12 @@ typedef AwtObject* PDATA; extern JavaVM *jvm; +// Platform encoding is Unicode (UTF-16), re-define JNU_ functions +// to proper JNI functions. +#define JNU_NewStringPlatform(env, x) env->NewString(reinterpret_cast(x), static_cast(_tcslen(x))) +#define JNU_GetStringPlatformChars(env, x, y) reinterpret_cast(env->GetStringChars(x, y)) +#define JNU_ReleaseStringPlatformChars(env, x, y) env->ReleaseStringChars(x, reinterpret_cast(y)) + /* * Itanium symbols needed for 64-bit compilation. * These are defined in winuser.h in the August 2001 MSDN update. @@ -211,17 +211,12 @@ extern JavaVM *jvm; * NOTE: float.h must be defined if using these macros */ #define SAVE_CONTROLWORD \ - unsigned int fpu_cw = _CW_DEFAULT; \ - if (IS_WIN95) { \ - fpu_cw = _control87(0, 0); \ - } + unsigned int fpu_cw = _control87(0, 0); -#define RESTORE_CONTROLWORD \ - if (IS_WIN95) { \ - if ( _control87(0, 0) != fpu_cw) { \ - _control87(fpu_cw, 0xfffff); \ - } \ - } +#define RESTORE_CONTROLWORD \ + if (_control87(0, 0) != fpu_cw) { \ + _control87(fpu_cw, 0xffffffff); \ + } /* * checks if the current thread is/isn't the toolkit thread diff --git a/jdk/src/windows/native/sun/windows/awt_Button.cpp b/jdk/src/windows/native/sun/windows/awt_Button.cpp index e4895915df0..3764655cba4 100644 --- a/jdk/src/windows/native/sun/windows/awt_Button.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Button.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-2008 Sun Microsystems, Inc. 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 @@ -23,7 +23,7 @@ * have any questions. */ -#include +#include "awt.h" #include "awt_Object.h" /* wop_pDataID */ #include "awt_Toolkit.h" @@ -106,7 +106,7 @@ AwtButton* AwtButton::Create(jobject self, jobject parent) if (label == NULL) { labelStr = L""; } else { - labelStr = env->GetStringChars(label, JNI_FALSE); + labelStr = JNU_GetStringPlatformChars(env, label, JNI_FALSE); } style = 0; @@ -128,7 +128,7 @@ AwtButton* AwtButton::Create(jobject self, jobject parent) c->m_backgroundColorSet = TRUE; // suppress inheriting parent's color c->UpdateBackground(env, target); if (label != NULL) - env->ReleaseStringChars(label, labelStr); + JNU_ReleaseStringPlatformChars(env, label, labelStr); } catch (...) { env->DeleteLocalRef(target); if (label != NULL) diff --git a/jdk/src/windows/native/sun/windows/awt_Checkbox.cpp b/jdk/src/windows/native/sun/windows/awt_Checkbox.cpp index b0a73679d0b..2e8cf9923db 100644 --- a/jdk/src/windows/native/sun/windows/awt_Checkbox.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Checkbox.cpp @@ -23,6 +23,7 @@ * have any questions. */ +#include "awt.h" #include "awt_Toolkit.h" #include "awt_Checkbox.h" #include "awt_KeyboardFocusManager.h" @@ -106,7 +107,7 @@ AwtCheckbox* AwtCheckbox::Create(jobject peer, jobject parent) label = (jstring)env->GetObjectField(target, AwtCheckbox::labelID); if (label != NULL) { - labelStr = env->GetStringChars(label, 0); + labelStr = JNU_GetStringPlatformChars(env, label, 0); } if (labelStr != 0) { jint x = env->GetIntField(target, AwtComponent::xID); @@ -123,7 +124,7 @@ AwtCheckbox* AwtCheckbox::Create(jobject peer, jobject parent) peer); if (labelStr != defaultLabelStr) { - env->ReleaseStringChars(label, labelStr); + JNU_ReleaseStringPlatformChars(env, label, labelStr); } } else { throw std::bad_alloc(); diff --git a/jdk/src/windows/native/sun/windows/awt_Choice.cpp b/jdk/src/windows/native/sun/windows/awt_Choice.cpp index 27145ea6e6c..ca7adb0ed6e 100644 --- a/jdk/src/windows/native/sun/windows/awt_Choice.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Choice.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-2008 Sun Microsystems, Inc. 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 @@ -206,7 +206,7 @@ int AwtChoice::GetFieldHeight() fieldHeight =(int)::SendMessage(GetHWnd(), CB_GETITEMHEIGHT, (UINT)-1, 0); // add top and bottom border lines; border size is different for // Win 4.x (3d edge) vs 3.x (1 pixel line) - borderHeight = ::GetSystemMetrics(IS_WIN4X ? SM_CYEDGE : SM_CYBORDER); + borderHeight = ::GetSystemMetrics(SM_CYEDGE); fieldHeight += borderHeight*2; return fieldHeight; } @@ -424,6 +424,9 @@ AwtChoice::WmKillFocus(HWND hWndGotFocus) case mrPassAlong: return AwtComponent::WmKillFocus(hWndGotFocus); } + + DASSERT(false); // must never reach here + return mrDoDefault; } MsgRouting diff --git a/jdk/src/windows/native/sun/windows/awt_Color.cpp b/jdk/src/windows/native/sun/windows/awt_Color.cpp index b1c6cb90548..bc9b2f13f32 100644 --- a/jdk/src/windows/native/sun/windows/awt_Color.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Color.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1996-1999 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-2008 Sun Microsystems, Inc. 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 @@ -97,7 +97,7 @@ Java_sun_awt_windows_WColor_getDefaultColor(JNIEnv *env, jclass cls, iColor = COLOR_MENUTEXT; break; case sun_awt_windows_WColor_BUTTON_BKGND: - iColor = (IS_NT) ? COLOR_BTNFACE : COLOR_3DFACE; + iColor = COLOR_BTNFACE; break; case sun_awt_windows_WColor_BUTTON_TEXT: iColor = COLOR_BTNTEXT; diff --git a/jdk/src/windows/native/sun/windows/awt_Component.cpp b/jdk/src/windows/native/sun/windows/awt_Component.cpp index 5b017c97810..6f0df2e449f 100644 --- a/jdk/src/windows/native/sun/windows/awt_Component.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Component.cpp @@ -23,7 +23,8 @@ * have any questions. */ -#include "windows.h" +#include "awt.h" + #include #include @@ -42,7 +43,6 @@ #include "awt_MouseEvent.h" #include "awt_Palette.h" #include "awt_Toolkit.h" -#include "awt_Unicode.h" #include "awt_Window.h" #include "awt_Win32GraphicsDevice.h" #include "Hashtable.h" @@ -67,30 +67,10 @@ #include // Begin -- Win32 SDK include files -#include #include #include // End -- Win32 SDK include files -#ifndef GET_KEYSTATE_WPARAM // defined for (_WIN32_WINNT >= 0x0400) -#define GET_KEYSTATE_WPARAM(wParam) (LOWORD(wParam)) -#endif - -#ifndef GET_WHEEL_DELTA_WPARAM // defined for (_WIN32_WINNT >= 0x0500) -#define GET_WHEEL_DELTA_WPARAM(wParam) ((short)HIWORD(wParam)) -#endif - -// -#if !defined(__int3264) -#define GetWindowLongPtr GetWindowLong -#define SetWindowLongPtr SetWindowLong -#define GWLP_USERDATA GWL_USERDATA -#define GWLP_WNDPROC GWL_WNDPROC -typedef __int32 LONG_PTR; -typedef unsigned __int32 ULONG_PTR; -#endif // __int3264 -// - #include LPCTSTR szAwtComponentClassName = TEXT("SunAwtComponent"); @@ -207,9 +187,7 @@ LANGID AwtComponent::m_idLang = LOWORD(::GetKeyboardLayout(0)); UINT AwtComponent::m_CodePage = AwtComponent::LangToCodePage(m_idLang); -BOOL AwtComponent::m_isWin95 = IS_WIN95; -BOOL AwtComponent::m_isWin2000 = IS_WIN2000; -BOOL AwtComponent::m_isWinNT = IS_NT; +jint *AwtComponent::masks; static BOOL bLeftShiftIsDown = false; static BOOL bRightShiftIsDown = false; @@ -544,7 +522,7 @@ AwtComponent::CreateHWnd(JNIEnv *env, LPCWSTR title, jobject createError = NULL; if (dw == ERROR_OUTOFMEMORY) { - jstring errorMsg = env->NewStringUTF("too many window handles"); + jstring errorMsg = JNU_NewStringPlatform(env, L"too many window handles"); createError = JNU_NewObjectByName(env, "java/lang/OutOfMemoryError", "(Ljava/lang/String;)V", errorMsg); @@ -1201,6 +1179,9 @@ void SpyWinMessage(HWND hwnd, UINT message, LPCTSTR szComment) { WIN_MSG(WM_MBUTTONDOWN) WIN_MSG(WM_MBUTTONUP) WIN_MSG(WM_MBUTTONDBLCLK) + WIN_MSG(WM_XBUTTONDBLCLK) + WIN_MSG(WM_XBUTTONDOWN) + WIN_MSG(WM_XBUTTONUP) WIN_MSG(WM_MOUSEWHEEL) WIN_MSG(WM_PARENTNOTIFY) WIN_MSG(WM_ENTERMENULOOP) @@ -1347,17 +1328,9 @@ LRESULT AwtComponent::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) return (LRESULT)TRUE; } - UINT switchMessage; - if (IS_WIN95 && !IS_WIN98 && message == Wheel95GetMsg()) { - // Wheel message is generated dynamically on 95. A quick swap and - // we're good to go. - DTRACE_PRINTLN1("got wheel event on 95. msg is %i\n", message); - switchMessage = WM_MOUSEWHEEL; - } - else { - switchMessage = message; - } + DWORD curPos = 0; + UINT switchMessage = message; switch (switchMessage) { case WM_AWT_GETDC: { @@ -1644,67 +1617,87 @@ LRESULT AwtComponent::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) case WM_MBUTTONDOWN: case WM_MBUTTONDBLCLK: case WM_MBUTTONUP: + case WM_XBUTTONDBLCLK: + case WM_XBUTTONDOWN: + case WM_XBUTTONUP: case WM_MOUSEMOVE: case WM_MOUSEWHEEL: case WM_AWT_MOUSEENTER: case WM_AWT_MOUSEEXIT: - { - DWORD curPos = ::GetMessagePos(); + curPos = ::GetMessagePos(); POINT myPos; myPos.x = GET_X_LPARAM(curPos); myPos.y = GET_Y_LPARAM(curPos); ::ScreenToClient(GetHWnd(), &myPos); switch(switchMessage) { case WM_AWT_MOUSEENTER: - mr = WmMouseEnter(static_cast(wParam), myPos.x, myPos.y); break; + mr = WmMouseEnter(static_cast(wParam), myPos.x, myPos.y); + break; case WM_LBUTTONDOWN: case WM_LBUTTONDBLCLK: - mr = WmMouseDown(static_cast(wParam), myPos.x, myPos.y, - LEFT_BUTTON); break; - case WM_LBUTTONUP: - mr = WmMouseUp(static_cast(wParam), myPos.x, myPos.y, - LEFT_BUTTON); break; - case WM_MOUSEMOVE: - mr = WmMouseMove(static_cast(wParam), myPos.x, myPos.y); break; - case WM_MBUTTONDOWN: - case WM_MBUTTONDBLCLK: - mr = WmMouseDown(static_cast(wParam), myPos.x, myPos.y, - MIDDLE_BUTTON); break; - case WM_RBUTTONDOWN: - case WM_RBUTTONDBLCLK: - mr = WmMouseDown(static_cast(wParam), myPos.x, myPos.y, - RIGHT_BUTTON); break; - case WM_RBUTTONUP: - mr = WmMouseUp(static_cast(wParam), myPos.x, myPos.y, - RIGHT_BUTTON); - break; - case WM_MBUTTONUP: - mr = WmMouseUp(static_cast(wParam), myPos.x, myPos.y, - MIDDLE_BUTTON); - break; - case WM_AWT_MOUSEEXIT: - mr = WmMouseExit(static_cast(wParam), myPos.x, myPos.y); - break; - case WM_MOUSEWHEEL: - if (IS_WIN95 && !IS_WIN98) { - // On 95, the wParam doesn't contain the keystate flags, just - // the wheel rotation. The keystates are fetched in WmMouseWheel - // using GetJavaModifiers(). - mr = WmMouseWheel(0, - GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), - (int)wParam); - return FALSE; - } - else { + mr = WmMouseDown(static_cast(wParam), myPos.x, myPos.y, + LEFT_BUTTON); + break; + case WM_LBUTTONUP: + mr = WmMouseUp(static_cast(wParam), myPos.x, myPos.y, + LEFT_BUTTON); + break; + case WM_MOUSEMOVE: + mr = WmMouseMove(static_cast(wParam), myPos.x, myPos.y); + break; + case WM_MBUTTONDOWN: + case WM_MBUTTONDBLCLK: + mr = WmMouseDown(static_cast(wParam), myPos.x, myPos.y, + MIDDLE_BUTTON); + break; + case WM_XBUTTONDOWN: + case WM_XBUTTONDBLCLK: + if (AwtToolkit::GetInstance().areExtraMouseButtonsEnabled()) { + if (HIWORD(wParam) == 1) { + mr = WmMouseDown(static_cast(wParam), myPos.x, myPos.y, + X1_BUTTON); + } + if (HIWORD(wParam) == 2) { + mr = WmMouseDown(static_cast(wParam), myPos.x, myPos.y, + X2_BUTTON); + } + } + break; + case WM_XBUTTONUP: + if (AwtToolkit::GetInstance().areExtraMouseButtonsEnabled()) { + if (HIWORD(wParam) == 1) { + mr = WmMouseUp(static_cast(wParam), myPos.x, myPos.y, + X1_BUTTON); + } + if (HIWORD(wParam) == 2) { + mr = WmMouseUp(static_cast(wParam), myPos.x, myPos.y, + X2_BUTTON); + } + } + break; + case WM_RBUTTONDOWN: + case WM_RBUTTONDBLCLK: + mr = WmMouseDown(static_cast(wParam), myPos.x, myPos.y, + RIGHT_BUTTON); + break; + case WM_RBUTTONUP: + mr = WmMouseUp(static_cast(wParam), myPos.x, myPos.y, + RIGHT_BUTTON); + break; + case WM_MBUTTONUP: + mr = WmMouseUp(static_cast(wParam), myPos.x, myPos.y, + MIDDLE_BUTTON); + break; + case WM_AWT_MOUSEEXIT: + mr = WmMouseExit(static_cast(wParam), myPos.x, myPos.y); + break; + case WM_MOUSEWHEEL: mr = WmMouseWheel(GET_KEYSTATE_WPARAM(wParam), GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), GET_WHEEL_DELTA_WPARAM(wParam)); + break; } break; - } - } - break; - case WM_SETCURSOR: mr = mrDoDefault; if (LOWORD(lParam) == HTCLIENT) { @@ -2589,8 +2582,12 @@ MsgRouting AwtComponent::WmMouseMove(UINT flags, int x, int y) lastComp = this; lastX = x; lastY = y; - - if ( (flags & ALL_MK_BUTTONS) != 0 ) { + BOOL extraButtonsEnabled = AwtToolkit::GetInstance().areExtraMouseButtonsEnabled(); + if (((flags & (ALL_MK_BUTTONS)) != 0) || + (extraButtonsEnabled && (flags & (X_BUTTONS)) != 0)) +// if (( extraButtonsEnabled && ( (flags & (ALL_MK_BUTTONS | X_BUTTONS)) != 0 )) || +// ( !extraButtonsEnabled && (((flags & (ALL_MK_BUTTONS)) != 0 )) && ((flags & (X_BUTTONS)) == 0) )) + { // 6404008 : if Dragged event fired we shouldn't fire // Clicked event: m_firstDragSent set to TRUE. // This is a partial backout of 5039416 fix. @@ -2649,21 +2646,10 @@ MsgRouting AwtComponent::WmMouseWheel(UINT flags, int x, int y, jdouble preciseWheelRotation = (jdouble) wheelRotation / (-1 * WHEEL_DELTA); MSG msg; - - if (IS_WIN95 && !IS_WIN98) { - // 95 doesn't understand the SPI_GETWHEELSCROLLLINES - get the user - // preference by other means - DTRACE_PRINTLN("WmMouseWheel: using 95 branch"); - platformLines = Wheel95GetScrLines(); - result = true; - InitMessage(&msg, lastMessage, wheelRotation, MAKELPARAM(x, y)); - } - else { - result = ::SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, - &platformLines, 0); - InitMessage(&msg, lastMessage, MAKEWPARAM(flags, wheelRotation), - MAKELPARAM(x, y)); - } + result = ::SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, + &platformLines, 0); + InitMessage(&msg, lastMessage, MAKEWPARAM(flags, wheelRotation), + MAKELPARAM(x, y)); if (result) { if (platformLines == WHEEL_PAGESCROLL) { @@ -2743,156 +2729,21 @@ jint AwtComponent::GetShiftKeyLocation(UINT vkey, UINT flags) "AwtComponent::GetShiftKeyLocation vkey = %d = 0x%x scan = %d", vkey, vkey, keyScanCode); - if (m_isWinNT) { - leftShiftScancode = ::MapVirtualKey(VK_LSHIFT, 0); - rightShiftScancode = ::MapVirtualKey(VK_RSHIFT, 0); + leftShiftScancode = ::MapVirtualKey(VK_LSHIFT, 0); + rightShiftScancode = ::MapVirtualKey(VK_RSHIFT, 0); - if (keyScanCode == leftShiftScancode) { - return java_awt_event_KeyEvent_KEY_LOCATION_LEFT; - } - if (keyScanCode == rightShiftScancode) { - return java_awt_event_KeyEvent_KEY_LOCATION_RIGHT; - } - - DASSERT(false); - // Note: the above should not fail on NT (or 2000), - // but just in case it does, try the more complicated method - // we use for Win9x below. + if (keyScanCode == leftShiftScancode) { + return java_awt_event_KeyEvent_KEY_LOCATION_LEFT; + } + if (keyScanCode == rightShiftScancode) { + return java_awt_event_KeyEvent_KEY_LOCATION_RIGHT; } - // "Transition" bit = 0 if keyPressed, 1 if keyReleased - BOOL released = ((1<<15) & flags); + DASSERT(false); + // Note: the above should not fail on NT (or 2000) - DTRACE_PRINTLN2( - "AwtComponent::GetShiftKeyLocation bLeftShiftIsDown = %d bRightShiftIsDown == %d", - bLeftShiftIsDown, bRightShiftIsDown); - DTRACE_PRINTLN2( - "AwtComponent::GetShiftKeyLocation lastShiftKeyPressed = %d released = %d", - lastShiftKeyPressed, released); - - jint keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN; - - // It is possible for somebody to hold down one or both - // Shift keys, causing repeat key events. We need to - // handle all the cases. - // - // Just a side-note: if two or more keys are being held down, - // and then one key is released, whether more key presses are - // generated for the keys that are still held down depends on - // which keys they are, and whether you released the right or - // the left shift/ctrl/etc. key first. This also differs - // between Win9x and NT. Just plain screwy. - // - // Note: on my PC, the repeat count is always 1. Yup, we need - // 16 bits to handle that, all right. - - // Handle the case where only one of the Shift keys - // was down before this event took place - if (bLeftShiftIsDown && !bRightShiftIsDown) { - if (released) { - // This is a left Shift release - keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_LEFT; - } else { - // This is a right Shift press - keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_RIGHT; - } - } else if (!bLeftShiftIsDown && bRightShiftIsDown) { - if (released) { - // This is a right Shift release - keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_RIGHT; - } else { - // This is a left Shift press - keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_LEFT; - } - } - - // Handle the case where neither of the Shift keys - // were down before this event took place - if (!bLeftShiftIsDown && !bRightShiftIsDown) { - DASSERT(!released); - if (HIBYTE(::GetKeyState(VK_LSHIFT)) != 0) { - // This is a left Shift press - keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_LEFT; - } else if (HIBYTE(::GetKeyState(VK_RSHIFT)) != 0) { - // This is a right Shift press - keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_RIGHT; - } else { - DASSERT(false); - } - } - - // Handle the case where both Shift keys were down before - // this event took place - if (bLeftShiftIsDown && bRightShiftIsDown) { - // If this is a key release event, we can just check to see - // what the keyboard state is after the event - if (released) { - if (HIBYTE(::GetKeyState(VK_RSHIFT)) == 0) { - // This is a right Shift release - keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_RIGHT; - } else if (HIBYTE(::GetKeyState(VK_LSHIFT)) == 0) { - // This is a left Shift release - keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_LEFT; - } else { - DASSERT(false); - } - } else { - // If this is a key press event, and both Shift keys were - // already down, this is going to be a repeat of the last - // Shift press - if (lastShiftKeyPressed == VK_LSHIFT) { - keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_LEFT; - } else if (lastShiftKeyPressed == VK_RSHIFT) { - keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_RIGHT; - } else { - DASSERT(false); - } - } - } - - if (keyLocation == java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN) { - // Nothing we tried above worked for some reason. Sigh. - // Make a last-ditch effort to guess what happened: - // guess that the Shift scancodes are usually the same - // from system to system, even though this isn't guaranteed. - DTRACE_PRINTLN("Last-ditch effort at guessing Shift keyLocation"); - - // Tested on a couple of Windows keyboards: these are standard values - leftShiftScancode = 42; - rightShiftScancode = 54; - - if (keyScanCode == leftShiftScancode) { - keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_LEFT; - } else if (keyScanCode == rightShiftScancode) { - keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_RIGHT; - } - } - - // Set the Shift flags with the new key state. - bLeftShiftIsDown = (HIBYTE(::GetKeyState(VK_LSHIFT)) != 0); - bRightShiftIsDown = (HIBYTE(::GetKeyState(VK_RSHIFT)) != 0); - - // Update lastShiftKeyPressed - if (released) { - // At most one shift key is down now, so just check which one - if (bLeftShiftIsDown) { - lastShiftKeyPressed = VK_LSHIFT; - DASSERT(!bRightShiftIsDown); - } else if (bRightShiftIsDown) { - lastShiftKeyPressed = VK_RSHIFT; - } else { - lastShiftKeyPressed = 0; - } - } else { - // It was a press, so at least one shift key is down now - if (keyLocation == java_awt_event_KeyEvent_KEY_LOCATION_LEFT) { - lastShiftKeyPressed = VK_LSHIFT; - } else if (keyLocation == java_awt_event_KeyEvent_KEY_LOCATION_RIGHT) { - lastShiftKeyPressed = VK_RSHIFT; - } - } - - return keyLocation; + // default value + return java_awt_event_KeyEvent_KEY_LOCATION_LEFT; } /* Returns Java extended InputEvent modifieres. @@ -2914,7 +2765,7 @@ AwtComponent::GetJavaModifiers() modifiers |= java_awt_event_InputEvent_ALT_DOWN_MASK; } if (HIBYTE(::GetKeyState(VK_MBUTTON)) != 0) { - modifiers |= java_awt_event_InputEvent_BUTTON2_DOWN_MASK; + modifiers |= java_awt_event_InputEvent_BUTTON2_DOWN_MASK; } if (HIBYTE(::GetKeyState(VK_RBUTTON)) != 0) { modifiers |= java_awt_event_InputEvent_BUTTON3_DOWN_MASK; @@ -2922,6 +2773,13 @@ AwtComponent::GetJavaModifiers() if (HIBYTE(::GetKeyState(VK_LBUTTON)) != 0) { modifiers |= java_awt_event_InputEvent_BUTTON1_DOWN_MASK; } + + if (HIBYTE(::GetKeyState(VK_XBUTTON1)) != 0) { + modifiers |= masks[3]; + } + if (HIBYTE(::GetKeyState(VK_XBUTTON2)) != 0) { + modifiers |= masks[4]; + } return modifiers; } @@ -2936,6 +2794,11 @@ AwtComponent::GetButton(int mouseButton) return java_awt_event_MouseEvent_BUTTON2; case RIGHT_BUTTON: return java_awt_event_MouseEvent_BUTTON3; + case X1_BUTTON: //16 : + //just assign 4 and 5 numbers because MouseEvent class doesn't contain const identifier for them now + return 4; + case X2_BUTTON: //32 + return 5; } return java_awt_event_MouseEvent_NOBUTTON; } @@ -2950,6 +2813,10 @@ AwtComponent::GetButtonMK(int mouseButton) return MK_MBUTTON; case RIGHT_BUTTON: return MK_RBUTTON; + case X1_BUTTON: + return MK_XBUTTON1; + case X2_BUTTON: + return MK_XBUTTON2; } return 0; } @@ -2967,6 +2834,14 @@ AwtComponent::GetButtonMK(int mouseButton) #define VK_NONCONVERT 0x1D #endif +#ifndef VK_XBUTTON1 +#define VK_XBUTTON1 0x05 +#endif + +#ifndef VK_XBUTTON2 +#define VK_XBUTTON2 0x06 +#endif + typedef struct { UINT javaKey; UINT windowsKey; @@ -3786,22 +3661,6 @@ MsgRouting AwtComponent::WmChar(UINT character, UINT repCnt, UINT flags, // via WM_AWT_FORWARD_BYTE, but the Edit classes don't seem to // like that. - // Begin pollution - if (!m_isWinNT && IsDBCSLeadByteEx(GetCodePage(), BYTE(character))) { - if (GetDBCSEditHandle() != NULL) { - return mrDoDefault; - } else { - // Kludge: Some Chinese IMEs, e.g. QuanPin, sends two WM_CHAR - // messages for some punctuations (e.g. full stop) without sending - // WM_IME_CHAR message beforehand. - if (m_PendingLeadByte == 0) { - m_PendingLeadByte = character; - return mrConsume; - } - } - } - // End pollution - // We will simply create Java events here. UINT message = system ? WM_SYSCHAR : WM_CHAR; @@ -3861,43 +3720,8 @@ MsgRouting AwtComponent::WmChar(UINT character, UINT repCnt, UINT flags, MsgRouting AwtComponent::WmForwardChar(WCHAR character, LPARAM lParam, BOOL synthetic) { - if (m_isWinNT) { - // just post WM_CHAR with unicode key value - DefWindowProc(WM_CHAR, (WPARAM)character, lParam); - return mrConsume; - } - - // This message is sent from the Java key event handler. - CHAR mbChar[2] = {'\0', '\0'}; - - int cBytes = ::WideCharToMultiByte(GetCodePage(), 0, &character, 1, mbChar, 2, NULL, NULL); - if (cBytes!=1 && cBytes!=2) return mrConsume; - - HWND hDBCSEditHandle = GetDBCSEditHandle(); - - if (hDBCSEditHandle != NULL && cBytes==2) - { - // The first WM_CHAR message will get handled by the WmChar, but - // the second WM_CHAR message will get picked off by the Edit class. - // WmChar will never see it. - // If an Edit class gets a lead byte, it immediately calls PeekMessage - // and pulls the trail byte out of the message queue. - ::PostMessage(hDBCSEditHandle, WM_CHAR, mbChar[0] & 0x00ff, lParam); - ::PostMessage(hDBCSEditHandle, WM_CHAR, mbChar[1] & 0x00ff, lParam); - } - else - { - MSG* pMsg; - pMsg = CreateMessage(WM_CHAR, mbChar[0] & 0x00ff, lParam); - ::PostMessage(GetHWnd(), WM_AWT_FORWARD_BYTE, (WPARAM)synthetic, - (LPARAM)pMsg); - if (mbChar[1]) - { - pMsg = CreateMessage(WM_CHAR, mbChar[1] & 0x00ff, lParam); - ::PostMessage(GetHWnd(), WM_AWT_FORWARD_BYTE, (WPARAM)synthetic, - (LPARAM)pMsg); - } - } + // just post WM_CHAR with unicode key value + DefWindowProc(WM_CHAR, (WPARAM)character, lParam); return mrConsume; } @@ -3929,7 +3753,7 @@ void AwtComponent::OpenCandidateWindow(int x, int y) SetCandidateWindow(iCandType, x-rc.left, y-rc.top); } if (m_bitsCandType != 0) { - DefWindowProc(WM_IME_NOTIFY, IMN_OPENCANDIDATE, m_bitsCandType); + ::DefWindowProc(GetHWnd(), WM_IME_NOTIFY, IMN_OPENCANDIDATE, m_bitsCandType); } } @@ -4543,7 +4367,7 @@ MsgRouting AwtComponent::WmPrint(HDC hDC, LPARAM flags) // Special case for components with a sunken border. Windows does not // print the border correctly on PCL printers, so we have to do it ourselves. - if (IS_WIN4X && (GetStyleEx() & WS_EX_CLIENTEDGE)) { + if (GetStyleEx() & WS_EX_CLIENTEDGE) { RECT r; VERIFY(::GetWindowRect(GetHWnd(), &r)); VERIFY(::OffsetRect(&r, -r.left, -r.top)); @@ -4559,7 +4383,7 @@ MsgRouting AwtComponent::WmPrint(HDC hDC, LPARAM flags) * We will first print the non-client area with the original offset, * then the client area with a corrected offset. */ - if (IS_WIN4X && (GetStyleEx() & WS_EX_CLIENTEDGE)) { + if (GetStyleEx() & WS_EX_CLIENTEDGE) { int nEdgeWidth = ::GetSystemMetrics(SM_CXEDGE); int nEdgeHeight = ::GetSystemMetrics(SM_CYEDGE); @@ -5305,7 +5129,12 @@ void AwtComponent::SynthesizeMouseMessage(JNIEnv *env, jobject mouseEvent) if (modifiers & java_awt_event_InputEvent_BUTTON3_DOWN_MASK) { wLow |= MK_MBUTTON; } - + if (modifiers & X1_BUTTON) { + wLow |= GetButtonMK(X1_BUTTON); + } + if (modifiers & X2_BUTTON) { + wLow |= GetButtonMK(X2_BUTTON); + } wheelAmt = (jint)JNU_CallMethodByName(env, NULL, @@ -5319,18 +5148,8 @@ void AwtComponent::SynthesizeMouseMessage(JNIEnv *env, jobject mouseEvent) // convert Java wheel amount value to Win32 wheelAmt *= -1 * WHEEL_DELTA; - if (IS_WIN95 && !IS_WIN98) { - // 95 doesn't understand WM_MOUSEWHEEL, so plug in value of - // mouse wheel event on 95 - DTRACE_PRINTLN("awt_C::synthmm - 95 case"); - DASSERT(Wheel95GetMsg() != NULL); - message = Wheel95GetMsg(); - wParam = wheelAmt; - } - else { - message = WM_MOUSEWHEEL; - wParam = MAKEWPARAM(wLow, wheelAmt); - } + message = WM_MOUSEWHEEL; + wParam = MAKEWPARAM(wLow, wheelAmt); break; default: @@ -5445,45 +5264,6 @@ void AwtComponent::Enable(BOOL bEnable) VerifyState(); } -/* Initialization of MouseWheel support on Windows 95 */ -void AwtComponent::Wheel95Init() { - DASSERT(IS_WIN95 && !IS_WIN98); - - HWND mwHWND = NULL; - UINT wheelMSG = WM_NULL; - UINT suppMSG = WM_NULL; - UINT linesMSG = WM_NULL; - BOOL wheelActive; - INT lines; - - mwHWND = HwndMSWheel(&wheelMSG, &suppMSG, &linesMSG, &wheelActive, &lines); - if (mwHWND != WM_NULL) { - sm_95WheelMessage = wheelMSG; - sm_95WheelSupport = suppMSG; - } -} - -/* Win95 only - * Return the user's preferred number of lines of test to scroll when the - * mouse wheel is rotated. - */ -UINT AwtComponent::Wheel95GetScrLines() { - DASSERT(IS_WIN95 && !IS_WIN98); - DASSERT(sm_95WheelSupport != NULL); - - HWND mwHWND = NULL; - UINT linesMSG = WM_NULL; - INT numLines = 3; - - linesMSG = RegisterWindowMessage(MSH_SCROLL_LINES); - mwHWND = FindWindow(MSH_WHEELMODULE_CLASS, MSH_WHEELMODULE_TITLE); - - if (mwHWND && linesMSG) { - numLines = (INT)::SendMessage(mwHWND, linesMSG, 0, 0); - } - return numLines; -} - /* * associate an AwtDropTarget with this AwtComponent */ @@ -5983,7 +5763,7 @@ void AwtComponent::_SetFont(void *param) { AwtFont *awtFont = (AwtFont *)env->GetLongField(font, AwtFont::pDataID); if (awtFont == NULL) { - /*arguments of AwtFont::Create are changed for multifont component */ + /*arguments of AwtFont::Create are changed for multifont component */ awtFont = AwtFont::Create(env, font); } env->SetLongField(font, AwtFont::pDataID, (jlong)awtFont); @@ -6334,30 +6114,36 @@ void AwtComponent::_SetRectangularShape(void *param) c = (AwtComponent *)pData; if (::IsWindow(c->GetHWnd())) { - RGNDATA *pRgnData = NULL; - RGNDATAHEADER *pRgnHdr; + HRGN hRgn = NULL; - /* reserving memory for the worst case */ - size_t worstBufferSize = size_t(((x2 - x1) / 2 + 1) * (y2 - y1)); - pRgnData = (RGNDATA *) safe_Malloc(sizeof(RGNDATAHEADER) + - sizeof(RECT_T) * worstBufferSize); - pRgnHdr = (RGNDATAHEADER *) pRgnData; + if (region || x1 || x2 || y1 || y2) { + // If all the params are zeros, the shape must be simply reset. + // Otherwise, convert it into a region. + RGNDATA *pRgnData = NULL; + RGNDATAHEADER *pRgnHdr; - pRgnHdr->dwSize = sizeof(RGNDATAHEADER); - pRgnHdr->iType = RDH_RECTANGLES; - pRgnHdr->nRgnSize = 0; - pRgnHdr->rcBound.top = 0; - pRgnHdr->rcBound.left = 0; - pRgnHdr->rcBound.bottom = LONG(y2 - y1); - pRgnHdr->rcBound.right = LONG(x2 - x1); + /* reserving memory for the worst case */ + size_t worstBufferSize = size_t(((x2 - x1) / 2 + 1) * (y2 - y1)); + pRgnData = (RGNDATA *) safe_Malloc(sizeof(RGNDATAHEADER) + + sizeof(RECT_T) * worstBufferSize); + pRgnHdr = (RGNDATAHEADER *) pRgnData; - RECT_T * pRect = (RECT_T *) (((BYTE *) pRgnData) + sizeof(RGNDATAHEADER)); - pRgnHdr->nCount = RegionToYXBandedRectangles(env, x1, y1, x2, y2, region, &pRect, worstBufferSize); + pRgnHdr->dwSize = sizeof(RGNDATAHEADER); + pRgnHdr->iType = RDH_RECTANGLES; + pRgnHdr->nRgnSize = 0; + pRgnHdr->rcBound.top = 0; + pRgnHdr->rcBound.left = 0; + pRgnHdr->rcBound.bottom = LONG(y2 - y1); + pRgnHdr->rcBound.right = LONG(x2 - x1); - HRGN hRgn = ::ExtCreateRegion(NULL, - sizeof(RGNDATAHEADER) + sizeof(RECT_T) * pRgnHdr->nCount, pRgnData); + RECT_T * pRect = (RECT_T *) (((BYTE *) pRgnData) + sizeof(RGNDATAHEADER)); + pRgnHdr->nCount = RegionToYXBandedRectangles(env, x1, y1, x2, y2, region, &pRect, worstBufferSize); - free(pRgnData); + hRgn = ::ExtCreateRegion(NULL, + sizeof(RGNDATAHEADER) + sizeof(RECT_T) * pRgnHdr->nCount, pRgnData); + + free(pRgnData); + } ::SetWindowRgn(c->GetHWnd(), hRgn, TRUE); } @@ -6451,6 +6237,18 @@ JNIEXPORT void JNICALL Java_java_awt_Component_initIDs(JNIEnv *env, jclass cls) { TRY; + jclass inputEventClazz = env->FindClass("java/awt/event/InputEvent"); + jmethodID getButtonDownMasksID = env->GetStaticMethodID(inputEventClazz, "getButtonDownMasks", "()[I"); + jintArray obj = (jintArray)env->CallStaticObjectMethod(inputEventClazz, getButtonDownMasksID); + jint * tmp = env->GetIntArrayElements(obj, JNI_FALSE); + + jsize len = env->GetArrayLength(obj); + AwtComponent::masks = new jint[len]; + for (int i = 0; i < len; i++) { + AwtComponent::masks[i] = tmp[i]; + } + env->ReleaseIntArrayElements(obj, tmp, 0); + env->DeleteLocalRef(obj); /* class ids */ jclass peerCls = env->FindClass("sun/awt/windows/WComponentPeer"); @@ -7025,20 +6823,6 @@ Java_sun_awt_windows_WComponentPeer_isObscured(JNIEnv* env, CATCH_BAD_ALLOC_RET(NULL); } -/* - * Class: sun_awt_windows_WComponentPeer - * Method: wheelInit - * Signature: ()V - */ -JNIEXPORT void JNICALL -Java_sun_awt_windows_WComponentPeer_wheelInit(JNIEnv *env, jclass cls) -{ - // Only necessary on Win95 - if (IS_WIN95 && !IS_WIN98) { - AwtComponent::Wheel95Init(); - } -} - JNIEXPORT jboolean JNICALL Java_sun_awt_windows_WComponentPeer_processSynchronousLightweightTransfer(JNIEnv *env, jclass cls, jobject heavyweight, @@ -7217,7 +7001,9 @@ void AwtComponent::VerifyState() "getName", "()Ljava/lang/String;").l; DASSERT(!safe_ExceptionOccurred(env)); - printf("\t%S\n", TO_WSTRING(targetStr)); + LPCWSTR targetStrW = JNU_GetStringPlatformChars(env, targetStr, NULL); + printf("\t%S\n", targetStrW); + JNU_ReleaseStringPlatformChars(env, targetStr, targetStrW); } printf("\twas: [%d,%d,%dx%d]\n", x, y, width, height); if (!fSizeValid) { diff --git a/jdk/src/windows/native/sun/windows/awt_Component.h b/jdk/src/windows/native/sun/windows/awt_Component.h index f73980c28b4..0c18961ed49 100644 --- a/jdk/src/windows/native/sun/windows/awt_Component.h +++ b/jdk/src/windows/native/sun/windows/awt_Component.h @@ -53,6 +53,22 @@ const UINT MAX_ACP_STR_LEN = 7; // ANSI CP identifiers are no longer than this #define MIDDLE_BUTTON 2 #define RIGHT_BUTTON 4 #define DBL_CLICK 8 +#define X1_BUTTON 16 +#define X2_BUTTON 32 + +#ifndef MK_XBUTTON1 +#define MK_XBUTTON1 0x0020 +#endif + +#ifndef MK_XBUTTON2 +#define MK_XBUTTON2 0x0040 +#endif + +// combination of standard mouse button flags +const int ALL_MK_BUTTONS = MK_LBUTTON|MK_MBUTTON|MK_RBUTTON; +const int X_BUTTONS = MK_XBUTTON1|MK_XBUTTON2; + + // Whether to check for embedded frame and adjust location #define CHECK_EMBEDDED 0 @@ -81,11 +97,6 @@ enum MsgRouting { class AwtComponent : public AwtObject { public: - enum { - // combination of all mouse button flags - ALL_MK_BUTTONS = MK_LBUTTON|MK_MBUTTON|MK_RBUTTON - }; - /* java.awt.Component fields and method IDs */ static jfieldID peerID; static jfieldID xID; @@ -112,6 +123,7 @@ public: static jmethodID replaceSurfaceDataLaterMID; static const UINT WmAwtIsComponent; + static jint * masks; //InputEvent mask array AwtComponent(); virtual ~AwtComponent(); @@ -675,10 +687,6 @@ public: static HWND sm_focusOwner; static HWND sm_focusedWindow; - static BOOL m_isWin95; - static BOOL m_isWin2000; - static BOOL m_isWinNT; - static BOOL sm_bMenuLoop; static INLINE BOOL isMenuLoopActive() { return sm_bMenuLoop; diff --git a/jdk/src/windows/native/sun/windows/awt_Cursor.cpp b/jdk/src/windows/native/sun/windows/awt_Cursor.cpp index f524a465c01..c1f3d84e077 100644 --- a/jdk/src/windows/native/sun/windows/awt_Cursor.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Cursor.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. 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 @@ -79,10 +79,6 @@ AwtCursor::AwtCursor(JNIEnv *env, HCURSOR hCur, jobject jCur, int xH, int yH, custom = TRUE; dirty = FALSE; - - if (IsWin95Cursor()) { - customCursors.Add(this); - } } AwtCursor::~AwtCursor() @@ -96,9 +92,6 @@ void AwtCursor::Dispose() if (custom) { ::DestroyIcon(hCursor); - if (IsWin95Cursor()) { - customCursors.Remove(this); - } } JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); @@ -256,16 +249,6 @@ void AwtCursor::UpdateCursor(AwtComponent *comp) { env->DeleteLocalRef(jcomp); } -void AwtCursor::DirtyAllCustomCursors() { - if (IsWin95Cursor()) { - AwtObjectListItem *cur = customCursors.m_head; - while (cur != NULL) { - ((AwtCursor *)(cur->obj))->dirty = TRUE; - cur = cur->next; - } - } -} - void AwtCursor::Rebuild() { if (!dirty) { return; @@ -294,23 +277,6 @@ void AwtCursor::Rebuild() { dirty = FALSE; } -/* Bug fix for 4205805: - Custom cursor on WIN95 needs more effort, the same API works fine on NT - and WIN98. On Win95, DDB has to be passed in when calling createIconIndirect - Since DDB depends on the DISPLAY, we have to rebuild all the custom cursors - when user changes the display settings. -*/ -BOOL AwtCursor::IsWin95Cursor() { - static BOOL val; - static BOOL known = FALSE; - if (!known) { - val = (IS_WIN32 && !IS_NT && LOBYTE(LOWORD(::GetVersion())) == 4 && - HIBYTE(LOWORD(::GetVersion())) == 0); - known = TRUE; - } - return val; -} - extern "C" { /************************************************************************ diff --git a/jdk/src/windows/native/sun/windows/awt_Cursor.h b/jdk/src/windows/native/sun/windows/awt_Cursor.h index 7e59a899dcd..69c2931a2b8 100644 --- a/jdk/src/windows/native/sun/windows/awt_Cursor.h +++ b/jdk/src/windows/native/sun/windows/awt_Cursor.h @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. 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 @@ -66,7 +66,6 @@ public: } static AwtCursor * CreateSystemCursor(jobject jCursor); static void UpdateCursor(AwtComponent *comp); - static void DirtyAllCustomCursors(); static HCURSOR GetCursor(JNIEnv *env, AwtComponent *comp); static void setPData(jobject cursor, jlong pdata) { @@ -76,7 +75,6 @@ public: private: void Rebuild(); - static BOOL IsWin95Cursor(); HCURSOR hCursor; jweak jCursor; diff --git a/jdk/src/windows/native/sun/windows/awt_DataTransferer.cpp b/jdk/src/windows/native/sun/windows/awt_DataTransferer.cpp index 8cd5be4542e..b7225d1151f 100644 --- a/jdk/src/windows/native/sun/windows/awt_DataTransferer.cpp +++ b/jdk/src/windows/native/sun/windows/awt_DataTransferer.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2008 Sun Microsystems, Inc. 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 @@ -24,12 +24,11 @@ */ #include "awt.h" -#include "awt_dlls.h" #include "awt_DataTransferer.h" #include "awt_DnDDT.h" #include "awt_TextComponent.h" -#include "awt_Unicode.h" #include +#include #include #include @@ -271,9 +270,7 @@ Java_sun_awt_windows_WDataTransferer_dragQueryFile hdrop = (HDROP)bBytes; - load_shell_procs(); - - UINT nFilenames = (*do_drag_query_file)(hdrop, 0xFFFFFFFF, NULL, 0); + UINT nFilenames = ::DragQueryFile(hdrop, 0xFFFFFFFF, NULL, 0); jclass str_clazz = env->FindClass("java/lang/String"); DASSERT(str_clazz != NULL); @@ -287,12 +284,12 @@ Java_sun_awt_windows_WDataTransferer_dragQueryFile buffer = (LPTSTR)safe_Malloc(bufsize*sizeof(TCHAR)); for (UINT i = 0; i < nFilenames; i++) { - UINT size = (*do_drag_query_file)(hdrop, i, NULL, 0); + UINT size = ::DragQueryFile(hdrop, i, NULL, 0); if (size > bufsize) { bufsize = size; buffer = (LPTSTR)safe_Realloc(buffer, bufsize*sizeof(TCHAR)); } - (*do_drag_query_file)(hdrop, i, buffer, bufsize); + ::DragQueryFile(hdrop, i, buffer, bufsize); jstring name = JNU_NewStringPlatform(env, buffer); if (name == NULL) { @@ -401,7 +398,7 @@ Java_sun_awt_windows_WDataTransferer_platformImageBytesToImageData( case 4: case 8: nColorEntries = (pSrcBmih->biClrUsed != 0) ? - pSrcBmih->biClrUsed : 1 << (pSrcBmih->biBitCount - 1); + pSrcBmih->biClrUsed : (1 << pSrcBmih->biBitCount); break; case 16: case 24: @@ -454,11 +451,6 @@ Java_sun_awt_windows_WDataTransferer_platformImageBytesToImageData( width = p.x; height = -p.y; - // Win9X supports only 16-bit signed coordinates. - if (IS_WIN95) { - if (width > 0x7FFF) { width = 0x7FFF; } - if (height > 0x7FFF) { height = 0x7FFF; } - } free(lpemh); } break; diff --git a/jdk/src/windows/native/sun/windows/awt_Desktop.cpp b/jdk/src/windows/native/sun/windows/awt_Desktop.cpp index f232a728231..4462ca12e4f 100644 --- a/jdk/src/windows/native/sun/windows/awt_Desktop.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Desktop.cpp @@ -23,8 +23,8 @@ * have any questions. */ +#include "awt.h" #include -#include #include #include @@ -40,32 +40,32 @@ extern "C" { JNIEXPORT jstring JNICALL Java_sun_awt_windows_WDesktopPeer_ShellExecute (JNIEnv *env, jclass cls, jstring uri_j, jstring verb_j) { - const WCHAR* uri_c = env->GetStringChars(uri_j, JNI_FALSE); - const WCHAR* verb_c = env->GetStringChars(verb_j, JNI_FALSE); + LPCWSTR uri_c = JNU_GetStringPlatformChars(env, uri_j, JNI_FALSE); + LPCWSTR verb_c = JNU_GetStringPlatformChars(env, verb_j, JNI_FALSE); // 6457572: ShellExecute possibly changes FPU control word - saving it here unsigned oldcontrol87 = _control87(0, 0); - HINSTANCE retval = ShellExecuteW(NULL, verb_c, uri_c, NULL, NULL, SW_SHOWNORMAL); + HINSTANCE retval = ::ShellExecute(NULL, verb_c, uri_c, NULL, NULL, SW_SHOWNORMAL); _control87(oldcontrol87, 0xffffffff); - env->ReleaseStringChars(uri_j, uri_c); - env->ReleaseStringChars(verb_j, verb_c); + JNU_ReleaseStringPlatformChars(env, uri_j, uri_c); + JNU_ReleaseStringPlatformChars(env, verb_j, verb_c); if ((int)retval <= 32) { // ShellExecute failed. - LPVOID buffer; - int len = FormatMessageW( + LPTSTR buffer = NULL; + int len = ::FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language - (LPWSTR) &buffer, + (LPTSTR)&buffer, 0, NULL ); - jstring errmsg = env->NewString((LPCWSTR)buffer, len); + jstring errmsg = JNU_NewStringPlatform(env, buffer, len); LocalFree(buffer); return errmsg; } diff --git a/jdk/src/windows/native/sun/windows/awt_DesktopProperties.cpp b/jdk/src/windows/native/sun/windows/awt_DesktopProperties.cpp index 10c00fe2c29..1475dee38ab 100644 --- a/jdk/src/windows/native/sun/windows/awt_DesktopProperties.cpp +++ b/jdk/src/windows/native/sun/windows/awt_DesktopProperties.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. 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 @@ -23,17 +23,17 @@ * have any questions. */ -#include "stdhdrs.h" +#include "awt.h" #include "mmsystem.h" #include "jlong.h" -#include "awt.h" #include "awt_DesktopProperties.h" -#include "awt_dlls.h" +#include "awt_Toolkit.h" #include "sun_awt_windows_WDesktopProperties.h" #include "java_awt_Font.h" #include "awtmsg.h" -#include "Zmouse.h" -#include "shellapi.h" +#include "zmouse.h" +#include +#include // WDesktopProperties fields jfieldID AwtDesktopProperties::pDataID = 0; @@ -44,10 +44,6 @@ jmethodID AwtDesktopProperties::setColorPropertyID = 0; jmethodID AwtDesktopProperties::setFontPropertyID = 0; jmethodID AwtDesktopProperties::setSoundPropertyID = 0; -typedef VOID (WINAPI *SHGetSettingsType)(LPSHELLFLAGSTATE, DWORD); -static HMODULE libShell32 = NULL; -static SHGetSettingsType fn_SHGetSettings; - AwtDesktopProperties::AwtDesktopProperties(jobject self) { this->self = GetEnv()->NewGlobalRef(self); GetEnv()->SetLongField( self, AwtDesktopProperties::pDataID, @@ -431,14 +427,12 @@ void CheckFontSmoothingSettings(HWND hWnd) { void AwtDesktopProperties::GetColorParameters() { - if (IS_WIN98 || IS_WIN2000) { - SetColorProperty(TEXT("win.frame.activeCaptionGradientColor"), - GetSysColor(COLOR_GRADIENTACTIVECAPTION)); - SetColorProperty(TEXT("win.frame.inactiveCaptionGradientColor"), - GetSysColor(COLOR_GRADIENTINACTIVECAPTION)); - SetColorProperty(TEXT("win.item.hotTrackedColor"), - GetSysColor(COLOR_HOTLIGHT)); - } + SetColorProperty(TEXT("win.frame.activeCaptionGradientColor"), + GetSysColor(COLOR_GRADIENTACTIVECAPTION)); + SetColorProperty(TEXT("win.frame.inactiveCaptionGradientColor"), + GetSysColor(COLOR_GRADIENTINACTIVECAPTION)); + SetColorProperty(TEXT("win.item.hotTrackedColor"), + GetSysColor(COLOR_HOTLIGHT)); SetColorProperty(TEXT("win.3d.darkShadowColor"), GetSysColor(COLOR_3DDKSHADOW)); SetColorProperty(TEXT("win.3d.backgroundColor"), GetSysColor(COLOR_3DFACE)); SetColorProperty(TEXT("win.3d.highlightColor"), GetSysColor(COLOR_3DHIGHLIGHT)); @@ -510,40 +504,18 @@ void AwtDesktopProperties::GetOtherParameters() { // This property is called "win.frame.fullWindowDragsOn" above // This is one of the properties that don't trigger WM_SETTINGCHANGE SetBooleanProperty(TEXT("awt.dynamicLayoutSupported"), GetBooleanParameter(SPI_GETDRAGFULLWINDOWS)); - - // 95 MouseWheel support - // More or less copied from the MSH_MOUSEWHEEL MSDN entry - if (IS_WIN95 && !IS_WIN98) { - HWND hdlMSHWHEEL = NULL; - UINT msgMSHWheelSupported = NULL; - BOOL wheelSupported = FALSE; - - msgMSHWheelSupported = RegisterWindowMessage(MSH_WHEELSUPPORT); - hdlMSHWHEEL = FindWindow(MSH_WHEELMODULE_CLASS, MSH_WHEELMODULE_TITLE); - if (hdlMSHWHEEL && msgMSHWheelSupported) { - wheelSupported = (BOOL)::SendMessage(hdlMSHWHEEL, - msgMSHWheelSupported, 0, 0); - } - SetBooleanProperty(TEXT("awt.wheelMousePresent"), wheelSupported); - } - else { - SetBooleanProperty(TEXT("awt.wheelMousePresent"), - ::GetSystemMetrics(SM_MOUSEWHEELPRESENT)); - } + SetBooleanProperty(TEXT("awt.wheelMousePresent"), + ::GetSystemMetrics(SM_MOUSEWHEELPRESENT)); // END cross-platform properties - if (IS_WIN98 || IS_WIN2000) { - //DWORD menuShowDelay; - //SystemParametersInfo(SPI_GETMENUSHOWDELAY, 0, &menuShowDelay, 0); - // SetIntegerProperty(TEXT("win.menu.showDelay"), menuShowDelay); - SetBooleanProperty(TEXT("win.frame.captionGradientsOn"), GetBooleanParameter(SPI_GETGRADIENTCAPTIONS)); - SetBooleanProperty(TEXT("win.item.hotTrackingOn"), GetBooleanParameter(SPI_GETHOTTRACKING)); - } + //DWORD menuShowDelay; + //SystemParametersInfo(SPI_GETMENUSHOWDELAY, 0, &menuShowDelay, 0); + // SetIntegerProperty(TEXT("win.menu.showDelay"), menuShowDelay); + SetBooleanProperty(TEXT("win.frame.captionGradientsOn"), GetBooleanParameter(SPI_GETGRADIENTCAPTIONS)); + SetBooleanProperty(TEXT("win.item.hotTrackingOn"), GetBooleanParameter(SPI_GETHOTTRACKING)); - if (IS_WIN2000) { - SetBooleanProperty(TEXT("win.menu.keyboardCuesOn"), GetBooleanParameter(SPI_GETKEYBOARDCUES)); - } + SetBooleanProperty(TEXT("win.menu.keyboardCuesOn"), GetBooleanParameter(SPI_GETKEYBOARDCUES)); // High contrast accessibility property HIGHCONTRAST contrast; @@ -557,21 +529,19 @@ void AwtDesktopProperties::GetOtherParameters() { SetBooleanProperty(TEXT("win.highContrast.on"), FALSE); } - if (fn_SHGetSettings != NULL) { - SHELLFLAGSTATE sfs; - fn_SHGetSettings(&sfs, SSF_SHOWALLOBJECTS | SSF_SHOWATTRIBCOL); - if (sfs.fShowAllObjects) { - SetBooleanProperty(TEXT("awt.file.showHiddenFiles"), TRUE); - } - else { - SetBooleanProperty(TEXT("awt.file.showHiddenFiles"), FALSE); - } - if (sfs.fShowAttribCol) { - SetBooleanProperty(TEXT("awt.file.showAttribCol"), TRUE); - } - else { - SetBooleanProperty(TEXT("awt.file.showAttribCol"), FALSE); - } + SHELLFLAGSTATE sfs; + ::SHGetSettings(&sfs, SSF_SHOWALLOBJECTS | SSF_SHOWATTRIBCOL); + if (sfs.fShowAllObjects) { + SetBooleanProperty(TEXT("awt.file.showHiddenFiles"), TRUE); + } + else { + SetBooleanProperty(TEXT("awt.file.showHiddenFiles"), FALSE); + } + if (sfs.fShowAttribCol) { + SetBooleanProperty(TEXT("awt.file.showAttribCol"), TRUE); + } + else { + SetBooleanProperty(TEXT("awt.file.showAttribCol"), FALSE); } LPTSTR value; @@ -667,7 +637,7 @@ UINT AwtDesktopProperties::GetIntegerParameter(UINT spi) { } void AwtDesktopProperties::SetStringProperty(LPCTSTR propName, LPTSTR value) { - jstring key = JNU_NewStringPlatform(GetEnv(), propName); + jstring key = JNU_NewStringPlatform(GetEnv(), const_cast(propName)); GetEnv()->CallVoidMethod(self, AwtDesktopProperties::setStringPropertyID, key, JNU_NewStringPlatform(GetEnv(), value)); @@ -675,7 +645,7 @@ void AwtDesktopProperties::SetStringProperty(LPCTSTR propName, LPTSTR value) { } void AwtDesktopProperties::SetIntegerProperty(LPCTSTR propName, int value) { - jstring key = JNU_NewStringPlatform(GetEnv(), propName); + jstring key = JNU_NewStringPlatform(GetEnv(), const_cast(propName)); GetEnv()->CallVoidMethod(self, AwtDesktopProperties::setIntegerPropertyID, key, (jint)value); @@ -683,7 +653,7 @@ void AwtDesktopProperties::SetIntegerProperty(LPCTSTR propName, int value) { } void AwtDesktopProperties::SetBooleanProperty(LPCTSTR propName, BOOL value) { - jstring key = JNU_NewStringPlatform(GetEnv(), propName); + jstring key = JNU_NewStringPlatform(GetEnv(), const_cast(propName)); GetEnv()->CallVoidMethod(self, AwtDesktopProperties::setBooleanPropertyID, key, value ? JNI_TRUE : JNI_FALSE); @@ -691,7 +661,7 @@ void AwtDesktopProperties::SetBooleanProperty(LPCTSTR propName, BOOL value) { } void AwtDesktopProperties::SetColorProperty(LPCTSTR propName, DWORD value) { - jstring key = JNU_NewStringPlatform(GetEnv(), propName); + jstring key = JNU_NewStringPlatform(GetEnv(), const_cast(propName)); GetEnv()->CallVoidMethod(self, AwtDesktopProperties::setColorPropertyID, key, GetRValue(value), GetGValue(value), @@ -743,7 +713,7 @@ void AwtDesktopProperties::SetFontProperty(HDC dc, int fontID, style |= java_awt_Font_ITALIC; } - jstring key = JNU_NewStringPlatform(GetEnv(), propName); + jstring key = JNU_NewStringPlatform(GetEnv(), const_cast(propName)); GetEnv()->CallVoidMethod(self, AwtDesktopProperties::setFontPropertyID, key, fontName, style, pointSize); @@ -761,7 +731,7 @@ void AwtDesktopProperties::SetFontProperty(LPCTSTR propName, const LOGFONT & fon jint pointSize; jint style; - fontName = JNU_NewStringPlatform(GetEnv(), font.lfFaceName); + fontName = JNU_NewStringPlatform(GetEnv(), const_cast(font.lfFaceName)); #if 0 HDC hdc; @@ -784,7 +754,7 @@ void AwtDesktopProperties::SetFontProperty(LPCTSTR propName, const LOGFONT & fon style |= java_awt_Font_ITALIC; } - jstring key = JNU_NewStringPlatform(GetEnv(), propName); + jstring key = JNU_NewStringPlatform(GetEnv(), const_cast(propName)); GetEnv()->CallVoidMethod(self, AwtDesktopProperties::setFontPropertyID, key, fontName, style, pointSize); @@ -793,8 +763,8 @@ void AwtDesktopProperties::SetFontProperty(LPCTSTR propName, const LOGFONT & fon } void AwtDesktopProperties::SetSoundProperty(LPCTSTR propName, LPCTSTR winEventName) { - jstring key = JNU_NewStringPlatform(GetEnv(), propName); - jstring event = JNU_NewStringPlatform(GetEnv(), winEventName); + jstring key = JNU_NewStringPlatform(GetEnv(), const_cast(propName)); + jstring event = JNU_NewStringPlatform(GetEnv(), const_cast(winEventName)); GetEnv()->CallVoidMethod(self, AwtDesktopProperties::setSoundPropertyID, key, event); @@ -805,9 +775,9 @@ void AwtDesktopProperties::SetSoundProperty(LPCTSTR propName, LPCTSTR winEventNa void AwtDesktopProperties::PlayWindowsSound(LPCTSTR event) { // stop any currently playing sounds - AwtWinMM::PlaySoundWrapper(NULL, NULL, SND_PURGE); + ::PlaySound(NULL, NULL, SND_PURGE); // play the sound for the given event name - AwtWinMM::PlaySoundWrapper(event, NULL, SND_ASYNC|SND_ALIAS|SND_NODEFAULT); + ::PlaySound(event, NULL, SND_ASYNC|SND_ALIAS|SND_NODEFAULT); } /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -852,16 +822,6 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WDesktopProperties_init(JNIEnv *env, jobject self) { TRY; - // Open shell32.dll, get the symbol for SHGetSettings - libShell32 = LoadLibrary(TEXT("shell32.dll")); - if (libShell32 == NULL) { - fn_SHGetSettings = NULL; - } - else { - fn_SHGetSettings = (SHGetSettingsType)GetProcAddress( - libShell32, "SHGetSettings"); - } - new AwtDesktopProperties(self); CATCH_BAD_ALLOC; diff --git a/jdk/src/windows/native/sun/windows/awt_Dialog.cpp b/jdk/src/windows/native/sun/windows/awt_Dialog.cpp index 948fc0883ed..ecf74549d46 100644 --- a/jdk/src/windows/native/sun/windows/awt_Dialog.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Dialog.cpp @@ -132,14 +132,13 @@ AwtDialog* AwtDialog::Create(jobject peer, jobject parent) dialog = new AwtDialog(); { - int colorId = IS_WIN4X ? COLOR_3DFACE : COLOR_WINDOW; + int colorId = COLOR_3DFACE; DWORD style = WS_CAPTION | WS_SYSMENU | WS_CLIPCHILDREN; if (hwndParent != NULL) { style |= WS_POPUP; } style &= ~(WS_MINIMIZEBOX|WS_MAXIMIZEBOX); - DWORD exStyle = IS_WIN4X ? WS_EX_WINDOWEDGE | WS_EX_DLGMODALFRAME - : 0; + DWORD exStyle = WS_EX_WINDOWEDGE | WS_EX_DLGMODALFRAME; if (GetRTL()) { exStyle |= WS_EX_RIGHT | WS_EX_LEFTSCROLLBAR; @@ -663,7 +662,7 @@ void AwtDialog::_SetIMMOption(void *param) int badAlloc = 0; LPCTSTR coption; - LPTSTR empty = TEXT("InputMethod"); + LPCTSTR empty = TEXT("InputMethod"); AwtDialog *d = NULL; PDATA pData; diff --git a/jdk/src/windows/native/sun/windows/awt_DnDDS.cpp b/jdk/src/windows/native/sun/windows/awt_DnDDS.cpp index 31ee7edcbe3..bb2ac566493 100644 --- a/jdk/src/windows/native/sun/windows/awt_DnDDS.cpp +++ b/jdk/src/windows/native/sun/windows/awt_DnDDS.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. 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 @@ -23,6 +23,7 @@ * have any questions. */ +#include "awt.h" #include "jlong.h" #include "awt_DataTransferer.h" #include "awt_DnDDS.h" @@ -36,8 +37,6 @@ #include "sun_awt_dnd_SunDragSourceContextPeer.h" #include "sun_awt_windows_WDragSourceContextPeer.h" -#include -#include #include #include diff --git a/jdk/src/windows/native/sun/windows/awt_DnDDT.cpp b/jdk/src/windows/native/sun/windows/awt_DnDDT.cpp index 8940a30266a..fce80f468b2 100644 --- a/jdk/src/windows/native/sun/windows/awt_DnDDT.cpp +++ b/jdk/src/windows/native/sun/windows/awt_DnDDT.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. 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 @@ -30,11 +30,8 @@ #include "awt_Toolkit.h" #include "java_awt_dnd_DnDConstants.h" #include "sun_awt_windows_WDropTargetContextPeer.h" -#include "awt_dlls.h" #include "awt_Container.h" -#include -#include #include #include @@ -555,8 +552,7 @@ jobject AwtDropTarget::GetData(jlong fmt) { break; } case TYMED_FILE: { - jobject local = JNU_NewStringPlatform(env, (LPCTSTR) - stgmedium.lpszFileName); + jobject local = JNU_NewStringPlatform(env, stgmedium.lpszFileName); jstring fileName = (jstring)env->NewGlobalRef(local); env->DeleteLocalRef(local); diff --git a/jdk/src/windows/native/sun/windows/awt_DrawingSurface.cpp b/jdk/src/windows/native/sun/windows/awt_DrawingSurface.cpp index d1ef0568494..b7b7913b780 100644 --- a/jdk/src/windows/native/sun/windows/awt_DrawingSurface.cpp +++ b/jdk/src/windows/native/sun/windows/awt_DrawingSurface.cpp @@ -24,6 +24,8 @@ */ #define _JNI_IMPLEMENTATION_ + +#include "awt.h" #include "awt_DrawingSurface.h" #include "awt_Component.h" diff --git a/jdk/src/windows/native/sun/windows/awt_FileDialog.cpp b/jdk/src/windows/native/sun/windows/awt_FileDialog.cpp index 08d839fc44f..84339e40eee 100644 --- a/jdk/src/windows/native/sun/windows/awt_FileDialog.cpp +++ b/jdk/src/windows/native/sun/windows/awt_FileDialog.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-2008 Sun Microsystems, Inc. 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 @@ -27,7 +27,6 @@ #include "awt_FileDialog.h" #include "awt_Dialog.h" #include "awt_Toolkit.h" -#include "awt_dlls.h" #include "ComCtl32Util.h" #include #include @@ -65,7 +64,7 @@ AwtFileDialog::Initialize(JNIEnv *env, jstring filterDescription) { int length = env->GetStringLength(filterDescription); DASSERT(length + 1 < MAX_FILTER_STRING); - LPCTSTR tmp = (LPTSTR)JNU_GetStringPlatformChars(env, filterDescription, NULL); + LPCTSTR tmp = JNU_GetStringPlatformChars(env, filterDescription, NULL); _tcscpy(s_fileFilterString, tmp); JNU_ReleaseStringPlatformChars(env, filterDescription, tmp); @@ -156,7 +155,7 @@ FileDialogHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) LPITEMIDLIST pidl = (LPITEMIDLIST)notifyEx->pidl; // Get the filename and directory TCHAR szPath[MAX_PATH]; - if (!get_path_from_idlist(pidl,szPath)) { + if (!::SHGetPathFromIDList(pidl, szPath)) { return TRUE; } jstring strPath = JNU_NewStringPlatform(env, szPath); @@ -190,7 +189,7 @@ AwtFileDialog::Show(void *p) WCHAR unicodeChar = L' '; LPTSTR fileBuffer = NULL; LPTSTR currentDirectory = NULL; - AWTOPENFILENAME ofn; + OPENFILENAME ofn; jint mode = 0; BOOL result = FALSE; DWORD dlgerr; @@ -222,7 +221,7 @@ AwtFileDialog::Show(void *p) HWND hwndOwner = awtParent ? awtParent->GetHWnd() : NULL; if (title == NULL || env->GetStringLength(title)==0) { - title = env->NewString(&unicodeChar, 1); + title = JNU_NewStringPlatform(env, &unicodeChar); } JavaStringBuffer titleBuffer(env, title); @@ -243,14 +242,7 @@ AwtFileDialog::Show(void *p) memset(&ofn, 0, sizeof(ofn)); - // According to the MSDN docs, lStructSize must be set to - // OPENFILENAME_SIZE_VERSION_400 on NT4.0. - if (IS_NT && !(IS_WIN2000)) { - ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; - } - else { ofn.lStructSize = sizeof(ofn); - } ofn.lpstrFilter = s_fileFilterString; ofn.nFilterIndex = 1; /* @@ -289,9 +281,6 @@ AwtFileDialog::Show(void *p) mode = env->GetIntField(target, AwtFileDialog::modeID); - // Fix for 4364256 : call load_shell_procs() - load_shell_procs(); - AwtDialog::CheckInstallModalHook(); // show the Win32 file dialog @@ -304,7 +293,7 @@ AwtFileDialog::Show(void *p) // If the dialog is not shown because of invalid file name // replace the file name by empty string. if (!result) { - dlgerr = AwtCommDialog::CommDlgExtendedError(); + dlgerr = ::CommDlgExtendedError(); if (dlgerr == FNERR_INVALIDFILENAME) { _tcscpy(fileBuffer, TEXT("")); if (mode == java_awt_FileDialog_LOAD) { @@ -326,7 +315,7 @@ AwtFileDialog::Show(void *p) // Report result to peer. if (result) { jstring tmpJString = (_tcslen(ofn.lpstrFile) == 0 ? - env->NewStringUTF("") : + JNU_NewStringPlatform(env, L"") : JNU_NewStringPlatform(env, ofn.lpstrFile)); env->CallVoidMethod(peer, AwtFileDialog::handleSelectedMID, tmpJString); env->DeleteLocalRef(tmpJString); @@ -362,20 +351,18 @@ AwtFileDialog::Show(void *p) } BOOL -AwtFileDialog::GetOpenFileName(LPAWTOPENFILENAME data) { - AwtCommDialog::load_comdlg_procs(); +AwtFileDialog::GetOpenFileName(LPOPENFILENAME data) { return static_cast(reinterpret_cast( AwtToolkit::GetInstance().InvokeFunction((void*(*)(void*)) - AwtCommDialog::GetOpenFileNameWrapper, data))); + ::GetOpenFileName, data))); } BOOL -AwtFileDialog::GetSaveFileName(LPAWTOPENFILENAME data) { - AwtCommDialog::load_comdlg_procs(); +AwtFileDialog::GetSaveFileName(LPOPENFILENAME data) { return static_cast(reinterpret_cast( AwtToolkit::GetInstance().InvokeFunction((void *(*)(void *)) - AwtCommDialog::GetSaveFileNameWrapper, data))); + ::GetSaveFileName, data))); } diff --git a/jdk/src/windows/native/sun/windows/awt_FileDialog.h b/jdk/src/windows/native/sun/windows/awt_FileDialog.h index 9a324f68f34..82638d30752 100644 --- a/jdk/src/windows/native/sun/windows/awt_FileDialog.h +++ b/jdk/src/windows/native/sun/windows/awt_FileDialog.h @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. 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 @@ -36,43 +36,6 @@ #include "java_awt_FileDialog.h" #include "sun_awt_windows_WFileDialogPeer.h" -// The VC6 headers don't include this, but it's necessary for -// backward-compatibility with NT4.0, so we fake it. -#ifndef OPENFILENAME_SIZE_VERSION_400 - // Determined via sizeof(OPENFILENAME) - #define OPENFILENAME_SIZE_VERSION_400 76 -#endif - -// 4859390 -// For the Places Bar to show up, we need the "full" OPENFILENAME struct -typedef struct tagAWTOFN { - DWORD lStructSize; - HWND hwndOwner; - HINSTANCE hInstance; - LPCTSTR lpstrFilter; - LPTSTR lpstrCustomFilter; - DWORD nMaxCustFilter; - DWORD nFilterIndex; - LPTSTR lpstrFile; - DWORD nMaxFile; - LPTSTR lpstrFileTitle; - DWORD nMaxFileTitle; - LPCTSTR lpstrInitialDir; - LPCTSTR lpstrTitle; - DWORD Flags; - WORD nFileOffset; - WORD nFileExtension; - LPCTSTR lpstrDefExt; - LPARAM lCustData; - LPOFNHOOKPROC lpfnHook; - LPCTSTR lpTemplateName; -//#if (_WIN32_WINNT >= 0x0500) - void * pvReserved; - DWORD dwReserved; - DWORD FlagsEx; -//#endif // (_WIN32_WINNT >= 0x0500) -} AWTOPENFILENAME, *LPAWTOPENFILENAME; - /************************************************************************ * AwtFileDialog class */ @@ -96,8 +59,8 @@ public: static void Initialize(JNIEnv *env, jstring filterDescription); static void Show(void *peer); - static BOOL GetOpenFileName(LPAWTOPENFILENAME); - static BOOL GetSaveFileName(LPAWTOPENFILENAME); + static BOOL GetOpenFileName(LPOPENFILENAME); + static BOOL GetSaveFileName(LPOPENFILENAME); virtual BOOL InheritsNativeMouseWheelBehavior(); diff --git a/jdk/src/windows/native/sun/windows/awt_Font.cpp b/jdk/src/windows/native/sun/windows/awt_Font.cpp index 8dc9d5a67b5..6815b1afab1 100644 --- a/jdk/src/windows/native/sun/windows/awt_Font.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Font.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-2008 Sun Microsystems, Inc. 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 @@ -23,6 +23,7 @@ * have any questions. */ +#include "awt.h" #include #include "jlong.h" #include "awt_Font.h" @@ -195,7 +196,7 @@ AwtFont* AwtFont::GetFont(JNIEnv *env, jobject font, } // Get suitable CHARSET from charset string provided by font configuration. -static int GetNativeCharset(WCHAR* name) +static int GetNativeCharset(LPCWSTR name) { if (wcsstr(name, L"ANSI_CHARSET")) return ANSI_CHARSET; @@ -259,7 +260,7 @@ AwtFont* AwtFont::Create(JNIEnv *env, jobject font, jint angle, jfloat awScale) cfnum = 0; } - WCHAR* wName; + LPCWSTR wName; awtFont = new AwtFont(cfnum, env, font); @@ -269,9 +270,7 @@ AwtFont* AwtFont::Create(JNIEnv *env, jobject font, jint angle, jfloat awScale) if (cfnum > 0) { // Ask peer class for the text component font name jstring jTextComponentFontName = GetTextComponentFontName(env, font); - WCHAR* textComponentFontName = TO_WSTRING(jTextComponentFontName); - - env->DeleteLocalRef(jTextComponentFontName); + LPCWSTR textComponentFontName = JNU_GetStringPlatformChars(env, jTextComponentFontName, NULL); awtFont->m_textInput = -1; for (int i = 0; i < cfnum; i++) { @@ -282,13 +281,13 @@ AwtFont* AwtFont::Create(JNIEnv *env, jobject font, jint angle, jfloat awScale) jstring nativeName = (jstring)env->GetObjectField(fontDescriptor, AwtFont::nativeNameID); - wName = TO_WSTRING(nativeName); + wName = JNU_GetStringPlatformChars(env, nativeName, NULL); DASSERT(wName); //On NT platforms, if the font is not Symbol or Dingbats //use "W" version of Win32 APIs directly, info the FontDescription //no need to convert characters from Unicode to locale encodings. - if (IS_NT && GetNativeCharset(wName) != SYMBOL_CHARSET) { + if (GetNativeCharset(wName) != SYMBOL_CHARSET) { env->SetBooleanField(fontDescriptor, AwtFont::useUnicodeID, TRUE); } @@ -299,10 +298,12 @@ AwtFont* AwtFont::Create(JNIEnv *env, jobject font, jint angle, jfloat awScale) (wcscmp(wName, textComponentFontName) == 0)) { awtFont->m_textInput = i; } - HFONT hfonttmp = CreateHFont(wName, fontStyle, fontSize, + HFONT hfonttmp = CreateHFont(const_cast(wName), fontStyle, fontSize, angle, awScale); awtFont->m_hFont[i] = hfonttmp; + JNU_ReleaseStringPlatformChars(env, nativeName, wName); + env->DeleteLocalRef(fontDescriptor); env->DeleteLocalRef(nativeName); } @@ -311,11 +312,14 @@ AwtFont* AwtFont::Create(JNIEnv *env, jobject font, jint angle, jfloat awScale) // to first component awtFont->m_textInput = 0; } + + JNU_ReleaseStringPlatformChars(env, jTextComponentFontName, textComponentFontName); + env->DeleteLocalRef(jTextComponentFontName); } else { // Instantiation for English version. jstring fontName = (jstring)env->GetObjectField(font, AwtFont::nameID); - wName = TO_WSTRING(fontName); + wName = JNU_GetStringPlatformChars(env, fontName, NULL); WCHAR* wEName; if (!wcscmp(wName, L"Helvetica") || !wcscmp(wName, L"SansSerif")) { @@ -338,6 +342,9 @@ AwtFont* AwtFont::Create(JNIEnv *env, jobject font, jint angle, jfloat awScale) awtFont->m_textInput = 0; awtFont->m_hFont[0] = CreateHFont(wEName, fontStyle, fontSize, angle, awScale); + + JNU_ReleaseStringPlatformChars(env, fontName, wName); + env->DeleteLocalRef(fontName); } /* The several callers of this method also set the pData field. @@ -381,7 +388,7 @@ static void strip_tail(wchar_t* text, wchar_t* tail) { // strips tail and any po } -static HFONT CreateHFont_sub(WCHAR* name, int style, int height, +static HFONT CreateHFont_sub(LPCWSTR name, int style, int height, int angle=0, float awScale=1.0f) { LOGFONTW logFont; @@ -420,18 +427,7 @@ static HFONT CreateHFont_sub(WCHAR* name, int style, int height, strip_tail(tmpname,L"Italic"); strip_tail(tmpname,L"Bold"); wcscpy(&(logFont.lfFaceName[0]), tmpname); - HFONT hFont; - if (IS_WIN95) { -#ifdef WIN32 - DASSERT(IS_WIN95); -#endif - HDC hdc = ::GetDC(NULL); - ::EnumFontFamiliesEx(hdc, &logFont, (FONTENUMPROC)FindFamilyName, - (LPARAM)tmpname, 0L); - ::ReleaseDC(NULL, hdc); - wcscpy(&logFont.lfFaceName[0], tmpname); - } - hFont = ::CreateFontIndirectW(&logFont); + HFONT hFont = ::CreateFontIndirect(&logFont); DASSERT(hFont != NULL); // get a expanded or condensed version if its specified. if (awScale != 1.0f) { @@ -446,7 +442,7 @@ static HFONT CreateHFont_sub(WCHAR* name, int style, int height, } avgWidth = tm.tmAveCharWidth; logFont.lfWidth = (LONG)((fabs)(avgWidth*awScale)); - hFont = CreateFontIndirectW(&logFont); + hFont = ::CreateFontIndirect(&logFont); DASSERT(hFont != NULL); VERIFY(::ReleaseDC(0, hDC)); } @@ -460,15 +456,8 @@ HFONT AwtFont::CreateHFont(WCHAR* name, int style, int height, WCHAR longName[80]; // 80 > (max face name(=30) + strlen("CHINESEBIG5_CHARSET")) // longName doesn't have to be printable. So, it is OK not to convert. - if (IS_NT) { - //wsprintfW only works on NT. See bugid 4123362 - wsprintfW(longName, L"%ls-%d-%d", name, style, height); - } else { -#ifdef WIN32 - DASSERT(IS_WIN95); -#endif - swprintf(longName, L"%ls-%d-%d", name, style, height); - } + + wsprintf(longName, L"%ls-%d-%d", name, style, height); HFONT hFont = NULL; @@ -682,28 +671,16 @@ SIZE AwtFont::DrawStringSize_sub(jstring str, HDC hDC, if (arrayLength == 0) { int length = env->GetStringLength(str); - WCHAR* string = TO_WSTRING(str); + LPCWSTR strW = JNU_GetStringPlatformChars(env, str, NULL); VERIFY(::SelectObject(hDC, awtFont->GetHFont())); if (AwtComponent::GetRTLReadingOrder()){ - if (IS_WIN95) { - // Start of conversion Code to fix arabic shaping problems - // with unicode support in win 95 - LPSTR buffer = (LPSTR) alloca((wcslen(string) + 1) * 2); - int count = ::WideCharToMultiByte(codePage, 0, string, length, - buffer, - static_cast((wcslen(string) + 1) * 2), - NULL, NULL); - VERIFY(!draw || ::ExtTextOutA(hDC, x, y, ETO_RTLREADING, NULL, - buffer, count, NULL)); - // End Of Conversion Code - } else { - VERIFY(!draw || ::ExtTextOutW(hDC, x, y, ETO_RTLREADING, NULL, - string, length, NULL)); - } + VERIFY(!draw || ::ExtTextOut(hDC, x, y, ETO_RTLREADING, NULL, + strW, length, NULL)); } else { - VERIFY(!draw || ::TextOutW(hDC, x, y, string, length)); + VERIFY(!draw || ::TextOut(hDC, x, y, strW, length)); } - VERIFY(::GetTextExtentPoint32W(hDC, string, length, &size)); + VERIFY(::GetTextExtentPoint32(hDC, strW, length, &size)); + JNU_ReleaseStringPlatformChars(env, str, strW); } else { for (int i = 0; i < arrayLength; i = i + 2) { jobject fontDescriptor = env->GetObjectArrayElement(array, i); @@ -732,7 +709,7 @@ SIZE AwtFont::DrawStringSize_sub(jstring str, HDC hDC, * extend buflen and bad things will happen. */ unsigned char* buffer = NULL; - jboolean unicodeUsed = env->GetBooleanField(fontDescriptor,AwtFont::useUnicodeID); + jboolean unicodeUsed = env->GetBooleanField(fontDescriptor, AwtFont::useUnicodeID); try { buffer = (unsigned char *) env->GetPrimitiveArrayCritical(convertedBytes, 0); @@ -1231,7 +1208,7 @@ class CSegTableComponent public: CSegTableComponent(); virtual ~CSegTableComponent(); - virtual void Create(LPWSTR name); + virtual void Create(LPCWSTR name); virtual BOOL In(USHORT iChar) { DASSERT(FALSE); return FALSE; }; LPWSTR GetFontName(){ DASSERT(m_lpszFontName != NULL); return m_lpszFontName; @@ -1254,7 +1231,7 @@ CSegTableComponent::~CSegTableComponent() } } -void CSegTableComponent::Create(LPWSTR name) +void CSegTableComponent::Create(LPCWSTR name) { if (m_lpszFontName != NULL) { free(m_lpszFontName); @@ -1453,7 +1430,7 @@ public: CStdSegTable(); virtual ~CStdSegTable(); BOOL IsEUDC() { return FALSE; }; - virtual void Create(LPWSTR name); + virtual void Create(LPCWSTR name); protected: void GetData(DWORD dwOffset, LPVOID lpData, DWORD cbData); @@ -1481,7 +1458,7 @@ inline void CStdSegTable::GetData(DWORD dwOffset, DASSERT(nBytes != GDI_ERROR); } -void CStdSegTable::Create(LPWSTR name) +void CStdSegTable::Create(LPCWSTR name) { CSegTableComponent::Create(name); @@ -1509,7 +1486,7 @@ public: CEUDCSegTable(); virtual ~CEUDCSegTable(); BOOL IsEUDC() { return TRUE; }; - virtual void Create(LPWSTR name); + virtual void Create(LPCWSTR name); protected: void GetData(DWORD dwOffset, LPVOID lpData, DWORD cbData); @@ -1543,7 +1520,7 @@ inline void CEUDCSegTable::GetData(DWORD dwOffset, DASSERT(dwRead == cbData); } -void CEUDCSegTable::Create(LPWSTR name) +void CEUDCSegTable::Create(LPCWSTR name) { typedef struct tagHEAD{ FIXED sfnt_version; @@ -1564,19 +1541,8 @@ typedef struct tagENTRY{ // create EUDC font file and make EUDCSegTable // after wrapper function for CreateFileW, we use only CreateFileW - if (IS_NT) { - m_hTmpFile = ::CreateFileW(name, GENERIC_READ, - FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - } else { -#ifdef WIN32 - DASSERT(IS_WIN95); -#endif - char szFileName[_MAX_PATH]; - ::WideCharToMultiByte(CP_ACP, 0, name, -1, - szFileName, sizeof(szFileName), NULL, NULL); - m_hTmpFile = ::CreateFileA(szFileName, GENERIC_READ, - FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - } + m_hTmpFile = ::CreateFile(name, GENERIC_READ, + FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (m_hTmpFile == INVALID_HANDLE_VALUE){ m_hTmpFile = NULL; return; @@ -1654,10 +1620,10 @@ void CSegTableManagerComponent::MakeBiggerTable() class CSegTableManager : public CSegTableManagerComponent { public: - CSegTable* GetTable(LPWSTR lpszFontName, BOOL fEUDC); + CSegTable* GetTable(LPCWSTR lpszFontName, BOOL fEUDC); }; -CSegTable* CSegTableManager::GetTable(LPWSTR lpszFontName, BOOL fEUDC) +CSegTable* CSegTableManager::GetTable(LPCWSTR lpszFontName, BOOL fEUDC) { for (int i = 0; i < m_nTable; i++) { if ((((CSegTable*)m_tables[i])->IsEUDC() == fEUDC) && @@ -1685,7 +1651,7 @@ class CCombinedSegTable : public CSegTableComponent { public: CCombinedSegTable(); - void Create(LPWSTR name); + void Create(LPCWSTR name); BOOL In(USHORT iChar); private: @@ -1807,7 +1773,7 @@ void CCombinedSegTable::GetEUDCFileName(LPWSTR lpszFileName, int cchFileName) wcscpy(m_szDefaultEUDCFile, lpszFileName); } -void CCombinedSegTable::Create(LPWSTR name) +void CCombinedSegTable::Create(LPCWSTR name) { CSegTableComponent::Create(name); @@ -1840,10 +1806,10 @@ BOOL CCombinedSegTable::In(USHORT iChar) class CCombinedSegTableManager : public CSegTableManagerComponent { public: - CCombinedSegTable* GetTable(LPWSTR lpszFontName); + CCombinedSegTable* GetTable(LPCWSTR lpszFontName); }; -CCombinedSegTable* CCombinedSegTableManager::GetTable(LPWSTR lpszFontName) +CCombinedSegTable* CCombinedSegTableManager::GetTable(LPCWSTR lpszFontName) { for (int i = 0; i < m_nTable; i++) { if (wcscmp(m_tables[i]->GetFontName(),lpszFontName) == 0) @@ -1901,8 +1867,9 @@ Java_sun_awt_windows_WDefaultFontCharset_canConvert(JNIEnv *env, jobject self, jstring fontName = (jstring)env->GetObjectField(self, AwtFont::fontNameID); DASSERT(fontName != NULL); - LPWSTR fontNameWStr = TO_WSTRING(fontName); - CCombinedSegTable* pTable = tableManager.GetTable(fontNameWStr); + LPCWSTR fontNameW = JNU_GetStringPlatformChars(env, fontName, NULL); + CCombinedSegTable* pTable = tableManager.GetTable(fontNameW); + JNU_ReleaseStringPlatformChars(env, fontName, fontNameW); return (pTable->In((USHORT) ch) ? JNI_TRUE : JNI_FALSE); CATCH_BAD_ALLOC_RET(FALSE); diff --git a/jdk/src/windows/native/sun/windows/awt_Font.h b/jdk/src/windows/native/sun/windows/awt_Font.h index c1edd9d0eab..ac537a122b0 100644 --- a/jdk/src/windows/native/sun/windows/awt_Font.h +++ b/jdk/src/windows/native/sun/windows/awt_Font.h @@ -28,7 +28,6 @@ #include "awt.h" #include "awt_Object.h" -#include "awt_Unicode.h" #include "java_awt_Font.h" #include "sun_awt_windows_WFontMetrics.h" diff --git a/jdk/src/windows/native/sun/windows/awt_Frame.cpp b/jdk/src/windows/native/sun/windows/awt_Frame.cpp index 37e8546ed49..60738e69357 100644 --- a/jdk/src/windows/native/sun/windows/awt_Frame.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Frame.cpp @@ -1472,7 +1472,7 @@ void AwtFrame::_SetIMMOption(void *param) int badAlloc = 0; LPCTSTR coption; - LPTSTR empty = TEXT("InputMethod"); + LPCTSTR empty = TEXT("InputMethod"); AwtFrame *f = NULL; PDATA pData; diff --git a/jdk/src/windows/native/sun/windows/awt_InputMethod.cpp b/jdk/src/windows/native/sun/windows/awt_InputMethod.cpp index ff944b0e8e7..bd78cdaf3ef 100644 --- a/jdk/src/windows/native/sun/windows/awt_InputMethod.cpp +++ b/jdk/src/windows/native/sun/windows/awt_InputMethod.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1997-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 Sun Microsystems, Inc. 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 @@ -580,18 +580,10 @@ HKL getDefaultKeyboardLayout() { DWORD cbHKL = 16; LPTSTR end; - if (IS_NT) { - ret = ::RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Keyboard Layout\\Preload"), NULL, KEY_READ, &hKey); - } else { - ret = ::RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("keyboard layout\\preload\\1"), NULL, KEY_READ, &hKey); - } + ret = ::RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Keyboard Layout\\Preload"), NULL, KEY_READ, &hKey); if (ret == ERROR_SUCCESS) { - if (IS_NT) { - ret = ::RegQueryValueEx(hKey, TEXT("1"), 0, 0, szHKL, &cbHKL); - } else { - ret = ::RegQueryValueEx(hKey, NULL, 0, 0, szHKL, &cbHKL); - } + ret = ::RegQueryValueEx(hKey, TEXT("1"), 0, 0, szHKL, &cbHKL); if (ret == ERROR_SUCCESS) { hkl = reinterpret_cast(static_cast( diff --git a/jdk/src/windows/native/sun/windows/awt_InputTextInfor.cpp b/jdk/src/windows/native/sun/windows/awt_InputTextInfor.cpp index 82f54a4ead8..3c26fbb95d0 100644 --- a/jdk/src/windows/native/sun/windows/awt_InputTextInfor.cpp +++ b/jdk/src/windows/native/sun/windows/awt_InputTextInfor.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. 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 @@ -22,10 +22,9 @@ * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ -#include -#include -#include + #include "awt.h" +#include #include "awt_Component.h" #include "awt_InputTextInfor.h" @@ -91,12 +90,12 @@ AwtInputTextInfor::GetContextData(HIMC hIMC, const LPARAM flags) { LONG cbData[5] = {0}; LPVOID lpData[5] = {NULL}; for (int i = startIndex, j = 0; i <= endIndex; i++, j++) { - cbData[j] = ImmGetCompositionStringW(hIMC, GCS_INDEX[i], NULL, 0); + cbData[j] = ::ImmGetCompositionString(hIMC, GCS_INDEX[i], NULL, 0); if (cbData[j] == 0) { lpData[j] = NULL; } else { LPBYTE lpTemp = new BYTE[cbData[j]]; - cbData[j] = ImmGetCompositionStringW(hIMC, GCS_INDEX[i], lpTemp, cbData[j]); + cbData[j] = ::ImmGetCompositionString(hIMC, GCS_INDEX[i], lpTemp, cbData[j]); if (IMM_ERROR_GENERAL != cbData[j]) { lpData[j] = (LPVOID)lpTemp; } else { @@ -126,7 +125,7 @@ AwtInputTextInfor::GetContextData(HIMC hIMC, const LPARAM flags) { // Get the cursor position if (flags & GCS_COMPSTR) { - m_cursorPosW = ImmGetCompositionStringW(hIMC, GCS_CURSORPOS, + m_cursorPosW = ::ImmGetCompositionString(hIMC, GCS_CURSORPOS, NULL, 0); } @@ -185,9 +184,11 @@ AwtInputTextInfor::~AwtInputTextInfor() { jstring AwtInputTextInfor::MakeJavaString(JNIEnv* env, LPWSTR lpStrW, int cStrW) { - if (env == NULL || lpStrW == NULL || cStrW == 0) return NULL; - - return env->NewString(lpStrW, cStrW); + if (env == NULL || lpStrW == NULL || cStrW == 0) { + return NULL; + } else { + return env->NewString(reinterpret_cast(lpStrW), cStrW); + } } // @@ -232,7 +233,7 @@ int AwtInputTextInfor::GetClauseInfor(int*& lpBndClauseW, jstring*& lpReadingCla LCID lcJPN = MAKELCID(MAKELANGID(LANG_JAPANESE,SUBLANG_DEFAULT),SORT_DEFAULT); // Reading string is given in half width katakana in Japanese Windows // Convert it to full width katakana. - int cFWStrW = LCMapStringW( lcJPN, LCMAP_FULLWIDTH, lpHWStrW, cHWStrW, NULL, 0 ); + int cFWStrW = ::LCMapString(lcJPN, LCMAP_FULLWIDTH, lpHWStrW, cHWStrW, NULL, 0); LPWSTR lpFWStrW; try { lpFWStrW = new WCHAR[cFWStrW]; @@ -244,7 +245,7 @@ int AwtInputTextInfor::GetClauseInfor(int*& lpBndClauseW, jstring*& lpReadingCla throw; } - LCMapStringW( lcJPN, LCMAP_FULLWIDTH, lpHWStrW, cHWStrW, lpFWStrW, cFWStrW ); + ::LCMapString(lcJPN, LCMAP_FULLWIDTH, lpHWStrW, cHWStrW, lpFWStrW, cFWStrW); readingClauseW[cls] = MakeJavaString(env, lpFWStrW, cFWStrW); delete [] lpFWStrW; } else { @@ -252,7 +253,7 @@ int AwtInputTextInfor::GetClauseInfor(int*& lpBndClauseW, jstring*& lpReadingCla } } else { - readingClauseW[cls] = MakeJavaString(env, (LPWSTR)NULL, 0); + readingClauseW[cls] = NULL; } } diff --git a/jdk/src/windows/native/sun/windows/awt_List.cpp b/jdk/src/windows/native/sun/windows/awt_List.cpp index 9000aaa685a..20844de7875 100644 --- a/jdk/src/windows/native/sun/windows/awt_List.cpp +++ b/jdk/src/windows/native/sun/windows/awt_List.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-2008 Sun Microsystems, Inc. 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 @@ -27,7 +27,6 @@ #include "awt_KeyboardFocusManager.h" #include "awt_Canvas.h" #include "awt_Dimension.h" -#include "awt_Unicode.h" #include "awt_Toolkit.h" #include "awt_Window.h" @@ -112,9 +111,8 @@ AwtList* AwtList::Create(jobject peer, jobject parent) DWORD wrapExStyle = 0; DWORD style = WS_CHILD | WS_CLIPSIBLINGS | WS_VSCROLL | WS_HSCROLL | - LBS_NOINTEGRALHEIGHT | LBS_NOTIFY | LBS_OWNERDRAWFIXED | - (IS_WIN4X ? 0 : WS_BORDER); - DWORD exStyle = IS_WIN4X ? WS_EX_CLIENTEDGE : 0; + LBS_NOINTEGRALHEIGHT | LBS_NOTIFY | LBS_OWNERDRAWFIXED; + DWORD exStyle = WS_EX_CLIENTEDGE; /* * NOTE: WS_VISIBLE is always set for the listbox. Listbox @@ -571,10 +569,10 @@ MsgRouting AwtList::HandleEvent(MSG *msg, BOOL synthetic) // operate WM_PRINT to be compatible with the "smooth scrolling" feature. MsgRouting AwtList::WmPrint(HDC hDC, LPARAM flags) { - if (!isWrapperPrint && IS_WIN4X - && (flags & PRF_CLIENT) - && (GetStyleEx() & WS_EX_CLIENTEDGE)) { - + if (!isWrapperPrint && + (flags & PRF_CLIENT) && + (GetStyleEx() & WS_EX_CLIENTEDGE)) + { int nOriginalDC = ::SaveDC(hDC); DASSERT(nOriginalDC != 0); // Save a copy of the DC for WmPrintClient diff --git a/jdk/src/windows/native/sun/windows/awt_MMStub.cpp b/jdk/src/windows/native/sun/windows/awt_MMStub.cpp deleted file mode 100644 index 675f48e784b..00000000000 --- a/jdk/src/windows/native/sun/windows/awt_MMStub.cpp +++ /dev/null @@ -1,573 +0,0 @@ -/* - * Copyright 1999-2003 Sun Microsystems, Inc. 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 - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - */ - -#include "awt_MMStub.h" - -//--------------------------------------------------------------------------- -// Basic API -//--------------------------------------------------------------------------- - -int (WINAPI* g_pfnGetSystemMetrics) (int); -MHND (WINAPI* g_pfnMonitorFromWindow) (HWND,BOOL); -MHND (WINAPI* g_pfnMonitorFromRect) (LPCRECT,BOOL); -MHND (WINAPI* g_pfnMonitorFromPoint) (POINT,BOOL); -BOOL (WINAPI* g_pfnGetMonitorInfo) (MHND,PMONITOR_INFO); -BOOL (WINAPI* g_pfnEnumDisplayMonitors) (HDC,LPCRECT,MON_ENUM_CALLBACK_PROC,LPARAM); -BOOL (WINAPI* g_pfnEnumDisplayDevices) (LPVOID,int,P_DISPLAY_DEVICE,DWORD); - -BOOL __initMultipleMonitorStubs(void); -BOOL __initMultipleMonitorStubs(void) -{ - static BOOL fInitDone; - HMODULE hUser32; - HMODULE hUnicows = UnicowsLoader::GetModuleHandle(); - BOOL retCode = FALSE; - - if (fInitDone) - { - retCode = g_pfnGetMonitorInfo != NULL; - goto _RET_; - } - - if ((hUser32 = GetModuleHandle(TEXT("USER32"))) && - (*(FARPROC*)&g_pfnGetSystemMetrics = GetProcAddress(hUser32,"GetSystemMetrics")) && - (*(FARPROC*)&g_pfnMonitorFromWindow = GetProcAddress(hUser32,"MonitorFromWindow")) && - (*(FARPROC*)&g_pfnMonitorFromRect = GetProcAddress(hUser32,"MonitorFromRect")) && - (*(FARPROC*)&g_pfnMonitorFromPoint = GetProcAddress(hUser32,"MonitorFromPoint")) && - (*(FARPROC*)&g_pfnEnumDisplayMonitors = GetProcAddress(hUser32,"EnumDisplayMonitors")) && - (*(FARPROC*)&g_pfnGetMonitorInfo = GetProcAddress(IS_WIN95 ? hUnicows : hUser32,"GetMonitorInfoW")) && - (*(FARPROC*)&g_pfnEnumDisplayDevices = GetProcAddress(IS_WIN95 ? hUnicows : hUser32,"EnumDisplayDevicesW")) && - (GetSystemMetrics(SM_CXVSCREEN) >= GetSystemMetrics(SM_CXSCREEN)) && - (GetSystemMetrics(SM_CYVSCREEN) >= GetSystemMetrics(SM_CYSCREEN)) ) - { - fInitDone = TRUE; - retCode = TRUE; - goto _RET_; - } - g_pfnGetSystemMetrics = NULL; - g_pfnMonitorFromWindow = NULL; - g_pfnMonitorFromRect = NULL; - g_pfnMonitorFromPoint = NULL; - g_pfnGetMonitorInfo = NULL; - g_pfnEnumDisplayMonitors = NULL; - g_pfnEnumDisplayDevices = NULL; - - fInitDone = TRUE; - retCode = FALSE; - -_RET_: - return retCode; -} - -int WINAPI _getSystemMetrics(int nCode) -{ - int retCode; - if( __initMultipleMonitorStubs() ) - { - retCode = g_pfnGetSystemMetrics(nCode); - goto _RET_; - } - - switch( nCode ) - { - case SM_CMONITORS: - case SM_SAMEDSPLFORMAT: - return 1; - - case SM_XVSCREEN: - case SM_YVSCREEN: - return 0; - - case SM_CXVSCREEN: - nCode = SM_CXSCREEN; - break; - - case SM_CYVSCREEN: - nCode = SM_CYSCREEN; - break; - } - - retCode = GetSystemMetrics(nCode); -_RET_: - return retCode; -} - - -MHND WINAPI _monitorFromRect(LPCRECT prScreen, UINT nFlags) -{ - MHND retCode = NULL; - if( __initMultipleMonitorStubs() ) - { - retCode = g_pfnMonitorFromRect(prScreen, nFlags); - goto _RET_; - } - - if( (prScreen->right < 0) || (prScreen->bottom < 0) ) - { - goto _RET_; - } - { - POINT pP = {0,0}; - - pP.x = prScreen->left; - pP.y = prScreen->top; - - retCode = _monitorFromPoint(pP,nFlags); - } - -_RET_: - return retCode; -} - -MHND WINAPI _monitorFromWindow(HWND hwProbe, UINT nFlags) -{ - RECT rR; - MHND retCode = NULL; - - if( __initMultipleMonitorStubs() ) - { - retCode = g_pfnMonitorFromWindow(hwProbe, nFlags); - goto _RET_; - } - - if( nFlags & (MONITOR_DEFAULT_TO_PRIMARY | MONITOR_DEFAULT_TO_NEAR) ) - { - retCode = PRIMARY_MONITOR; - goto _RET_; - } - - if( GetWindowRect(hwProbe, &rR) ) - { - retCode = _monitorFromRect(&rR, nFlags); - goto _RET_; - } - -_RET_: - return retCode; -} - -MHND WINAPI _monitorFromPoint(POINT ptProbe, UINT nFlags) -{ - MHND retCode = NULL; - if( __initMultipleMonitorStubs() ) - { - retCode = g_pfnMonitorFromPoint(ptProbe,nFlags); - goto _RET_; - } - - if( nFlags & (MONITOR_DEFAULT_TO_PRIMARY | MONITOR_DEFAULT_TO_NEAR) ) - { - goto _ASSIGN_; - } - - if( (ptProbe.x <= 0) || (ptProbe.x > GetSystemMetrics(SM_CXSCREEN)) ) - { - goto _RET_; - } - - if( (ptProbe.y <= 0) || (ptProbe.y < GetSystemMetrics(SM_CYSCREEN)) ) - { - goto _RET_; - } -_ASSIGN_: - retCode = PRIMARY_MONITOR; - -_RET_: - return retCode; -} - -BOOL WINAPI _getMonitorInfo(MHND mhMon, PMONITOR_INFO pmMonInfo) -{ - RECT rArea; - BOOL retCode = FALSE; - - if( __initMultipleMonitorStubs() ) - { - retCode = g_pfnGetMonitorInfo(mhMon, pmMonInfo); - goto _RET_; - } - - if( mhMon != PRIMARY_MONITOR ) - { - goto _RET_; - } - - if( NULL == pmMonInfo ) - { - goto _RET_; - } - - if( FALSE == SystemParametersInfo(SPI_GETWORKAREA,0,&rArea,0) ) - { - goto _RET_; - } - - if( pmMonInfo->dwSize >= sizeof(MONITOR_INFO) ) - { - pmMonInfo->rMonitor.left = 0; - pmMonInfo->rMonitor.top = 0; - pmMonInfo->rMonitor.right = GetSystemMetrics(SM_CXSCREEN); - pmMonInfo->rMonitor.bottom = GetSystemMetrics(SM_CYSCREEN); - pmMonInfo->rWork = rArea; - pmMonInfo->dwFlags = MONITOR_INFO_FLAG_PRIMARY; - - if( pmMonInfo->dwSize >= sizeof(MONITOR_INFO_EXTENDED)) - { - lstrcpy(((PMONITOR_INFO_EXTENDED)pmMonInfo)->strDevice, - TEXT("DISPLAY") ); - } - - retCode = TRUE; - } - -_RET_: - return retCode; -} - -BOOL WINAPI _enumDisplayMonitors( - HDC hDC,LPCRECT lrcSect, - MON_ENUM_CALLBACK_PROC lpfnEnumProc, - LPARAM lData - ) -{ - BOOL retCode = FALSE; - RECT rToPass = {0,0,0,0}; - RECT rBorder = {0,0,0,0}; - - if( __initMultipleMonitorStubs() ) - { - retCode = g_pfnEnumDisplayMonitors ( - hDC, lrcSect, - lpfnEnumProc,lData - ); - goto _RET_; - } - - if( !lpfnEnumProc ) - { - goto _RET_; - } - - rBorder.left = 0; - rBorder.top = 0; - rBorder.right = GetSystemMetrics(SM_CXSCREEN); - rBorder.bottom = GetSystemMetrics(SM_CYSCREEN); - - if( hDC ) - { - RECT rSect = {0,0,0,0}; - HWND hWnd = NULL; - - if( NULL == (hWnd = WindowFromDC(hDC)) ) - { - goto _RET_; - } - - switch( GetClipBox(hDC,&rSect) ) - { - case NULLREGION: - goto _ASSIGN_; - case ERROR: - goto _RET_; - default: - MapWindowPoints(NULL, hWnd, (LPPOINT)&rBorder, 2); - if( TRUE == IntersectRect(&rToPass,&rSect,&rBorder) ) - { - break; - } - } - - rBorder = rToPass; - } - - if( (NULL == lrcSect) || (TRUE == IntersectRect(&rToPass,lrcSect,&rBorder)) ) - { - lpfnEnumProc(PRIMARY_MONITOR,hDC,&rToPass,lData); - } -_ASSIGN_: - retCode = TRUE; -_RET_: - return retCode; -} - -BOOL WINAPI _enumDisplayDevices ( - LPVOID lpReserved, int iDeviceNum, - _DISPLAY_DEVICE * pDisplayDevice, DWORD dwFlags - ) -{ - BOOL retCode = FALSE; - if( __initMultipleMonitorStubs() ) - { - retCode = g_pfnEnumDisplayDevices(lpReserved,iDeviceNum,pDisplayDevice,dwFlags); - } - - return retCode; -} - - -//--------------------------------------------------------------------------- -// Extended API. -//--------------------------------------------------------------------------- -// Globais -int g_nMonitorCounter; -int g_nMonitorLimit; -MHND* g_hmpMonitors; -// Callbacks -BOOL WINAPI clb_fCountMonitors(MHND,HDC,LPRECT,LPARAM); -BOOL WINAPI clb_fCountMonitors(MHND hMon,HDC hDC,LPRECT rRect,LPARAM lP) -{ - g_nMonitorCounter ++; - return TRUE; -} -BOOL WINAPI clb_fCollectMonitors(MHND,HDC,LPRECT,LPARAM); -BOOL WINAPI clb_fCollectMonitors(MHND hMon,HDC hDC,LPRECT rRect,LPARAM lP) -{ - - if( (g_nMonitorCounter < g_nMonitorLimit) && (NULL != g_hmpMonitors) ) - { - g_hmpMonitors[g_nMonitorCounter] = hMon; - g_nMonitorCounter ++; - } - - return TRUE; -} -// Tools -void __normaRectPos(RECT*,RECT,RECT); -HWND __createWindow0(MHND,LPCTSTR,LPCTSTR,DWORD,int,int,int,int,HWND,HMENU,HANDLE,LPVOID); -HWND __createWindow1(MHND,LPCTSTR,LPCTSTR,DWORD,int,int,int,int,HWND,HMENU,HANDLE,LPVOID); -void __normaRectPos(RECT* rDest,RECT rSrc,RECT rNorma) -{ - int nDX = rSrc.right - rSrc.left; - int nDY = rSrc.bottom - rSrc.top; - - rDest->left = rSrc.left + rNorma.left; - rDest->top = rSrc.top + rNorma.top; - - rDest->right = rDest->left + nDX; - rDest->bottom = rDest->top + nDY; -} -HWND __createWindow0( MHND hmMonitor,LPCTSTR lpClassName,LPCTSTR lpWindowName, - DWORD dwStyle,int x,int y,int nWidth, - int nHeight,HWND hWndParent,HMENU hMenu, - HANDLE hInstance,LPVOID lpParam ) -{ - HWND retCode = NULL; - - if( (NULL != hmMonitor) && (NULL != lpClassName) && - (NULL != lpWindowName) && (NULL != hInstance) ) - { - RECT rRW = {0,0,0,0}; - RECT rRM = {0,0,0,0}; - RECT rSect = {0,0,0,0}; - - SetRect(&rRW,x,y,x+nWidth,y+nHeight); - - if( TRUE == _monitorBounds(hmMonitor,&rRM) ) - { - __normaRectPos(&rRW,rRW,rRM); - - IntersectRect(&rSect,&rRM,&rRW); - - if( TRUE == EqualRect(&rSect,&rRW) ) - { - x = rSect.left; - y = rSect.top; - nWidth = rSect.right - rSect.left; - nHeight = rSect.bottom - rSect.top; - retCode = CreateWindow( - lpClassName,lpWindowName, - dwStyle,x,y,nWidth, - nHeight,hWndParent,hMenu, - (HINSTANCE)hInstance,lpParam - ); - } else { - // A coisa indefinida. Nao tenho sabdoria o que - // fazer aqui mesmo - // E necessario perguntar Jeannette - } - } - } - - return retCode; -} -HWND __createWindow1( MHND hmMonitor,LPCTSTR lpClassName,LPCTSTR lpWindowName, - DWORD dwStyle,int x,int y,int nWidth, - int nHeight,HWND hWndParent,HMENU hMenu, - HANDLE hInstance,LPVOID lpParam ) -{ - HWND retCode = NULL; - - if( (NULL != hmMonitor) && (NULL != lpClassName) && - (NULL != lpWindowName) && (NULL != hInstance) ) - { - RECT rRM = {0,0,0,0}; - - if( TRUE == _monitorBounds(hmMonitor,&rRM) ) - { - HWND wW = NULL; - BOOL wasVisible = (0 != (dwStyle & WS_VISIBLE)); - - if( TRUE == wasVisible ) - { - dwStyle &= ~WS_VISIBLE; - } - - if( NULL != (wW = CreateWindow( - lpClassName,lpWindowName, - dwStyle,x,y,nWidth, - nHeight,hWndParent,hMenu, - (HINSTANCE)hInstance,lpParam - )) ) - { - RECT rRW = {0,0,0,0}; - RECT rSect = {0,0,0,0}; - - GetWindowRect(wW,&rRW); - - __normaRectPos(&rRW,rRW,rRM); - - IntersectRect(&rSect,&rRM,&rRW); - - if( TRUE == EqualRect(&rSect,&rRW) ) - { - x = rSect.left; - y = rSect.top; - nWidth = rSect.right - rSect.left; - nHeight = rSect.bottom - rSect.top; - - MoveWindow(wW,x,y,nWidth,nHeight,FALSE); - - if( TRUE == wasVisible ) - { - UpdateWindow(wW); - ShowWindow(wW,SW_SHOW); - } - - retCode = wW; - } else { - // A coisa indefinida. Nao sei o que - // fazer aqui. E necessario perguntar Jeannette - DestroyWindow(wW); - } - } - } - } - - return retCode; -} - -// Implementations -int WINAPI _countMonitors(void) -{ - g_nMonitorCounter = 0; - - _enumDisplayMonitors(NULL,NULL,clb_fCountMonitors,0L); - - return g_nMonitorCounter; - -} -int WINAPI _collectMonitors(MHND* hmpMonitors,int nNum) -{ - int retCode = 0; - - if( NULL != hmpMonitors ) - { - g_nMonitorCounter = 0; - g_nMonitorLimit = nNum; - g_hmpMonitors = hmpMonitors; - - _enumDisplayMonitors(NULL,NULL,clb_fCollectMonitors,0L); - - retCode = g_nMonitorCounter; - - g_nMonitorCounter = 0; - g_nMonitorLimit = 0; - g_hmpMonitors = NULL; - - } - return retCode; -} -BOOL WINAPI _monitorBounds(MHND hmMonitor,RECT* rpBounds) -{ - BOOL retCode = FALSE; - - if( (NULL != hmMonitor) && (NULL != rpBounds) ) - { - MONITOR_INFO miInfo; - - memset((void*)(&miInfo),0,sizeof(MONITOR_INFO)); - miInfo.dwSize = sizeof(MONITOR_INFO); - - if( TRUE == (retCode = _getMonitorInfo(hmMonitor,&(miInfo))) ) - { - (*rpBounds) = miInfo.rMonitor; - } - } - return retCode; -} - -HDC WINAPI _makeDCFromMonitor(MHND hmMonitor) { - HDC retCode = NULL; - - if( NULL != hmMonitor ) { - - MONITOR_INFO_EXTENDED mieInfo; - - memset((void*)(&mieInfo),0,sizeof(MONITOR_INFO_EXTENDED)); - mieInfo.dwSize = sizeof(MONITOR_INFO_EXTENDED); - - if( TRUE == _getMonitorInfo(hmMonitor,(PMONITOR_INFO)(&mieInfo)) ) { - HDC hDC = CreateDC(mieInfo.strDevice,NULL,NULL,NULL); - - if( NULL != hDC ) { - retCode = hDC; - } - } - } - return retCode; -} - -HWND WINAPI _createWindowOM( MHND hmMonitor,LPCTSTR lpClassName,LPCTSTR lpWindowName, - DWORD dwStyle,int x,int y,int nWidth, - int nHeight,HWND hWndParent,HMENU hMenu, - HANDLE hInstance,LPVOID lpParam ) -{ - if( (CW_USEDEFAULT == x) || (CW_USEDEFAULT == y) || - (CW_USEDEFAULT == nWidth) || (CW_USEDEFAULT == nHeight) ) - { - return __createWindow1 ( - hmMonitor,lpClassName,lpWindowName, - dwStyle,x,y,nWidth, - nHeight,hWndParent,hMenu, - hInstance,lpParam - ); - } - return __createWindow0 ( - hmMonitor,lpClassName,lpWindowName, - dwStyle,x,y,nWidth, - nHeight,hWndParent,hMenu, - hInstance,lpParam - ); -} diff --git a/jdk/src/windows/native/sun/windows/awt_MMStub.h b/jdk/src/windows/native/sun/windows/awt_MMStub.h deleted file mode 100644 index ec73dd74f37..00000000000 --- a/jdk/src/windows/native/sun/windows/awt_MMStub.h +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright 1999-2003 Sun Microsystems, Inc. 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 - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - */ -#ifndef _INC_MMSTUB -#define _INC_MMSTUB - -#ifndef _WINDOWS_ -#include "windows.h" -#endif - -#ifndef _AWT_H_ -#include "awt.h" -#endif - -#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500) - -/* Cdecl for C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/* Constants */ -#define SM_XVSCREEN 76 -#define SM_YVSCREEN 77 -#define SM_CXVSCREEN 78 -#define SM_CYVSCREEN 79 -#define SM_CMONITORS 80 -#define SM_SAMEDSPLFORMAT 81 - -#define MONITOR_DEFAULT_TO_NULL 0x00000000 -#define MONITOR_DEFAULT_TO_PRIMARY 0x00000001 -#define MONITOR_DEFAULT_TO_NEAR 0x00000002 - - - -#define MONITOR_INFO_FLAG_PRIMARY 0x00000001 - -#define DISPLAY_DEVICE_ATTACHED_TO_DESKTOP 0x00000001 -#define DISPLAY_DEVICE_MULTY_DRIVER 0x00000002 -#define DISPLAY_DEVICE_PRIMARY_DEVICE 0x00000004 -#define DISPLAY_DEVICE_MIRRORING_DRIVER 0x00000008 - - -#define DISPLAY_DEVICE_VGA 0x00000010 - -#define ENUM_CURRENT_SETTINGS ((DWORD)-1) -#define ENUM_REGISTRY_SETTINGS ((DWORD)-2) - -#define PRIMARY_MONITOR ((MHND)0x42) - - -#define DEV_NAME_LEN 32 -#define DEV_STR_LEN 128 - - -// Datatypes -typedef HANDLE MHND; -typedef BOOL (CALLBACK* MON_ENUM_CALLBACK_PROC)(MHND,HDC,LPRECT,LPARAM); - -typedef struct tagMONITOR_INFO -{ - DWORD dwSize; - RECT rMonitor; - RECT rWork; - DWORD dwFlags; -} MONITOR_INFO, *PMONITOR_INFO; - -typedef struct tagMONITOR_INFO_EXTENDED -{ - DWORD dwSize; - RECT rMonitor; - RECT rWork; - DWORD dwFlags; - TCHAR strDevice[DEV_NAME_LEN]; -} MONITOR_INFO_EXTENDED, *PMONITOR_INFO_EXTENDED; - -typedef struct tagDISPLAY_DEVICE -{ - DWORD dwSize; - WCHAR strDevName[DEV_NAME_LEN]; - WCHAR strDevString[DEV_STR_LEN]; - DWORD dwFlags; - WCHAR deviceID[128]; - WCHAR deviceKey[128]; -} _DISPLAY_DEVICE, *P_DISPLAY_DEVICE; - -/* Basic API's */ -BOOL WINAPI _enumDisplayMonitors(HDC,LPCRECT,MON_ENUM_CALLBACK_PROC,LPARAM); -BOOL WINAPI _enumDisplayDevices (LPVOID,int,P_DISPLAY_DEVICE,DWORD); -BOOL WINAPI _getMonitorInfo (MHND,PMONITOR_INFO); -MHND WINAPI _monitorFromPoint (POINT,UINT); -MHND WINAPI _monitorFromWindow (HWND,UINT); -MHND WINAPI _monitorFromRect (LPCRECT,UINT); -int WINAPI _getSystemMetrics (int); - -/* Additional API's */ -int WINAPI _countMonitors (void); -int WINAPI _collectMonitors (MHND*,int); -BOOL WINAPI _monitorBounds (MHND,RECT*); -HDC WINAPI _makeDCFromMonitor (MHND); -HWND WINAPI _createWindowOM (MHND,LPCTSTR,LPCTSTR,DWORD,int,int,int, - int,HWND,HMENU,HANDLE,LPVOID); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500) */ - -#endif /* _INC_MMSTUB */ diff --git a/jdk/src/windows/native/sun/windows/awt_MenuItem.cpp b/jdk/src/windows/native/sun/windows/awt_MenuItem.cpp index 626b3a31368..51fc47718cb 100644 --- a/jdk/src/windows/native/sun/windows/awt_MenuItem.cpp +++ b/jdk/src/windows/native/sun/windows/awt_MenuItem.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-2008 Sun Microsystems, Inc. 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 @@ -23,6 +23,7 @@ * have any questions. */ +#include "awt.h" #include "awt_MenuItem.h" #include "awt_Menu.h" #include "awt_MenuBar.h" @@ -70,7 +71,6 @@ jmethodID AwtMenuItem::getDefaultFontMID; LANGID AwtMenuItem::m_idLang = LOWORD(GetKeyboardLayout(0)); UINT AwtMenuItem::m_CodePage = AwtMenuItem::LangToCodePage(AwtMenuItem::m_idLang); -BOOL AwtMenuItem::m_isWin95 = IS_WIN95; BOOL AwtMenuItem::sm_rtl = PRIMARYLANGID(GetInputLanguage()) == LANG_ARABIC || PRIMARYLANGID(GetInputLanguage()) == LANG_HEBREW; BOOL AwtMenuItem::sm_rtlReadingOrder = @@ -150,7 +150,7 @@ BOOL AwtMenuItem::CheckMenuCreation(JNIEnv *env, jobject self, HMENU hMenu) jobject createError = NULL; if (dw == ERROR_OUTOFMEMORY) { - jstring errorMsg = env->NewStringUTF("too many menu handles"); + jstring errorMsg = JNU_NewStringPlatform(env, L"too many menu handles"); createError = JNU_NewObjectByName(env, "java/lang/OutOfMemoryError", "(Ljava/lang/String;)V", errorMsg); @@ -435,16 +435,7 @@ void AwtMenuItem::DrawItem(DRAWITEMSTRUCT& drawInfo) if (drawInfo.itemID != m_Id) return; - /* Fixed bug 4349969. Since the problem occurs on Windows 98 and not on - Windows NT, the fix is to check for Windows 95/98 and to check if the - handle to the menu of the item to be drawn is the same as the handle to the - menu of the menu object. If they're not the same, just return and don't do - the drawing. - */ - if ( IS_WIN95 && drawInfo.hwndItem != (HWND)this->m_menuContainer->GetHMenu()) { - return; - } else - DrawSelf(drawInfo); + DrawSelf(drawInfo); } void AwtMenuItem::MeasureSelf(HDC hDC, MEASUREITEMSTRUCT& measureInfo) @@ -802,8 +793,9 @@ BOOL AwtMenuItem::IsSeparator() { jobject jitem = GetTarget(env); jstring label = (jstring)(env)->GetObjectField(jitem, AwtMenuItem::labelID); - LPWSTR labelW = TO_WSTRING(label); + LPCWSTR labelW = JNU_GetStringPlatformChars(env, label, NULL); BOOL isSeparator = (labelW && (wcscmp(labelW, L"-") == 0)); + JNU_ReleaseStringPlatformChars(env, label, labelW); env->DeleteLocalRef(label); env->DeleteLocalRef(jitem); diff --git a/jdk/src/windows/native/sun/windows/awt_Object.cpp b/jdk/src/windows/native/sun/windows/awt_Object.cpp index aab7e98b502..b6b999be2a7 100644 --- a/jdk/src/windows/native/sun/windows/awt_Object.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Object.cpp @@ -25,9 +25,6 @@ #include "awt_Object.h" #include "ObjectList.h" -#ifdef DEBUG -#include "awt_Unicode.h" -#endif #ifdef DEBUG static BOOL reportEvents = FALSE; @@ -116,8 +113,9 @@ AwtObject::DoCallback(const char* methodName, const char* methodSig, ...) "getName", "()Ljava/lang/String;").l; DASSERT(!safe_ExceptionOccurred(env)); - printf("Posting %s%s method to %S\n", methodName, methodSig, - TO_WSTRING(targetStr)); + LPCWSTR targetStrW = JNU_GetStringPlatformChars(env, targetStr, NULL); + printf("Posting %s%s method to %S\n", methodName, methodSig, targetStrW); + JNU_ReleaseStringPlatformChars(env, targetStr, targetStrW); } #endif /* caching would do much good here */ @@ -148,8 +146,11 @@ void AwtObject::SendEvent(jobject event) (jstring)JNU_CallMethodByName(env, NULL, GetTarget(env),"getName", "()Ljava/lang/String;").l; DASSERT(!safe_ExceptionOccurred(env)); - printf("Posting %S to %S\n", TO_WSTRING(eventStr), - TO_WSTRING(targetStr)); + LPCWSTR eventStrW = JNU_GetStringPlatformChars(env, eventStr, NULL); + LPCWSTR targetStrW = JNU_GetStringPlatformChars(env, targetStr, NULL); + printf("Posting %S to %S\n", eventStrW, targetStrW); + JNU_ReleaseStringPlatformChars(env, eventStr, eventStrW); + JNU_ReleaseStringPlatformChars(env, targetStr, targetStrW); } #endif /* Post event to the system EventQueue. */ diff --git a/jdk/src/windows/native/sun/windows/awt_Palette.cpp b/jdk/src/windows/native/sun/windows/awt_Palette.cpp index ea0488e816f..a567c246d86 100644 --- a/jdk/src/windows/native/sun/windows/awt_Palette.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Palette.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. 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 @@ -23,7 +23,7 @@ * have any questions. */ -#include +#include "awt.h" #include "awt_Palette.h" #include "awt_Component.h" #include "img_util_md.h" diff --git a/jdk/src/windows/native/sun/windows/awt_PopupMenu.cpp b/jdk/src/windows/native/sun/windows/awt_PopupMenu.cpp index 8862b86bda7..794277eda24 100644 --- a/jdk/src/windows/native/sun/windows/awt_PopupMenu.cpp +++ b/jdk/src/windows/native/sun/windows/awt_PopupMenu.cpp @@ -234,11 +234,13 @@ void AwtPopupMenu::Enable(BOOL isEnabled) jobject jitem = item->GetTarget(env); BOOL bItemEnabled = isEnabled && (jboolean)env->GetBooleanField(jitem, AwtMenuItem::enabledID); - LPWSTR labelW = TO_WSTRING((jstring)env->GetObjectField(jitem, - AwtMenuItem::labelID)); - if (labelW != NULL && wcscmp(labelW,L"-") != 0) { + jstring labelStr = static_cast(env->GetObjectField(jitem, AwtMenuItem::labelID)); + LPCWSTR labelStrW = JNU_GetStringPlatformChars(env, labelStr, NULL); + if (labelStrW && wcscmp(labelStrW, L"-") != 0) { item->Enable(bItemEnabled); } + JNU_ReleaseStringPlatformChars(env, labelStr, labelStrW); + env->DeleteLocalRef(labelStr); env->DeleteLocalRef(jitem); } env->DeleteLocalRef(target); diff --git a/jdk/src/windows/native/sun/windows/awt_PrintControl.cpp b/jdk/src/windows/native/sun/windows/awt_PrintControl.cpp index 486d9f66950..cc562ec0056 100644 --- a/jdk/src/windows/native/sun/windows/awt_PrintControl.cpp +++ b/jdk/src/windows/native/sun/windows/awt_PrintControl.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. 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 @@ -108,16 +108,13 @@ BOOL AwtPrintControl::FindPrinter(jstring printerName, LPBYTE pPrinterEnum, { JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - BOOL nt = IS_NT; DWORD cReturned = 0; if (pPrinterEnum == NULL) { // Compute size of buffer DWORD cbNeeded = 0; - if (nt) { - ::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, + ::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, NULL, 2, NULL, 0, &cbNeeded, &cReturned); - } ::EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 5, NULL, 0, pcbBuf, &cReturned); if (cbNeeded > (*pcbBuf)) { @@ -139,65 +136,63 @@ BOOL AwtPrintControl::FindPrinter(jstring printerName, LPBYTE pPrinterEnum, // doesn't support port searches. So, if the user has specified the // printer name as "LPT1:" (even though this is actually a port // name), we won't find the printer here. - if (nt) { - if (!::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, - NULL, 4, pPrinterEnum, cbBuf, &dummyWord, &cReturned)) { - return FALSE; - } + if (!::EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, + NULL, 4, pPrinterEnum, cbBuf, &dummyWord, &cReturned)) { + return FALSE; + } - for (DWORD i = 0; i < cReturned; i++) { - PRINTER_INFO_4 *info4 = (PRINTER_INFO_4 *) - (pPrinterEnum + i * sizeof(PRINTER_INFO_4)); - if (info4->pPrinterName != NULL && - _tcsicmp(lpcPrinterName, info4->pPrinterName) == 0) { + for (DWORD i = 0; i < cReturned; i++) { + PRINTER_INFO_4 *info4 = (PRINTER_INFO_4 *) + (pPrinterEnum + i * sizeof(PRINTER_INFO_4)); + if (info4->pPrinterName != NULL && + _tcsicmp(lpcPrinterName, info4->pPrinterName) == 0) { - // Fix for BugTraq Id 4281380. - // Get the port name since some drivers may require - // this name to be passed to ::DeviceCapabilities(). - HANDLE hPrinter = NULL; - if (::OpenPrinter(info4->pPrinterName, &hPrinter, NULL)) { - // Fix for BugTraq Id 4286812. - // Some drivers don't support PRINTER_INFO_5. - // In this case we try PRINTER_INFO_2, and if that - // isn't supported as well return NULL port name. - try { - if (AwtPrintControl::IsSupportedLevel(hPrinter, 5)) { - VERIFY(::GetPrinter(hPrinter, 5, pPrinterEnum, cbBuf, - &dummyWord)); - PRINTER_INFO_5 *info5 = (PRINTER_INFO_5 *)pPrinterEnum; - *foundPrinter = info5->pPrinterName; - // pPortName may specify multiple ports. We only want one. - *foundPort = (info5->pPortName != NULL) - ? _tcstok(info5->pPortName, TEXT(",")) : NULL; - } else if (AwtPrintControl::IsSupportedLevel(hPrinter, 2)) { - VERIFY(::GetPrinter(hPrinter, 2, pPrinterEnum, cbBuf, - &dummyWord)); - PRINTER_INFO_2 *info2 = (PRINTER_INFO_2 *)pPrinterEnum; - *foundPrinter = info2->pPrinterName; - // pPortName may specify multiple ports. We only want one. - *foundPort = (info2->pPortName != NULL) - ? _tcstok(info2->pPortName, TEXT(",")) : NULL; - } else { - *foundPrinter = info4->pPrinterName; - // We failed to determine port name for the found printer. - *foundPort = NULL; - } - } catch (std::bad_alloc&) { - VERIFY(::ClosePrinter(hPrinter)); - throw; + // Fix for BugTraq Id 4281380. + // Get the port name since some drivers may require + // this name to be passed to ::DeviceCapabilities(). + HANDLE hPrinter = NULL; + if (::OpenPrinter(info4->pPrinterName, &hPrinter, NULL)) { + // Fix for BugTraq Id 4286812. + // Some drivers don't support PRINTER_INFO_5. + // In this case we try PRINTER_INFO_2, and if that + // isn't supported as well return NULL port name. + try { + if (AwtPrintControl::IsSupportedLevel(hPrinter, 5)) { + VERIFY(::GetPrinter(hPrinter, 5, pPrinterEnum, cbBuf, + &dummyWord)); + PRINTER_INFO_5 *info5 = (PRINTER_INFO_5 *)pPrinterEnum; + *foundPrinter = info5->pPrinterName; + // pPortName may specify multiple ports. We only want one. + *foundPort = (info5->pPortName != NULL) + ? _tcstok(info5->pPortName, TEXT(",")) : NULL; + } else if (AwtPrintControl::IsSupportedLevel(hPrinter, 2)) { + VERIFY(::GetPrinter(hPrinter, 2, pPrinterEnum, cbBuf, + &dummyWord)); + PRINTER_INFO_2 *info2 = (PRINTER_INFO_2 *)pPrinterEnum; + *foundPrinter = info2->pPrinterName; + // pPortName may specify multiple ports. We only want one. + *foundPort = (info2->pPortName != NULL) + ? _tcstok(info2->pPortName, TEXT(",")) : NULL; + } else { + *foundPrinter = info4->pPrinterName; + // We failed to determine port name for the found printer. + *foundPort = NULL; } - + } catch (std::bad_alloc&) { VERIFY(::ClosePrinter(hPrinter)); - - return TRUE; + throw; } - return FALSE; + VERIFY(::ClosePrinter(hPrinter)); + + return TRUE; } + + return FALSE; } } - // We still haven't found the printer, or we're using 95/98. + // We still haven't found the printer, /* or we're using 95/98. */ // PRINTER_INFO_5 supports both printer name and port name, so // we'll test both. On NT, PRINTER_ENUM_LOCAL means just local // printers. This is what we want, because we already tested all @@ -213,28 +208,17 @@ BOOL AwtPrintControl::FindPrinter(jstring printerName, LPBYTE pPrinterEnum, for (DWORD i = 0; i < cReturned; i++) { PRINTER_INFO_5 *info5 = (PRINTER_INFO_5 *) (pPrinterEnum + i * sizeof(PRINTER_INFO_5)); - if (nt) { - // pPortName can specify multiple ports. Test them one at - // a time. - if (info5->pPortName != NULL) { - LPTSTR port = _tcstok(info5->pPortName, TEXT(",")); - while (port != NULL) { - if (_tcsicmp(lpcPrinterName, port) == 0) { - *foundPrinter = info5->pPrinterName; - *foundPort = port; - return TRUE; - } - port = _tcstok(NULL, TEXT(",")); + // pPortName can specify multiple ports. Test them one at + // a time. + if (info5->pPortName != NULL) { + LPTSTR port = _tcstok(info5->pPortName, TEXT(",")); + while (port != NULL) { + if (_tcsicmp(lpcPrinterName, port) == 0) { + *foundPrinter = info5->pPrinterName; + *foundPort = port; + return TRUE; } - } - } else { - if ((info5->pPrinterName != NULL && - _tcsicmp(lpcPrinterName, info5->pPrinterName) == 0) || - (info5->pPortName != NULL && - _tcsicmp(lpcPrinterName, info5->pPortName) == 0)) { - *foundPrinter = info5->pPrinterName; - *foundPort = info5->pPortName; - return TRUE; + port = _tcstok(NULL, TEXT(",")); } } } @@ -400,13 +384,11 @@ BOOL AwtPrintControl::CreateDevModeAndDevNames(PRINTDLG *ppd, } // Create DEVNAMES. - if (IS_NT) { - if (pPortName != NULL) { - info2->pPortName = pPortName; - } else if (info2->pPortName != NULL) { - // pPortName may specify multiple ports. We only want one. - info2->pPortName = _tcstok(info2->pPortName, TEXT(",")); - } + if (pPortName != NULL) { + info2->pPortName = pPortName; + } else if (info2->pPortName != NULL) { + // pPortName may specify multiple ports. We only want one. + info2->pPortName = _tcstok(info2->pPortName, TEXT(",")); } size_t lenDriverName = ((info2->pDriverName != NULL) diff --git a/jdk/src/windows/native/sun/windows/awt_PrintDialog.cpp b/jdk/src/windows/native/sun/windows/awt_PrintDialog.cpp index d9e738411ae..762ae2673eb 100644 --- a/jdk/src/windows/native/sun/windows/awt_PrintDialog.cpp +++ b/jdk/src/windows/native/sun/windows/awt_PrintDialog.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. 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 @@ -23,10 +23,10 @@ * have any questions. */ +#include "awt.h" #include "awt_PrintDialog.h" #include "awt_Dialog.h" #include "awt_PrintControl.h" -#include "awt_dlls.h" #include "awt_Window.h" #include "ComCtl32Util.h" #include @@ -39,11 +39,9 @@ jmethodID AwtPrintDialog::setHWndMID; BOOL AwtPrintDialog::PrintDlg(LPPRINTDLG data) { - AwtCommDialog::load_comdlg_procs(); return static_cast(reinterpret_cast( AwtToolkit::GetInstance().InvokeFunction( - reinterpret_cast(AwtCommDialog::PrintDlgWrapper), - data))); + reinterpret_cast(::PrintDlg), data))); } LRESULT CALLBACK PrintDialogWndProc(HWND hWnd, UINT message, diff --git a/jdk/src/windows/native/sun/windows/awt_PrintJob.cpp b/jdk/src/windows/native/sun/windows/awt_PrintJob.cpp index 0ecd0388ac0..9136b786412 100644 --- a/jdk/src/windows/native/sun/windows/awt_PrintJob.cpp +++ b/jdk/src/windows/native/sun/windows/awt_PrintJob.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-2008 Sun Microsystems, Inc. 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 @@ -23,6 +23,7 @@ * have any questions. */ +#include "awt.h" #include #include #include @@ -30,10 +31,9 @@ #include #include -#include "awt.h" -#include "awt_dlls.h" #include "awt_Toolkit.h" #include "awt_Component.h" +#include "awt_Dialog.h" #include "awt_Font.h" #include "awt_PrintDialog.h" #include "awt_PrintControl.h" @@ -422,7 +422,7 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer) */ if (AwtPrintControl::getPrintHDMode(env, self) == NULL || AwtPrintControl::getPrintHDName(env,self) == NULL) { - (void)AwtCommDialog::PageSetupDlg(&setup); + (void)::PageSetupDlg(&setup); /* check if hDevMode and hDevNames are set. * If both are null, then there is no default printer. */ @@ -460,7 +460,7 @@ Java_sun_awt_windows_WPageDialogPeer__1show(JNIEnv *env, jobject peer) AwtDialog::CheckInstallModalHook(); - BOOL ret = AwtCommDialog::PageSetupDlg(&setup); + BOOL ret = ::PageSetupDlg(&setup); if (ret) { jobject paper = getPaper(env, page); @@ -733,7 +733,7 @@ Java_sun_awt_windows_WPrinterJob_validatePaper(JNIEnv *env, jobject self, pd.lStructSize = sizeof(PRINTDLG); pd.Flags = PD_RETURNDEFAULT | PD_RETURNDC; - if (AwtCommDialog::PrintDlg(&pd)) { + if (::PrintDlg(&pd)) { printDC = pd.hDC; hDevMode = pd.hDevMode; hDevNames = pd.hDevNames; @@ -1838,10 +1838,6 @@ JNIEXPORT jboolean JNICALL Java_sun_awt_windows_WPrinterJob_selectStylePen (JNIEnv *env, jobject self, jlong printDC, jlong cap, jlong join, jfloat width, jint red, jint green, jint blue) { - /* End cap and line join styles are not supported in Win 9x. */ - if (IS_WIN95) - return JNI_FALSE; - TRY; LOGBRUSH logBrush; @@ -1879,23 +1875,13 @@ JNIEXPORT jboolean JNICALL Java_sun_awt_windows_WPrinterJob_setFont { jboolean didSetFont = JNI_FALSE; - if (IS_NT) { - didSetFont = jFontToWFontW(env, (HDC)printDC, + didSetFont = jFontToWFontW(env, (HDC)printDC, fontName, fontSize, isBold, isItalic, rotation, awScale); - } else { - didSetFont = jFontToWFontA(env, (HDC)printDC, - fontName, - fontSize, - isBold, - isItalic, - rotation, - awScale); - } return didSetFont; } @@ -1919,7 +1905,7 @@ static jboolean jFontToWFontA(JNIEnv *env, HDC printDC, jstring fontName, memset(&matchedLogFont, 0, sizeof(matchedLogFont)); - WCHAR* name = TO_WSTRING(fontName); + LPCWSTR fontNameW = JNU_GetStringPlatformChars(env, fontName, NULL); /* Some fontnames of Non-ASCII fonts like 'MS Minchou' are themselves @@ -1928,14 +1914,14 @@ static jboolean jFontToWFontA(JNIEnv *env, HDC printDC, jstring fontName, */ int maxlen = static_cast(sizeof(lf.lfFaceName)) - 1; // maxlen is int due to cbMultiByte parameter is int - int destLen = WideCharToMultiByte(CP_ACP, // convert to ASCII code page - 0, // flags - name, // Unicode string - -1, // Unicode length is calculated automatically + int destLen = WideCharToMultiByte(CP_ACP, // convert to ASCII code page + 0, // flags + fontNameW, // Unicode string + -1, // Unicode length is calculated automatically lf.lfFaceName, // Put ASCII string here - maxlen, // max len - NULL, // default handling of unmappables - NULL);// do not care if def char is used + maxlen, // max len + NULL, // default handling of unmappables + NULL); // do not care if def char is used /* If WideCharToMultiByte succeeded then the number * of bytes it copied into the face name buffer will @@ -2018,9 +2004,10 @@ static jboolean jFontToWFontA(JNIEnv *env, HDC printDC, jstring fontName, } else { foundFont = false; } - } + JNU_ReleaseStringPlatformChars(env, fontName, fontNameW); + return foundFont ? JNI_TRUE : JNI_FALSE; } @@ -2043,27 +2030,29 @@ static jboolean jFontToWFontW(JNIEnv *env, HDC printDC, jstring fontName, memset(&matchedLogFont, 0, sizeof(matchedLogFont)); + LPCWSTR fontNameW = JNU_GetStringPlatformChars(env, fontName, NULL); + /* Describe the GDI fonts we want enumerated. We * simply supply the java font name and let GDI * do the matching. If the java font name is * longer than the GDI maximum font lenght then * we can't convert the font. */ - WCHAR* name = TO_WSTRING(fontName); - size_t nameLen = wcslen(name); - + size_t nameLen = wcslen(fontNameW); if (nameLen < (sizeof(lf.lfFaceName) / sizeof(lf.lfFaceName[0]))) { - wcscpy(lf.lfFaceName, name); + wcscpy(lf.lfFaceName, fontNameW); lf.lfCharSet = DEFAULT_CHARSET; lf.lfPitchAndFamily = 0; - foundFont = !EnumFontFamiliesExW((HDC)printDC, &lf, + foundFont = !::EnumFontFamiliesEx((HDC)printDC, &lf, (FONTENUMPROCW) fontEnumProcW, (LPARAM) &matchedLogFont, 0); } + JNU_ReleaseStringPlatformChars(env, fontName, fontNameW); + if (!foundFont) { return JNI_FALSE; } @@ -2100,7 +2089,7 @@ static jboolean jFontToWFontW(JNIEnv *env, HDC printDC, jstring fontName, //Debug: dumpLogFont(&matchedLogFont); - HFONT font = CreateFontIndirectW(&matchedLogFont); + HFONT font = ::CreateFontIndirect(&matchedLogFont); if (font == NULL) { return JNI_FALSE; } @@ -2123,7 +2112,7 @@ static jboolean jFontToWFontW(JNIEnv *env, HDC printDC, jstring fontName, GetTextMetrics(printDC, &tm); avgWidth = tm.tmAveCharWidth; matchedLogFont.lfWidth = (LONG)((fabs)(avgWidth*awScale)); - font = CreateFontIndirectW(&matchedLogFont); + font = ::CreateFontIndirect(&matchedLogFont); if (font == NULL) { return JNI_FALSE; } @@ -2230,14 +2219,11 @@ JNIEXPORT jint JNICALL Java_sun_awt_windows_WPrinterJob_getGDIAdvance (JNIEnv *env, jobject self, jlong printDC, jstring text) { SIZE size; - LPWSTR wText = TO_WSTRING(text); + LPCWSTR wText = JNU_GetStringPlatformChars(env, text, NULL); size_t strLen = wcslen(wText); BOOL ok = GetTextExtentPoint32((HDC)printDC, wText, (int)strLen, &size); - if (ok) { - return size.cx; - } else { - return 0; - } + JNU_ReleaseStringPlatformChars(env, text, wText); + return ok ? size.cx : 0; } @@ -2288,7 +2274,7 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_textOut long posX = ROUND_TO_LONG(x); long posY = ROUND_TO_LONG(y); int flags = (glyphCodes !=0) ? ETO_GLYPH_INDEX : 0; - LPWSTR wText = TO_WSTRING(text); + LPCWSTR wText = JNU_GetStringPlatformChars(env, text, NULL); int *advances = NULL, *xadvances = NULL, *xyadvances = NULL; BOOL useYAdvances = FALSE; @@ -2359,7 +2345,7 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_textOut *inxyAdvances = 0; } - if (useYAdvances && IS_WIN2000) { + if (useYAdvances) { advances = xyadvances; flags |= J2D_ETO_PDY; } else { @@ -2371,7 +2357,7 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_textOut env->ReleaseFloatArrayElements(positions, glyphPos, JNI_ABORT); } - BOOL drawn = ::ExtTextOutW( (HDC)printDC, + BOOL drawn = ::ExtTextOut((HDC)printDC, posX, posY, // starting position for the text flags, // glyphCodes?, y advances? NULL, // optional clipping-opaquing rectangle @@ -2385,6 +2371,8 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WPrinterJob_textOut if (xyadvances != NULL) { free(xyadvances); } + + JNU_ReleaseStringPlatformChars(env, text, wText); } /** @@ -2968,7 +2956,7 @@ static HDC getDefaultPrinterDC(JNIEnv *env, jobject printerJob) { pd.lStructSize = sizeof(PRINTDLG); pd.Flags = PD_RETURNDEFAULT | PD_RETURNDC; - if (AwtCommDialog::PrintDlg(&pd)) { + if (::PrintDlg(&pd)) { printDC = pd.hDC; /* Find out how many copies the driver can do, and use driver's diff --git a/jdk/src/windows/native/sun/windows/awt_Robot.cpp b/jdk/src/windows/native/sun/windows/awt_Robot.cpp index 15a9a243fd1..e774f5160db 100644 --- a/jdk/src/windows/native/sun/windows/awt_Robot.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Robot.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. 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 @@ -23,6 +23,7 @@ * have any questions. */ +#include "awt.h" #include "awt_Toolkit.h" #include "awt_Component.h" #include "awt_Robot.h" @@ -30,8 +31,6 @@ #include "java_awt_event_InputEvent.h" #include -static const int MOUSE_MAX = 65535; - AwtRobot::AwtRobot( jobject peer ) { JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); @@ -44,11 +43,11 @@ AwtRobot::~AwtRobot() } #ifndef SPI_GETMOUSESPEED -#define SPI_GETMOUSESPEED 112 +#define SPI_GETMOUSESPEED 112 #endif #ifndef SPI_SETMOUSESPEED -#define SPI_SETMOUSESPEED 113 +#define SPI_SETMOUSESPEED 113 #endif void AwtRobot::MouseMove( jint x, jint y) @@ -102,19 +101,38 @@ void AwtRobot::MousePress( jint buttonMask ) // left handed mouse setup BOOL bSwap = ::GetSystemMetrics(SM_SWAPBUTTON); - if ( buttonMask & java_awt_event_InputEvent_BUTTON1_MASK ) { + if ( buttonMask & java_awt_event_InputEvent_BUTTON1_MASK || + buttonMask & java_awt_event_InputEvent_BUTTON1_DOWN_MASK) + { dwFlags |= !bSwap ? MOUSEEVENTF_LEFTDOWN : MOUSEEVENTF_RIGHTDOWN; } - if ( buttonMask & java_awt_event_InputEvent_BUTTON3_MASK ) { + if ( buttonMask & java_awt_event_InputEvent_BUTTON3_MASK || + buttonMask & java_awt_event_InputEvent_BUTTON3_DOWN_MASK) + { dwFlags |= !bSwap ? MOUSEEVENTF_RIGHTDOWN : MOUSEEVENTF_LEFTDOWN; } - if ( buttonMask & java_awt_event_InputEvent_BUTTON2_MASK ) { + if ( buttonMask & java_awt_event_InputEvent_BUTTON2_MASK || + buttonMask & java_awt_event_InputEvent_BUTTON2_DOWN_MASK) + { dwFlags |= MOUSEEVENTF_MIDDLEDOWN; } - mouse_event(dwFlags, 0, 0, 0, 0 ); + INPUT mouseInput = {0}; + mouseInput.type = INPUT_MOUSE; + mouseInput.mi.time = 0; + mouseInput.mi.dwFlags = dwFlags; + if ( buttonMask & AwtComponent::masks[3] ) { + mouseInput.mi.dwFlags = mouseInput.mi.dwFlags | MOUSEEVENTF_XDOWN; + mouseInput.mi.mouseData = XBUTTON1; + } + + if ( buttonMask & AwtComponent::masks[4] ) { + mouseInput.mi.dwFlags = mouseInput.mi.dwFlags | MOUSEEVENTF_XDOWN; + mouseInput.mi.mouseData = XBUTTON2; + } + ::SendInput(1, &mouseInput, sizeof(mouseInput)); } void AwtRobot::MouseRelease( jint buttonMask ) @@ -125,61 +143,43 @@ void AwtRobot::MouseRelease( jint buttonMask ) // left handed mouse setup BOOL bSwap = ::GetSystemMetrics(SM_SWAPBUTTON); - if ( buttonMask & java_awt_event_InputEvent_BUTTON1_MASK ) { + if ( buttonMask & java_awt_event_InputEvent_BUTTON1_MASK || + buttonMask & java_awt_event_InputEvent_BUTTON1_DOWN_MASK) + { dwFlags |= !bSwap ? MOUSEEVENTF_LEFTUP : MOUSEEVENTF_RIGHTUP; } - if ( buttonMask & java_awt_event_InputEvent_BUTTON3_MASK ) { + if ( buttonMask & java_awt_event_InputEvent_BUTTON3_MASK || + buttonMask & java_awt_event_InputEvent_BUTTON3_DOWN_MASK) + { dwFlags |= !bSwap ? MOUSEEVENTF_RIGHTUP : MOUSEEVENTF_LEFTUP; } - if ( buttonMask & java_awt_event_InputEvent_BUTTON2_MASK ) { + if ( buttonMask & java_awt_event_InputEvent_BUTTON2_MASK || + buttonMask & java_awt_event_InputEvent_BUTTON2_DOWN_MASK) + { dwFlags |= MOUSEEVENTF_MIDDLEUP; } - mouse_event(dwFlags, 0, 0, 0, 0 ); + INPUT mouseInput = {0}; + mouseInput.type = INPUT_MOUSE; + mouseInput.mi.time = 0; + mouseInput.mi.dwFlags = dwFlags; + + if ( buttonMask & AwtComponent::masks[3] ) { + mouseInput.mi.dwFlags = mouseInput.mi.dwFlags | MOUSEEVENTF_XUP; + mouseInput.mi.mouseData = XBUTTON1; + } + + if ( buttonMask & AwtComponent::masks[4] ) { + mouseInput.mi.dwFlags = mouseInput.mi.dwFlags | MOUSEEVENTF_XUP; + mouseInput.mi.mouseData = XBUTTON2; + } + ::SendInput(1, &mouseInput, sizeof(mouseInput)); } void AwtRobot::MouseWheel (jint wheelAmt) { - if (IS_WIN95 && !IS_WIN98) { - // Other win32 platforms do nothing for mouse_event(0), so - // do nothing on 95, too. - if (wheelAmt == 0) { - return; - } - - // Win95 doesn't understand MOUSEEVENTF_WHEEL, so use PostEvent - POINT curPos; - HWND mouseOver = NULL; - HWND topLevel = NULL; - UINT wheelMsg = NULL; - - if (::GetCursorPos((LPPOINT)&curPos) == 0) { - return; - } - // get hwnd of top-level container - mouseOver = ::WindowFromPoint(curPos); - DASSERT(mouseOver); - topLevel = AwtComponent::GetTopLevelParentForWindow(mouseOver); - DASSERT(topLevel); - - if (::ScreenToClient(topLevel, (LPPOINT)&curPos) == 0) { - return; - } - wheelMsg = AwtComponent::Wheel95GetMsg(); - - if (wheelMsg == NULL) { - return; - } - - ::PostMessage(topLevel, - wheelMsg, - wheelAmt * -1 * WHEEL_DELTA, - MAKELPARAM((WORD)curPos.x, (WORD)curPos.y)); - } - else { - mouse_event(MOUSEEVENTF_WHEEL, 0, 0, wheelAmt * -1 * WHEEL_DELTA, 0); - } + mouse_event(MOUSEEVENTF_WHEEL, 0, 0, wheelAmt * -1 * WHEEL_DELTA, 0); } inline jint AwtRobot::WinToJavaPixel(USHORT r, USHORT g, USHORT b) @@ -437,3 +437,9 @@ JNIEXPORT void JNICALL Java_sun_awt_windows_WRobotPeer_keyRelease( CATCH_BAD_ALLOC; } + +JNIEXPORT jint JNICALL Java_sun_awt_windows_WRobotPeer_getNumberOfButtons( + JNIEnv *, jobject self) +{ + return GetSystemMetrics(SM_CMOUSEBUTTONS); +} diff --git a/jdk/src/windows/native/sun/windows/awt_Robot.h b/jdk/src/windows/native/sun/windows/awt_Robot.h index ec25746e7b3..ba532c74821 100644 --- a/jdk/src/windows/native/sun/windows/awt_Robot.h +++ b/jdk/src/windows/native/sun/windows/awt_Robot.h @@ -1,5 +1,5 @@ /* - * Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 Sun Microsystems, Inc. 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 @@ -42,13 +42,13 @@ class AwtRobot : public AwtObject void MouseRelease( jint buttonMask ); void MouseWheel(jint wheelAmt); + jint getNumberOfButtons(); jint GetRGBPixel( jint x, jint y); void GetRGBPixels(jint x, jint y, jint width, jint height, jintArray pixelArray); void KeyPress( jint key ); void KeyRelease( jint key ); - static AwtRobot * GetRobot( jobject self ); private: diff --git a/jdk/src/windows/native/sun/windows/awt_ScrollPane.cpp b/jdk/src/windows/native/sun/windows/awt_ScrollPane.cpp index 3975a3fd8d5..4d41e0b0cbe 100644 --- a/jdk/src/windows/native/sun/windows/awt_ScrollPane.cpp +++ b/jdk/src/windows/native/sun/windows/awt_ScrollPane.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-2008 Sun Microsystems, Inc. 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 @@ -108,13 +108,6 @@ AwtScrollPane* AwtScrollPane::Create(jobject self, jobject parent) { DWORD style = WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS; - if (!IS_WIN4X) { - /* - * It's been decided by the UI folks that 3.X ScrollPanes - * should have borders... - */ - style |= WS_BORDER; - } jint scrollbarDisplayPolicy = env->GetIntField(target, scrollbarDisplayPolicyID); @@ -122,7 +115,7 @@ AwtScrollPane* AwtScrollPane::Create(jobject self, jobject parent) == java_awt_ScrollPane_SCROLLBARS_ALWAYS) { style |= WS_HSCROLL | WS_VSCROLL; } - DWORD exStyle = IS_WIN4X ? WS_EX_CLIENTEDGE : 0; + DWORD exStyle = WS_EX_CLIENTEDGE; if (GetRTL()) { exStyle |= WS_EX_RIGHT | WS_EX_LEFTSCROLLBAR; @@ -225,15 +218,8 @@ void AwtScrollPane::RecalcSizes(int parentWidth, int parentHeight, } /* Determine border width without scrollbars. */ - int horzBorder; - int vertBorder; - if (IS_WIN4X) { - horzBorder = ::GetSystemMetrics(SM_CXEDGE); - vertBorder = ::GetSystemMetrics(SM_CYEDGE); - } else { - horzBorder = ::GetSystemMetrics(SM_CXBORDER); - vertBorder = ::GetSystemMetrics(SM_CYBORDER); - } + int horzBorder = ::GetSystemMetrics(SM_CXEDGE);; + int vertBorder = ::GetSystemMetrics(SM_CYEDGE);; parentWidth -= (horzBorder * 2); parentHeight -= (vertBorder * 2); diff --git a/jdk/src/windows/native/sun/windows/awt_TextArea.cpp b/jdk/src/windows/native/sun/windows/awt_TextArea.cpp index 92a36b7a1a9..e0d4c6158c2 100644 --- a/jdk/src/windows/native/sun/windows/awt_TextArea.cpp +++ b/jdk/src/windows/native/sun/windows/awt_TextArea.cpp @@ -26,10 +26,8 @@ #include "awt_Toolkit.h" #include "awt_TextArea.h" #include "awt_TextComponent.h" -#include "awt_dlls.h" #include "awt_KeyboardFocusManager.h" #include "awt_Canvas.h" -#include "awt_Unicode.h" #include "awt_Window.h" /* IMPORTANT! Read the README.JNI file for notes on JNI converted AWT code. @@ -50,7 +48,6 @@ struct ReplaceTextStruct { jfieldID AwtTextArea::scrollbarVisibilityID; WNDPROC AwtTextArea::sm_pDefWindowProc = NULL; -BOOL AwtTextArea::sm_RichEdit20 = (IS_WIN98 || IS_NT); /************************************************************************ * AwtTextArea methods @@ -78,8 +75,12 @@ void AwtTextArea::Dispose() } LPCTSTR AwtTextArea::GetClassName() { - load_rich_edit_library(); - return sm_RichEdit20 ? RICHEDIT_CLASS : TEXT("RICHEDIT"); + static BOOL richedLibraryLoaded = FALSE; + if (!richedLibraryLoaded) { + ::LoadLibrary(TEXT("RICHED20.DLL")); + richedLibraryLoaded = TRUE; + } + return RICHEDIT_CLASS; } /* Create a new AwtTextArea object and window. */ @@ -134,9 +135,8 @@ AwtTextArea* AwtTextArea::Create(jobject peer, jobject parent) * scrollbars instead of hiding them when not needed. */ DWORD style = WS_CHILD | WS_CLIPSIBLINGS | ES_LEFT | ES_MULTILINE | - ES_WANTRETURN | scroll_style | - (IS_WIN4X ? 0 : WS_BORDER) | ES_DISABLENOSCROLL; - DWORD exStyle = IS_WIN4X ? WS_EX_CLIENTEDGE : 0; + ES_WANTRETURN | scroll_style | ES_DISABLENOSCROLL; + DWORD exStyle = WS_EX_CLIENTEDGE; if (GetRTL()) { exStyle |= WS_EX_RIGHT | WS_EX_LEFTSCROLLBAR; if (GetRTLReadingOrder()) @@ -169,9 +169,7 @@ AwtTextArea* AwtTextArea::Create(jobject peer, jobject parent) // end-of-document marker or carriage return, // to format paragraphs. // kdm@sparc.spb.su - if (sm_RichEdit20) { - c->SendMessage(EM_SETTEXTMODE, TM_PLAINTEXT, 0); - } + c->SendMessage(EM_SETTEXTMODE, TM_PLAINTEXT, 0); c->m_backgroundColorSet = TRUE; /* suppress inheriting parent's color. */ @@ -242,7 +240,7 @@ size_t AwtTextArea::CountNewLines(JNIEnv *env, jstring jStr, size_t maxlen) */ size_t length = env->GetStringLength(jStr) + 1; WCHAR *string = new WCHAR[length]; - env->GetStringRegion(jStr, 0, static_cast(length - 1), string); + env->GetStringRegion(jStr, 0, static_cast(length - 1), reinterpret_cast(string)); string[length-1] = '\0'; for (size_t i = 0; i < maxlen && i < length - 1; i++) { if (string[i] == L'\n') { @@ -461,12 +459,7 @@ AwtTextArea::WmContextMenu(HWND hCtrl, UINT xPos, UINT yPos) { /* Check if all the text is selected. */ if (cr.cpMin == 0) { - int len = 0; - if (m_isWin95) { - len = ::GetWindowTextLengthA(GetHWnd()); - } else { - len = ::GetWindowTextLengthW(GetHWnd()); - } + int len = ::GetWindowTextLength(GetHWnd()); if (cr.cpMin == 0 && cr.cpMax >= len) { /* * All the text is selected in RichEdit - select all the @@ -738,14 +731,8 @@ AwtTextArea::HandleEvent(MSG *msg, BOOL synthetic) // kdm@sparc.spb.su UINT platfScrollLines = 3; // Retrieve a number of scroll lines. - if (!sm_RichEdit20) { - // 95 doesn't understand the SPI_GETWHEELSCROLLLINES - get the user - // preference by other means - platfScrollLines = Wheel95GetScrLines(); - } else { - ::SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, - &platfScrollLines, 0); - } + ::SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, + &platfScrollLines, 0); if (platfScrollLines > 0) { HWND hWnd = GetHWnd(); @@ -838,23 +825,6 @@ AwtTextArea::HandleEvent(MSG *msg, BOOL synthetic) return returnVal; } -int AwtTextArea::GetText(LPTSTR buffer, int size) -{ - // Due to a known limitation of the MSLU, GetWindowText cannot be - // issued for the Unicode RichEdit control on Win9x. Use EM_GETTEXTEX instead. - if (sm_RichEdit20 && !IS_NT) { - GETTEXTEX gte; - gte.cb = size * sizeof(TCHAR); - gte.flags = GT_USECRLF; - gte.codepage = 1200; // implies Unicode - gte.lpDefaultChar = NULL; - gte.lpUsedDefChar = NULL; - return (int)SendMessage(EM_GETTEXTEX, (WPARAM)>e, (LPARAM)buffer); - } else { - return ::GetWindowText(GetHWnd(), buffer, size); - } -} - /* * WM_CTLCOLOR is not sent by rich edit controls. * Use EM_SETCHARFORMAT and EM_SETBKGNDCOLOR to set @@ -984,16 +954,16 @@ void AwtTextArea::_ReplaceText(void *param) jsize length = env->GetStringLength(text) + 1; // Bugid 4141477 - Can't use TO_WSTRING here because it uses alloca // WCHAR* buffer = TO_WSTRING(text); - WCHAR *buffer = new WCHAR[length]; - env->GetStringRegion(text, 0, length-1, buffer); + TCHAR *buffer = new TCHAR[length]; + env->GetStringRegion(text, 0, length-1, reinterpret_cast(buffer)); buffer[length-1] = '\0'; c->CheckLineSeparator(buffer); c->RemoveCR(buffer); // Fix for 5003402: added restoring/hiding selection to enable automatic scrolling c->SendMessage(EM_HIDESELECTION, FALSE, TRUE); - c->SendMessageW(EM_SETSEL, start, end); - c->SendMessageW(EM_REPLACESEL, FALSE, (LPARAM)buffer); + c->SendMessage(EM_SETSEL, start, end); + c->SendMessage(EM_REPLACESEL, FALSE, (LPARAM)buffer); c->SendMessage(EM_HIDESELECTION, TRUE, TRUE); delete[] buffer; @@ -1187,12 +1157,11 @@ AwtTextArea::OleCallback::QueryAcceptData(LPDATAOBJECT pdataobj, HGLOBAL hMetaPict) { if (reco == RECO_PASTE) { // If CF_TEXT format is available edit controls will select it, - // otherwise if it is WinNT or Win2000 and CF_UNICODETEXT is - // available it will be selected, otherwise if CF_OEMTEXT is - // available it will be selected. + // otherwise if it is CF_UNICODETEXT is available it will be + // selected, otherwise if CF_OEMTEXT is available it will be selected. if (::IsClipboardFormatAvailable(CF_TEXT)) { *pcfFormat = CF_TEXT; - } else if (!m_isWin95 && ::IsClipboardFormatAvailable(CF_UNICODETEXT)) { + } else if (::IsClipboardFormatAvailable(CF_UNICODETEXT)) { *pcfFormat = CF_UNICODETEXT; } else if (::IsClipboardFormatAvailable(CF_OEMTEXT)) { *pcfFormat = CF_OEMTEXT; diff --git a/jdk/src/windows/native/sun/windows/awt_TextArea.h b/jdk/src/windows/native/sun/windows/awt_TextArea.h index 7e054f61079..12ba0baa658 100644 --- a/jdk/src/windows/native/sun/windows/awt_TextArea.h +++ b/jdk/src/windows/native/sun/windows/awt_TextArea.h @@ -1,5 +1,5 @@ /* - * Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-2008 Sun Microsystems, Inc. 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 @@ -73,8 +73,6 @@ public: MsgRouting WmNcHitTest(UINT x, UINT y, LRESULT &retVal); MsgRouting HandleEvent(MSG *msg, BOOL synthetic); - INLINE virtual int GetText(LPTSTR buffer, int size); - INLINE void SetIgnoreEnChange(BOOL b) { m_bIgnoreEnChange = b; } virtual void SetColor(COLORREF c); @@ -96,10 +94,6 @@ protected: void EditGetSel(CHARRANGE &cr); LONG EditGetCharFromPos(POINT& pt); private: - - // TRUE if the rich edit version is 2.0 - static BOOL sm_RichEdit20; - // RichEdit 1.0 control generates EN_CHANGE notifications not only // on text changes, but also on any character formatting change. // This flag is true when the latter case is detected. diff --git a/jdk/src/windows/native/sun/windows/awt_TextComponent.cpp b/jdk/src/windows/native/sun/windows/awt_TextComponent.cpp index 1be6d9f1450..9920b925254 100644 --- a/jdk/src/windows/native/sun/windows/awt_TextComponent.cpp +++ b/jdk/src/windows/native/sun/windows/awt_TextComponent.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1996-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-2008 Sun Microsystems, Inc. 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 @@ -326,7 +326,7 @@ jstring AwtTextComponent::_GetText(void *param) WCHAR* buf = new WCHAR[len + 1]; c->GetText(buf, len + 1); c->RemoveCR(buf); - result = env->NewString(buf, static_cast(wcslen(buf))); + result = JNU_NewStringPlatform(env, buf); delete [] buf; } } @@ -362,7 +362,7 @@ void AwtTextComponent::_SetText(void *param) { int length = env->GetStringLength(text); WCHAR* buffer = new WCHAR[length + 1]; - env->GetStringRegion(text, 0, length, buffer); + env->GetStringRegion(text, 0, length, reinterpret_cast(buffer)); buffer[length] = 0; c->CheckLineSeparator(buffer); c->RemoveCR(buffer); diff --git a/jdk/src/windows/native/sun/windows/awt_TextComponent.h b/jdk/src/windows/native/sun/windows/awt_TextComponent.h index 2eff0505715..32a430baf38 100644 --- a/jdk/src/windows/native/sun/windows/awt_TextComponent.h +++ b/jdk/src/windows/native/sun/windows/awt_TextComponent.h @@ -1,5 +1,5 @@ /* - * Copyright 1996-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-2008 Sun Microsystems, Inc. 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 @@ -70,15 +70,6 @@ public: static jstring _GetText(void *param); BOOL ActMouseMessage(MSG* pMsg); - /* - * For TextComponents that contains WCHAR strings or messages with - * WCHAR parameters. - */ - INLINE LRESULT SendMessageW(UINT msg, WPARAM wParam = 0, LPARAM lParam = 0) - { - DASSERT(GetHWnd()); - return ::SendMessageW(GetHWnd(), msg, wParam, lParam); - } void SetFont(AwtFont* font); diff --git a/jdk/src/windows/native/sun/windows/awt_TextField.cpp b/jdk/src/windows/native/sun/windows/awt_TextField.cpp index 5b95495d067..975fd20bc0b 100644 --- a/jdk/src/windows/native/sun/windows/awt_TextField.cpp +++ b/jdk/src/windows/native/sun/windows/awt_TextField.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1996-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-2008 Sun Microsystems, Inc. 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 @@ -26,7 +26,6 @@ #include "awt_Toolkit.h" #include "awt_TextField.h" #include "awt_TextComponent.h" -#include "awt_dlls.h" #include "awt_KeyboardFocusManager.h" #include "awt_Canvas.h" @@ -69,9 +68,8 @@ AwtTextField* AwtTextField::Create(jobject peer, jobject parent) { DWORD style = WS_CHILD | WS_CLIPSIBLINGS | - ES_LEFT | ES_AUTOHSCROLL | - (IS_WIN4X ? 0 : WS_BORDER); - DWORD exStyle = IS_WIN4X ? WS_EX_CLIENTEDGE : 0; + ES_LEFT | ES_AUTOHSCROLL; + DWORD exStyle = WS_EX_CLIENTEDGE; if (GetRTL()) { exStyle |= WS_EX_RIGHT | WS_EX_LEFTSCROLLBAR; if (GetRTLReadingOrder()) diff --git a/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp b/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp index 3a9dfb24c7d..c4292826a8e 100644 --- a/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp @@ -23,15 +23,16 @@ * have any questions. */ +#include "awt.h" #include #include -#if defined(_DEBUG) && defined(_MSC_VER) && _MSC_VER >= 1000 -#include -#endif +//#if defined(_DEBUG) && defined(_MSC_VER) && _MSC_VER >= 1000 +//#include +//#endif #define _JNI_IMPLEMENTATION_ -#include "stdhdrs.h" + #include "awt_DrawingSurface.h" #include "awt_AWTEvent.h" #include "awt_Component.h" @@ -51,7 +52,6 @@ #include "awt_FileDialog.h" #include "CmdIDList.h" #include "awt_new.h" -#include "awt_Unicode.h" #include "debug_trace.h" #include "debug_mem.h" @@ -225,8 +225,7 @@ BOOL AwtToolkit::activateKeyboardLayout(HKL hkl) { HKL prev = ::ActivateKeyboardLayout(hkl, 0); // If the above call fails, try loading the layout in case of NT - if ((prev == 0) && IS_NT) { - + if (!prev) { // create input locale string, e.g., "00000409", from hkl. TCHAR inputLocale[9]; TCHAR buf[9]; @@ -297,7 +296,7 @@ JavaStringBuffer::JavaStringBuffer(JNIEnv *env, jstring jstr) { if (jstr != NULL) { int length = env->GetStringLength(jstr); buffer = new TCHAR[length + 1]; - LPCTSTR tmp = (LPCTSTR)JNU_GetStringPlatformChars(env, jstr, NULL); + LPCTSTR tmp = JNU_GetStringPlatformChars(env, jstr, NULL); _tcscpy(buffer, tmp); JNU_ReleaseStringPlatformChars(env, jstr, tmp); } else { @@ -323,6 +322,7 @@ AwtToolkit::AwtToolkit() { m_vmSignalled = FALSE; m_isDynamicLayoutSet = FALSE; + m_areExtraMouseButtonsEnabled = TRUE; m_verifyComponents = FALSE; m_breakOnError = FALSE; @@ -490,8 +490,6 @@ BOOL AwtToolkit::Dispose() { ::CloseHandle(m_waitEvent); - ComCtl32Util::GetInstance().FreeLibraries(); - tk.m_isDisposed = TRUE; return TRUE; @@ -886,8 +884,6 @@ LRESULT CALLBACK AwtToolkit::WndProc(HWND hWnd, UINT message, return (DWORD)ImmGetOpenStatus((HIMC)wParam); } case WM_DISPLAYCHANGE: { - AwtCursor::DirtyAllCustomCursors(); - // Reinitialize screens initScreens(env); @@ -1161,9 +1157,7 @@ BOOL AwtToolkit::PreProcessMsg(MSG& msg) if (p && p->PreProcessMsg(msg) == mrConsume) return TRUE; - if ((msg.message >= WM_MOUSEFIRST && msg.message <= WM_AWT_MOUSELAST) || - (IS_WIN95 && !IS_WIN98 && - msg.message == AwtComponent::Wheel95GetMsg()) || + if ((msg.message >= WM_MOUSEFIRST && msg.message <= WM_MOUSELAST) || (msg.message >= WM_NCMOUSEMOVE && msg.message <= WM_NCMBUTTONDBLCLK)) { if (PreProcessMouseMsg(p, msg)) { return TRUE; @@ -1190,9 +1184,7 @@ BOOL AwtToolkit::PreProcessMouseMsg(AwtComponent* p, MSG& msg) return FALSE; } - if (msg.message >= WM_MOUSEFIRST && msg.message <= WM_AWT_MOUSELAST || - (IS_WIN95 && !IS_WIN98 && msg.message == AwtComponent::Wheel95GetMsg())) - { + if (msg.message >= WM_MOUSEFIRST && msg.message <= WM_MOUSELAST) { mouseWParam = msg.wParam; mouseLParam = msg.lParam; } else { @@ -1287,21 +1279,6 @@ BOOL AwtToolkit::PreProcessMouseMsg(AwtComponent* p, MSG& msg) //window msg.hwnd = hWndForWheel; } - else if (IS_WIN95 && !IS_WIN98 && - msg.message == AwtComponent::Wheel95GetMsg() && - mouseWheelComp != NULL) { - - // On Win95, mouse wheels are _always_ delivered to the top level - // Frame. Default behavior only takes place if the message's hwnd - // remains that of the Frame. We only want to change the hwnd if - // we're changing it to a Component that DOESN'T handle the - // mousewheel natively. - - if (!mouseWheelComp->InheritsNativeMouseWheelBehavior()) { - DTRACE_PRINTLN("AwtT::PPMM: changing hwnd on 95"); - msg.hwnd = hWndForWheel; - } - } /* * Make sure we get at least one last chance to check for transitions @@ -1792,7 +1769,7 @@ Java_sun_awt_windows_WToolkit_getScreenInsets(JNIEnv *env, { jobject insets = NULL; RECT rRW; - MONITOR_INFO *miInfo; + LPMONITORINFO miInfo; TRY; @@ -1814,10 +1791,10 @@ Java_sun_awt_windows_WToolkit_getScreenInsets(JNIEnv *env, if (miInfo) { insets = env->NewObject(env->FindClass("java/awt/Insets"), AwtToolkit::insetsMID, - miInfo->rWork.top - miInfo->rMonitor.top, - miInfo->rWork.left - miInfo->rMonitor.left, - miInfo->rMonitor.bottom - miInfo->rWork.bottom, - miInfo->rMonitor.right - miInfo->rWork.right); + miInfo->rcWork.top - miInfo->rcMonitor.top, + miInfo->rcWork.left - miInfo->rcMonitor.left, + miInfo->rcMonitor.bottom - miInfo->rcWork.bottom, + miInfo->rcMonitor.right - miInfo->rcWork.right); } } @@ -2057,29 +2034,15 @@ Java_sun_awt_windows_WToolkit_getWindowsVersion(JNIEnv *env, jclass cls) swprintf(szVer, L"0x%x = %ld", version, version); int l = lstrlen(szVer); - if (IS_WIN95) { - if (IS_WIN98) { - if (IS_WINME) { - swprintf(szVer + l, L" (Windows ME)"); + if (IS_WIN2000) { + if (IS_WINXP) { + if (IS_WINVISTA) { + swprintf(szVer + l, L" (Windows Vista)"); } else { - swprintf(szVer + l, L" (Windows 98)"); + swprintf(szVer + l, L" (Windows XP)"); } } else { - swprintf(szVer + l, L" (Windows 95)"); - } - } else if (IS_NT) { - if (IS_WIN2000) { - if (IS_WINXP) { - if (IS_WINVISTA) { - swprintf(szVer + l, L" (Windows Vista)"); - } else { - swprintf(szVer + l, L" (Windows XP)"); - } - } else { - swprintf(szVer + l, L" (Windows 2000)"); - } - } else { - swprintf(szVer + l, L" (Windows NT)"); + swprintf(szVer + l, L" (Windows 2000)"); } } else { swprintf(szVer + l, L" (Unknown)"); @@ -2130,3 +2093,26 @@ Java_sun_awt_SunToolkit_closeSplashScreen(JNIEnv *env, jclass cls) splashClose(); } } + +/* + * accessible from awt_Component + */ +BOOL AwtToolkit::areExtraMouseButtonsEnabled() { + return m_areExtraMouseButtonsEnabled; +} + +/* + * Class: sun_awt_windows_WToolkit + * Method: setExtraMouseButtonsEnabledNative + * Signature: (Z)V + */ +extern "C" JNIEXPORT void JNICALL Java_sun_awt_windows_WToolkit_setExtraMouseButtonsEnabledNative +(JNIEnv *env, jclass self, jboolean enable){ + TRY; + AwtToolkit::GetInstance().setExtraMouseButtonsEnabled(enable); + CATCH_BAD_ALLOC; +} + +void AwtToolkit::setExtraMouseButtonsEnabled(BOOL enable) { + m_areExtraMouseButtonsEnabled = enable; +} diff --git a/jdk/src/windows/native/sun/windows/awt_Toolkit.h b/jdk/src/windows/native/sun/windows/awt_Toolkit.h index fcee2d4ad5c..d76546fa4eb 100644 --- a/jdk/src/windows/native/sun/windows/awt_Toolkit.h +++ b/jdk/src/windows/native/sun/windows/awt_Toolkit.h @@ -50,7 +50,6 @@ #include "awt.h" #include "awtmsg.h" -#include "awt_Multimon.h" #include "Trace.h" #include "sun_awt_windows_WToolkit.h" @@ -89,11 +88,8 @@ class JNILocalFrame { */ class CriticalSection { public: - INLINE CriticalSection() { ::InitializeCriticalSection(&rep); - ::InitializeCriticalSection(&tryrep); - tryEntered = 0; } - INLINE ~CriticalSection() { ::DeleteCriticalSection(&rep); - ::DeleteCriticalSection(&tryrep); } + INLINE CriticalSection() { ::InitializeCriticalSection(&rep); } + INLINE ~CriticalSection() { ::DeleteCriticalSection(&rep); } class Lock { public: @@ -111,50 +107,18 @@ class CriticalSection { private: CRITICAL_SECTION rep; - CRITICAL_SECTION tryrep; - long tryEntered; - CriticalSection(const CriticalSection&); const CriticalSection& operator =(const CriticalSection&); public: - virtual void Enter (void) - { - ::EnterCriticalSection(&tryrep); - tryEntered++; - if (tryEntered == 1) { - ::EnterCriticalSection(&rep); - ::LeaveCriticalSection(&tryrep); - } else { - ::LeaveCriticalSection(&tryrep); - ::EnterCriticalSection(&rep); - } + virtual void Enter() { + ::EnterCriticalSection(&rep); } - // we cannot use ::TryEnterCriticalSection as it is not supported on Win9x/Me - virtual BOOL TryEnter (void) - { - BOOL result = FALSE; - ::EnterCriticalSection(&tryrep); - if (tryEntered == 0) { - ::EnterCriticalSection(&rep); - tryEntered++; - result = TRUE; - } - ::LeaveCriticalSection(&tryrep); - return result; + virtual BOOL TryEnter() { + return ::TryEnterCriticalSection(&rep); } - virtual void Leave (void) - { - ::EnterCriticalSection(&tryrep); - if (tryEntered > 0) { - tryEntered--; - } else { - // this may happen only if we call to Leave() before - // Enter() so this is definitely a bug - DASSERT(FALSE); - } + virtual void Leave() { ::LeaveCriticalSection(&rep); - ::LeaveCriticalSection(&tryrep); } }; @@ -211,6 +175,8 @@ public: BOOL IsDynamicLayoutSet(); BOOL IsDynamicLayoutSupported(); BOOL IsDynamicLayoutActive(); + BOOL areExtraMouseButtonsEnabled(); + void setExtraMouseButtonsEnabled(BOOL enable); INLINE BOOL localPump() { return m_localPump; } INLINE BOOL VerifyComponents() { return FALSE; } // TODO: Use new DebugHelper class to set this flag @@ -387,6 +353,7 @@ private: BOOL m_verbose; BOOL m_isActive; // set to FALSE at beginning of Dispose BOOL m_isDisposed; // set to TRUE at end of Dispose + BOOL m_areExtraMouseButtonsEnabled; BOOL m_vmSignalled; // set to TRUE if QUERYENDSESSION has successfully // raised SIGTERM diff --git a/jdk/src/windows/native/sun/windows/awt_TrayIcon.cpp b/jdk/src/windows/native/sun/windows/awt_TrayIcon.cpp index 0d3047b59e5..9165314bbc5 100644 --- a/jdk/src/windows/native/sun/windows/awt_TrayIcon.cpp +++ b/jdk/src/windows/native/sun/windows/awt_TrayIcon.cpp @@ -23,9 +23,10 @@ * have any questions. */ -#include +#include "awt.h" #include #include +#include #include "awt_Toolkit.h" #include "awt_TrayIcon.h" @@ -173,27 +174,20 @@ AwtTrayIcon* AwtTrayIcon::Create(jobject self, jobject parent) env->DeleteLocalRef(target); return awtTrayIcon; } -typedef struct _SDLLVERSIONINFO -{ - DWORD cbSize; - DWORD dwMajorVersion; // Major version - DWORD dwMinorVersion; // Minor version - DWORD dwBuildNumber; // Build number - DWORD dwPlatformID; // DLLVER_PLATFORM_* -} SDLLVERSIONINFO; -typedef HRESULT (CALLBACK* SDLLGETVERSIONPROC)(SDLLVERSIONINFO *); void AwtTrayIcon::InitNID(UINT uID) { // fix for 6271589: we MUST set the size of the structure to match // the shell version, otherwise some errors may occur (like missing // balloon messages on win2k) - SDLLVERSIONINFO dllVersionInfo; - dllVersionInfo.cbSize = sizeof(SDLLVERSIONINFO); - int shellVersion = 4; // WIN_98 + DLLVERSIONINFO dllVersionInfo; + dllVersionInfo.cbSize = sizeof(DLLVERSIONINFO); + int shellVersion = 5; // WIN_2000 + // MSDN: DllGetVersion should not be implicitly called, but rather + // loaded using GetProcAddress HMODULE hShell = LoadLibrary(TEXT("Shell32.dll")); if (hShell != NULL) { - SDLLGETVERSIONPROC proc = (SDLLGETVERSIONPROC)GetProcAddress(hShell, "DllGetVersion"); + DLLGETVERSIONPROC proc = (DLLGETVERSIONPROC)GetProcAddress(hShell, "DllGetVersion"); if (proc != NULL) { if (proc(&dllVersionInfo) == NOERROR) { shellVersion = dllVersionInfo.dwMajorVersion; @@ -202,14 +196,16 @@ void AwtTrayIcon::InitNID(UINT uID) } FreeLibrary(hShell); switch (shellVersion) { - case 5: // WIN_2000, WIN_ME + case 5: // WIN_2000 m_nid.cbSize = (BYTE *)(&m_nid.guidItem) - (BYTE *)(&m_nid.cbSize); break; case 6: // WIN_XP + // Uncomment these two lines when moving to VS2008 +// m_nid.cbSize = (BYTE *)(&m_nid.hBalloonIcon) - (BYTE *)(&m_nid.cbSize); +// break; + default: // WIN_VISTA? m_nid.cbSize = sizeof(m_nid); break; - default: // WIN_98, WIN_NT - m_nid.cbSize = (BYTE *)(&m_nid.szTip) - (BYTE *)(&m_nid.cbSize) + sizeof(m_nid.szTip) / 2; } m_nid.hWnd = AwtTrayIcon::sm_msgWindow; m_nid.uID = uID; @@ -217,7 +213,7 @@ void AwtTrayIcon::InitNID(UINT uID) m_nid.uCallbackMessage = WM_AWT_TRAY_NOTIFY; m_nid.hIcon = AwtToolkit::GetInstance().GetAwtIcon(); m_nid.szTip[0] = '\0'; - m_nid.uVersion = IS_WIN2000 ? AWT_NOTIFYICON_VERSION : 0; + m_nid.uVersion = NOTIFYICON_VERSION; } BOOL AwtTrayIcon::SendTrayMessage(DWORD dwMessage) @@ -304,13 +300,13 @@ MsgRouting AwtTrayIcon::WmAwtTrayNotify(WPARAM wParam, LPARAM lParam) case WM_CONTEXTMENU: mr = WmContextMenu(0, pos.x, pos.y); break; - case AWT_NIN_KEYSELECT: + case NIN_KEYSELECT: mr = WmKeySelect(0, pos.x, pos.y); break; - case AWT_NIN_SELECT: + case NIN_SELECT: mr = WmSelect(0, pos.x, pos.y); break; - case AWT_NIN_BALLOONUSERCLICK: + case NIN_BALLOONUSERCLICK: mr = WmBalloonUserClick(0, pos.x, pos.y); break; } @@ -371,7 +367,7 @@ MsgRouting AwtTrayIcon::WmMouseUp(UINT flags, int x, int y, int button) (AwtComponent::GetButton(button) == java_awt_event_MouseEvent_BUTTON3 ? TRUE : FALSE), AwtComponent::GetButton(button), &msg); - if ((m_mouseButtonClickAllowed & AwtComponent::GetButtonMK(button)) != 1) { // No up-button in the drag-state + if ((m_mouseButtonClickAllowed & AwtComponent::GetButtonMK(button)) != 0) { // No up-button in the drag-state SendMouseEvent(java_awt_event_MouseEvent_MOUSE_CLICKED, TimeHelper::windowsToUTC(::GetTickCount()), x, y, AwtComponent::GetJavaModifiers(), clickCount, JNI_FALSE, AwtComponent::GetButton(button)); @@ -397,7 +393,7 @@ MsgRouting AwtTrayIcon::WmMouseMove(UINT flags, int x, int y) lastX = x; lastY = y; AwtComponent::InitMessage(&msg, lastMessage, flags, MAKELPARAM(x, y), x, y); - if ((flags & AwtComponent::ALL_MK_BUTTONS) != 0) { + if ((flags & ALL_MK_BUTTONS) != 0) { m_mouseButtonClickAllowed = 0; } else { SendMouseEvent(java_awt_event_MouseEvent_MOUSE_MOVED, TimeHelper::windowsToUTC(::GetTickCount()), x, y, @@ -473,7 +469,7 @@ MsgRouting AwtTrayIcon::WmTaskbarCreated() { BOOL result = item->m_trayIcon->SendTrayMessage(NIM_ADD); // 6270114: Instructs the taskbar to behave according to the Shell version 5.0 if (result) { - item->m_trayIcon->SendTrayMessage(AWT_NIM_SETVERSION); + item->m_trayIcon->SendTrayMessage(NIM_SETVERSION); } } return mrDoDefault; @@ -733,9 +729,9 @@ void AwtTrayIcon::_SetToolTip(void *param) goto ret; } - tooltipStr = env->GetStringChars(jtooltip, (jboolean *)NULL); + tooltipStr = JNU_GetStringPlatformChars(env, jtooltip, (jboolean *)NULL); trayIcon->SetToolTip(tooltipStr); - env->ReleaseStringChars(jtooltip, tooltipStr); + JNU_ReleaseStringPlatformChars(env, jtooltip, tooltipStr); ret: env->DeleteGlobalRef(self); env->DeleteGlobalRef(jtooltip); @@ -782,7 +778,7 @@ void AwtTrayIcon::_UpdateIcon(void *param) BOOL result = trayIcon->SendTrayMessage(jupdate == JNI_TRUE ? NIM_MODIFY : NIM_ADD); // 6270114: Instructs the taskbar to behave according to the Shell version 5.0 if (result && jupdate == JNI_FALSE) { - trayIcon->SendTrayMessage(AWT_NIM_SETVERSION); + trayIcon->SendTrayMessage(NIM_SETVERSION); } ret: env->DeleteGlobalRef(self); @@ -791,22 +787,19 @@ ret: void AwtTrayIcon::DisplayMessage(LPCTSTR caption, LPCTSTR text, LPCTSTR msgType) { - if (!IS_WIN2000) - return; - - m_nid.uFlags |= AWT_NIF_INFO; + m_nid.uFlags |= NIF_INFO; m_nid.uTimeout = 10000; if (lstrcmp(msgType, TEXT("ERROR")) == 0) { - m_nid.dwInfoFlags = AWT_NIIF_ERROR; + m_nid.dwInfoFlags = NIIF_ERROR; } else if (lstrcmp(msgType, TEXT("WARNING")) == 0) { - m_nid.dwInfoFlags = AWT_NIIF_WARNING; + m_nid.dwInfoFlags = NIIF_WARNING; } else if (lstrcmp(msgType, TEXT("INFO")) == 0) { - m_nid.dwInfoFlags = AWT_NIIF_INFO; + m_nid.dwInfoFlags = NIIF_INFO; } else if (lstrcmp(msgType, TEXT("NONE")) == 0) { - m_nid.dwInfoFlags = AWT_NIIF_NONE; + m_nid.dwInfoFlags = NIIF_NONE; } else { - m_nid.dwInfoFlags = AWT_NIIF_NONE; + m_nid.dwInfoFlags = NIIF_NONE; } if (caption[0] == '\0') { @@ -835,7 +828,7 @@ void AwtTrayIcon::DisplayMessage(LPCTSTR caption, LPCTSTR text, LPCTSTR msgType) } SendTrayMessage(NIM_MODIFY); - m_nid.uFlags &= ~AWT_NIF_INFO; + m_nid.uFlags &= ~NIF_INFO; } void AwtTrayIcon::_DisplayMessage(void *param) @@ -855,15 +848,15 @@ void AwtTrayIcon::_DisplayMessage(void *param) JNI_CHECK_PEER_GOTO(self, ret); trayIcon = (AwtTrayIcon *)pData; - captionStr = env->GetStringChars(jcaption, (jboolean *)NULL); - textStr = env->GetStringChars(jtext, (jboolean *)NULL); - msgTypeStr = env->GetStringChars(jmsgType, (jboolean *)NULL); + captionStr = JNU_GetStringPlatformChars(env, jcaption, (jboolean *)NULL); + textStr = JNU_GetStringPlatformChars(env, jtext, (jboolean *)NULL); + msgTypeStr = JNU_GetStringPlatformChars(env, jmsgType, (jboolean *)NULL); trayIcon->DisplayMessage(captionStr, textStr, msgTypeStr); - env->ReleaseStringChars(jcaption, captionStr); - env->ReleaseStringChars(jtext, textStr); - env->ReleaseStringChars(jmsgType, msgTypeStr); + JNU_ReleaseStringPlatformChars(env, jcaption, captionStr); + JNU_ReleaseStringPlatformChars(env, jtext, textStr); + JNU_ReleaseStringPlatformChars(env, jmsgType, msgTypeStr); ret: env->DeleteGlobalRef(self); env->DeleteGlobalRef(jcaption); @@ -1057,16 +1050,14 @@ Java_sun_awt_windows_WTrayIconPeer__1displayMessage(JNIEnv *env, jobject self, { TRY; - if (IS_WIN2000) { - DisplayMessageStruct *dms = new DisplayMessageStruct; - dms->trayIcon = env->NewGlobalRef(self); - dms->caption = (jstring)env->NewGlobalRef(caption); - dms->text = (jstring)env->NewGlobalRef(text); - dms->msgType = (jstring)env->NewGlobalRef(msgType); + DisplayMessageStruct *dms = new DisplayMessageStruct; + dms->trayIcon = env->NewGlobalRef(self); + dms->caption = (jstring)env->NewGlobalRef(caption); + dms->text = (jstring)env->NewGlobalRef(text); + dms->msgType = (jstring)env->NewGlobalRef(msgType); - AwtToolkit::GetInstance().SyncCall(AwtTrayIcon::_DisplayMessage, dms); - // global ref is deleted in _DisplayMessage - } + AwtToolkit::GetInstance().SyncCall(AwtTrayIcon::_DisplayMessage, dms); + // global ref is deleted in _DisplayMessage CATCH_BAD_ALLOC(NULL); } diff --git a/jdk/src/windows/native/sun/windows/awt_TrayIcon.h b/jdk/src/windows/native/sun/windows/awt_TrayIcon.h index 6a3c25dd730..8ee418aa794 100644 --- a/jdk/src/windows/native/sun/windows/awt_TrayIcon.h +++ b/jdk/src/windows/native/sun/windows/awt_TrayIcon.h @@ -36,57 +36,11 @@ #define TRAY_ICON_X_HOTSPOT 0 #define TRAY_ICON_Y_HOTSPOT 0 -#define TRAY_ICON_TOOLTIP_MAX_SIZE (IS_WIN2000 ? 128 : 64) +#define TRAY_ICON_TOOLTIP_MAX_SIZE 128 #define TRAY_ICON_BALLOON_TITLE_MAX_SIZE 64 #define TRAY_ICON_BALLOON_INFO_MAX_SIZE 256 -// ********************************************************************** -// The following definitions are duplicates for those from the shellapi.h -// ********************************************************************** - -#define AWT_NOTIFYICON_VERSION 3 - -#define AWT_NIM_SETVERSION 0x00000004 - -#define AWT_NIN_SELECT (WM_USER + 0) -#define AWT_NINF_KEY 0x1 -#define AWT_NIN_KEYSELECT (AWT_NIN_SELECT | AWT_NINF_KEY) -#define AWT_NIN_BALLOONSHOW (WM_USER + 2) -#define AWT_NIN_BALLOONHIDE (WM_USER + 3) -#define AWT_NIN_BALLOONTIMEOUT (WM_USER + 4) -#define AWT_NIN_BALLOONUSERCLICK (WM_USER + 5) - -#define AWT_NIIF_NONE 0x00000000 -#define AWT_NIIF_INFO 0x00000001 -#define AWT_NIIF_WARNING 0x00000002 -#define AWT_NIIF_ERROR 0x00000003 - -#define AWT_NIF_INFO 0x00000010 - -typedef struct _AWT_NOTIFYICONDATA { - DWORD cbSize; - HWND hWnd; - UINT uID; - UINT uFlags; - UINT uCallbackMessage; - HICON hIcon; - TCHAR szTip[128]; - - DWORD dwState; // _WIN32_IE >= 0x0500 - DWORD dwStateMask; - TCHAR szInfo[256]; - union { - UINT uTimeout; - UINT uVersion; - } DUMMYUNIONNAME; - TCHAR szInfoTitle[64]; - DWORD dwInfoFlags; - - GUID guidItem; // _WIN32_IE >= 0x600 -} AWT_NOTIFYICONDATA, *PAWT_NOTIFYICONDATA; - - /************************************************************************ * AwtTrayIcon class */ @@ -174,7 +128,7 @@ public: static int sm_instCount; private: - AWT_NOTIFYICONDATA m_nid; + NOTIFYICONDATA m_nid; /* A bitmask keeps the button's numbers as MK_LBUTTON, MK_MBUTTON, MK_RBUTTON * which are allowed to diff --git a/jdk/src/windows/native/sun/windows/awt_Win32GraphicsConfig.cpp b/jdk/src/windows/native/sun/windows/awt_Win32GraphicsConfig.cpp index 6f2f62c3154..2a23bfa9b3e 100644 --- a/jdk/src/windows/native/sun/windows/awt_Win32GraphicsConfig.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Win32GraphicsConfig.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. 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 @@ -23,12 +23,12 @@ * have any questions. */ -#include #include "awt.h" #include #include "awt_Win32GraphicsConfig.h" #include "awt_Canvas.h" #include "awt_Win32GraphicsDevice.h" +#include "Devices.h" //Info for building a ColorModel #include "java_awt_image_DataBuffer.h" @@ -93,8 +93,8 @@ JNIEXPORT jobject JNICALL clazz = env->FindClass("java/awt/Rectangle"); mid = env->GetMethodID(clazz, "", "(IIII)V"); if (mid != 0) { - RECT rRW = {0,0,0,0}; - if( TRUE == ::MonitorBounds(AwtWin32GraphicsDevice::GetMonitor(screen), &rRW) ) { + RECT rRW = {0, 0, 0, 0}; + if (TRUE == MonitorBounds(AwtWin32GraphicsDevice::GetMonitor(screen), &rRW)) { bounds = env->NewObject(clazz, mid, rRW.left, rRW.top, rRW.right - rRW.left, diff --git a/jdk/src/windows/native/sun/windows/awt_Win32GraphicsDevice.cpp b/jdk/src/windows/native/sun/windows/awt_Win32GraphicsDevice.cpp index 047f7148c19..aba41a5a4cb 100644 --- a/jdk/src/windows/native/sun/windows/awt_Win32GraphicsDevice.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Win32GraphicsDevice.cpp @@ -37,19 +37,17 @@ * array index. */ -#include -#include #include #include #include "awt_Canvas.h" #include "awt_Win32GraphicsDevice.h" +#include "awt_Window.h" #include "java_awt_Transparency.h" #include "java_awt_color_ColorSpace.h" #include "sun_awt_Win32GraphicsDevice.h" #include "java_awt_image_DataBuffer.h" #include "dither.h" #include "img_util_md.h" -#include "awt_dlls.h" #include "Devices.h" uns_ordered_dither_array img_oda_alpha; @@ -72,7 +70,7 @@ int AwtWin32GraphicsDevice::primaryIndex = 0; * device, and information on whether the primary device is palettized. */ AwtWin32GraphicsDevice::AwtWin32GraphicsDevice(int screen, - MHND mhnd, Devices *arr) + HMONITOR mhnd, Devices *arr) { this->screen = screen; this->devicesArray = arr; @@ -83,8 +81,8 @@ AwtWin32GraphicsDevice::AwtWin32GraphicsDevice(int screen, cData = NULL; gpBitmapInfo = NULL; monitor = mhnd; - pMonitorInfo = (PMONITOR_INFO)new MONITOR_INFO_EXTENDED; - pMonitorInfo->dwSize = sizeof(MONITOR_INFO_EXTENDED); + pMonitorInfo = new MONITORINFOEX; + pMonitorInfo->cbSize = sizeof(MONITORINFOEX); ::GetMonitorInfo(monitor, pMonitorInfo); // Set primary device info: other devices will need to know @@ -93,7 +91,7 @@ AwtWin32GraphicsDevice::AwtWin32GraphicsDevice(int screen, HDC hDC = this->GetDC(); colorData->bitsperpixel = ::GetDeviceCaps(hDC, BITSPIXEL); this->ReleaseDC(hDC); - if (MONITOR_INFO_FLAG_PRIMARY & pMonitorInfo->dwFlags) { + if (MONITORINFOF_PRIMARY & pMonitorInfo->dwFlags) { primaryIndex = screen; if (colorData->bitsperpixel > 8) { primaryPalettized = FALSE; @@ -124,6 +122,24 @@ AwtWin32GraphicsDevice::~AwtWin32GraphicsDevice() } } +HDC AwtWin32GraphicsDevice::MakeDCFromMonitor(HMONITOR hmMonitor) { + HDC retCode = NULL; + if (NULL != hmMonitor) { + MONITORINFOEX mieInfo; + + memset((void*)(&mieInfo), 0, sizeof(MONITORINFOEX)); + mieInfo.cbSize = sizeof(MONITORINFOEX); + + if (TRUE == ::GetMonitorInfo(hmMonitor, (LPMONITORINFOEX)(&mieInfo))) { + HDC hDC = CreateDC(mieInfo.szDevice, NULL, NULL, NULL); + if (NULL != hDC) { + retCode = hDC; + } + } + } + return retCode; +} + HDC AwtWin32GraphicsDevice::GetDC() { return MakeDCFromMonitor(monitor); @@ -164,7 +180,7 @@ void AwtWin32GraphicsDevice::Initialize() VERIFY(::GetDIBits(hBMDC, hBM, 0, 1, NULL, gpBitmapInfo, DIB_RGB_COLORS)); if (colorData->bitsperpixel > 8) { - if (MONITOR_INFO_FLAG_PRIMARY & pMonitorInfo->dwFlags) { + if (MONITORINFOF_PRIMARY & pMonitorInfo->dwFlags) { primaryPalettized = FALSE; } if (colorData->bitsperpixel != 24) { // 15, 16, or 32 bpp @@ -250,7 +266,7 @@ void AwtWin32GraphicsDevice::Initialize() ((int *)gpBitmapInfo->bmiColors)[2] = 0xff0000; } } else { - if (MONITOR_INFO_FLAG_PRIMARY & pMonitorInfo->dwFlags) { + if (MONITORINFOF_PRIMARY & pMonitorInfo->dwFlags) { primaryPalettized = TRUE; } gpBitmapInfo->bmiHeader.biBitCount = 8; @@ -565,8 +581,8 @@ void AwtWin32GraphicsDevice::RealizePalette(HDC hDC) */ int AwtWin32GraphicsDevice::DeviceIndexForWindow(HWND hWnd) { - MHND mon = MonitorFromWindow(hWnd, MONITOR_DEFAULT_TO_NEAR); - int screen = AwtWin32GraphicsDevice::GetScreenFromMHND(mon); + HMONITOR mon = MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST); + int screen = AwtWin32GraphicsDevice::GetScreenFromHMONITOR(mon); return screen; } @@ -645,14 +661,14 @@ jobject AwtWin32GraphicsDevice::GetColorModel(JNIEnv *env, jboolean dynamic, return devices->GetDevice(deviceIndex)->GetColorModel(env, dynamic); } -MONITOR_INFO *AwtWin32GraphicsDevice::GetMonitorInfo(int deviceIndex) +LPMONITORINFO AwtWin32GraphicsDevice::GetMonitorInfo(int deviceIndex) { Devices::InstanceAccess devices; return devices->GetDevice(deviceIndex)->GetMonitorInfo(); } /** - * This function updates the data in the MONITOR_INFO structure pointed to by + * This function updates the data in the MONITORINFOEX structure pointed to by * pMonitorInfo for all monitors on the system. Added for 4654713. */ void AwtWin32GraphicsDevice::ResetAllMonitorInfo() @@ -660,14 +676,14 @@ void AwtWin32GraphicsDevice::ResetAllMonitorInfo() Devices::InstanceAccess devices; int devicesNum = devices->GetNumDevices(); for (int deviceIndex = 0; deviceIndex < devicesNum; deviceIndex++) { - MHND monitor = devices->GetDevice(deviceIndex)->GetMonitor(); + HMONITOR monitor = devices->GetDevice(deviceIndex)->GetMonitor(); ::GetMonitorInfo(monitor, devices->GetDevice(deviceIndex)->pMonitorInfo); } } void AwtWin32GraphicsDevice::DisableOffscreenAccelerationForDevice( - MHND hMonitor) + HMONITOR hMonitor) { Devices::InstanceAccess devices; if (hMonitor == NULL) { @@ -682,7 +698,7 @@ void AwtWin32GraphicsDevice::DisableOffscreenAccelerationForDevice( } } -MHND AwtWin32GraphicsDevice::GetMonitor(int deviceIndex) +HMONITOR AwtWin32GraphicsDevice::GetMonitor(int deviceIndex) { Devices::InstanceAccess devices; return devices->GetDevice(deviceIndex)->GetMonitor(); @@ -741,30 +757,31 @@ HDC AwtWin32GraphicsDevice::GetDCFromScreen(int screen) { return MakeDCFromMonitor(dev->GetMonitor()); } -/** Compare elements of MONITOR_INFO structures for the given MHNDs. +/** Compare elements of MONITORINFOEX structures for the given HMONITORs. * If equal, return TRUE */ -BOOL AwtWin32GraphicsDevice::AreSameMonitors(MHND mon1, MHND mon2) { +BOOL AwtWin32GraphicsDevice::AreSameMonitors(HMONITOR mon1, HMONITOR mon2) { J2dTraceLn2(J2D_TRACE_INFO, "AwtWin32GraphicsDevice::AreSameMonitors mhnd1=%x mhnd2=%x", mon1, mon2); DASSERT(mon1 != NULL); DASSERT(mon2 != NULL); - MONITOR_INFO mi1; - MONITOR_INFO mi2; + MONITORINFOEX mi1; + MONITORINFOEX mi2; - memset((void*)(&mi1),0,sizeof(MONITOR_INFO)); - mi1.dwSize = sizeof(MONITOR_INFO); - memset((void*)(&mi2),0,sizeof(MONITOR_INFO)); - mi2.dwSize = sizeof(MONITOR_INFO); + memset((void*)(&mi1), 0, sizeof(MONITORINFOEX)); + mi1.cbSize = sizeof(MONITORINFOEX); + memset((void*)(&mi2), 0, sizeof(MONITORINFOEX)); + mi2.cbSize = sizeof(MONITORINFOEX); - if (::GetMonitorInfo(mon1,&mi1) != 0 && - ::GetMonitorInfo(mon2,&mi2) != 0 ) { - - if (::EqualRect(&mi1.rMonitor,&mi2.rMonitor) && - ::EqualRect(&mi1.rWork,&mi2.rWork) && - mi1.dwFlags == mi1.dwFlags) { + if (::GetMonitorInfo(mon1, &mi1) != 0 && + ::GetMonitorInfo(mon2, &mi2) != 0 ) + { + if (::EqualRect(&mi1.rcMonitor, &mi2.rcMonitor) && + ::EqualRect(&mi1.rcWork, &mi2.rcWork) && + (mi1.dwFlags == mi1.dwFlags)) + { J2dTraceLn(J2D_TRACE_VERBOSE, " the monitors are the same"); return TRUE; @@ -774,15 +791,15 @@ BOOL AwtWin32GraphicsDevice::AreSameMonitors(MHND mon1, MHND mon2) { return FALSE; } -int AwtWin32GraphicsDevice::GetScreenFromMHND(MHND mon) { +int AwtWin32GraphicsDevice::GetScreenFromHMONITOR(HMONITOR mon) { J2dTraceLn1(J2D_TRACE_INFO, - "AwtWin32GraphicsDevice::GetScreenFromMHND mhnd=%x", mon); + "AwtWin32GraphicsDevice::GetScreenFromHMONITOR mhnd=%x", mon); DASSERT(mon != NULL); Devices::InstanceAccess devices; for (int i = 0; i < devices->GetNumDevices(); i++) { - MHND mhnd = devices->GetDevice(i)->GetMonitor(); + HMONITOR mhnd = devices->GetDevice(i)->GetMonitor(); if (AreSameMonitors(mon, mhnd)) { J2dTraceLn1(J2D_TRACE_VERBOSE, " Found device: %d", i); return i; @@ -790,8 +807,8 @@ int AwtWin32GraphicsDevice::GetScreenFromMHND(MHND mon) { } J2dTraceLn1(J2D_TRACE_WARNING, - "AwtWin32GraphicsDevice::GetScreenFromMHND(): "\ - "couldn't find screen for MHND %x, returning default", mon); + "AwtWin32GraphicsDevice::GetScreenFromHMONITOR(): "\ + "couldn't find screen for HMONITOR %x, returning default", mon); return AwtWin32GraphicsDevice::GetDefaultDeviceIndex(); } @@ -1076,19 +1093,19 @@ jobject CreateDisplayMode(JNIEnv* env, jint width, jint height, * of the structure pointed to by lpDisplayDevice is undefined. */ static BOOL -GetAttachedDisplayDevice(int screen, _DISPLAY_DEVICE *lpDisplayDevice) +GetAttachedDisplayDevice(int screen, DISPLAY_DEVICE *lpDisplayDevice) { DWORD dwDeviceNum = 0; - lpDisplayDevice->dwSize = sizeof(_DISPLAY_DEVICE); + lpDisplayDevice->cb = sizeof(DISPLAY_DEVICE); while (EnumDisplayDevices(NULL, dwDeviceNum, lpDisplayDevice, 0) && dwDeviceNum < 20) // avoid infinite loop with buggy drivers { - if (lpDisplayDevice->dwFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) { + if (lpDisplayDevice->StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) { Devices::InstanceAccess devices; - MONITOR_INFO_EXTENDED *pMonInfo = - (PMONITOR_INFO_EXTENDED) devices->GetDevice(screen)->GetMonitorInfo(); + MONITORINFOEX *pMonInfo = + (LPMONITORINFOEX)devices->GetDevice(screen)->GetMonitorInfo(); // make sure the device names match - if (wcscmp(pMonInfo->strDevice, lpDisplayDevice->strDevName) == 0) { + if (wcscmp(pMonInfo->szDevice, lpDisplayDevice->DeviceName) == 0) { return TRUE; } } @@ -1114,9 +1131,9 @@ Java_sun_awt_Win32GraphicsDevice_getCurrentDisplayMode dm.dmSize = sizeof(dm); dm.dmDriverExtra = 0; - _DISPLAY_DEVICE displayDevice; + DISPLAY_DEVICE displayDevice; if (GetAttachedDisplayDevice(screen, &displayDevice)) { - pName = displayDevice.strDevName; + pName = displayDevice.DeviceName; } if (!EnumDisplaySettings(pName, ENUM_CURRENT_SETTINGS, &dm)) { @@ -1156,7 +1173,7 @@ Java_sun_awt_Win32GraphicsDevice_configDisplayMode // ChangeDisplaySettingsEx is not available on NT, // so it'd be nice not to break it if we can help it. if (screen == AwtWin32GraphicsDevice::GetDefaultDeviceIndex()) { - if (ChangeDisplaySettings(&dm, CDS_FULLSCREEN) != + if (::ChangeDisplaySettings(&dm, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) { JNU_ThrowInternalError(env, @@ -1165,15 +1182,9 @@ Java_sun_awt_Win32GraphicsDevice_configDisplayMode return; } - // make sure the function pointer for fn_change_display_settings_ex - // is initialized - load_user_procs(); - - _DISPLAY_DEVICE displayDevice; - if (fn_change_display_settings_ex == NULL || - !GetAttachedDisplayDevice(screen, &displayDevice) || - ((*fn_change_display_settings_ex) - (displayDevice.strDevName, &dm, NULL, CDS_FULLSCREEN, NULL) != + DISPLAY_DEVICE displayDevice; + if (!GetAttachedDisplayDevice(screen, &displayDevice) || + (::ChangeDisplaySettingsEx(displayDevice.DeviceName, &dm, NULL, CDS_FULLSCREEN, NULL) != DISP_CHANGE_SUCCESSFUL)) { JNU_ThrowInternalError(env, @@ -1231,11 +1242,11 @@ JNIEXPORT void JNICALL Java_sun_awt_Win32GraphicsDevice_enumDisplayModes DEVMODE dm; LPTSTR pName = NULL; - _DISPLAY_DEVICE displayDevice; + DISPLAY_DEVICE displayDevice; if (GetAttachedDisplayDevice(screen, &displayDevice)) { - pName = displayDevice.strDevName; + pName = displayDevice.DeviceName; } dm.dmSize = sizeof(dm); diff --git a/jdk/src/windows/native/sun/windows/awt_Win32GraphicsDevice.h b/jdk/src/windows/native/sun/windows/awt_Win32GraphicsDevice.h index 9d3978ba324..42a7ff18029 100644 --- a/jdk/src/windows/native/sun/windows/awt_Win32GraphicsDevice.h +++ b/jdk/src/windows/native/sun/windows/awt_Win32GraphicsDevice.h @@ -32,7 +32,6 @@ extern "C" { } // extern "C" #include "colordata.h" #include "awt_Palette.h" -#include "awt_MMStub.h" #include "Devices.h" class AwtPalette; @@ -40,7 +39,7 @@ class Devices; class AwtWin32GraphicsDevice { public: - AwtWin32GraphicsDevice(int screen, MHND mhnd, Devices *arr); + AwtWin32GraphicsDevice(int screen, HMONITOR mhnd, Devices *arr); ~AwtWin32GraphicsDevice(); void UpdateDeviceColorState(); void SetGrayness(int grayValue); @@ -60,8 +59,8 @@ public: HPALETTE GetPalette(); ColorData *GetColorData() { return cData; } int GetBitDepth() { return colorData->bitsperpixel; } - MHND GetMonitor() { return monitor; } - MONITOR_INFO *GetMonitorInfo() { return pMonitorInfo; } + HMONITOR GetMonitor() { return monitor; } + LPMONITORINFO GetMonitorInfo() { return pMonitorInfo; } jobject GetJavaDevice() { return javaDevice; } int GetDeviceIndex() { return screen; } void Release(); @@ -78,14 +77,14 @@ public: static void UpdateDynamicColorModel(int deviceIndex); static BOOL UpdateSystemPalette(int deviceIndex); static HPALETTE GetPalette(int deviceIndex); - static MHND GetMonitor(int deviceIndex); - static MONITOR_INFO *GetMonitorInfo(int deviceIndex); + static HMONITOR GetMonitor(int deviceIndex); + static LPMONITORINFO GetMonitorInfo(int deviceIndex); static void ResetAllMonitorInfo(); static BOOL IsPrimaryPalettized() { return primaryPalettized; } static int GetDefaultDeviceIndex() { return primaryIndex; } - static void DisableOffscreenAccelerationForDevice(MHND hMonitor); + static void DisableOffscreenAccelerationForDevice(HMONITOR hMonitor); static HDC GetDCFromScreen(int screen); - static int GetScreenFromMHND(MHND mon); + static int GetScreenFromHMONITOR(HMONITOR mon); static int primaryIndex; static BOOL primaryPalettized; @@ -97,17 +96,19 @@ public: static jmethodID paletteChangedMID; private: - static BOOL AreSameMonitors(MHND mon1, MHND mon2); + static BOOL AreSameMonitors(HMONITOR mon1, HMONITOR mon2); ImgColorData *colorData; AwtPalette *palette; ColorData *cData; // Could be static, but may sometime // have per-device info in this structure BITMAPINFO *gpBitmapInfo; int screen; - MHND monitor; - MONITOR_INFO *pMonitorInfo; + HMONITOR monitor; + LPMONITORINFO pMonitorInfo; jobject javaDevice; Devices *devicesArray; + + static HDC MakeDCFromMonitor(HMONITOR); }; #endif AWT_WIN32GRAPHICSDEVICE_H diff --git a/jdk/src/windows/native/sun/windows/awt_Win32GraphicsEnv.cpp b/jdk/src/windows/native/sun/windows/awt_Win32GraphicsEnv.cpp index 398e17d27d8..1617d54e657 100644 --- a/jdk/src/windows/native/sun/windows/awt_Win32GraphicsEnv.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Win32GraphicsEnv.cpp @@ -23,8 +23,6 @@ * have any questions. */ -#include -#include #include #include #include "awt_Canvas.h" @@ -188,44 +186,6 @@ Java_sun_awt_Win32GraphicsEnvironment_getDefaultScreen(JNIEnv *env, return AwtWin32GraphicsDevice::GetDefaultDeviceIndex(); } -#define FR_PRIVATE 0x10 /* from wingdi.h */ -typedef int (WINAPI *AddFontResourceExType)(LPCTSTR,DWORD,VOID*); -typedef int (WINAPI *RemoveFontResourceExType)(LPCTSTR,DWORD,VOID*); - -static AddFontResourceExType procAddFontResourceEx = NULL; -static RemoveFontResourceExType procRemoveFontResourceEx = NULL; - -static int winVer = -1; - -static int getWinVer() { - if (winVer == -1) { - OSVERSIONINFO osvi; - osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - GetVersionEx(&osvi); - winVer = osvi.dwMajorVersion; - if (winVer >= 5) { - // REMIND verify on 64 bit windows - HMODULE hGDI = LoadLibrary(TEXT("gdi32.dll")); - if (hGDI != NULL) { - procAddFontResourceEx = - (AddFontResourceExType)GetProcAddress(hGDI,"AddFontResourceExW"); - if (procAddFontResourceEx == NULL) { - winVer = 0; - } - procRemoveFontResourceEx = - (RemoveFontResourceExType)GetProcAddress(hGDI, - "RemoveFontResourceExW"); - if (procRemoveFontResourceEx == NULL) { - winVer = 0; - } - FreeLibrary(hGDI); - } - } - } - - return winVer; -} - /* * Class: sun_awt_Win32GraphicsEnvironment * Method: registerFontWithPlatform @@ -236,9 +196,10 @@ Java_sun_awt_Win32GraphicsEnvironment_registerFontWithPlatform(JNIEnv *env, jclass cl, jstring fontName) { - if (getWinVer() >= 5 && procAddFontResourceEx != NULL) { - LPTSTR file = (LPTSTR)JNU_GetStringPlatformChars(env, fontName, NULL); - (*procAddFontResourceEx)(file, FR_PRIVATE, NULL); + LPTSTR file = (LPTSTR)JNU_GetStringPlatformChars(env, fontName, JNI_FALSE); + if (file) { + ::AddFontResourceEx(file, FR_PRIVATE, NULL); + JNU_ReleaseStringPlatformChars(env, fontName, file); } } @@ -255,9 +216,10 @@ Java_sun_awt_Win32GraphicsEnvironment_deRegisterFontWithPlatform(JNIEnv *env, jclass cl, jstring fontName) { - if (getWinVer() >= 5 && procRemoveFontResourceEx != NULL) { - LPTSTR file = (LPTSTR)JNU_GetStringPlatformChars(env, fontName, NULL); - (*procRemoveFontResourceEx)(file, FR_PRIVATE, NULL); + LPTSTR file = (LPTSTR)JNU_GetStringPlatformChars(env, fontName, JNI_FALSE); + if (file) { + ::RemoveFontResourceEx(file, FR_PRIVATE, NULL); + JNU_ReleaseStringPlatformChars(env, fontName, file); } } diff --git a/jdk/src/windows/native/sun/windows/awt_Window.cpp b/jdk/src/windows/native/sun/windows/awt_Window.cpp index 13b41863235..0c9bce1210d 100644 --- a/jdk/src/windows/native/sun/windows/awt_Window.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Window.cpp @@ -23,7 +23,7 @@ * have any questions. */ -#include +#include "awt.h" #include "awt_Component.h" #include "awt_Container.h" @@ -32,7 +32,6 @@ #include "awt_Panel.h" #include "awt_Toolkit.h" #include "awt_Window.h" -#include "awt_dlls.h" #include "awt_Win32GraphicsDevice.h" #include "awt_BitmapUtil.h" #include "awt_IconCursor.h" @@ -42,6 +41,8 @@ #include #include "sun_awt_windows_WCanvasPeer.h" +#include + #if !defined(__int3264) typedef __int32 LONG_PTR; #endif // __int3264 @@ -501,8 +502,7 @@ void AwtWindow::Show() // which might involve tagging java.awt.Window instances with a semantic // property so platforms can animate/decorate/etc accordingly. // - if ((IS_WIN98 || IS_WIN2000) && - JNU_IsInstanceOfByName(env, target, "com/sun/java/swing/plaf/windows/WindowsPopupWindow") > 0) + if (JNU_IsInstanceOfByName(env, target, "com/sun/java/swing/plaf/windows/WindowsPopupWindow") > 0) { // need this global ref to make the class unloadable (see 6500204) static jclass windowsPopupWindowCls; @@ -535,13 +535,8 @@ void AwtWindow::Show() windowType = env->GetIntField(target, windowTypeFID); if (windowType == windowTYPES[TOOLTIP]) { - if (IS_WIN2000) { - SystemParametersInfo(SPI_GETTOOLTIPANIMATION, 0, &animateflag, 0); - SystemParametersInfo(SPI_GETTOOLTIPFADE, 0, &fadeflag, 0); - } else { - // use same setting as menus - SystemParametersInfo(SPI_GETMENUANIMATION, 0, &animateflag, 0); - } + SystemParametersInfo(SPI_GETTOOLTIPANIMATION, 0, &animateflag, 0); + SystemParametersInfo(SPI_GETTOOLTIPFADE, 0, &fadeflag, 0); if (animateflag) { // AW_BLEND currently produces runtime parameter error // animateStyle = fadeflag? AW_BLEND : AW_SLIDE | AW_VER_POSITIVE; @@ -551,13 +546,10 @@ void AwtWindow::Show() windowType == windowTYPES[POPUPMENU]) { SystemParametersInfo(SPI_GETMENUANIMATION, 0, &animateflag, 0); if (animateflag) { - - if (IS_WIN2000) { - SystemParametersInfo(SPI_GETMENUFADE, 0, &fadeflag, 0); - if (fadeflag) { - // AW_BLEND currently produces runtime parameter error - //animateStyle = AW_BLEND; - } + SystemParametersInfo(SPI_GETMENUFADE, 0, &fadeflag, 0); + if (fadeflag) { + // AW_BLEND currently produces runtime parameter error + //animateStyle = AW_BLEND; } if (animateStyle == 0 && !fadeflag) { animateStyle = AW_SLIDE; @@ -578,38 +570,18 @@ void AwtWindow::Show() } if (animateStyle != 0) { - load_user_procs(); - - if (fn_animate_window != NULL) { - BOOL result = (*fn_animate_window)(hWnd, (DWORD)200, animateStyle); - if (result == 0) { - LPTSTR msgBuffer = NULL; - FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - GetLastError(), - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR)&msgBuffer, // it's an output parameter when allocate buffer is used - 0, - NULL); - - if (msgBuffer == NULL) { - msgBuffer = TEXT(""); - } - _ftprintf(stderr,TEXT("AwtWindow::Show: AnimateWindow: ")); - _ftprintf(stderr,msgBuffer); - LocalFree(msgBuffer); - } else { - // WM_PAINT is not automatically sent when invoking AnimateWindow, - // so force an expose event - RECT rect; - ::GetWindowRect(hWnd,&rect); - ::ScreenToClient(hWnd, (LPPOINT)&rect); - ::InvalidateRect(hWnd,&rect,TRUE); - ::UpdateWindow(hWnd); - done = TRUE; - } + BOOL result = ::AnimateWindow(hWnd, (DWORD)200, animateStyle); + if (!result) { + // TODO: log message + } else { + // WM_PAINT is not automatically sent when invoking AnimateWindow, + // so force an expose event + RECT rect; + ::GetWindowRect(hWnd,&rect); + ::ScreenToClient(hWnd, (LPPOINT)&rect); + ::InvalidateRect(hWnd, &rect, TRUE); + ::UpdateWindow(hWnd); + done = TRUE; } } } @@ -1205,16 +1177,17 @@ MsgRouting AwtWindow::WmNcPaint(HRGN hrgn) } /* draw warning text */ - LPWSTR text = TO_WSTRING(warningString); + LPCWSTR text = JNU_GetStringPlatformChars(env, warningString, NULL); VERIFY(::SetBkColor(hDC, ::GetSysColor(COLOR_BTNFACE)) != CLR_INVALID); VERIFY(::SetTextColor(hDC, ::GetSysColor(COLOR_BTNTEXT)) != CLR_INVALID); VERIFY(::SelectObject(hDC, ::GetStockObject(DEFAULT_GUI_FONT)) != NULL); VERIFY(::SetTextAlign(hDC, TA_LEFT | TA_BOTTOM) != GDI_ERROR); - VERIFY(::ExtTextOutW(hDC, r.left+2, r.bottom-1, + VERIFY(::ExtTextOut(hDC, r.left+2, r.bottom-1, ETO_CLIPPED | ETO_OPAQUE, &r, text, static_cast(wcslen(text)), NULL)); VERIFY(::RestoreDC(hDC, iSaveDC)); ::ReleaseDC(GetHWnd(), hDC); + JNU_ReleaseStringPlatformChars(env, warningString, text); } env->DeleteLocalRef(target); @@ -1360,13 +1333,13 @@ void AwtWindow::RedrawNonClient() } int AwtWindow::GetScreenImOn() { - MHND hmon; + HMONITOR hmon; int scrnNum; - hmon = ::MonitorFromWindow(GetHWnd(), MONITOR_DEFAULT_TO_PRIMARY); + hmon = ::MonitorFromWindow(GetHWnd(), MONITOR_DEFAULTTOPRIMARY); DASSERT(hmon != NULL); - scrnNum = AwtWin32GraphicsDevice::GetScreenFromMHND(hmon); + scrnNum = AwtWin32GraphicsDevice::GetScreenFromHMONITOR(hmon); DASSERT(scrnNum > -1); return scrnNum; @@ -1619,10 +1592,10 @@ void AwtWindow::_SetTitle(void *param) if (::IsWindow(w->GetHWnd())) { int length = env->GetStringLength(title); - WCHAR *buffer = new WCHAR[length + 1]; - env->GetStringRegion(title, 0, length, buffer); + TCHAR *buffer = new TCHAR[length + 1]; + env->GetStringRegion(title, 0, length, reinterpret_cast(buffer)); buffer[length] = L'\0'; - VERIFY(::SetWindowTextW(w->GetHWnd(), buffer)); + VERIFY(::SetWindowText(w->GetHWnd(), buffer)); delete[] buffer; } ret: @@ -1967,13 +1940,11 @@ void AwtWindow::_SetFocusableWindow(void *param) window->m_isFocusableWindow = isFocusableWindow; - if (IS_WIN2000) { - if (!window->m_isFocusableWindow) { - LONG isPopup = window->GetStyle() & WS_POPUP; - window->SetStyleEx(window->GetStyleEx() | (isPopup ? 0 : WS_EX_APPWINDOW) | AWT_WS_EX_NOACTIVATE); - } else { - window->SetStyleEx(window->GetStyleEx() & ~WS_EX_APPWINDOW & ~AWT_WS_EX_NOACTIVATE); - } + if (!window->m_isFocusableWindow) { + LONG isPopup = window->GetStyle() & WS_POPUP; + window->SetStyleEx(window->GetStyleEx() | (isPopup ? 0 : WS_EX_APPWINDOW) | AWT_WS_EX_NOACTIVATE); + } else { + window->SetStyleEx(window->GetStyleEx() & ~WS_EX_APPWINDOW & ~AWT_WS_EX_NOACTIVATE); } ret: diff --git a/jdk/src/windows/native/sun/windows/awt_dlls.cpp b/jdk/src/windows/native/sun/windows/awt_dlls.cpp deleted file mode 100644 index 26af4196dd9..00000000000 --- a/jdk/src/windows/native/sun/windows/awt_dlls.cpp +++ /dev/null @@ -1,422 +0,0 @@ -/* - * Copyright 1999-2003 Sun Microsystems, Inc. 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 - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - */ - -#include "awt.h" -#include "awt_dlls.h" - -/* - * To reduce memory footprint we don't statically link to COMDLG32.DLL - * and SHELL32. Instead we programatically load them only when they are - * needed. - */ - -PrintDlgType AwtCommDialog::do_print_dlg; -PageSetupDlgType AwtCommDialog::do_page_setup_dlg; -GetOpenFileNameType AwtCommDialog::get_open_file_name; -GetSaveFileNameType AwtCommDialog::get_save_file_name; -GetExtendedErrorType AwtCommDialog::get_dlg_extended_error; - -/***********************************************************************/ - -DWORD -AwtCommDialog::CommDlgExtendedError(VOID) { - AwtCommDialog::load_comdlg_procs(); - return static_cast(reinterpret_cast( - AwtToolkit::GetInstance(). - InvokeFunction(reinterpret_cast - (AwtCommDialog::GetExtendedErrorWrapper)))); -} - -BOOL -AwtCommDialog::PrintDlg(LPPRINTDLG data) { - AwtCommDialog::load_comdlg_procs(); - return static_cast(reinterpret_cast( - AwtToolkit::GetInstance(). - InvokeFunction(reinterpret_cast - (AwtCommDialog::PrintDlgWrapper), data))); -} - -BOOL -AwtCommDialog::PageSetupDlg(LPPAGESETUPDLG data) { - AwtCommDialog::load_comdlg_procs(); - return static_cast(reinterpret_cast( - AwtToolkit::GetInstance(). - InvokeFunction(reinterpret_cast - (AwtCommDialog::PageSetupDlgWrapper), data))); -} - -/* - * Load the COMDLG32.dll and get pointers to various procedures. - */ - -void -AwtCommDialog::load_comdlg_procs() -{ - static int initialized = 0; - HMODULE lib = NULL; - if (initialized) { - return; - } - lib = LoadLibrary(TEXT("COMDLG32.DLL")); - HMODULE libUnicows = UnicowsLoader::GetModuleHandle(); - do_print_dlg = (PrintDlgType)GetProcAddress(IS_WIN95 ? libUnicows : lib, "PrintDlgW"); - do_page_setup_dlg = (PageSetupDlgType)GetProcAddress(IS_WIN95 ? libUnicows : lib, "PageSetupDlgW"); - get_open_file_name = (GetOpenFileNameType)GetProcAddress(IS_WIN95 ? libUnicows : lib, "GetOpenFileNameW"); - get_save_file_name = (GetSaveFileNameType)GetProcAddress(IS_WIN95 ? libUnicows : lib, "GetSaveFileNameW"); - get_dlg_extended_error = (GetExtendedErrorType)GetProcAddress(lib, "CommDlgExtendedError"); - initialized = 1; -} - -/***********************************************************************/ - -DragQueryFileType do_drag_query_file; -GetPathFromIDListType get_path_from_idlist; - -/* - * Load the SHELL32.dll and get pointers to various procedures. - */ - -void -load_shell_procs() -{ - static int initialized = 0; - HMODULE lib = NULL; - if (initialized) { - return; - } - - if (IS_WIN95) { - lib = UnicowsLoader::GetModuleHandle(); - } else { - lib = LoadLibrary(TEXT("SHELL32.DLL")); - } - - do_drag_query_file = (DragQueryFileType)GetProcAddress(lib, "DragQueryFileW"); - get_path_from_idlist = (GetPathFromIDListType)GetProcAddress(lib, - "SHGetPathFromIDListW"); - initialized = 1; -} - -/***********************************************************************/ - -AnimateWindowType fn_animate_window; -ChangeDisplaySettingsExType fn_change_display_settings_ex; - -/* - * Load the USER32.dll and get pointers to various procedures. - */ - -void -load_user_procs() -{ - static int initialized = 0; - HMODULE lib = NULL; - if (initialized) { - return; - } - lib = LoadLibrary(TEXT("USER32.DLL")); - HMODULE libUnicows = UnicowsLoader::GetModuleHandle(); - fn_animate_window = (AnimateWindowType)GetProcAddress(lib, "AnimateWindow"); - fn_change_display_settings_ex = (ChangeDisplaySettingsExType) - GetProcAddress(IS_WIN95 ? libUnicows : lib, "ChangeDisplaySettingsExW"); - initialized = 1; -} - -/***********************************************************************/ - -GetFileVersionInfoSizeType get_file_version_info_size; -GetFileVersionInfoType get_file_version_info; -VerQueryValueType do_ver_query_value; - -/* - * Load the VERSION.dll and get pointers to various procedures. - */ - -void -load_version_procs() -{ - static int initialized = 0; - HMODULE lib = NULL; - if (initialized) { - return; - } - - if (IS_WIN95) { - lib = UnicowsLoader::GetModuleHandle(); - } else { - lib = LoadLibrary(TEXT("VERSION.DLL")); - } - - get_file_version_info_size = - (GetFileVersionInfoSizeType)GetProcAddress(lib, "GetFileVersionInfoSizeW"); - get_file_version_info = - (GetFileVersionInfoType)GetProcAddress(lib, "GetFileVersionInfoW"); - do_ver_query_value = - (VerQueryValueType)GetProcAddress(lib, "VerQueryValueW"); - initialized = 1; -} - -/***********************************************************************/ - -#define MAX_KNOWN_VERSION 4 - -/* - * We are going to use an undocumented procedure RSRC32.DLL. - * The safest will be to use it only for a finite set of known versions. - */ - -DWORD known_versions[MAX_KNOWN_VERSION][2] = { - { 0x00040000, 0x000003B6 }, // WIN95\RETAIL - // WIN95\RETAIL\UPGRADE - // WIN95\OSR2 - // WIN95\OSR25 - // WIN95\international\RETAIL - // WIN95\international\OSR2 - - { 0x0004000A, 0x00000672 }, // WIN98\international\win98beta3 - - { 0x0004000A, 0x000007CE }, // WIN98\RETAIL - // WIN98\international\RETAIL - // WIN98\SE - - { 0x0004005A, 0x00000BB8 } // WIN98ME -}; - -GetFreeSystemResourcesType get_free_system_resources = NULL; - -/* - * Load the RSRC32.dll, check that it is a known version - * and get the pointer to the undocumented procedure. - */ - -void -load_rsrc32_procs() -{ - static int initialized = 0; - if (initialized) { - return; - } - if (IS_NT) { - // 4310028: Only load library on non-NT systems. The load - // will always fail anyways. However, if a Win 9x OS is - // also installed on the system, and the user's path - // includes C:\WINDOWS\SYSTEM, or the equivalent, a really - // ugly and annoying warning dialog will appear. - initialized = 1; - return; - } - HMODULE lib = LoadLibrary(TEXT("RSRC32.DLL")); - if (lib != NULL) { - TCHAR szFullPath[_MAX_PATH]; - DWORD dwVerHnd = 0; - DWORD dwVersionInfoSize; - LPBYTE lpVersionInfo; - LPVOID lpBuffer; - UINT uLength = 0; - - /* - * We use undocumented procedure exported by RSRC32.DLL, so the - * safest will be to check the library's version and only attempt - * to get the procedure address if it's a known version. - */ - if (::GetModuleFileName(lib, szFullPath, sizeof(szFullPath))) { - load_version_procs(); - dwVersionInfoSize = (*get_file_version_info_size)(szFullPath, &dwVerHnd); - if (dwVersionInfoSize) { - lpVersionInfo = new BYTE[dwVersionInfoSize]; - (*get_file_version_info)(szFullPath, dwVerHnd, - dwVersionInfoSize, lpVersionInfo); - if ((*do_ver_query_value)(lpVersionInfo, TEXT("\\"), &lpBuffer, &uLength)) { - VS_FIXEDFILEINFO *lpvsFixedFileInfo = (VS_FIXEDFILEINFO *)lpBuffer; - DWORD dwFileVersionMS = lpvsFixedFileInfo->dwFileVersionMS; - DWORD dwFileVersionLS = lpvsFixedFileInfo->dwFileVersionLS; - for (int i = 0; i < MAX_KNOWN_VERSION; i++) { - if ((known_versions[i][0] == dwFileVersionMS) && - (known_versions[i][1] == dwFileVersionLS)) { - get_free_system_resources = - (GetFreeSystemResourcesType) - ::GetProcAddress(lib, "_MyGetFreeSystemResources32@4"); - break; - } - } - } - delete[] lpVersionInfo; - } - } - } - initialized = 1; -} - -void -load_rich_edit_library() { - static int initialized = 0; - BOOL isRichEdit32Needed = IS_WIN95 && !IS_WIN98; - - if (initialized) { - return; - } - - HMODULE lib = NULL; - if (isRichEdit32Needed) { - lib = ::LoadLibrary(TEXT("RICHED32.DLL")); - } else { - lib = ::LoadLibrary(TEXT("RICHED20.DLL")); - } - if (lib == NULL) { - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - JNU_ThrowInternalError(env, "Can't load a rich edit DLL"); - } else if (isRichEdit32Needed) { - // Richedit language checking logic is needed for RICHED32.DLL only. - LPTSTR szFullPath = new TCHAR[_MAX_PATH]; - DWORD dwVerHnd = 0; - DWORD dwVersionInfoSize; - LPVOID lpVersionInfo; - UINT uLength = 0; - struct LANGANDCODEPAGE { - WORD wLanguage; - WORD wCodePage; - } *lpTranslate; - - try { - if (!IS_WIN2000 && ::GetModuleFileName(lib, szFullPath, _MAX_PATH)) { - load_version_procs(); - dwVersionInfoSize = (*get_file_version_info_size)(szFullPath, &dwVerHnd); - if (dwVersionInfoSize) { - lpVersionInfo = new BYTE[dwVersionInfoSize]; - try { - if ((*get_file_version_info)(szFullPath, - dwVerHnd, - dwVersionInfoSize, - lpVersionInfo) - && (*do_ver_query_value)(lpVersionInfo, - TEXT("\\VarFileInfo\\Translation"), - (LPVOID*)&lpTranslate, - &uLength)) { - - if (::GetSystemMetrics(SM_DBCSENABLED) - && LANGIDFROMLCID(::GetThreadLocale()) != lpTranslate[0].wLanguage) { - - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - if (env->PushLocalFrame(6) >= 0) { - jstring keystr = env->NewStringUTF("AWT.InconsistentDLLsWarning"); - jstring defstr = env->NewStringUTF( -"Text based operations may not work correctly due to \ -an inconsistent set of dynamic linking libraries (DLLs) installed on your \ -system. For more information on this problem and a suggested workaround \ -please see the Java(TM) 2 SDK, Standard Edition Release Notes \ -on java.sun.com."); - - jstring retstr = - (jstring) JNU_CallStaticMethodByName( - env, - NULL, - "java/awt/Toolkit", - "getProperty", - "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", - keystr, - defstr).l; - - jboolean exception; - jstring pkgstr = env->NewStringUTF("java.awt"); - jobject logger = - (jobject) JNU_CallStaticMethodByName( - env, - &exception, - "java/util/logging/Logger", - "getLogger", - "(Ljava/lang/String;)Ljava/util/logging/Logger;", - pkgstr).l; - - jstring msgstr = (retstr) ? retstr : defstr; - if (!exception) { - JNU_CallMethodByName( - env, - NULL, - logger, - "warning", - "(Ljava/lang/String;)V", - msgstr); - } else { - LPCTSTR outstr = JNU_GetStringPlatformChars(env, msgstr, NULL); - _ftprintf(stdout, TEXT("\nWARNING: %s\n"), outstr); - fflush(stdout); - JNU_ReleaseStringPlatformChars(env, msgstr, outstr); - } - - env->PopLocalFrame(NULL); - } - } - } - } catch (...) { - delete[] lpVersionInfo; - throw; - } - delete[] lpVersionInfo; - } - } - } catch (...) { - delete[] szFullPath; - throw; - } - delete[] szFullPath; - } - initialized = 1; -} - -/***********************************************************************/ - -bool AwtWinMM::initialized = false; -AwtWinMM::PlaySoundWFunc* AwtWinMM::playSoundFunc = NULL; - -BOOL AwtWinMM::PlaySoundWrapper(LPCTSTR pszSound, HMODULE hmod, DWORD fdwSound) { - load_winmm_procs(); - if (playSoundFunc == NULL) { - return FALSE; - } - return (*playSoundFunc)(pszSound, hmod, fdwSound); -} - -void AwtWinMM::load_winmm_procs() { - if (initialized) { - return; - } - HMODULE dll = NULL; - - if (IS_WIN95) { - dll = UnicowsLoader::GetModuleHandle(); - } else { - dll = ::LoadLibrary(TEXT("winmm.dll")); - } - - if (dll == NULL) { - return; - } - playSoundFunc = - (PlaySoundWFunc*) GetProcAddress(dll, "PlaySoundW"); - if (playSoundFunc == NULL) { - return; - } - initialized = true; -} diff --git a/jdk/src/windows/native/sun/windows/awt_dlls.h b/jdk/src/windows/native/sun/windows/awt_dlls.h deleted file mode 100644 index b7e08980226..00000000000 --- a/jdk/src/windows/native/sun/windows/awt_dlls.h +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright 1999-2003 Sun Microsystems, Inc. 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 - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - */ - -#ifndef AWT_DLLS_H -#define AWT_DLLS_H - -#include -#include -#include -#include "awt_FileDialog.h" -#include "awt_PrintDialog.h" - -/* - * To reduce memory footprint we don't statically link to COMDLG32.DLL - * and SHELL32. Instead we programatically load them only when they are - * needed. - */ - -//--------------------------------------------------------------------------- - -typedef BOOL (APIENTRY *PrintDlgType)(LPPRINTDLGW); -typedef BOOL (APIENTRY *PageSetupDlgType)(LPPAGESETUPDLGW); -typedef BOOL (APIENTRY *GetOpenFileNameType)(LPOPENFILENAMEW); -typedef BOOL (APIENTRY *GetSaveFileNameType)(LPOPENFILENAMEW); -typedef DWORD (APIENTRY *GetExtendedErrorType)(VOID); - -class AwtCommDialog { -public: - static DWORD CommDlgExtendedError(VOID); - - static BOOL PrintDlg(LPPRINTDLG data); - - static BOOL PageSetupDlg(LPPAGESETUPDLG data); - -private: - static void load_comdlg_procs(); - - // Use wrapper functions with default calling convention. If the - // default isn't __stdcall, accessing the Win32 functions directly - // will cause stack corruption if we cast away __stdcall. - static BOOL PrintDlgWrapper(LPPRINTDLG data) { - return (*do_print_dlg)(data); - } - static BOOL PageSetupDlgWrapper(LPPAGESETUPDLG data) { - return (*do_page_setup_dlg)(data); - } - static BOOL GetOpenFileNameWrapper(LPOPENFILENAME data) { - return (*get_open_file_name)(data); - } - static BOOL GetSaveFileNameWrapper(LPOPENFILENAME data) { - return (*get_save_file_name)(data); - } - static DWORD GetExtendedErrorWrapper(VOID) { - return (*get_dlg_extended_error)(); - } - - friend BOOL AwtFileDialog::GetOpenFileName(LPAWTOPENFILENAME); - friend BOOL AwtFileDialog::GetSaveFileName(LPAWTOPENFILENAME); - friend BOOL AwtPrintDialog::PrintDlg(LPPRINTDLG); - - static PrintDlgType do_print_dlg; - static PageSetupDlgType do_page_setup_dlg; - static GetOpenFileNameType get_open_file_name; - static GetSaveFileNameType get_save_file_name; - static GetExtendedErrorType get_dlg_extended_error; -}; - -//--------------------------------------------------------------------------- - -// Dynamically load in SHELL32.DLL and define the procedure pointers listed below. -extern void load_shell_procs(); - -// Procedure pointers obtained from SHELL32.DLL -// You must call load_shell_procs() before using any of these. -typedef UINT (APIENTRY *DragQueryFileType)(HDROP,UINT,LPTSTR,UINT); -typedef BOOL (APIENTRY *GetPathFromIDListType)(LPCITEMIDLIST,LPTSTR); -extern DragQueryFileType do_drag_query_file; -extern GetPathFromIDListType get_path_from_idlist; - -//--------------------------------------------------------------------------- - -// Dynamically load in USER32.DLL and define the procedure pointers listed below. -extern void load_user_procs(); - -// Procedure pointers obtained from USER32.DLL -// You must call load_user_procs() before using any of these. -typedef BOOL (WINAPI *AnimateWindowType)(HWND,DWORD,DWORD); -typedef LONG (WINAPI *ChangeDisplaySettingsExType)(LPCTSTR,LPDEVMODE,HWND,DWORD,LPVOID lParam); -extern AnimateWindowType fn_animate_window; -extern ChangeDisplaySettingsExType fn_change_display_settings_ex; - -//--------------------------------------------------------------------------- - -// Dynamically load in VERSION.DLL and define the procedure pointers listed below. -extern void load_version_procs(); - -// Procedure pointers obtained from VERSION.DLL -// You must call load_version_procs() before using any of these. -typedef DWORD (APIENTRY *GetFileVersionInfoSizeType)(LPTSTR,LPDWORD); -typedef BOOL (APIENTRY *GetFileVersionInfoType)(LPTSTR,DWORD,DWORD,LPVOID); -typedef BOOL (APIENTRY *VerQueryValueType)(const LPVOID,LPTSTR,LPVOID*,PUINT); -extern GetFileVersionInfoSizeType get_file_version_info_size; -extern GetFileVersionInfoType get_file_version_info; -extern VerQueryValueType do_ver_query_value; - -//--------------------------------------------------------------------------- - -// Dynamically load in RSRC32.DLL and define the procedure pointers listed below. -extern void load_rsrc32_procs(); - -// Procedure pointers obtained from RSRC32.DLL -// You must call load_rsrc32_procs() before using this procedure. - -/* - * NOTE: even after load_rsrc32_procs() you must check that - * the function pointer is valid before use. - * It will be NULL in three cases: - * 1.RSRC32.DLL not found. This means that Resource Meter - * isn't installed. - * 2.RSRC32.DLL can't be loaded. This happens on WinNT. - * 3.Unknown version of RSRC32.DLL. This is undocumented - * procedure, so the safest will be to use it only for - * a finite set of known versions. - */ -typedef UINT (APIENTRY *GetFreeSystemResourcesType)(UINT); - -extern GetFreeSystemResourcesType get_free_system_resources; - -extern void load_rich_edit_library(); - -//--------------------------------------------------------------------------- - -/* - * Loading WINMM.DLL (the Windows MultiMedia library) is extremely - * expensive. The AWT only uses it to play certain Windows sounds - * (which are off by default) so we dynamically load it upon demand - * instead of statically linking to it. - */ - -class AwtWinMM { -public: - static BOOL PlaySoundWrapper(LPCTSTR pszSound, HMODULE hmod, DWORD fdwSound); - -private: - static void load_winmm_procs(); - static bool initialized; - typedef BOOL WINAPI PlaySoundWFunc(LPCTSTR pszSound, HMODULE hmod, DWORD fdwSound); - static PlaySoundWFunc* playSoundFunc; -}; - -#endif /* AWT_DLLS_H */ diff --git a/jdk/src/windows/native/sun/windows/awtmsg.h b/jdk/src/windows/native/sun/windows/awtmsg.h index fe03b0c460c..35e436b53e7 100644 --- a/jdk/src/windows/native/sun/windows/awtmsg.h +++ b/jdk/src/windows/native/sun/windows/awtmsg.h @@ -182,18 +182,6 @@ extern const UINT SYSCOMMAND_IMM; #endif //AW_BLEND - - -// WM_MOUSEWHEEL should be WM_MOUSELAST, but -// is not being defined. See winuser.h -#ifdef WM_MOUSELAST -#if WM_MOUSELAST <= 0x020A -#define WM_AWT_MOUSELAST 0x020A -#else -#error Unexpected value of WM_MOUSELAST -#endif //WM_MOUSELAST <= 0x0209 -#endif //WM_MOUSELAST - // AwtComponent messages enum { // 6427323: unfortunately WM_APP+nnn conflicts with edit control messages diff --git a/jdk/src/windows/native/sun/windows/jawt.cpp b/jdk/src/windows/native/sun/windows/jawt.cpp index 91de38a9fd5..ae2d09dd4d9 100644 --- a/jdk/src/windows/native/sun/windows/jawt.cpp +++ b/jdk/src/windows/native/sun/windows/jawt.cpp @@ -1,5 +1,5 @@ /* - * Copyright 1999-2001 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2008 Sun Microsystems, Inc. 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 @@ -26,6 +26,7 @@ #define _JNI_IMPLEMENTATION_ #include +#include "awt.h" #include "awt_DrawingSurface.h" /* diff --git a/jdk/test/java/awt/EventDispatchThread/HandleExceptionOnEDT/HandleExceptionOnEDT.java b/jdk/test/java/awt/EventDispatchThread/HandleExceptionOnEDT/HandleExceptionOnEDT.java new file mode 100644 index 00000000000..3111b6e9c65 --- /dev/null +++ b/jdk/test/java/awt/EventDispatchThread/HandleExceptionOnEDT/HandleExceptionOnEDT.java @@ -0,0 +1,136 @@ +/* + @test + @bug 6304473 6727884 + @summary Tests that an exception on EDT is handled with ThreadGroup.uncaughtException() + @author artem.ananiev: area=awt.eventdispatching + @library ../../regtesthelpers + @build Util + @run main HandleExceptionOnEDT +*/ + +import java.awt.*; +import java.awt.event.*; + +import test.java.awt.regtesthelpers.Util; + +public class HandleExceptionOnEDT +{ + private final static String EXCEPTION_MESSAGE = "A1234567890"; + + private static volatile boolean exceptionHandled = false; + private static volatile boolean mousePressed = false; + + public static void main(String[] args) + { + final Thread.UncaughtExceptionHandler eh = new Thread.UncaughtExceptionHandler() + { + @Override + public void uncaughtException(Thread t, Throwable e) + { + if (e.getMessage().equals(EXCEPTION_MESSAGE)) + { + exceptionHandled = true; + } + } + }; + + Frame f = new Frame("F"); + f.setBounds(100, 100, 400, 300); + // set exception handler for EDT + f.addWindowListener(new WindowAdapter() + { + @Override + public void windowOpened(WindowEvent we) + { + Thread edt = Thread.currentThread(); + edt.setUncaughtExceptionHandler(eh); + } + }); + f.setVisible(true); + + Robot r = Util.createRobot(); + Util.waitForIdle(r); + + // check exception without modal dialog + MouseListener exceptionListener = new MouseAdapter() + { + @Override + public void mousePressed(MouseEvent me) + { + throw new RuntimeException(EXCEPTION_MESSAGE); + } + }; + f.addMouseListener(exceptionListener); + + exceptionHandled = false; + Point fp = f.getLocationOnScreen(); + r.mouseMove(fp.x + f.getWidth() / 2, fp.y + f.getHeight() / 2); + Util.waitForIdle(r); + r.mousePress(InputEvent.BUTTON1_MASK); + Util.waitForIdle(r); + r.mouseRelease(InputEvent.BUTTON2_MASK); + f.removeMouseListener(exceptionListener); + + if (!exceptionHandled) + { + throw new RuntimeException("Test FAILED: exception is not handled for frame"); + } + + // check exception with modal dialog + final Dialog d = new Dialog(f, "D", true); + d.setBounds(fp.x + 100, fp.y + 100, 400, 300); + d.addMouseListener(exceptionListener); + EventQueue.invokeLater(new Runnable() + { + @Override + public void run() + { + d.setVisible(true); + } + }); + Util.waitForIdle(r); + + exceptionHandled = false; + Point dp = d.getLocationOnScreen(); + r.mouseMove(dp.x + d.getWidth() / 2, dp.y + d.getHeight() / 2); + Util.waitForIdle(r); + r.mousePress(InputEvent.BUTTON1_MASK); + Util.waitForIdle(r); + r.mouseRelease(InputEvent.BUTTON2_MASK); + d.removeMouseListener(exceptionListener); + + if (!exceptionHandled) + { + throw new RuntimeException("Test FAILED: exception is not handled for modal dialog"); + } + + // check the dialog is still modal + MouseListener pressedListener = new MouseAdapter() + { + @Override + public void mousePressed(MouseEvent me) + { + mousePressed = true; + } + }; + f.addMouseListener(pressedListener); + + mousePressed = false; + r.mouseMove(fp.x + 50, fp.y + 50); + Util.waitForIdle(r); + r.mousePress(InputEvent.BUTTON1_MASK); + Util.waitForIdle(r); + r.mouseRelease(InputEvent.BUTTON1_MASK); + Util.waitForIdle(r); + f.removeMouseListener(pressedListener); + + if (mousePressed) + { + throw new RuntimeException("Test FAILED: modal dialog is not modal or visible after exception"); + } + + // test is passed + d.dispose(); + f.dispose(); + } +} diff --git a/jdk/test/java/awt/Frame/FrameSize/TestFrameSize.java b/jdk/test/java/awt/Frame/FrameSize/TestFrameSize.java new file mode 100644 index 00000000000..f8a98ea3216 --- /dev/null +++ b/jdk/test/java/awt/Frame/FrameSize/TestFrameSize.java @@ -0,0 +1,67 @@ +/* + * Copyright 2009 Red Hat, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +/* + @test + @bug 6721088 + @summary X11 Window sizes should be what we set them to + @author Omair Majid : area=awt.toplevel + @run main TestFrameSize + */ + +/** + * TestFrameSize.java + * + * Summary: test that X11 Awt windows are drawn with correct sizes + * + * Test fails if size of window is wrong + */ + +import java.awt.Dimension; +import java.awt.Frame; + +public class TestFrameSize { + + static Dimension desiredDimensions = new Dimension(200, 200); + static int ERROR_MARGIN = 15; + static Frame mainWindow; + + public static void drawGui() { + mainWindow = new Frame(""); + mainWindow.setPreferredSize(desiredDimensions); + mainWindow.pack(); + + Dimension actualDimensions = mainWindow.getSize(); + System.out.println("Desired dimensions: " + desiredDimensions.toString()); + System.out.println("Actual dimensions: " + actualDimensions.toString()); + if (Math.abs(actualDimensions.height - desiredDimensions.height) > ERROR_MARGIN) { + throw new RuntimeException("Incorrect widow size"); + } + } + + public static void main(String[] args) { + try { + drawGui(); + } finally { + if (mainWindow != null) { + mainWindow.dispose(); + } + } + } +} diff --git a/jdk/test/java/awt/Mixing/HWDisappear.java b/jdk/test/java/awt/Mixing/HWDisappear.java new file mode 100644 index 00000000000..875c49f567d --- /dev/null +++ b/jdk/test/java/awt/Mixing/HWDisappear.java @@ -0,0 +1,426 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + @test %W% %E% + @bug 6769511 + @summary AWT components are invisible for a while after frame is moved & menu items are visible + @author anthony.petrov@...: area=awt.mixing + @library ../regtesthelpers + @build Util + @run main HWDisappear +*/ + +/** + * HWDisappear.java + * + * summary: AWT components are invisible for a while after frame is moved & menu items are visible + */ + +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +import test.java.awt.regtesthelpers.Util; + +public class HWDisappear +{ + + static volatile boolean clickPassed = false; + + private static void init() + { + //*** Create instructions for the user here *** + + String[] instructions = + { + "This is an AUTOMATIC test, simply wait until it is done.", + "The result (passed or failed) will be shown in the", + "message window below." + }; + Sysout.createDialog( ); + Sysout.printInstructions( instructions ); + + + // Create the frame and the button + JFrame f = new JFrame(); + f.setBounds(100, 100, 400, 300); + + JMenuBar menubar = new JMenuBar(); + f.setJMenuBar(menubar); + + // Create lightweight-enabled menu + JMenu lmenu = new JMenu("Lite Menu"); + lmenu.add("Salad"); + lmenu.add("Fruit Plate"); + lmenu.add("Water"); + menubar.add(lmenu); + + Button b = new Button("OK"); + + f.setLayout(null); + f.add(b); + b.setBounds(50, 50, 200, 50); + + b.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent e) { + clickPassed = true; + } + }); + + f.setVisible(true); + + Robot robot = Util.createRobot(); + robot.setAutoDelay(20); + + Util.waitForIdle(robot); + + // Move quite far to ensure the button is hidden completely + f.setLocation(500, 200); + + Util.waitForIdle(robot); + + // Activate the menu + Point lLoc = lmenu.getLocationOnScreen(); + robot.mouseMove(lLoc.x + 5, lLoc.y + 5); + + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + Util.waitForIdle(robot); + + // Click on the button. + Point bLoc = b.getLocationOnScreen(); + robot.mouseMove(bLoc.x + b.getWidth() / 2, bLoc.y + 5); + + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + Util.waitForIdle(robot); + + if (clickPassed) { + pass(); + } else { + fail("The button cannot be clicked."); + } + }//End init() + + + + /***************************************************** + * Standard Test Machinery Section + * DO NOT modify anything in this section -- it's a + * standard chunk of code which has all of the + * synchronisation necessary for the test harness. + * By keeping it the same in all tests, it is easier + * to read and understand someone else's test, as + * well as insuring that all tests behave correctly + * with the test harness. + * There is a section following this for test- + * classes + ******************************************************/ + private static boolean theTestPassed = false; + private static boolean testGeneratedInterrupt = false; + private static String failureMessage = ""; + + private static Thread mainThread = null; + + private static int sleepTime = 300000; + + // Not sure about what happens if multiple of this test are + // instantiated in the same VM. Being static (and using + // static vars), it aint gonna work. Not worrying about + // it for now. + public static void main( String args[] ) throws InterruptedException + { + mainThread = Thread.currentThread(); + try + { + init(); + } + catch( TestPassedException e ) + { + //The test passed, so just return from main and harness will + // interepret this return as a pass + return; + } + //At this point, neither test pass nor test fail has been + // called -- either would have thrown an exception and ended the + // test, so we know we have multiple threads. + + //Test involves other threads, so sleep and wait for them to + // called pass() or fail() + try + { + Thread.sleep( sleepTime ); + //Timed out, so fail the test + throw new RuntimeException( "Timed out after " + sleepTime/1000 + " seconds" ); + } + catch (InterruptedException e) + { + //The test harness may have interrupted the test. If so, rethrow the exception + // so that the harness gets it and deals with it. + if( ! testGeneratedInterrupt ) throw e; + + //reset flag in case hit this code more than once for some reason (just safety) + testGeneratedInterrupt = false; + + if ( theTestPassed == false ) + { + throw new RuntimeException( failureMessage ); + } + } + + }//main + + public static synchronized void setTimeoutTo( int seconds ) + { + sleepTime = seconds * 1000; + } + + public static synchronized void pass() + { + Sysout.println( "The test passed." ); + Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); + //first check if this is executing in main thread + if ( mainThread == Thread.currentThread() ) + { + //Still in the main thread, so set the flag just for kicks, + // and throw a test passed exception which will be caught + // and end the test. + theTestPassed = true; + throw new TestPassedException(); + } + theTestPassed = true; + testGeneratedInterrupt = true; + mainThread.interrupt(); + }//pass() + + public static synchronized void fail() + { + //test writer didn't specify why test failed, so give generic + fail( "it just plain failed! :-)" ); + } + + public static synchronized void fail( String whyFailed ) + { + Sysout.println( "The test failed: " + whyFailed ); + Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); + //check if this called from main thread + if ( mainThread == Thread.currentThread() ) + { + //If main thread, fail now 'cause not sleeping + throw new RuntimeException( whyFailed ); + } + theTestPassed = false; + testGeneratedInterrupt = true; + failureMessage = whyFailed; + mainThread.interrupt(); + }//fail() + +}// class HWDisappear + +//This exception is used to exit from any level of call nesting +// when it's determined that the test has passed, and immediately +// end the test. +class TestPassedException extends RuntimeException +{ +} + +//*********** End Standard Test Machinery Section ********** + + +//************ Begin classes defined for the test **************** + +// if want to make listeners, here is the recommended place for them, then instantiate +// them in init() + +/* Example of a class which may be written as part of a test +class NewClass implements anInterface + { + static int newVar = 0; + + public void eventDispatched(AWTEvent e) + { + //Counting events to see if we get enough + eventCount++; + + if( eventCount == 20 ) + { + //got enough events, so pass + + HWDisappear.pass(); + } + else if( tries == 20 ) + { + //tried too many times without getting enough events so fail + + HWDisappear.fail(); + } + + }// eventDispatched() + + }// NewClass class + +*/ + + +//************** End classes defined for the test ******************* + + + + +/**************************************************** + Standard Test Machinery + DO NOT modify anything below -- it's a standard + chunk of code whose purpose is to make user + interaction uniform, and thereby make it simpler + to read and understand someone else's test. + ****************************************************/ + +/** + This is part of the standard test machinery. + It creates a dialog (with the instructions), and is the interface + for sending text messages to the user. + To print the instructions, send an array of strings to Sysout.createDialog + WithInstructions method. Put one line of instructions per array entry. + To display a message for the tester to see, simply call Sysout.println + with the string to be displayed. + This mimics System.out.println but works within the test harness as well + as standalone. + */ + +class Sysout +{ + private static TestDialog dialog; + + public static void createDialogWithInstructions( String[] instructions ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + dialog.printInstructions( instructions ); + dialog.setVisible(true); + println( "Any messages for the tester will display here." ); + } + + public static void createDialog( ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + String[] defInstr = { "Instructions will appear here. ", "" } ; + dialog.printInstructions( defInstr ); + dialog.setVisible(true); + println( "Any messages for the tester will display here." ); + } + + + public static void printInstructions( String[] instructions ) + { + dialog.printInstructions( instructions ); + } + + + public static void println( String messageIn ) + { + dialog.displayMessage( messageIn ); + System.out.println(messageIn); + } + +}// Sysout class + +/** + This is part of the standard test machinery. It provides a place for the + test instructions to be displayed, and a place for interactive messages + to the user to be displayed. + To have the test instructions displayed, see Sysout. + To have a message to the user be displayed, see Sysout. + Do not call anything in this dialog directly. + */ +class TestDialog extends Dialog +{ + + TextArea instructionsText; + TextArea messageText; + int maxStringLength = 80; + + //DO NOT call this directly, go through Sysout + public TestDialog( Frame frame, String name ) + { + super( frame, name ); + int scrollBoth = TextArea.SCROLLBARS_BOTH; + instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth ); + add( "North", instructionsText ); + + messageText = new TextArea( "", 5, maxStringLength, scrollBoth ); + add("Center", messageText); + + pack(); + + setVisible(true); + }// TestDialog() + + //DO NOT call this directly, go through Sysout + public void printInstructions( String[] instructions ) + { + //Clear out any current instructions + instructionsText.setText( "" ); + + //Go down array of instruction strings + + String printStr, remainingStr; + for( int i=0; i < instructions.length; i++ ) + { + //chop up each into pieces maxSringLength long + remainingStr = instructions[ i ]; + while( remainingStr.length() > 0 ) + { + //if longer than max then chop off first max chars to print + if( remainingStr.length() >= maxStringLength ) + { + //Try to chop on a word boundary + int posOfSpace = remainingStr. + lastIndexOf( ' ', maxStringLength - 1 ); + + if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1; + + printStr = remainingStr.substring( 0, posOfSpace + 1 ); + remainingStr = remainingStr.substring( posOfSpace + 1 ); + } + //else just print + else + { + printStr = remainingStr; + remainingStr = ""; + } + + instructionsText.append( printStr + "\n" ); + + }// while + + }// for + + }//printInstructions() + + //DO NOT call this directly, go through Sysout + public void displayMessage( String messageIn ) + { + messageText.append( messageIn + "\n" ); + System.out.println(messageIn); + } + +}// TestDialog class diff --git a/jdk/test/java/awt/Mixing/JButtonInGlassPane.java b/jdk/test/java/awt/Mixing/JButtonInGlassPane.java new file mode 100644 index 00000000000..158e438c538 --- /dev/null +++ b/jdk/test/java/awt/Mixing/JButtonInGlassPane.java @@ -0,0 +1,430 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + @test %W% %E% + @bug 6779670 + @summary Tests if a LW components in the glass pane affects HW in the content pane + @author anthony.petrov@...: area=awt.mixing + @library ../regtesthelpers + @build Util + @run main JButtonInGlassPane +*/ + + +/** + * JButtonInGlassPane.java + * + * summary: Tests whether a LW menu correctly overlaps a HW button + */ + +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +import test.java.awt.regtesthelpers.Util; + + + +public class JButtonInGlassPane +{ + static volatile boolean failed = false; + + private static void init() + { + //*** Create instructions for the user here *** + + String[] instructions = + { + "This is an AUTOMATIC test, simply wait until it is done.", + "The result (passed or failed) will be shown in the", + "message window below." + }; + Sysout.createDialog( ); + Sysout.printInstructions( instructions ); + + JFrame frame = new JFrame("Glass Pane children test"); + frame.setLayout(null); + + final Button button = new Button("AWT Button"); + button.setBounds(100,100,100,100); + frame.add(button); + + button.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + failed = true; + } + }); + + frame.getGlassPane().setVisible(true); + Container glassPane = (Container) frame.getGlassPane(); + glassPane.setLayout(null); + + final JButton jbutton = new JButton("JButton"); + jbutton.setBounds(50,50,100,100); + glassPane.add(jbutton); + + jbutton.setVisible(false); + + frame.setSize(400, 400); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + + Robot robot = Util.createRobot(); + robot.setAutoDelay(20); + + Util.waitForIdle(robot); + + jbutton.setVisible(true); + Util.waitForIdle(robot); + + // Click the LW button - in the area that intersects with + // the HW button. + Point lLoc = jbutton.getLocationOnScreen(); + robot.mouseMove(lLoc.x + jbutton.getWidth() - 5, lLoc.y + jbutton.getHeight() - 5); + + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + Util.waitForIdle(robot); + + jbutton.setBounds(50,50,120,120); + Util.waitForIdle(robot); + + // Now click on the 'added' area of the LW button that again + // intersects with the HW. + robot.mouseMove(lLoc.x + jbutton.getWidth() - 5, lLoc.y + jbutton.getHeight() - 5); + + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + Util.waitForIdle(robot); + + if (failed) { + JButtonInGlassPane.fail("The LW button did not receive the click."); + } else { + JButtonInGlassPane.pass(); + } + }//End init() + + + + /***************************************************** + * Standard Test Machinery Section + * DO NOT modify anything in this section -- it's a + * standard chunk of code which has all of the + * synchronisation necessary for the test harness. + * By keeping it the same in all tests, it is easier + * to read and understand someone else's test, as + * well as insuring that all tests behave correctly + * with the test harness. + * There is a section following this for test- + * classes + ******************************************************/ + private static boolean theTestPassed = false; + private static boolean testGeneratedInterrupt = false; + private static String failureMessage = ""; + + private static Thread mainThread = null; + + private static int sleepTime = 300000; + + // Not sure about what happens if multiple of this test are + // instantiated in the same VM. Being static (and using + // static vars), it aint gonna work. Not worrying about + // it for now. + public static void main( String args[] ) throws InterruptedException + { + mainThread = Thread.currentThread(); + try + { + init(); + } + catch( TestPassedException e ) + { + //The test passed, so just return from main and harness will + // interepret this return as a pass + return; + } + //At this point, neither test pass nor test fail has been + // called -- either would have thrown an exception and ended the + // test, so we know we have multiple threads. + + //Test involves other threads, so sleep and wait for them to + // called pass() or fail() + try + { + Thread.sleep( sleepTime ); + //Timed out, so fail the test + throw new RuntimeException( "Timed out after " + sleepTime/1000 + " seconds" ); + } + catch (InterruptedException e) + { + //The test harness may have interrupted the test. If so, rethrow the exception + // so that the harness gets it and deals with it. + if( ! testGeneratedInterrupt ) throw e; + + //reset flag in case hit this code more than once for some reason (just safety) + testGeneratedInterrupt = false; + + if ( theTestPassed == false ) + { + throw new RuntimeException( failureMessage ); + } + } + + }//main + + public static synchronized void setTimeoutTo( int seconds ) + { + sleepTime = seconds * 1000; + } + + public static synchronized void pass() + { + Sysout.println( "The test passed." ); + Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); + //first check if this is executing in main thread + if ( mainThread == Thread.currentThread() ) + { + //Still in the main thread, so set the flag just for kicks, + // and throw a test passed exception which will be caught + // and end the test. + theTestPassed = true; + throw new TestPassedException(); + } + theTestPassed = true; + testGeneratedInterrupt = true; + mainThread.interrupt(); + }//pass() + + public static synchronized void fail() + { + //test writer didn't specify why test failed, so give generic + fail( "it just plain failed! :-)" ); + } + + public static synchronized void fail( String whyFailed ) + { + Sysout.println( "The test failed: " + whyFailed ); + Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); + //check if this called from main thread + if ( mainThread == Thread.currentThread() ) + { + //If main thread, fail now 'cause not sleeping + throw new RuntimeException( whyFailed ); + } + theTestPassed = false; + testGeneratedInterrupt = true; + failureMessage = whyFailed; + mainThread.interrupt(); + }//fail() + +}// class JButtonInGlassPane + +//This exception is used to exit from any level of call nesting +// when it's determined that the test has passed, and immediately +// end the test. +class TestPassedException extends RuntimeException +{ +} + +//*********** End Standard Test Machinery Section ********** + + +//************ Begin classes defined for the test **************** + +// if want to make listeners, here is the recommended place for them, then instantiate +// them in init() + +/* Example of a class which may be written as part of a test +class NewClass implements anInterface + { + static int newVar = 0; + + public void eventDispatched(AWTEvent e) + { + //Counting events to see if we get enough + eventCount++; + + if( eventCount == 20 ) + { + //got enough events, so pass + + JButtonInGlassPane.pass(); + } + else if( tries == 20 ) + { + //tried too many times without getting enough events so fail + + JButtonInGlassPane.fail(); + } + + }// eventDispatched() + + }// NewClass class + +*/ + + +//************** End classes defined for the test ******************* + + + + +/**************************************************** + Standard Test Machinery + DO NOT modify anything below -- it's a standard + chunk of code whose purpose is to make user + interaction uniform, and thereby make it simpler + to read and understand someone else's test. + ****************************************************/ + +/** + This is part of the standard test machinery. + It creates a dialog (with the instructions), and is the interface + for sending text messages to the user. + To print the instructions, send an array of strings to Sysout.createDialog + WithInstructions method. Put one line of instructions per array entry. + To display a message for the tester to see, simply call Sysout.println + with the string to be displayed. + This mimics System.out.println but works within the test harness as well + as standalone. + */ + +class Sysout +{ + private static TestDialog dialog; + + public static void createDialogWithInstructions( String[] instructions ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + dialog.printInstructions( instructions ); + dialog.setVisible(true); + println( "Any messages for the tester will display here." ); + } + + public static void createDialog( ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + String[] defInstr = { "Instructions will appear here. ", "" } ; + dialog.printInstructions( defInstr ); + dialog.setVisible(true); + println( "Any messages for the tester will display here." ); + } + + + public static void printInstructions( String[] instructions ) + { + dialog.printInstructions( instructions ); + } + + + public static void println( String messageIn ) + { + dialog.displayMessage( messageIn ); + System.out.println(messageIn); + } + +}// Sysout class + +/** + This is part of the standard test machinery. It provides a place for the + test instructions to be displayed, and a place for interactive messages + to the user to be displayed. + To have the test instructions displayed, see Sysout. + To have a message to the user be displayed, see Sysout. + Do not call anything in this dialog directly. + */ +class TestDialog extends Dialog +{ + + TextArea instructionsText; + TextArea messageText; + int maxStringLength = 80; + + //DO NOT call this directly, go through Sysout + public TestDialog( Frame frame, String name ) + { + super( frame, name ); + int scrollBoth = TextArea.SCROLLBARS_BOTH; + instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth ); + add( "North", instructionsText ); + + messageText = new TextArea( "", 5, maxStringLength, scrollBoth ); + add("Center", messageText); + + pack(); + + setVisible(true); + }// TestDialog() + + //DO NOT call this directly, go through Sysout + public void printInstructions( String[] instructions ) + { + //Clear out any current instructions + instructionsText.setText( "" ); + + //Go down array of instruction strings + + String printStr, remainingStr; + for( int i=0; i < instructions.length; i++ ) + { + //chop up each into pieces maxSringLength long + remainingStr = instructions[ i ]; + while( remainingStr.length() > 0 ) + { + //if longer than max then chop off first max chars to print + if( remainingStr.length() >= maxStringLength ) + { + //Try to chop on a word boundary + int posOfSpace = remainingStr. + lastIndexOf( ' ', maxStringLength - 1 ); + + if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1; + + printStr = remainingStr.substring( 0, posOfSpace + 1 ); + remainingStr = remainingStr.substring( posOfSpace + 1 ); + } + //else just print + else + { + printStr = remainingStr; + remainingStr = ""; + } + + instructionsText.append( printStr + "\n" ); + + }// while + + }// for + + }//printInstructions() + + //DO NOT call this directly, go through Sysout + public void displayMessage( String messageIn ) + { + messageText.append( messageIn + "\n" ); + System.out.println(messageIn); + } + +}// TestDialog class + + diff --git a/jdk/test/java/awt/Mixing/LWComboBox.java b/jdk/test/java/awt/Mixing/LWComboBox.java new file mode 100644 index 00000000000..8108ff9a3dc --- /dev/null +++ b/jdk/test/java/awt/Mixing/LWComboBox.java @@ -0,0 +1,425 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + @test %W% %E% + @bug 6637655 + @summary Tests whether a LW combobox correctly overlaps a HW button + @author anthony.petrov@...: area=awt.mixing + @library ../regtesthelpers + @build Util + @run main LWComboBox +*/ + + +/** + * LWComboBox.java + * + * summary: Tests whether a LW combobox correctly overlaps a HW button + */ + +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +import java.util.Vector; +import test.java.awt.regtesthelpers.Util; + + + +public class LWComboBox +{ + static volatile boolean failed = false; + + private static void init() + { + //*** Create instructions for the user here *** + + String[] instructions = + { + "This is an AUTOMATIC test, simply wait until it is done.", + "The result (passed or failed) will be shown in the", + "message window below." + }; + Sysout.createDialog( ); + Sysout.printInstructions( instructions ); + + JFrame f = new JFrame("LW menu test"); + + JComboBox ch; + Button b; + + Vector v = new Vector(); + for(int i = 1 ; i <=20;i++){ + v.add("Item # "+i); + } + ch = new JComboBox(v); + + + b = new Button("AWT Button"); + b.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + failed = true; + } + }); + + f.add(ch,BorderLayout.NORTH); + f.add(b,BorderLayout.CENTER); + f.setSize(300,300); + f.setVisible(true); + + Robot robot = Util.createRobot(); + robot.setAutoDelay(20); + + Util.waitForIdle(robot); + + // Pop up the combobox + Point lLoc = ch.getLocationOnScreen(); + System.err.println("lLoc: " + lLoc); + robot.mouseMove(lLoc.x + 5, lLoc.y + 5); + + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + Util.waitForIdle(robot); + + // Click on the combo popup. + // It's assumed that the popup item is located + // above the heavyweight button. + Point bLoc = b.getLocationOnScreen(); + System.err.println("bLoc: " + bLoc); + robot.mouseMove(bLoc.x + 10, bLoc.y + 10); + + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + Util.waitForIdle(robot); + + if (failed) { + fail("The LW popup did not received the click."); + } else { + pass(); + } + }//End init() + + + + /***************************************************** + * Standard Test Machinery Section + * DO NOT modify anything in this section -- it's a + * standard chunk of code which has all of the + * synchronisation necessary for the test harness. + * By keeping it the same in all tests, it is easier + * to read and understand someone else's test, as + * well as insuring that all tests behave correctly + * with the test harness. + * There is a section following this for test- + * classes + ******************************************************/ + private static boolean theTestPassed = false; + private static boolean testGeneratedInterrupt = false; + private static String failureMessage = ""; + + private static Thread mainThread = null; + + private static int sleepTime = 300000; + + // Not sure about what happens if multiple of this test are + // instantiated in the same VM. Being static (and using + // static vars), it aint gonna work. Not worrying about + // it for now. + public static void main( String args[] ) throws InterruptedException + { + mainThread = Thread.currentThread(); + try + { + init(); + } + catch( TestPassedException e ) + { + //The test passed, so just return from main and harness will + // interepret this return as a pass + return; + } + //At this point, neither test pass nor test fail has been + // called -- either would have thrown an exception and ended the + // test, so we know we have multiple threads. + + //Test involves other threads, so sleep and wait for them to + // called pass() or fail() + try + { + Thread.sleep( sleepTime ); + //Timed out, so fail the test + throw new RuntimeException( "Timed out after " + sleepTime/1000 + " seconds" ); + } + catch (InterruptedException e) + { + //The test harness may have interrupted the test. If so, rethrow the exception + // so that the harness gets it and deals with it. + if( ! testGeneratedInterrupt ) throw e; + + //reset flag in case hit this code more than once for some reason (just safety) + testGeneratedInterrupt = false; + + if ( theTestPassed == false ) + { + throw new RuntimeException( failureMessage ); + } + } + + }//main + + public static synchronized void setTimeoutTo( int seconds ) + { + sleepTime = seconds * 1000; + } + + public static synchronized void pass() + { + Sysout.println( "The test passed." ); + Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); + //first check if this is executing in main thread + if ( mainThread == Thread.currentThread() ) + { + //Still in the main thread, so set the flag just for kicks, + // and throw a test passed exception which will be caught + // and end the test. + theTestPassed = true; + throw new TestPassedException(); + } + theTestPassed = true; + testGeneratedInterrupt = true; + mainThread.interrupt(); + }//pass() + + public static synchronized void fail() + { + //test writer didn't specify why test failed, so give generic + fail( "it just plain failed! :-)" ); + } + + public static synchronized void fail( String whyFailed ) + { + Sysout.println( "The test failed: " + whyFailed ); + Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); + //check if this called from main thread + if ( mainThread == Thread.currentThread() ) + { + //If main thread, fail now 'cause not sleeping + throw new RuntimeException( whyFailed ); + } + theTestPassed = false; + testGeneratedInterrupt = true; + failureMessage = whyFailed; + mainThread.interrupt(); + }//fail() + +}// class LWComboBox + +//This exception is used to exit from any level of call nesting +// when it's determined that the test has passed, and immediately +// end the test. +class TestPassedException extends RuntimeException +{ +} + +//*********** End Standard Test Machinery Section ********** + + +//************ Begin classes defined for the test **************** + +// if want to make listeners, here is the recommended place for them, then instantiate +// them in init() + +/* Example of a class which may be written as part of a test +class NewClass implements anInterface + { + static int newVar = 0; + + public void eventDispatched(AWTEvent e) + { + //Counting events to see if we get enough + eventCount++; + + if( eventCount == 20 ) + { + //got enough events, so pass + + LWComboBox.pass(); + } + else if( tries == 20 ) + { + //tried too many times without getting enough events so fail + + LWComboBox.fail(); + } + + }// eventDispatched() + + }// NewClass class + +*/ + + +//************** End classes defined for the test ******************* + + + + +/**************************************************** + Standard Test Machinery + DO NOT modify anything below -- it's a standard + chunk of code whose purpose is to make user + interaction uniform, and thereby make it simpler + to read and understand someone else's test. + ****************************************************/ + +/** + This is part of the standard test machinery. + It creates a dialog (with the instructions), and is the interface + for sending text messages to the user. + To print the instructions, send an array of strings to Sysout.createDialog + WithInstructions method. Put one line of instructions per array entry. + To display a message for the tester to see, simply call Sysout.println + with the string to be displayed. + This mimics System.out.println but works within the test harness as well + as standalone. + */ + +class Sysout +{ + private static TestDialog dialog; + + public static void createDialogWithInstructions( String[] instructions ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + dialog.printInstructions( instructions ); + dialog.setVisible(true); + println( "Any messages for the tester will display here." ); + } + + public static void createDialog( ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + String[] defInstr = { "Instructions will appear here. ", "" } ; + dialog.printInstructions( defInstr ); + dialog.setVisible(true); + println( "Any messages for the tester will display here." ); + } + + + public static void printInstructions( String[] instructions ) + { + dialog.printInstructions( instructions ); + } + + + public static void println( String messageIn ) + { + dialog.displayMessage( messageIn ); + System.out.println(messageIn); + } + +}// Sysout class + +/** + This is part of the standard test machinery. It provides a place for the + test instructions to be displayed, and a place for interactive messages + to the user to be displayed. + To have the test instructions displayed, see Sysout. + To have a message to the user be displayed, see Sysout. + Do not call anything in this dialog directly. + */ +class TestDialog extends Dialog +{ + + TextArea instructionsText; + TextArea messageText; + int maxStringLength = 80; + + //DO NOT call this directly, go through Sysout + public TestDialog( Frame frame, String name ) + { + super( frame, name ); + int scrollBoth = TextArea.SCROLLBARS_BOTH; + instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth ); + add( "North", instructionsText ); + + messageText = new TextArea( "", 5, maxStringLength, scrollBoth ); + add("Center", messageText); + + pack(); + + setVisible(true); + }// TestDialog() + + //DO NOT call this directly, go through Sysout + public void printInstructions( String[] instructions ) + { + //Clear out any current instructions + instructionsText.setText( "" ); + + //Go down array of instruction strings + + String printStr, remainingStr; + for( int i=0; i < instructions.length; i++ ) + { + //chop up each into pieces maxSringLength long + remainingStr = instructions[ i ]; + while( remainingStr.length() > 0 ) + { + //if longer than max then chop off first max chars to print + if( remainingStr.length() >= maxStringLength ) + { + //Try to chop on a word boundary + int posOfSpace = remainingStr. + lastIndexOf( ' ', maxStringLength - 1 ); + + if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1; + + printStr = remainingStr.substring( 0, posOfSpace + 1 ); + remainingStr = remainingStr.substring( posOfSpace + 1 ); + } + //else just print + else + { + printStr = remainingStr; + remainingStr = ""; + } + + instructionsText.append( printStr + "\n" ); + + }// while + + }// for + + }//printInstructions() + + //DO NOT call this directly, go through Sysout + public void displayMessage( String messageIn ) + { + messageText.append( messageIn + "\n" ); + System.out.println(messageIn); + } + +}// TestDialog class + + diff --git a/jdk/test/java/awt/Mixing/MixingOnShrinkingHWButton.java b/jdk/test/java/awt/Mixing/MixingOnShrinkingHWButton.java new file mode 100644 index 00000000000..a1adebe829b --- /dev/null +++ b/jdk/test/java/awt/Mixing/MixingOnShrinkingHWButton.java @@ -0,0 +1,429 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + @test %W% %E% + @bug 6777320 + @summary PIT : Canvas is not fully painted on the internal frame & internal frame goes behind the canvas + @author dmitry.cherepanov@...: area=awt.mixing + @library ../regtesthelpers + @build Util + @run main MixingOnShrinkingHWButton +*/ + + +/** + * MixingOnDialog.java + * + * summary: Tests whether awt.Button and swing.JButton mix correctly + * when awt.Button's width got shrinked + */ + +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +import test.java.awt.regtesthelpers.Util; + + + +public class MixingOnShrinkingHWButton +{ + static volatile boolean heavyClicked = false; + static volatile boolean lightClicked = false; + + private static void init() + { + //*** Create instructions for the user here *** + + String[] instructions = + { + "This is an AUTOMATIC test, simply wait until it is done.", + "The result (passed or failed) will be shown in the", + "message window below." + }; + Sysout.createDialog( ); + Sysout.printInstructions( instructions ); + + + // Create components + final Dialog d = new Dialog((Frame)null, "Button-JButton mix test"); + final Button heavy = new Button(" Heavyweight Button "); + final JButton light = new JButton(" LW Button "); + + // Actions for the buttons add appropriate number to the test sequence + heavy.addActionListener(new java.awt.event.ActionListener() + { + public void actionPerformed(java.awt.event.ActionEvent e) { + heavyClicked = true; + } + } + ); + + light.addActionListener(new java.awt.event.ActionListener() + { + public void actionPerformed(java.awt.event.ActionEvent e) { + lightClicked = true; + } + } + ); + + // Shrink the HW button under LW button + heavy.setBounds(30, 30, 100, 100); + light.setBounds(40, 30, 100, 100); + + // Put the components into the frame + d.setLayout(null); + d.add(light); + d.add(heavy); + d.setBounds(50, 50, 400, 400); + d.setVisible(true); + + + Robot robot = Util.createRobot(); + robot.setAutoDelay(20); + + Util.waitForIdle(robot); + + // Move the mouse pointer to the position where both + // buttons overlap + Point heavyLoc = heavy.getLocationOnScreen(); + robot.mouseMove(heavyLoc.x + 20, heavyLoc.y + 20); + + // Now perform the click at this point + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + Util.waitForIdle(robot); + + // If the buttons are correctly mixed, the test sequence + // is equal to the check sequence. + if (lightClicked == true) { + MixingOnShrinkingHWButton.pass(); + } else { + MixingOnShrinkingHWButton.fail("The lightweight component left behind the heavyweight one."); + } + }//End init() + + + + /***************************************************** + * Standard Test Machinery Section + * DO NOT modify anything in this section -- it's a + * standard chunk of code which has all of the + * synchronisation necessary for the test harness. + * By keeping it the same in all tests, it is easier + * to read and understand someone else's test, as + * well as insuring that all tests behave correctly + * with the test harness. + * There is a section following this for test- + * classes + ******************************************************/ + private static boolean theTestPassed = false; + private static boolean testGeneratedInterrupt = false; + private static String failureMessage = ""; + + private static Thread mainThread = null; + + private static int sleepTime = 300000; + + // Not sure about what happens if multiple of this test are + // instantiated in the same VM. Being static (and using + // static vars), it aint gonna work. Not worrying about + // it for now. + public static void main( String args[] ) throws InterruptedException + { + mainThread = Thread.currentThread(); + try + { + init(); + } + catch( TestPassedException e ) + { + //The test passed, so just return from main and harness will + // interepret this return as a pass + return; + } + //At this point, neither test pass nor test fail has been + // called -- either would have thrown an exception and ended the + // test, so we know we have multiple threads. + + //Test involves other threads, so sleep and wait for them to + // called pass() or fail() + try + { + Thread.sleep( sleepTime ); + //Timed out, so fail the test + throw new RuntimeException( "Timed out after " + sleepTime/1000 + " seconds" ); + } + catch (InterruptedException e) + { + //The test harness may have interrupted the test. If so, rethrow the exception + // so that the harness gets it and deals with it. + if( ! testGeneratedInterrupt ) throw e; + + //reset flag in case hit this code more than once for some reason (just safety) + testGeneratedInterrupt = false; + + if ( theTestPassed == false ) + { + throw new RuntimeException( failureMessage ); + } + } + + }//main + + public static synchronized void setTimeoutTo( int seconds ) + { + sleepTime = seconds * 1000; + } + + public static synchronized void pass() + { + Sysout.println( "The test passed." ); + Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); + //first check if this is executing in main thread + if ( mainThread == Thread.currentThread() ) + { + //Still in the main thread, so set the flag just for kicks, + // and throw a test passed exception which will be caught + // and end the test. + theTestPassed = true; + throw new TestPassedException(); + } + theTestPassed = true; + testGeneratedInterrupt = true; + mainThread.interrupt(); + }//pass() + + public static synchronized void fail() + { + //test writer didn't specify why test failed, so give generic + fail( "it just plain failed! :-)" ); + } + + public static synchronized void fail( String whyFailed ) + { + Sysout.println( "The test failed: " + whyFailed ); + Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); + //check if this called from main thread + if ( mainThread == Thread.currentThread() ) + { + //If main thread, fail now 'cause not sleeping + throw new RuntimeException( whyFailed ); + } + theTestPassed = false; + testGeneratedInterrupt = true; + failureMessage = whyFailed; + mainThread.interrupt(); + }//fail() + +}// class MixingOnDialog + +//This exception is used to exit from any level of call nesting +// when it's determined that the test has passed, and immediately +// end the test. +class TestPassedException extends RuntimeException +{ +} + +//*********** End Standard Test Machinery Section ********** + + +//************ Begin classes defined for the test **************** + +// if want to make listeners, here is the recommended place for them, then instantiate +// them in init() + +/* Example of a class which may be written as part of a test +class NewClass implements anInterface + { + static int newVar = 0; + + public void eventDispatched(AWTEvent e) + { + //Counting events to see if we get enough + eventCount++; + + if( eventCount == 20 ) + { + //got enough events, so pass + + MixingOnDialog.pass(); + } + else if( tries == 20 ) + { + //tried too many times without getting enough events so fail + + MixingOnDialog.fail(); + } + + }// eventDispatched() + + }// NewClass class + +*/ + + +//************** End classes defined for the test ******************* + + + + +/**************************************************** + Standard Test Machinery + DO NOT modify anything below -- it's a standard + chunk of code whose purpose is to make user + interaction uniform, and thereby make it simpler + to read and understand someone else's test. + ****************************************************/ + +/** + This is part of the standard test machinery. + It creates a dialog (with the instructions), and is the interface + for sending text messages to the user. + To print the instructions, send an array of strings to Sysout.createDialog + WithInstructions method. Put one line of instructions per array entry. + To display a message for the tester to see, simply call Sysout.println + with the string to be displayed. + This mimics System.out.println but works within the test harness as well + as standalone. + */ + +class Sysout +{ + private static TestDialog dialog; + + public static void createDialogWithInstructions( String[] instructions ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + dialog.printInstructions( instructions ); + dialog.setVisible(true); + println( "Any messages for the tester will display here." ); + } + + public static void createDialog( ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + String[] defInstr = { "Instructions will appear here. ", "" } ; + dialog.printInstructions( defInstr ); + dialog.setVisible(true); + println( "Any messages for the tester will display here." ); + } + + + public static void printInstructions( String[] instructions ) + { + dialog.printInstructions( instructions ); + } + + + public static void println( String messageIn ) + { + dialog.displayMessage( messageIn ); + System.out.println(messageIn); + } + +}// Sysout class + +/** + This is part of the standard test machinery. It provides a place for the + test instructions to be displayed, and a place for interactive messages + to the user to be displayed. + To have the test instructions displayed, see Sysout. + To have a message to the user be displayed, see Sysout. + Do not call anything in this dialog directly. + */ +class TestDialog extends Dialog +{ + + TextArea instructionsText; + TextArea messageText; + int maxStringLength = 80; + + //DO NOT call this directly, go through Sysout + public TestDialog( Frame frame, String name ) + { + super( frame, name ); + int scrollBoth = TextArea.SCROLLBARS_BOTH; + instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth ); + add( "North", instructionsText ); + + messageText = new TextArea( "", 5, maxStringLength, scrollBoth ); + add("Center", messageText); + + pack(); + + setVisible(true); + }// TestDialog() + + //DO NOT call this directly, go through Sysout + public void printInstructions( String[] instructions ) + { + //Clear out any current instructions + instructionsText.setText( "" ); + + //Go down array of instruction strings + + String printStr, remainingStr; + for( int i=0; i < instructions.length; i++ ) + { + //chop up each into pieces maxSringLength long + remainingStr = instructions[ i ]; + while( remainingStr.length() > 0 ) + { + //if longer than max then chop off first max chars to print + if( remainingStr.length() >= maxStringLength ) + { + //Try to chop on a word boundary + int posOfSpace = remainingStr. + lastIndexOf( ' ', maxStringLength - 1 ); + + if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1; + + printStr = remainingStr.substring( 0, posOfSpace + 1 ); + remainingStr = remainingStr.substring( posOfSpace + 1 ); + } + //else just print + else + { + printStr = remainingStr; + remainingStr = ""; + } + + instructionsText.append( printStr + "\n" ); + + }// while + + }// for + + }//printInstructions() + + //DO NOT call this directly, go through Sysout + public void displayMessage( String messageIn ) + { + messageText.append( messageIn + "\n" ); + System.out.println(messageIn); + } + +}// TestDialog class + + diff --git a/jdk/test/java/awt/Mixing/NonOpaqueInternalFrame.java b/jdk/test/java/awt/Mixing/NonOpaqueInternalFrame.java new file mode 100644 index 00000000000..e1840ee6c6f --- /dev/null +++ b/jdk/test/java/awt/Mixing/NonOpaqueInternalFrame.java @@ -0,0 +1,434 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + @test %W% %E% + @bug 6768332 + @summary Tests whether internal frames are always considered opaque + @author anthony.petrov@...: area=awt.mixing + @library ../regtesthelpers + @build Util + @run main NonOpaqueInternalFrame +*/ + + +/** + * NonOpaqueInternalFrame.java + * + * summary: Tests whether internal frames are always considered opaque + */ + +import java.awt.*; +import java.awt.event.*; +import java.beans.PropertyVetoException; +import javax.swing.*; +import java.util.Vector; +import test.java.awt.regtesthelpers.Util; + + + +public class NonOpaqueInternalFrame +{ + static volatile boolean failed = false; + + private static final class MyButton extends Button + implements ActionListener + { + public MyButton() { + setPreferredSize(new Dimension(100, 100)); + addActionListener(this); + } + + public void actionPerformed(ActionEvent e) { + failed = true; + } + } + + private static void init() + { + String[] instructions = + { + "This is an AUTOMATIC test, simply wait until it is done.", + "The result (passed or failed) will be shown in the", + "message window below." + }; + Sysout.createDialog( ); + Sysout.printInstructions( instructions ); + + + // Create a frame with two non-opaque JInternalFrame's containing + // heavyweight buttons. + JFrame jframe = new JFrame("mixing test"); + JDesktopPane desktop = new JDesktopPane(); + jframe.setContentPane(desktop); + JInternalFrame iframe1 = new JInternalFrame("iframe 1"); + iframe1.setIconifiable(true); + iframe1.add(new MyButton()); + iframe1.setBounds(10, 10, 100, 100); + iframe1.setOpaque(false); + iframe1.setVisible(true); + desktop.add(iframe1); + JInternalFrame iframe2 = new JInternalFrame("iframe 2"); + iframe2.setIconifiable(true); + iframe2.add(new MyButton()); + iframe2.setBounds(50, 50, 100, 100); + iframe2.setOpaque(false); + iframe2.setVisible(true); + desktop.add(iframe2); + jframe.setSize(300, 300); + jframe.setVisible(true); + + Robot robot = Util.createRobot(); + robot.setAutoDelay(20); + + Util.waitForIdle(robot); + + // Try selecting the bottommost frame + try { + iframe2.setSelected(true); + } catch (PropertyVetoException ex) { + ex.printStackTrace(); + } + + // Click the title bar of the internal frame + Point lLoc = iframe2.getLocationOnScreen(); + System.err.println("lLoc: " + lLoc); + robot.mouseMove(lLoc.x + 10, lLoc.y + 10); + Util.waitForIdle(robot); + + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + Util.waitForIdle(robot); + + + if (failed) { + fail("The JInternalFrame is considered non-opaque."); + } else { + pass(); + } + }//End init() + + + + /***************************************************** + * Standard Test Machinery Section + * DO NOT modify anything in this section -- it's a + * standard chunk of code which has all of the + * synchronisation necessary for the test harness. + * By keeping it the same in all tests, it is easier + * to read and understand someone else's test, as + * well as insuring that all tests behave correctly + * with the test harness. + * There is a section following this for test- + * classes + ******************************************************/ + private static boolean theTestPassed = false; + private static boolean testGeneratedInterrupt = false; + private static String failureMessage = ""; + + private static Thread mainThread = null; + + private static int sleepTime = 300000; + + // Not sure about what happens if multiple of this test are + // instantiated in the same VM. Being static (and using + // static vars), it aint gonna work. Not worrying about + // it for now. + public static void main( String args[] ) throws InterruptedException + { + mainThread = Thread.currentThread(); + try + { + init(); + } + catch( TestPassedException e ) + { + //The test passed, so just return from main and harness will + // interepret this return as a pass + return; + } + //At this point, neither test pass nor test fail has been + // called -- either would have thrown an exception and ended the + // test, so we know we have multiple threads. + + //Test involves other threads, so sleep and wait for them to + // called pass() or fail() + try + { + Thread.sleep( sleepTime ); + //Timed out, so fail the test + throw new RuntimeException( "Timed out after " + sleepTime/1000 + " seconds" ); + } + catch (InterruptedException e) + { + //The test harness may have interrupted the test. If so, rethrow the exception + // so that the harness gets it and deals with it. + if( ! testGeneratedInterrupt ) throw e; + + //reset flag in case hit this code more than once for some reason (just safety) + testGeneratedInterrupt = false; + + if ( theTestPassed == false ) + { + throw new RuntimeException( failureMessage ); + } + } + + }//main + + public static synchronized void setTimeoutTo( int seconds ) + { + sleepTime = seconds * 1000; + } + + public static synchronized void pass() + { + Sysout.println( "The test passed." ); + Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); + //first check if this is executing in main thread + if ( mainThread == Thread.currentThread() ) + { + //Still in the main thread, so set the flag just for kicks, + // and throw a test passed exception which will be caught + // and end the test. + theTestPassed = true; + throw new TestPassedException(); + } + theTestPassed = true; + testGeneratedInterrupt = true; + mainThread.interrupt(); + }//pass() + + public static synchronized void fail() + { + //test writer didn't specify why test failed, so give generic + fail( "it just plain failed! :-)" ); + } + + public static synchronized void fail( String whyFailed ) + { + Sysout.println( "The test failed: " + whyFailed ); + Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); + //check if this called from main thread + if ( mainThread == Thread.currentThread() ) + { + //If main thread, fail now 'cause not sleeping + throw new RuntimeException( whyFailed ); + } + theTestPassed = false; + testGeneratedInterrupt = true; + failureMessage = whyFailed; + mainThread.interrupt(); + }//fail() + +}// class NonOpaqueInternalFrame + +//This exception is used to exit from any level of call nesting +// when it's determined that the test has passed, and immediately +// end the test. +class TestPassedException extends RuntimeException +{ +} + +//*********** End Standard Test Machinery Section ********** + + +//************ Begin classes defined for the test **************** + +// if want to make listeners, here is the recommended place for them, then instantiate +// them in init() + +/* Example of a class which may be written as part of a test +class NewClass implements anInterface + { + static int newVar = 0; + + public void eventDispatched(AWTEvent e) + { + //Counting events to see if we get enough + eventCount++; + + if( eventCount == 20 ) + { + //got enough events, so pass + + NonOpaqueInternalFrame.pass(); + } + else if( tries == 20 ) + { + //tried too many times without getting enough events so fail + + NonOpaqueInternalFrame.fail(); + } + + }// eventDispatched() + + }// NewClass class + +*/ + + +//************** End classes defined for the test ******************* + + + + +/**************************************************** + Standard Test Machinery + DO NOT modify anything below -- it's a standard + chunk of code whose purpose is to make user + interaction uniform, and thereby make it simpler + to read and understand someone else's test. + ****************************************************/ + +/** + This is part of the standard test machinery. + It creates a dialog (with the instructions), and is the interface + for sending text messages to the user. + To print the instructions, send an array of strings to Sysout.createDialog + WithInstructions method. Put one line of instructions per array entry. + To display a message for the tester to see, simply call Sysout.println + with the string to be displayed. + This mimics System.out.println but works within the test harness as well + as standalone. + */ + +class Sysout +{ + private static TestDialog dialog; + + public static void createDialogWithInstructions( String[] instructions ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + dialog.printInstructions( instructions ); + dialog.setVisible(true); + println( "Any messages for the tester will display here." ); + } + + public static void createDialog( ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + String[] defInstr = { "Instructions will appear here. ", "" } ; + dialog.printInstructions( defInstr ); + dialog.setVisible(true); + println( "Any messages for the tester will display here." ); + } + + + public static void printInstructions( String[] instructions ) + { + dialog.printInstructions( instructions ); + } + + + public static void println( String messageIn ) + { + dialog.displayMessage( messageIn ); + System.out.println(messageIn); + } + +}// Sysout class + +/** + This is part of the standard test machinery. It provides a place for the + test instructions to be displayed, and a place for interactive messages + to the user to be displayed. + To have the test instructions displayed, see Sysout. + To have a message to the user be displayed, see Sysout. + Do not call anything in this dialog directly. + */ +class TestDialog extends Dialog +{ + + TextArea instructionsText; + TextArea messageText; + int maxStringLength = 80; + + //DO NOT call this directly, go through Sysout + public TestDialog( Frame frame, String name ) + { + super( frame, name ); + int scrollBoth = TextArea.SCROLLBARS_BOTH; + instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth ); + add( "North", instructionsText ); + + messageText = new TextArea( "", 5, maxStringLength, scrollBoth ); + add("Center", messageText); + + pack(); + + setVisible(true); + }// TestDialog() + + //DO NOT call this directly, go through Sysout + public void printInstructions( String[] instructions ) + { + //Clear out any current instructions + instructionsText.setText( "" ); + + //Go down array of instruction strings + + String printStr, remainingStr; + for( int i=0; i < instructions.length; i++ ) + { + //chop up each into pieces maxSringLength long + remainingStr = instructions[ i ]; + while( remainingStr.length() > 0 ) + { + //if longer than max then chop off first max chars to print + if( remainingStr.length() >= maxStringLength ) + { + //Try to chop on a word boundary + int posOfSpace = remainingStr. + lastIndexOf( ' ', maxStringLength - 1 ); + + if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1; + + printStr = remainingStr.substring( 0, posOfSpace + 1 ); + remainingStr = remainingStr.substring( posOfSpace + 1 ); + } + //else just print + else + { + printStr = remainingStr; + remainingStr = ""; + } + + instructionsText.append( printStr + "\n" ); + + }// while + + }// for + + }//printInstructions() + + //DO NOT call this directly, go through Sysout + public void displayMessage( String messageIn ) + { + messageText.append( messageIn + "\n" ); + System.out.println(messageIn); + } + +}// TestDialog class + + diff --git a/jdk/test/java/awt/Mixing/OpaqueTest.java b/jdk/test/java/awt/Mixing/OpaqueTest.java index 6d00f4393be..7d215316faf 100644 --- a/jdk/test/java/awt/Mixing/OpaqueTest.java +++ b/jdk/test/java/awt/Mixing/OpaqueTest.java @@ -42,6 +42,7 @@ import java.awt.*; import java.awt.event.*; import javax.swing.*; import test.java.awt.regtesthelpers.Util; +import com.sun.awt.AWTUtilities; @@ -78,6 +79,7 @@ public class OpaqueTest { public void actionPerformed(java.awt.event.ActionEvent e) { p.setComponentZOrder(light, 0); + f.validate(); testSeq = testSeq + "0"; } } @@ -87,6 +89,7 @@ public class OpaqueTest { public void actionPerformed(java.awt.event.ActionEvent e) { p.setComponentZOrder(heavy, 0); + f.validate(); testSeq = testSeq + "1"; } } @@ -120,10 +123,12 @@ public class OpaqueTest // flag value. for (int i = 0; i < 9; ++i) { if (i == 3) { - light.setOpaque(false); + AWTUtilities.setComponentMixingCutoutShape(light, + new Rectangle()); } if (i == 6) { - light.setOpaque(true); + AWTUtilities.setComponentMixingCutoutShape(light, + null); } robot.mousePress(InputEvent.BUTTON1_MASK); diff --git a/jdk/test/java/awt/Mixing/OverlappingButtons.java b/jdk/test/java/awt/Mixing/OverlappingButtons.java index 85faba8d742..dc80852aa8a 100644 --- a/jdk/test/java/awt/Mixing/OverlappingButtons.java +++ b/jdk/test/java/awt/Mixing/OverlappingButtons.java @@ -78,6 +78,7 @@ public class OverlappingButtons { public void actionPerformed(java.awt.event.ActionEvent e) { p.setComponentZOrder(light, 0); + f.validate(); testSeq = testSeq + "0"; } } @@ -87,6 +88,7 @@ public class OverlappingButtons { public void actionPerformed(java.awt.event.ActionEvent e) { p.setComponentZOrder(heavy, 0); + f.validate(); testSeq = testSeq + "1"; } } diff --git a/jdk/test/java/awt/Mouse/MaximizedFrameTest/MaximizedFrameTest.html b/jdk/test/java/awt/Mouse/MaximizedFrameTest/MaximizedFrameTest.html new file mode 100644 index 00000000000..81d845c6ca0 --- /dev/null +++ b/jdk/test/java/awt/Mouse/MaximizedFrameTest/MaximizedFrameTest.html @@ -0,0 +1,42 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + + + + + + + +

        bug 6176814
        Bug ID: 6176814

        + +

        This is an AUTOMATIC test, simply wait for completion

        + + + + diff --git a/jdk/test/java/awt/Mouse/MaximizedFrameTest/MaximizedFrameTest.java b/jdk/test/java/awt/Mouse/MaximizedFrameTest/MaximizedFrameTest.java new file mode 100644 index 00000000000..6f6b51cd605 --- /dev/null +++ b/jdk/test/java/awt/Mouse/MaximizedFrameTest/MaximizedFrameTest.java @@ -0,0 +1,112 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + test + @bug 6176814 + @summary Metalworks frame maximizes after the move + @author Andrei.Dmitriev area=Event + @run applet MaximizedFrameTest.html +*/ + +import java.applet.Applet; +import javax.swing.*; +import java.awt.event.*; +import java.awt.*; + +public class MaximizedFrameTest extends Applet +{ + final int ITERATIONS_COUNT = 20; + Robot robot; + Point framePosition; + Point newFrameLocation; + JFrame frame; + Rectangle gcBounds; + public static Object LOCK = new Object(); + + public void init() + { + String[] instructions = + { + "This is an AUTOMATIC test", + "simply wait until it is done" + }; + JFrame.setDefaultLookAndFeelDecorated(true); + frame = new JFrame("JFrame Maximization Test"); + frame.pack(); + frame.setSize(450, 260); + }//End init() + + public void start () + { + frame.setVisible(true); + validate(); + JLayeredPane lPane = frame.getLayeredPane(); + // System.out.println("JFrame's LayeredPane " + lPane ); + Component titleComponent = null; + boolean titleFound = false; + for (int j=0; j < lPane.getComponentsInLayer(JLayeredPane.FRAME_CONTENT_LAYER.intValue()).length; j++){ + titleComponent = lPane.getComponentsInLayer(JLayeredPane.FRAME_CONTENT_LAYER.intValue())[j]; + if (titleComponent.getClass().getName().equals("javax.swing.plaf.metal.MetalTitlePane")){ + titleFound = true; + break; + } + } + if ( !titleFound ){ + throw new RuntimeException("Test Failed. Unable to determine title's size."); + } + //-------------------------------- + // it is sufficient to get maximized Frame only once. + Point tempMousePosition; + framePosition = frame.getLocationOnScreen(); + try { + robot = new Robot(); + tempMousePosition = new Point(framePosition.x + + frame.getWidth()/2, + framePosition.y + + titleComponent.getHeight()/2); + robot.mouseMove(tempMousePosition.x, tempMousePosition.y); + for (int iteration=0; iteration < ITERATIONS_COUNT; iteration++){ + robot.mousePress(InputEvent.BUTTON1_MASK); + gcBounds = + GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()[0].getConfigurations()[0].getBounds(); + //Moving a mouse pointer less than a few pixels + //leads to rising a double click event. + //We have to use exceeded the AWT_MULTICLICK_SMUDGE + //const value (which is 4 by default on GNOME) to test that. + tempMousePosition.x += 5; + robot.mouseMove(tempMousePosition.x, tempMousePosition.y); + robot.delay(70); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + if ( frame.getExtendedState() != 0 ){ + throw new RuntimeException ("Test failed. JFrame was maximized. ExtendedState is : "+frame.getExtendedState()); + } + robot.delay(500); + } //for iteration + + }catch(AWTException e) { + throw new RuntimeException("Test Failed. AWTException thrown."); + } + System.out.println("Test passed."); + }// start() +}// class diff --git a/jdk/test/java/awt/Mouse/MouseModifiersUnitTest/ExtraButtonDrag.java b/jdk/test/java/awt/Mouse/MouseModifiersUnitTest/ExtraButtonDrag.java new file mode 100644 index 00000000000..e49736ca875 --- /dev/null +++ b/jdk/test/java/awt/Mouse/MouseModifiersUnitTest/ExtraButtonDrag.java @@ -0,0 +1,131 @@ +/* + @test %I% %E% + @bug 6315717 + @summary verifies that drag events are coming for every button if the property is set to true + @author Andrei Dmitriev : area=awt.mouse + @run main ExtraButtonDrag + */ + +//events from standard should also come + +import java.awt.*; +import java.awt.event.*; + +public class ExtraButtonDrag extends Frame { + static String tk = Toolkit.getDefaultToolkit().getClass().getName(); + static Robot robot; + static int [] buttonsPressed; + static int [] buttonsReleased; + static int [] buttonsClicked; + volatile static boolean dragged = false; + volatile static boolean moved = false; + + public ExtraButtonDrag(){ + super("ExtraButtonDrag"); + } + + public static void main(String []s){ + Frame frame = new ExtraButtonDrag(); + + MouseAdapter ma = new MouseAdapter() { + public void mouseDragged(MouseEvent e) { + System.out.println("Dragged "+e);// +" : "+ e.getButton() + " : " +e.getButtonState(e.getButton())); + dragged = true; + } + public void mouseMoved(MouseEvent e) { + System.out.println("Moved "+e); + moved = true; + } + public void mousePressed(MouseEvent e) { + System.out.println(">>> "+e); + } + public void mouseReleased(MouseEvent e) { + System.out.println(">>> "+e); + } + + }; + + frame.addMouseMotionListener(ma); + frame.addMouseListener(ma); + + frame.setSize(300, 300); + frame.setVisible(true); + + int [] buttonMask = new int [MouseInfo.getNumberOfButtons()]; //InputEvent.getButtonMasks(); + + for (int i = 0; i < MouseInfo.getNumberOfButtons(); i++){ + buttonMask[i] = InputEvent.getMaskForButton(i+1); + // System.out.println("TEST: "+tmp[i]); + } + + try { + robot = new Robot(); + robot.delay(1000); + Point centerFrame = new Point(frame.getLocationOnScreen().x + frame.getWidth()/2, frame.getLocationOnScreen().y + frame.getHeight()/2); + Point outboundsFrame = new Point(frame.getLocationOnScreen().x + frame.getWidth()*3/2, frame.getLocationOnScreen().y + frame.getHeight()/2); + + System.out.println("areExtraMouseButtonsEnabled() == " + Toolkit.getDefaultToolkit().areExtraMouseButtonsEnabled() ); + + for (int i = 0; i < MouseInfo.getNumberOfButtons(); i++){ + System.out.println("button to drag = " +(i+1) + " : value passed to robot = " +buttonMask[i]); + + try { + dragMouse(buttonMask[i], centerFrame.x, centerFrame.y, outboundsFrame.x, outboundsFrame.y); + } catch (IllegalArgumentException e){ + throw new RuntimeException("Test failed. Exception occured.", e); + } + + robot.delay(500); + //this is a choice-case for X protocol issue: native events from extra buttons doesn't contain + // the correct state so it's unable to decide if there is a drag or move. By default we send MOVED event. + //XToolkit: extra buttons should report MOVED events only + //WToolkit: extra buttons should report DRAGGED events only + if (i > 2){ //extra buttons only + if (tk.equals("sun.awt.X11.XToolkit") || tk.equals("sun.awt.motif.MToolkit")) { + if (!moved || dragged) { + throw new RuntimeException("Test failed."+ tk +" Button = " +(i+1) + " moved = "+moved +" : dragged = " +dragged); + } + } else { //WToolkit + if (moved || !dragged) { + throw new RuntimeException("Test failed."+ tk +" Button = " +(i+1) + " moved = "+moved +" : dragged = " +dragged); + } + } + } else { + if (moved || !dragged){ + throw new RuntimeException("Test failed. Button = " +(i+1) + " not dragged."); + } + } + } + } catch (Exception e){ + throw new RuntimeException("", e); + } + } + + public static void dragMouse(int button, int x0, int y0, int x1, int y1){ + int curX = x0; + int curY = y0; + int dx = x0 < x1 ? 1 : -1; + int dy = y0 < y1 ? 1 : -1; + robot.mouseMove(x0, y0); + + robot.delay(200); + dragged = false; + moved = false; + + robot.mousePress(button); + + while (curX != x1){ + curX += dx; + robot.mouseMove(curX, curY); + robot.delay(5); + } + while (curY != y1 ){ + curY += dy; + robot.mouseMove(curX, curY); + robot.delay(5); + } + robot.mouseRelease(button); + } + +} + diff --git a/jdk/test/java/awt/Mouse/MouseModifiersUnitTest/ModifierPermutation.java b/jdk/test/java/awt/Mouse/MouseModifiersUnitTest/ModifierPermutation.java new file mode 100644 index 00000000000..2c22669a4da --- /dev/null +++ b/jdk/test/java/awt/Mouse/MouseModifiersUnitTest/ModifierPermutation.java @@ -0,0 +1,320 @@ +/* + test %I% %E% + @bug 6315717 + @summary presses buttons in all permutations and verifies modifiers + @author Andrei Dmitriev : area=awt.mouse + @run main ModifierPermutation + */ +//package modifierpermutation; + +/* +The test will try to press-release every button present on the mouse in different order. +Here are some abbreviations: + BUTTON1 press = P1 + BUTTON2 press = P2 etc. + BUTTON1 release = R1 + BUTTON2 release = R2 etc. +Only sequences alike below are possible : . +Sequences like will not be covered by this test due to its probable complexity. + */ + +import java.awt.*; +import sun.awt.SunToolkit; +import java.awt.event.*; +import java.util.Arrays; + +public class ModifierPermutation { + static boolean failed = false; + final static int BUTTONSNUMBER = MouseInfo.getNumberOfButtons(); + +/* + * Because of some problems with BUTTONx_MASK + * (they are not ordered. Instead, their values are: 16 8 4) + * We have to use array [1..n] and make every permutation on its + * containment. After each permutation, make the same thing with + * array of buttons and array of expected modifiers. + */ + static SunToolkit st = (SunToolkit)(Toolkit.getDefaultToolkit()); + //all button masks + static int [] mouseButtons = new int [BUTTONSNUMBER]; //BUTTONx_MASK + static int [] mouseButtonsDown = new int [BUTTONSNUMBER]; //BUTTONx_DOWN_MASK + + //used to store mouse buttons sequences to press/to release + static int [] affectedButtonsToPressRelease; +// static int [] buttonsToRelease; +// static int [] modifiersToVerifyOnPressRelease; + + static Robot robot; + static CheckingAdapter adapterTest1; + static Frame f; + + static { + for (int i = 0; i < BUTTONSNUMBER; i++){ + mouseButtons[i] = InputEvent.getMaskForButton(i+1); //then change first three elements here to BUTTONx_MASK + mouseButtonsDown[i] = InputEvent.getMaskForButton(i+1); + } + //mouseButtons initially has following values : 16 8 4. +/* mouseButtons[0] = InputEvent.BUTTON1_MASK; + mouseButtons[1] = InputEvent.BUTTON2_MASK; + mouseButtons[2] = InputEvent.BUTTON3_MASK; + */ + } + + public static void main(String s[]){ + init(); + + try { + robot = new Robot(); + } catch (Exception e){ + e.printStackTrace(); + throw new RuntimeException("Test failed.", e); + } + robot.delay(500); + robot.mouseMove(f.getLocationOnScreen().x + f.getWidth()/2, f.getLocationOnScreen().y + f.getHeight()/2); + robot.delay(500); + //Top limit is the factorial of the number of existing buttons + for (int k = 0; k < factorial(mouseButtons.length)-1; k++){ + //now we will press 2 up to maximum buttons and release them in different order and listen for + // PRESSED events and check it's ExModifiers + for (int buttonsToPressNumber = 2; buttonsToPressNumber <= BUTTONSNUMBER; buttonsToPressNumber++ ){ + System.out.println(">>>"); + + //Now get the slice of affected buttons + affectedButtonsToPressRelease = Arrays.copyOf(mouseButtons, buttonsToPressNumber); +// modifiersToVerifyOnPressRelease = Arrays.copyOf(mouseButtons, buttonsToPressNumber); + + //Now press all these buttons in the order as they are in array affectedButtonsToPressRelease + //And release all these buttons in back order. + + dumpArray("Affected Buttons ", affectedButtonsToPressRelease); + pressAllButtons(affectedButtonsToPressRelease); + releaseAllButtonsForwardOrder(affectedButtonsToPressRelease); +// nextPermutation(i, buttonsToRelease); + //TODO: press buttons and release them backward + //All I have to add is : +// pressAllButtons(affectedButtonsToPressRelease); +// releaseAllButtonsBackwardOrder(affectedButtonsToPressRelease); + + System.out.println("<<<"); + } + nextPermutation(k, mouseButtons); +// PermutationGenerator.nextPermutation(k, mouseButtonsDown); + dumpArray("mouseButtons (step="+k+")", mouseButtons); +// dumpArray("mouseButtonsDown (step="+k+")", mouseButtonsDown); + } + } + + private static void init(){ + adapterTest1 = new CheckingAdapter(); + f = new Frame("Robot presses mouse here"); + f.setSize(300, 300); + f.setVisible(true); + f.addMouseListener(adapterTest1); + } + public static int factorial(int t){ + if (t <=1 ) { + return 1; + } else { + return t*factorial(t-1); + } + } + + // use this variable to get current button on EDT in checkModifiers() + static volatile int currentButtonIndexUnderAction; + + public static void pressAllButtons(int []array){ + for (int i = 0; i =0) { + if (array[i] < array[i+1]){ + leftEl = i; + // System.out.println("leftEl = "+leftEl); + break; + } + i--; + } + + i = array.length - 1; + while (i>=0) { + if (array[i] > array[leftEl]) { + rightEl = i; + // System.out.println("rightEl = "+rightEl); + break; + } + i--; + } + swapElements(array, leftEl, rightEl); + if (leftEl + 2 < array.length){ + // System.out.println("sort"); + Arrays.sort(array, leftEl + 1 , array.length); + } + } + + public static void swapElements(int [] array, int leftEl, int rightEl){ + int tmp = array[leftEl]; + array[leftEl] = array[rightEl]; + array[rightEl] = tmp; + } + + public static void checkModifiersOnRelease(MouseEvent e){ + System.out.println("CheckModifiersOnRelease. currentButtonIndexUnderAction ="+currentButtonIndexUnderAction); + for (int i = currentButtonIndexUnderAction+1; i=0) { + if (buttonIndicesToPermutate[i] < buttonIndicesToPermutate[i+1]){ + leftEl = i; + // System.out.println("leftEl = "+leftEl); + break; + } + i--; + } + + i = array.length - 1; + while (i>=0) { + if (buttonIndicesToPermutate[i] >buttonIndicesToPermutate[leftEl]) { + rightEl = i; + // System.out.println("rightEl = "+rightEl); + break; + } + i--; + } + swapElements(array, leftEl, rightEl); + swapElements(buttonIndicesToPermutate, leftEl, rightEl); + + if (leftEl + 2 < array.length){ + // System.out.println("sort"); +//need to make our own sorting because arraysort makes this on actual values in array... + Arrays.sort(array, leftEl + 1 , array.length); + Arrays.sort(buttonIndicesToPermutate, leftEl + 1 , buttonIndicesToPermutate.length); +// sortArray(array, leftEl + 1 , array.length); + } + } + public static void swapElements(int [] array, int leftEl, int rightEl){ + int tmp = array[leftEl]; + array[leftEl] = array[rightEl]; + array[rightEl] = tmp; + } +} +*/ diff --git a/jdk/test/java/awt/Mouse/MouseModifiersUnitTest/MouseModifiersUnitTest_Extra.java b/jdk/test/java/awt/Mouse/MouseModifiersUnitTest/MouseModifiersUnitTest_Extra.java new file mode 100644 index 00000000000..f70b8dd691b --- /dev/null +++ b/jdk/test/java/awt/Mouse/MouseModifiersUnitTest/MouseModifiersUnitTest_Extra.java @@ -0,0 +1,490 @@ +/* + @test %I% %E% + @bug 6315717 + @summary verifies that modifiers are correct for extra buttons + @author Andrei Dmitriev : area=awt.mouse + @run main MouseModifiersUnitTest_Extra + */ + +import java.awt.*; +import java.awt.event.*; +import java.util.Arrays; +import java.util.HashMap; +import java.util.StringTokenizer; +import java.util.Vector; + +// will process extra buttons only +// asking parameters from CMD: manual/automatic, modifier to test + +public class MouseModifiersUnitTest_Extra extends Frame { + static final int NONE = 0; + static final int SHIFT = 1; + static final int CTRL = 2; + static final int ALT = 3; + static CheckingModifierAdapter adapterTest1; + static CheckingModifierAdapter adapterTest2; + static CheckingModifierAdapter adapterTest3; + static CheckingModifierAdapter adapterTest4; + + static boolean debug = true; //dump all errors (debug) or throw first(under jtreg) exception + static boolean autorun = false; //use robot or manual run + static int testModifier = NONE; + + static int [] mouseButtons; + static int [] mouseButtonDownMasks; + + //an arrays representing a modifiersEx of extra mouse buttons while using ALT/CTRL/SHIFT or none of them + static int [] modifiersExStandard; + static int [] modifiersExStandardSHIFT; + static int [] modifiersExStandardCTRL; + static int [] modifiersExStandardALT; + + // final static int [] mouseButtons = new int [] {MouseEvent.BUTTON1_MASK, MouseEvent.BUTTON2_MASK, MouseEvent.BUTTON3_MASK}; + // BUTTON1, 2, 3 press-release. + final static int modifiersStandard = 0; //InputEvent.BUTTON_DOWN_MASK; + + public static void checkPressedModifiersTest(int testModifier, MouseEvent event){ + int [] curStandardExModifiers = getStandardExArray(testModifier); + int button = event.getButton(); + int modifiers = event.getModifiers(); + int modifiersEx = event.getModifiersEx(); + int index = (button - 4)*3; + dumpValues(button, modifiers, modifiersStandard, modifiersEx, curStandardExModifiers[index]); + if (modifiers != modifiersStandard){ + MessageLogger.reportError("Test failed : Pressed. modifiers != modifiersStandard"); + } + + if (modifiersEx != curStandardExModifiers[index]){ +// System.out.println(">>>>>>>>>>>>>>> Pressed. modifiersEx "+modifiersEx +" : "+!= curStandardExModifiers"); + MessageLogger.reportError("Test failed : Pressed. modifiersEx != curStandardExModifiers"); + } + + //check event.paramString() output + HashMap paramStringElements = tokenizeParamString(event.paramString()); + System.out.println(event.paramString()); + checkButton(paramStringElements, button); + checkModifiers(testModifier, paramStringElements, button); + checkExtModifiersOnPress(testModifier, paramStringElements, button); + } + + public static void checkExtModifiersOnReleaseClick(int testModifier, HashMap h, int button){ + String ethalon = ""; + switch (testModifier){ + case SHIFT:{ + ethalon = "Shift"; + break; + } + case ALT:{ + ethalon = "Alt"; + break; + } + case CTRL:{ + ethalon = "Ctrl"; + break; + } + } + // + if (h.get("extModifiers") == null){ + h.put("extModifiers", ""); + } + if (!ethalon.equals(h.get("extModifiers"))) { + MessageLogger.reportError("Test failed : Released/Clicked. extModifiers = " +h.get("extModifiers")+" instead of : "+ethalon); + } + } + + public static void checkExtModifiersOnPress(int testModifier, HashMap h, int button){ + String ethalon = ""; + switch (testModifier){ + case SHIFT:{ + ethalon = "Shift+"; + break; + } + case ALT:{ + ethalon = "Alt+"; + break; + } + case CTRL:{ + ethalon = "Ctrl+"; + break; + } + } + ethalon = ethalon + "Button" +button; + + if (!h.get("extModifiers").equals(ethalon)) { + MessageLogger.reportError("Test failed : Pressed. extModifiers = " +h.get("extModifiers")+" instead of : "+ethalon); + } + } + + public static void checkModifiers(int testModifier, HashMap h, int button){ + // none of modifiers for extra button should be null + if (h.get("modifiers") != null) { + MessageLogger.reportError("Test failed : modifiers != null"); + } + } + + public static void checkButton(HashMap h, int button){ + if (h.get("button") == null) { + MessageLogger.reportError("Test failed : checkButton(). button is absent in paramString()"); + } + if (Integer.parseInt(h.get("button")) != button) { + MessageLogger.reportError("Test failed : checkButton. button in paramString() doesn't equal to button being pressed."); + } + } + public static HashMap tokenizeParamString(String param){ + HashMap params = new HashMap(); + StringTokenizer st = new StringTokenizer(param, ",="); + while (st.hasMoreTokens()){ + String tmp = st.nextToken(); +// System.out.println("PARSER : "+tmp); + if (tmp.equals("button") || + tmp.equals("modifiers") || + tmp.equals("extModifiers")) { + params.put(tmp, st.nextToken()); + } + } + return params; + } + + public static Vector tokenizeModifiers(String modifierList){ + Vector modifiers = new Vector(); + StringTokenizer st = new StringTokenizer(modifierList, "+"); + while (st.hasMoreTokens()){ + String tmp = st.nextToken(); + modifiers.addElement(tmp); + System.out.println("MODIFIER PARSER : "+tmp); + } + return modifiers; + } + + public static void checkReleasedModifiersTest(int testModifier, MouseEvent event){ + int [] curStandardExModifiers = getStandardExArray(testModifier); + int button = event.getButton(); + int modifiers = event.getModifiers(); + int modifiersEx = event.getModifiersEx(); + int index = (button - 4)*3 + 1; + dumpValues(button, modifiers, modifiersStandard, modifiersEx, curStandardExModifiers[index]); + if (modifiers != modifiersStandard){ + MessageLogger.reportError("Test failed : Released. modifiers != modifiersStandard"); + } + + if (modifiersEx != curStandardExModifiers[index]){ + MessageLogger.reportError("Test failed : Released. modifiersEx != curStandardExModifiers"); + } + + //check event.paramString() output + HashMap paramStringElements = tokenizeParamString(event.paramString()); + checkButton(paramStringElements, button); + checkModifiers(testModifier, paramStringElements, button); + System.out.println("paramStringElements = "+paramStringElements); + checkExtModifiersOnReleaseClick(testModifier, paramStringElements, button); + } + + public static void checkClickedModifiersTest(int testModifier, MouseEvent event){ + int [] curStandardExModifiers = getStandardExArray(testModifier); + int button = event.getButton(); + int modifiers = event.getModifiers(); + int modifiersEx = event.getModifiersEx(); + int index = (button - 4)*3 + 2; + dumpValues(button, modifiers, modifiersStandard, modifiersEx, curStandardExModifiers[index]); + if (modifiers != modifiersStandard){ + MessageLogger.reportError("Test failed : Clicked. modifiers != modifiersStandard"); + } + + if (modifiersEx != curStandardExModifiers[index]){ + MessageLogger.reportError("Test failed : Clicked. modifiersEx != curStandardExModifiers"); + } + + //check event.paramString() output + HashMap paramStringElements = tokenizeParamString(event.paramString()); + checkButton(paramStringElements, button); + checkModifiers(testModifier, paramStringElements, button); + checkExtModifiersOnReleaseClick(testModifier, paramStringElements, button); + } + + private static int[] getStandardExArray(int testModifier) { + int [] curStandardExModifiers; + switch (testModifier){ + case SHIFT: + curStandardExModifiers = modifiersExStandardSHIFT; + break; + case CTRL: + curStandardExModifiers = modifiersExStandardCTRL; + break; + case ALT: + curStandardExModifiers = modifiersExStandardALT; + break; + default: //NONE by default + curStandardExModifiers = modifiersExStandard; + } + return curStandardExModifiers; + } + + static Robot robot; + public void init() { + this.setLayout(new BorderLayout()); + + String[] instructions = + { + "This test should be used with the mouse having more then three buttons.", + "Currently, " + MouseInfo.getNumberOfButtons() +" buttons are available.", + "If there are less then three buttons, press PASS.", + "1. Press each extra mouse button.", + "2. For each mouse event its modifiers and ExModifiers will be printed.", + "3. Verify that they are correct.", + "4. Press Pass or Fail accordingly." + }; +// Sysout.createDialogWithInstructions( instructions ); + +// addMouseListener(adapterTest1); + try { + robot = new Robot(); + } catch (Exception e) { + MessageLogger.reportError("Test failed. "+e); + } + }//End init() + + public void start() { + //Get things going. Request focus, set size, et cetera + setSize(200,200); + setVisible(true); + validate(); + if (autorun) { + testNONE(); + testSHIFT(); + testCTRL(); + testALT(); + } else { + switch (testModifier){ + case SHIFT: + this.addMouseListener(adapterTest2); + break; + case CTRL: + this.addMouseListener(adapterTest3); + break; + case ALT: + this.addMouseListener(adapterTest4); + break; + default: //NONE by default + this.addMouseListener(adapterTest1); + } + } + }// start() + + //000000000000000000000000000000000000000000000000000000000000000 + public void testNONE(){ + this.addMouseListener(adapterTest1); + robot.delay(1000); + robot.mouseMove(getLocationOnScreen().x + getWidth()/2, getLocationOnScreen().y + getHeight()/2); + for (int i = 3; i< mouseButtons.length; i++){ + System.out.println("testNONE() => " +mouseButtons[i] ); + robot.mousePress(mouseButtons[i]); + robot.delay(100); + robot.mouseRelease(mouseButtons[i]); + } + robot.delay(1000); + this.removeMouseListener(adapterTest1); + } + + public void testSHIFT(){ + this.addMouseListener(adapterTest2); + robot.delay(1000); + robot.mouseMove(getLocationOnScreen().x + getWidth()/2, getLocationOnScreen().y + getHeight()/2); + for (int i = 3; i< mouseButtons.length; i++){ + robot.keyPress(KeyEvent.VK_SHIFT); + System.out.println("testSHIFT() => " +mouseButtons[i] ); + robot.mousePress(mouseButtons[i]); + robot.delay(100); + robot.mouseRelease(mouseButtons[i]); + robot.keyRelease(KeyEvent.VK_SHIFT); + } + robot.delay(1000); + this.removeMouseListener(adapterTest2); + } + + public void testCTRL(){ + this.addMouseListener(adapterTest3); + robot.delay(1000); + robot.mouseMove(getLocationOnScreen().x + getWidth()/2, getLocationOnScreen().y + getHeight()/2); + for (int i = 3; i< mouseButtons.length; i++){ + robot.keyPress(KeyEvent.VK_CONTROL); + System.out.println("testCTRL() => " +mouseButtons[i] ); + robot.mousePress(mouseButtons[i]); + robot.delay(100); + robot.mouseRelease(mouseButtons[i]); + robot.keyRelease(KeyEvent.VK_CONTROL); + } + robot.delay(1000); + this.removeMouseListener(adapterTest3); + } + + public void testALT(){ + this.addMouseListener(adapterTest4); + robot.delay(1000); + robot.mouseMove(getLocationOnScreen().x + getWidth()/2, getLocationOnScreen().y + getHeight()/2); + for (int i = 3; i< mouseButtons.length; i++){ + robot.keyPress(KeyEvent.VK_ALT); + System.out.println("testALT() => " +mouseButtons[i] ); + robot.mousePress(mouseButtons[i]); + robot.delay(100); + robot.mouseRelease(mouseButtons[i]); + robot.keyRelease(KeyEvent.VK_ALT); + } + robot.delay(1000); + this.removeMouseListener(adapterTest4); + } + + //************************************************************************************************** + public static void dumpValues(int button, int modifiers, int modifiersStandard, int modifiersEx, int modifiersExStandard){ + System.out.println("Button = "+button + "Modifiers = "+ modifiers + "standard = "+ modifiersStandard); + System.out.println("Button = "+button + "ModifiersEx = "+ modifiersEx + "standardEx = "+ modifiersExStandard); + } + + public static void initParams(String []s){ + if (s.length != 3){ + autorun = true; + debug = false; + testModifier = NONE; + } else { + autorun = Boolean.valueOf(s[0]); + debug = Boolean.valueOf(s[1]); + + if (s[2].equals("NONE")){ + testModifier = NONE; + } + if (s[2].equals("SHIFT")){ + testModifier = SHIFT; + } + if (s[2].equals("CTRL")){ + testModifier = CTRL; + } + if (s[2].equals("ALT")){ + testModifier = ALT; + } + } + MessageLogger.setDebug(debug); + System.out.println("Autorun : " +autorun); + System.out.println("Debug mode : " +debug); + System.out.println("Modifier to verify : " + testModifier); + } + + public static void initAdapters(){ + adapterTest1 = new CheckingModifierAdapter(NONE); + adapterTest2 = new CheckingModifierAdapter(SHIFT); + adapterTest3 = new CheckingModifierAdapter(CTRL); + adapterTest4 = new CheckingModifierAdapter(ALT); + } + + public static void initVars(){ + int [] tmp = new int [MouseInfo.getNumberOfButtons()]; + for (int i = 0; i < MouseInfo.getNumberOfButtons(); i++){ + tmp[i] = InputEvent.getMaskForButton(i+1); + // System.out.println("TEST: "+tmp[i]); + } + + mouseButtons = Arrays.copyOf(tmp, tmp.length); + + for (int i = 0; i < mouseButtons.length; i++){ + System.out.println("MouseArray [i] == "+mouseButtons[i]); + } + + mouseButtonDownMasks = Arrays.copyOf(tmp, tmp.length); + + // So we need to get the number of extra buttons on the mouse: "MouseInfo.getNumberOfButtons() - 3" + // and multyply on 3 because each button will generate three events : PRESS, RELEASE and CLICK. + tmp = new int [(MouseInfo.getNumberOfButtons()-3)*3]; + Arrays.fill(tmp, 0); + + for (int i = 0, j = 3; i < tmp.length; i = i + 3, j++){ + tmp[i] = mouseButtonDownMasks[j]; + } + modifiersExStandard = Arrays.copyOf(tmp, tmp.length); + + Arrays.fill(tmp, InputEvent.SHIFT_DOWN_MASK); + for (int i = 0, j = 3; i < MouseInfo.getNumberOfButtons(); i = i + 3, j++){ + tmp[i] = tmp[j] | mouseButtonDownMasks[j]; + } + modifiersExStandardSHIFT = Arrays.copyOf(tmp, tmp.length); + + Arrays.fill(tmp, InputEvent.CTRL_DOWN_MASK); + for (int i = 0, j = 3; i < MouseInfo.getNumberOfButtons(); i = i + 3, j++){ + tmp[i] = tmp[j] | mouseButtonDownMasks[j]; + } + modifiersExStandardCTRL = Arrays.copyOf(tmp, tmp.length); + + Arrays.fill(tmp, InputEvent.ALT_DOWN_MASK); + for (int i = 0, j = 3; i < MouseInfo.getNumberOfButtons(); i = i + 3, j++){ + tmp[i] = tmp[j] | mouseButtonDownMasks[j]; + } + modifiersExStandardALT = Arrays.copyOf(tmp, tmp.length); + } + + public static void main(String []s){ + if (MouseInfo.getNumberOfButtons() < 4){ + System.out.println("There are less then 4 buttons on the mouse. The test may not be accomplished. Skipping."); + return; + } + initVars(); + MouseModifiersUnitTest_Extra frame = new MouseModifiersUnitTest_Extra(); + frame.initParams(s); + frame.init(); + initAdapters(); + frame.start(); + } + +}// class + +/* A class that invoke appropriate verification + * routine with current modifier. + */ +class CheckingModifierAdapter extends MouseAdapter{ + int modifier; + public CheckingModifierAdapter(int modifier){ + this.modifier = modifier; + } + + public void mousePressed(MouseEvent e) { + System.out.println("PRESSED "+e); + if (e.getButton() <= MouseEvent.BUTTON3) { + System.out.println("Standard button affected. Skip."); + } else { + MouseModifiersUnitTest_Extra.checkPressedModifiersTest(modifier, e); + } + } + public void mouseReleased(MouseEvent e) { + System.out.println("RELEASED "+e); + if (e.getButton() <= MouseEvent.BUTTON3) { + System.out.println("Standard button affected. Skip."); + } else { + MouseModifiersUnitTest_Extra.checkReleasedModifiersTest(modifier, e); + } + } + public void mouseClicked(MouseEvent e) { + System.out.println("CLICKED "+e); + if (e.getButton() <= MouseEvent.BUTTON3) { + System.out.println("Standard button affected. Skip."); + } else { + MouseModifiersUnitTest_Extra.checkClickedModifiersTest(modifier, e); + } + } +} +//Utility class that could report a message depending on current purpose of the test run +class MessageLogger{ + private static boolean debug; + + public static void setDebug(boolean d){ + debug = d; + log("Switch to "+ ((debug)?"debug":"trial") +" mode"); + } + + public static void log(String message){ + System.out.println(message); + } + + public static void reportError(String message){ + if (debug){ + System.out.println(message); + } else { + throw new RuntimeException(message); + } + } +} diff --git a/jdk/test/java/awt/Mouse/MouseModifiersUnitTest/MouseModifiersUnitTest_Standard.java b/jdk/test/java/awt/Mouse/MouseModifiersUnitTest/MouseModifiersUnitTest_Standard.java new file mode 100644 index 00000000000..cd2dab03039 --- /dev/null +++ b/jdk/test/java/awt/Mouse/MouseModifiersUnitTest/MouseModifiersUnitTest_Standard.java @@ -0,0 +1,598 @@ +/* + @test %I% %E% + @bug 6315717 + @summary verifies that modifiers are correct for standard (1, 2, 3, wheel) mouse buttons + @author Andrei Dmitriev : area=awt.mouse + @run main MouseModifiersUnitTest_Standard + */ + +import java.awt.*; +import java.awt.event.*; +import java.util.HashMap; +import java.util.StringTokenizer; +import java.util.Vector; + +//the test verifies: +// 1) verifies that modifiers are correct for standard (1, 2, 3) mouse buttons +// TODO: 2) verifies that modifiers are correct for wheel +// TODO: 3) +// Case1. the test posts BUTTONx_MASK and verifies that paramString() contains correct modifiers and exModifiers +// Case2. the test posts BUTTONx_DOWN_MASK and verifies that paramString() contains correct modifiers and exModifiers +// Case3. the test posts getMaskForButton(n) and verifies that paramString() contains correct modifiers and exModifiers +// repeat all cases with SHIFT/ALT/CTRL modifiers verify that paramString() contains correct modifiers and exModifiers +// I'm verifying button, modifiers and extModifiers for now. + +public class MouseModifiersUnitTest_Standard { + static final int NONE = 0; + static final int SHIFT = 1; + static final int CTRL = 2; + static final int ALT = 3; + static boolean debug = true; //dump all errors (debug) or throw first(under jtreg) exception + static boolean autorun = false; //use robot or manual run + static int testModifier = NONE; + // static String testModifier = "NONE"; + static CheckingModifierAdapter adapterTest1; + static CheckingModifierAdapter adapterTest2; + static CheckingModifierAdapter adapterTest3; + static CheckingModifierAdapter adapterTest4; + static Frame f; + final static int [] mouseButtons = new int [] {MouseEvent.BUTTON1_MASK, MouseEvent.BUTTON2_MASK, MouseEvent.BUTTON3_MASK}; + // BUTTON1, 2, 3 press-release. + final static int [] modifiersStandardTestNONE = new int[] {MouseEvent.BUTTON1_MASK, MouseEvent.BUTTON1_MASK, MouseEvent.BUTTON1_MASK, + MouseEvent.BUTTON2_MASK, MouseEvent.BUTTON2_MASK, MouseEvent.BUTTON2_MASK, + MouseEvent.BUTTON3_MASK, MouseEvent.BUTTON3_MASK, MouseEvent.BUTTON3_MASK }; + final static int [] modifiersExStandardTestNONE = new int[] {MouseEvent.BUTTON1_DOWN_MASK, 0, 0, + MouseEvent.BUTTON2_DOWN_MASK, 0, 0, + MouseEvent.BUTTON3_DOWN_MASK, 0, 0}; + // BUTTON1, 2, 3 press-release with shift modifier + final static int [] modifiersStandardTestSHIFT = new int[] {MouseEvent.BUTTON1_MASK|InputEvent.SHIFT_MASK, MouseEvent.BUTTON1_MASK|InputEvent.SHIFT_MASK, MouseEvent.BUTTON1_MASK|InputEvent.SHIFT_MASK, + MouseEvent.BUTTON2_MASK|InputEvent.SHIFT_MASK, MouseEvent.BUTTON2_MASK|InputEvent.SHIFT_MASK, MouseEvent.BUTTON2_MASK|InputEvent.SHIFT_MASK, + MouseEvent.BUTTON3_MASK|InputEvent.SHIFT_MASK, MouseEvent.BUTTON3_MASK|InputEvent.SHIFT_MASK, MouseEvent.BUTTON3_MASK|InputEvent.SHIFT_MASK }; + final static int [] modifiersExStandardTestSHIFT = new int[] {MouseEvent.BUTTON1_DOWN_MASK|InputEvent.SHIFT_DOWN_MASK, InputEvent.SHIFT_DOWN_MASK, InputEvent.SHIFT_DOWN_MASK, + MouseEvent.BUTTON2_DOWN_MASK|InputEvent.SHIFT_DOWN_MASK, InputEvent.SHIFT_DOWN_MASK, InputEvent.SHIFT_DOWN_MASK, + MouseEvent.BUTTON3_DOWN_MASK|InputEvent.SHIFT_DOWN_MASK, InputEvent.SHIFT_DOWN_MASK, InputEvent.SHIFT_DOWN_MASK}; + // BUTTON1, 2, 3 press-release with CTRL modifier + final static int [] modifiersStandardTestCTRL = new int[] {MouseEvent.BUTTON1_MASK|InputEvent.CTRL_MASK, MouseEvent.BUTTON1_MASK|InputEvent.CTRL_MASK, MouseEvent.BUTTON1_MASK|InputEvent.CTRL_MASK, + MouseEvent.BUTTON2_MASK|InputEvent.CTRL_MASK, MouseEvent.BUTTON2_MASK|InputEvent.CTRL_MASK, MouseEvent.BUTTON2_MASK|InputEvent.CTRL_MASK, + MouseEvent.BUTTON3_MASK|InputEvent.CTRL_MASK, MouseEvent.BUTTON3_MASK|InputEvent.CTRL_MASK, MouseEvent.BUTTON3_MASK|InputEvent.CTRL_MASK }; + final static int [] modifiersExStandardTestCTRL = new int[] {MouseEvent.BUTTON1_DOWN_MASK|InputEvent.CTRL_DOWN_MASK, InputEvent.CTRL_DOWN_MASK, InputEvent.CTRL_DOWN_MASK, + MouseEvent.BUTTON2_DOWN_MASK|InputEvent.CTRL_DOWN_MASK, InputEvent.CTRL_DOWN_MASK, InputEvent.CTRL_DOWN_MASK, + MouseEvent.BUTTON3_DOWN_MASK|InputEvent.CTRL_DOWN_MASK, InputEvent.CTRL_DOWN_MASK, InputEvent.CTRL_DOWN_MASK}; + + // BUTTON1, 2, 3 press-release with ALT modifier + final static int [] modifiersStandardTestALT = new int[] {MouseEvent.BUTTON1_MASK|InputEvent.ALT_MASK, MouseEvent.BUTTON1_MASK|InputEvent.ALT_MASK, MouseEvent.BUTTON1_MASK|InputEvent.ALT_MASK, + MouseEvent.BUTTON2_MASK|InputEvent.ALT_MASK, MouseEvent.BUTTON2_MASK|InputEvent.ALT_MASK, MouseEvent.BUTTON2_MASK|InputEvent.ALT_MASK, + MouseEvent.BUTTON3_MASK|InputEvent.ALT_MASK, MouseEvent.BUTTON3_MASK|InputEvent.ALT_MASK, MouseEvent.BUTTON3_MASK|InputEvent.ALT_MASK }; + final static int [] modifiersExStandardTestALT = new int[] {MouseEvent.BUTTON1_DOWN_MASK|InputEvent.ALT_DOWN_MASK, InputEvent.ALT_DOWN_MASK, InputEvent.ALT_DOWN_MASK, + MouseEvent.BUTTON2_DOWN_MASK|InputEvent.ALT_DOWN_MASK, InputEvent.ALT_DOWN_MASK, InputEvent.ALT_DOWN_MASK, + MouseEvent.BUTTON3_DOWN_MASK|InputEvent.ALT_DOWN_MASK, InputEvent.ALT_DOWN_MASK, InputEvent.ALT_DOWN_MASK}; + + static Robot robot; + + public static void main(String s[]){ + initParams(s); + initAdapters(); + f = new Frame(); + final int [] modifiers = {InputEvent.SHIFT_MASK, InputEvent.CTRL_MASK}; + final String [] modifierNames = {"InputEvent.SHIFT_MASK", "InputEvent.CTRL_MASK"}; + f.setLayout(new FlowLayout()); + f.addMouseWheelListener(new MouseWheelListener() { + public void mouseWheelMoved(MouseWheelEvent e) { + System.out.println("WHEEL "+e); + } + }); + f.setSize(300, 300); + f.setVisible(true); + + try { + robot = new Robot(); + robot.delay(500); + robot.mouseMove(f.getLocationOnScreen().x + f.getWidth()/2, f.getLocationOnScreen().y + f.getHeight()/2); + if (autorun) { + //testing buttons 1, 2, 3 only + testPlainButtons(); + robot.delay(500); + + //testing buttons 1, 2, 3 with SHIFT, CTRL, ALT keyboard modifiers + testButtonsWithShift(); + robot.delay(500); + + testButtonsWithControl(); + robot.delay(500); + + testButtonsWithAlt(); + robot.delay(500); + } else { + switch (testModifier){ + case SHIFT: + f.addMouseListener(adapterTest2); + break; + case CTRL: + f.addMouseListener(adapterTest3); + break; + case ALT: + f.addMouseListener(adapterTest4); + break; + default: //NONE inclusive + f.addMouseListener(adapterTest1); + } + } + } catch (Exception e){ + throw new RuntimeException("Test failed."); + } + + } + + public static void initAdapters(){ + adapterTest1 = new CheckingModifierAdapter(NONE); + adapterTest2 = new CheckingModifierAdapter(SHIFT); + adapterTest3 = new CheckingModifierAdapter(CTRL); + adapterTest4 = new CheckingModifierAdapter(ALT); + } + + /*======================================================================*/ + public static void checkPressedModifiersTest(int testModifier, MouseEvent event){ + int [] curStandardModifiers = getStandardArray(testModifier); + int [] curStandardExModifiers = getStandardExArray(testModifier); + int button = event.getButton(); + int modifiers = event.getModifiers(); + int modifiersEx = event.getModifiersEx(); + int index = (button - 1)*3; + // int index = (button - 4)*3; + dumpValues(button, modifiers, curStandardModifiers[index], modifiersEx, curStandardExModifiers[index]); + if (modifiers != curStandardModifiers[index]){ + if (debug){ + System.out.println("Test failed : Pressed. modifiers != modifiersStandard"); + } else { + throw new RuntimeException("Test failed : Pressed. modifiers != modifiersStandard"); + } + } + + if (modifiersEx != curStandardExModifiers[index]){ +// System.out.println(">>>>>>>>>>>>>>> Pressed. modifiersEx "+modifiersEx +" : "+!= curStandardExModifiers"); + if (debug){ + System.out.println("Test failed : Pressed. modifiersEx != curStandardExModifiers"); + } else { + throw new RuntimeException("Test failed : Pressed. modifiersEx != curStandardExModifiers"); + } + } + HashMap paramStringElements = tokenizeParamString(event.paramString()); + System.out.println(event.paramString()); + checkButton(paramStringElements, button); + checkModifiers(testModifier, paramStringElements, button); + checkExtModifiersOnPress(testModifier, paramStringElements, button); + } + + public static void checkButton(HashMap h, int button){ + if (h.get("button") == null) { + throw new RuntimeException("Test failed : Clicked. button is absent in paramString()"); + } + if (Integer.parseInt(h.get("button")) != button) { + throw new RuntimeException("Test failed : Clicked. button in paramString() doesn't equal to button being pressed."); + } + } + + public static void checkExtModifiersOnPress(int testModifier, HashMap h, int button){ + String ethalon = ""; + if (h.get("extModifiers") == null) { + System.out.println("Test failed : Pressed. extModifiers == null"); + throw new RuntimeException("Test failed : Pressed. extModifiers == null"); + } + switch (testModifier){ + case SHIFT:{ + ethalon = "Shift+"; + break; + } + case ALT:{ + ethalon = "Alt+"; + break; + } + case CTRL:{ + ethalon = "Ctrl+"; + break; + } + default: { + ethalon = ""; + } + ethalon = ethalon + "Button" +button; + + if (!h.get("extModifiers").equals(ethalon)) { + System.out.println("Test failed : Pressed. extModifiers = " +h.get("extModifiers")+" instead of : "+ethalon); + throw new RuntimeException("Test failed : Pressed. extModifiers = " +h.get("extModifiers")+" instead of : "+ethalon); + } + } + } + + + + public static void checkModifiers(int testModifier, HashMap h, int button){ + // none of modifiers should be null + if (h.get("modifiers") == null) { + System.out.println("Test failed : modifiers == null"); + throw new RuntimeException("Test failed : modifiers == null"); + } + Vector modifierElements = tokenizeModifiers(h.get("modifiers")); + //check that ButtonX is there + String buttonEthalon = "Button" + button; + if (modifierElements.contains(buttonEthalon)){ + modifierElements.remove(buttonEthalon); + } else { + System.out.println("Test failed : modifiers doesn't contain Button "+h.get("modifiers")); + throw new RuntimeException("Test failed : modifiers doesn't contain Button "+h.get("modifiers")); + } + + + //Check all explicitly pressed modifires +// boolean altIncluded = false; //don't duplicate Alt when ALT is pressed and BUTTON2_MASK. + String excplicitModifier = ""; + boolean altIncluded = false; + switch (testModifier){ + case SHIFT:{ + excplicitModifier = "Shift"; + break; + } + case ALT:{ + excplicitModifier = "Alt"; + altIncluded = true; //there should be only on "Alt" for two modifiers. So check it. + break; + } + case CTRL:{ + excplicitModifier = "Ctrl"; + break; + } + } + if (!excplicitModifier.equals("")){ + if (modifierElements.contains(excplicitModifier)){ + modifierElements.remove(excplicitModifier); + } else { + System.out.println("Test failed : modifiers doesn't contain explicit modifier "+excplicitModifier + " in "+ h.get("modifiers")); + throw new RuntimeException("Test failed : modifiers doesn't contain explicit modifier "+excplicitModifier + " in "+ h.get("modifiers")); + } + } + + //Button 2 and 3 reports about Alt+Button2 and Meta+Button3 respectively. + //Check these values too + String extraModifiers = ""; + String extraModifiersButton3 = ""; + switch (button){ + //BUTTON1 with ALT reports about Alt+Button1+Button2. + //We should fix this but I would not change this. + case 1: { + //Alt+Button1+Button2: + // 1) we already handled "Alt" in excplicitModifier + // 2) we already took "Button1" in buttonEthalon + // 3) so "Button2" is only remained. + // This should only happen when ALT+Button1 is pressed + if (altIncluded){ + extraModifiers = "Button2"; + } + break; + } + case 2: { + //Alt+Button2 report about "Alt+Button2". + extraModifiers = "Alt"; + break; + } + case 3: { + //ALT+BUTTON3 reports about "Alt+Meta+Button2+Button3" + // This should only happen when ALT+Button3 is pressed + extraModifiers = "Meta"; + if (altIncluded){ + extraModifiersButton3 = "Button2"; + } + break; + } + }//switch + + if (!extraModifiers.equals("")){ + if (modifierElements.contains(extraModifiers)){ + modifierElements.remove(extraModifiers); + } else { + //we may already removed "Alt" when filtered explicit modifiers. + //Here is no failure in this case. + if (!altIncluded) { + System.out.println("Test failed : modifiers doesn't contain a modifier from BUTTON2 or BUTTON3 "+extraModifiers + " in "+ h.get("modifiers")); + throw new RuntimeException("Test failed : modifiers doesn't contain a modifier from BUTTON2 or BUTTON3 "+extraModifiers + " in "+ h.get("modifiers")); + } + } + } + + if (!extraModifiersButton3.equals("")){ + if (modifierElements.contains(extraModifiersButton3)){ + modifierElements.remove(extraModifiersButton3); + } else { + System.out.println("Test failed : modifiers doesn't contain a modifier from BUTTON2 or BUTTON3 "+extraModifiersButton3 + " in "+ h.get("modifiers")); + throw new RuntimeException("Test failed : modifiers doesn't contain a modifier from BUTTON2 or BUTTON3 "+extraModifiersButton3 + " in "+ h.get("modifiers")); + } + } + + //the length of vector should now be zero + if (!modifierElements.isEmpty()){ + System.out.println("Test failed : there is some more elements in modifiers that shouldn't be there: "+h.get("modifiers")); + throw new RuntimeException("Test failed : there is some more elements in modifiers that shouldn't be there: "+h.get("modifiers")); + } + } + + public static void checkExtModifiersOnReleaseClick(int testModifier, HashMap h, int button){ + String ethalon = ""; + switch (testModifier){ + case SHIFT:{ + ethalon = "Shift+"; + break; + } + case ALT:{ + ethalon = "Alt+"; + break; + } + case CTRL:{ + ethalon = "Ctrl+"; + break; + } + default: { + if (h.get("extModifiers") != null) { + System.out.println("Test failed : Released. extModifiers != null but no modifiers keys are pressed"); + throw new RuntimeException("Test failed : Released. extModifiers != null but no modifiers keys are pressed"); + } else { + //no modifiers + return; + } + } + } + if (h.get("extModifiers").equals(ethalon)) { + System.out.println("Test failed : Released. extModifiers = "+ h.get("extModifiers") +" instead of : "+ethalon); + throw new RuntimeException("Test failed : Released. extModifiers = "+ h.get("extModifiers") +" instead of : "+ethalon); + } + } + + public static void checkReleasedModifiersTest(int testModifier, MouseEvent event){ + int [] curStandardModifiers = getStandardArray(testModifier); + int [] curStandardExModifiers = getStandardExArray(testModifier); + // int index = (button - 4)*3 + 1; + int button = event.getButton(); + int modifiers = event.getModifiers(); + int modifiersEx = event.getModifiersEx(); + int index = (button - 1)*3 + 1; + dumpValues(button, modifiers, curStandardModifiers[index], modifiersEx, curStandardExModifiers[index]); + if (modifiers != curStandardModifiers[index]){ + if (debug){ + System.out.println("Test failed : Released. modifiers != modifiersStandard"); + } else { + throw new RuntimeException("Test failed : Released. modifiers != modifiersStandard"); + } + } + if (modifiersEx != curStandardExModifiers[index]){ + if (debug){ + System.out.println("Test failed : Released. modifiersEx != curStandardExModifiers"); + } else { + throw new RuntimeException("Test failed : Released. modifiersEx != curStandardExModifiers"); + } + } + HashMap paramStringElements = tokenizeParamString(event.paramString()); + System.out.println(event.paramString()); + checkButton(paramStringElements, button); + checkModifiers(testModifier, paramStringElements, button); + checkExtModifiersOnReleaseClick(testModifier, paramStringElements, button); + } + + public static void checkClickedModifiersTest(int testModifier, MouseEvent event){ + int [] curStandardModifiers = getStandardArray(testModifier); + int [] curStandardExModifiers = getStandardExArray(testModifier); + // int index = (button - 4)*3 + 2; + int button = event.getButton(); + int modifiers = event.getModifiers(); + int modifiersEx = event.getModifiersEx(); + int index = (button - 1)*3 + 2; + dumpValues(button, modifiers, curStandardModifiers[index], modifiersEx, curStandardExModifiers[index]); + if (modifiers != curStandardModifiers[index]){ + if (debug){ + System.out.println("Test failed : Clicked. modifiers != modifiersStandard"); + } else { + throw new RuntimeException("Test failed : Clicked. modifiers != modifiersStandard"); + } + } + if (modifiersEx != curStandardExModifiers[index]){ + if (debug){ + System.out.println("Test failed : Clicked. modifiersEx != curStandardExModifiers"); + } else { + throw new RuntimeException("Test failed : Clicked. modifiersEx != curStandardExModifiers"); + } + } + HashMap paramStringElements = tokenizeParamString(event.paramString()); + checkButton(paramStringElements, button); + checkModifiers(testModifier, paramStringElements, button); + checkExtModifiersOnReleaseClick(testModifier, paramStringElements, button); + } + /*======================================================================*/ + + public static HashMap tokenizeParamString(String param){ + HashMap params = new HashMap(); + StringTokenizer st = new StringTokenizer(param, ",="); + while (st.hasMoreTokens()){ + String tmp = st.nextToken(); +// System.out.println("PARSER : "+tmp); + if (tmp.equals("button") || + tmp.equals("modifiers") || + tmp.equals("extModifiers")) { + params.put(tmp, st.nextToken()); + } + } + return params; + } + + public static Vector tokenizeModifiers(String modifierList){ + Vector modifiers = new Vector(); + StringTokenizer st = new StringTokenizer(modifierList, "+"); + while (st.hasMoreTokens()){ + String tmp = st.nextToken(); + modifiers.addElement(tmp); + System.out.println("MODIFIER PARSER : "+tmp); + } + return modifiers; + } + + + //test BUTTON1, 2 and 3 without any modifiers keys + public static void testPlainButtons(){ + System.out.println("Testing buttons without modifiers."); + f.addMouseListener(adapterTest1); + for (int button : mouseButtons){ + robot.mousePress(button); + robot.delay(100); + robot.mouseRelease(button); + } + robot.delay(1000); + f.removeMouseListener(adapterTest1); + } + + //test BUTTON1, 2 and 3 with SHIFT key + public static void testButtonsWithShift(){ + System.out.println("Testing buttons with SHIFT modifier."); + f.addMouseListener(adapterTest2); + + for (int button : mouseButtons){ + robot.keyPress(KeyEvent.VK_SHIFT); + robot.mousePress(button); + robot.delay(100); + robot.mouseRelease(button); + robot.keyRelease(KeyEvent.VK_SHIFT); + } + robot.delay(1000); + f.removeMouseListener(adapterTest2); + } + + //test BUTTON1, 2 and 3 with CTRL key + public static void testButtonsWithControl(){ + System.out.println("Testing buttons with CONTROL modifier."); + f.addMouseListener(adapterTest3); + for (int button : mouseButtons){ + robot.keyPress(KeyEvent.VK_CONTROL); + robot.mousePress(button); + robot.delay(100); + robot.mouseRelease(button); + robot.keyRelease(KeyEvent.VK_CONTROL); + } + robot.delay(1000); + f.removeMouseListener(adapterTest3); + } + + //test BUTTON1, 2 and 3 with ALT key + public static void testButtonsWithAlt(){ + System.out.println("Testing buttons with ALT modifier."); + f.addMouseListener(adapterTest4); + for (int button : mouseButtons){ + robot.keyPress(KeyEvent.VK_ALT); + robot.mousePress(button); + robot.delay(100); + robot.mouseRelease(button); + robot.keyRelease(KeyEvent.VK_ALT); + } + robot.delay(1000); + f.removeMouseListener(adapterTest4); + } + + public static void initParams(String []s){ + if (s.length != 3){ + autorun = true; + debug = false; + testModifier = NONE; + } else { + autorun = Boolean.valueOf(s[0]); + debug = Boolean.valueOf(s[1]); + + if (s[2].equals("NONE")){ + testModifier = NONE; + } + if (s[2].equals("SHIFT")){ + testModifier = SHIFT; + } + if (s[2].equals("CTRL")){ + testModifier = CTRL; + } + if (s[2].equals("ALT")){ + testModifier = ALT; + } + } + System.out.println("Autorun : " +autorun); + System.out.println("Debug mode : " +debug); + System.out.println("Modifier to verify : " + testModifier); + } + + public static void dumpValues(int button, int modifiers, int modifiersStandard, int modifiersEx, int modifiersExStandard){ + System.out.println("Button = "+button + "Modifiers = "+ modifiers + " standard = "+ modifiersStandard); + System.out.println(" ModifiersEx = "+ modifiersEx + " standardEx = "+ modifiersExStandard); + } + + private static int[] getStandardExArray(int testModifier) { + int [] curStandardExModifiers; + switch (testModifier){ + case SHIFT: + curStandardExModifiers = modifiersExStandardTestSHIFT; + break; + case CTRL: + curStandardExModifiers = modifiersExStandardTestCTRL; + break; + case ALT: + curStandardExModifiers = modifiersExStandardTestALT; + break; + default: //NONE by default + curStandardExModifiers = modifiersExStandardTestNONE; + } + return curStandardExModifiers; + } + + private static int[] getStandardArray(int testModifier) { + int [] curStandardModifiers; + switch (testModifier){ + case SHIFT: + curStandardModifiers = modifiersStandardTestSHIFT; + break; + case CTRL: + curStandardModifiers = modifiersStandardTestCTRL; + break; + case ALT: + curStandardModifiers = modifiersStandardTestALT; + break; + default: //NONE by default + curStandardModifiers = modifiersStandardTestNONE; + } + return curStandardModifiers; + } + +} + + +/* A class that invoke appropriate verification + * routine with current modifier. + */ +class CheckingModifierAdapter extends MouseAdapter{ + int modifier; + public CheckingModifierAdapter(int modifier){ + this.modifier = modifier; + } + + public void mousePressed(MouseEvent e) { + System.out.println("PRESSED "+e); + if (e.getButton() > MouseEvent.BUTTON3) { + System.out.println("Extra button affected. Skip."); + } else { + MouseModifiersUnitTest_Standard.checkPressedModifiersTest(modifier, e); // e.getButton(), e.getModifiers(), e.getModifiersEx(), + } + } + public void mouseReleased(MouseEvent e) { + System.out.println("RELEASED "+e); + if (e.getButton() > MouseEvent.BUTTON3) { + System.out.println("Extra button affected. Skip."); + } else { + MouseModifiersUnitTest_Standard.checkReleasedModifiersTest(modifier, e); // e.getButton(), e.getModifiers(), e.getModifiersEx() + } + } + public void mouseClicked(MouseEvent e) { + System.out.println("CLICKED "+e); + if (e.getButton() > MouseEvent.BUTTON3) { + System.out.println("Extra button affected. Skip."); + } else { + MouseModifiersUnitTest_Standard.checkClickedModifiersTest(modifier, e); //e.getButton(), e.getModifiers(), e.getModifiersEx() + } + } +} + diff --git a/jdk/test/java/awt/Robot/AcceptExtraMouseButtons/AcceptExtraMouseButtons.java b/jdk/test/java/awt/Robot/AcceptExtraMouseButtons/AcceptExtraMouseButtons.java new file mode 100644 index 00000000000..91b13cc131a --- /dev/null +++ b/jdk/test/java/awt/Robot/AcceptExtraMouseButtons/AcceptExtraMouseButtons.java @@ -0,0 +1,118 @@ +/* + @test %I% %E% + @bug 6315717 + @summary verifies that Robot is accepting extra mouse buttons + @author Andrei Dmitriev : area=awt.mouse + @library ../../regtesthelpers + @build Util + @run main AcceptExtraMouseButtons + */ + +//if we do robot.mousePress(InputEvent.BUTTON1_DOWN_MASK) the test must +// 1) accept it (i.e. don't throw an IllegalArgumentException +// 2) actually post a MouseEvent +// Also, Robot should still accept InputEvent.BUTTONx_MASKs + +import java.awt.*; +import java.awt.event.*; +import sun.awt.SunToolkit; +import test.java.awt.regtesthelpers.Util; + +public class AcceptExtraMouseButtons extends Frame { + static String tk = Toolkit.getDefaultToolkit().getClass().getName(); + static Robot robot; + static int [] standardButtonMasks = {InputEvent.BUTTON1_MASK, + InputEvent.BUTTON2_MASK, + InputEvent.BUTTON3_MASK}; + static int [] buttonsPressed; + static int [] buttonsReleased; + static int [] buttonsClicked; + + static int buttonsNum = MouseInfo.getNumberOfButtons(); + + public static void main(String []s){ + + //MouseInfo.getNumberOfButtons() reports two more buttons on XToolkit + //as they reserved for wheel (both directions). + if (tk.equals("sun.awt.X11.XToolkit") || tk.equals("sun.awt.motif.MToolkit")) { + buttonsNum = buttonsNum - 2; + } + System.out.println("Number Of Buttons = "+ buttonsNum); + if (buttonsNum < 3) { + System.out.println("Linux and Windows systems should emulate three buttons if even there are only 1 or 2 are phsically available. Setting number of buttons to 3."); + buttonsNum = 3; + } + + buttonsPressed = new int [buttonsNum]; + buttonsReleased = new int [buttonsNum]; + buttonsClicked = new int [buttonsNum]; + + AcceptExtraMouseButtons frame = new AcceptExtraMouseButtons(); + + MouseAdapter ma1 = new MouseAdapter() { + public void mousePressed(MouseEvent e) { + buttonsPressed[e.getButton() - 1] += 1; + System.out.println("PRESSED "+e); + } + public void mouseReleased(MouseEvent e) { + buttonsReleased[e.getButton() - 1] += 1; + System.out.println("RELEASED "+e); + } + public void mouseClicked(MouseEvent e) { + buttonsClicked[e.getButton() - 1] += 1; + System.out.println("CLICKED "+e); + } + }; + frame.addMouseListener(ma1); + + frame.setSize(300, 300); + frame.setVisible(true); + + Util.waitForIdle(robot); //a time to show a Frame + + try { + robot = new Robot(); + robot.delay(1000); + robot.mouseMove(frame.getLocationOnScreen().x + frame.getWidth()/2, + frame.getLocationOnScreen().y + frame.getHeight()/2); + + //TestCase 1: verify that all BUTTONx_DOWN_MASKs are accepted by the Robot. + + for (int i = 0; i < buttonsNum; i++){ + int buttonMask = InputEvent.getMaskForButton(i+1); + System.out.println("button to press = " +(i+1) + " : value passed to robot = " +buttonMask); + robot.mousePress(buttonMask); + robot.delay(30); + robot.mouseRelease(buttonMask); + Util.waitForIdle(robot); + } + for (int i = 0; i < buttonsNum; i++){ + if (buttonsPressed[i] != 1 || buttonsReleased[i] != 1 || buttonsClicked[i] !=1 ) { + throw new RuntimeException("TESTCASE 1 FAILED : button " + (i+1) + " wasn't single pressed|released|clicked : "+ buttonsPressed[i] +" : "+ buttonsReleased[i] +" : "+ buttonsClicked[i]); + } + } + + java.util.Arrays.fill(buttonsPressed, 0); + java.util.Arrays.fill(buttonsReleased, 0); + java.util.Arrays.fill(buttonsClicked, 0); + //TestCase 2: verify that all BUTTONx_MASKs are accepted by the Robot. + for (int i = 0; i < standardButtonMasks.length; i++){ + int buttonMask = standardButtonMasks[i]; + System.out.println("button to press = " +(i+1) + " : value passed to robot = " +buttonMask); + robot.mousePress(buttonMask); + robot.delay(30); + robot.mouseRelease(buttonMask); + Util.waitForIdle(robot); + } + for (int i = 0; i < standardButtonMasks.length; i++){ + if (buttonsPressed[i] != 1 || buttonsReleased[i] != 1 || buttonsClicked[i] !=1 ) { + throw new RuntimeException("TESTCASE 2 FAILED : button " + (i+1) + " wasn't single pressed|released|clicked : "+ buttonsPressed[i] +" : "+ buttonsReleased[i] +" : "+ buttonsClicked[i]); + } + } + + } catch (Exception e){ + e.printStackTrace(); + throw new RuntimeException(e); + } + } +} diff --git a/jdk/test/java/awt/Robot/ManualInstructions/ManualInstructions.java b/jdk/test/java/awt/Robot/ManualInstructions/ManualInstructions.java new file mode 100644 index 00000000000..96baf9b913c --- /dev/null +++ b/jdk/test/java/awt/Robot/ManualInstructions/ManualInstructions.java @@ -0,0 +1,305 @@ +/* + test %W% %E% %I%, %G% + @bug 6315717 + @summary manual control over the Robot + @author Andrei Dmitriev : area=awt.robot + @run applet/manual=yesno ManualInstructions.html +*/ + +import java.applet.Applet; +import java.awt.*; +import java.awt.event.*; +import java.util.Timer; +import java.util.TimerTask; + +public class ManualInstructions extends Applet +{ + final static long SEND_DELAY = 1000; + + public static void main(String s[]){ + ManualInstructions mi = new ManualInstructions(); + mi.init(); + mi.start(); + } + + static Robot robot; + Point mouseLocation; //where mouse should be pressed each time + Panel target = new Panel(); + Button pressOn = new Button("press on ..."); + Button releaseOn = new Button("release on ..."); + Button clickOn = new Button("click on ..."); + Choice buttonNumber = new Choice(); + + public void init() + { + try { + robot = new Robot(); + } catch (AWTException ex) { + ex.printStackTrace(); + throw new RuntimeException(ex); + } + this.setLayout (new BorderLayout ()); + + target.setBackground(Color.green); + target.setName("GreenBox");//for the ease of debug + target.setPreferredSize(new Dimension(100, 100)); + String toolkit = Toolkit.getDefaultToolkit().getClass().getName(); + + // on X systems two buttons are reserved for wheel though they are countable by MouseInfo. + int buttonsNumber = toolkit.equals("sun.awt.windows.WToolkit")?MouseInfo.getNumberOfButtons():MouseInfo.getNumberOfButtons()-2; + + for (int i = 0; i < 8; i++){ + buttonNumber.add("BUTTON"+(i+1)+"_MASK"); + } + + pressOn.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent e){ + System.out.println("Now pressing : " + (buttonNumber.getSelectedIndex()+1)); + + Timer timer = new Timer(); + TimerTask robotInteraction = new TimerTask(){ + public void run(){ + robot.mouseMove(updateTargetLocation().x, updateTargetLocation().y); + robot.mousePress(getMask(buttonNumber.getSelectedIndex()+1)); + } + }; + timer.schedule(robotInteraction, SEND_DELAY); + } + }); + + releaseOn.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent e){ + System.out.println("Now releasing : " + (buttonNumber.getSelectedIndex()+1)); + Timer timer = new Timer(); + TimerTask robotInteraction = new TimerTask(){ + public void run(){ + robot.mouseMove(updateTargetLocation().x, updateTargetLocation().y); + robot.mouseRelease(getMask(buttonNumber.getSelectedIndex()+1)); + } + }; + timer.schedule(robotInteraction, SEND_DELAY); + } + }); + + clickOn.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent e){ + System.out.println("Now clicking : " + (buttonNumber.getSelectedIndex()+1)); + Timer timer = new Timer(); + TimerTask robotInteraction = new TimerTask(){ + public void run(){ + robot.mouseMove(updateTargetLocation().x, updateTargetLocation().y); + robot.mousePress(getMask(buttonNumber.getSelectedIndex()+1)); + robot.mouseRelease(getMask(buttonNumber.getSelectedIndex()+1)); + } + }; + timer.schedule(robotInteraction, SEND_DELAY); + } + + }); + target.addMouseListener(new MouseAdapter(){ + public void mousePressed(MouseEvent e){ + Sysout.println(""+e); + } + public void mouseReleased(MouseEvent e){ + Sysout.println(""+e); + } + public void mouseClicked(MouseEvent e){ + Sysout.println(""+e); + } + }); + + String[] instructions = + { + "Do provide an instruction to the robot by", + "choosing the button number to act and ", + "pressing appropriate java.awt.Button on the left.", + "Inspect an output in the TextArea below.", + "Please don't generate non-natural sequences like Release-Release, etc.", + "If you use keyboard be sure that you released the keyboard shortly.", + "If events are generated well press Pass, otherwise Fail." + }; + Sysout.createDialogWithInstructions( instructions ); + + }//End init() + + private int getMask(int button){ + return InputEvent.getMaskForButton(button); + + /* + //this only works for standard buttons and for old JDK builds + int mask = 0; + switch (button){ + case 1: { + mask = InputEvent.BUTTON1_MASK; + break; + } + case 2: { + mask = InputEvent.BUTTON2_MASK; + break; + } + case 3: { + mask = InputEvent.BUTTON3_MASK; + break; + } + } + return mask; + */ + } + + private Point updateTargetLocation() { + return new Point(target.getLocationOnScreen().x + target.getWidth()/2, target.getLocationOnScreen().y + target.getHeight()/2); + } + + public void start () + { + //Get things going. Request focus, set size, et cetera + setSize (200,200); + setVisible(true); + validate(); + Frame f = new Frame ("Set action for Robot here."); + f.setLayout(new FlowLayout()); + f.add(buttonNumber); + f.add(pressOn); + f.add(releaseOn); + f.add(clickOn); + f.add(target); + f.pack(); + f.setVisible(true); + }// start() +}// class + +/* Place other classes related to the test after this line */ + + +/**************************************************** + Standard Test Machinery + DO NOT modify anything below -- it's a standard + chunk of code whose purpose is to make user + interaction uniform, and thereby make it simpler + to read and understand someone else's test. + ****************************************************/ + +/** + This is part of the standard test machinery. + It creates a dialog (with the instructions), and is the interface + for sending text messages to the user. + To print the instructions, send an array of strings to Sysout.createDialog + WithInstructions method. Put one line of instructions per array entry. + To display a message for the tester to see, simply call Sysout.println + with the string to be displayed. + This mimics System.out.println but works within the test harness as well + as standalone. + */ + +class Sysout +{ + private static TestDialog dialog; + + public static void createDialogWithInstructions( String[] instructions ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + dialog.printInstructions( instructions ); + dialog.setVisible(true); + println( "Any messages for the tester will display here." ); + } + + public static void createDialog( ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + String[] defInstr = { "Instructions will appear here. ", "" } ; + dialog.printInstructions( defInstr ); + dialog.setVisible(true); + println( "Any messages for the tester will display here." ); + } + + public static void printInstructions( String[] instructions ) + { + dialog.printInstructions( instructions ); + } + + + public static void println( String messageIn ) + { + dialog.displayMessage( messageIn ); + } + +}// Sysout class + +/** + This is part of the standard test machinery. It provides a place for the + test instructions to be displayed, and a place for interactive messages + to the user to be displayed. + To have the test instructions displayed, see Sysout. + To have a message to the user be displayed, see Sysout. + Do not call anything in this dialog directly. + */ +class TestDialog extends Dialog +{ + + TextArea instructionsText; + TextArea messageText; + int maxStringLength = 120; + + //DO NOT call this directly, go through Sysout + public TestDialog( Frame frame, String name ) + { + super( frame, name ); + int scrollBoth = TextArea.SCROLLBARS_BOTH; + instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth ); + add( "North", instructionsText ); + + messageText = new TextArea( "", 5, maxStringLength, scrollBoth ); + add("Center", messageText); + + pack(); + + setVisible(true); + }// TestDialog() + + //DO NOT call this directly, go through Sysout + public void printInstructions( String[] instructions ) + { + //Clear out any current instructions + instructionsText.setText( "" ); + + //Go down array of instruction strings + + String printStr, remainingStr; + for( int i=0; i < instructions.length; i++ ) + { + //chop up each into pieces maxSringLength long + remainingStr = instructions[ i ]; + while( remainingStr.length() > 0 ) + { + //if longer than max then chop off first max chars to print + if( remainingStr.length() >= maxStringLength ) + { + //Try to chop on a word boundary + int posOfSpace = remainingStr. + lastIndexOf( ' ', maxStringLength - 1 ); + + if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1; + + printStr = remainingStr.substring( 0, posOfSpace + 1 ); + remainingStr = remainingStr.substring( posOfSpace + 1 ); + } + //else just print + else + { + printStr = remainingStr; + remainingStr = ""; + } + + instructionsText.append( printStr + "\n" ); + }// while + }// for + }//printInstructions() + + //DO NOT call this directly, go through Sysout + public void displayMessage( String messageIn ) + { + messageText.append( messageIn + "\n" ); + System.out.println(messageIn); + } + +}// TestDialog class diff --git a/jdk/test/java/awt/Robot/RobotExtraButton/RobotExtraButton.java b/jdk/test/java/awt/Robot/RobotExtraButton/RobotExtraButton.java new file mode 100644 index 00000000000..83e9571239d --- /dev/null +++ b/jdk/test/java/awt/Robot/RobotExtraButton/RobotExtraButton.java @@ -0,0 +1,79 @@ +/* + @test %I% %E% + @bug 6315717 + @summary verifies that robot could accept extra buttons + @author Andrei Dmitriev : area=awt.mouse + @library ../../regtesthelpers + @build Util + @run main RobotExtraButton + */ + +import java.awt.*; +import java.awt.event.*; +import test.java.awt.regtesthelpers.Util; + +public class RobotExtraButton extends Frame { + static Robot robot; + public static void main(String []s){ + RobotExtraButton frame = new RobotExtraButton(); + frame.setSize(300, 300); + frame.setVisible(true); + frame.addMouseListener(new MouseAdapter() { + public void mousePressed(MouseEvent e) { + System.out.println("PRESSED "+e); + } + public void mouseReleased(MouseEvent e) { + System.out.println("RELEASED "+e); + } + public void mouseClicked(MouseEvent e) { + System.out.println("CLICKED "+e); + } + }); + Util.waitForIdle(robot); + int [] buttonMask = new int[MouseInfo.getNumberOfButtons()]; // = InputEvent.getButtonDownMasks(); + for (int i = 0; i < MouseInfo.getNumberOfButtons(); i++){ + buttonMask[i] = InputEvent.getMaskForButton(i+1); + System.out.println("TEST: "+buttonMask[i]); + } + + try { + robot = new Robot(); + robot.mouseMove(frame.getLocationOnScreen().x + frame.getWidth()/2, frame.getLocationOnScreen().y + frame.getHeight()/2); + /* + if (MouseInfo.getNumberOfButtons() <= 3) { + System.out.println("Number Of Buttons = "+ MouseInfo.getNumberOfButtons() +". Finish!"); + return; + }*/ + + System.out.println("TEST: press 1"); + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.delay(50); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + Util.waitForIdle(robot); + + System.out.println("TEST: press 2"); + + robot.mousePress(InputEvent.BUTTON2_MASK); + robot.delay(50); + robot.mouseRelease(InputEvent.BUTTON2_MASK); + Util.waitForIdle(robot); + System.out.println("TEST: press 3"); + + robot.mousePress(InputEvent.BUTTON3_MASK); + robot.delay(50); + robot.mouseRelease(InputEvent.BUTTON3_MASK); + Util.waitForIdle(robot); + System.out.println("--------------------------------------------------"); + for (int i = 0; i < buttonMask.length; i++){ + System.out.println("button would = " +i + " : value = " +buttonMask[i]); + robot.mousePress(buttonMask[i]); + robot.delay(50); + robot.mouseRelease(buttonMask[i]); + Util.waitForIdle(robot); + } + } catch (Exception e){ + e.printStackTrace(); + throw new RuntimeException("Test failed.", e); + } + } +} diff --git a/jdk/test/java/awt/Toolkit/Headless/AWTEventListener/AWTListener.java b/jdk/test/java/awt/Toolkit/Headless/AWTEventListener/AWTListener.java new file mode 100644 index 00000000000..44098dd3e48 --- /dev/null +++ b/jdk/test/java/awt/Toolkit/Headless/AWTEventListener/AWTListener.java @@ -0,0 +1,48 @@ +/* + @test + @bug 6738181 + @library ../../../regtesthelpers + @build Sysout + @summary Toolkit.getAWTEventListeners returns empty array + @author andrei dmitriev: area=awt.headless + @run main/othervm -Djava.awt.headless=true AWTListener +*/ + +/** + * In a headless mode add a listener for container events. + * Check if a single listener is still assigned to the Toolkit class. + */ + +import java.awt.*; +import java.awt.event.*; +import test.java.awt.regtesthelpers.Sysout; + +public class AWTListener { + public static void main(String []s) { + Toolkit toolkit = Toolkit.getDefaultToolkit(); + + AWTEventListener orig = new AWTEventListener() { + public void eventDispatched(AWTEvent event) { } + }; + + Sysout.println("Test: listener to add = " +orig); + toolkit.addAWTEventListener(orig, AWTEvent.CONTAINER_EVENT_MASK); + + for (AWTEventListener l: toolkit.getAWTEventListeners()){ + Sysout.println("Test: listener = " +l+" "); + } + + if ( toolkit.getAWTEventListeners().length == 0 ) { + throw new RuntimeException("Case 1. An empty array returned unexpectedly"); + } + + for (AWTEventListener l: toolkit.getAWTEventListeners(AWTEvent.CONTAINER_EVENT_MASK)){ + Sysout.println("Test: listener = " +l); + } + + if ( toolkit.getAWTEventListeners(AWTEvent.CONTAINER_EVENT_MASK).length == 0 ) { + throw new RuntimeException("Case 2. An empty array returned unexpectedly"); + } + Sysout.println("Test PASSED"); + } +} diff --git a/jdk/test/java/awt/Toolkit/ToolkitPropertyTest/SystemPropTest_1.java b/jdk/test/java/awt/Toolkit/ToolkitPropertyTest/SystemPropTest_1.java new file mode 100644 index 00000000000..3fdd3bce310 --- /dev/null +++ b/jdk/test/java/awt/Toolkit/ToolkitPropertyTest/SystemPropTest_1.java @@ -0,0 +1,36 @@ +/* + @test %I% %E% + @bug 6315717 + @summary verifies that system property sun.awt.enableExtraMouseButtons is true by default + @author Andrei Dmitriev : area=awt.mouse + @run main SystemPropTest_1 + */ +//1) Verifies that System.getProperty("sun.awt.enableExtraMouseButtons") returns false initially. +//2) Verifies that Toolkit.areExtraMouseButtonsEnabled() returns true by default. +// This must initlizes the Toolkit class. +//3) Verifies that System.getProperty("sun.awt.enableExtraMouseButtons") returns true (default). +import java.awt.*; + +public class SystemPropTest_1 { + + public static void main(String []s){ + boolean propValue = Boolean.parseBoolean(System.getProperty("sun.awt.enableExtraMouseButtons")); + System.out.println("1. System.getProperty = " + propValue); + if (propValue){ + throw new RuntimeException("TEST FAILED(1) : System property sun.awt.enableExtraMouseButtons = " + propValue); + } + if (!Toolkit.getDefaultToolkit().areExtraMouseButtonsEnabled()){ + throw new RuntimeException("TEST FAILED : Toolkit.areExtraMouseButtonsEnabled() returns false"); + } + + System.getProperties().list(System.out); + System.out.println("XXXX. System.getProperty = " + System.getProperty("sun.awt.enableExtraMouseButtons")); + + propValue = Boolean.parseBoolean(System.getProperty("sun.awt.enableExtraMouseButtons")); + System.out.println("2. System.getProperty = " + propValue); + if (!propValue){ + throw new RuntimeException("TEST FAILED(2) : System property sun.awt.enableExtraMouseButtons = " + propValue); + } + System.out.println("Test passed."); + } +} diff --git a/jdk/test/java/awt/Toolkit/ToolkitPropertyTest/SystemPropTest_2.java b/jdk/test/java/awt/Toolkit/ToolkitPropertyTest/SystemPropTest_2.java new file mode 100644 index 00000000000..366dbdf5cf6 --- /dev/null +++ b/jdk/test/java/awt/Toolkit/ToolkitPropertyTest/SystemPropTest_2.java @@ -0,0 +1,25 @@ +/* + @test %I% %E% + @bug 6315717 + @summary verifies that system property sun.awt.enableExtraMouseButtons might be set to true by the command line + @author Andrei Dmitriev : area=awt.mouse + @run main/othervm -Dsun.awt.enableExtraMouseButtons=true SystemPropTest_2 + */ +//1) Verifies that System.getProperty("sun.awt.enableExtraMouseButtons") returns true if set through the command line. +//2) Verifies that Toolkit.areExtraMouseButtonsEnabled() returns true if the proprty is set through the command line. +import java.awt.*; + +public class SystemPropTest_2 { + + public static void main(String []s){ + boolean propValue = Boolean.parseBoolean(System.getProperty("sun.awt.enableExtraMouseButtons")); + System.out.println("System.getProperty = " + propValue); + if (!propValue){ + throw new RuntimeException("TEST FAILED : System property sun.awt.enableExtraMouseButtons = " + propValue); + } + if (!Toolkit.getDefaultToolkit().areExtraMouseButtonsEnabled()){ + throw new RuntimeException("TEST FAILED : Toolkit.areExtraMouseButtonsEnabled() returns false"); + } + System.out.println("Test passed."); + } +} diff --git a/jdk/test/java/awt/Toolkit/ToolkitPropertyTest/SystemPropTest_3.java b/jdk/test/java/awt/Toolkit/ToolkitPropertyTest/SystemPropTest_3.java new file mode 100644 index 00000000000..e634af90127 --- /dev/null +++ b/jdk/test/java/awt/Toolkit/ToolkitPropertyTest/SystemPropTest_3.java @@ -0,0 +1,26 @@ +/* + @test %I% %E% + @bug 6315717 + @summary verifies that system property sun.awt.enableExtraMouseButtons might be set to false by the command line + @author Andrei Dmitriev : area=awt.mouse + @run main/othervm -Dsun.awt.enableExtraMouseButtons=false SystemPropTest_3 + */ +//1) Verifies that System.getProperty("sun.awt.enableExtraMouseButtons") returns false if set through the command line. +//2) Verifies that Toolkit.areExtraMouseButtonsEnabled() returns false if the proprty is set through the command line. +import java.awt.*; + +public class SystemPropTest_3 { + + public static void main(String []s){ + boolean propValue = Boolean.parseBoolean(System.getProperty("sun.awt.enableExtraMouseButtons")); + System.out.println("Test System.getProperty = " + System.getProperty("sun.awt.enableExtraMouseButtons")); + System.out.println("System.getProperty = " + propValue); + if (propValue){ + throw new RuntimeException("TEST FAILED : System property sun.awt.enableExtraMouseButtons = " + propValue); + } + if (Toolkit.getDefaultToolkit().areExtraMouseButtonsEnabled()){ + throw new RuntimeException("TEST FAILED : Toolkit.areExtraMouseButtonsEnabled() returns true"); + } + System.out.println("Test passed."); + } +} diff --git a/jdk/test/java/awt/Toolkit/ToolkitPropertyTest/SystemPropTest_4.java b/jdk/test/java/awt/Toolkit/ToolkitPropertyTest/SystemPropTest_4.java new file mode 100644 index 00000000000..85a80b741a3 --- /dev/null +++ b/jdk/test/java/awt/Toolkit/ToolkitPropertyTest/SystemPropTest_4.java @@ -0,0 +1,42 @@ +/* + @test %I% %E% + @bug 6315717 + @summary verifies that system property sun.awt.enableExtraMouseButtons might be set to true by the System class API. + @author Andrei Dmitriev : area=awt.mouse + @run main SystemPropTest_4 + */ +//1) +// - Use System.setProperty("sun.awt.enableExtraMouseButtons", "true") +// - Verifies that System.getProperty("sun.awt.enableExtraMouseButtons") returns true +// - Verifies that Toolkit.areExtraMouseButtonsEnabled() returns true. +//2) +// - Use System.setProperty("sun.awt.enableExtraMouseButtons", "false") +// - Verifies that System.getProperty("sun.awt.enableExtraMouseButtons") returns false +// - Verifies that Toolkit.areExtraMouseButtonsEnabled() returns true still. + +import java.awt.*; + +public class SystemPropTest_4 { + public static void main(String []s){ + System.out.println("STAGE 1"); + System.setProperty("sun.awt.enableExtraMouseButtons", "true"); + boolean propValue = Boolean.parseBoolean(System.getProperty("sun.awt.enableExtraMouseButtons")); + if (!propValue){ + throw new RuntimeException("TEST FAILED(1) : System property sun.awt.enableExtraMouseButtons = " + propValue); + } + if (!Toolkit.getDefaultToolkit().areExtraMouseButtonsEnabled()){ + throw new RuntimeException("TEST FAILED(1) : Toolkit.areExtraMouseButtonsEnabled() returns false"); + } + + System.out.println("STAGE 2"); + System.setProperty("sun.awt.enableExtraMouseButtons", "false"); + propValue = Boolean.parseBoolean(System.getProperty("sun.awt.enableExtraMouseButtons")); + if (propValue){ + throw new RuntimeException("TEST FAILED(2) : System property sun.awt.enableExtraMouseButtons = " + propValue); + } + if (!Toolkit.getDefaultToolkit().areExtraMouseButtonsEnabled()){ + throw new RuntimeException("TEST FAILED(2) : Toolkit.areExtraMouseButtonsEnabled() returns false"); + } + System.out.println("Test passed."); + } +} diff --git a/jdk/test/java/awt/Toolkit/ToolkitPropertyTest/SystemPropTest_5.java b/jdk/test/java/awt/Toolkit/ToolkitPropertyTest/SystemPropTest_5.java new file mode 100644 index 00000000000..6dc2203d023 --- /dev/null +++ b/jdk/test/java/awt/Toolkit/ToolkitPropertyTest/SystemPropTest_5.java @@ -0,0 +1,42 @@ +/* + @test %I% %E% + @bug 6315717 + @summary verifies that system property sun.awt.enableExtraMouseButtons might be set to false by the System class API. + @author Andrei Dmitriev : area=awt.mouse + @run main SystemPropTest_5 + */ +//1) +// - Use System.setProperty("sun.awt.enableExtraMouseButtons", "false") +// - Verifies that System.getProperty("sun.awt.enableExtraMouseButtons") returns false +// - Verifies that Toolkit.areExtraMouseButtonsEnabled() returns false. +//2) +// - Use System.setProperty("sun.awt.enableExtraMouseButtons", "true") +// - Verifies that System.getProperty("sun.awt.enableExtraMouseButtons") returns true +// - Verifies that Toolkit.areExtraMouseButtonsEnabled() returns false still. + +import java.awt.*; + +public class SystemPropTest_5 { + public static void main(String []s){ + System.out.println("STAGE 1"); + System.setProperty("sun.awt.enableExtraMouseButtons", "false"); + boolean propValue = Boolean.parseBoolean(System.getProperty("sun.awt.enableExtraMouseButtons")); + if (propValue){ + throw new RuntimeException("TEST FAILED(1) : System property sun.awt.enableExtraMouseButtons = " + propValue); + } + if (Toolkit.getDefaultToolkit().areExtraMouseButtonsEnabled()){ + throw new RuntimeException("TEST FAILED(1) : Toolkit.areExtraMouseButtonsEnabled() returns true"); + } + + System.out.println("STAGE 2"); + System.setProperty("sun.awt.enableExtraMouseButtons", "true"); + propValue = Boolean.parseBoolean(System.getProperty("sun.awt.enableExtraMouseButtons")); + if (!propValue){ + throw new RuntimeException("TEST FAILED(2) : System property sun.awt.enableExtraMouseButtons = " + propValue); + } + if (Toolkit.getDefaultToolkit().areExtraMouseButtonsEnabled()){ + throw new RuntimeException("TEST FAILED(2) : Toolkit.areExtraMouseButtonsEnabled() returns true"); + } + System.out.println("Test passed."); + } +} diff --git a/jdk/test/java/awt/Toolkit/ToolkitPropertyTest/ToolkitPropertyTest_Disable.java b/jdk/test/java/awt/Toolkit/ToolkitPropertyTest/ToolkitPropertyTest_Disable.java new file mode 100644 index 00000000000..023bbb2f3db --- /dev/null +++ b/jdk/test/java/awt/Toolkit/ToolkitPropertyTest/ToolkitPropertyTest_Disable.java @@ -0,0 +1,143 @@ +/* + @test %I% %E% + @bug 6315717 + @summary verifies that sun.awt.enableExtraMouseButtons = false consumes extra events + @author Andrei Dmitriev : area=awt.mouse + @run main/othervm -Dsun.awt.enableExtraMouseButtons=false ToolkitPropertyTest_Disable + */ + +import java.awt.*; +import java.awt.event.*; + +// Testcase 1: set to FALSE and check +// Testcase 2: set to FALSE and check that extra events are not coming +// check that standard events are coming + +public class ToolkitPropertyTest_Disable extends Frame { + static boolean propValue; + static Robot robot; + static int [] buttonsPressed; + static int [] buttonsReleased; + static int [] buttonsClicked; + + static boolean lessThenFourButtons; + + public static void main(String []s){ + propValue = Boolean.parseBoolean(System.getProperty("sun.awt.enableExtraMouseButtons")); + buttonsPressed = new int [MouseInfo.getNumberOfButtons()]; + buttonsReleased = new int [MouseInfo.getNumberOfButtons()]; + buttonsClicked = new int [MouseInfo.getNumberOfButtons()]; + + ToolkitPropertyTest_Disable frame = new ToolkitPropertyTest_Disable(); + frame.setSize(300, 300); + frame.setVisible(true); + + MouseAdapter ma1 = new MouseAdapter() { + public void mousePressed(MouseEvent e) { + buttonsPressed[e.getButton() - 1] += 1; + System.out.println("PRESSED "+e); + } + public void mouseReleased(MouseEvent e) { + buttonsReleased[e.getButton() - 1] += 1; + System.out.println("RELEASED "+e); + } + public void mouseClicked(MouseEvent e) { + buttonsClicked[e.getButton() - 1] += 1; + System.out.println("CLICKED "+e); + } + }; + + try { + robot = new Robot(); + robot.delay(1000); + robot.mouseMove(frame.getLocationOnScreen().x + frame.getWidth()/2, frame.getLocationOnScreen().y + frame.getHeight()/2); + + System.out.println("Property = " + propValue); + testCase0(); + + testCase1(); + System.out.println("Number Of Buttons = "+ MouseInfo.getNumberOfButtons()); + + lessThenFourButtons = (MouseInfo.getNumberOfButtons() <= 3); + if ( !lessThenFourButtons ) { + frame.addMouseListener(ma1); + testCase2(); + } + } catch (Exception e){ + e.printStackTrace(); +// throw new RuntimeException(e); + } finally { +// frame.removeMouseListener(ma1); + } + } + + public static void testCase0(){ + if (propValue){ + throw new RuntimeException("TEST FAILED (0): System property sun.awt.enableExtraMouseButtons = " + propValue); + } + } + + public static void testCase1(){ + if (Toolkit.getDefaultToolkit().areExtraMouseButtonsEnabled() == true){ + throw new RuntimeException("TEST FAILED (1): setting to FALSE. Toolkit.getDefaultToolkit().areExtraMouseButtonsEnabled() = " + Toolkit.getDefaultToolkit().areExtraMouseButtonsEnabled()); + } + } + + public static void testCase2(){ + emptyArrays(); + int [] buttonMasks = new int[MouseInfo.getNumberOfButtons()]; // = InputEvent.getButtonDownMasks(); + for (int i = 0; i < MouseInfo.getNumberOfButtons(); i++){ + buttonMasks[i] = InputEvent.getMaskForButton(i+1); + System.out.println("TEST: "+buttonMasks[i]); + } + + for (int i = 0; i < MouseInfo.getNumberOfButtons(); i++){ + System.out.println("button to press = " +(i+1) + " : value passed to robot = " +buttonMasks[i]); + try { + robot.mousePress(buttonMasks[i]); + robot.delay(70); + robot.mouseRelease(buttonMasks[i]); + robot.delay(200); + //no exception is thrown + if (i >= 3) { + throw new RuntimeException("TESTCASE 2 FAILED : robot accepted the extra button " + (i+1) + " instead of throwing an exception."); + } + } catch (IllegalArgumentException e){ + if (i >= 3) { + System.out.println("Passed: an exception caught for extra button."); + } else { + throw new RuntimeException("TESTCASE 2 FAILED : exception happen on standard button.", e); + } + } + } + robot.delay(2000); + if (MouseInfo.getNumberOfButtons() < 3) { + for (int i = 0; i < MouseInfo.getNumberOfButtons(); i++){ + if (buttonsPressed[i] != 1 || buttonsReleased[i] != 1 || buttonsClicked[i] !=1 ) { + throw new RuntimeException("TESTCASE 2 FAILED : button " + (i+1) + " wasn't single pressed."); + } + } + } else { + for (int i = 0; i < 3; i++){ + if (buttonsPressed[i] != 1 || buttonsReleased[i] != 1 || buttonsClicked[i] !=1 ) { + throw new RuntimeException("TESTCASE 2 FAILED : button " + (i+1) + " wasn't single pressed."); + } + } + + for (int i = 3; i < MouseInfo.getNumberOfButtons(); i++){ + if (buttonsPressed[i] != 0 || buttonsReleased[i] != 0 || buttonsClicked[i] != 0 ) { + throw new RuntimeException("TESTCASE 2 FAILED : button " + (i+1) + " was pressed."); + } + } + } + } + + public static void emptyArrays(){ + for (int i = 0; i < MouseInfo.getNumberOfButtons(); i++){ + buttonsPressed[i] = 0; + buttonsReleased[i] = 0; + buttonsClicked[i] = 0; + } + } + +} diff --git a/jdk/test/java/awt/Toolkit/ToolkitPropertyTest/ToolkitPropertyTest_Enable.java b/jdk/test/java/awt/Toolkit/ToolkitPropertyTest/ToolkitPropertyTest_Enable.java new file mode 100644 index 00000000000..fa6a41771aa --- /dev/null +++ b/jdk/test/java/awt/Toolkit/ToolkitPropertyTest/ToolkitPropertyTest_Enable.java @@ -0,0 +1,120 @@ +/* + @test %I% %E% + @bug 6315717 + @summary verifies that sun.awt.enableExtraMouseButtons is working + @author Andrei Dmitriev : area=awt.mouse + @run main/othervm -Dsun.awt.enableExtraMouseButtons=true ToolkitPropertyTest_Enable + */ + +import java.awt.*; +import java.awt.event.*; + +// Testcase 1: set to TRUE (via jtreg option) +// Testcase 2: set to TRUE and check that extra events are coming +// check that standard events are coming + +public class ToolkitPropertyTest_Enable extends Frame { + static boolean propValue; + static Robot robot; + static int [] buttonsPressed; + static int [] buttonsReleased; + static int [] buttonsClicked; + + public static void main(String []s){ + propValue = Boolean.parseBoolean(System.getProperty("sun.awt.enableExtraMouseButtons")); + buttonsPressed = new int [MouseInfo.getNumberOfButtons()]; + buttonsReleased = new int [MouseInfo.getNumberOfButtons()]; + buttonsClicked = new int [MouseInfo.getNumberOfButtons()]; + + ToolkitPropertyTest_Enable frame = new ToolkitPropertyTest_Enable(); + frame.setSize(300, 300); + frame.setVisible(true); + + MouseAdapter ma1 = new MouseAdapter() { + public void mousePressed(MouseEvent e) { + buttonsPressed[e.getButton() - 1] += 1; + System.out.println("PRESSED "+e); + } + public void mouseReleased(MouseEvent e) { + buttonsReleased[e.getButton() - 1] += 1; + System.out.println("RELEASED "+e); + } + public void mouseClicked(MouseEvent e) { + buttonsClicked[e.getButton() - 1] += 1; + System.out.println("CLICKED "+e); + } + }; + // frame.addMouseListener(ma1); + + try { + robot = new Robot(); + robot.delay(1000); + robot.mouseMove(frame.getLocationOnScreen().x + frame.getWidth()/2, frame.getLocationOnScreen().y + frame.getHeight()/2); + + System.out.println("Property = " + propValue); + testCase0(); + + testCase1(); + System.out.println("Number Of Buttons = "+ MouseInfo.getNumberOfButtons()); + + boolean lessThenFourButtons = (MouseInfo.getNumberOfButtons() <= 3); + if ( !lessThenFourButtons ) { + frame.addMouseListener(ma1); + testCase2(); + // testCase3(); + // testCase4(); + frame.removeMouseListener(ma1); + } + } catch (Exception e){ + e.printStackTrace(); + throw new RuntimeException(e); + } + + } + + public static void testCase0(){ + if (!propValue){ + throw new RuntimeException("TEST FAILED (0) : System property sun.awt.enableExtraMouseButtons = " + propValue); + } + } + + public static void testCase1(){ + if (Toolkit.getDefaultToolkit().areExtraMouseButtonsEnabled() == false){ + throw new RuntimeException("TEST FAILED (1) : setting to TRUE. enabled = " + Toolkit.getDefaultToolkit().areExtraMouseButtonsEnabled()); + } + } + + public static void testCase2(){ + emptyArrays(); + //we can't post a message from an unexistent button + int [] buttonMasks = new int[MouseInfo.getNumberOfButtons()]; // = InputEvent.getButtonDownMasks(); + for (int i = 0; i < MouseInfo.getNumberOfButtons(); i++){ + buttonMasks[i] = InputEvent.getMaskForButton(i+1); + System.out.println("TEST: "+buttonMasks[i]); + } + + for (int i = 0; i < MouseInfo.getNumberOfButtons(); i++){ + System.out.println("button to press = " +(i+1) + " : value passed to robot = " +buttonMasks[i]); + robot.mousePress(buttonMasks[i]); + robot.delay(70); + robot.mouseRelease(buttonMasks[i]); + robot.delay(200); + } + robot.delay(1000); + + for (int i = 0; i < MouseInfo.getNumberOfButtons(); i++){ + if (buttonsPressed[i] != 1 || buttonsReleased[i] != 1 || buttonsClicked[i] !=1 ) { + throw new RuntimeException("TESTCASE 2 FAILED : button " + (i+1) + " wasn't single pressed|released|clicked : "+ buttonsPressed[i] +" : "+ buttonsReleased[i] +" : "+ buttonsClicked[i]); + } + } + } + + public static void emptyArrays(){ + for (int i = 0; i < MouseInfo.getNumberOfButtons(); i++){ + buttonsPressed[i] = 0; + buttonsReleased[i] = 0; + buttonsClicked[i] = 0; + } + } + +} diff --git a/jdk/test/java/awt/Window/OwnedWindowsLeak/OwnedWindowsLeak.java b/jdk/test/java/awt/Window/OwnedWindowsLeak/OwnedWindowsLeak.java new file mode 100644 index 00000000000..44f43c1b3bf --- /dev/null +++ b/jdk/test/java/awt/Window/OwnedWindowsLeak/OwnedWindowsLeak.java @@ -0,0 +1,104 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + @test + @bug 6758673 + @summary Tests that windows are removed from owner's child windows list + @author art: area=awt.toplevel + @run main OwnedWindowsLeak +*/ + +import java.awt.*; +import java.awt.event.*; + +import java.lang.ref.*; +import java.lang.reflect.*; + +import java.util.*; + +public class OwnedWindowsLeak +{ + public static void main(String[] args) + { + Frame owner = new Frame("F"); + + // First, create many windows + Vector> children = + new Vector>(); + for (int i = 0; i < 1000; i++) + { + Window child = new Window(owner); + children.add(new WeakReference(child)); + } + + // Second, make sure all the memory is allocated + Vector garbage = new Vector(); + while (true) + { + try + { + garbage.add(new byte[1000]); + } + catch (OutOfMemoryError e) + { + break; + } + } + + // Third, make sure all the weak references are null + for (WeakReference ref : children) + { + if (ref.get() != null) + { + throw new RuntimeException("Test FAILED: some of child windows are not GCed"); + } + } + + // Fourth, make sure owner's children list contains no elements + try + { + Field f = Window.class.getDeclaredField("ownedWindowList"); + f.setAccessible(true); + Vector ownersChildren = (Vector)f.get(owner); + if (ownersChildren.size() > 0) + { + throw new RuntimeException("Test FAILED: some of the child windows are not removed from owner's children list"); + } + } + catch (NoSuchFieldException z) + { + System.out.println("Test PASSED: no 'ownedWindowList' field in Window class"); + return; + } + catch (Exception z) + { + throw new RuntimeException("Test FAILED: unexpected exception", z); + } + + // Test passed + System.out.println("Test PASSED"); + + owner.dispose(); + } +} diff --git a/jdk/test/java/awt/event/InputEvent/ButtonArraysEquality/ButtonArraysEquality.java b/jdk/test/java/awt/event/InputEvent/ButtonArraysEquality/ButtonArraysEquality.java new file mode 100644 index 00000000000..80823918e32 --- /dev/null +++ b/jdk/test/java/awt/event/InputEvent/ButtonArraysEquality/ButtonArraysEquality.java @@ -0,0 +1,83 @@ +/* + @test %I% %E% + @bug 6315717 + @summary verifies that InputEvents button masks arrays are the same + @author Andrei Dmitriev : area=awt.event + @run main ButtonArraysEquality + */ + +import java.awt.*; +import java.awt.event.*; +import java.lang.reflect.*; +import java.security.AccessController; +import java.security.PrivilegedAction; + +// get array InputEvent.BUTTON_MASK via reflection +// get array InputEvent.BUTTON_DOWN_MASK via reflection +// compare their lengths and values + +public class ButtonArraysEquality { + static int [] eventDownMask = new int []{InputEvent.BUTTON1_DOWN_MASK, InputEvent.BUTTON2_DOWN_MASK, InputEvent.BUTTON3_DOWN_MASK}; + + public static void main(String []s){ + int [] buttonDownMasksAPI = new int [MouseInfo.getNumberOfButtons()]; + for (int i = 0; i < MouseInfo.getNumberOfButtons(); i++){ + buttonDownMasksAPI[i] = InputEvent.getMaskForButton(i+1); + System.out.println("TEST: "+buttonDownMasksAPI[i]); + } + + // getButtonDownMasks() + Object obj = AccessController.doPrivileged( + new PrivilegedAction() { + public Object run() { + try { + Class clazz = Class.forName("java.awt.event.InputEvent"); + Method method = clazz.getDeclaredMethod("getButtonDownMasks",new Class [] {}); + if (method != null) { + method.setAccessible(true); + return method.invoke(null, (Object[])null); + } + }catch (Exception e){ + throw new RuntimeException("Test failed. Exception occured:", e); + } + return null; + } + }); + + int [] buttonDownMasks = new int [Array.getLength(obj)]; + checkNullAndPutValuesToArray(buttonDownMasks, obj); + + //check lengths: array shouldn't contain less elements then the number of buttons on a mouse + if (buttonDownMasks.length < buttonDownMasksAPI.length){ + throw new RuntimeException("Test failed. The lengths array is less then the number of buttons"); + } + + // verify values for first three buttons + for (int i = 0; i < 3; i++) { + if (eventDownMask[i] != buttonDownMasks[i]) + { + System.out.println("Test : "+ i + " | " + " | " +eventDownMask[i] + " | "+ buttonDownMasks[i]); + throw new RuntimeException("Failure: masks are not correct for standard buttons"); + } + } + + // verify values for extra buttons if any + for (int i = 3; i < MouseInfo.getNumberOfButtons(); i++) { + if (buttonDownMasksAPI[i] != buttonDownMasks[i]) { + throw new RuntimeException("Failure: masks are not the same for extra buttons"); + } + } + System.out.println("Test passed."); + } + + public static void checkNullAndPutValuesToArray(int [] array, Object obj){ + if (obj == null){ + throw new RuntimeException("Test failed. The array obtained via reflection is "+obj); + } + + for (int i = 0; i < Array.getLength(obj); i++){ + System.out.println("Test (Reflection): "+ Array.getInt(obj, i)); + array[i] = Array.getInt(obj, i); + } + } +} diff --git a/jdk/test/java/awt/event/MouseEvent/AcceptExtraButton/AcceptExtraButton.java b/jdk/test/java/awt/event/MouseEvent/AcceptExtraButton/AcceptExtraButton.java new file mode 100644 index 00000000000..802f4cfd6b2 --- /dev/null +++ b/jdk/test/java/awt/event/MouseEvent/AcceptExtraButton/AcceptExtraButton.java @@ -0,0 +1,53 @@ +/* + @test %I% %E% + @bug 6315717 + @summary verifies that MouseEvent CTOR accepts extra mouse button numbers + @author Andrei Dmitriev : area=awt.event + @run main AcceptExtraButton + */ + +//package acceptextrabutton; + +import java.awt.*; +import java.awt.event.MouseEvent; +import java.awt.event.MouseAdapter; + +public class AcceptExtraButton extends Frame { + static int [] eventID = new int []{MouseEvent.MOUSE_PRESSED, MouseEvent.MOUSE_RELEASED, MouseEvent.MOUSE_CLICKED}; + + public static void main(String []s){ + AcceptExtraButton f = new AcceptExtraButton(); + f.setSize(300, 300); + f.setVisible(true); + + for (int buttonId = 0; buttonId>>"+me); + f.dispatchEvent( ( AWTEvent )me ); + } + } + MouseAdapter ma1 = new MouseAdapter() { + public void mousePressed(MouseEvent e) { + System.out.println("PRESSED "+e); + } + public void mouseReleased(MouseEvent e) { + System.out.println("RELEASED "+e); + } + public void mouseClicked(MouseEvent e) { + System.out.println("CLICKED "+e); + } + }; + f.addMouseListener(ma1); + } +} diff --git a/jdk/test/java/awt/event/MouseEvent/CTORRestrictions/CTORRestrictions.java b/jdk/test/java/awt/event/MouseEvent/CTORRestrictions/CTORRestrictions.java new file mode 100644 index 00000000000..d4611158553 --- /dev/null +++ b/jdk/test/java/awt/event/MouseEvent/CTORRestrictions/CTORRestrictions.java @@ -0,0 +1,89 @@ +/* + test %I% %E% + @bug 6315717 + @summary verifies that MouseEvent could be constructed correctly for mouse extra buttons in regard to sun.awt.enableExtraMouseButtons property + @author Andrei Dmitriev : area=awt.event + @run main CTORRestrictions + */ + +/* + * verify that user can create the MouseEvent? with button1|2|3|4|5|... when property "sun.awt.enableExtraMouseButtons" is true by default + */ +import java.awt.*; +import java.awt.event.*; + +public class CTORRestrictions{ + static Frame frame = new Frame("MouseEvent Test Frame"); + static Point mousePosition; + static Point mousePositionOnScreen; + + public static void main(String []s){ + Robot robot = null; + try { + robot = new Robot(); + } catch (AWTException ex) { + throw new RuntimeException("Test Failed", ex); + } + frame.setSize (200,200); + frame.setLocation (300, 400); + frame.setVisible(true); + robot.delay(1000); + System.out.println("sun.awt.enableExtraMouseButtons = "+Toolkit.getDefaultToolkit().getDesktopProperty("sun.awt.enableExtraMouseButtons")); + mousePosition = new Point(100, 100); + mousePositionOnScreen = new Point(frame.getLocationOnScreen().x + mousePosition.x, + frame.getLocationOnScreen().y + mousePosition.y); + + /* + * On Linux the native system count a wheel (both directions) as two more buttons on a mouse. + * So, MouseInfo.getNumberOfButtons() would report 5 buttons on a three-button mouse. + * On Windows it would still report that MouseInfo.getNumberOfButtons() == 3. + * We should handle XToolkit case and iterate through the buttons + * up to (MouseInfo.getNumberOfButtons() - 2) value. + */ + int numberOfButtons; + if (Toolkit.getDefaultToolkit().getClass().getName().equals("sun.awt.windows.WToolkit")){ + numberOfButtons = MouseInfo.getNumberOfButtons(); + } else { + numberOfButtons = MouseInfo.getNumberOfButtons() - 2; + } + System.out.println("Stage 1. Number of buttons = "+ numberOfButtons); + + for (int buttonId = 1; buttonId <= numberOfButtons; buttonId++){ + postMouseEventNewCtor(buttonId); + } + + System.out.println("Stage 2. Number of buttons = "+ numberOfButtons); + for (int buttonId = 1; buttonId <= numberOfButtons; buttonId++){ + postMouseEventOldCtor(buttonId); + } + System.out.println("Test passed."); + } + + public static void postMouseEventNewCtor(int buttonId) { + MouseEvent me = new MouseEvent(frame, + MouseEvent.MOUSE_PRESSED, + System.currentTimeMillis(), + MouseEvent.BUTTON1_DOWN_MASK, + mousePosition.x, mousePosition.y, + mousePositionOnScreen.x, + mousePositionOnScreen.y, + 1, + false, //popupTrigger + buttonId //button + ); + frame.dispatchEvent( ( AWTEvent )me ); + } + + public static void postMouseEventOldCtor(int buttonId) { + MouseEvent meOld = new MouseEvent(frame, + MouseEvent.MOUSE_PRESSED, + System.currentTimeMillis(), + MouseEvent.BUTTON1_DOWN_MASK, + mousePosition.x, mousePosition.y, + 1, + false, //popupTrigger + buttonId //button + ); + frame.dispatchEvent( ( AWTEvent )meOld ); + } +} diff --git a/jdk/test/java/awt/event/MouseEvent/CTORRestrictions/CTORRestrictions_Disable.java b/jdk/test/java/awt/event/MouseEvent/CTORRestrictions/CTORRestrictions_Disable.java new file mode 100644 index 00000000000..aaf1c16c760 --- /dev/null +++ b/jdk/test/java/awt/event/MouseEvent/CTORRestrictions/CTORRestrictions_Disable.java @@ -0,0 +1,101 @@ +/* + test %I% %E% + @bug 6315717 + @summary verifies that MouseEvent could be constructed correctly for mouse extra buttons in regard to sun.awt.enableExtraMouseButtons property + @author Andrei Dmitriev : area=awt.event + @run main/othervm -Dsun.awt.enableExtraMouseButtons=false CTORRestrictions_Disable + */ + +/* + * verify that user can't create the MouseEvent? with button4|5|... when property "sun.awt.enableExtraMouseButtons"=false + * verify that user can create the MouseEvent? with button1|2|3 when property "sun.awt.enableExtraMouseButtons"=false + */ + +import java.awt.*; +import java.awt.event.*; + +public class CTORRestrictions_Disable { + static Frame frame = new Frame("MouseEvent Test Frame"); + static Point mousePosition; + static Point mousePositionOnScreen; + + public static void main(String []s){ + Robot robot = null; + try { + robot = new Robot(); + } catch (AWTException ex) { + throw new RuntimeException("Test Failed", ex); + } + frame.setSize (200,200); + frame.setLocation (300, 400); + frame.setVisible(true); + robot.delay(1000); + System.out.println(Toolkit.getDefaultToolkit().getDesktopProperty("sun.awt.enableExtraMouseButtons")); + mousePosition = new Point(100, 100); + mousePositionOnScreen = new Point(frame.getLocationOnScreen().x + mousePosition.x, + frame.getLocationOnScreen().y + mousePosition.y); + + System.out.println("Stage 1"); + for (int buttonId = 1; buttonId <= MouseInfo.getNumberOfButtons(); buttonId++){ + try { + postMouseEventNewCtor(buttonId); + if (buttonId > 3) { + throw new RuntimeException("Stage 1 FAILED: MouseEvent CTOR accepted the extra button " + (buttonId+1) + " instead of throwing an exception."); + } + } catch (IllegalArgumentException e){ + if (buttonId > 3) { + System.out.println("Passed: an exception caught for extra button."); + } else { + throw new RuntimeException("Stage 1 FAILED : exception happen on standard button.", e); + } + } + } + + System.out.println("Stage 2"); + for (int buttonId = 1; buttonId <= MouseInfo.getNumberOfButtons(); buttonId++){ + try { + postMouseEventOldCtor(buttonId); + if (buttonId > 3) { + throw new RuntimeException("Stage 2 FAILED: MouseEvent CTOR accepted the extra button " + (buttonId+1) + " instead of throwing an exception."); + } + } catch (IllegalArgumentException e){ + if (buttonId > 3) { + System.out.println("Passed: an exception caught for extra button."); + } else { + throw new RuntimeException("Stage 2 FAILED : exception happen on standard button.", e); + } + } + } + System.out.println("Test passed."); + } + + public static void postMouseEventNewCtor(int buttonId) { + MouseEvent me = new MouseEvent(frame, + MouseEvent.MOUSE_PRESSED, + System.currentTimeMillis(), + MouseEvent.BUTTON1_DOWN_MASK, + mousePosition.x, mousePosition.y, + mousePositionOnScreen.x, + mousePositionOnScreen.y, + 1, + false, //popupTrigger + buttonId //button + ); + frame.dispatchEvent( ( AWTEvent )me ); + } + + public static void postMouseEventOldCtor(int buttonId) { + MouseEvent meOld = new MouseEvent(frame, + MouseEvent.MOUSE_PRESSED, + System.currentTimeMillis(), + MouseEvent.BUTTON1_DOWN_MASK, + mousePosition.x, mousePosition.y, + 1, + false, //popupTrigger + buttonId //button + ); + frame.dispatchEvent( ( AWTEvent )meOld ); + } +} + + diff --git a/jdk/test/java/awt/event/MouseEvent/CheckGetMaskForButton/CheckGetMaskForButton.java b/jdk/test/java/awt/event/MouseEvent/CheckGetMaskForButton/CheckGetMaskForButton.java new file mode 100644 index 00000000000..2f62521f58d --- /dev/null +++ b/jdk/test/java/awt/event/MouseEvent/CheckGetMaskForButton/CheckGetMaskForButton.java @@ -0,0 +1,65 @@ +/* + @test %I% %E% + @bug 6315717 + @summary verifies that InputEvent.getMaskForButton() returns the same values as in InputEvent.BUTTON_DOWN_MASK + @author Andrei Dmitriev : area=awt.event + @run main CheckGetMaskForButton +*/ + +import java.awt.*; +import java.awt.event.InputEvent; +import java.lang.reflect.*; +import java.security.AccessController; +import java.security.PrivilegedAction; + +public class CheckGetMaskForButton{ + static Robot robot; + + public static void main(String []s){ + System.out.println("Number Of Buttons = "+ MouseInfo.getNumberOfButtons()); + CheckGetMaskForButton f = new CheckGetMaskForButton(); + int [] buttonMasksViaAPI = new int[MouseInfo.getNumberOfButtons()]; + for (int i = 0; i < MouseInfo.getNumberOfButtons(); i++){ + buttonMasksViaAPI[i] = InputEvent.getMaskForButton(i+1); + System.out.println("Test (API): "+ buttonMasksViaAPI[i]); + } + + //get same array via reflection + Object obj = AccessController.doPrivileged( + new PrivilegedAction() { + public Object run() { + try { + Class clazz = Class.forName("java.awt.event.InputEvent"); + Method method = clazz.getDeclaredMethod("getButtonDownMasks",new Class [] {}); + if (method != null) { + method.setAccessible(true); + return method.invoke(null, (Object[])null); + } + }catch (Exception e){ + throw new RuntimeException("Test failed. Exception occured:", e); + } + return null; + } + }); + + if (obj == null){ + throw new RuntimeException("Test failed. The value obtained via reflection is "+obj); + } + + int [] buttonDownMasksViaReflection = new int [Array.getLength(obj)]; + //check that length of API array greater or equals then Reflect array. + if (Array.getLength(obj) < buttonMasksViaAPI.length){ + throw new RuntimeException("Test failed. The length of API array greater or equals then the length of Reflect array."); + } + + //Check that the values obtained via reflection from InputEvent.BUTTON_DOWN_MASK are the + // same as for standard API. + for (int i = 0; i < MouseInfo.getNumberOfButtons(); i++){ + System.out.println("Test (Reflection): "+ Array.getInt(obj, i)); + if (buttonMasksViaAPI[i] != Array.getInt(obj, i)){ + throw new RuntimeException("Test failed. Values of InputEvent array are different for API and Reflection invocations"); + } + } + System.out.println("Test passed."); + } +} diff --git a/jdk/test/java/beans/EventHandler/Test6788531.java b/jdk/test/java/beans/EventHandler/Test6788531.java new file mode 100644 index 00000000000..1754f5bc552 --- /dev/null +++ b/jdk/test/java/beans/EventHandler/Test6788531.java @@ -0,0 +1,66 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6788531 + * @summary Tests public method lookup problem in EventHandler + * @author Sergey Malenkov + */ + +import javax.swing.JButton; +import java.awt.event.ActionListener; +import java.beans.EventHandler; + +public class Test6788531 { + public static void main(String[] args) throws Exception { + JButton button = new JButton("hi"); + button.addActionListener(EventHandler.create(ActionListener.class, new Private(), "run")); + button.addActionListener(EventHandler.create(ActionListener.class, new PrivateGeneric(), "run", "generic")); + button.doClick(); + } + + public static class Public { + public void run() { + throw new Error("method is overridden"); + } + } + + static class Private extends Public { + public void run() { + System.out.println("default"); + } + } + + public static class PublicGeneric { + public void run(T object) { + throw new Error("method is overridden"); + } + } + + static class PrivateGeneric extends PublicGeneric { + public void run(String string) { + System.out.println(string); + } + } +} diff --git a/jdk/test/java/beans/PropertyEditor/TestEnumSubclass.java b/jdk/test/java/beans/PropertyEditor/TestEnumSubclass.java new file mode 100644 index 00000000000..f1d5f78c5d2 --- /dev/null +++ b/jdk/test/java/beans/PropertyEditor/TestEnumSubclass.java @@ -0,0 +1,50 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6736248 + * @summary Tests PropertyEditor for value of subtype Enum with security manager + * @author Sergey Malenkov + */ + +public class TestEnumSubclass { + public static void main(String[] args) { + System.setSecurityManager(new SecurityManager()); + new TestEditor(Operation.class); + } + + public enum Operation { + PLUS { + public int run(int i, int j) { + return i + j; + } + }, + MINUS { + public int run(int i, int j) { + return i - j; + } + }; + public abstract int run(int i, int j); + } +} diff --git a/jdk/test/java/beans/PropertyEditor/TestEnumSubclassJava.java b/jdk/test/java/beans/PropertyEditor/TestEnumSubclassJava.java new file mode 100644 index 00000000000..296d1f31d1c --- /dev/null +++ b/jdk/test/java/beans/PropertyEditor/TestEnumSubclassJava.java @@ -0,0 +1,49 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6736248 + * @summary Tests PropertyEditor for value of subtype Enum + * @author Sergey Malenkov + */ + +public class TestEnumSubclassJava { + public static void main(String[] args) { + new TestEditor(Operation.class).testJava(Operation.PLUS); + } + + public enum Operation { + PLUS { + public int run(int i, int j) { + return i + j; + } + }, + MINUS { + public int run(int i, int j) { + return i - j; + } + }; + public abstract int run(int i, int j); + } +} diff --git a/jdk/test/java/beans/PropertyEditor/TestEnumSubclassNull.java b/jdk/test/java/beans/PropertyEditor/TestEnumSubclassNull.java new file mode 100644 index 00000000000..2a407bf9998 --- /dev/null +++ b/jdk/test/java/beans/PropertyEditor/TestEnumSubclassNull.java @@ -0,0 +1,49 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6736248 + * @summary Tests PropertyEditor for null value of subtype Enum + * @author Sergey Malenkov + */ + +public class TestEnumSubclassNull { + public static void main(String[] args) { + new TestEditor(Operation.class).testJava(null); + } + + public enum Operation { + PLUS { + public int run(int i, int j) { + return i + j; + } + }, + MINUS { + public int run(int i, int j) { + return i - j; + } + }; + public abstract int run(int i, int j); + } +} diff --git a/jdk/test/java/beans/PropertyEditor/TestEnumSubclassValue.java b/jdk/test/java/beans/PropertyEditor/TestEnumSubclassValue.java new file mode 100644 index 00000000000..5c0e970f569 --- /dev/null +++ b/jdk/test/java/beans/PropertyEditor/TestEnumSubclassValue.java @@ -0,0 +1,53 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6736248 + * @summary Tests PropertyEditor for value of subtype Enum + * @author Sergey Malenkov + */ + +public class TestEnumSubclassValue { + public static void main(String[] args) { + TestEditor test = new TestEditor(Operation.class); + test.testValue(Operation.PLUS, "PLUS"); + test.testValue(null, null); + test.testText("MINUS", Operation.MINUS); + test.testText(null, null); + } + + public enum Operation { + PLUS { + public int run(int i, int j) { + return i + j; + } + }, + MINUS { + public int run(int i, int j) { + return i - j; + } + }; + public abstract int run(int i, int j); + } +} diff --git a/jdk/test/java/beans/Statement/Test6788531.java b/jdk/test/java/beans/Statement/Test6788531.java new file mode 100644 index 00000000000..637b4bd7020 --- /dev/null +++ b/jdk/test/java/beans/Statement/Test6788531.java @@ -0,0 +1,62 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6788531 + * @summary Tests public method lookup problem in Statement + * @author Sergey Malenkov + */ + +import java.beans.Statement; + +public class Test6788531 { + public static void main(String[] args) throws Exception { + new Statement(new Private(), "run", null).execute(); + new Statement(new PrivateGeneric(), "run", new Object[] {"generic"}).execute(); + } + + public static class Public { + public void run() { + throw new Error("method is overridden"); + } + } + + static class Private extends Public { + public void run() { + System.out.println("default"); + } + } + + public static class PublicGeneric { + public void run(T object) { + throw new Error("method is overridden"); + } + } + + static class PrivateGeneric extends PublicGeneric { + public void run(String string) { + System.out.println(string); + } + } +} diff --git a/jdk/test/java/beans/XMLDecoder/Test4864117.java b/jdk/test/java/beans/XMLDecoder/Test4864117.java new file mode 100644 index 00000000000..a3459f918c6 --- /dev/null +++ b/jdk/test/java/beans/XMLDecoder/Test4864117.java @@ -0,0 +1,146 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4864117 + * @summary Tests XMLDecoder within another DefaultHandler for SAX parser + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; +import java.beans.ExceptionListener; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.io.IOException; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +public final class Test4864117 extends DefaultHandler implements ExceptionListener { + private static final String TEST = "test"; + private static final String DATA + = "\n" + + " \n" + + " Hello, world!\n" + + " \n" + + ""; + + public static void main(String[] args) { + Test4864117 test = new Test4864117(); + InputStream input = new ByteArrayInputStream(DATA.getBytes()); + Exception error = null; + try { + SAXParserFactory.newInstance().newSAXParser().parse(input, test); + } + catch (ParserConfigurationException exception) { + error = exception; + } + catch (SAXException exception) { + error = exception.getException(); + if (error == null) { + error = exception; + } + } + catch (IOException exception) { + error = exception; + } + if (error != null) { + throw new Error("unexpected error", error); + } + test.print('?', test.getMessage()); + } + + private String message; + + public String getMessage() { + if (this.message == null) { + throw new Error("owner's method is not called"); + } + return this.message; + } + + public void setMessage(String message) { + this.message = message; + print(':', this.message); + } + + // DefaultHandler implementation + + private DefaultHandler handler; + private int depth; + + @Override + public void startDocument() throws SAXException { + this.handler = XMLDecoder.createHandler(this, this, null); + this.handler.startDocument(); + } + + @Override + public void endDocument() { + this.handler = null; + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + print('>', qName); + if (this.depth > 0) { + this.handler.startElement(uri, localName, qName, attributes); + } else if (!TEST.equals(qName)) { + throw new SAXException("unexpected element name: " + qName); + } + this.depth++; + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + this.depth--; + print('<', qName); + if (this.depth > 0) { + this.handler.endElement(uri, localName, qName); + } else if (!TEST.equals(qName)) { + throw new SAXException("unexpected element name: " + qName); + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + this.handler.characters(ch, start, length); + } + + public void exceptionThrown(Exception exception) { + throw new Error("unexpected exception", exception); + } + + private void print(char ch, String name) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < this.depth; i++) sb.append(' '); + sb.append(ch).append(' ').append(name); + System.out.println(sb.toString()); + } +} diff --git a/jdk/test/java/beans/XMLDecoder/Test6341798.java b/jdk/test/java/beans/XMLDecoder/Test6341798.java index 2bc43e87565..677ff842352 100644 --- a/jdk/test/java/beans/XMLDecoder/Test6341798.java +++ b/jdk/test/java/beans/XMLDecoder/Test6341798.java @@ -1,5 +1,5 @@ /* - * Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 Sun Microsystems, Inc. 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 @@ -39,7 +39,7 @@ public class Test6341798 { private static final String DATA = "\n" - + " \n" + + " \n" + " \n" + " true\n" + " \n" diff --git a/jdk/test/java/beans/XMLDecoder/spec/AbstractTest.java b/jdk/test/java/beans/XMLDecoder/spec/AbstractTest.java new file mode 100644 index 00000000000..2b8abb2af9e --- /dev/null +++ b/jdk/test/java/beans/XMLDecoder/spec/AbstractTest.java @@ -0,0 +1,76 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +import java.beans.ExceptionListener; +import java.beans.XMLDecoder; + +import java.io.ByteArrayInputStream; + +abstract class AbstractTest implements ExceptionListener { + public void exceptionThrown(Exception exception) { + throw new Error("unexpected exception", exception); + } + + /** + * Validates the XML decoder for XML archive + * that defined in the public field of the subclass. + * + * @param decoder the initialized XML decoder + * @throws Error if validation failed + */ + protected abstract void validate(XMLDecoder decoder); + + /** + * This is entry point to start testing. + * + * @param security use {@code true} to start + * second pass in secure context + */ + final void test(boolean security) { + byte[] array = getFieldValue("XML").getBytes(); // NON-NLS: the field name + ByteArrayInputStream input = new ByteArrayInputStream(array); + XMLDecoder decoder = new XMLDecoder(input); + decoder.setExceptionListener(this); + validate(decoder); + try { + throw new Error("unexpected object" + decoder.readObject()); + } catch (ArrayIndexOutOfBoundsException exception) { + // expected exception + } + decoder.close(); + if (security) { + System.setSecurityManager(new SecurityManager()); + test(false); + } + } + + private String getFieldValue(String field) { + try { + return getClass().getField(field).get(this).toString(); + } catch (NoSuchFieldException exception) { + throw new Error("unexpected exception", exception); + } catch (IllegalAccessException exception) { + throw new Error("unexpected exception", exception); + } + } +} diff --git a/jdk/test/java/beans/XMLDecoder/spec/TestArray.java b/jdk/test/java/beans/XMLDecoder/spec/TestArray.java new file mode 100644 index 00000000000..7ae34a148e5 --- /dev/null +++ b/jdk/test/java/beans/XMLDecoder/spec/TestArray.java @@ -0,0 +1,86 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; +import java.lang.reflect.Array; + +public final class TestArray extends AbstractTest { + public static final String XML + = "\n" + + " \n" + + " -111\n" + + " 1111\n" + + " \n" + + " \n" + + " \n" + + " Hello, world!\n" + + " \n" + + " \n" + + ""; + + public static void main(String[] args) { + new TestArray().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + Number[] numbers = getArray(Number.class, 2, decoder.readObject()); + if (!numbers[0].equals(Byte.valueOf("-111"))) { // NON-NLS: hardcoded in XML + throw new Error("unexpected byte value"); + } + if (!numbers[1].equals(Long.valueOf("1111"))) { // NON-NLS: hardcoded in XML + throw new Error("unexpected long value"); + } + + Object[] objects = getArray(Object.class, 3, decoder.readObject()); + if (objects[0] != null) { + throw new Error("unexpected first value"); + } + if (!objects[1].equals("Hello, world!")) { // NON-NLS: hardcoded in XML + throw new Error("unexpected string value"); + } + if (objects[2] != null) { + throw new Error("unexpected last value"); + } + } + + private static T[] getArray(Class component, int length, Object object) { + Class type = object.getClass(); + if (!type.isArray()) { + throw new Error("array expected"); + } + if (!type.getComponentType().equals(component)) { + throw new Error("unexpected component type"); + } + if (length != Array.getLength(object)) { + throw new Error("unexpected array length"); + } + return (T[]) object; + } +} diff --git a/jdk/test/java/beans/XMLDecoder/spec/TestBoolean.java b/jdk/test/java/beans/XMLDecoder/spec/TestBoolean.java new file mode 100644 index 00000000000..e24d1fb4f72 --- /dev/null +++ b/jdk/test/java/beans/XMLDecoder/spec/TestBoolean.java @@ -0,0 +1,52 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestBoolean extends AbstractTest { + public static final String XML + = "\n" + + " true\n" + + " false\n" + + ""; + + public static void main(String[] args) { + new TestBoolean().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + if (!Boolean.TRUE.equals(decoder.readObject())) { + throw new Error("true expected"); + } + if (!Boolean.FALSE.equals(decoder.readObject())) { + throw new Error("false expected"); + } + } +} diff --git a/jdk/test/java/beans/XMLDecoder/spec/TestByte.java b/jdk/test/java/beans/XMLDecoder/spec/TestByte.java new file mode 100644 index 00000000000..46693d94c0b --- /dev/null +++ b/jdk/test/java/beans/XMLDecoder/spec/TestByte.java @@ -0,0 +1,56 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestByte extends AbstractTest { + public static final String XML + = "\n" + + " 0\n" + + " 127\n" + + " -128\n" + + ""; + + public static void main(String[] args) { + new TestByte().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + validate((byte) 0, decoder.readObject()); + validate(Byte.MAX_VALUE, decoder.readObject()); + validate(Byte.MIN_VALUE, decoder.readObject()); + } + + private static void validate(byte value, Object object) { + if (!object.equals(Byte.valueOf(value))) { + throw new Error("byte " + value + " expected"); + } + } +} diff --git a/jdk/test/java/beans/XMLDecoder/spec/TestChar.java b/jdk/test/java/beans/XMLDecoder/spec/TestChar.java new file mode 100644 index 00000000000..cb29b713bce --- /dev/null +++ b/jdk/test/java/beans/XMLDecoder/spec/TestChar.java @@ -0,0 +1,52 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestChar extends AbstractTest { + public static final String XML + = "\n" + + " X\n" + + " \n" + + ""; + + public static void main(String[] args) { + new TestChar().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + if (!decoder.readObject().equals(Character.valueOf('X'))) { + throw new Error("unexpected character"); + } + if (!decoder.readObject().equals(Character.valueOf((char) 0x20))) { + throw new Error("unexpected character code"); + } + } +} diff --git a/jdk/test/java/beans/XMLDecoder/spec/TestClass.java b/jdk/test/java/beans/XMLDecoder/spec/TestClass.java new file mode 100644 index 00000000000..2c16ba75f3c --- /dev/null +++ b/jdk/test/java/beans/XMLDecoder/spec/TestClass.java @@ -0,0 +1,61 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestClass extends AbstractTest { + public static final String PREFIX = "javax.swing.colorchooser."; + public static final String INTERFACE = "ColorSelectionModel"; + public static final String PUBLIC_CLASS = "DefaultColorSelectionModel"; + public static final String PRIVATE_CLASS = "DiagramComponent"; + public static final String XML + = "\n" + + " " + PREFIX + INTERFACE + "\n" + + " " + PREFIX + PUBLIC_CLASS + "\n" + + " " + PREFIX + PRIVATE_CLASS + "\n" + + ""; + + public static void main(String[] args) { + new TestClass().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + validate(PREFIX + INTERFACE, decoder.readObject()); + validate(PREFIX + PUBLIC_CLASS, decoder.readObject()); + validate(PREFIX + PRIVATE_CLASS, decoder.readObject()); + } + + private static void validate(String name, Object object) { + Class type = (Class) object; + if (!type.getName().equals(name)) { + throw new Error(name + " expected"); + } + } +} diff --git a/jdk/test/java/beans/XMLDecoder/spec/TestDouble.java b/jdk/test/java/beans/XMLDecoder/spec/TestDouble.java new file mode 100644 index 00000000000..8e3d918c886 --- /dev/null +++ b/jdk/test/java/beans/XMLDecoder/spec/TestDouble.java @@ -0,0 +1,58 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestDouble extends AbstractTest { + public static final String XML + = "\n" + + " 0\n" + + " 1000\n" + + " -1.1e15\n" + + " 10.11e-123\n" + + ""; + + public static void main(String[] args) { + new TestDouble().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + validate(0.0, decoder.readObject()); + validate(1000.0, decoder.readObject()); + validate(-1.1e15, decoder.readObject()); + validate(10.11e-123, decoder.readObject()); + } + + private static void validate(double value, Object object) { + if (!object.equals(Double.valueOf(value))) { + throw new Error("double " + value + " expected"); + } + } +} diff --git a/jdk/test/java/beans/XMLDecoder/spec/TestFalse.java b/jdk/test/java/beans/XMLDecoder/spec/TestFalse.java new file mode 100644 index 00000000000..57a81b87740 --- /dev/null +++ b/jdk/test/java/beans/XMLDecoder/spec/TestFalse.java @@ -0,0 +1,48 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestFalse extends AbstractTest { + public static final String XML + = "\n" + + " \n" + + ""; + + public static void main(String[] args) { + new TestFalse().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + if (!Boolean.FALSE.equals(decoder.readObject())) { + throw new Error("false expected"); + } + } +} diff --git a/jdk/test/java/beans/XMLDecoder/spec/TestField.java b/jdk/test/java/beans/XMLDecoder/spec/TestField.java new file mode 100644 index 00000000000..aa84408814e --- /dev/null +++ b/jdk/test/java/beans/XMLDecoder/spec/TestField.java @@ -0,0 +1,74 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestField extends AbstractTest { + public static final String XML + = "\n" + + " \n" + + " \n" + + " static postfix\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " postfix\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + ""; + + public static void main(String[] args) { + new TestField().test(true); + } + + public static String FIELD; + public String field; + + @Override + protected void validate(XMLDecoder decoder) { + FIELD = "static prefix"; + field = "prefix"; + decoder.setOwner(this); + validate(decoder, "static prefix"); + validate(decoder, "static postfix"); + validate(decoder, "prefix"); + validate(decoder, "postfix"); + } + + private static void validate(XMLDecoder decoder, String name) { + if (!decoder.readObject().equals(name)) { + throw new Error(name + " expected"); + } + } +} diff --git a/jdk/test/java/beans/XMLDecoder/spec/TestFloat.java b/jdk/test/java/beans/XMLDecoder/spec/TestFloat.java new file mode 100644 index 00000000000..bb1287f8804 --- /dev/null +++ b/jdk/test/java/beans/XMLDecoder/spec/TestFloat.java @@ -0,0 +1,58 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestFloat extends AbstractTest { + public static final String XML + = "\n" + + " 0\n" + + " 100\n" + + " -1e15\n" + + " 100e-20\n" + + ""; + + public static void main(String[] args) { + new TestFloat().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + validate(0.0f, decoder.readObject()); + validate(100.0f, decoder.readObject()); + validate(-1e15f, decoder.readObject()); + validate(100e-20f, decoder.readObject()); + } + + private static void validate(float value, Object object) { + if (!object.equals(Float.valueOf(value))) { + throw new Error("float " + value + " expected"); + } + } +} diff --git a/jdk/test/java/beans/XMLDecoder/spec/TestInt.java b/jdk/test/java/beans/XMLDecoder/spec/TestInt.java new file mode 100644 index 00000000000..531c9447b64 --- /dev/null +++ b/jdk/test/java/beans/XMLDecoder/spec/TestInt.java @@ -0,0 +1,64 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestInt extends AbstractTest { + public static final String XML + = "\n" + + " 0\n" + + " 127\n" + + " -128\n" + + " 32767\n" + + " -32768\n" + + " 2147483647\n" + + " -2147483648\n" + + ""; + + public static void main(String[] args) { + new TestInt().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + validate(0, decoder.readObject()); + validate((int) Byte.MAX_VALUE, decoder.readObject()); + validate((int) Byte.MIN_VALUE, decoder.readObject()); + validate((int) Short.MAX_VALUE, decoder.readObject()); + validate((int) Short.MIN_VALUE, decoder.readObject()); + validate(Integer.MAX_VALUE, decoder.readObject()); + validate(Integer.MIN_VALUE, decoder.readObject()); + } + + private static void validate(int value, Object object) { + if (!object.equals(Integer.valueOf(value))) { + throw new Error("int " + value + " expected"); + } + } +} diff --git a/jdk/test/java/beans/XMLDecoder/spec/TestJava.java b/jdk/test/java/beans/XMLDecoder/spec/TestJava.java new file mode 100644 index 00000000000..5786195aaa0 --- /dev/null +++ b/jdk/test/java/beans/XMLDecoder/spec/TestJava.java @@ -0,0 +1,63 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestJava extends AbstractTest { + public static final String XML + = "\n" + + " \n" + + " \n" + + " Hello, world!\n" + + " \n" + + " \n" + + " \n" + + ""; + + public static void main(String[] args) { + new TestJava().test(true); + } + + private String message; + + public void init(String message) { + this.message = message; + } + + @Override + protected void validate(XMLDecoder decoder) { + decoder.setOwner(this); + if (this != decoder.readObject()) { + throw new Error("owner should be the same"); + } + if (this.message == null) { + throw new Error("owner's method is not called"); + } + } +} diff --git a/jdk/test/java/beans/XMLDecoder/spec/TestLong.java b/jdk/test/java/beans/XMLDecoder/spec/TestLong.java new file mode 100644 index 00000000000..16a7e324014 --- /dev/null +++ b/jdk/test/java/beans/XMLDecoder/spec/TestLong.java @@ -0,0 +1,68 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestLong extends AbstractTest { + public static final String XML + = "\n" + + " 0\n" + + " 127\n" + + " -128\n" + + " 32767\n" + + " -32768\n" + + " 2147483647\n" + + " -2147483648\n" + + " 9223372036854775807\n" + + " -9223372036854775808\n" + + ""; + + public static void main(String[] args) { + new TestLong().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + validate(0L, decoder.readObject()); + validate((long) Byte.MAX_VALUE, decoder.readObject()); + validate((long) Byte.MIN_VALUE, decoder.readObject()); + validate((long) Short.MAX_VALUE, decoder.readObject()); + validate((long) Short.MIN_VALUE, decoder.readObject()); + validate((long) Integer.MAX_VALUE, decoder.readObject()); + validate((long) Integer.MIN_VALUE, decoder.readObject()); + validate(Long.MAX_VALUE, decoder.readObject()); + validate(Long.MIN_VALUE, decoder.readObject()); + } + + private static void validate(long value, Object object) { + if (!object.equals(Long.valueOf(value))) { + throw new Error("long " + value + " expected"); + } + } +} diff --git a/jdk/test/java/beans/XMLDecoder/spec/TestMethod.java b/jdk/test/java/beans/XMLDecoder/spec/TestMethod.java new file mode 100644 index 00000000000..01ee5e1cf95 --- /dev/null +++ b/jdk/test/java/beans/XMLDecoder/spec/TestMethod.java @@ -0,0 +1,178 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestMethod extends AbstractTest { + public static final String XML + = "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + ""; + + public static void main(String[] args) { + new TestMethod().test(true); + } + + private NoSuchMethodException exception; + + @Override + public void exceptionThrown(Exception exception) { + if (this.exception != null) { + // only one exception allowed + super.exceptionThrown(exception); + } else if (exception instanceof NoSuchMethodException) { + // expected exception: ambiguous methods are found + this.exception = (NoSuchMethodException) exception; + } else { + super.exceptionThrown(exception); + } + } + + @Override + protected void validate(XMLDecoder decoder) { + this.exception = null; + validate(decoder, A.class); + validate(decoder, B.class); + validate(decoder, C.class); + validate(decoder, D.class); + validate(decoder, E.class); + if (this.exception == null) { + throw new Error("NoSuchMethodException expected"); + } + } + + private static void validate(XMLDecoder decoder, Class type) { + if (!type.equals(decoder.readObject().getClass())) { + throw new Error("unexpected class"); + } + } + + /** + * All ambiguous method declarations should fail. + */ + public static class A { + public void m(X x1, X x2) { + throw new Error("A.m(X,X) should not be called"); + } + + public void m(X x1, Y y2) { + throw new Error("A.m(X,Y) should not be called"); + } + + public void m(Y y1, X x2) { + throw new Error("A.m(Y,X) should not be called"); + } + } + + /** + * The most specific method in this case would be the second declaration. + */ + public static class B { + public void m(X x1, X x2) { + throw new Error("B.m(X,X) should not be called"); + } + + public void m(X x1, Y y2) { + // expected: B.m(X,Y) should be called + } + } + + /** + * The most specific method in this case would be the first declaration. + */ + public static class C { + public void m(Y y1, Y y2) { + // expected: C.m(Y,Y) should be called + } + + public void m(X x1, X x2) { + throw new Error("C.m(X,X) should not be called"); + } + } + + /** + * Same as the previous case but flip methods. + */ + public static class D { + public void m(X x1, X x2) { + throw new Error("D.m(X,X) should not be called"); + } + + public void m(Y y1, Y y2) { + // expected: D.m(Y,Y) should be called + } + } + + /** + * The method should be called with (Z,Z). + */ + public static class E { + public void m(X x1, X x2) { + // expected: E.m(X,X) should be called + } + } + + public static class X { + } + + public static class Y extends X { + } + + public static class Z extends Y { + } +} diff --git a/jdk/test/java/beans/XMLDecoder/spec/TestNew.java b/jdk/test/java/beans/XMLDecoder/spec/TestNew.java new file mode 100644 index 00000000000..3e1e86d9951 --- /dev/null +++ b/jdk/test/java/beans/XMLDecoder/spec/TestNew.java @@ -0,0 +1,90 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; +import java.util.ArrayList; +import java.util.List; + +public final class TestNew extends AbstractTest { + public static final String XML + = "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " single\n" + + " \n" + + " \n" + + " first\n" + + " second\n" + + " third\n" + + " \n" + + ""; + + public static void main(String[] args) { + new TestNew().test(true); + } + + private List list; + + public TestNew(String...messages) { + if (messages != null) { + this.list = new ArrayList(); + for (String message : messages) { + this.list.add(message); + } + } + } + + @Override + public boolean equals(Object object) { + if (object instanceof TestNew) { + TestNew test = (TestNew) object; + return (test.list == null) + ? this.list == null + : test.list.equals(this.list); + } + return false; + } + + @Override + protected void validate(XMLDecoder decoder) { + validate(decoder.readObject()); + validate(decoder.readObject(), null); + validate(decoder.readObject(), "single"); + validate(decoder.readObject(), "first", "second", "third"); + } + + private static void validate(Object object, String...messages) { + if (!object.equals(new TestNew(messages))) { + throw new Error("expected object"); + } + } +} diff --git a/jdk/test/java/beans/XMLDecoder/spec/TestNull.java b/jdk/test/java/beans/XMLDecoder/spec/TestNull.java new file mode 100644 index 00000000000..e14bf951e58 --- /dev/null +++ b/jdk/test/java/beans/XMLDecoder/spec/TestNull.java @@ -0,0 +1,48 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestNull extends AbstractTest { + public static final String XML + = "\n" + + " \n" + + ""; + + public static void main(String[] args) { + new TestNull().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + if (null != decoder.readObject()) { + throw new Error("null value expected"); + } + } +} diff --git a/jdk/test/java/beans/XMLDecoder/spec/TestObject.java b/jdk/test/java/beans/XMLDecoder/spec/TestObject.java new file mode 100644 index 00000000000..d9531b3d646 --- /dev/null +++ b/jdk/test/java/beans/XMLDecoder/spec/TestObject.java @@ -0,0 +1,84 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.SwingConstants; + +public final class TestObject extends AbstractTest { + public static final String XML // TODO + = "\n" + + " \n" + + " \n" + + " \n" + + " button\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " label\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + ""; + + public static void main(String[] args) { + new TestObject().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + JPanel panel = (JPanel) decoder.readObject(); + if (2 != panel.getComponents().length) { + throw new Error("unexpected component count"); + } + JButton button = (JButton) panel.getComponents()[0]; + if (!button.getText().equals("button")) { // NON-NLS: hardcoded in XML + throw new Error("unexpected button text"); + } + if (SwingConstants.CENTER != button.getVerticalAlignment()) { + throw new Error("unexpected vertical alignment"); + } + JLabel label = (JLabel) panel.getComponents()[1]; + if (!label.getText().equals("label")) { // NON-NLS: hardcoded in XML + throw new Error("unexpected label text"); + } + if (button != label.getLabelFor()) { + throw new Error("unexpected component"); + } + } +} diff --git a/jdk/test/java/beans/XMLDecoder/spec/TestProperty.java b/jdk/test/java/beans/XMLDecoder/spec/TestProperty.java new file mode 100644 index 00000000000..e1f9c77e445 --- /dev/null +++ b/jdk/test/java/beans/XMLDecoder/spec/TestProperty.java @@ -0,0 +1,88 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestProperty extends AbstractTest { + public static final String XML + = "\n" + + " \n" + + " \n" + + " message\n" + + " \n" + + " \n" + + " \n" + + " indexed\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + ""; + + public static void main(String[] args) { + new TestProperty().test(true); + } + + private int index; + private String message; + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getIndexed(int index) { + if (this.index != index) { + throw new Error("unexpected index"); + } + return this.message; + } + + public void setIndexed(int index, String message) { + this.index = index; + this.message = message; + } + + @Override + protected void validate(XMLDecoder decoder) { + decoder.setOwner(this); + validate(decoder, "message"); + validate(decoder, "indexed"); + } + + private static void validate(XMLDecoder decoder, String name) { + if (!decoder.readObject().equals(name)) { + throw new Error(name + " expected"); + } + } +} diff --git a/jdk/test/java/beans/XMLDecoder/spec/TestShort.java b/jdk/test/java/beans/XMLDecoder/spec/TestShort.java new file mode 100644 index 00000000000..99a0c57d357 --- /dev/null +++ b/jdk/test/java/beans/XMLDecoder/spec/TestShort.java @@ -0,0 +1,60 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestShort extends AbstractTest { + public static final String XML + = "\n" + + " 0\n" + + " 127\n" + + " -128\n" + + " 32767\n" + + " -32768\n" + + ""; + + public static void main(String[] args) { + new TestShort().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + validate((short) 0, decoder.readObject()); + validate((short) Byte.MAX_VALUE, decoder.readObject()); + validate((short) Byte.MIN_VALUE, decoder.readObject()); + validate(Short.MAX_VALUE, decoder.readObject()); + validate(Short.MIN_VALUE, decoder.readObject()); + } + + private static void validate(short value, Object object) { + if (!object.equals(Short.valueOf(value))) { + throw new Error("short " + value + " expected"); + } + } +} diff --git a/jdk/test/java/beans/XMLDecoder/spec/TestString.java b/jdk/test/java/beans/XMLDecoder/spec/TestString.java new file mode 100644 index 00000000000..d41b1bbce38 --- /dev/null +++ b/jdk/test/java/beans/XMLDecoder/spec/TestString.java @@ -0,0 +1,60 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestString extends AbstractTest { + public static final String PREFIX = " prefix "; + public static final String POSTFIX = " postfix "; + public static final String XML + = "\n" + + " " + PREFIX + "\n" + + " " + POSTFIX + "\n" + + " " + PREFIX + POSTFIX + "\n" + + " " + PREFIX + "" + POSTFIX + "\n" + + ""; + + public static void main(String[] args) { + new TestString().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + validate(PREFIX, decoder.readObject()); + validate(POSTFIX, decoder.readObject()); + validate(PREFIX + POSTFIX, decoder.readObject()); + validate(PREFIX + '\u0000' + POSTFIX, decoder.readObject()); + } + + private static void validate(String name, Object object) { + if (!object.equals(name)) { + throw new Error(name + " expected"); + } + } +} diff --git a/jdk/test/java/beans/XMLDecoder/spec/TestTrue.java b/jdk/test/java/beans/XMLDecoder/spec/TestTrue.java new file mode 100644 index 00000000000..934d28e4f63 --- /dev/null +++ b/jdk/test/java/beans/XMLDecoder/spec/TestTrue.java @@ -0,0 +1,48 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestTrue extends AbstractTest { + public static final String XML + = "\n" + + " \n" + + ""; + + public static void main(String[] args) { + new TestTrue().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + if (!Boolean.TRUE.equals(decoder.readObject())) { + throw new Error("true expected"); + } + } +} diff --git a/jdk/test/java/beans/XMLDecoder/spec/TestVar.java b/jdk/test/java/beans/XMLDecoder/spec/TestVar.java new file mode 100644 index 00000000000..701edad79a8 --- /dev/null +++ b/jdk/test/java/beans/XMLDecoder/spec/TestVar.java @@ -0,0 +1,54 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Tests element + * @author Sergey Malenkov + */ + +import java.beans.XMLDecoder; + +public final class TestVar extends AbstractTest { + public static final String XML + = "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + ""; + + public static void main(String[] args) { + new TestVar().test(true); + } + + @Override + protected void validate(XMLDecoder decoder) { + for (int i = 0; i < 3; i++) { + if (decoder != decoder.readObject()) { + throw new Error("decoder instance expected"); + } + } + } +} diff --git a/jdk/test/java/lang/Boolean/Factory.java b/jdk/test/java/lang/Boolean/Factory.java new file mode 100644 index 00000000000..dbf7704194b --- /dev/null +++ b/jdk/test/java/lang/Boolean/Factory.java @@ -0,0 +1,37 @@ +/* + * Copyright 2000 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4262398 + * @summary Basic test for Boolean.valueOf(boolean b). + */ + +public class Factory { + public static void main(String[] args) throws Exception { + if (Boolean.valueOf(true) != Boolean.TRUE) + throw new Exception("Truth failure"); + if (Boolean.valueOf(false) != Boolean.FALSE) + throw new Exception("Major fallacy"); + } +} diff --git a/jdk/test/java/lang/Boolean/GetBoolean.java b/jdk/test/java/lang/Boolean/GetBoolean.java new file mode 100644 index 00000000000..b452a1bdf43 --- /dev/null +++ b/jdk/test/java/lang/Boolean/GetBoolean.java @@ -0,0 +1,35 @@ +/* + * Copyright 1999 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4252308 + * @summary test Boolean.getBoolean method with empty key + */ + +public class GetBoolean { + public static void main(String[] args) throws Exception { + Boolean.getBoolean(""); + Boolean.getBoolean(null); + } +} diff --git a/jdk/test/java/lang/Boolean/MakeBooleanComparable.java b/jdk/test/java/lang/Boolean/MakeBooleanComparable.java new file mode 100644 index 00000000000..b84a4a27f59 --- /dev/null +++ b/jdk/test/java/lang/Boolean/MakeBooleanComparable.java @@ -0,0 +1,57 @@ +/* + * Copyright 2003 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4329937 + * @summary Basic test for making Boolean implement Comparable + * @author Josh Bloch + * + * @compile -source 1.5 MakeBooleanComparable.java + * @run main MakeBooleanComparable + */ + +import java.util.*; + +public class MakeBooleanComparable { + public static void main(String args[]) { + Random rnd = new Random(); + List list = new ArrayList(); + int numFalse = 0; + for (int i = 0; i < 1000; i++) { + boolean element = rnd.nextBoolean(); + if (!element) + numFalse++; + list.add(element); // Autoboxing! + } + + Collections.sort(list); + + for (int i = 0; i < numFalse; i++) + if (list.get(i).booleanValue()) // Autounboxing doesn't work yet! + throw new RuntimeException("False positive: " + i); + for (int i = numFalse; i < 1000; i++) + if (!list.get(i).booleanValue()) // Autounboxing doesn't work yet! + throw new RuntimeException("False negative: " + i); + } +} diff --git a/jdk/test/java/lang/Boolean/ParseBoolean.java b/jdk/test/java/lang/Boolean/ParseBoolean.java new file mode 100644 index 00000000000..997b4f0a313 --- /dev/null +++ b/jdk/test/java/lang/Boolean/ParseBoolean.java @@ -0,0 +1,53 @@ +/* + * Copyright 2003 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4253773 + * @summary test Boolean.parseBoolean + */ + +public class ParseBoolean { + public static void main(String[] args) throws Exception { + checkTrue(Boolean.parseBoolean("TRUE")); + checkTrue(Boolean.parseBoolean("true")); + checkTrue(Boolean.parseBoolean("TrUe")); + + checkFalse(Boolean.parseBoolean("false")); + checkFalse(Boolean.parseBoolean("FALSE")); + checkFalse(Boolean.parseBoolean("FaLse")); + checkFalse(Boolean.parseBoolean(null)); + checkFalse(Boolean.parseBoolean("garbage")); + checkFalse(Boolean.parseBoolean("TRUEE")); + } + + static void checkTrue(boolean b) { + if (!b) + throw new RuntimeException("test failed"); + } + + static void checkFalse(boolean b) { + if (b) + throw new RuntimeException("test failed"); + } +} diff --git a/jdk/test/java/lang/Byte/Decode.java b/jdk/test/java/lang/Byte/Decode.java new file mode 100644 index 00000000000..4642eacb1e6 --- /dev/null +++ b/jdk/test/java/lang/Byte/Decode.java @@ -0,0 +1,98 @@ +/* + * Copyright 1999-2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4242173 5017980 6576055 + * @summary Test Byte.decode method + * @author madbot + * @author Joseph D. Darcy + */ + +/** + * There are six methods in java.lang.Byte which transform strings + * into a byte or Byte value: + * + * public Byte(String s) + * public static Byte decode(String nm) + * public static byte parseByte(String s, int radix) + * public static byte parseByte(String s) + * public static Byte valueOf(String s, int radix) + * public static Byte valueOf(String s) + * + * However, of these only decode has a nontrivial implementation + * in that class. + */ +public class Decode { + + private static void check(String val, byte expected) { + byte n = (Byte.decode(val)).byteValue(); + if (n != expected) + throw new RuntimeException("Byte.decode failed. String:" + + val + " Result:" + n); + } + + private static void checkFailure(String val, String message) { + try { + byte n = (Byte.decode(val)).byteValue(); + throw new RuntimeException(message); + } catch (NumberFormatException e) { /* Okay */} + } + + public static void main(String[] args) throws Exception { + check(new String(""+Byte.MIN_VALUE), Byte.MIN_VALUE); + check(new String(""+Byte.MAX_VALUE), Byte.MAX_VALUE); + + check("10", (byte)10); + check("0x10", (byte)16); + check("0X10", (byte)16); + check("010", (byte)8); + check("#10", (byte)16); + + check("+10", (byte)10); + check("+0x10", (byte)16); + check("+0X10", (byte)16); + check("+010", (byte)8); + check("+#10", (byte)16); + + check("-10", (byte)-10); + check("-0x10", (byte)-16); + check("-0X10", (byte)-16); + check("-010", (byte)-8); + check("-#10", (byte)-16); + + check(Integer.toString((int)Byte.MIN_VALUE), Byte.MIN_VALUE); + check(Integer.toString((int)Byte.MAX_VALUE), Byte.MAX_VALUE); + + checkFailure("0x-10", "Byte.decode allows negative sign in wrong position."); + checkFailure("0x+10", "Byte.decode allows positive sign in wrong position."); + + checkFailure("+", "Raw plus sign allowed."); + checkFailure("-", "Raw minus sign allowed."); + + checkFailure(Integer.toString((int)Byte.MIN_VALUE - 1), "Out of range"); + checkFailure(Integer.toString((int)Byte.MAX_VALUE + 1), "Out of range"); + + checkFailure("", "Empty String"); + } +} diff --git a/jdk/test/java/lang/Double/BitwiseConversion.java b/jdk/test/java/lang/Double/BitwiseConversion.java new file mode 100644 index 00000000000..0d44e49fa70 --- /dev/null +++ b/jdk/test/java/lang/Double/BitwiseConversion.java @@ -0,0 +1,82 @@ +/* + * Copyright 2005 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 5037596 + * @summary Verify bitwise conversion works for non-canonical NaN values + * @author Joseph D. Darcy + */ + +import static java.lang.Double.*; +import static sun.misc.DoubleConsts.*; + +public class BitwiseConversion { + static int testNanCase(long x) { + int errors = 0; + // Strip out sign and exponent bits + long y = x & SIGNIF_BIT_MASK; + + double values[] = { + longBitsToDouble(EXP_BIT_MASK | y), + longBitsToDouble(SIGN_BIT_MASK | EXP_BIT_MASK | y) + }; + + for(double value: values) { + if (!isNaN(value)) { + throw new RuntimeException("Invalid input " + y + + "yielded non-NaN" + value); + } + long converted = doubleToLongBits(value); + if (converted != 0x7ff8000000000000L) { + errors++; + System.err.format("Non-canoncial NaN bits returned: %x%n", + converted); + } + } + return errors; + } + + public static void main(String... argv) { + int errors = 0; + + for (int i = 0; i < SIGNIFICAND_WIDTH-1; i++) { + errors += testNanCase(1L< 0) + throw new RuntimeException(); + } +} diff --git a/jdk/test/java/lang/Double/Constants.java b/jdk/test/java/lang/Double/Constants.java new file mode 100644 index 00000000000..bf14e92db06 --- /dev/null +++ b/jdk/test/java/lang/Double/Constants.java @@ -0,0 +1,69 @@ +/* + * Copyright 2001-2005 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @compile Constants.java + * @bug 4397405 4826652 + * @summary Testing constant-ness of Double.{MIN_VALUE, MAX_VALUE}, etc. + * @author Joseph D. Darcy + */ + +public class Constants { + /* + * This compile-only test is to make sure that the primitive + * public static final fields in java.lang.Double are "constant + * expressions" as defined by "The Java Language Specification, + * 2nd edition" section 15.28; a different test checks the values + * of those fields. + */ + public static void main(String[] args) throws Exception { + int i = 0; + switch (i) { + case (int)Double.NaN: // 0 + System.out.println("Double.NaN is a constant!"); + break; + case (int)Double.MIN_VALUE + 1: // 0 + 1 + System.out.println("Double.MIN_VALUE is a constant!"); + break; + case (int)Double.MIN_NORMAL + 2: // 0 + 2 + System.out.println("Double.MIN_NORMAL is a constant!"); + break; + case Double.MIN_EXPONENT: // -1022 + System.out.println("Double.MIN_EXPONENT is a constant!"); + break; + case Double.MAX_EXPONENT: // 1023 + System.out.println("Double.MAX_EXPONENT is a constant!"); + break; + case (int)Double.MAX_VALUE - 1: // Integer.MAX_VALUE - 1 + System.out.println("Double.MAX_VALUE is a constant!"); + break; + case (int)Double.POSITIVE_INFINITY: // Integer.MAX_VALUE + System.out.println("Double.POSITIVE_INFINITY is a constant!"); + break; + case (int)Double.NEGATIVE_INFINITY: // Integer.MIN_VALUE + System.out.println("Double.NEGATIVE_INFINITY is a constant!"); + break; + } + } +} diff --git a/jdk/test/java/lang/Double/Extrema.java b/jdk/test/java/lang/Double/Extrema.java new file mode 100644 index 00000000000..febb4abfed5 --- /dev/null +++ b/jdk/test/java/lang/Double/Extrema.java @@ -0,0 +1,45 @@ +/* + * Copyright 2001-2005 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4408489 4826652 + * @summary Testing values of Double.{MIN_VALUE, MIN_NORMAL, MAX_VALUE} + * @author Joseph D. Darcy + */ + +public class Extrema { + public static void main(String[] args) throws Exception { + if (Double.MIN_VALUE != Double.longBitsToDouble(0x1L)) + throw new RuntimeException("Double.MIN_VALUE is not equal "+ + "to longBitsToDouble(0x1L)."); + + if (Double.MIN_NORMAL != Double.longBitsToDouble(0x0010000000000000L)) + throw new RuntimeException("Double.MIN_NORMAL is not equal "+ + "to longBitsToDouble(0x0010000000000000L)."); + + if (Double.MAX_VALUE != Double.longBitsToDouble(0x7fefffffffffffffL)) + throw new RuntimeException("Double.MAX_VALUE is not equal "+ + "to longBitsToDouble(0x7fefffffffffffffL)."); + } +} diff --git a/jdk/test/java/lang/Double/NaNInfinityParsing.java b/jdk/test/java/lang/Double/NaNInfinityParsing.java new file mode 100644 index 00000000000..460d2640ae2 --- /dev/null +++ b/jdk/test/java/lang/Double/NaNInfinityParsing.java @@ -0,0 +1,169 @@ +/* + * Copyright 2001 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4428772 + * @summary Testing recognition of "NaN" and "Infinity" strings + * @author Joseph D. Darcy + */ + + +public class NaNInfinityParsing { + /* + * Regression tests for: + * 4428772 -- Establish invariant for Float & Double classes and + * their string representations + * + * Added capability for parse{Float, Double} and related methods + * to recognize "NaN" and "Infinity" strings so that + * parseDouble(toString(d)) will always return the original + * floating-point value. + */ + + static String NaNStrings[] = { + "NaN", + "+NaN", + "-NaN" + }; + + static String infinityStrings[] = { + "Infinity", + "+Infinity", + "-Infinity", + }; + + static String invalidStrings[] = { + "+", + "-", + "@", + "N", + "Na", + "Nan", + "NaNf", + "NaNd", + "NaNF", + "NaND", + "+N", + "+Na", + "+Nan", + "+NaNf", + "+NaNd", + "+NaNF", + "+NaND", + "-N", + "-Na", + "-Nan", + "-NaNf", + "-NaNd", + "-NaNF", + "-NaND", + "I", + "In", + "Inf", + "Infi", + "Infin", + "Infini", + "Infinit", + "InfinitY", + "Infinityf", + "InfinityF", + "Infinityd", + "InfinityD", + "+I", + "+In", + "+Inf", + "+Infi", + "+Infin", + "+Infini", + "+Infinit", + "+InfinitY", + "+Infinityf", + "+InfinityF", + "+Infinityd", + "+InfinityD", + "-I", + "-In", + "-Inf", + "-Infi", + "-Infin", + "-Infini", + "-Infinit", + "-InfinitY", + "-Infinityf", + "-InfinityF", + "-Infinityd", + "-InfinityD", + "NaNInfinity", + "InfinityNaN", + "nan", + "infinity" + }; + + public static void main(String [] argv) throws Exception { + int i; + double d; + + // Test valid NaN strings + for(i = 0; i < NaNStrings.length; i++) { + if(!Double.isNaN(d=Double.parseDouble(NaNStrings[i]))) { + throw new RuntimeException("NaN string ``" + NaNStrings[i] + + "'' did not parse as a NaN; returned " + + d + " instead."); + } + } + + // Test valid Infinity strings + for(i = 0; i < infinityStrings.length; i++) { + if(!Double.isInfinite(d=Double.parseDouble(infinityStrings[i]))) { + throw new RuntimeException("Infinity string ``" + + infinityStrings[i] + + "'' did not parse as infinity; returned " + + d + "instead."); + } + // check sign of result + + boolean negative = (infinityStrings[i].charAt(0) == '-'); + if(d != (negative?Double.NEGATIVE_INFINITY: + Double.POSITIVE_INFINITY)) + throw new RuntimeException("Infinity has wrong sign;" + + (negative?"positive instead of negative.": + "negative instead of positive.")); + } + + // Test almost valid strings + for(i = 0; i < invalidStrings.length; i++) { + try { + double result; + d = Double.parseDouble(invalidStrings[i]); + throw new RuntimeException("Invalid string ``" + + invalidStrings[i] + +"'' parsed as " + d + "."); + } + catch(NumberFormatException e) { + // expected + } + } + + } +} diff --git a/jdk/test/java/lang/Double/ParseDouble.java b/jdk/test/java/lang/Double/ParseDouble.java new file mode 100644 index 00000000000..54194b18977 --- /dev/null +++ b/jdk/test/java/lang/Double/ParseDouble.java @@ -0,0 +1,562 @@ +/* + * Copyright 2001-2003 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4160406 4705734 4707389 4826774 4895911 + * @summary Test for Double.parseDouble method and acceptance regex + */ + +import java.util.regex.*; + +public class ParseDouble { + + private static void check(String val, double expected) { + double n = Double.parseDouble(val); + if (n != expected) + throw new RuntimeException("Double.parseDouble failed. String:" + + val + " Result:" + n); + } + + private static void rudimentaryTest() { + check(new String(""+Double.MIN_VALUE), Double.MIN_VALUE); + check(new String(""+Double.MAX_VALUE), Double.MAX_VALUE); + + check("10", (double) 10.0); + check("10.0", (double) 10.0); + check("10.01", (double) 10.01); + + check("-10", (double) -10.0); + check("-10.00", (double) -10.0); + check("-10.01", (double) -10.01); + } + + + static String badStrings[] = { + "", + "+", + "-", + "+e", + "-e", + "+e170", + "-e170", + + // Make sure intermediate white space is not deleted. + "1234 e10", + "-1234 e10", + + // Control characters in the interior of a string are not legal + "1\u0007e1", + "1e\u00071", + + // NaN and infinity can't have trailing type suffices or exponents + "NaNf", + "NaNF", + "NaNd", + "NaND", + "-NaNf", + "-NaNF", + "-NaNd", + "-NaND", + "+NaNf", + "+NaNF", + "+NaNd", + "+NaND", + "Infinityf", + "InfinityF", + "Infinityd", + "InfinityD", + "-Infinityf", + "-InfinityF", + "-Infinityd", + "-InfinityD", + "+Infinityf", + "+InfinityF", + "+Infinityd", + "+InfinityD", + + "NaNe10", + "-NaNe10", + "+NaNe10", + "Infinitye10", + "-Infinitye10", + "+Infinitye10", + + // Non-ASCII digits are not recognized + "\u0661e\u0661", // 1e1 in Arabic-Indic digits + "\u06F1e\u06F1", // 1e1 in Extended Arabic-Indic digits + "\u0967e\u0967", // 1e1 in Devanagari digits + + // JCK test lex03592m3 + ".", + + // JCK test lex03592m4 + "e42", + + // JCK test lex03592m5 + ".e42", + + // JCK test lex03592m6 + "d", + + // JCK test lex03592m7 + ".d", + + // JCK test lex03592m8 + "e42d", + + // JCK test lex03592m9 + ".e42d", + + // JCK test lex03593m10 + "1A01.01125e-10d", + + // JCK test lex03593m11 + "2;3.01125e-10d", + + // JCK test lex03593m12 + "1_34.01125e-10d", + + // JCK test lex03593m14 + "202..01125e-10d", + + // JCK test lex03593m15 + "202,01125e-10d", + + // JCK test lex03593m16 + "202.03b4e-10d", + + // JCK test lex03593m18 + "202.06_3e-10d", + + // JCK test lex03593m20 + "202.01125e-f0d", + + // JCK test lex03593m21 + "202.01125e_3d", + + // JCK test lex03593m22 + "202.01125e -5d", + + // JCK test lex03593m24 + "202.01125e-10r", + + // JCK test lex03593m25 + "202.01125e-10ff", + + // JCK test lex03593m26 + "1234L.01", + + // JCK test lex03593m27 + "12ee-2", + + // JCK test lex03593m28 + "12e-2.2.2", + + // JCK test lex03593m29 + "12.01e+", + + // JCK test lex03593m30 + "12.01E", + + // Bad hexadecimal-style strings + + // Two leading zeros + "00x1.0p1", + + // Must have hex specifier + "1.0p1", + "00010p1", + "deadbeefp1", + + // Need an explicit fully-formed exponent + "0x1.0p", + "0x1.0", + + // Exponent must be in decimal + "0x1.0pa", + "0x1.0pf", + + // Exponent separated by "p" + "0x1.0e22", + "0x1.0e22", + + // Need a signifcand + "0xp22" + }; + + static String goodStrings[] = { + "NaN", + "+NaN", + "-NaN", + "Infinity", + "+Infinity", + "-Infinity", + "1.1e-23f", + ".1e-23f", + "1e-23", + "1f", + "0", + "-0", + "+0", + "00", + "00", + "-00", + "+00", + "0000000000", + "-0000000000", + "+0000000000", + "1", + "2", + "1234", + "-1234", + "+1234", + "2147483647", // Integer.MAX_VALUE + "2147483648", + "-2147483648", // Integer.MIN_VALUE + "-2147483649", + + "16777215", + "16777216", // 2^24 + "16777217", + + "-16777215", + "-16777216", // -2^24 + "-16777217", + + "9007199254740991", + "9007199254740992", // 2^53 + "9007199254740993", + + "-9007199254740991", + "-9007199254740992", // -2^53 + "-9007199254740993", + + "9223372036854775807", + "9223372036854775808", // Long.MAX_VALUE + "9223372036854775809", + + "-9223372036854775808", + "-9223372036854775809", // Long.MIN_VALUE + "-9223372036854775810", + + // Culled from JCK test lex03591m1 + "54.07140d", + "7.01e-324d", + "2147483647.01d", + "1.2147483647f", + "000000000000000000000000001.F", + "1.00000000000000000000000000e-2F", + + // Culled from JCK test lex03592m2 + "2.", + ".0909", + "122112217090.0", + "7090e-5", + "2.E-20", + ".0909e42", + "122112217090.0E+100", + "7090f", + "2.F", + ".0909d", + "122112217090.0D", + "7090e-5f", + "2.E-20F", + ".0909e42d", + "122112217090.0E+100D", + + // Culled from JCK test lex03594m31 -- unicode escapes + "\u0035\u0031\u0034\u0039\u0032\u0033\u0036\u0037\u0038\u0030.1102E-209D", + "1290873\u002E12301e100", + "1.1E-10\u0066", + + // Culled from JCK test lex03595m1 + "0.0E-10", + "1E10", + + // Culled from JCK test lex03691m1 + "0.f", + "1f", + "0.F", + "1F", + "0.12d", + "1e-0d", + "12.e+1D", + "0e-0D", + "12.e+01", + "1e-01", + + // Good hex strings + // Vary capitalization of separators. + + "0x1p1", + "0X1p1", + "0x1P1", + "0X1P1", + "0x1p1f", + "0X1p1f", + "0x1P1f", + "0X1P1f", + "0x1p1F", + "0X1p1F", + "0x1P1F", + "0X1P1F", + "0x1p1d", + "0X1p1d", + "0x1P1d", + "0X1P1d", + "0x1p1D", + "0X1p1D", + "0x1P1D", + "0X1P1D", + + "-0x1p1", + "-0X1p1", + "-0x1P1", + "-0X1P1", + "-0x1p1f", + "-0X1p1f", + "-0x1P1f", + "-0X1P1f", + "-0x1p1F", + "-0X1p1F", + "-0x1P1F", + "-0X1P1F", + "-0x1p1d", + "-0X1p1d", + "-0x1P1d", + "-0X1P1d", + "-0x1p1D", + "-0X1p1D", + "-0x1P1D", + "-0X1P1D", + + "0x1p-1", + "0X1p-1", + "0x1P-1", + "0X1P-1", + "0x1p-1f", + "0X1p-1f", + "0x1P-1f", + "0X1P-1f", + "0x1p-1F", + "0X1p-1F", + "0x1P-1F", + "0X1P-1F", + "0x1p-1d", + "0X1p-1d", + "0x1P-1d", + "0X1P-1d", + "0x1p-1D", + "0X1p-1D", + "0x1P-1D", + "0X1P-1D", + + "-0x1p-1", + "-0X1p-1", + "-0x1P-1", + "-0X1P-1", + "-0x1p-1f", + "-0X1p-1f", + "-0x1P-1f", + "-0X1P-1f", + "-0x1p-1F", + "-0X1p-1F", + "-0x1P-1F", + "-0X1P-1F", + "-0x1p-1d", + "-0X1p-1d", + "-0x1P-1d", + "-0X1P-1d", + "-0x1p-1D", + "-0X1p-1D", + "-0x1P-1D", + "-0X1P-1D", + + + // Try different significand combinations + "0xap1", + "0xbp1", + "0xcp1", + "0xdp1", + "0xep1", + "0xfp1", + + "0x1p1", + "0x.1p1", + "0x1.1p1", + + "0x001p23", + "0x00.1p1", + "0x001.1p1", + + "0x100p1", + "0x.100p1", + "0x1.100p1", + + "0x00100p1", + "0x00.100p1", + "0x001.100p1" + }; + + static String paddedBadStrings[]; + static String paddedGoodStrings[]; + static { + String pad = " \t\n\r\f\u0001\u000b\u001f"; + paddedBadStrings = new String[badStrings.length]; + for(int i = 0 ; i < badStrings.length; i++) + paddedBadStrings[i] = pad + badStrings[i] + pad; + + paddedGoodStrings = new String[goodStrings.length]; + for(int i = 0 ; i < goodStrings.length; i++) + paddedGoodStrings[i] = pad + goodStrings[i] + pad; + + } + + + /* + * Throws an exception if Input is + * exceptionalInput and {@link Double.parseDouble + * parseDouble} does not throw an exception or if + * Input is not exceptionalInput and + * parseDouble throws an exception. This method does + * not attempt to test whether the string is converted to the + * proper value; just whether the input is accepted appropriately + * or not. + */ + private static void testParsing(String [] input, + boolean exceptionalInput) { + for(int i = 0; i < input.length; i++) { + double d; + + try { + d = Double.parseDouble(input[i]); + } + catch (NumberFormatException e) { + if (! exceptionalInput) { + throw new RuntimeException("Double.parseDouble rejected " + + "good string `" + input[i] + + "'."); + } + break; + } + if (exceptionalInput) { + throw new RuntimeException("Double.parseDouble accepted " + + "bad string `" + input[i] + + "'."); + } + } + } + + /* + * Throws an exception if Input is + * exceptionalInput and the regular expression + * matches one of the strings or if Input is not + * exceptionalInput and the regular expression fails + * to match an input string. + */ + private static void testRegex(String [] input, boolean exceptionalInput) { + /* + * The regex below is taken from the JavaDoc for + * Double.valueOf. + */ + + final String Digits = "(\\p{Digit}+)"; + final String HexDigits = "(\\p{XDigit}+)"; + // an exponent is 'e' or 'E' followed by an optionally + // signed decimal integer. + final String Exp = "[eE][+-]?"+Digits; + final String fpRegex = + ("[\\x00-\\x20]*"+ // Optional leading "whitespace" + "[+-]?(" + // Optional sign character + "NaN|" + // "NaN" string + "Infinity|" + // "Infinity" string + + // A floating-point string representing a finite positive + // number without a leading sign has at most five basic pieces: + // Digits . Digits ExponentPart FloatTypeSuffix + // + // Since this method allows integer-only strings as input + // in addition to strings of floating-point literals, the + // two sub-patterns below are simplifications of the grammar + // productions from the Java Language Specification, 2nd + // edition, section 3.10.2. + + + // A decimal floating-point string representing a finite positive + // number without a leading sign has at most five basic pieces: + // Digits . Digits ExponentPart FloatTypeSuffix + // + // Since this method allows integer-only strings as input + // in addition to strings of floating-point literals, the + // two sub-patterns below are simplifications of the grammar + // productions from the Java Language Specification, 2nd + // edition, section 3.10.2. + + // Digits ._opt Digits_opt ExponentPart_opt FloatTypeSuffix_opt + "(((("+Digits+"(\\.)?("+Digits+"?)("+Exp+")?)|"+ + + // . Digits ExponentPart_opt FloatTypeSuffix_opt + "(\\.("+Digits+")("+Exp+")?))|"+ + + // Hexadecimal strings + "((" + + // 0[xX] HexDigits ._opt BinaryExponent FloatTypeSuffix_opt + "(0[xX]" + HexDigits + "(\\.)?)|" + + + // 0[xX] HexDigits_opt . HexDigits BinaryExponent FloatTypeSuffix_opt + "(0[xX]" + HexDigits + "?(\\.)" + HexDigits + ")" + + + ")[pP][+-]?" + Digits + "))" + + "[fFdD]?))" + + "[\\x00-\\x20]*");// Optional trailing "whitespace" + Pattern fpPattern = Pattern.compile(fpRegex); + + for(int i = 0; i < input.length; i++) { + Matcher m = fpPattern.matcher(input[i]); + if (m.matches() != ! exceptionalInput) { + throw new RuntimeException("Regular expression " + + (exceptionalInput? + "accepted bad": + "rejected good") + + " string `" + + input[i] + "'."); + } + } + + } + + public static void main(String[] args) throws Exception { + rudimentaryTest(); + + testParsing(goodStrings, false); + testParsing(paddedGoodStrings, false); + testParsing(badStrings, true); + testParsing(paddedBadStrings, true); + + testRegex(goodStrings, false); + testRegex(paddedGoodStrings, false); + testRegex(badStrings, true); + testRegex(paddedBadStrings, true); + } +} diff --git a/jdk/test/java/lang/Double/ParseHexFloatingPoint.java b/jdk/test/java/lang/Double/ParseHexFloatingPoint.java new file mode 100644 index 00000000000..d2897f9f962 --- /dev/null +++ b/jdk/test/java/lang/Double/ParseHexFloatingPoint.java @@ -0,0 +1,448 @@ +/* + * Copyright 2003 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4826774 + * @summary Numerical tests for hexadecimal inputs to parseDouble, parseFloat + * @author Joseph D. Darcy + */ + + +import java.util.regex.*; +import sun.misc.FpUtils; +import sun.misc.DoubleConsts; + +public class ParseHexFloatingPoint { + private ParseHexFloatingPoint(){} + + public static final double infinityD = Double.POSITIVE_INFINITY; + public static final double NaND = Double.NaN; + + static int test(String testName, String input, + double result, double expected) { + int failures =0; + + if (Double.compare(result, expected) != 0 ) { + System.err.println("Failure for " + testName + + ": For input " + input + + " expected " + expected + + " got " + result + "."); + } + + return failures; + } + + static int testCase(String input, double expected) { + int failures =0; + + + // Try different combination of letter components + input = input.toLowerCase(java.util.Locale.US); + + String [] suffices = {"", "f", "F", "d", "D"}; + String [] signs = {"", "-", "+"}; + + for(int i = 0; i < 2; i++) { + String s1 = input; + if(i == 1) + s1 = s1.replace('x', 'X'); + + for(int j = 0; j < 2; j++) { + String s2 = s1; + if(j == 1) + s2 = s2.replace('p', 'P'); + + for(int k = 0; k < 2; k++) { + String s3 = s2; + if(k == 1) + s3 = upperCaseHex(s3); + + + for(int m = 0; m < suffices.length; m++) { + String s4 = s3 + suffices[m]; + + + for(int n = 0; n < signs.length; n++) { + String s5 = signs[n] + s4; + + double result = Double.parseDouble(s5); + failures += test("Double.parseDouble", + s5, result, (signs[n].equals("-") ? + -expected: + expected)); + } + } + } + } + } + + return failures; + } + + static String upperCaseHex(String s) { + return s.replace('a', 'A').replace('b', 'B').replace('c', 'C'). + replace('d', 'D').replace('e','E').replace('f', 'F'); + } + + /* + * Test easy and tricky double rounding cases. + */ + static int doubleTests() { + + /* + * A String, double pair + */ + class PairSD { + public String s; + public double d; + PairSD(String s, double d) { + this.s = s; + this.d = d; + } + } + int failures = 0; + + + + // Hex strings that convert to three; test basic functionality + // of significand and exponent shift adjusts along with the + // no-op of adding leading zeros. These cases don't exercise + // the rounding code. + String leadingZeros = "0x0000000000000000000"; + String [] threeTests = { + "0x.003p12", + "0x.006p11", + "0x.00cp10", + "0x.018p9", + + "0x.3p4", + "0x.6p3", + "0x.cp2", + "0x1.8p1", + + "0x3p0", + "0x6.0p-1", + "0xc.0p-2", + "0x18.0p-3", + + "0x3000000p-24", + "0x3.0p0", + "0x3.000000p0", + }; + for(int i=0; i < threeTests.length; i++) { + String input = threeTests[i]; + failures += testCase(input, 3.0); + + input.replaceFirst("^0x", leadingZeros); + failures += testCase(input, 3.0); + } + + long bigExponents [] = { + 2*DoubleConsts.MAX_EXPONENT, + 2*DoubleConsts.MIN_EXPONENT, + + (long)Integer.MAX_VALUE-1, + (long)Integer.MAX_VALUE, + (long)Integer.MAX_VALUE+1, + + (long)Integer.MIN_VALUE-1, + (long)Integer.MIN_VALUE, + (long)Integer.MIN_VALUE+1, + + Long.MAX_VALUE-1, + Long.MAX_VALUE, + + Long.MIN_VALUE+1, + Long.MIN_VALUE, + }; + + // Test zero significand with large exponents. + for(int i = 0; i < bigExponents.length; i++) { + failures += testCase("0x0.0p"+Long.toString(bigExponents[i]) , 0.0); + } + + // Test nonzero significand with large exponents. + for(int i = 0; i < bigExponents.length; i++) { + long exponent = bigExponents[i]; + failures += testCase("0x10000.0p"+Long.toString(exponent) , + (exponent <0?0.0:infinityD)); + } + + // Test significands with different lengths and bit patterns. + { + long signif = 0; + for(int i = 1; i <= 0xe; i++) { + signif = (signif <<4) | (long)i; + failures += testCase("0x"+Long.toHexString(signif)+"p0", signif); + } + } + + PairSD [] testCases = { + new PairSD("0x0.0p0", 0.0/16.0), + new PairSD("0x0.1p0", 1.0/16.0), + new PairSD("0x0.2p0", 2.0/16.0), + new PairSD("0x0.3p0", 3.0/16.0), + new PairSD("0x0.4p0", 4.0/16.0), + new PairSD("0x0.5p0", 5.0/16.0), + new PairSD("0x0.6p0", 6.0/16.0), + new PairSD("0x0.7p0", 7.0/16.0), + new PairSD("0x0.8p0", 8.0/16.0), + new PairSD("0x0.9p0", 9.0/16.0), + new PairSD("0x0.ap0", 10.0/16.0), + new PairSD("0x0.bp0", 11.0/16.0), + new PairSD("0x0.cp0", 12.0/16.0), + new PairSD("0x0.dp0", 13.0/16.0), + new PairSD("0x0.ep0", 14.0/16.0), + new PairSD("0x0.fp0", 15.0/16.0), + + // Half-way case between zero and MIN_VALUE rounds down to + // zero + new PairSD("0x1.0p-1075", 0.0), + + // Slighly more than half-way case between zero and + // MIN_VALUES rounds up to zero. + new PairSD("0x1.1p-1075", Double.MIN_VALUE), + new PairSD("0x1.000000000001p-1075", Double.MIN_VALUE), + new PairSD("0x1.000000000000001p-1075", Double.MIN_VALUE), + + // More subnormal rounding tests + new PairSD("0x0.fffffffffffff7fffffp-1022", FpUtils.nextDown(DoubleConsts.MIN_NORMAL)), + new PairSD("0x0.fffffffffffff8p-1022", DoubleConsts.MIN_NORMAL), + new PairSD("0x0.fffffffffffff800000001p-1022",DoubleConsts.MIN_NORMAL), + new PairSD("0x0.fffffffffffff80000000000000001p-1022",DoubleConsts.MIN_NORMAL), + new PairSD("0x1.0p-1022", DoubleConsts.MIN_NORMAL), + + + // Large value and overflow rounding tests + new PairSD("0x1.fffffffffffffp1023", Double.MAX_VALUE), + new PairSD("0x1.fffffffffffff0000000p1023", Double.MAX_VALUE), + new PairSD("0x1.fffffffffffff4p1023", Double.MAX_VALUE), + new PairSD("0x1.fffffffffffff7fffffp1023", Double.MAX_VALUE), + new PairSD("0x1.fffffffffffff8p1023", infinityD), + new PairSD("0x1.fffffffffffff8000001p1023", infinityD), + + new PairSD("0x1.ffffffffffffep1023", FpUtils.nextDown(Double.MAX_VALUE)), + new PairSD("0x1.ffffffffffffe0000p1023", FpUtils.nextDown(Double.MAX_VALUE)), + new PairSD("0x1.ffffffffffffe8p1023", FpUtils.nextDown(Double.MAX_VALUE)), + new PairSD("0x1.ffffffffffffe7p1023", FpUtils.nextDown(Double.MAX_VALUE)), + new PairSD("0x1.ffffffffffffeffffffp1023", Double.MAX_VALUE), + new PairSD("0x1.ffffffffffffe8000001p1023", Double.MAX_VALUE), + }; + + for (int i = 0; i < testCases.length; i++) { + failures += testCase(testCases[i].s,testCases[i].d); + } + + failures += significandAlignmentTests(); + + { + java.util.Random rand = new java.util.Random(); + // Consistency check; double => hexadecimal => double + // preserves the original value. + for(int i = 0; i < 1000; i++) { + double d = rand.nextDouble(); + failures += testCase(Double.toHexString(d), d); + } + } + + return failures; + } + + /* + * Verify rounding works the same regardless of how the + * significand is aligned on input. A useful extension could be + * to have this sort of test for strings near the overflow + * threshold. + */ + static int significandAlignmentTests() { + int failures = 0; + // baseSignif * 2^baseExp = nextDown(2.0) + long [] baseSignifs = { + 0x1ffffffffffffe00L, + 0x1fffffffffffff00L + }; + + double [] answers = { + FpUtils.nextDown(FpUtils.nextDown(2.0)), + FpUtils.nextDown(2.0), + 2.0 + }; + + int baseExp = -60; + int count = 0; + for(int i = 0; i < 2; i++) { + for(long j = 0; j <= 0xfL; j++) { + for(long k = 0; k <= 8; k+= 4) { // k = {0, 4, 8} + long base = baseSignifs[i]; + long testValue = base | (j<<4) | k; + + int offset = 0; + // Calculate when significand should be incremented + // see table 4.7 in Koren book + + if ((base & 0x100L) == 0L ) { // lsb is 0 + if ( (j >= 8L) && // round is 1 + ((j & 0x7L) != 0 || k != 0 ) ) // sticky is 1 + offset = 1; + } + else { // lsb is 1 + if (j >= 8L) // round is 1 + offset = 1; + } + + double expected = answers[i+offset]; + + for(int m = -2; m <= 3; m++) { + count ++; + + // Form equal value string and evaluate it + String s = "0x" + + Long.toHexString((m >=0) ?(testValue<>(-m))) + + "p" + (baseExp - m); + + failures += testCase(s, expected); + } + } + } + } + + return failures; + } + + + /* + * Test tricky float rounding cases. The code which + * reads in a hex string converts the string to a double value. + * If a float value is needed, the double value is cast to float. + * However, the cast be itself not always guaranteed to return the + * right result since: + * + * 1. hex string => double can discard a sticky bit which would + * influence a direct hex string => float conversion. + * + * 2. hex string => double => float can have a rounding to double + * precision which results in a larger float value while a direct + * hex string => float conversion would not round up. + * + * This method includes tests of the latter two possibilities. + */ + static int floatTests(){ + int failures = 0; + + /* + * A String, float pair + */ + class PairSD { + public String s; + public float f; + PairSD(String s, float f) { + this.s = s; + this.f = f; + } + } + + String [][] roundingTestCases = { + // Target float value hard rouding version + + {"0x1.000000p0", "0x1.0000000000001p0"}, + + // Try some values that should round up to nextUp(1.0f) + {"0x1.000002p0", "0x1.0000010000001p0"}, + {"0x1.000002p0", "0x1.00000100000008p0"}, + {"0x1.000002p0", "0x1.0000010000000fp0"}, + {"0x1.000002p0", "0x1.00000100000001p0"}, + {"0x1.000002p0", "0x1.00000100000000000000000000000000000000001p0"}, + {"0x1.000002p0", "0x1.0000010000000fp0"}, + + // Potential double rounding cases + {"0x1.000002p0", "0x1.000002fffffffp0"}, + {"0x1.000002p0", "0x1.000002fffffff8p0"}, + {"0x1.000002p0", "0x1.000002ffffffffp0"}, + + {"0x1.000002p0", "0x1.000002ffff0ffp0"}, + {"0x1.000002p0", "0x1.000002ffff0ff8p0"}, + {"0x1.000002p0", "0x1.000002ffff0fffp0"}, + + + {"0x1.000000p0", "0x1.000000fffffffp0"}, + {"0x1.000000p0", "0x1.000000fffffff8p0"}, + {"0x1.000000p0", "0x1.000000ffffffffp0"}, + + {"0x1.000000p0", "0x1.000000ffffffep0"}, + {"0x1.000000p0", "0x1.000000ffffffe8p0"}, + {"0x1.000000p0", "0x1.000000ffffffefp0"}, + + // Float subnormal cases + {"0x0.000002p-126", "0x0.0000010000001p-126"}, + {"0x0.000002p-126", "0x0.00000100000000000001p-126"}, + + {"0x0.000006p-126", "0x0.0000050000001p-126"}, + {"0x0.000006p-126", "0x0.00000500000000000001p-126"}, + + {"0x0.0p-149", "0x0.7ffffffffffffffp-149"}, + {"0x1.0p-148", "0x1.3ffffffffffffffp-148"}, + {"0x1.cp-147", "0x1.bffffffffffffffp-147"}, + + {"0x1.fffffcp-127", "0x1.fffffdffffffffp-127"}, + }; + + String [] signs = {"", "-"}; + + for(int i = 0; i < roundingTestCases.length; i++) { + for(int j = 0; j < signs.length; j++) { + String expectedIn = signs[j]+roundingTestCases[i][0]; + String resultIn = signs[j]+roundingTestCases[i][1]; + + float expected = Float.parseFloat(expectedIn); + float result = Float.parseFloat(resultIn); + + if( Float.compare(expected, result) != 0) { + failures += 1; + System.err.println("" + (i+1)); + System.err.println("Expected = " + Float.toHexString(expected)); + System.err.println("Rounded = " + Float.toHexString(result)); + System.err.println("Double = " + Double.toHexString(Double.parseDouble(resultIn))); + System.err.println("Input = " + resultIn); + System.err.println(""); + } + } + } + + return failures; + } + + public static void main(String argv[]) { + int failures = 0; + + failures += doubleTests(); + failures += floatTests(); + + if (failures != 0) { + throw new RuntimeException("" + failures + " failures while " + + "testing hexadecimal floating-point " + + "parsing."); + } + } + +} diff --git a/jdk/test/java/lang/Double/ToHexString.java b/jdk/test/java/lang/Double/ToHexString.java new file mode 100644 index 00000000000..90180340645 --- /dev/null +++ b/jdk/test/java/lang/Double/ToHexString.java @@ -0,0 +1,252 @@ +/* + * Copyright 2003 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4826774 4926547 + * @summary Tests for {Float, Double}.toHexString methods + * @author Joseph D. Darcy + */ + +import java.util.regex.*; +import sun.misc.FpUtils; +import sun.misc.DoubleConsts; + +public class ToHexString { + private ToHexString() {} + + /* + * Given a double value, create a hexadecimal floating-point + * string via an intermediate long hex string. + */ + static String doubleToHexString(double d) { + return hexLongStringtoHexDoubleString(Long.toHexString(Double.doubleToLongBits(d))); + } + + /* + * Transform the hexadecimal long output into the equivalent + * hexadecimal double value. + */ + static String hexLongStringtoHexDoubleString(String transString) { + transString = transString.toLowerCase(); + + String zeros = ""; + StringBuffer result = new StringBuffer(24); + + for(int i = 0; i < (16 - transString.length()); i++, zeros += "0"); + transString = zeros + transString; + + // assert transString.length == 16; + + char topChar; + // Extract sign + if((topChar=transString.charAt(0)) >= '8' ) {// 8, 9, a, A, b, B, ... + result.append("-"); + // clear sign bit + transString = + Character.toString(Character.forDigit(Character.digit(topChar, 16) - 8, 16)) + + transString.substring(1,16); + } + + // check for NaN and infinity + String signifString = transString.substring(3,16); + + if( transString.substring(0,3).equals("7ff") ) { + if(signifString.equals("0000000000000")) { + result.append("Infinity"); + } + else + result.append("NaN"); + } + else { // finite value + // Extract exponent + int exponent = Integer.parseInt(transString.substring(0,3), 16) - + DoubleConsts.EXP_BIAS; + result.append("0x"); + + if (exponent == DoubleConsts.MIN_EXPONENT - 1) { // zero or subnormal + if(signifString.equals("0000000000000")) { + result.append("0.0p0"); + } + else { + result.append("0." + signifString.replaceFirst("0+$", "").replaceFirst("^$", "0") + + "p-1022"); + } + } + else { // normal value + result.append("1." + signifString.replaceFirst("0+$", "").replaceFirst("^$", "0") + + "p" + exponent); + } + } + return result.toString(); + } + + public static int toHexStringTests() { + int failures = 0; + String [][] testCases1 = { + {"Infinity", "Infinity"}, + {"-Infinity", "-Infinity"}, + {"NaN", "NaN"}, + {"-NaN", "NaN"}, + {"0.0", "0x0.0p0"}, + {"-0.0", "-0x0.0p0"}, + {"1.0", "0x1.0p0"}, + {"-1.0", "-0x1.0p0"}, + {"2.0", "0x1.0p1"}, + {"3.0", "0x1.8p1"}, + {"0.5", "0x1.0p-1"}, + {"0.25", "0x1.0p-2"}, + {"1.7976931348623157e+308", "0x1.fffffffffffffp1023"}, // MAX_VALUE + {"2.2250738585072014E-308", "0x1.0p-1022"}, // MIN_NORMAL + {"2.225073858507201E-308", "0x0.fffffffffffffp-1022"}, // MAX_SUBNORMAL + {"4.9e-324", "0x0.0000000000001p-1022"} // MIN_VALUE + }; + + // Compare decimal string -> double -> hex string to hex string + for (int i = 0; i < testCases1.length; i++) { + String result; + if(! (result=Double.toHexString(Double.parseDouble(testCases1[i][0]))). + equals(testCases1[i][1])) { + failures ++; + System.err.println("For floating-point string " + testCases1[i][0] + + ", expected hex output " + testCases1[i][1] + ", got " + result +"."); + } + } + + + // Except for float subnormals, the output for numerically + // equal float and double values should be the same. + // Therefore, we will explicitly test float subnormal values. + String [][] floatTestCases = { + {"Infinity", "Infinity"}, + {"-Infinity", "-Infinity"}, + {"NaN", "NaN"}, + {"-NaN", "NaN"}, + {"0.0", "0x0.0p0"}, + {"-0.0", "-0x0.0p0"}, + {"1.0", "0x1.0p0"}, + {"-1.0", "-0x1.0p0"}, + {"2.0", "0x1.0p1"}, + {"3.0", "0x1.8p1"}, + {"0.5", "0x1.0p-1"}, + {"0.25", "0x1.0p-2"}, + {"3.4028235e+38f", "0x1.fffffep127"}, // MAX_VALUE + {"1.17549435E-38f", "0x1.0p-126"}, // MIN_NORMAL + {"1.1754942E-38", "0x0.fffffep-126"}, // MAX_SUBNORMAL + {"1.4e-45f", "0x0.000002p-126"} // MIN_VALUE + }; + // Compare decimal string -> double -> hex string to hex string + for (int i = 0; i < floatTestCases.length; i++) { + String result; + if(! (result=Float.toHexString(Float.parseFloat(floatTestCases[i][0]))). + equals(floatTestCases[i][1])) { + failures++; + System.err.println("For floating-point string " + floatTestCases[i][0] + + ", expected hex output\n" + floatTestCases[i][1] + ", got\n" + result +"."); + } + } + + // Particular floating-point values and hex equivalents, mostly + // taken from fdlibm source. + String [][] testCases2 = { + {"+0.0", "0000000000000000"}, + {"-0.0", "8000000000000000"}, + {"+4.9e-324", "0000000000000001"}, + {"-4.9e-324", "8000000000000001"}, + + // fdlibm k_sin.c + {"+5.00000000000000000000e-01", "3FE0000000000000"}, + {"-1.66666666666666324348e-01", "BFC5555555555549"}, + {"+8.33333333332248946124e-03", "3F8111111110F8A6"}, + {"-1.98412698298579493134e-04", "BF2A01A019C161D5"}, + {"+2.75573137070700676789e-06", "3EC71DE357B1FE7D"}, + {"-2.50507602534068634195e-08", "BE5AE5E68A2B9CEB"}, + {"+1.58969099521155010221e-10", "3DE5D93A5ACFD57C"}, + + // fdlibm k_cos.c + {"+4.16666666666666019037e-02", "3FA555555555554C"}, + {"-1.38888888888741095749e-03", "BF56C16C16C15177"}, + {"+2.48015872894767294178e-05", "3EFA01A019CB1590"}, + {"-2.75573143513906633035e-07", "BE927E4F809C52AD"}, + {"+2.08757232129817482790e-09", "3E21EE9EBDB4B1C4"}, + {"-1.13596475577881948265e-11", "BDA8FAE9BE8838D4"}, + + // fdlibm e_rempio.c + {"1.67772160000000000000e+07", "4170000000000000"}, + {"6.36619772367581382433e-01", "3FE45F306DC9C883"}, + {"1.57079632673412561417e+00", "3FF921FB54400000"}, + {"6.07710050650619224932e-11", "3DD0B4611A626331"}, + {"6.07710050630396597660e-11", "3DD0B4611A600000"}, + {"2.02226624879595063154e-21", "3BA3198A2E037073"}, + {"2.02226624871116645580e-21", "3BA3198A2E000000"}, + {"8.47842766036889956997e-32", "397B839A252049C1"}, + + + // fdlibm s_cbrt.c + {"+5.42857142857142815906e-01", "3FE15F15F15F15F1"}, + {"-7.05306122448979611050e-01", "BFE691DE2532C834"}, + {"+1.41428571428571436819e+00", "3FF6A0EA0EA0EA0F"}, + {"+1.60714285714285720630e+00", "3FF9B6DB6DB6DB6E"}, + {"+3.57142857142857150787e-01", "3FD6DB6DB6DB6DB7"}, + }; + + // Compare decimal string -> double -> hex string to + // long hex string -> double hex string + for (int i = 0; i < testCases2.length; i++) { + String result; + String expected; + if(! (result=Double.toHexString(Double.parseDouble(testCases2[i][0]))). + equals( expected=hexLongStringtoHexDoubleString(testCases2[i][1]) )) { + failures ++; + System.err.println("For floating-point string " + testCases2[i][0] + + ", expected hex output " + expected + ", got " + result +"."); + } + } + + // Test random double values; + // compare double -> Double.toHexString with local doubleToHexString + java.util.Random rand = new java.util.Random(0); + for (int i = 0; i < 1000; i++) { + String result; + String expected; + double d = rand.nextDouble(); + if(! (expected=doubleToHexString(d)).equals(result=Double.toHexString(d)) ) { + failures ++; + System.err.println("For floating-point value " + d + + ", expected hex output " + expected + ", got " + result +"."); + } + } + + return failures; + } + + public static void main(String argv[]) { + int failures = 0; + + failures = toHexStringTests(); + + if (failures != 0) { + throw new RuntimeException("" + failures + " failures while testing Double.toHexString"); + } + } +} diff --git a/jdk/test/java/lang/Enum/ValueOf.java b/jdk/test/java/lang/Enum/ValueOf.java new file mode 100644 index 00000000000..6af4a9fd8e9 --- /dev/null +++ b/jdk/test/java/lang/Enum/ValueOf.java @@ -0,0 +1,224 @@ +/* + * Copyright 2004-2009 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4984908 5058132 6653154 + * @summary Basic test of valueOf(String) + * @author Josh Bloch + * + * @compile ValueOf.java + * @run main ValueOf + */ + +import java.util.*; +import java.lang.reflect.Method; + +public class ValueOf { + static Random rnd = new Random(); + + public static void main(String[] args) throws Exception { + test(Silly0.class); + test(Silly1.class); + test(Silly31.class); + test(Silly32.class); + test(Silly33.class); + test(Silly63.class); + test(Silly64.class); + test(Silly65.class); + test(Silly127.class); + test(Silly128.class); + test(Silly129.class); + test(Silly500.class); + test(Specialized.class); + + testMissingException(); + } + + static > void test(Class enumClass) throws Exception { + Set s = EnumSet.allOf(enumClass); + test(enumClass, s); + + // Delete half the elements from set at random + for (Iterator i = s.iterator(); i.hasNext(); ) { + i.next(); + if (rnd.nextBoolean()) + i.remove(); + } + + test(enumClass, s); + } + + static > void test(Class enumClass, Set s) + throws Exception + { + Method valueOf = enumClass.getDeclaredMethod("valueOf", String.class); + Set copy = EnumSet.noneOf(enumClass); + for (T e : s) + copy.add((T) valueOf.invoke(null, e.name())); + if (!copy.equals(s)) + throw new Exception(copy + " != " + s); + } + + static void testMissingException() { + try { + Enum.valueOf(Specialized.class, "BAZ"); + throw new RuntimeException("Expected IllegalArgumentException not thrown."); + } catch(IllegalArgumentException iae) { + String message = iae.getMessage(); + if (! "No enum constant ValueOf.Specialized.BAZ".equals(message)) + throw new RuntimeException("Unexpected detail message: ``" + message + "''."); + } + } + + enum Silly0 { }; + + enum Silly1 { e1 } + + enum Silly31 { + e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, + e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30 + } + + enum Silly32 { + e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, + e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31 + } + + enum Silly33 { + e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, + e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, + e32 + } + + enum Silly63 { + e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, + e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, + e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, + e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, + e62 + } + + enum Silly64 { + e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, + e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, + e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, + e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, + e62, e63 + } + + enum Silly65 { + e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, + e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, + e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, + e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, + e62, e63, e64 + } + + enum Silly127 { + e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, + e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, + e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, + e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, + e62, e63, e64, e65, e66, e67, e68, e69, e70, e71, e72, e73, e74, e75, e76, + e77, e78, e79, e80, e81, e82, e83, e84, e85, e86, e87, e88, e89, e90, e91, + e92, e93, e94, e95, e96, e97, e98, e99, e100, e101, e102, e103, e104, e105, + e106, e107, e108, e109, e110, e111, e112, e113, e114, e115, e116, e117, + e118, e119, e120, e121, e122, e123, e124, e125, e126 + } + + enum Silly128 { + e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, + e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, + e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, + e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, + e62, e63, e64, e65, e66, e67, e68, e69, e70, e71, e72, e73, e74, e75, e76, + e77, e78, e79, e80, e81, e82, e83, e84, e85, e86, e87, e88, e89, e90, e91, + e92, e93, e94, e95, e96, e97, e98, e99, e100, e101, e102, e103, e104, e105, + e106, e107, e108, e109, e110, e111, e112, e113, e114, e115, e116, e117, + e118, e119, e120, e121, e122, e123, e124, e125, e126, e127 + } + + enum Silly129 { + e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, + e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, + e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, + e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, + e62, e63, e64, e65, e66, e67, e68, e69, e70, e71, e72, e73, e74, e75, e76, + e77, e78, e79, e80, e81, e82, e83, e84, e85, e86, e87, e88, e89, e90, e91, + e92, e93, e94, e95, e96, e97, e98, e99, e100, e101, e102, e103, e104, e105, + e106, e107, e108, e109, e110, e111, e112, e113, e114, e115, e116, e117, + e118, e119, e120, e121, e122, e123, e124, e125, e126, e127, e128 + } + + enum Silly500 { + e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, + e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, + e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, + e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, + e62, e63, e64, e65, e66, e67, e68, e69, e70, e71, e72, e73, e74, e75, e76, + e77, e78, e79, e80, e81, e82, e83, e84, e85, e86, e87, e88, e89, e90, e91, + e92, e93, e94, e95, e96, e97, e98, e99, e100, e101, e102, e103, e104, e105, + e106, e107, e108, e109, e110, e111, e112, e113, e114, e115, e116, e117, + e118, e119, e120, e121, e122, e123, e124, e125, e126, e127, e128, e129, + e130, e131, e132, e133, e134, e135, e136, e137, e138, e139, e140, e141, + e142, e143, e144, e145, e146, e147, e148, e149, e150, e151, e152, e153, + e154, e155, e156, e157, e158, e159, e160, e161, e162, e163, e164, e165, + e166, e167, e168, e169, e170, e171, e172, e173, e174, e175, e176, e177, + e178, e179, e180, e181, e182, e183, e184, e185, e186, e187, e188, e189, + e190, e191, e192, e193, e194, e195, e196, e197, e198, e199, e200, e201, + e202, e203, e204, e205, e206, e207, e208, e209, e210, e211, e212, e213, + e214, e215, e216, e217, e218, e219, e220, e221, e222, e223, e224, e225, + e226, e227, e228, e229, e230, e231, e232, e233, e234, e235, e236, e237, + e238, e239, e240, e241, e242, e243, e244, e245, e246, e247, e248, e249, + e250, e251, e252, e253, e254, e255, e256, e257, e258, e259, e260, e261, + e262, e263, e264, e265, e266, e267, e268, e269, e270, e271, e272, e273, + e274, e275, e276, e277, e278, e279, e280, e281, e282, e283, e284, e285, + e286, e287, e288, e289, e290, e291, e292, e293, e294, e295, e296, e297, + e298, e299, e300, e301, e302, e303, e304, e305, e306, e307, e308, e309, + e310, e311, e312, e313, e314, e315, e316, e317, e318, e319, e320, e321, + e322, e323, e324, e325, e326, e327, e328, e329, e330, e331, e332, e333, + e334, e335, e336, e337, e338, e339, e340, e341, e342, e343, e344, e345, + e346, e347, e348, e349, e350, e351, e352, e353, e354, e355, e356, e357, + e358, e359, e360, e361, e362, e363, e364, e365, e366, e367, e368, e369, + e370, e371, e372, e373, e374, e375, e376, e377, e378, e379, e380, e381, + e382, e383, e384, e385, e386, e387, e388, e389, e390, e391, e392, e393, + e394, e395, e396, e397, e398, e399, e400, e401, e402, e403, e404, e405, + e406, e407, e408, e409, e410, e411, e412, e413, e414, e415, e416, e417, + e418, e419, e420, e421, e422, e423, e424, e425, e426, e427, e428, e429, + e430, e431, e432, e433, e434, e435, e436, e437, e438, e439, e440, e441, + e442, e443, e444, e445, e446, e447, e448, e449, e450, e451, e452, e453, + e454, e455, e456, e457, e458, e459, e460, e461, e462, e463, e464, e465, + e466, e467, e468, e469, e470, e471, e472, e473, e474, e475, e476, e477, + e478, e479, e480, e481, e482, e483, e484, e485, e486, e487, e488, e489, + e490, e491, e492, e493, e494, e495, e496, e497, e498, e499 + } + + enum Specialized { + FOO { + public void foo() {} + }; + abstract public void foo(); + }; + +} diff --git a/jdk/test/java/lang/Float/BitwiseConversion.java b/jdk/test/java/lang/Float/BitwiseConversion.java new file mode 100644 index 00000000000..7c3afb5cc55 --- /dev/null +++ b/jdk/test/java/lang/Float/BitwiseConversion.java @@ -0,0 +1,82 @@ +/* + * Copyright 2005 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 5037596 + * @summary Verify bitwise conversion works for non-canonical NaN values + * @author Joseph D. Darcy + */ + +import static java.lang.Float.*; +import static sun.misc.FloatConsts.*; + +public class BitwiseConversion { + static int testNanCase(int x) { + int errors = 0; + // Strip out sign and exponent bits + int y = x & SIGNIF_BIT_MASK; + + float values[] = { + intBitsToFloat(EXP_BIT_MASK | y), + intBitsToFloat(SIGN_BIT_MASK | EXP_BIT_MASK | y) + }; + + for(float value: values) { + if (!isNaN(value)) { + throw new RuntimeException("Invalid input " + y + + "yielded non-NaN" + value); + } + int converted = floatToIntBits(value); + if (converted != 0x7fc00000) { + errors++; + System.err.format("Non-canoncial NaN bits returned: %x%n", + converted); + } + } + return errors; + } + + public static void main(String... argv) { + int errors = 0; + + for (int i = 0; i < SIGNIFICAND_WIDTH-1; i++) { + errors += testNanCase(1< 0) + throw new RuntimeException(); + } +} diff --git a/jdk/test/java/lang/Float/Constants.java b/jdk/test/java/lang/Float/Constants.java new file mode 100644 index 00000000000..a73a3b3901c --- /dev/null +++ b/jdk/test/java/lang/Float/Constants.java @@ -0,0 +1,69 @@ +/* + * Copyright 2001-2005 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @compile Constants.java + * @bug 4397405 4826652 + * @summary Testing constant-ness of Float.{MIN_VALUE, MAX_VALUE}, etc. + * @author Joseph D. Darcy + */ + +public class Constants { + /* + * This compile-only test is to make sure that the primitive + * public static final fields in java.lang.Float are "constant + * expressions" as defined by "The Java Language Specification, + * 2nd edition" section 15.28; a different test checks the values + * of those fields. + */ + public static void main(String[] args) throws Exception { + int i = 0; + switch (i) { + case (int)Float.NaN: // 0 + System.out.println("Float.NaN is a constant!"); + break; + case (int)Float.MIN_VALUE + 1: // 0 + 1 + System.out.println("Float.MIN_VALUE is a constant!"); + break; + case (int)Float.MIN_NORMAL + 2: // 0 + 2 + System.out.println("Float.MIN_NORMAL is a constant!"); + break; + case Float.MIN_EXPONENT: // -126 + System.out.println("Float.MIN_EXPONENT is a constant!"); + break; + case Float.MAX_EXPONENT: // 127 + System.out.println("Float.MAX_EXPONENT is a constant!"); + break; + case (int)Float.MAX_VALUE - 1: // Integer.MAX_VALUE - 1 + System.out.println("Float.MAX_VALUE is a constant!"); + break; + case (int)Float.POSITIVE_INFINITY: // Integer.MAX_VALUE + System.out.println("Float.POSITIVE_INFINITY is a constant!"); + break; + case (int)Float.NEGATIVE_INFINITY: // Integer.MIN_VALUE + System.out.println("Float.NEGATIVE_INFINITY is a constant!"); + break; + } + } +} diff --git a/jdk/test/java/lang/Float/Extrema.java b/jdk/test/java/lang/Float/Extrema.java new file mode 100644 index 00000000000..397b69bfa9a --- /dev/null +++ b/jdk/test/java/lang/Float/Extrema.java @@ -0,0 +1,45 @@ +/* + * Copyright 2001-2005 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4408489 4826652 + * @summary Testing values of Float.{MIN_VALUE, MIN_NORMAL, MAX_VALUE} + * @author Joseph D. Darcy + */ + +public class Extrema { + public static void main(String[] args) throws Exception { + if (Float.MIN_VALUE != Float.intBitsToFloat(0x1)) + throw new RuntimeException("Float.MIN_VALUE is not equal "+ + "to intBitsToFloat(0x1)."); + + if (Float.MIN_NORMAL != Float.intBitsToFloat(0x00800000)) + throw new RuntimeException("Float.MIN_NORMAL is not equal "+ + "to intBitsToFloat(0x00800000)."); + + if (Float.MAX_VALUE != Float.intBitsToFloat(0x7f7fffff)) + throw new RuntimeException("Float.MAX_VALUE is not equal "+ + "to intBitsToFloat(0x7f7fffff)."); + } +} diff --git a/jdk/test/java/lang/Float/NaNInfinityParsing.java b/jdk/test/java/lang/Float/NaNInfinityParsing.java new file mode 100644 index 00000000000..fd060958b87 --- /dev/null +++ b/jdk/test/java/lang/Float/NaNInfinityParsing.java @@ -0,0 +1,169 @@ +/* + * Copyright 2001 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4428772 + * @summary Testing recognition of "NaN" and "Infinity" strings + * @author Joseph D. Darcy + */ + + +public class NaNInfinityParsing { + /* + * Regression tests for: + * 4428772 -- Establish invariant for Float & Double classes and + * their string representations + * + * Added capability for parse{Float, Double} and related methods + * to recognize "NaN" and "Infinity" strings so that + * parseFloat(toString(d)) will always return the original + * floating-point value. + */ + + static String NaNStrings[] = { + "NaN", + "+NaN", + "-NaN" + }; + + static String infinityStrings[] = { + "Infinity", + "+Infinity", + "-Infinity", + }; + + static String invalidStrings[] = { + "+", + "-", + "@", + "N", + "Na", + "Nan", + "NaNf", + "NaNd", + "NaNF", + "NaND", + "+N", + "+Na", + "+Nan", + "+NaNf", + "+NaNd", + "+NaNF", + "+NaND", + "-N", + "-Na", + "-Nan", + "-NaNf", + "-NaNd", + "-NaNF", + "-NaND", + "I", + "In", + "Inf", + "Infi", + "Infin", + "Infini", + "Infinit", + "InfinitY", + "Infinityf", + "InfinityF", + "Infinityd", + "InfinityD", + "+I", + "+In", + "+Inf", + "+Infi", + "+Infin", + "+Infini", + "+Infinit", + "+InfinitY", + "+Infinityf", + "+InfinityF", + "+Infinityd", + "+InfinityD", + "-I", + "-In", + "-Inf", + "-Infi", + "-Infin", + "-Infini", + "-Infinit", + "-InfinitY", + "-Infinityf", + "-InfinityF", + "-Infinityd", + "-InfinityD", + "NaNInfinity", + "InfinityNaN", + "nan", + "infinity" + }; + + public static void main(String [] argv) throws Exception { + int i; + float d; + + // Test valid NaN strings + for(i = 0; i < NaNStrings.length; i++) { + if(!Float.isNaN(d=Float.parseFloat(NaNStrings[i]))) { + throw new RuntimeException("NaN string ``" + NaNStrings[i] + + "'' did not parse as a NaN; returned " + + d + " instead."); + } + } + + // Test valid Infinity strings + for(i = 0; i < infinityStrings.length; i++) { + if(!Float.isInfinite(d=Float.parseFloat(infinityStrings[i]))) { + throw new RuntimeException("Infinity string ``" + + infinityStrings[i] + + "'' did not parse as infinity; returned " + + d + "instead."); + } + // check sign of result + + boolean negative = (infinityStrings[i].charAt(0) == '-'); + if(d != (negative?Float.NEGATIVE_INFINITY: + Float.POSITIVE_INFINITY)) + throw new RuntimeException("Infinity has wrong sign;" + + (negative?"positive instead of negative.": + "negative instead of positive.")); + } + + // Test almost valid strings + for(i = 0; i < invalidStrings.length; i++) { + try { + float result; + d = Float.parseFloat(invalidStrings[i]); + throw new RuntimeException("Invalid string ``" + + invalidStrings[i] + +"'' parsed as " + d + "."); + } + catch(NumberFormatException e) { + // expected + } + } + + } +} diff --git a/jdk/test/java/lang/Float/ParseFloat.java b/jdk/test/java/lang/Float/ParseFloat.java new file mode 100644 index 00000000000..02b77be193b --- /dev/null +++ b/jdk/test/java/lang/Float/ParseFloat.java @@ -0,0 +1,210 @@ +/* + * Copyright 1998-2003 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4160406 4705734 4707389 + * @summary Tests for Float.parseFloat method + */ + +public class ParseFloat { + + private static void check(String val, float expected) { + float n = Float.parseFloat(val); + if (n != expected) + throw new RuntimeException("Float.parseFloat failed. String:" + + val + " Result:" + n); + } + + private static void rudimentaryTest() { + check(new String(""+Float.MIN_VALUE), Float.MIN_VALUE); + check(new String(""+Float.MAX_VALUE), Float.MAX_VALUE); + + check("10", (float) 10.0); + check("10.0", (float) 10.0); + check("10.01", (float) 10.01); + + check("-10", (float) -10.0); + check("-10.00", (float) -10.0); + check("-10.01", (float) -10.01); + } + + static String badStrings[] = { + "", + "+", + "-", + "+e", + "-e", + "+e170", + "-e170", + + // Make sure intermediate white space is not deleted. + "1234 e10", + "-1234 e10", + + // Control characters in the interior of a string are not legal + "1\u0007e1", + "1e\u00071", + + // NaN and infinity can't have trailing type suffices or exponents + "NaNf", + "NaNF", + "NaNd", + "NaND", + "-NaNf", + "-NaNF", + "-NaNd", + "-NaND", + "+NaNf", + "+NaNF", + "+NaNd", + "+NaND", + "Infinityf", + "InfinityF", + "Infinityd", + "InfinityD", + "-Infinityf", + "-InfinityF", + "-Infinityd", + "-InfinityD", + "+Infinityf", + "+InfinityF", + "+Infinityd", + "+InfinityD", + + "NaNe10", + "-NaNe10", + "+NaNe10", + "Infinitye10", + "-Infinitye10", + "+Infinitye10", + + // Non-ASCII digits are not recognized + "\u0661e\u0661", // 1e1 in Arabic-Indic digits + "\u06F1e\u06F1", // 1e1 in Extended Arabic-Indic digits + "\u0967e\u0967" // 1e1 in Devanagari digits + }; + + static String goodStrings[] = { + "NaN", + "+NaN", + "-NaN", + "Infinity", + "+Infinity", + "-Infinity", + "1.1e-23f", + ".1e-23f", + "1e-23", + "1f", + "1", + "2", + "1234", + "-1234", + "+1234", + "2147483647", // Integer.MAX_VALUE + "2147483648", + "-2147483648", // Integer.MIN_VALUE + "-2147483649", + + "16777215", + "16777216", // 2^24 + "16777217", + + "-16777215", + "-16777216", // -2^24 + "-16777217", + + "9007199254740991", + "9007199254740992", // 2^53 + "9007199254740993", + + "-9007199254740991", + "-9007199254740992", // -2^53 + "-9007199254740993", + + "9223372036854775807", + "9223372036854775808", // Long.MAX_VALUE + "9223372036854775809", + + "-9223372036854775808", + "-9223372036854775809", // Long.MIN_VALUE + "-9223372036854775810" + }; + + static String paddedBadStrings[]; + static String paddedGoodStrings[]; + static { + String pad = " \t\n\r\f\u0001\u000b\u001f"; + paddedBadStrings = new String[badStrings.length]; + for(int i = 0 ; i < badStrings.length; i++) + paddedBadStrings[i] = pad + badStrings[i] + pad; + + paddedGoodStrings = new String[goodStrings.length]; + for(int i = 0 ; i < goodStrings.length; i++) + paddedGoodStrings[i] = pad + goodStrings[i] + pad; + + } + + /* + * Throws an exception if Input is + * exceptionalInput and {@link Float.parseFloat + * parseFloat} does not throw an exception or if + * Input is not exceptionalInput and + * parseFloat throws an exception. This method does + * not attempt to test whether the string is converted to the + * proper value; just whether the input is accepted appropriately + * or not. + */ + private static void testParsing(String [] input, + boolean exceptionalInput) { + for(int i = 0; i < input.length; i++) { + double d; + + try { + d = Float.parseFloat(input[i]); + } + catch (NumberFormatException e) { + if (! exceptionalInput) { + throw new RuntimeException("Float.parseFloat rejected " + + "good string `" + input[i] + + "'."); + } + break; + } + if (exceptionalInput) { + throw new RuntimeException("Float.parseFloat accepted " + + "bad string `" + input[i] + + "'."); + } + } + } + + public static void main(String[] args) throws Exception { + rudimentaryTest(); + + testParsing(goodStrings, false); + testParsing(paddedGoodStrings, false); + testParsing(badStrings, true); + testParsing(paddedBadStrings, true); + } +} diff --git a/jdk/test/java/lang/Integer/BitTwiddle.java b/jdk/test/java/lang/Integer/BitTwiddle.java new file mode 100644 index 00000000000..4904ea5aa3d --- /dev/null +++ b/jdk/test/java/lang/Integer/BitTwiddle.java @@ -0,0 +1,137 @@ +/* + * Copyright 2003 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4495754 + * @summary Basic test for int bit twiddling + * @author Josh Bloch + * + * @compile -source 1.5 BitTwiddle.java + * @run main BitTwiddle + */ + +import java.util.Random; +import static java.lang.Integer.*; + +public class BitTwiddle { + private static final int N = 1000; // # of repetitions per test + + public static void main(String args[]) { + Random rnd = new Random(); + + if (highestOneBit(0) != 0) + throw new RuntimeException("a"); + if (highestOneBit(-1) != MIN_VALUE) + throw new RuntimeException("b"); + if (highestOneBit(1) != 1) + throw new RuntimeException("c"); + + if (lowestOneBit(0) != 0) + throw new RuntimeException("d"); + if (lowestOneBit(-1) != 1) + throw new RuntimeException("e"); + if (lowestOneBit(MIN_VALUE) != MIN_VALUE) + throw new RuntimeException("f"); + + for (int i = 0; i < N; i++) { + int x = rnd.nextInt(); + if (highestOneBit(x) != reverse(lowestOneBit(reverse(x)))) + throw new RuntimeException("g: " + toHexString(x)); + } + + if (numberOfLeadingZeros(0) != SIZE) + throw new RuntimeException("h"); + if (numberOfLeadingZeros(-1) != 0) + throw new RuntimeException("i"); + if (numberOfLeadingZeros(1) != (SIZE - 1)) + throw new RuntimeException("j"); + + if (numberOfTrailingZeros(0) != SIZE) + throw new RuntimeException("k"); + if (numberOfTrailingZeros(1) != 0) + throw new RuntimeException("l"); + if (numberOfTrailingZeros(MIN_VALUE) != (SIZE - 1)) + throw new RuntimeException("m"); + + for (int i = 0; i < N; i++) { + int x = rnd.nextInt(); + if (numberOfLeadingZeros(x) != numberOfTrailingZeros(reverse(x))) + throw new RuntimeException("n: " + toHexString(x)); + } + + if (bitCount(0) != 0) + throw new RuntimeException("o"); + + for (int i = 0; i < SIZE; i++) { + int pow2 = 1 << i; + if (bitCount(pow2) != 1) + throw new RuntimeException("p: " + i); + if (bitCount(pow2 -1) != i) + throw new RuntimeException("q: " + i); + } + + for (int i = 0; i < N; i++) { + int x = rnd.nextInt(); + if (bitCount(x) != bitCount(reverse(x))) + throw new RuntimeException("r: " + toHexString(x)); + } + + for (int i = 0; i < N; i++) { + int x = rnd.nextInt(); + int dist = rnd.nextInt(); + if (bitCount(x) != bitCount(rotateRight(x, dist))) + throw new RuntimeException("s: " + toHexString(x) + + toHexString(dist)); + if (bitCount(x) != bitCount(rotateLeft(x, dist))) + throw new RuntimeException("t: " + toHexString(x) + + toHexString(dist)); + if (rotateRight(x, dist) != rotateLeft(x, -dist)) + throw new RuntimeException("u: " + toHexString(x) + + toHexString(dist)); + if (rotateRight(x, -dist) != rotateLeft(x, dist)) + throw new RuntimeException("v: " + toHexString(x) + + toHexString(dist)); + } + + if (signum(0) != 0 || signum(1) != 1 || signum(-1) != -1 + || signum(MIN_VALUE) != -1 || signum(MAX_VALUE) != 1) + throw new RuntimeException("w"); + + for (int i = 0; i < N; i++) { + int x = rnd.nextInt(); + int sign = (x < 0 ? -1 : (x == 0 ? 0 : 1)); + if (signum(x) != sign) + throw new RuntimeException("x: " + toHexString(x)); + } + + if(reverseBytes(0xaabbccdd) != 0xddccbbaa) + throw new RuntimeException("y"); + + for (int i = 0; i < N; i++) { + int x = rnd.nextInt(); + if (bitCount(x) != bitCount(reverseBytes(x))) + throw new RuntimeException("z: " + toHexString(x)); + } + } +} diff --git a/jdk/test/java/lang/Integer/Decode.java b/jdk/test/java/lang/Integer/Decode.java new file mode 100644 index 00000000000..201fc2d1b88 --- /dev/null +++ b/jdk/test/java/lang/Integer/Decode.java @@ -0,0 +1,102 @@ +/* + * Copyright 2006 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4136371 5017980 6576055 + * @summary Test Integer.decode method + * @author madbot + * @author Joseph D. Darcy + */ + +/** + * There are six methods in java.lang.Integer which transform strings + * into an int or Integer value: + * + * public Integer(String s) + * public static Integer decode(String nm) + * public static int parseInteger(String s, int radix) + * public static int parseInteger(String s) + * public static Integer valueOf(String s, int radix) + * public static Integer valueOf(String s) + * + * The other five methods are tested elsewhere. + */ +public class Decode { + + private static void check(String val, int expected) { + int n = (Integer.decode(val)).intValue(); + if (n != expected) + throw new RuntimeException("Integer.decode failed. String:" + + val + " Result:" + n); + } + + private static void checkFailure(String val, String message) { + try { + int n = (Integer.decode(val)).intValue(); + throw new RuntimeException(message); + } catch (NumberFormatException e) { /* Okay */} + } + + public static void main(String[] args) throws Exception { + check(new String(""+Integer.MIN_VALUE), Integer.MIN_VALUE); + check(new String(""+Integer.MAX_VALUE), Integer.MAX_VALUE); + + check("10", 10); + check("0x10", 16); + check("0X10", 16); + check("010", 8); + check("#10", 16); + + check("+10", 10); + check("+0x10", 16); + check("+0X10", 16); + check("+010", 8); + check("+#10", 16); + + check("-10", -10); + check("-0x10", -16); + check("-0X10", -16); + check("-010", -8); + check("-#10", -16); + + check(Long.toString(Integer.MIN_VALUE), Integer.MIN_VALUE); + check(Long.toString(Integer.MAX_VALUE), Integer.MAX_VALUE); + + checkFailure("0x-10", "Integer.decode allows negative sign in wrong position."); + checkFailure("0x+10", "Integer.decode allows positive sign in wrong position."); + + checkFailure("+", "Raw plus sign allowed."); + checkFailure("-", "Raw minus sign allowed."); + + checkFailure(Long.toString((long)Integer.MIN_VALUE - 1L), "Out of range"); + checkFailure(Long.toString((long)Integer.MAX_VALUE + 1L), "Out of range"); + + checkFailure("", "Empty String"); + + try { + Integer.decode(null); + throw new RuntimeException("Integer.decode(null) expected to throw NPE"); + } catch (NullPointerException npe) {/* Okay */} + } +} diff --git a/jdk/test/java/lang/Integer/GetInteger.java b/jdk/test/java/lang/Integer/GetInteger.java new file mode 100644 index 00000000000..61a4e3c78cc --- /dev/null +++ b/jdk/test/java/lang/Integer/GetInteger.java @@ -0,0 +1,35 @@ +/* + * Copyright 1999 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4252315 + * @summary test Integer.getInteger method with empty key + */ + +public class GetInteger { + public static void main(String[] args) throws Exception { + Integer.getInteger("", 1); + Integer.getInteger(null, 1); + } +} diff --git a/jdk/test/java/lang/Integer/ParsingTest.java b/jdk/test/java/lang/Integer/ParsingTest.java new file mode 100644 index 00000000000..cd219fbcd11 --- /dev/null +++ b/jdk/test/java/lang/Integer/ParsingTest.java @@ -0,0 +1,94 @@ +/* + * Copyright 2006-2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 5017980 6576055 + * @summary Test parsing methods + * @author Joseph D. Darcy + */ + + +/** + * There are six methods in java.lang.Integer which transform strings + * into an int or Integer value: + * + * public Integer(String s) + * public static Integer decode(String nm) + * public static int parseInt(String s, int radix) + * public static int parseInt(String s) + * public static Integer valueOf(String s, int radix) + * public static Integer valueOf(String s) + * + * Besides decode, all the methods and constructor call down into + * parseInt(String, int) to do the actual work. Therefore, the + * behavior of parseInt(String, int) will be tested here. + */ + +public class ParsingTest { + public static void main(String... argv) { + check("+100", +100); + check("-100", -100); + + check("+0", 0); + check("-0", 0); + check("+00000", 0); + check("-00000", 0); + + check("0", 0); + check("1", 1); + check("9", 9); + + checkFailure("\u0000"); + checkFailure("\u002f"); + checkFailure("+"); + checkFailure("-"); + checkFailure("++"); + checkFailure("+-"); + checkFailure("-+"); + checkFailure("--"); + checkFailure("++100"); + checkFailure("--100"); + checkFailure("+-6"); + checkFailure("-+6"); + checkFailure("*100"); + } + + private static void check(String val, int expected) { + int n = Integer.parseInt(val); + if (n != expected) + throw new RuntimeException("Integer.parsedInt failed. String:" + + val + " Result:" + n); + } + + private static void checkFailure(String val) { + int n = 0; + try { + n = Integer.parseInt(val); + System.err.println("parseInt(" + val + ") incorrectly returned " + n); + throw new RuntimeException(); + } catch (NumberFormatException nfe) { + ; // Expected + } + } +} diff --git a/jdk/test/java/lang/Long/BitTwiddle.java b/jdk/test/java/lang/Long/BitTwiddle.java new file mode 100644 index 00000000000..fb1affd41dd --- /dev/null +++ b/jdk/test/java/lang/Long/BitTwiddle.java @@ -0,0 +1,137 @@ +/* + * Copyright 2003 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4495754 + * @summary Basic test for long bit twiddling + * @author Josh Bloch + * + * @compile -source 1.5 BitTwiddle.java + * @run main BitTwiddle + */ + +import java.util.Random; +import static java.lang.Long.*; + +public class BitTwiddle { + private static final int N = 1000; // # of repetitions per test + + public static void main(String args[]) { + Random rnd = new Random(); + + if (highestOneBit(0) != 0) + throw new RuntimeException("a"); + if (highestOneBit(-1) != MIN_VALUE) + throw new RuntimeException("b"); + if (highestOneBit(1) != 1) + throw new RuntimeException("c"); + + if (lowestOneBit(0) != 0) + throw new RuntimeException("d"); + if (lowestOneBit(-1) != 1) + throw new RuntimeException("e"); + if (lowestOneBit(MIN_VALUE) != MIN_VALUE) + throw new RuntimeException("f"); + + for (int i = 0; i < N; i++) { + long x = rnd.nextLong(); + if (highestOneBit(x) != reverse(lowestOneBit(reverse(x)))) + throw new RuntimeException("g: " + toHexString(x)); + } + + if (numberOfLeadingZeros(0) != SIZE) + throw new RuntimeException("h"); + if (numberOfLeadingZeros(-1) != 0) + throw new RuntimeException("i"); + if (numberOfLeadingZeros(1) != (SIZE - 1)) + throw new RuntimeException("j"); + + if (numberOfTrailingZeros(0) != SIZE) + throw new RuntimeException("k"); + if (numberOfTrailingZeros(1) != 0) + throw new RuntimeException("l"); + if (numberOfTrailingZeros(MIN_VALUE) != (SIZE - 1)) + throw new RuntimeException("m"); + + for (int i = 0; i < N; i++) { + long x = rnd.nextLong(); + if (numberOfLeadingZeros(x) != numberOfTrailingZeros(reverse(x))) + throw new RuntimeException("n: " + toHexString(x)); + } + + if (bitCount(0) != 0) + throw new RuntimeException("o"); + + for (int i = 0; i < SIZE; i++) { + long pow2 = 1L << i; + if (bitCount(pow2) != 1) + throw new RuntimeException("p: " + i); + if (bitCount(pow2 -1) != i) + throw new RuntimeException("q: " + i); + } + + for (int i = 0; i < N; i++) { + long x = rnd.nextLong(); + if (bitCount(x) != bitCount(reverse(x))) + throw new RuntimeException("r: " + toHexString(x)); + } + + for (int i = 0; i < N; i++) { + long x = rnd.nextLong(); + int dist = rnd.nextInt(); + if (bitCount(x) != bitCount(rotateRight(x, dist))) + throw new RuntimeException("s: " + toHexString(x) + + toHexString(dist)); + if (bitCount(x) != bitCount(rotateLeft(x, dist))) + throw new RuntimeException("t: " + toHexString(x) + + toHexString(dist)); + if (rotateRight(x, dist) != rotateLeft(x, -dist)) + throw new RuntimeException("u: " + toHexString(x) + + toHexString(dist)); + if (rotateRight(x, -dist) != rotateLeft(x, dist)) + throw new RuntimeException("v: " + toHexString(x) + + toHexString(dist)); + } + + if (signum(0) != 0 || signum(1) != 1 || signum(-1) != -1 + || signum(MIN_VALUE) != -1 || signum(MAX_VALUE) != 1) + throw new RuntimeException("w"); + + for (int i = 0; i < N; i++) { + long x = rnd.nextLong(); + int sign = (x < 0 ? -1 : (x == 0 ? 0 : 1)); + if (signum(x) != sign) + throw new RuntimeException("x: " + toHexString(x)); + } + + if(reverseBytes(0xaabbccdd11223344L) != 0x44332211ddccbbaaL) + throw new RuntimeException("y"); + + for (int i = 0; i < N; i++) { + long x = rnd.nextLong(); + if (bitCount(x) != bitCount(reverseBytes(x))) + throw new RuntimeException("z: " + toHexString(x)); + } + } +} diff --git a/jdk/test/java/lang/Long/Decode.java b/jdk/test/java/lang/Long/Decode.java new file mode 100644 index 00000000000..ae4c9cf6425 --- /dev/null +++ b/jdk/test/java/lang/Long/Decode.java @@ -0,0 +1,106 @@ +/* + * Copyright 1998-2006 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4136371 5017980 6576055 + * @summary Test Long.decode method + * @author madbot + * @author Joseph D. Darcy + */ + +import java.math.BigInteger; + +/** + * There are six methods in java.lang.Integer which transform strings + * into a long or Long value: + * + * public Long(String s) + * public static Long decode(String nm) + * public static long parseLong(String s, int radix) + * public static long parseLong(String s) + * public static Long valueOf(String s, int radix) + * public static Long valueOf(String s) + * + * The other five methods are tested elsewhere. + */ +public class Decode { + + private static void check(String val, long expected) { + long n = (Long.decode(val)).longValue(); + if (n != expected) + throw new RuntimeException("Long.decode failed. String:" + + val + " Result:" + n); + } + + private static void checkFailure(String val, String message) { + try { + long n = (Long.decode(val)).longValue(); + throw new RuntimeException(message); + } catch (NumberFormatException e) { /* Okay */} + } + + public static void main(String[] args) throws Exception { + check(new String(""+Long.MIN_VALUE), Long.MIN_VALUE); + check(new String(""+Long.MAX_VALUE), Long.MAX_VALUE); + + check("10", 10L); + check("0x10", 16L); + check("0X10", 16L); + check("010", 8L); + check("#10", 16L); + + check("+10", 10L); + check("+0x10", 16L); + check("+0X10", 16L); + check("+010", 8L); + check("+#10", 16L); + + check("-10", -10L); + check("-0x10", -16L); + check("-0X10", -16L); + check("-010", -8L); + check("-#10", -16L); + + check(Long.toString(Long.MIN_VALUE), Long.MIN_VALUE); + check(Long.toString(Long.MAX_VALUE), Long.MAX_VALUE); + + checkFailure("0x-10", "Long.decode allows negative sign in wrong position."); + checkFailure("0x+10", "Long.decode allows positive sign in wrong position."); + + checkFailure("+", "Raw plus sign allowed."); + checkFailure("-", "Raw minus sign allowed."); + + checkFailure(BigInteger.valueOf(Long.MIN_VALUE).subtract(BigInteger.ONE).toString(), + "Out of range"); + checkFailure(BigInteger.valueOf(Long.MAX_VALUE).add(BigInteger.ONE).toString(), + "Out of range"); + + checkFailure("", "Empty String"); + + try { + Long.decode(null); + throw new RuntimeException("Long.decode(null) expected to throw NPE"); + } catch (NullPointerException npe) {/* Okay */} + } +} diff --git a/jdk/test/java/lang/Long/GetLong.java b/jdk/test/java/lang/Long/GetLong.java new file mode 100644 index 00000000000..120271dfb3e --- /dev/null +++ b/jdk/test/java/lang/Long/GetLong.java @@ -0,0 +1,35 @@ +/* + * Copyright 1999 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4252322 + * @summary test Long.getLong method with empty key + */ + +public class GetLong { + public static void main(String[] args) throws Exception { + Long.getLong("", 1); + Long.getLong(null, 1); + } +} diff --git a/jdk/test/java/lang/Long/ParsingTest.java b/jdk/test/java/lang/Long/ParsingTest.java new file mode 100644 index 00000000000..8fbc08204de --- /dev/null +++ b/jdk/test/java/lang/Long/ParsingTest.java @@ -0,0 +1,94 @@ +/* + * Copyright 2006-2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 5017980 6576055 + * @summary Test parsing methods + * @author Joseph D. Darcy + */ + + +/** + * There are six methods in java.lang.Long which transform strings + * into a long or Long value: + * + * public Long(String s) + * public static Long decode(String nm) + * public static long parseLong(String s, int radix) + * public static long parseLong(String s) + * public static Long valueOf(String s, int radix) + * public static Long valueOf(String s) + * + * Besides decode, all the methods and constructor call down into + * parseLong(String, int) to do the actual work. Therefore, the + * behavior of parseLong(String, int) will be tested here. + */ + +public class ParsingTest { + public static void main(String... argv) { + check("+100", +100L); + check("-100", -100L); + + check("+0", 0L); + check("-0", 0L); + check("+00000", 0L); + check("-00000", 0L); + + check("0", 0L); + check("1", 1L); + check("9", 9L); + + checkFailure("\u0000"); + checkFailure("\u002f"); + checkFailure("+"); + checkFailure("-"); + checkFailure("++"); + checkFailure("+-"); + checkFailure("-+"); + checkFailure("--"); + checkFailure("++100"); + checkFailure("--100"); + checkFailure("+-6"); + checkFailure("-+6"); + checkFailure("*100"); + } + + private static void check(String val, long expected) { + long n = Long.parseLong(val); + if (n != expected) + throw new RuntimeException("Long.parsedLong failed. String:" + + val + " Result:" + n); + } + + private static void checkFailure(String val) { + long n = 0L; + try { + n = Long.parseLong(val); + System.err.println("parseLong(" + val + ") incorrectly returned " + n); + throw new RuntimeException(); + } catch (NumberFormatException nfe) { + ; // Expected + } + } +} diff --git a/jdk/test/java/lang/Math/AbsPositiveZero.java b/jdk/test/java/lang/Math/AbsPositiveZero.java new file mode 100644 index 00000000000..bfb8eeabebf --- /dev/null +++ b/jdk/test/java/lang/Math/AbsPositiveZero.java @@ -0,0 +1,73 @@ +/* + * Copyright 1998 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 4096278 + @summary Math.abs(+0.0) wrong + @author Anand Palaniswamy + */ +public class AbsPositiveZero { + private static boolean isPositiveZero(float f) { + return Float.floatToIntBits(f) == Float.floatToIntBits(0.0f); + } + + private static boolean isPositiveZero(double d) { + return Double.doubleToLongBits(d) == Double.doubleToLongBits(0.0d); + } + + public static void main(String[] args) throws Exception { + if (!isPositiveZero(Math.abs(-0.0d))) { + throw new Exception("abs(-0.0d) failed"); + } + if (!isPositiveZero(Math.abs(+0.0d))) { + throw new Exception("abs(+0.0d) failed"); + } + if (Math.abs(Double.POSITIVE_INFINITY) != Double.POSITIVE_INFINITY) { + throw new Exception("abs(+Inf) failed"); + } + if (Math.abs(Double.NEGATIVE_INFINITY) != Double.POSITIVE_INFINITY) { + throw new Exception("abs(-Inf) failed"); + } + double dnanval = Math.abs(Double.NaN); + if (dnanval == dnanval) { + throw new Exception("abs(NaN) failed"); + } + + if (!isPositiveZero(Math.abs(-0.0f))) { + throw new Exception("abs(-0.0f) failed"); + } + if (!isPositiveZero(Math.abs(+0.0f))) { + throw new Exception("abs(+0.0f) failed"); + } + if (Math.abs(Float.POSITIVE_INFINITY) != Float.POSITIVE_INFINITY) { + throw new Exception("abs(+Inf) failed"); + } + if (Math.abs(Float.NEGATIVE_INFINITY) != Float.POSITIVE_INFINITY) { + throw new Exception("abs(-Inf) failed"); + } + float fnanval = Math.abs(Float.NaN); + if (fnanval == fnanval) { + throw new Exception("abs(NaN) failed"); + } + } +} diff --git a/jdk/test/java/lang/Math/Atan2Tests.java b/jdk/test/java/lang/Math/Atan2Tests.java new file mode 100644 index 00000000000..0660ff3744c --- /dev/null +++ b/jdk/test/java/lang/Math/Atan2Tests.java @@ -0,0 +1,71 @@ +/* + * Copyright 2004 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4984407 + * @summary Tests for {Math, StrictMath}.atan2 + * @compile -source 1.5 Atan2Tests.java + * @run main Atan2Tests + * @author Joseph D. Darcy + */ + +public class Atan2Tests { + private Atan2Tests(){} + + static int testAtan2Case(double input1, double input2, double expected) { + int failures = 0; + failures += Tests.test("StrictMath.atan2(double, double)", input1, input2, + StrictMath.atan2(input1, input2), expected); + failures += Tests.test("Math.atan2(double, double)", input1, input2, + Math.atan2(input1, input2), expected); + + return failures; + } + + static int testAtan2() { + int failures = 0; + + double [][] testCases = { + {-3.0, Double.POSITIVE_INFINITY, -0.0}, + }; + + for (double[] testCase : testCases) { + failures+=testAtan2Case(testCase[0], testCase[1], testCase[2]); + } + + return failures; + } + + public static void main(String [] argv) { + int failures = 0; + + failures += testAtan2(); + + if (failures > 0) { + System.err.println("Testing atan2 incurred " + + failures + " failures."); + throw new RuntimeException(); + } + } +} diff --git a/jdk/test/java/lang/Math/CubeRootTests.java b/jdk/test/java/lang/Math/CubeRootTests.java new file mode 100644 index 00000000000..9b5bd329a3a --- /dev/null +++ b/jdk/test/java/lang/Math/CubeRootTests.java @@ -0,0 +1,336 @@ +/* + * Copyright 2003 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4347132 4939441 + * @summary Tests for {Math, StrictMath}.cbrt + * @author Joseph D. Darcy + */ + +import sun.misc.FpUtils; +import sun.misc.DoubleConsts; + +public class CubeRootTests { + private CubeRootTests(){} + + static final double infinityD = Double.POSITIVE_INFINITY; + static final double NaNd = Double.NaN; + + // Initialize shared random number generator + static java.util.Random rand = new java.util.Random(); + + static int testCubeRootCase(double input, double expected) { + int failures=0; + + double minus_input = -input; + double minus_expected = -expected; + + failures+=Tests.test("Math.cbrt(double)", input, + Math.cbrt(input), expected); + failures+=Tests.test("Math.cbrt(double)", minus_input, + Math.cbrt(minus_input), minus_expected); + failures+=Tests.test("StrictMath.cbrt(double)", input, + StrictMath.cbrt(input), expected); + failures+=Tests.test("StrictMath.cbrt(double)", minus_input, + StrictMath.cbrt(minus_input), minus_expected); + + return failures; + } + + static int testCubeRoot() { + int failures = 0; + double [][] testCases = { + {NaNd, NaNd}, + {Double.longBitsToDouble(0x7FF0000000000001L), NaNd}, + {Double.longBitsToDouble(0xFFF0000000000001L), NaNd}, + {Double.longBitsToDouble(0x7FF8555555555555L), NaNd}, + {Double.longBitsToDouble(0xFFF8555555555555L), NaNd}, + {Double.longBitsToDouble(0x7FFFFFFFFFFFFFFFL), NaNd}, + {Double.longBitsToDouble(0xFFFFFFFFFFFFFFFFL), NaNd}, + {Double.longBitsToDouble(0x7FFDeadBeef00000L), NaNd}, + {Double.longBitsToDouble(0xFFFDeadBeef00000L), NaNd}, + {Double.longBitsToDouble(0x7FFCafeBabe00000L), NaNd}, + {Double.longBitsToDouble(0xFFFCafeBabe00000L), NaNd}, + {Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY}, + {Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY}, + {+0.0, +0.0}, + {-0.0, -0.0}, + {+1.0, +1.0}, + {-1.0, -1.0}, + {+8.0, +2.0}, + {-8.0, -2.0} + }; + + for(int i = 0; i < testCases.length; i++) { + failures += testCubeRootCase(testCases[i][0], + testCases[i][1]); + } + + // Test integer perfect cubes less than 2^53. + for(int i = 0; i <= 208063; i++) { + double d = i; + failures += testCubeRootCase(d*d*d, (double)i); + } + + // Test cbrt(2^(3n)) = 2^n. + for(int i = 18; i <= DoubleConsts.MAX_EXPONENT/3; i++) { + failures += testCubeRootCase(FpUtils.scalb(1.0, 3*i), + FpUtils.scalb(1.0, i) ); + } + + // Test cbrt(2^(-3n)) = 2^-n. + for(int i = -1; i >= FpUtils.ilogb(Double.MIN_VALUE)/3; i--) { + failures += testCubeRootCase(FpUtils.scalb(1.0, 3*i), + FpUtils.scalb(1.0, i) ); + } + + // Test random perfect cubes. Create double values with + // modest exponents but only have at most the 17 most + // significant bits in the significand set; 17*3 = 51, which + // is less than the number of bits in a double's significand. + long exponentBits1 = + Double.doubleToLongBits(FpUtils.scalb(1.0, 55)) & + DoubleConsts.EXP_BIT_MASK; + long exponentBits2= + Double.doubleToLongBits(FpUtils.scalb(1.0, -55)) & + DoubleConsts.EXP_BIT_MASK; + for(int i = 0; i < 100; i++) { + // Take 16 bits since the 17th bit is implicit in the + // exponent + double input1 = + Double.longBitsToDouble(exponentBits1 | + // Significand bits + ((long) (rand.nextInt() & 0xFFFF))<< + (DoubleConsts.SIGNIFICAND_WIDTH-1-16)); + failures += testCubeRootCase(input1*input1*input1, input1); + + double input2 = + Double.longBitsToDouble(exponentBits2 | + // Significand bits + ((long) (rand.nextInt() & 0xFFFF))<< + (DoubleConsts.SIGNIFICAND_WIDTH-1-16)); + failures += testCubeRootCase(input2*input2*input2, input2); + } + + // Directly test quality of implementation properties of cbrt + // for values that aren't perfect cubes. Verify returned + // result meets the 1 ulp test. That is, we want to verify + // that for positive x > 1, + // y = cbrt(x), + // + // if (err1=x - y^3 ) < 0, abs((y_pp^3 -x )) < err1 + // if (err1=x - y^3 ) > 0, abs((y_mm^3 -x )) < err1 + // + // where y_mm and y_pp are the next smaller and next larger + // floating-point value to y. In other words, if y^3 is too + // big, making y larger does not improve the result; likewise, + // if y^3 is too small, making y smaller does not improve the + // result. + // + // ...-----|--?--|--?--|-----... Where is the true result? + // y_mm y y_pp + // + // The returned value y should be one of the floating-point + // values braketing the true result. However, given y, a + // priori we don't know if the true result falls in [y_mm, y] + // or [y, y_pp]. The above test looks at the error in x-y^3 + // to determine which region the true result is in; e.g. if + // y^3 is smaller than x, the true result should be in [y, + // y_pp]. Therefore, it would be an error for y_mm to be a + // closer approximation to x^(1/3). In this case, it is + // permissible, although not ideal, for y_pp^3 to be a closer + // approximation to x^(1/3) than y^3. + // + // We will use pow(y,3) to compute y^3. Although pow is not + // correctly rounded, StrictMath.pow should have at most 1 ulp + // error. For y > 1, pow(y_mm,3) and pow(y_pp,3) will differ + // from pow(y,3) by more than one ulp so the comparision of + // errors should still be valid. + + for(int i = 0; i < 1000; i++) { + double d = 1.0 + rand.nextDouble(); + double err, err_adjacent; + + double y1 = Math.cbrt(d); + double y2 = StrictMath.cbrt(d); + + err = d - StrictMath.pow(y1, 3); + if (err != 0.0) { + if(FpUtils.isNaN(err)) { + failures++; + System.err.println("Encountered unexpected NaN value: d = " + d + + "\tcbrt(d) = " + y1); + } else { + if (err < 0.0) { + err_adjacent = StrictMath.pow(FpUtils.nextUp(y1), 3) - d; + } + else { // (err > 0.0) + err_adjacent = StrictMath.pow(FpUtils.nextAfter(y1,0.0), 3) - d; + } + + if (Math.abs(err) > Math.abs(err_adjacent)) { + failures++; + System.err.println("For Math.cbrt(" + d + "), returned result " + + y1 + "is not as good as adjacent value."); + } + } + } + + + err = d - StrictMath.pow(y2, 3); + if (err != 0.0) { + if(FpUtils.isNaN(err)) { + failures++; + System.err.println("Encountered unexpected NaN value: d = " + d + + "\tcbrt(d) = " + y2); + } else { + if (err < 0.0) { + err_adjacent = StrictMath.pow(FpUtils.nextUp(y2), 3) - d; + } + else { // (err > 0.0) + err_adjacent = StrictMath.pow(FpUtils.nextAfter(y2,0.0), 3) - d; + } + + if (Math.abs(err) > Math.abs(err_adjacent)) { + failures++; + System.err.println("For StrictMath.cbrt(" + d + "), returned result " + + y2 + "is not as good as adjacent value."); + } + } + } + + + } + + // Test monotonicity properites near perfect cubes; test two + // numbers before and two numbers after; i.e. for + // + // pcNeighbors[] = + // {nextDown(nextDown(pc)), + // nextDown(pc), + // pc, + // nextUp(pc), + // nextUp(nextUp(pc))} + // + // test that cbrt(pcNeighbors[i]) <= cbrt(pcNeighbors[i+1]) + { + + double pcNeighbors[] = new double[5]; + double pcNeighborsCbrt[] = new double[5]; + double pcNeighborsStrictCbrt[] = new double[5]; + + // Test near cbrt(2^(3n)) = 2^n. + for(int i = 18; i <= DoubleConsts.MAX_EXPONENT/3; i++) { + double pc = FpUtils.scalb(1.0, 3*i); + + pcNeighbors[2] = pc; + pcNeighbors[1] = FpUtils.nextDown(pc); + pcNeighbors[0] = FpUtils.nextDown(pcNeighbors[1]); + pcNeighbors[3] = FpUtils.nextUp(pc); + pcNeighbors[4] = FpUtils.nextUp(pcNeighbors[3]); + + for(int j = 0; j < pcNeighbors.length; j++) { + pcNeighborsCbrt[j] = Math.cbrt(pcNeighbors[j]); + pcNeighborsStrictCbrt[j] = StrictMath.cbrt(pcNeighbors[j]); + } + + for(int j = 0; j < pcNeighborsCbrt.length-1; j++) { + if(pcNeighborsCbrt[j] > pcNeighborsCbrt[j+1] ) { + failures++; + System.err.println("Monotonicity failure for Math.cbrt on " + + pcNeighbors[j] + " and " + + pcNeighbors[j+1] + "\n\treturned " + + pcNeighborsCbrt[j] + " and " + + pcNeighborsCbrt[j+1] ); + } + + if(pcNeighborsStrictCbrt[j] > pcNeighborsStrictCbrt[j+1] ) { + failures++; + System.err.println("Monotonicity failure for StrictMath.cbrt on " + + pcNeighbors[j] + " and " + + pcNeighbors[j+1] + "\n\treturned " + + pcNeighborsStrictCbrt[j] + " and " + + pcNeighborsStrictCbrt[j+1] ); + } + + + } + + } + + // Test near cbrt(2^(-3n)) = 2^-n. + for(int i = -1; i >= FpUtils.ilogb(Double.MIN_VALUE)/3; i--) { + double pc = FpUtils.scalb(1.0, 3*i); + + pcNeighbors[2] = pc; + pcNeighbors[1] = FpUtils.nextDown(pc); + pcNeighbors[0] = FpUtils.nextDown(pcNeighbors[1]); + pcNeighbors[3] = FpUtils.nextUp(pc); + pcNeighbors[4] = FpUtils.nextUp(pcNeighbors[3]); + + for(int j = 0; j < pcNeighbors.length; j++) { + pcNeighborsCbrt[j] = Math.cbrt(pcNeighbors[j]); + pcNeighborsStrictCbrt[j] = StrictMath.cbrt(pcNeighbors[j]); + } + + for(int j = 0; j < pcNeighborsCbrt.length-1; j++) { + if(pcNeighborsCbrt[j] > pcNeighborsCbrt[j+1] ) { + failures++; + System.err.println("Monotonicity failure for Math.cbrt on " + + pcNeighbors[j] + " and " + + pcNeighbors[j+1] + "\n\treturned " + + pcNeighborsCbrt[j] + " and " + + pcNeighborsCbrt[j+1] ); + } + + if(pcNeighborsStrictCbrt[j] > pcNeighborsStrictCbrt[j+1] ) { + failures++; + System.err.println("Monotonicity failure for StrictMath.cbrt on " + + pcNeighbors[j] + " and " + + pcNeighbors[j+1] + "\n\treturned " + + pcNeighborsStrictCbrt[j] + " and " + + pcNeighborsStrictCbrt[j+1] ); + } + + + } + } + } + + return failures; + } + + public static void main(String argv[]) { + int failures = 0; + + failures += testCubeRoot(); + + if (failures > 0) { + System.err.println("Testing cbrt incurred " + + failures + " failures."); + throw new RuntimeException(); + } + } + +} diff --git a/jdk/test/java/lang/Math/Expm1Tests.java b/jdk/test/java/lang/Math/Expm1Tests.java new file mode 100644 index 00000000000..a9ff06b4aa9 --- /dev/null +++ b/jdk/test/java/lang/Math/Expm1Tests.java @@ -0,0 +1,231 @@ +/* + * Copyright 2003 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4851638 4900189 4939441 + * @summary Tests for {Math, StrictMath}.expm1 + * @author Joseph D. Darcy + */ + +import sun.misc.DoubleConsts; +import sun.misc.FpUtils; + +/* + * The Taylor expansion of expxm1(x) = exp(x) -1 is + * + * 1 + x/1! + x^2/2! + x^3/3| + ... -1 = + * + * x + x^2/2! + x^3/3 + ... + * + * Therefore, for small values of x, expxm1 ~= x. + * + * For large values of x, expxm1(x) ~= exp(x) + * + * For large negative x, expxm1(x) ~= -1. + */ + +public class Expm1Tests { + + private Expm1Tests(){} + + static final double infinityD = Double.POSITIVE_INFINITY; + static final double NaNd = Double.NaN; + + static int testExpm1() { + int failures = 0; + + double [][] testCases = { + {Double.NaN, NaNd}, + {Double.longBitsToDouble(0x7FF0000000000001L), NaNd}, + {Double.longBitsToDouble(0xFFF0000000000001L), NaNd}, + {Double.longBitsToDouble(0x7FF8555555555555L), NaNd}, + {Double.longBitsToDouble(0xFFF8555555555555L), NaNd}, + {Double.longBitsToDouble(0x7FFFFFFFFFFFFFFFL), NaNd}, + {Double.longBitsToDouble(0xFFFFFFFFFFFFFFFFL), NaNd}, + {Double.longBitsToDouble(0x7FFDeadBeef00000L), NaNd}, + {Double.longBitsToDouble(0xFFFDeadBeef00000L), NaNd}, + {Double.longBitsToDouble(0x7FFCafeBabe00000L), NaNd}, + {Double.longBitsToDouble(0xFFFCafeBabe00000L), NaNd}, + {infinityD, infinityD}, + {-infinityD, -1.0}, + {-0.0, -0.0}, + {+0.0, +0.0}, + }; + + // Test special cases + for(int i = 0; i < testCases.length; i++) { + failures += testExpm1CaseWithUlpDiff(testCases[i][0], + testCases[i][1], 0, null); + } + + + // For |x| < 2^-54 expm1(x) ~= x + for(int i = DoubleConsts.MIN_SUB_EXPONENT; i <= -54; i++) { + double d = FpUtils.scalb(2, i); + failures += testExpm1Case(d, d); + failures += testExpm1Case(-d, -d); + } + + + // For values of y where exp(y) > 2^54, expm1(x) ~= exp(x). + // The least such y is ln(2^54) ~= 37.42994775023705; exp(x) + // overflows for x > ~= 709.8 + + // Use a 2-ulp error threshold to account for errors in the + // exp implementation; the increments of d in the loop will be + // exact. + for(double d = 37.5; d <= 709.5; d += 1.0) { + failures += testExpm1CaseWithUlpDiff(d, StrictMath.exp(d), 2, null); + } + + // For x > 710, expm1(x) should be infinity + for(int i = 10; i <= DoubleConsts.MAX_EXPONENT; i++) { + double d = FpUtils.scalb(2, i); + failures += testExpm1Case(d, infinityD); + } + + // By monotonicity, once the limit is reached, the + // implemenation should return the limit for all smaller + // values. + boolean reachedLimit [] = {false, false}; + + // Once exp(y) < 0.5 * ulp(1), expm1(y) ~= -1.0; + // The greatest such y is ln(2^-53) ~= -36.7368005696771. + for(double d = -36.75; d >= -127.75; d -= 1.0) { + failures += testExpm1CaseWithUlpDiff(d, -1.0, 1, + reachedLimit); + } + + for(int i = 7; i <= DoubleConsts.MAX_EXPONENT; i++) { + double d = -FpUtils.scalb(2, i); + failures += testExpm1CaseWithUlpDiff(d, -1.0, 1, reachedLimit); + } + + // Test for monotonicity failures near multiples of log(2). + // Test two numbers before and two numbers after each chosen + // value; i.e. + // + // pcNeighbors[] = + // {nextDown(nextDown(pc)), + // nextDown(pc), + // pc, + // nextUp(pc), + // nextUp(nextUp(pc))} + // + // and we test that expm1(pcNeighbors[i]) <= expm1(pcNeighbors[i+1]) + { + double pcNeighbors[] = new double[5]; + double pcNeighborsExpm1[] = new double[5]; + double pcNeighborsStrictExpm1[] = new double[5]; + + for(int i = -50; i <= 50; i++) { + double pc = StrictMath.log(2)*i; + + pcNeighbors[2] = pc; + pcNeighbors[1] = FpUtils.nextDown(pc); + pcNeighbors[0] = FpUtils.nextDown(pcNeighbors[1]); + pcNeighbors[3] = FpUtils.nextUp(pc); + pcNeighbors[4] = FpUtils.nextUp(pcNeighbors[3]); + + for(int j = 0; j < pcNeighbors.length; j++) { + pcNeighborsExpm1[j] = Math.expm1(pcNeighbors[j]); + pcNeighborsStrictExpm1[j] = StrictMath.expm1(pcNeighbors[j]); + } + + for(int j = 0; j < pcNeighborsExpm1.length-1; j++) { + if(pcNeighborsExpm1[j] > pcNeighborsExpm1[j+1] ) { + failures++; + System.err.println("Monotonicity failure for Math.expm1 on " + + pcNeighbors[j] + " and " + + pcNeighbors[j+1] + "\n\treturned " + + pcNeighborsExpm1[j] + " and " + + pcNeighborsExpm1[j+1] ); + } + + if(pcNeighborsStrictExpm1[j] > pcNeighborsStrictExpm1[j+1] ) { + failures++; + System.err.println("Monotonicity failure for StrictMath.expm1 on " + + pcNeighbors[j] + " and " + + pcNeighbors[j+1] + "\n\treturned " + + pcNeighborsStrictExpm1[j] + " and " + + pcNeighborsStrictExpm1[j+1] ); + } + + + } + + } + } + + return failures; + } + + public static int testExpm1Case(double input, + double expected) { + return testExpm1CaseWithUlpDiff(input, expected, 1, null); + } + + public static int testExpm1CaseWithUlpDiff(double input, + double expected, + double ulps, + boolean [] reachedLimit) { + int failures = 0; + double mathUlps = ulps, strictUlps = ulps; + double mathOutput; + double strictOutput; + + if (reachedLimit != null) { + if (reachedLimit[0]) + mathUlps = 0; + + if (reachedLimit[1]) + strictUlps = 0; + } + + failures += Tests.testUlpDiffWithLowerBound("Math.expm1(double)", + input, mathOutput=Math.expm1(input), + expected, mathUlps, -1.0); + failures += Tests.testUlpDiffWithLowerBound("StrictMath.expm1(double)", + input, strictOutput=StrictMath.expm1(input), + expected, strictUlps, -1.0); + if (reachedLimit != null) { + reachedLimit[0] |= (mathOutput == -1.0); + reachedLimit[1] |= (strictOutput == -1.0); + } + + return failures; + } + + public static void main(String argv[]) { + int failures = 0; + + failures += testExpm1(); + + if (failures > 0) { + System.err.println("Testing expm1 incurred " + + failures + " failures."); + throw new RuntimeException(); + } + } +} diff --git a/jdk/test/java/lang/Math/HyperbolicTests.java b/jdk/test/java/lang/Math/HyperbolicTests.java new file mode 100644 index 00000000000..c93ea4b795a --- /dev/null +++ b/jdk/test/java/lang/Math/HyperbolicTests.java @@ -0,0 +1,1065 @@ +/* + * Copyright 2003 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4851625 4900189 4939441 + * @summary Tests for {Math, StrictMath}.{sinh, cosh, tanh} + * @author Joseph D. Darcy + */ + +import sun.misc.DoubleConsts; +import sun.misc.FpUtils; + +public class HyperbolicTests { + private HyperbolicTests(){} + + static final double NaNd = Double.NaN; + + /** + * Test accuracy of {Math, StrictMath}.sinh. The specified + * accuracy is 2.5 ulps. + * + * The defintion of sinh(x) is + * + * (e^x - e^(-x))/2 + * + * The series expansion of sinh(x) = + * + * x + x^3/3! + x^5/5! + x^7/7! +... + * + * Therefore, + * + * 1. For large values of x sinh(x) ~= signum(x)*exp(|x|)/2 + * + * 2. For small values of x, sinh(x) ~= x. + * + * Additionally, sinh is an odd function; sinh(-x) = -sinh(x). + * + */ + static int testSinh() { + int failures = 0; + /* + * Array elements below generated using a quad sinh + * implementation. Rounded to a double, the quad result + * *should* be correctly rounded, unless we are quite unlucky. + * Assuming the quad value is a correctly rounded double, the + * allowed error is 3.0 ulps instead of 2.5 since the quad + * value rounded to double can have its own 1/2 ulp error. + */ + double [][] testCases = { + // x sinh(x) + {0.0625, 0.06254069805219182172183988501029229}, + {0.1250, 0.12532577524111545698205754229137154}, + {0.1875, 0.18860056562029018382047025055167585}, + {0.2500, 0.25261231680816830791412515054205787}, + {0.3125, 0.31761115611357728583959867611490292}, + {0.3750, 0.38385106791361456875429567642050245}, + {0.4375, 0.45159088610312053032509815226723017}, + {0.5000, 0.52109530549374736162242562641149155}, + {0.5625, 0.59263591611468777373870867338492247}, + {0.6250, 0.66649226445661608227260655608302908}, + {0.6875, 0.74295294580567543571442036910465007}, + {0.7500, 0.82231673193582998070366163444691386}, + {0.8125, 0.90489373856606433650504536421491368}, + {0.8750, 0.99100663714429475605317427568995231}, + {0.9375, 1.08099191569306394011007867453992548}, + {1.0000, 1.17520119364380145688238185059560082}, + {1.0625, 1.27400259579739321279181130344911907}, + {1.1250, 1.37778219077984075760379987065228373}, + {1.1875, 1.48694549961380717221109202361777593}, + {1.2500, 1.60191908030082563790283030151221415}, + {1.3125, 1.72315219460596010219069206464391528}, + {1.3750, 1.85111856355791532419998548438506416}, + {1.4375, 1.98631821852425112898943304217629457}, + {1.5000, 2.12927945509481749683438749467763195}, + {1.5625, 2.28056089740825247058075476705718764}, + {1.6250, 2.44075368098794353221372986997161132}, + {1.6875, 2.61048376261693140366028569794027603}, + {1.7500, 2.79041436627764265509289122308816092}, + {1.8125, 2.98124857471401377943765253243875520}, + {1.8750, 3.18373207674259205101326780071803724}, + {1.9375, 3.39865608104779099764440244167531810}, + {2.0000, 3.62686040784701876766821398280126192}, + {2.0625, 3.86923677050642806693938384073620450}, + {2.1250, 4.12673225993027252260441410537905269}, + {2.1875, 4.40035304533919660406976249684469164}, + {2.2500, 4.69116830589833069188357567763552003}, + {2.3125, 5.00031440855811351554075363240262157}, + {2.3750, 5.32899934843284576394645856548481489}, + {2.4375, 5.67850746906785056212578751630266858}, + {2.5000, 6.05020448103978732145032363835040319}, + {2.5625, 6.44554279850040875063706020260185553}, + {2.6250, 6.86606721451642172826145238779845813}, + {2.6875, 7.31342093738196587585692115636603571}, + {2.7500, 7.78935201149073201875513401029935330}, + {2.8125, 8.29572014785741787167717932988491961}, + {2.8750, 8.83450399097893197351853322827892144}, + {2.9375, 9.40780885043076394429977972921690859}, + {3.0000, 10.01787492740990189897459361946582867}, + {3.0625, 10.66708606836969224165124519209968368}, + {3.1250, 11.35797907995166028304704128775698426}, + {3.1875, 12.09325364161259019614431093344260209}, + {3.2500, 12.87578285468067003959660391705481220}, + {3.3125, 13.70862446906136798063935858393686525}, + {3.3750, 14.59503283146163690015482636921657975}, + {3.4375, 15.53847160182039311025096666980558478}, + {3.5000, 16.54262728763499762495673152901249743}, + {3.5625, 17.61142364906941482858466494889121694}, + {3.6250, 18.74903703113232171399165788088277979}, + {3.6875, 19.95991268283598684128844120984214675}, + {3.7500, 21.24878212710338697364101071825171163}, + {3.8125, 22.62068164929685091969259499078125023}, + {3.8750, 24.08097197661255803883403419733891573}, + {3.9375, 25.63535922523855307175060244757748997}, + {4.0000, 27.28991719712775244890827159079382096}, + {4.0625, 29.05111111351106713777825462100160185}, + {4.1250, 30.92582287788986031725487699744107092}, + {4.1875, 32.92137796722343190618721270937061472}, + {4.2500, 35.04557405638942942322929652461901154}, + {4.3125, 37.30671148776788628118833357170042385}, + {4.3750, 39.71362570500944929025069048612806024}, + {4.4375, 42.27572177772344954814418332587050658}, + {4.5000, 45.00301115199178562180965680564371424}, + {4.5625, 47.90615077031205065685078058248081891}, + {4.6250, 50.99648471383193131253995134526177467}, + {4.6875, 54.28608852959281437757368957713936555}, + {4.7500, 57.78781641599226874961859781628591635}, + {4.8125, 61.51535145084362283008545918273109379}, + {4.8750, 65.48325905829987165560146562921543361}, + {4.9375, 69.70704392356508084094318094283346381}, + {5.0000, 74.20321057778875897700947199606456364}, + {5.0625, 78.98932788987998983462810080907521151}, + {5.1250, 84.08409771724448958901392613147384951}, + {5.1875, 89.50742798369883598816307922895346849}, + {5.2500, 95.28051047011540739630959111303975956}, + {5.3125, 101.42590362176666730633859252034238987}, + {5.3750, 107.96762069594029162704530843962700133}, + {5.4375, 114.93122359426386042048760580590182604}, + {5.5000, 122.34392274639096192409774240457730721}, + {5.5625, 130.23468343534638291488502321709913206}, + {5.6250, 138.63433897999898233879574111119546728}, + {5.6875, 147.57571121692522056519568264304815790}, + {5.7500, 157.09373875244884423880085377625986165}, + {5.8125, 167.22561348600435888568183143777868662}, + {5.8750, 178.01092593829229887752609866133883987}, + {5.9375, 189.49181995209921964640216682906501778}, + {6.0000, 201.71315737027922812498206768797872263}, + {6.0625, 214.72269333437984291483666459592578915}, + {6.1250, 228.57126288889537420461281285729970085}, + {6.1875, 243.31297962030799867970551767086092471}, + {6.2500, 259.00544710710289911522315435345489966}, + {6.3125, 275.70998400700299790136562219920451185}, + {6.3750, 293.49186366095654566861661249898332253}, + {6.4375, 312.42056915013535342987623229485223434}, + {6.5000, 332.57006480258443156075705566965111346}, + {6.5625, 354.01908521044116928437570109827956007}, + {6.6250, 376.85144288706511933454985188849781703}, + {6.6875, 401.15635576625530823119100750634165252}, + {6.7500, 427.02879582326538080306830640235938517}, + {6.8125, 454.56986017986077163530945733572724452}, + {6.8750, 483.88716614351897894746751705315210621}, + {6.9375, 515.09527172439720070161654727225752288}, + {7.0000, 548.31612327324652237375611757601851598}, + {7.0625, 583.67953198942753384680988096024373270}, + {7.1250, 621.32368116099280160364794462812762880}, + {7.1875, 661.39566611888784148449430491465857519}, + {7.2500, 704.05206901515336623551137120663358760}, + {7.3125, 749.45957067108712382864538206200700256}, + {7.3750, 797.79560188617531521347351754559776282}, + {7.4375, 849.24903675279739482863565789325699416}, + {7.5000, 904.02093068584652953510919038935849651}, + {7.5625, 962.32530605113249628368993221570636328}, + {7.6250, 1024.38998846242707559349318193113614698}, + {7.6875, 1090.45749701500081956792547346904792325}, + {7.7500, 1160.78599193425808533255719118417856088}, + {7.8125, 1235.65028334242796895820912936318532502}, + {7.8750, 1315.34290508508890654067255740428824014}, + {7.9375, 1400.17525781352742299995139486063802583}, + {8.0000, 1490.47882578955018611587663903188144796}, + {8.0625, 1586.60647216744061169450001100145859236}, + {8.1250, 1688.93381781440241350635231605477507900}, + {8.1875, 1797.86070905726094477721128358866360644}, + {8.2500, 1913.81278009067446281883262689250118009}, + {8.3125, 2037.24311615199935553277163192983440062}, + {8.3750, 2168.63402396170125867037749369723761636}, + {8.4375, 2308.49891634734644432370720900969004306}, + {8.5000, 2457.38431841538268239359965370719928775}, + {8.5625, 2615.87200310986940554256648824234335262}, + {8.6250, 2784.58126450289932429469130598902487336}, + {8.6875, 2964.17133769964321637973459949999057146}, + {8.7500, 3155.34397481384944060352507473513108710}, + {8.8125, 3358.84618707947841898217318996045550438}, + {8.8750, 3575.47316381333288862617411467285480067}, + {8.9375, 3806.07137963459383403903729660349293583}, + {9.0000, 4051.54190208278996051522359589803425598}, + {9.0625, 4312.84391255878980330955246931164633615}, + {9.1250, 4590.99845434696991399363282718106006883}, + {9.1875, 4887.09242236403719571363798584676797558}, + {9.2500, 5202.28281022453561319352901552085348309}, + {9.3125, 5537.80123121853803935727335892054791265}, + {9.3750, 5894.95873086734181634245918412592155656}, + {9.4375, 6275.15090986233399457103055108344546942}, + {9.5000, 6679.86337740502119410058225086262108741}, + {9.5625, 7110.67755625726876329967852256934334025}, + {9.6250, 7569.27686218510919585241049433331592115}, + {9.6875, 8057.45328194243077504648484392156371121}, + {9.7500, 8577.11437549816065709098061006273039092}, + {9.8125, 9130.29072986829727910801024120918114778}, + {9.8750, 9719.14389367880274015504995181862860062}, + {9.9375, 10345.97482346383208590278839409938269134}, + {10.0000, 11013.23287470339337723652455484636420303}, + }; + + for(int i = 0; i < testCases.length; i++) { + double [] testCase = testCases[i]; + failures += testSinhCaseWithUlpDiff(testCase[0], + testCase[1], + 3.0); + } + + double [][] specialTestCases = { + {0.0, 0.0}, + {NaNd, NaNd}, + {Double.longBitsToDouble(0x7FF0000000000001L), NaNd}, + {Double.longBitsToDouble(0xFFF0000000000001L), NaNd}, + {Double.longBitsToDouble(0x7FF8555555555555L), NaNd}, + {Double.longBitsToDouble(0xFFF8555555555555L), NaNd}, + {Double.longBitsToDouble(0x7FFFFFFFFFFFFFFFL), NaNd}, + {Double.longBitsToDouble(0xFFFFFFFFFFFFFFFFL), NaNd}, + {Double.longBitsToDouble(0x7FFDeadBeef00000L), NaNd}, + {Double.longBitsToDouble(0xFFFDeadBeef00000L), NaNd}, + {Double.longBitsToDouble(0x7FFCafeBabe00000L), NaNd}, + {Double.longBitsToDouble(0xFFFCafeBabe00000L), NaNd}, + {Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY} + }; + + for(int i = 0; i < specialTestCases.length; i++) { + failures += testSinhCaseWithUlpDiff(specialTestCases[i][0], + specialTestCases[i][1], + 0.0); + } + + // For powers of 2 less than 2^(-27), the second and + // subsequent terms of the Taylor series expansion will get + // rounded away since |n-n^3| > 53, the binary precision of a + // double significand. + + for(int i = DoubleConsts.MIN_SUB_EXPONENT; i < -27; i++) { + double d = FpUtils.scalb(2.0, i); + + // Result and expected are the same. + failures += testSinhCaseWithUlpDiff(d, d, 2.5); + } + + // For values of x larger than 22, the e^(-x) term is + // insignificant to the floating-point result. Util exp(x) + // overflows around 709.8, sinh(x) ~= exp(x)/2; will will test + // 10000 values in this range. + + long trans22 = Double.doubleToLongBits(22.0); + // (approximately) largest value such that exp shouldn't + // overflow + long transExpOvfl = Double.doubleToLongBits(FpUtils.nextDown(709.7827128933841)); + + for(long i = trans22; + i < transExpOvfl; + i +=(transExpOvfl-trans22)/10000) { + + double d = Double.longBitsToDouble(i); + + // Allow 3.5 ulps of error to deal with error in exp. + failures += testSinhCaseWithUlpDiff(d, StrictMath.exp(d)*0.5, 3.5); + } + + // (approximately) largest value such that sinh shouldn't + // overflow. + long transSinhOvfl = Double.doubleToLongBits(710.4758600739439); + + // Make sure sinh(x) doesn't overflow as soon as exp(x) + // overflows. + + /* + * For large values of x, sinh(x) ~= 0.5*(e^x). Therefore, + * + * sinh(x) ~= e^(ln 0.5) * e^x = e^(x + ln 0.5) + * + * So, we can calculate the approximate expected result as + * exp(x + -0.693147186). However, this sum suffers from + * roundoff, limiting the accuracy of the approximation. The + * accuracy can be improved by recovering the rounded-off + * information. Since x is larger than ln(0.5), the trailing + * bits of ln(0.5) get rounded away when the two values are + * added. However, high-order bits of ln(0.5) that + * contribute to the sum can be found: + * + * offset = log(0.5); + * effective_offset = (x + offset) - x; // exact subtraction + * rounded_away_offset = offset - effective_offset; // exact subtraction + * + * Therefore, the product + * + * exp(x + offset)*exp(rounded_away_offset) + * + * will be a better approximation to the exact value of + * + * e^(x + offset) + * + * than exp(x+offset) alone. (The expected result cannot be + * computed as exp(x)*exp(offset) since exp(x) by itself would + * overflow to infinity.) + */ + double offset = StrictMath.log(0.5); + for(long i = transExpOvfl+1; i < transSinhOvfl; + i += (transSinhOvfl-transExpOvfl)/1000 ) { + double input = Double.longBitsToDouble(i); + + double expected = + StrictMath.exp(input + offset) * + StrictMath.exp( offset - ((input + offset) - input) ); + + failures += testSinhCaseWithUlpDiff(input, expected, 4.0); + } + + // sinh(x) overflows for values greater than 710; in + // particular, it overflows for all 2^i, i > 10. + for(int i = 10; i <= DoubleConsts.MAX_EXPONENT; i++) { + double d = FpUtils.scalb(2.0, i); + + // Result and expected are the same. + failures += testSinhCaseWithUlpDiff(d, + Double.POSITIVE_INFINITY, 0.0); + } + + return failures; + } + + public static int testSinhCaseWithTolerance(double input, + double expected, + double tolerance) { + int failures = 0; + failures += Tests.testTolerance("Math.sinh(double)", + input, Math.sinh(input), + expected, tolerance); + failures += Tests.testTolerance("Math.sinh(double)", + -input, Math.sinh(-input), + -expected, tolerance); + + failures += Tests.testTolerance("StrictMath.sinh(double)", + input, StrictMath.sinh(input), + expected, tolerance); + failures += Tests.testTolerance("StrictMath.sinh(double)", + -input, StrictMath.sinh(-input), + -expected, tolerance); + return failures; + } + + public static int testSinhCaseWithUlpDiff(double input, + double expected, + double ulps) { + int failures = 0; + failures += Tests.testUlpDiff("Math.sinh(double)", + input, Math.sinh(input), + expected, ulps); + failures += Tests.testUlpDiff("Math.sinh(double)", + -input, Math.sinh(-input), + -expected, ulps); + + failures += Tests.testUlpDiff("StrictMath.sinh(double)", + input, StrictMath.sinh(input), + expected, ulps); + failures += Tests.testUlpDiff("StrictMath.sinh(double)", + -input, StrictMath.sinh(-input), + -expected, ulps); + return failures; + } + + + /** + * Test accuracy of {Math, StrictMath}.cosh. The specified + * accuracy is 2.5 ulps. + * + * The defintion of cosh(x) is + * + * (e^x + e^(-x))/2 + * + * The series expansion of cosh(x) = + * + * 1 + x^2/2! + x^4/4! + x^6/6! +... + * + * Therefore, + * + * 1. For large values of x cosh(x) ~= exp(|x|)/2 + * + * 2. For small values of x, cosh(x) ~= 1. + * + * Additionally, cosh is an even function; cosh(-x) = cosh(x). + * + */ + static int testCosh() { + int failures = 0; + /* + * Array elements below generated using a quad cosh + * implementation. Rounded to a double, the quad result + * *should* be correctly rounded, unless we are quite unlucky. + * Assuming the quad value is a correctly rounded double, the + * allowed error is 3.0 ulps instead of 2.5 since the quad + * value rounded to double can have its own 1/2 ulp error. + */ + double [][] testCases = { + // x cosh(x) + {0.0625, 1.001953760865667607841550709632597376}, + {0.1250, 1.007822677825710859846949685520422223}, + {0.1875, 1.017629683800690526835115759894757615}, + {0.2500, 1.031413099879573176159295417520378622}, + {0.3125, 1.049226785060219076999158096606305793}, + {0.3750, 1.071140346704586767299498015567016002}, + {0.4375, 1.097239412531012567673453832328262160}, + {0.5000, 1.127625965206380785226225161402672030}, + {0.5625, 1.162418740845610783505338363214045218}, + {0.6250, 1.201753692975606324229229064105075301}, + {0.6875, 1.245784523776616395403056980542275175}, + {0.7500, 1.294683284676844687841708185390181730}, + {0.8125, 1.348641048647144208352285714214372703}, + {0.8750, 1.407868656822803158638471458026344506}, + {0.9375, 1.472597542369862933336886403008640891}, + {1.0000, 1.543080634815243778477905620757061497}, + {1.0625, 1.619593348374367728682469968448090763}, + {1.1250, 1.702434658138190487400868008124755757}, + {1.1875, 1.791928268324866464246665745956119612}, + {1.2500, 1.888423877161015738227715728160051696}, + {1.3125, 1.992298543335143985091891077551921106}, + {1.3750, 2.103958159362661802010972984204389619}, + {1.4375, 2.223839037619709260803023946704272699}, + {1.5000, 2.352409615243247325767667965441644201}, + {1.5625, 2.490172284559350293104864895029231913}, + {1.6250, 2.637665356192137582275019088061812951}, + {1.6875, 2.795465162524235691253423614360562624}, + {1.7500, 2.964188309728087781773608481754531801}, + {1.8125, 3.144494087167972176411236052303565201}, + {1.8750, 3.337087043587520514308832278928116525}, + {1.9375, 3.542719740149244276729383650503145346}, + {2.0000, 3.762195691083631459562213477773746099}, + {2.0625, 3.996372503438463642260225717607554880}, + {2.1250, 4.246165228196992140600291052990934410}, + {2.1875, 4.512549935859540340856119781585096760}, + {2.2500, 4.796567530460195028666793366876218854}, + {2.3125, 5.099327816921939817643745917141739051}, + {2.3750, 5.422013837643509250646323138888569746}, + {2.4375, 5.765886495263270945949271410819116399}, + {2.5000, 6.132289479663686116619852312817562517}, + {2.5625, 6.522654518468725462969589397439224177}, + {2.6250, 6.938506971550673190999796241172117288}, + {2.6875, 7.381471791406976069645686221095397137}, + {2.7500, 7.853279872697439591457564035857305647}, + {2.8125, 8.355774815752725814638234943192709129}, + {2.8750, 8.890920130482709321824793617157134961}, + {2.9375, 9.460806908834119747071078865866737196}, + {3.0000, 10.067661995777765841953936035115890343}, + {3.0625, 10.713856690753651225304006562698007312}, + {3.1250, 11.401916013575067700373788969458446177}, + {3.1875, 12.134528570998387744547733730974713055}, + {3.2500, 12.914557062512392049483503752322408761}, + {3.3125, 13.745049466398732213877084541992751273}, + {3.3750, 14.629250949773302934853381428660210721}, + {3.4375, 15.570616549147269180921654324879141947}, + {3.5000, 16.572824671057316125696517821376119469}, + {3.5625, 17.639791465519127930722105721028711044}, + {3.6250, 18.775686128468677200079039891415789429}, + {3.6875, 19.984947192985946987799359614758598457}, + {3.7500, 21.272299872959396081877161903352144126}, + {3.8125, 22.642774526961913363958587775566619798}, + {3.8750, 24.101726314486257781049388094955970560}, + {3.9375, 25.654856121347151067170940701379544221}, + {4.0000, 27.308232836016486629201989612067059978}, + {4.0625, 29.068317063936918520135334110824828950}, + {4.1250, 30.941986372478026192360480044849306606}, + {4.1875, 32.936562165180269851350626768308756303}, + {4.2500, 35.059838290298428678502583470475012235}, + {4.3125, 37.320111495433027109832850313172338419}, + {4.3750, 39.726213847251883288518263854094284091}, + {4.4375, 42.287547242982546165696077854963452084}, + {4.5000, 45.014120148530027928305799939930642658}, + {4.5625, 47.916586706774825161786212701923307169}, + {4.6250, 51.006288368867753140854830589583165950}, + {4.6875, 54.295298211196782516984520211780624960}, + {4.7500, 57.796468111195389383795669320243166117}, + {4.8125, 61.523478966332915041549750463563672435}, + {4.8750, 65.490894152518731617237739112888213645}, + {4.9375, 69.714216430810089539924900313140922323}, + {5.0000, 74.209948524787844444106108044487704798}, + {5.0625, 78.995657605307475581204965926043112946}, + {5.1250, 84.090043934600961683400343038519519678}, + {5.1875, 89.513013937957834087706670952561002466}, + {5.2500, 95.285757988514588780586084642381131013}, + {5.3125, 101.430833209098212357990123684449846912}, + {5.3750, 107.972251614673824873137995865940755392}, + {5.4375, 114.935573939814969189535554289886848550}, + {5.5000, 122.348009517829425991091207107262038316}, + {5.5625, 130.238522601820409078244923165746295574}, + {5.6250, 138.637945543134998069351279801575968875}, + {5.6875, 147.579099269447055276899288971207106581}, + {5.7500, 157.096921533245353905868840194264636395}, + {5.8125, 167.228603431860671946045256541679445836}, + {5.8750, 178.013734732486824390148614309727161925}, + {5.9375, 189.494458570056311567917444025807275896}, + {6.0000, 201.715636122455894483405112855409538488}, + {6.0625, 214.725021906554080628430756558271312513}, + {6.1250, 228.573450380013557089736092321068279231}, + {6.1875, 243.315034578039208138752165587134488645}, + {6.2500, 259.007377561239126824465367865430519592}, + {6.3125, 275.711797500835732516530131577254654076}, + {6.3750, 293.493567280752348242602902925987643443}, + {6.4375, 312.422169552825597994104814531010579387}, + {6.5000, 332.571568241777409133204438572983297292}, + {6.5625, 354.020497560858198165985214519757890505}, + {6.6250, 376.852769667496146326030849450983914197}, + {6.6875, 401.157602161123700280816957271992998156}, + {6.7500, 427.029966702886171977469256622451185850}, + {6.8125, 454.570960119471524953536004647195906721}, + {6.8750, 483.888199441157626584508920036981010995}, + {6.9375, 515.096242417696720610477570797503766179}, + {7.0000, 548.317035155212076889964120712102928484}, + {7.0625, 583.680388623257719787307547662358502345}, + {7.1250, 621.324485894002926216918634755431456031}, + {7.1875, 661.396422095589629755266517362992812037}, + {7.2500, 704.052779189542208784574955807004218856}, + {7.3125, 749.460237818184878095966335081928645934}, + {7.3750, 797.796228612873763671070863694973560629}, + {7.4375, 849.249625508044731271830060572510241864}, + {7.5000, 904.021483770216677368692292389446994987}, + {7.5625, 962.325825625814651122171697031114091993}, + {7.6250, 1024.390476557670599008492465853663578558}, + {7.6875, 1090.457955538048482588540574008226583335}, + {7.7500, 1160.786422676798661020094043586456606003}, + {7.8125, 1235.650687987597295222707689125107720568}, + {7.8750, 1315.343285214046776004329388551335841550}, + {7.9375, 1400.175614911635999247504386054087931958}, + {8.0000, 1490.479161252178088627715460421007179728}, + {8.0625, 1586.606787305415349050508956232945539108}, + {8.1250, 1688.934113859132470361718199038326340668}, + {8.1875, 1797.860987165547537276364148450577336075}, + {8.2500, 1913.813041349231764486365114317586148767}, + {8.3125, 2037.243361581700856522236313401822532385}, + {8.3750, 2168.634254521568851112005905503069409349}, + {8.4375, 2308.499132938297821208734949028296170563}, + {8.5000, 2457.384521883751693037774022640629666294}, + {8.5625, 2615.872194250713123494312356053193077854}, + {8.6250, 2784.581444063104750127653362960649823247}, + {8.6875, 2964.171506380845754878370650565756538203}, + {8.7500, 3155.344133275174556354775488913749659006}, + {8.8125, 3358.846335940117183452010789979584950102}, + {8.8750, 3575.473303654961482727206202358956274888}, + {8.9375, 3806.071511003646460448021740303914939059}, + {9.0000, 4051.542025492594047194773093534725371440}, + {9.0625, 4312.844028491571841588188869958240355518}, + {9.1250, 4590.998563255739769060078863130940205710}, + {9.1875, 4887.092524674358252509551443117048351290}, + {9.2500, 5202.282906336187674588222835339193136030}, + {9.3125, 5537.801321507079474415176386655744387251}, + {9.3750, 5894.958815685577062811620236195525504885}, + {9.4375, 6275.150989541692149890530417987358096221}, + {9.5000, 6679.863452256851081801173722051940058824}, + {9.5625, 7110.677626574055535297758456126491707647}, + {9.6250, 7569.276928241617224537226019600213961572}, + {9.6875, 8057.453343996777301036241026375049070162}, + {9.7500, 8577.114433792824387959788368429252257664}, + {9.8125, 9130.290784631065880205118262838330689429}, + {9.8750, 9719.143945123662919857326995631317996715}, + {9.9375, 10345.974871791805753327922796701684092861}, + {10.0000, 11013.232920103323139721376090437880844591}, + }; + + for(int i = 0; i < testCases.length; i++) { + double [] testCase = testCases[i]; + failures += testCoshCaseWithUlpDiff(testCase[0], + testCase[1], + 3.0); + } + + + double [][] specialTestCases = { + {0.0, 1.0}, + {NaNd, NaNd}, + {Double.longBitsToDouble(0x7FF0000000000001L), NaNd}, + {Double.longBitsToDouble(0xFFF0000000000001L), NaNd}, + {Double.longBitsToDouble(0x7FF8555555555555L), NaNd}, + {Double.longBitsToDouble(0xFFF8555555555555L), NaNd}, + {Double.longBitsToDouble(0x7FFFFFFFFFFFFFFFL), NaNd}, + {Double.longBitsToDouble(0xFFFFFFFFFFFFFFFFL), NaNd}, + {Double.longBitsToDouble(0x7FFDeadBeef00000L), NaNd}, + {Double.longBitsToDouble(0xFFFDeadBeef00000L), NaNd}, + {Double.longBitsToDouble(0x7FFCafeBabe00000L), NaNd}, + {Double.longBitsToDouble(0xFFFCafeBabe00000L), NaNd}, + {Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY} + }; + + for(int i = 0; i < specialTestCases.length; i++ ) { + failures += testCoshCaseWithUlpDiff(specialTestCases[i][0], + specialTestCases[i][1], + 0.0); + } + + // For powers of 2 less than 2^(-27), the second and + // subsequent terms of the Taylor series expansion will get + // rounded. + + for(int i = DoubleConsts.MIN_SUB_EXPONENT; i < -27; i++) { + double d = FpUtils.scalb(2.0, i); + + // Result and expected are the same. + failures += testCoshCaseWithUlpDiff(d, 1.0, 2.5); + } + + // For values of x larger than 22, the e^(-x) term is + // insignificant to the floating-point result. Util exp(x) + // overflows around 709.8, cosh(x) ~= exp(x)/2; will will test + // 10000 values in this range. + + long trans22 = Double.doubleToLongBits(22.0); + // (approximately) largest value such that exp shouldn't + // overflow + long transExpOvfl = Double.doubleToLongBits(FpUtils.nextDown(709.7827128933841)); + + for(long i = trans22; + i < transExpOvfl; + i +=(transExpOvfl-trans22)/10000) { + + double d = Double.longBitsToDouble(i); + + // Allow 3.5 ulps of error to deal with error in exp. + failures += testCoshCaseWithUlpDiff(d, StrictMath.exp(d)*0.5, 3.5); + } + + // (approximately) largest value such that cosh shouldn't + // overflow. + long transCoshOvfl = Double.doubleToLongBits(710.4758600739439); + + // Make sure sinh(x) doesn't overflow as soon as exp(x) + // overflows. + + /* + * For large values of x, cosh(x) ~= 0.5*(e^x). Therefore, + * + * cosh(x) ~= e^(ln 0.5) * e^x = e^(x + ln 0.5) + * + * So, we can calculate the approximate expected result as + * exp(x + -0.693147186). However, this sum suffers from + * roundoff, limiting the accuracy of the approximation. The + * accuracy can be improved by recovering the rounded-off + * information. Since x is larger than ln(0.5), the trailing + * bits of ln(0.5) get rounded away when the two values are + * added. However, high-order bits of ln(0.5) that + * contribute to the sum can be found: + * + * offset = log(0.5); + * effective_offset = (x + offset) - x; // exact subtraction + * rounded_away_offset = offset - effective_offset; // exact subtraction + * + * Therefore, the product + * + * exp(x + offset)*exp(rounded_away_offset) + * + * will be a better approximation to the exact value of + * + * e^(x + offset) + * + * than exp(x+offset) alone. (The expected result cannot be + * computed as exp(x)*exp(offset) since exp(x) by itself would + * overflow to infinity.) + */ + double offset = StrictMath.log(0.5); + for(long i = transExpOvfl+1; i < transCoshOvfl; + i += (transCoshOvfl-transExpOvfl)/1000 ) { + double input = Double.longBitsToDouble(i); + + double expected = + StrictMath.exp(input + offset) * + StrictMath.exp( offset - ((input + offset) - input) ); + + failures += testCoshCaseWithUlpDiff(input, expected, 4.0); + } + + // cosh(x) overflows for values greater than 710; in + // particular, it overflows for all 2^i, i > 10. + for(int i = 10; i <= DoubleConsts.MAX_EXPONENT; i++) { + double d = FpUtils.scalb(2.0, i); + + // Result and expected are the same. + failures += testCoshCaseWithUlpDiff(d, + Double.POSITIVE_INFINITY, 0.0); + } + return failures; + } + + public static int testCoshCaseWithTolerance(double input, + double expected, + double tolerance) { + int failures = 0; + failures += Tests.testTolerance("Math.cosh(double)", + input, Math.cosh(input), + expected, tolerance); + failures += Tests.testTolerance("Math.cosh(double)", + -input, Math.cosh(-input), + expected, tolerance); + + failures += Tests.testTolerance("StrictMath.cosh(double)", + input, StrictMath.cosh(input), + expected, tolerance); + failures += Tests.testTolerance("StrictMath.cosh(double)", + -input, StrictMath.cosh(-input), + expected, tolerance); + return failures; + } + + public static int testCoshCaseWithUlpDiff(double input, + double expected, + double ulps) { + int failures = 0; + failures += Tests.testUlpDiff("Math.cosh(double)", + input, Math.cosh(input), + expected, ulps); + failures += Tests.testUlpDiff("Math.cosh(double)", + -input, Math.cosh(-input), + expected, ulps); + + failures += Tests.testUlpDiff("StrictMath.cosh(double)", + input, StrictMath.cosh(input), + expected, ulps); + failures += Tests.testUlpDiff("StrictMath.cosh(double)", + -input, StrictMath.cosh(-input), + expected, ulps); + return failures; + } + + + /** + * Test accuracy of {Math, StrictMath}.tanh. The specified + * accuracy is 2.5 ulps. + * + * The defintion of tanh(x) is + * + * (e^x - e^(-x))/(e^x + e^(-x)) + * + * The series expansion of tanh(x) = + * + * x - x^3/3 + 2x^5/15 - 17x^7/315 + ... + * + * Therefore, + * + * 1. For large values of x tanh(x) ~= signum(x) + * + * 2. For small values of x, tanh(x) ~= x. + * + * Additionally, tanh is an odd function; tanh(-x) = -tanh(x). + * + */ + static int testTanh() { + int failures = 0; + /* + * Array elements below generated using a quad sinh + * implementation. Rounded to a double, the quad result + * *should* be correctly rounded, unless we are quite unlucky. + * Assuming the quad value is a correctly rounded double, the + * allowed error is 3.0 ulps instead of 2.5 since the quad + * value rounded to double can have its own 1/2 ulp error. + */ + double [][] testCases = { + // x tanh(x) + {0.0625, 0.06241874674751251449014289119421133}, + {0.1250, 0.12435300177159620805464727580589271}, + {0.1875, 0.18533319990813951753211997502482787}, + {0.2500, 0.24491866240370912927780113149101697}, + {0.3125, 0.30270972933210848724239738970991712}, + {0.3750, 0.35835739835078594631936023155315807}, + {0.4375, 0.41157005567402245143207555859415687}, + {0.5000, 0.46211715726000975850231848364367256}, + {0.5625, 0.50982997373525658248931213507053130}, + {0.6250, 0.55459972234938229399903909532308371}, + {0.6875, 0.59637355547924233984437303950726939}, + {0.7500, 0.63514895238728731921443435731249638}, + {0.8125, 0.67096707420687367394810954721913358}, + {0.8750, 0.70390560393662106058763026963135371}, + {0.9375, 0.73407151960434149263991588052503660}, + {1.0000, 0.76159415595576488811945828260479366}, + {1.0625, 0.78661881210869761781941794647736081}, + {1.1250, 0.80930107020178101206077047354332696}, + {1.1875, 0.82980190998595952708572559629034476}, + {1.2500, 0.84828363995751289761338764670750445}, + {1.3125, 0.86490661772074179125443141102709751}, + {1.3750, 0.87982669965198475596055310881018259}, + {1.4375, 0.89319334040035153149249598745889365}, + {1.5000, 0.90514825364486643824230369645649557}, + {1.5625, 0.91582454416876231820084311814416443}, + {1.6250, 0.92534622531174107960457166792300374}, + {1.6875, 0.93382804322259173763570528576138652}, + {1.7500, 0.94137553849728736226942088377163687}, + {1.8125, 0.94808528560440629971240651310180052}, + {1.8750, 0.95404526017994877009219222661968285}, + {1.9375, 0.95933529331468249183399461756952555}, + {2.0000, 0.96402758007581688394641372410092317}, + {2.0625, 0.96818721657637057702714316097855370}, + {2.1250, 0.97187274591350905151254495374870401}, + {2.1875, 0.97513669829362836159665586901156483}, + {2.2500, 0.97802611473881363992272924300618321}, + {2.3125, 0.98058304703705186541999427134482061}, + {2.3750, 0.98284502917257603002353801620158861}, + {2.4375, 0.98484551746427837912703608465407824}, + {2.5000, 0.98661429815143028888127603923734964}, + {2.5625, 0.98817786228751240824802592958012269}, + {2.6250, 0.98955974861288320579361709496051109}, + {2.6875, 0.99078085564125158320311117560719312}, + {2.7500, 0.99185972456820774534967078914285035}, + {2.8125, 0.99281279483715982021711715899682324}, + {2.8750, 0.99365463431502962099607366282699651}, + {2.9375, 0.99439814606575805343721743822723671}, + {3.0000, 0.99505475368673045133188018525548849}, + {3.0625, 0.99563456710930963835715538507891736}, + {3.1250, 0.99614653067334504917102591131792951}, + {3.1875, 0.99659855517712942451966113109487039}, + {3.2500, 0.99699763548652601693227592643957226}, + {3.3125, 0.99734995516557367804571991063376923}, + {3.3750, 0.99766097946988897037219469409451602}, + {3.4375, 0.99793553792649036103161966894686844}, + {3.5000, 0.99817789761119870928427335245061171}, + {3.5625, 0.99839182812874152902001617480606320}, + {3.6250, 0.99858065920179882368897879066418294}, + {3.6875, 0.99874733168378115962760304582965538}, + {3.7500, 0.99889444272615280096784208280487888}, + {3.8125, 0.99902428575443546808677966295308778}, + {3.8750, 0.99913888583735077016137617231569011}, + {3.9375, 0.99924003097049627100651907919688313}, + {4.0000, 0.99932929973906704379224334434172499}, + {4.0625, 0.99940808577297384603818654530731215}, + {4.1250, 0.99947761936180856115470576756499454}, + {4.1875, 0.99953898655601372055527046497863955}, + {4.2500, 0.99959314604388958696521068958989891}, + {4.3125, 0.99964094406130644525586201091350343}, + {4.3750, 0.99968312756179494813069349082306235}, + {4.4375, 0.99972035584870534179601447812936151}, + {4.5000, 0.99975321084802753654050617379050162}, + {4.5625, 0.99978220617994689112771768489030236}, + {4.6250, 0.99980779516900105210240981251048167}, + {4.6875, 0.99983037791655283849546303868853396}, + {4.7500, 0.99985030754497877753787358852000255}, + {4.8125, 0.99986789571029070417475400133989992}, + {4.8750, 0.99988341746867772271011794614780441}, + {4.9375, 0.99989711557251558205051185882773206}, + {5.0000, 0.99990920426259513121099044753447306}, + {5.0625, 0.99991987261554158551063867262784721}, + {5.1250, 0.99992928749851651137225712249720606}, + {5.1875, 0.99993759617721206697530526661105307}, + {5.2500, 0.99994492861777083305830639416802036}, + {5.3125, 0.99995139951851344080105352145538345}, + {5.3750, 0.99995711010315817210152906092289064}, + {5.4375, 0.99996214970350792531554669737676253}, + {5.5000, 0.99996659715630380963848952941756868}, + {5.5625, 0.99997052203605101013786592945475432}, + {5.6250, 0.99997398574306704793434088941484766}, + {5.6875, 0.99997704246374583929961850444364696}, + {5.7500, 0.99997974001803825215761760428815437}, + {5.8125, 0.99998212060739040166557477723121777}, + {5.8750, 0.99998422147482750993344503195672517}, + {5.9375, 0.99998607548749972326220227464612338}, + {6.0000, 0.99998771165079557056434885235523206}, + {6.0625, 0.99998915556205996764518917496149338}, + {6.1250, 0.99999042981101021976277974520745310}, + {6.1875, 0.99999155433311068015449574811497719}, + {6.2500, 0.99999254672143162687722782398104276}, + {6.3125, 0.99999342250186907900400800240980139}, + {6.3750, 0.99999419537602957780612639767025158}, + {6.4375, 0.99999487743557848265406225515388994}, + {6.5000, 0.99999547935140419285107893831698753}, + {6.5625, 0.99999601054055694588617385671796346}, + {6.6250, 0.99999647931357331502887600387959900}, + {6.6875, 0.99999689300449080997594368612277442}, + {6.7500, 0.99999725808558628431084200832778748}, + {6.8125, 0.99999758026863294516387464046135924}, + {6.8750, 0.99999786459425991170635407313276785}, + {6.9375, 0.99999811551081218572759991597586905}, + {7.0000, 0.99999833694394467173571641595066708}, + {7.0625, 0.99999853235803894918375164252059190}, + {7.1250, 0.99999870481040359014665019356422927}, + {7.1875, 0.99999885699910593255108365463415411}, + {7.2500, 0.99999899130518359709674536482047025}, + {7.3125, 0.99999910982989611769943303422227663}, + {7.3750, 0.99999921442759946591163427422888252}, + {7.4375, 0.99999930673475777603853435094943258}, + {7.5000, 0.99999938819554614875054970643513124}, + {7.5625, 0.99999946008444508183970109263856958}, + {7.6250, 0.99999952352618001331402589096040117}, + {7.6875, 0.99999957951331792817413683491979752}, + {7.7500, 0.99999962892179632633374697389145081}, + {7.8125, 0.99999967252462750190604116210421169}, + {7.8750, 0.99999971100399253750324718031574484}, + {7.9375, 0.99999974496191422474977283863588658}, + {8.0000, 0.99999977492967588981001883295636840}, + {8.0625, 0.99999980137613348259726597081723424}, + {8.1250, 0.99999982471505097353529823063673263}, + {8.1875, 0.99999984531157382142423402736529911}, + {8.2500, 0.99999986348794179107425910499030547}, + {8.3125, 0.99999987952853049895833839645847571}, + {8.3750, 0.99999989368430056302584289932834041}, + {8.4375, 0.99999990617672396471542088609051728}, + {8.5000, 0.99999991720124905211338798152800748}, + {8.5625, 0.99999992693035839516545287745322387}, + {8.6250, 0.99999993551626733394129009365703767}, + {8.6875, 0.99999994309330543951799157347876934}, + {8.7500, 0.99999994978001814614368429416607424}, + {8.8125, 0.99999995568102143535399207289008504}, + {8.8750, 0.99999996088863858914831986187674522}, + {8.9375, 0.99999996548434461974481685677429908}, + {9.0000, 0.99999996954004097447930211118358244}, + {9.0625, 0.99999997311918045901919121395899372}, + {9.1250, 0.99999997627775997868467948564005257}, + {9.1875, 0.99999997906519662964368381583648379}, + {9.2500, 0.99999998152510084671976114264303159}, + {9.3125, 0.99999998369595870397054673668361266}, + {9.3750, 0.99999998561173404286033236040150950}, + {9.4375, 0.99999998730239984852716512979473289}, + {9.5000, 0.99999998879440718770812040917618843}, + {9.5625, 0.99999999011109904501789298212541698}, + {9.6250, 0.99999999127307553219220251303121960}, + {9.6875, 0.99999999229851618412119275358396363}, + {9.7500, 0.99999999320346438410630581726217930}, + {9.8125, 0.99999999400207836827291739324060736}, + {9.8750, 0.99999999470685273619047001387577653}, + {9.9375, 0.99999999532881393331131526966058758}, + {10.0000, 0.99999999587769276361959283713827574}, + }; + + for(int i = 0; i < testCases.length; i++) { + double [] testCase = testCases[i]; + failures += testTanhCaseWithUlpDiff(testCase[0], + testCase[1], + 3.0); + } + + + double [][] specialTestCases = { + {0.0, 0.0}, + {NaNd, NaNd}, + {Double.longBitsToDouble(0x7FF0000000000001L), NaNd}, + {Double.longBitsToDouble(0xFFF0000000000001L), NaNd}, + {Double.longBitsToDouble(0x7FF8555555555555L), NaNd}, + {Double.longBitsToDouble(0xFFF8555555555555L), NaNd}, + {Double.longBitsToDouble(0x7FFFFFFFFFFFFFFFL), NaNd}, + {Double.longBitsToDouble(0xFFFFFFFFFFFFFFFFL), NaNd}, + {Double.longBitsToDouble(0x7FFDeadBeef00000L), NaNd}, + {Double.longBitsToDouble(0xFFFDeadBeef00000L), NaNd}, + {Double.longBitsToDouble(0x7FFCafeBabe00000L), NaNd}, + {Double.longBitsToDouble(0xFFFCafeBabe00000L), NaNd}, + {Double.POSITIVE_INFINITY, 1.0} + }; + + for(int i = 0; i < specialTestCases.length; i++) { + failures += testTanhCaseWithUlpDiff(specialTestCases[i][0], + specialTestCases[i][1], + 0.0); + } + + // For powers of 2 less than 2^(-27), the second and + // subsequent terms of the Taylor series expansion will get + // rounded away since |n-n^3| > 53, the binary precision of a + // double significand. + + for(int i = DoubleConsts.MIN_SUB_EXPONENT; i < -27; i++) { + double d = FpUtils.scalb(2.0, i); + + // Result and expected are the same. + failures += testTanhCaseWithUlpDiff(d, d, 2.5); + } + + // For values of x larger than 22, tanh(x) is 1.0 in double + // floating-point arithmetic. + + for(int i = 22; i < 32; i++) { + failures += testTanhCaseWithUlpDiff(i, 1.0, 2.5); + } + + for(int i = 5; i <= DoubleConsts.MAX_EXPONENT; i++) { + double d = FpUtils.scalb(2.0, i); + + failures += testTanhCaseWithUlpDiff(d, 1.0, 2.5); + } + + return failures; + } + + public static int testTanhCaseWithTolerance(double input, + double expected, + double tolerance) { + int failures = 0; + failures += Tests.testTolerance("Math.tanh(double", + input, Math.tanh(input), + expected, tolerance); + failures += Tests.testTolerance("Math.tanh(double", + -input, Math.tanh(-input), + -expected, tolerance); + + failures += Tests.testTolerance("StrictMath.tanh(double", + input, StrictMath.tanh(input), + expected, tolerance); + failures += Tests.testTolerance("StrictMath.tanh(double", + -input, StrictMath.tanh(-input), + -expected, tolerance); + return failures; + } + + public static int testTanhCaseWithUlpDiff(double input, + double expected, + double ulps) { + int failures = 0; + + failures += Tests.testUlpDiffWithAbsBound("Math.tanh(double)", + input, Math.tanh(input), + expected, ulps, 1.0); + failures += Tests.testUlpDiffWithAbsBound("Math.tanh(double)", + -input, Math.tanh(-input), + -expected, ulps, 1.0); + + failures += Tests.testUlpDiffWithAbsBound("StrictMath.tanh(double)", + input, StrictMath.tanh(input), + expected, ulps, 1.0); + failures += Tests.testUlpDiffWithAbsBound("StrictMath.tanh(double)", + -input, StrictMath.tanh(-input), + -expected, ulps, 1.0); + return failures; + } + + + public static void main(String argv[]) { + int failures = 0; + + failures += testSinh(); + failures += testCosh(); + failures += testTanh(); + + if (failures > 0) { + System.err.println("Testing the hyperbolic functions incurred " + + failures + " failures."); + throw new RuntimeException(); + } + } + +} diff --git a/jdk/test/java/lang/Math/HypotTests.java b/jdk/test/java/lang/Math/HypotTests.java new file mode 100644 index 00000000000..587b7b2d250 --- /dev/null +++ b/jdk/test/java/lang/Math/HypotTests.java @@ -0,0 +1,245 @@ +/* + * Copyright 2003 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4851638 4939441 + * @summary Tests for {Math, StrictMath}.hypot + * @author Joseph D. Darcy + */ + +import sun.misc.DoubleConsts; +import sun.misc.FpUtils; + +public class HypotTests { + private HypotTests(){} + + static final double infinityD = Double.POSITIVE_INFINITY; + static final double NaNd = Double.NaN; + + /** + * Given integers m and n, assuming m < n, the triple (n^2 - m^2, + * 2mn, and n^2 + m^2) is a Pythagorean triple with a^2 + b^2 = + * c^2. This methods returns a long array holding the Pythagorean + * triple corresponding to the inputs. + */ + static long [] pythagoreanTriple(int m, int n) { + long M = m; + long N = n; + long result[] = new long[3]; + + + result[0] = Math.abs(M*M - N*N); + result[1] = Math.abs(2*M*N); + result[2] = Math.abs(M*M + N*N); + + return result; + } + + static int testHypot() { + int failures = 0; + + double [][] testCases = { + // Special cases + {infinityD, infinityD, infinityD}, + {infinityD, 0.0, infinityD}, + {infinityD, 1.0, infinityD}, + {infinityD, NaNd, infinityD}, + {NaNd, NaNd, NaNd}, + {0.0, NaNd, NaNd}, + {1.0, NaNd, NaNd}, + {Double.longBitsToDouble(0x7FF0000000000001L), 1.0, NaNd}, + {Double.longBitsToDouble(0xFFF0000000000001L), 1.0, NaNd}, + {Double.longBitsToDouble(0x7FF8555555555555L), 1.0, NaNd}, + {Double.longBitsToDouble(0xFFF8555555555555L), 1.0, NaNd}, + {Double.longBitsToDouble(0x7FFFFFFFFFFFFFFFL), 1.0, NaNd}, + {Double.longBitsToDouble(0xFFFFFFFFFFFFFFFFL), 1.0, NaNd}, + {Double.longBitsToDouble(0x7FFDeadBeef00000L), 1.0, NaNd}, + {Double.longBitsToDouble(0xFFFDeadBeef00000L), 1.0, NaNd}, + {Double.longBitsToDouble(0x7FFCafeBabe00000L), 1.0, NaNd}, + {Double.longBitsToDouble(0xFFFCafeBabe00000L), 1.0, NaNd}, + }; + + for(int i = 0; i < testCases.length; i++) { + failures += testHypotCase(testCases[i][0], testCases[i][1], + testCases[i][2]); + } + + // Verify hypot(x, 0.0) is close to x over the entire exponent + // range. + for(int i = DoubleConsts.MIN_SUB_EXPONENT; + i <= DoubleConsts.MAX_EXPONENT; + i++) { + double input = FpUtils.scalb(2, i); + failures += testHypotCase(input, 0.0, input); + } + + + // Test Pythagorean triples + + // Small ones + for(int m = 1; m < 10; m++) { + for(int n = m+1; n < 11; n++) { + long [] result = pythagoreanTriple(m, n); + failures += testHypotCase(result[0], result[1], result[2]); + } + } + + // Big ones + for(int m = 100000; m < 100100; m++) { + for(int n = m+100000; n < 200200; n++) { + long [] result = pythagoreanTriple(m, n); + failures += testHypotCase(result[0], result[1], result[2]); + } + } + + // Approaching overflow tests + + /* + * Create a random value r with an large-ish exponent. The + * result of hypot(3*r, 4*r) should be approximately 5*r. (The + * computation of 4*r is exact since it just changes the + * exponent). While the exponent of r is less than or equal + * to (MAX_EXPONENT - 3), the computation should not overflow. + */ + java.util.Random rand = new java.util.Random(); + for(int i = 0; i < 1000; i++) { + double d = rand.nextDouble(); + // Scale d to have an exponent equal to MAX_EXPONENT -15 + d = FpUtils.scalb(d, DoubleConsts.MAX_EXPONENT + -15 - FpUtils.ilogb(d)); + for(int j = 0; j <= 13; j += 1) { + failures += testHypotCase(3*d, 4*d, 5*d, 2.5); + d *= 2.0; // increase exponent by 1 + } + } + + // Test for monotonicity failures. Fix one argument and test + // two numbers before and two numbers after each chosen value; + // i.e. + // + // pcNeighbors[] = + // {nextDown(nextDown(pc)), + // nextDown(pc), + // pc, + // nextUp(pc), + // nextUp(nextUp(pc))} + // + // and we test that hypot(pcNeighbors[i]) <= hypot(pcNeighbors[i+1]) + { + double pcNeighbors[] = new double[5]; + double pcNeighborsHypot[] = new double[5]; + double pcNeighborsStrictHypot[] = new double[5]; + + + for(int i = -18; i <= 18; i++) { + double pc = FpUtils.scalb(1.0, i); + + pcNeighbors[2] = pc; + pcNeighbors[1] = FpUtils.nextDown(pc); + pcNeighbors[0] = FpUtils.nextDown(pcNeighbors[1]); + pcNeighbors[3] = FpUtils.nextUp(pc); + pcNeighbors[4] = FpUtils.nextUp(pcNeighbors[3]); + + for(int j = 0; j < pcNeighbors.length; j++) { + pcNeighborsHypot[j] = Math.hypot(2.0, pcNeighbors[j]); + pcNeighborsStrictHypot[j] = StrictMath.hypot(2.0, pcNeighbors[j]); + } + + for(int j = 0; j < pcNeighborsHypot.length-1; j++) { + if(pcNeighborsHypot[j] > pcNeighborsHypot[j+1] ) { + failures++; + System.err.println("Monotonicity failure for Math.hypot on " + + pcNeighbors[j] + " and " + + pcNeighbors[j+1] + "\n\treturned " + + pcNeighborsHypot[j] + " and " + + pcNeighborsHypot[j+1] ); + } + + if(pcNeighborsStrictHypot[j] > pcNeighborsStrictHypot[j+1] ) { + failures++; + System.err.println("Monotonicity failure for StrictMath.hypot on " + + pcNeighbors[j] + " and " + + pcNeighbors[j+1] + "\n\treturned " + + pcNeighborsStrictHypot[j] + " and " + + pcNeighborsStrictHypot[j+1] ); + } + + + } + + } + } + + + return failures; + } + + static int testHypotCase(double input1, double input2, double expected) { + return testHypotCase(input1,input2, expected, 1); + } + + static int testHypotCase(double input1, double input2, double expected, + double ulps) { + int failures = 0; + if (expected < 0.0) { + throw new AssertionError("Result of hypot must be greater than " + + "or equal to zero"); + } + + // Test Math and StrictMath methods with no inputs negated, + // each input negated singly, and both inputs negated. Also + // test inputs in reversed order. + + for(int i = -1; i <= 1; i+=2) { + for(int j = -1; j <= 1; j+=2) { + double x = i * input1; + double y = j * input2; + failures += Tests.testUlpDiff("Math.hypot", x, y, + Math.hypot(x, y), expected, ulps); + failures += Tests.testUlpDiff("Math.hypot", y, x, + Math.hypot(y, x ), expected, ulps); + + failures += Tests.testUlpDiff("StrictMath.hypot", x, y, + StrictMath.hypot(x, y), expected, ulps); + failures += Tests.testUlpDiff("StrictMath.hypot", y, x, + StrictMath.hypot(y, x), expected, ulps); + } + } + + return failures; + } + + public static void main(String argv[]) { + int failures = 0; + + failures += testHypot(); + + if (failures > 0) { + System.err.println("Testing the hypot incurred " + + failures + " failures."); + throw new RuntimeException(); + } + } + +} diff --git a/jdk/test/java/lang/Math/IeeeRecommendedTests.java b/jdk/test/java/lang/Math/IeeeRecommendedTests.java new file mode 100644 index 00000000000..4123451ed5d --- /dev/null +++ b/jdk/test/java/lang/Math/IeeeRecommendedTests.java @@ -0,0 +1,1705 @@ +/* + * Copyright 2003-2005 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4860891 4826732 4780454 4939441 4826652 + * @summary Tests for IEEE 754[R] recommended functions and similar methods + * @author Joseph D. Darcy + * @compile -source 1.5 IeeeRecommendedTests.java + * @run main IeeeRecommendedTests + */ + +import sun.misc.FpUtils; +import sun.misc.DoubleConsts; +import sun.misc.FloatConsts; + +public class IeeeRecommendedTests { + private IeeeRecommendedTests(){} + + static final float NaNf = Float.NaN; + static final double NaNd = Double.NaN; + static final float infinityF = Float.POSITIVE_INFINITY; + static final double infinityD = Double.POSITIVE_INFINITY; + + static final float Float_MAX_VALUEmm = 0x1.fffffcP+127f; + static final float Float_MAX_SUBNORMAL = 0x0.fffffeP-126f; + static final float Float_MAX_SUBNORMALmm = 0x0.fffffcP-126f; + + static final double Double_MAX_VALUEmm = 0x1.ffffffffffffeP+1023; + static final double Double_MAX_SUBNORMAL = 0x0.fffffffffffffP-1022; + static final double Double_MAX_SUBNORMALmm = 0x0.ffffffffffffeP-1022; + + // Initialize shared random number generator + static java.util.Random rand = new java.util.Random(); + + /** + * Returns a floating-point power of two in the normal range. + */ + static double powerOfTwoD(int n) { + return Double.longBitsToDouble((((long)n + (long)DoubleConsts.MAX_EXPONENT) << + (DoubleConsts.SIGNIFICAND_WIDTH-1)) + & DoubleConsts.EXP_BIT_MASK); + } + + /** + * Returns a floating-point power of two in the normal range. + */ + static float powerOfTwoF(int n) { + return Float.intBitsToFloat(((n + FloatConsts.MAX_EXPONENT) << + (FloatConsts.SIGNIFICAND_WIDTH-1)) + & FloatConsts.EXP_BIT_MASK); + } + + /* ******************** getExponent tests ****************************** */ + + /* + * The tests for getExponent should test the special values (NaN, +/- + * infinity, etc.), test the endpoints of each binade (set of + * floating-point values with the same exponent), and for good + * measure, test some random values within each binade. Testing + * the endpoints of each binade includes testing both positive and + * negative numbers. Subnormal values with different normalized + * exponents should be tested too. Both Math and StrictMath + * methods should return the same results. + */ + + /* + * Test Math.getExponent and StrictMath.getExponent with +d and -d. + */ + static int testGetExponentCase(float f, int expected) { + float minus_f = -f; + int failures=0; + + failures+=Tests.test("Math.getExponent(float)", f, + Math.getExponent(f), expected); + failures+=Tests.test("Math.getExponent(float)", minus_f, + Math.getExponent(minus_f), expected); + + failures+=Tests.test("StrictMath.getExponent(float)", f, + StrictMath.getExponent(f), expected); + failures+=Tests.test("StrictMath.getExponent(float)", minus_f, + StrictMath.getExponent(minus_f), expected); + return failures; + } + + /* + * Test Math.getExponent and StrictMath.getExponent with +d and -d. + */ + static int testGetExponentCase(double d, int expected) { + double minus_d = -d; + int failures=0; + + failures+=Tests.test("Math.getExponent(double)", d, + Math.getExponent(d), expected); + failures+=Tests.test("Math.getExponent(double)", minus_d, + Math.getExponent(minus_d), expected); + + failures+=Tests.test("StrictMath.getExponent(double)", d, + StrictMath.getExponent(d), expected); + failures+=Tests.test("StrictMath.getExponent(double)", minus_d, + StrictMath.getExponent(minus_d), expected); + return failures; + } + + public static int testFloatGetExponent() { + int failures = 0; + float [] specialValues = {NaNf, + Float.POSITIVE_INFINITY, + +0.0f, + +1.0f, + +2.0f, + +16.0f, + +Float.MIN_VALUE, + +Float_MAX_SUBNORMAL, + +FloatConsts.MIN_NORMAL, + +Float.MAX_VALUE + }; + + int [] specialResults = {Float.MAX_EXPONENT + 1, // NaN results + Float.MAX_EXPONENT + 1, // Infinite results + Float.MIN_EXPONENT - 1, // Zero results + 0, + 1, + 4, + FloatConsts.MIN_EXPONENT - 1, + -FloatConsts.MAX_EXPONENT, + FloatConsts.MIN_EXPONENT, + FloatConsts.MAX_EXPONENT + }; + + // Special value tests + for(int i = 0; i < specialValues.length; i++) { + failures += testGetExponentCase(specialValues[i], specialResults[i]); + } + + + // Normal exponent tests + for(int i = FloatConsts.MIN_EXPONENT; i <= FloatConsts.MAX_EXPONENT; i++) { + int result; + + // Create power of two + float po2 = powerOfTwoF(i); + + failures += testGetExponentCase(po2, i); + + // Generate some random bit patterns for the significand + for(int j = 0; j < 10; j++) { + int randSignif = rand.nextInt(); + float randFloat; + + randFloat = Float.intBitsToFloat( // Exponent + (Float.floatToIntBits(po2)& + (~FloatConsts.SIGNIF_BIT_MASK)) | + // Significand + (randSignif & + FloatConsts.SIGNIF_BIT_MASK) ); + + failures += testGetExponentCase(randFloat, i); + } + + if (i > FloatConsts.MIN_EXPONENT) { + float po2minus = FpUtils.nextAfter(po2, + Float.NEGATIVE_INFINITY); + failures += testGetExponentCase(po2minus, i-1); + } + } + + // Subnormal exponent tests + + /* + * Start with MIN_VALUE, left shift, test high value, low + * values, and random in between. + * + * Use nextAfter to calculate, high value of previous binade, + * loop count i will indicate how many random bits, if any are + * needed. + */ + + float top=Float.MIN_VALUE; + for( int i = 1; + i < FloatConsts.SIGNIFICAND_WIDTH; + i++, top *= 2.0f) { + + failures += testGetExponentCase(top, + FloatConsts.MIN_EXPONENT - 1); + + // Test largest value in next smaller binade + if (i >= 3) {// (i == 1) would test 0.0; + // (i == 2) would just retest MIN_VALUE + testGetExponentCase(FpUtils.nextAfter(top, 0.0f), + FloatConsts.MIN_EXPONENT - 1); + + if( i >= 10) { + // create a bit mask with (i-1) 1's in the low order + // bits + int mask = ~((~0)<<(i-1)); + float randFloat = Float.intBitsToFloat( // Exponent + Float.floatToIntBits(top) | + // Significand + (rand.nextInt() & mask ) ) ; + + failures += testGetExponentCase(randFloat, + FloatConsts.MIN_EXPONENT - 1); + } + } + } + + return failures; + } + + + public static int testDoubleGetExponent() { + int failures = 0; + double [] specialValues = {NaNd, + infinityD, + +0.0, + +1.0, + +2.0, + +16.0, + +Double.MIN_VALUE, + +Double_MAX_SUBNORMAL, + +DoubleConsts.MIN_NORMAL, + +Double.MAX_VALUE + }; + + int [] specialResults = {Double.MAX_EXPONENT + 1, // NaN results + Double.MAX_EXPONENT + 1, // Infinite results + Double.MIN_EXPONENT - 1, // Zero results + 0, + 1, + 4, + DoubleConsts.MIN_EXPONENT - 1, + -DoubleConsts.MAX_EXPONENT, + DoubleConsts.MIN_EXPONENT, + DoubleConsts.MAX_EXPONENT + }; + + // Special value tests + for(int i = 0; i < specialValues.length; i++) { + failures += testGetExponentCase(specialValues[i], specialResults[i]); + } + + + // Normal exponent tests + for(int i = DoubleConsts.MIN_EXPONENT; i <= DoubleConsts.MAX_EXPONENT; i++) { + int result; + + // Create power of two + double po2 = powerOfTwoD(i); + + failures += testGetExponentCase(po2, i); + + // Generate some random bit patterns for the significand + for(int j = 0; j < 10; j++) { + long randSignif = rand.nextLong(); + double randFloat; + + randFloat = Double.longBitsToDouble( // Exponent + (Double.doubleToLongBits(po2)& + (~DoubleConsts.SIGNIF_BIT_MASK)) | + // Significand + (randSignif & + DoubleConsts.SIGNIF_BIT_MASK) ); + + failures += testGetExponentCase(randFloat, i); + } + + if (i > DoubleConsts.MIN_EXPONENT) { + double po2minus = FpUtils.nextAfter(po2, + Double.NEGATIVE_INFINITY); + failures += testGetExponentCase(po2minus, i-1); + } + } + + // Subnormal exponent tests + + /* + * Start with MIN_VALUE, left shift, test high value, low + * values, and random in between. + * + * Use nextAfter to calculate, high value of previous binade; + * loop count i will indicate how many random bits, if any are + * needed. + */ + + double top=Double.MIN_VALUE; + for( int i = 1; + i < DoubleConsts.SIGNIFICAND_WIDTH; + i++, top *= 2.0f) { + + failures += testGetExponentCase(top, + DoubleConsts.MIN_EXPONENT - 1); + + // Test largest value in next smaller binade + if (i >= 3) {// (i == 1) would test 0.0; + // (i == 2) would just retest MIN_VALUE + testGetExponentCase(FpUtils.nextAfter(top, 0.0), + DoubleConsts.MIN_EXPONENT - 1); + + if( i >= 10) { + // create a bit mask with (i-1) 1's in the low order + // bits + long mask = ~((~0L)<<(i-1)); + double randFloat = Double.longBitsToDouble( // Exponent + Double.doubleToLongBits(top) | + // Significand + (rand.nextLong() & mask ) ) ; + + failures += testGetExponentCase(randFloat, + DoubleConsts.MIN_EXPONENT - 1); + } + } + } + + return failures; + } + + + /* ******************** nextAfter tests ****************************** */ + + static int testNextAfterCase(float start, double direction, float expected) { + int failures=0; + float minus_start = -start; + double minus_direction = -direction; + float minus_expected = -expected; + + failures+=Tests.test("Math.nextAfter(float,double)", start, direction, + Math.nextAfter(start, direction), expected); + failures+=Tests.test("Math.nextAfter(float,double)", minus_start, minus_direction, + Math.nextAfter(minus_start, minus_direction), minus_expected); + + failures+=Tests.test("StrictMath.nextAfter(float,double)", start, direction, + StrictMath.nextAfter(start, direction), expected); + failures+=Tests.test("StrictMath.nextAfter(float,double)", minus_start, minus_direction, + StrictMath.nextAfter(minus_start, minus_direction), minus_expected); + return failures; + } + + static int testNextAfterCase(double start, double direction, double expected) { + int failures=0; + + double minus_start = -start; + double minus_direction = -direction; + double minus_expected = -expected; + + failures+=Tests.test("Math.nextAfter(double,double)", start, direction, + Math.nextAfter(start, direction), expected); + failures+=Tests.test("Math.nextAfter(double,double)", minus_start, minus_direction, + Math.nextAfter(minus_start, minus_direction), minus_expected); + + failures+=Tests.test("StrictMath.nextAfter(double,double)", start, direction, + StrictMath.nextAfter(start, direction), expected); + failures+=Tests.test("StrictMath.nextAfter(double,double)", minus_start, minus_direction, + StrictMath.nextAfter(minus_start, minus_direction), minus_expected); + return failures; + } + + public static int testFloatNextAfter() { + int failures=0; + + /* + * Each row of the testCases matrix represents one test case + * for nexAfter; given the input of the first two columns, the + * result in the last column is expected. + */ + float [][] testCases = { + {NaNf, NaNf, NaNf}, + {NaNf, 0.0f, NaNf}, + {0.0f, NaNf, NaNf}, + {NaNf, infinityF, NaNf}, + {infinityF, NaNf, NaNf}, + + {infinityF, infinityF, infinityF}, + {infinityF, -infinityF, Float.MAX_VALUE}, + {infinityF, 0.0f, Float.MAX_VALUE}, + + {Float.MAX_VALUE, infinityF, infinityF}, + {Float.MAX_VALUE, -infinityF, Float_MAX_VALUEmm}, + {Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE}, + {Float.MAX_VALUE, 0.0f, Float_MAX_VALUEmm}, + + {Float_MAX_VALUEmm, Float.MAX_VALUE, Float.MAX_VALUE}, + {Float_MAX_VALUEmm, infinityF, Float.MAX_VALUE}, + {Float_MAX_VALUEmm, Float_MAX_VALUEmm, Float_MAX_VALUEmm}, + + {FloatConsts.MIN_NORMAL, infinityF, FloatConsts.MIN_NORMAL+ + Float.MIN_VALUE}, + {FloatConsts.MIN_NORMAL, -infinityF, Float_MAX_SUBNORMAL}, + {FloatConsts.MIN_NORMAL, 1.0f, FloatConsts.MIN_NORMAL+ + Float.MIN_VALUE}, + {FloatConsts.MIN_NORMAL, -1.0f, Float_MAX_SUBNORMAL}, + {FloatConsts.MIN_NORMAL, FloatConsts.MIN_NORMAL, FloatConsts.MIN_NORMAL}, + + {Float_MAX_SUBNORMAL, FloatConsts.MIN_NORMAL, FloatConsts.MIN_NORMAL}, + {Float_MAX_SUBNORMAL, Float_MAX_SUBNORMAL, Float_MAX_SUBNORMAL}, + {Float_MAX_SUBNORMAL, 0.0f, Float_MAX_SUBNORMALmm}, + + {Float_MAX_SUBNORMALmm, Float_MAX_SUBNORMAL, Float_MAX_SUBNORMAL}, + {Float_MAX_SUBNORMALmm, 0.0f, Float_MAX_SUBNORMALmm-Float.MIN_VALUE}, + {Float_MAX_SUBNORMALmm, Float_MAX_SUBNORMALmm, Float_MAX_SUBNORMALmm}, + + {Float.MIN_VALUE, 0.0f, 0.0f}, + {-Float.MIN_VALUE, 0.0f, -0.0f}, + {Float.MIN_VALUE, Float.MIN_VALUE, Float.MIN_VALUE}, + {Float.MIN_VALUE, 1.0f, 2*Float.MIN_VALUE}, + + // Make sure zero behavior is tested + {0.0f, 0.0f, 0.0f}, + {0.0f, -0.0f, -0.0f}, + {-0.0f, 0.0f, 0.0f}, + {-0.0f, -0.0f, -0.0f}, + {0.0f, infinityF, Float.MIN_VALUE}, + {0.0f, -infinityF, -Float.MIN_VALUE}, + {-0.0f, infinityF, Float.MIN_VALUE}, + {-0.0f, -infinityF, -Float.MIN_VALUE}, + {0.0f, Float.MIN_VALUE, Float.MIN_VALUE}, + {0.0f, -Float.MIN_VALUE, -Float.MIN_VALUE}, + {-0.0f, Float.MIN_VALUE, Float.MIN_VALUE}, + {-0.0f, -Float.MIN_VALUE, -Float.MIN_VALUE} + }; + + for(int i = 0; i < testCases.length; i++) { + failures += testNextAfterCase(testCases[i][0], testCases[i][1], + testCases[i][2]); + } + + return failures; + } + + public static int testDoubleNextAfter() { + int failures =0; + + /* + * Each row of the testCases matrix represents one test case + * for nexAfter; given the input of the first two columns, the + * result in the last column is expected. + */ + double [][] testCases = { + {NaNd, NaNd, NaNd}, + {NaNd, 0.0d, NaNd}, + {0.0d, NaNd, NaNd}, + {NaNd, infinityD, NaNd}, + {infinityD, NaNd, NaNd}, + + {infinityD, infinityD, infinityD}, + {infinityD, -infinityD, Double.MAX_VALUE}, + {infinityD, 0.0d, Double.MAX_VALUE}, + + {Double.MAX_VALUE, infinityD, infinityD}, + {Double.MAX_VALUE, -infinityD, Double_MAX_VALUEmm}, + {Double.MAX_VALUE, Double.MAX_VALUE, Double.MAX_VALUE}, + {Double.MAX_VALUE, 0.0d, Double_MAX_VALUEmm}, + + {Double_MAX_VALUEmm, Double.MAX_VALUE, Double.MAX_VALUE}, + {Double_MAX_VALUEmm, infinityD, Double.MAX_VALUE}, + {Double_MAX_VALUEmm, Double_MAX_VALUEmm, Double_MAX_VALUEmm}, + + {DoubleConsts.MIN_NORMAL, infinityD, DoubleConsts.MIN_NORMAL+ + Double.MIN_VALUE}, + {DoubleConsts.MIN_NORMAL, -infinityD, Double_MAX_SUBNORMAL}, + {DoubleConsts.MIN_NORMAL, 1.0f, DoubleConsts.MIN_NORMAL+ + Double.MIN_VALUE}, + {DoubleConsts.MIN_NORMAL, -1.0f, Double_MAX_SUBNORMAL}, + {DoubleConsts.MIN_NORMAL, DoubleConsts.MIN_NORMAL,DoubleConsts.MIN_NORMAL}, + + {Double_MAX_SUBNORMAL, DoubleConsts.MIN_NORMAL,DoubleConsts.MIN_NORMAL}, + {Double_MAX_SUBNORMAL, Double_MAX_SUBNORMAL, Double_MAX_SUBNORMAL}, + {Double_MAX_SUBNORMAL, 0.0d, Double_MAX_SUBNORMALmm}, + + {Double_MAX_SUBNORMALmm, Double_MAX_SUBNORMAL, Double_MAX_SUBNORMAL}, + {Double_MAX_SUBNORMALmm, 0.0d, Double_MAX_SUBNORMALmm-Double.MIN_VALUE}, + {Double_MAX_SUBNORMALmm, Double_MAX_SUBNORMALmm, Double_MAX_SUBNORMALmm}, + + {Double.MIN_VALUE, 0.0d, 0.0d}, + {-Double.MIN_VALUE, 0.0d, -0.0d}, + {Double.MIN_VALUE, Double.MIN_VALUE, Double.MIN_VALUE}, + {Double.MIN_VALUE, 1.0f, 2*Double.MIN_VALUE}, + + // Make sure zero behavior is tested + {0.0d, 0.0d, 0.0d}, + {0.0d, -0.0d, -0.0d}, + {-0.0d, 0.0d, 0.0d}, + {-0.0d, -0.0d, -0.0d}, + {0.0d, infinityD, Double.MIN_VALUE}, + {0.0d, -infinityD, -Double.MIN_VALUE}, + {-0.0d, infinityD, Double.MIN_VALUE}, + {-0.0d, -infinityD, -Double.MIN_VALUE}, + {0.0d, Double.MIN_VALUE, Double.MIN_VALUE}, + {0.0d, -Double.MIN_VALUE, -Double.MIN_VALUE}, + {-0.0d, Double.MIN_VALUE, Double.MIN_VALUE}, + {-0.0d, -Double.MIN_VALUE, -Double.MIN_VALUE} + }; + + for(int i = 0; i < testCases.length; i++) { + failures += testNextAfterCase(testCases[i][0], testCases[i][1], + testCases[i][2]); + } + return failures; + } + + /* ******************** nextUp tests ********************************* */ + + public static int testFloatNextUp() { + int failures=0; + + /* + * Each row of testCases represents one test case for nextUp; + * the first column is the input and the second column is the + * expected result. + */ + float testCases [][] = { + {NaNf, NaNf}, + {-infinityF, -Float.MAX_VALUE}, + {-Float.MAX_VALUE, -Float_MAX_VALUEmm}, + {-FloatConsts.MIN_NORMAL, -Float_MAX_SUBNORMAL}, + {-Float_MAX_SUBNORMAL, -Float_MAX_SUBNORMALmm}, + {-Float.MIN_VALUE, -0.0f}, + {-0.0f, Float.MIN_VALUE}, + {+0.0f, Float.MIN_VALUE}, + {Float.MIN_VALUE, Float.MIN_VALUE*2}, + {Float_MAX_SUBNORMALmm, Float_MAX_SUBNORMAL}, + {Float_MAX_SUBNORMAL, FloatConsts.MIN_NORMAL}, + {FloatConsts.MIN_NORMAL, FloatConsts.MIN_NORMAL+Float.MIN_VALUE}, + {Float_MAX_VALUEmm, Float.MAX_VALUE}, + {Float.MAX_VALUE, infinityF}, + {infinityF, infinityF} + }; + + for(int i = 0; i < testCases.length; i++) { + failures+=Tests.test("Math.nextUp(float)", + testCases[i][0], Math.nextUp(testCases[i][0]), testCases[i][1]); + + failures+=Tests.test("StrictMath.nextUp(float)", + testCases[i][0], StrictMath.nextUp(testCases[i][0]), testCases[i][1]); + } + + return failures; + } + + + public static int testDoubleNextUp() { + int failures=0; + + /* + * Each row of testCases represents one test case for nextUp; + * the first column is the input and the second column is the + * expected result. + */ + double testCases [][] = { + {NaNd, NaNd}, + {-infinityD, -Double.MAX_VALUE}, + {-Double.MAX_VALUE, -Double_MAX_VALUEmm}, + {-DoubleConsts.MIN_NORMAL, -Double_MAX_SUBNORMAL}, + {-Double_MAX_SUBNORMAL, -Double_MAX_SUBNORMALmm}, + {-Double.MIN_VALUE, -0.0d}, + {-0.0d, Double.MIN_VALUE}, + {+0.0d, Double.MIN_VALUE}, + {Double.MIN_VALUE, Double.MIN_VALUE*2}, + {Double_MAX_SUBNORMALmm, Double_MAX_SUBNORMAL}, + {Double_MAX_SUBNORMAL, DoubleConsts.MIN_NORMAL}, + {DoubleConsts.MIN_NORMAL, DoubleConsts.MIN_NORMAL+Double.MIN_VALUE}, + {Double_MAX_VALUEmm, Double.MAX_VALUE}, + {Double.MAX_VALUE, infinityD}, + {infinityD, infinityD} + }; + + for(int i = 0; i < testCases.length; i++) { + failures+=Tests.test("Math.nextUp(double)", + testCases[i][0], Math.nextUp(testCases[i][0]), testCases[i][1]); + + failures+=Tests.test("StrictMath.nextUp(double)", + testCases[i][0], StrictMath.nextUp(testCases[i][0]), testCases[i][1]); + } + + return failures; + } + + /* ******************** nextDown tests ********************************* */ + + public static int testFloatNextDown() { + int failures=0; + + /* + * Each row of testCases represents one test case for nextDown; + * the first column is the input and the second column is the + * expected result. + */ + float testCases [][] = { + {NaNf, NaNf}, + {-infinityF, -infinityF}, + {-Float.MAX_VALUE, -infinityF}, + {-Float_MAX_VALUEmm, -Float.MAX_VALUE}, + {-Float_MAX_SUBNORMAL, -FloatConsts.MIN_NORMAL}, + {-Float_MAX_SUBNORMALmm, -Float_MAX_SUBNORMAL}, + {-0.0f, -Float.MIN_VALUE}, + {+0.0f, -Float.MIN_VALUE}, + {Float.MIN_VALUE, 0.0f}, + {Float.MIN_VALUE*2, Float.MIN_VALUE}, + {Float_MAX_SUBNORMAL, Float_MAX_SUBNORMALmm}, + {FloatConsts.MIN_NORMAL, Float_MAX_SUBNORMAL}, + {FloatConsts.MIN_NORMAL+ + Float.MIN_VALUE, FloatConsts.MIN_NORMAL}, + {Float.MAX_VALUE, Float_MAX_VALUEmm}, + {infinityF, Float.MAX_VALUE}, + }; + + for(int i = 0; i < testCases.length; i++) { + failures+=Tests.test("FpUtils.nextDown(float)", + testCases[i][0], FpUtils.nextDown(testCases[i][0]), testCases[i][1]); + } + + return failures; + } + + + public static int testDoubleNextDown() { + int failures=0; + + /* + * Each row of testCases represents one test case for nextDown; + * the first column is the input and the second column is the + * expected result. + */ + double testCases [][] = { + {NaNd, NaNd}, + {-infinityD, -infinityD}, + {-Double.MAX_VALUE, -infinityD}, + {-Double_MAX_VALUEmm, -Double.MAX_VALUE}, + {-Double_MAX_SUBNORMAL, -DoubleConsts.MIN_NORMAL}, + {-Double_MAX_SUBNORMALmm, -Double_MAX_SUBNORMAL}, + {-0.0d, -Double.MIN_VALUE}, + {+0.0d, -Double.MIN_VALUE}, + {Double.MIN_VALUE, 0.0d}, + {Double.MIN_VALUE*2, Double.MIN_VALUE}, + {Double_MAX_SUBNORMAL, Double_MAX_SUBNORMALmm}, + {DoubleConsts.MIN_NORMAL, Double_MAX_SUBNORMAL}, + {DoubleConsts.MIN_NORMAL+ + Double.MIN_VALUE, DoubleConsts.MIN_NORMAL}, + {Double.MAX_VALUE, Double_MAX_VALUEmm}, + {infinityD, Double.MAX_VALUE}, + }; + + for(int i = 0; i < testCases.length; i++) { + failures+=Tests.test("FpUtils.nextDown(double)", + testCases[i][0], FpUtils.nextDown(testCases[i][0]), testCases[i][1]); + } + + return failures; + } + + + /* ********************** boolean tests ****************************** */ + + /* + * Combined tests for boolean functions, isFinite, isInfinite, + * isNaN, isUnordered. + */ + + public static int testFloatBooleanMethods() { + int failures = 0; + + float testCases [] = { + NaNf, + -infinityF, + infinityF, + -Float.MAX_VALUE, + -3.0f, + -1.0f, + -FloatConsts.MIN_NORMAL, + -Float_MAX_SUBNORMALmm, + -Float_MAX_SUBNORMAL, + -Float.MIN_VALUE, + -0.0f, + +0.0f, + Float.MIN_VALUE, + Float_MAX_SUBNORMALmm, + Float_MAX_SUBNORMAL, + FloatConsts.MIN_NORMAL, + 1.0f, + 3.0f, + Float_MAX_VALUEmm, + Float.MAX_VALUE + }; + + for(int i = 0; i < testCases.length; i++) { + // isNaN + failures+=Tests.test("FpUtils.isNaN(float)", testCases[i], + FpUtils.isNaN(testCases[i]), (i ==0)); + + // isFinite + failures+=Tests.test("FpUtils.isFinite(float)", testCases[i], + FpUtils.isFinite(testCases[i]), (i >= 3)); + + // isInfinite + failures+=Tests.test("FpUtils.isInfinite(float)", testCases[i], + FpUtils.isInfinite(testCases[i]), (i==1 || i==2)); + + // isUnorderd + for(int j = 0; j < testCases.length; j++) { + failures+=Tests.test("FpUtils.isUnordered(float, float)", testCases[i],testCases[j], + FpUtils.isUnordered(testCases[i],testCases[j]), (i==0 || j==0)); + } + } + + return failures; + } + + public static int testDoubleBooleanMethods() { + int failures = 0; + boolean result = false; + + double testCases [] = { + NaNd, + -infinityD, + infinityD, + -Double.MAX_VALUE, + -3.0d, + -1.0d, + -DoubleConsts.MIN_NORMAL, + -Double_MAX_SUBNORMALmm, + -Double_MAX_SUBNORMAL, + -Double.MIN_VALUE, + -0.0d, + +0.0d, + Double.MIN_VALUE, + Double_MAX_SUBNORMALmm, + Double_MAX_SUBNORMAL, + DoubleConsts.MIN_NORMAL, + 1.0d, + 3.0d, + Double_MAX_VALUEmm, + Double.MAX_VALUE + }; + + for(int i = 0; i < testCases.length; i++) { + // isNaN + failures+=Tests.test("FpUtils.isNaN(double)", testCases[i], + FpUtils.isNaN(testCases[i]), (i ==0)); + + // isFinite + failures+=Tests.test("FpUtils.isFinite(double)", testCases[i], + FpUtils.isFinite(testCases[i]), (i >= 3)); + + // isInfinite + failures+=Tests.test("FpUtils.isInfinite(double)", testCases[i], + FpUtils.isInfinite(testCases[i]), (i==1 || i==2)); + + // isUnorderd + for(int j = 0; j < testCases.length; j++) { + failures+=Tests.test("FpUtils.isUnordered(double, double)", testCases[i],testCases[j], + FpUtils.isUnordered(testCases[i],testCases[j]), (i==0 || j==0)); + } + } + + return failures; + } + + /* ******************** copySign tests******************************** */ + + public static int testFloatCopySign() { + int failures = 0; + + // testCases[0] are logically positive numbers; + // testCases[1] are negative numbers. + float testCases [][] = { + {+0.0f, + Float.MIN_VALUE, + Float_MAX_SUBNORMALmm, + Float_MAX_SUBNORMAL, + FloatConsts.MIN_NORMAL, + 1.0f, + 3.0f, + Float_MAX_VALUEmm, + Float.MAX_VALUE, + infinityF, + }, + {-infinityF, + -Float.MAX_VALUE, + -3.0f, + -1.0f, + -FloatConsts.MIN_NORMAL, + -Float_MAX_SUBNORMALmm, + -Float_MAX_SUBNORMAL, + -Float.MIN_VALUE, + -0.0f} + }; + + float NaNs[] = {Float.intBitsToFloat(0x7fc00000), // "positive" NaN + Float.intBitsToFloat(0xFfc00000)}; // "negative" NaN + + // Tests shared between raw and non-raw versions + for(int i = 0; i < 2; i++) { + for(int j = 0; j < 2; j++) { + for(int m = 0; m < testCases[i].length; m++) { + for(int n = 0; n < testCases[j].length; n++) { + // copySign(magnitude, sign) + failures+=Tests.test("Math.copySign(float,float)", + testCases[i][m],testCases[j][n], + Math.copySign(testCases[i][m], testCases[j][n]), + (j==0?1.0f:-1.0f)*Math.abs(testCases[i][m]) ); + + failures+=Tests.test("StrictMath.copySign(float,float)", + testCases[i][m],testCases[j][n], + StrictMath.copySign(testCases[i][m], testCases[j][n]), + (j==0?1.0f:-1.0f)*Math.abs(testCases[i][m]) ); + } + } + } + } + + // For rawCopySign, NaN may effectively have either sign bit + // while for copySign NaNs are treated as if they always have + // a zero sign bit (i.e. as positive numbers) + for(int i = 0; i < 2; i++) { + for(int j = 0; j < NaNs.length; j++) { + for(int m = 0; m < testCases[i].length; m++) { + // copySign(magnitude, sign) + + failures += (Math.abs(Math.copySign(testCases[i][m], NaNs[j])) == + Math.abs(testCases[i][m])) ? 0:1; + + + failures+=Tests.test("StrictMath.copySign(float,float)", + testCases[i][m], NaNs[j], + StrictMath.copySign(testCases[i][m], NaNs[j]), + Math.abs(testCases[i][m]) ); + } + } + } + + return failures; + } + + public static int testDoubleCopySign() { + int failures = 0; + + // testCases[0] are logically positive numbers; + // testCases[1] are negative numbers. + double testCases [][] = { + {+0.0d, + Double.MIN_VALUE, + Double_MAX_SUBNORMALmm, + Double_MAX_SUBNORMAL, + DoubleConsts.MIN_NORMAL, + 1.0d, + 3.0d, + Double_MAX_VALUEmm, + Double.MAX_VALUE, + infinityD, + }, + {-infinityD, + -Double.MAX_VALUE, + -3.0d, + -1.0d, + -DoubleConsts.MIN_NORMAL, + -Double_MAX_SUBNORMALmm, + -Double_MAX_SUBNORMAL, + -Double.MIN_VALUE, + -0.0d} + }; + + double NaNs[] = {Double.longBitsToDouble(0x7ff8000000000000L), // "positive" NaN + Double.longBitsToDouble(0xfff8000000000000L), // "negative" NaN + Double.longBitsToDouble(0x7FF0000000000001L), + Double.longBitsToDouble(0xFFF0000000000001L), + Double.longBitsToDouble(0x7FF8555555555555L), + Double.longBitsToDouble(0xFFF8555555555555L), + Double.longBitsToDouble(0x7FFFFFFFFFFFFFFFL), + Double.longBitsToDouble(0xFFFFFFFFFFFFFFFFL), + Double.longBitsToDouble(0x7FFDeadBeef00000L), + Double.longBitsToDouble(0xFFFDeadBeef00000L), + Double.longBitsToDouble(0x7FFCafeBabe00000L), + Double.longBitsToDouble(0xFFFCafeBabe00000L)}; + + // Tests shared between Math and StrictMath versions + for(int i = 0; i < 2; i++) { + for(int j = 0; j < 2; j++) { + for(int m = 0; m < testCases[i].length; m++) { + for(int n = 0; n < testCases[j].length; n++) { + // copySign(magnitude, sign) + failures+=Tests.test("MathcopySign(double,double)", + testCases[i][m],testCases[j][n], + Math.copySign(testCases[i][m], testCases[j][n]), + (j==0?1.0f:-1.0f)*Math.abs(testCases[i][m]) ); + + failures+=Tests.test("StrictMath.copySign(double,double)", + testCases[i][m],testCases[j][n], + StrictMath.copySign(testCases[i][m], testCases[j][n]), + (j==0?1.0f:-1.0f)*Math.abs(testCases[i][m]) ); + } + } + } + } + + // For Math.copySign, NaN may effectively have either sign bit + // while for StrictMath.copySign NaNs are treated as if they + // always have a zero sign bit (i.e. as positive numbers) + for(int i = 0; i < 2; i++) { + for(int j = 0; j < NaNs.length; j++) { + for(int m = 0; m < testCases[i].length; m++) { + // copySign(magnitude, sign) + + failures += (Math.abs(Math.copySign(testCases[i][m], NaNs[j])) == + Math.abs(testCases[i][m])) ? 0:1; + + + failures+=Tests.test("StrictMath.copySign(double,double)", + testCases[i][m], NaNs[j], + StrictMath.copySign(testCases[i][m], NaNs[j]), + Math.abs(testCases[i][m]) ); + } + } + } + + + return failures; + } + + /* ************************ scalb tests ******************************* */ + + static int testScalbCase(float value, int scale_factor, float expected) { + int failures=0; + + failures+=Tests.test("Math.scalb(float,int)", + value, scale_factor, + Math.scalb(value, scale_factor), expected); + + failures+=Tests.test("Math.scalb(float,int)", + -value, scale_factor, + Math.scalb(-value, scale_factor), -expected); + + failures+=Tests.test("StrictMath.scalb(float,int)", + value, scale_factor, + StrictMath.scalb(value, scale_factor), expected); + + failures+=Tests.test("StrictMath.scalb(float,int)", + -value, scale_factor, + StrictMath.scalb(-value, scale_factor), -expected); + return failures; + } + + public static int testFloatScalb() { + int failures=0; + int MAX_SCALE = FloatConsts.MAX_EXPONENT + -FloatConsts.MIN_EXPONENT + + FloatConsts.SIGNIFICAND_WIDTH + 1; + + + // Arguments x, where scalb(x,n) is x for any n. + float [] identityTestCases = {NaNf, + -0.0f, + +0.0f, + infinityF, + -infinityF + }; + + float [] subnormalTestCases = { + Float.MIN_VALUE, + 3.0f*Float.MIN_VALUE, + Float_MAX_SUBNORMALmm, + Float_MAX_SUBNORMAL + }; + + float [] someTestCases = { + Float.MIN_VALUE, + 3.0f*Float.MIN_VALUE, + Float_MAX_SUBNORMALmm, + Float_MAX_SUBNORMAL, + FloatConsts.MIN_NORMAL, + 1.0f, + 2.0f, + 3.0f, + (float)Math.PI, + Float_MAX_VALUEmm, + Float.MAX_VALUE + }; + + int [] oneMultiplyScalingFactors = { + FloatConsts.MIN_EXPONENT, + FloatConsts.MIN_EXPONENT+1, + -3, + -2, + -1, + 0, + 1, + 2, + 3, + FloatConsts.MAX_EXPONENT-1, + FloatConsts.MAX_EXPONENT + }; + + int [] manyScalingFactors = { + Integer.MIN_VALUE, + Integer.MIN_VALUE+1, + -MAX_SCALE -1, + -MAX_SCALE, + -MAX_SCALE+1, + + 2*FloatConsts.MIN_EXPONENT-1, // -253 + 2*FloatConsts.MIN_EXPONENT, // -252 + 2*FloatConsts.MIN_EXPONENT+1, // -251 + + FpUtils.ilogb(Float.MIN_VALUE)-1, // -150 + FpUtils.ilogb(Float.MIN_VALUE), // -149 + -FloatConsts.MAX_EXPONENT, // -127 + FloatConsts.MIN_EXPONENT, // -126 + + -2, + -1, + 0, + 1, + 2, + + FloatConsts.MAX_EXPONENT-1, // 126 + FloatConsts.MAX_EXPONENT, // 127 + FloatConsts.MAX_EXPONENT+1, // 128 + + 2*FloatConsts.MAX_EXPONENT-1, // 253 + 2*FloatConsts.MAX_EXPONENT, // 254 + 2*FloatConsts.MAX_EXPONENT+1, // 255 + + MAX_SCALE-1, + MAX_SCALE, + MAX_SCALE+1, + Integer.MAX_VALUE-1, + Integer.MAX_VALUE + }; + + // Test cases where scaling is always a no-op + for(int i=0; i < identityTestCases.length; i++) { + for(int j=0; j < manyScalingFactors.length; j++) { + failures += testScalbCase(identityTestCases[i], + manyScalingFactors[j], + identityTestCases[i]); + } + } + + // Test cases where result is 0.0 or infinity due to magnitude + // of the scaling factor + for(int i=0; i < someTestCases.length; i++) { + for(int j=0; j < manyScalingFactors.length; j++) { + int scaleFactor = manyScalingFactors[j]; + if (Math.abs(scaleFactor) >= MAX_SCALE) { + float value = someTestCases[i]; + failures+=testScalbCase(value, + scaleFactor, + FpUtils.copySign( (scaleFactor>0?infinityF:0.0f), value) ); + } + } + } + + // Test cases that could be done with one floating-point + // multiply. + for(int i=0; i < someTestCases.length; i++) { + for(int j=0; j < oneMultiplyScalingFactors.length; j++) { + int scaleFactor = oneMultiplyScalingFactors[j]; + float value = someTestCases[i]; + + failures+=testScalbCase(value, + scaleFactor, + value*powerOfTwoF(scaleFactor)); + } + } + + // Create 2^MAX_EXPONENT + float twoToTheMaxExp = 1.0f; // 2^0 + for(int i = 0; i < FloatConsts.MAX_EXPONENT; i++) + twoToTheMaxExp *=2.0f; + + // Scale-up subnormal values until they all overflow + for(int i=0; i < subnormalTestCases.length; i++) { + float scale = 1.0f; // 2^j + float value = subnormalTestCases[i]; + + for(int j=FloatConsts.MAX_EXPONENT*2; j < MAX_SCALE; j++) { // MAX_SCALE -1 should cause overflow + int scaleFactor = j; + + failures+=testScalbCase(value, + scaleFactor, + (FpUtils.ilogb(value) +j > FloatConsts.MAX_EXPONENT ) ? + FpUtils.copySign(infinityF, value) : // overflow + // calculate right answer + twoToTheMaxExp*(twoToTheMaxExp*(scale*value)) ); + scale*=2.0f; + } + } + + // Scale down a large number until it underflows. By scaling + // down MAX_NORMALmm, the first subnormal result will be exact + // but the next one will round -- all those results can be + // checked by halving a separate value in the loop. Actually, + // we can keep halving and checking until the product is zero + // since: + // + // 1. If the scalb of MAX_VALUEmm is subnormal and *not* exact + // it will round *up* + // + // 2. When rounding first occurs in the expected product, it + // too rounds up, to 2^-MAX_EXPONENT. + // + // Halving expected after rounding happends to give the same + // result as the scalb operation. + float expected = Float_MAX_VALUEmm *0.5f; + for(int i = -1; i > -MAX_SCALE; i--) { + failures+=testScalbCase(Float_MAX_VALUEmm, i, expected); + + expected *= 0.5f; + } + + // Tricky rounding tests: + // Scale down a large number into subnormal range such that if + // scalb is being implemented with multiple floating-point + // multiplies, the value would round twice if the multiplies + // were done in the wrong order. + + float value = 0x8.0000bP-5f; + expected = 0x1.00001p-129f; + + for(int i = 0; i < 129; i++) { + failures+=testScalbCase(value, + -127-i, + expected); + value *=2.0f; + } + + return failures; + } + + static int testScalbCase(double value, int scale_factor, double expected) { + int failures=0; + + failures+=Tests.test("Math.scalb(double,int)", + value, scale_factor, + Math.scalb(value, scale_factor), expected); + + failures+=Tests.test("Math.scalb(double,int)", + -value, scale_factor, + Math.scalb(-value, scale_factor), -expected); + + failures+=Tests.test("StrictMath.scalb(double,int)", + value, scale_factor, + StrictMath.scalb(value, scale_factor), expected); + + failures+=Tests.test("StrictMath.scalb(double,int)", + -value, scale_factor, + StrictMath.scalb(-value, scale_factor), -expected); + + return failures; + } + + public static int testDoubleScalb() { + int failures=0; + int MAX_SCALE = DoubleConsts.MAX_EXPONENT + -DoubleConsts.MIN_EXPONENT + + DoubleConsts.SIGNIFICAND_WIDTH + 1; + + + // Arguments x, where scalb(x,n) is x for any n. + double [] identityTestCases = {NaNd, + -0.0, + +0.0, + infinityD, + }; + + double [] subnormalTestCases = { + Double.MIN_VALUE, + 3.0d*Double.MIN_VALUE, + Double_MAX_SUBNORMALmm, + Double_MAX_SUBNORMAL + }; + + double [] someTestCases = { + Double.MIN_VALUE, + 3.0d*Double.MIN_VALUE, + Double_MAX_SUBNORMALmm, + Double_MAX_SUBNORMAL, + DoubleConsts.MIN_NORMAL, + 1.0d, + 2.0d, + 3.0d, + Math.PI, + Double_MAX_VALUEmm, + Double.MAX_VALUE + }; + + int [] oneMultiplyScalingFactors = { + DoubleConsts.MIN_EXPONENT, + DoubleConsts.MIN_EXPONENT+1, + -3, + -2, + -1, + 0, + 1, + 2, + 3, + DoubleConsts.MAX_EXPONENT-1, + DoubleConsts.MAX_EXPONENT + }; + + int [] manyScalingFactors = { + Integer.MIN_VALUE, + Integer.MIN_VALUE+1, + -MAX_SCALE -1, + -MAX_SCALE, + -MAX_SCALE+1, + + 2*DoubleConsts.MIN_EXPONENT-1, // -2045 + 2*DoubleConsts.MIN_EXPONENT, // -2044 + 2*DoubleConsts.MIN_EXPONENT+1, // -2043 + + FpUtils.ilogb(Double.MIN_VALUE)-1, // -1076 + FpUtils.ilogb(Double.MIN_VALUE), // -1075 + -DoubleConsts.MAX_EXPONENT, // -1023 + DoubleConsts.MIN_EXPONENT, // -1022 + + -2, + -1, + 0, + 1, + 2, + + DoubleConsts.MAX_EXPONENT-1, // 1022 + DoubleConsts.MAX_EXPONENT, // 1023 + DoubleConsts.MAX_EXPONENT+1, // 1024 + + 2*DoubleConsts.MAX_EXPONENT-1, // 2045 + 2*DoubleConsts.MAX_EXPONENT, // 2046 + 2*DoubleConsts.MAX_EXPONENT+1, // 2047 + + MAX_SCALE-1, + MAX_SCALE, + MAX_SCALE+1, + Integer.MAX_VALUE-1, + Integer.MAX_VALUE + }; + + // Test cases where scaling is always a no-op + for(int i=0; i < identityTestCases.length; i++) { + for(int j=0; j < manyScalingFactors.length; j++) { + failures += testScalbCase(identityTestCases[i], + manyScalingFactors[j], + identityTestCases[i]); + } + } + + // Test cases where result is 0.0 or infinity due to magnitude + // of the scaling factor + for(int i=0; i < someTestCases.length; i++) { + for(int j=0; j < manyScalingFactors.length; j++) { + int scaleFactor = manyScalingFactors[j]; + if (Math.abs(scaleFactor) >= MAX_SCALE) { + double value = someTestCases[i]; + failures+=testScalbCase(value, + scaleFactor, + FpUtils.copySign( (scaleFactor>0?infinityD:0.0), value) ); + } + } + } + + // Test cases that could be done with one floating-point + // multiply. + for(int i=0; i < someTestCases.length; i++) { + for(int j=0; j < oneMultiplyScalingFactors.length; j++) { + int scaleFactor = oneMultiplyScalingFactors[j]; + double value = someTestCases[i]; + + failures+=testScalbCase(value, + scaleFactor, + value*powerOfTwoD(scaleFactor)); + } + } + + // Create 2^MAX_EXPONENT + double twoToTheMaxExp = 1.0; // 2^0 + for(int i = 0; i < DoubleConsts.MAX_EXPONENT; i++) + twoToTheMaxExp *=2.0; + + // Scale-up subnormal values until they all overflow + for(int i=0; i < subnormalTestCases.length; i++) { + double scale = 1.0; // 2^j + double value = subnormalTestCases[i]; + + for(int j=DoubleConsts.MAX_EXPONENT*2; j < MAX_SCALE; j++) { // MAX_SCALE -1 should cause overflow + int scaleFactor = j; + + failures+=testScalbCase(value, + scaleFactor, + (FpUtils.ilogb(value) +j > DoubleConsts.MAX_EXPONENT ) ? + FpUtils.copySign(infinityD, value) : // overflow + // calculate right answer + twoToTheMaxExp*(twoToTheMaxExp*(scale*value)) ); + scale*=2.0; + } + } + + // Scale down a large number until it underflows. By scaling + // down MAX_NORMALmm, the first subnormal result will be exact + // but the next one will round -- all those results can be + // checked by halving a separate value in the loop. Actually, + // we can keep halving and checking until the product is zero + // since: + // + // 1. If the scalb of MAX_VALUEmm is subnormal and *not* exact + // it will round *up* + // + // 2. When rounding first occurs in the expected product, it + // too rounds up, to 2^-MAX_EXPONENT. + // + // Halving expected after rounding happends to give the same + // result as the scalb operation. + double expected = Double_MAX_VALUEmm *0.5f; + for(int i = -1; i > -MAX_SCALE; i--) { + failures+=testScalbCase(Double_MAX_VALUEmm, i, expected); + + expected *= 0.5; + } + + // Tricky rounding tests: + // Scale down a large number into subnormal range such that if + // scalb is being implemented with multiple floating-point + // multiplies, the value would round twice if the multiplies + // were done in the wrong order. + + double value = 0x1.000000000000bP-1; + expected = 0x0.2000000000001P-1022; + for(int i = 0; i < DoubleConsts.MAX_EXPONENT+2; i++) { + failures+=testScalbCase(value, + -1024-i, + expected); + value *=2.0; + } + + return failures; + } + + /* ************************* ulp tests ******************************* */ + + + /* + * Test Math.ulp and StrictMath.ulp with +d and -d. + */ + static int testUlpCase(float f, float expected) { + float minus_f = -f; + int failures=0; + + failures+=Tests.test("Math.ulp(float)", f, + Math.ulp(f), expected); + failures+=Tests.test("Math.ulp(float)", minus_f, + Math.ulp(minus_f), expected); + failures+=Tests.test("StrictMath.ulp(float)", f, + StrictMath.ulp(f), expected); + failures+=Tests.test("StrictMath.ulp(float)", minus_f, + StrictMath.ulp(minus_f), expected); + return failures; + } + + static int testUlpCase(double d, double expected) { + double minus_d = -d; + int failures=0; + + failures+=Tests.test("Math.ulp(double)", d, + Math.ulp(d), expected); + failures+=Tests.test("Math.ulp(double)", minus_d, + Math.ulp(minus_d), expected); + failures+=Tests.test("StrictMath.ulp(double)", d, + StrictMath.ulp(d), expected); + failures+=Tests.test("StrictMath.ulp(double)", minus_d, + StrictMath.ulp(minus_d), expected); + return failures; + } + + public static int testFloatUlp() { + int failures = 0; + float [] specialValues = {NaNf, + Float.POSITIVE_INFINITY, + +0.0f, + +1.0f, + +2.0f, + +16.0f, + +Float.MIN_VALUE, + +Float_MAX_SUBNORMAL, + +FloatConsts.MIN_NORMAL, + +Float.MAX_VALUE + }; + + float [] specialResults = {NaNf, + Float.POSITIVE_INFINITY, + Float.MIN_VALUE, + powerOfTwoF(-23), + powerOfTwoF(-22), + powerOfTwoF(-19), + Float.MIN_VALUE, + Float.MIN_VALUE, + Float.MIN_VALUE, + powerOfTwoF(104) + }; + + // Special value tests + for(int i = 0; i < specialValues.length; i++) { + failures += testUlpCase(specialValues[i], specialResults[i]); + } + + + // Normal exponent tests + for(int i = FloatConsts.MIN_EXPONENT; i <= FloatConsts.MAX_EXPONENT; i++) { + float expected; + + // Create power of two + float po2 = powerOfTwoF(i); + expected = FpUtils.scalb(1.0f, i - (FloatConsts.SIGNIFICAND_WIDTH-1)); + + failures += testUlpCase(po2, expected); + + // Generate some random bit patterns for the significand + for(int j = 0; j < 10; j++) { + int randSignif = rand.nextInt(); + float randFloat; + + randFloat = Float.intBitsToFloat( // Exponent + (Float.floatToIntBits(po2)& + (~FloatConsts.SIGNIF_BIT_MASK)) | + // Significand + (randSignif & + FloatConsts.SIGNIF_BIT_MASK) ); + + failures += testUlpCase(randFloat, expected); + } + + if (i > FloatConsts.MIN_EXPONENT) { + float po2minus = FpUtils.nextAfter(po2, + Float.NEGATIVE_INFINITY); + failures += testUlpCase(po2minus, expected/2.0f); + } + } + + // Subnormal tests + + /* + * Start with MIN_VALUE, left shift, test high value, low + * values, and random in between. + * + * Use nextAfter to calculate, high value of previous binade, + * loop count i will indicate how many random bits, if any are + * needed. + */ + + float top=Float.MIN_VALUE; + for( int i = 1; + i < FloatConsts.SIGNIFICAND_WIDTH; + i++, top *= 2.0f) { + + failures += testUlpCase(top, Float.MIN_VALUE); + + // Test largest value in next smaller binade + if (i >= 3) {// (i == 1) would test 0.0; + // (i == 2) would just retest MIN_VALUE + testUlpCase(FpUtils.nextAfter(top, 0.0f), + Float.MIN_VALUE); + + if( i >= 10) { + // create a bit mask with (i-1) 1's in the low order + // bits + int mask = ~((~0)<<(i-1)); + float randFloat = Float.intBitsToFloat( // Exponent + Float.floatToIntBits(top) | + // Significand + (rand.nextInt() & mask ) ) ; + + failures += testUlpCase(randFloat, Float.MIN_VALUE); + } + } + } + + return failures; + } + + public static int testDoubleUlp() { + int failures = 0; + double [] specialValues = {NaNd, + Double.POSITIVE_INFINITY, + +0.0d, + +1.0d, + +2.0d, + +16.0d, + +Double.MIN_VALUE, + +Double_MAX_SUBNORMAL, + +DoubleConsts.MIN_NORMAL, + +Double.MAX_VALUE + }; + + double [] specialResults = {NaNf, + Double.POSITIVE_INFINITY, + Double.MIN_VALUE, + powerOfTwoD(-52), + powerOfTwoD(-51), + powerOfTwoD(-48), + Double.MIN_VALUE, + Double.MIN_VALUE, + Double.MIN_VALUE, + powerOfTwoD(971) + }; + + // Special value tests + for(int i = 0; i < specialValues.length; i++) { + failures += testUlpCase(specialValues[i], specialResults[i]); + } + + + // Normal exponent tests + for(int i = DoubleConsts.MIN_EXPONENT; i <= DoubleConsts.MAX_EXPONENT; i++) { + double expected; + + // Create power of two + double po2 = powerOfTwoD(i); + expected = FpUtils.scalb(1.0, i - (DoubleConsts.SIGNIFICAND_WIDTH-1)); + + failures += testUlpCase(po2, expected); + + // Generate some random bit patterns for the significand + for(int j = 0; j < 10; j++) { + long randSignif = rand.nextLong(); + double randDouble; + + randDouble = Double.longBitsToDouble( // Exponent + (Double.doubleToLongBits(po2)& + (~DoubleConsts.SIGNIF_BIT_MASK)) | + // Significand + (randSignif & + DoubleConsts.SIGNIF_BIT_MASK) ); + + failures += testUlpCase(randDouble, expected); + } + + if (i > DoubleConsts.MIN_EXPONENT) { + double po2minus = FpUtils.nextAfter(po2, + Double.NEGATIVE_INFINITY); + failures += testUlpCase(po2minus, expected/2.0f); + } + } + + // Subnormal tests + + /* + * Start with MIN_VALUE, left shift, test high value, low + * values, and random in between. + * + * Use nextAfter to calculate, high value of previous binade, + * loop count i will indicate how many random bits, if any are + * needed. + */ + + double top=Double.MIN_VALUE; + for( int i = 1; + i < DoubleConsts.SIGNIFICAND_WIDTH; + i++, top *= 2.0f) { + + failures += testUlpCase(top, Double.MIN_VALUE); + + // Test largest value in next smaller binade + if (i >= 3) {// (i == 1) would test 0.0; + // (i == 2) would just retest MIN_VALUE + testUlpCase(FpUtils.nextAfter(top, 0.0f), + Double.MIN_VALUE); + + if( i >= 10) { + // create a bit mask with (i-1) 1's in the low order + // bits + int mask = ~((~0)<<(i-1)); + double randDouble = Double.longBitsToDouble( // Exponent + Double.doubleToLongBits(top) | + // Significand + (rand.nextLong() & mask ) ) ; + + failures += testUlpCase(randDouble, Double.MIN_VALUE); + } + } + } + + return failures; + } + + public static int testFloatSignum() { + int failures = 0; + float testCases [][] = { + {NaNf, NaNf}, + {-infinityF, -1.0f}, + {-Float.MAX_VALUE, -1.0f}, + {-FloatConsts.MIN_NORMAL, -1.0f}, + {-1.0f, -1.0f}, + {-2.0f, -1.0f}, + {-Float_MAX_SUBNORMAL, -1.0f}, + {-Float.MIN_VALUE, -1.0f}, + {-0.0f, -0.0f}, + {+0.0f, +0.0f}, + {Float.MIN_VALUE, 1.0f}, + {Float_MAX_SUBNORMALmm, 1.0f}, + {Float_MAX_SUBNORMAL, 1.0f}, + {FloatConsts.MIN_NORMAL, 1.0f}, + {1.0f, 1.0f}, + {2.0f, 1.0f}, + {Float_MAX_VALUEmm, 1.0f}, + {Float.MAX_VALUE, 1.0f}, + {infinityF, 1.0f} + }; + + for(int i = 0; i < testCases.length; i++) { + failures+=Tests.test("Math.signum(float)", + testCases[i][0], Math.signum(testCases[i][0]), testCases[i][1]); + failures+=Tests.test("StrictMath.signum(float)", + testCases[i][0], StrictMath.signum(testCases[i][0]), testCases[i][1]); + } + + return failures; + } + + public static int testDoubleSignum() { + int failures = 0; + double testCases [][] = { + {NaNd, NaNd}, + {-infinityD, -1.0}, + {-Double.MAX_VALUE, -1.0}, + {-DoubleConsts.MIN_NORMAL, -1.0}, + {-1.0, -1.0}, + {-2.0, -1.0}, + {-Double_MAX_SUBNORMAL, -1.0}, + {-Double.MIN_VALUE, -1.0d}, + {-0.0d, -0.0d}, + {+0.0d, +0.0d}, + {Double.MIN_VALUE, 1.0}, + {Double_MAX_SUBNORMALmm, 1.0}, + {Double_MAX_SUBNORMAL, 1.0}, + {DoubleConsts.MIN_NORMAL, 1.0}, + {1.0, 1.0}, + {2.0, 1.0}, + {Double_MAX_VALUEmm, 1.0}, + {Double.MAX_VALUE, 1.0}, + {infinityD, 1.0} + }; + + for(int i = 0; i < testCases.length; i++) { + failures+=Tests.test("Math.signum(double)", + testCases[i][0], Math.signum(testCases[i][0]), testCases[i][1]); + failures+=Tests.test("StrictMath.signum(double)", + testCases[i][0], StrictMath.signum(testCases[i][0]), testCases[i][1]); + } + + return failures; + } + + + public static void main(String argv[]) { + int failures = 0; + + failures += testFloatGetExponent(); + failures += testDoubleGetExponent(); + + failures += testFloatNextAfter(); + failures += testDoubleNextAfter(); + + failures += testFloatNextUp(); + failures += testDoubleNextUp(); + + failures += testFloatNextDown(); + failures += testDoubleNextDown(); + + failures += testFloatBooleanMethods(); + failures += testDoubleBooleanMethods(); + + failures += testFloatCopySign(); + failures += testDoubleCopySign(); + + failures += testFloatScalb(); + failures += testDoubleScalb(); + + failures += testFloatUlp(); + failures += testDoubleUlp(); + + failures += testFloatSignum(); + failures += testDoubleSignum(); + + if (failures > 0) { + System.err.println("Testing the recommended functions incurred " + + failures + " failures."); + throw new RuntimeException(); + } + } +} diff --git a/jdk/test/java/lang/Math/Log10Tests.java b/jdk/test/java/lang/Math/Log10Tests.java new file mode 100644 index 00000000000..0f0c4799a43 --- /dev/null +++ b/jdk/test/java/lang/Math/Log10Tests.java @@ -0,0 +1,223 @@ +/* + * Copyright 2003 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4074599 4939441 + * @summary Tests for {Math, StrictMath}.log10 + * @author Joseph D. Darcy + */ + +import sun.misc.FpUtils; +import sun.misc.DoubleConsts; + +public class Log10Tests { + private Log10Tests(){} + + static final double infinityD = Double.POSITIVE_INFINITY; + static final double NaNd = Double.NaN; + static final double LN_10 = StrictMath.log(10.0); + + // Initialize shared random number generator + static java.util.Random rand = new java.util.Random(0L); + + static int testLog10Case(double input, double expected) { + int failures=0; + + failures+=Tests.test("Math.log10(double)", input, + Math.log10(input), expected); + + failures+=Tests.test("StrictMath.log10(double)", input, + StrictMath.log10(input), expected); + + return failures; + } + + static int testLog10() { + int failures = 0; + + double [][] testCases = { + {Double.NaN, NaNd}, + {Double.longBitsToDouble(0x7FF0000000000001L), NaNd}, + {Double.longBitsToDouble(0xFFF0000000000001L), NaNd}, + {Double.longBitsToDouble(0x7FF8555555555555L), NaNd}, + {Double.longBitsToDouble(0xFFF8555555555555L), NaNd}, + {Double.longBitsToDouble(0x7FFFFFFFFFFFFFFFL), NaNd}, + {Double.longBitsToDouble(0xFFFFFFFFFFFFFFFFL), NaNd}, + {Double.longBitsToDouble(0x7FFDeadBeef00000L), NaNd}, + {Double.longBitsToDouble(0xFFFDeadBeef00000L), NaNd}, + {Double.longBitsToDouble(0x7FFCafeBabe00000L), NaNd}, + {Double.longBitsToDouble(0xFFFCafeBabe00000L), NaNd}, + {Double.NEGATIVE_INFINITY, NaNd}, + {-8.0, NaNd}, + {-1.0, NaNd}, + {-DoubleConsts.MIN_NORMAL, NaNd}, + {-Double.MIN_VALUE, NaNd}, + {-0.0, -infinityD}, + {+0.0, -infinityD}, + {+1.0, 0.0}, + {Double.POSITIVE_INFINITY, infinityD}, + }; + + // Test special cases + for(int i = 0; i < testCases.length; i++) { + failures += testLog10Case(testCases[i][0], + testCases[i][1]); + } + + // Test log10(10^n) == n for integer n; 10^n, n < 0 is not + // exactly representable as a floating-point value -- up to + // 10^22 can be represented exactly + double testCase = 1.0; + for(int i = 0; i < 23; i++) { + failures += testLog10Case(testCase, i); + testCase *= 10.0; + } + + // Test for gross inaccuracy by comparing to log; should be + // within a few ulps of log(x)/log(10) + for(int i = 0; i < 10000; i++) { + double input = Double.longBitsToDouble(rand.nextLong()); + if(! FpUtils.isFinite(input)) + continue; // avoid testing NaN and infinite values + else { + input = Math.abs(input); + + double expected = StrictMath.log(input)/LN_10; + if( ! FpUtils.isFinite(expected)) + continue; // if log(input) overflowed, try again + else { + double result; + + if( Math.abs(((result=Math.log10(input)) - expected)/Math.ulp(expected)) > 3) { + failures++; + System.err.println("For input " + input + + ", Math.log10 was more than 3 ulps different from " + + "log(input)/log(10): log10(input) = " + result + + "\tlog(input)/log(10) = " + expected); + } + + if( Math.abs(((result=StrictMath.log10(input)) - expected)/Math.ulp(expected)) > 3) { + failures++; + System.err.println("For input " + input + + ", StrictMath.log10 was more than 3 ulps different from " + + "log(input)/log(10): log10(input) = " + result + + "\tlog(input)/log(10) = " + expected); + } + + + } + } + } + + // Test for accuracy and monotonicity near log10(1.0). From + // the Taylor expansion of log, + // log10(1+z) ~= (z -(z^2)/2)/LN_10; + { + double neighbors[] = new double[40]; + double neighborsStrict[] = new double[40]; + double z = Double.NaN; + + // Test inputs greater than 1.0. + neighbors[0] = Math.log10(1.0); + neighborsStrict[0] = StrictMath.log10(1.0); + + double input[] = new double[40]; + int half = input.length/2; + + + // Initialize input to the 40 consecutive double values + // "centered" at 1.0. + double up = Double.NaN; + double down = Double.NaN; + for(int i = 0; i < half; i++) { + if (i == 0) { + input[half] = 1.0; + up = FpUtils.nextUp(1.0); + down = FpUtils.nextDown(1.0); + } else { + input[half + i] = up; + input[half - i] = down; + up = FpUtils.nextUp(up); + down = FpUtils.nextDown(down); + } + } + input[0] = FpUtils.nextDown(input[1]); + + for(int i = 0; i < neighbors.length; i++) { + neighbors[i] = Math.log10(input[i]); + neighborsStrict[i] = StrictMath.log10(input[i]); + + // Test accuracy. + z = input[i] - 1.0; + double expected = (z - (z*z)*0.5)/LN_10; + if ( Math.abs(neighbors[i] - expected ) > 3*Math.ulp(expected) ) { + failures++; + System.err.println("For input near 1.0 " + input[i] + + ", Math.log10(1+z) was more than 3 ulps different from " + + "(z-(z^2)/2)/ln(10): log10(input) = " + neighbors[i] + + "\texpected about = " + expected); + } + + if ( Math.abs(neighborsStrict[i] - expected ) > 3*Math.ulp(expected) ) { + failures++; + System.err.println("For input near 1.0 " + input[i] + + ", StrictMath.log10(1+z) was more than 3 ulps different from " + + "(z-(z^2)/2)/ln(10): log10(input) = " + neighborsStrict[i] + + "\texpected about = " + expected); + } + + // Test monotonicity + if( i > 0) { + if( neighbors[i-1] > neighbors[i] ) { + failures++; + System.err.println("Monotonicity failure for Math.log10 at " + input[i] + + " and prior value."); + } + + if( neighborsStrict[i-1] > neighborsStrict[i] ) { + failures++; + System.err.println("Monotonicity failure for StrictMath.log10 at " + input[i] + + " and prior value."); + } + } + } + + } + + return failures; + } + + public static void main(String argv[]) { + int failures = 0; + + failures += testLog10(); + + if (failures > 0) { + System.err.println("Testing log10 incurred " + + failures + " failures."); + throw new RuntimeException(); + } + } + +} diff --git a/jdk/test/java/lang/Math/Log1pTests.java b/jdk/test/java/lang/Math/Log1pTests.java new file mode 100644 index 00000000000..8cfe6ed72e0 --- /dev/null +++ b/jdk/test/java/lang/Math/Log1pTests.java @@ -0,0 +1,206 @@ +/* + * Copyright 2003 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4851638 4939441 + * @summary Tests for {Math, StrictMath}.log1p + * @author Joseph D. Darcy + */ + +import sun.misc.DoubleConsts; +import sun.misc.FpUtils; + +public class Log1pTests { + private Log1pTests(){} + + static final double infinityD = Double.POSITIVE_INFINITY; + static final double NaNd = Double.NaN; + + /** + * Formulation taken from HP-15C Advanced Functions Handbook, part + * number HP 0015-90011, p 181. This is accurate to a few ulps. + */ + static double hp15cLogp(double x) { + double u = 1.0 + x; + return (u==1.0? x : StrictMath.log(u)*x/(u-1) ); + } + + /* + * The Taylor expansion of ln(1 + x) for -1 < x <= 1 is: + * + * x - x^2/2 + x^3/3 - ... -(-x^j)/j + * + * Therefore, for small values of x, log1p(x) ~= x. For large + * values of x, log1p(x) ~= log(x). + * + * Also x/(x+1) < ln(1+x) < x + */ + + static int testLog1p() { + int failures = 0; + + double [][] testCases = { + {Double.NaN, NaNd}, + {Double.longBitsToDouble(0x7FF0000000000001L), NaNd}, + {Double.longBitsToDouble(0xFFF0000000000001L), NaNd}, + {Double.longBitsToDouble(0x7FF8555555555555L), NaNd}, + {Double.longBitsToDouble(0xFFF8555555555555L), NaNd}, + {Double.longBitsToDouble(0x7FFFFFFFFFFFFFFFL), NaNd}, + {Double.longBitsToDouble(0xFFFFFFFFFFFFFFFFL), NaNd}, + {Double.longBitsToDouble(0x7FFDeadBeef00000L), NaNd}, + {Double.longBitsToDouble(0xFFFDeadBeef00000L), NaNd}, + {Double.longBitsToDouble(0x7FFCafeBabe00000L), NaNd}, + {Double.longBitsToDouble(0xFFFCafeBabe00000L), NaNd}, + {Double.NEGATIVE_INFINITY, NaNd}, + {-8.0, NaNd}, + {-1.0, -infinityD}, + {-0.0, -0.0}, + {+0.0, +0.0}, + {infinityD, infinityD}, + }; + + // Test special cases + for(int i = 0; i < testCases.length; i++) { + failures += testLog1pCaseWithUlpDiff(testCases[i][0], + testCases[i][1], 0); + } + + // For |x| < 2^-54 log1p(x) ~= x + for(int i = DoubleConsts.MIN_SUB_EXPONENT; i <= -54; i++) { + double d = FpUtils.scalb(2, i); + failures += testLog1pCase(d, d); + failures += testLog1pCase(-d, -d); + } + + // For x > 2^53 log1p(x) ~= log(x) + for(int i = 53; i <= DoubleConsts.MAX_EXPONENT; i++) { + double d = FpUtils.scalb(2, i); + failures += testLog1pCaseWithUlpDiff(d, StrictMath.log(d), 2.001); + } + + // Construct random values with exponents ranging from -53 to + // 52 and compare against HP-15C formula. + java.util.Random rand = new java.util.Random(); + for(int i = 0; i < 1000; i++) { + double d = rand.nextDouble(); + + d = FpUtils.scalb(d, -53 - FpUtils.ilogb(d)); + + for(int j = -53; j <= 52; j++) { + failures += testLog1pCaseWithUlpDiff(d, hp15cLogp(d), 5); + + d *= 2.0; // increase exponent by 1 + } + } + + // Test for monotonicity failures near values y-1 where y ~= + // e^x. Test two numbers before and two numbers after each + // chosen value; i.e. + // + // pcNeighbors[] = + // {nextDown(nextDown(pc)), + // nextDown(pc), + // pc, + // nextUp(pc), + // nextUp(nextUp(pc))} + // + // and we test that log1p(pcNeighbors[i]) <= log1p(pcNeighbors[i+1]) + { + double pcNeighbors[] = new double[5]; + double pcNeighborsLog1p[] = new double[5]; + double pcNeighborsStrictLog1p[] = new double[5]; + + for(int i = -36; i <= 36; i++) { + double pc = StrictMath.pow(Math.E, i) - 1; + + pcNeighbors[2] = pc; + pcNeighbors[1] = FpUtils.nextDown(pc); + pcNeighbors[0] = FpUtils.nextDown(pcNeighbors[1]); + pcNeighbors[3] = FpUtils.nextUp(pc); + pcNeighbors[4] = FpUtils.nextUp(pcNeighbors[3]); + + for(int j = 0; j < pcNeighbors.length; j++) { + pcNeighborsLog1p[j] = Math.log1p(pcNeighbors[j]); + pcNeighborsStrictLog1p[j] = StrictMath.log1p(pcNeighbors[j]); + } + + for(int j = 0; j < pcNeighborsLog1p.length-1; j++) { + if(pcNeighborsLog1p[j] > pcNeighborsLog1p[j+1] ) { + failures++; + System.err.println("Monotonicity failure for Math.log1p on " + + pcNeighbors[j] + " and " + + pcNeighbors[j+1] + "\n\treturned " + + pcNeighborsLog1p[j] + " and " + + pcNeighborsLog1p[j+1] ); + } + + if(pcNeighborsStrictLog1p[j] > pcNeighborsStrictLog1p[j+1] ) { + failures++; + System.err.println("Monotonicity failure for StrictMath.log1p on " + + pcNeighbors[j] + " and " + + pcNeighbors[j+1] + "\n\treturned " + + pcNeighborsStrictLog1p[j] + " and " + + pcNeighborsStrictLog1p[j+1] ); + } + + + } + + } + } + + return failures; + } + + public static int testLog1pCase(double input, + double expected) { + return testLog1pCaseWithUlpDiff(input, expected, 1); + } + + public static int testLog1pCaseWithUlpDiff(double input, + double expected, + double ulps) { + int failures = 0; + failures += Tests.testUlpDiff("Math.lop1p(double", + input, Math.log1p(input), + expected, ulps); + failures += Tests.testUlpDiff("StrictMath.log1p(double", + input, StrictMath.log1p(input), + expected, ulps); + return failures; + } + + public static void main(String argv[]) { + int failures = 0; + + failures += testLog1p(); + + if (failures > 0) { + System.err.println("Testing log1p incurred " + + failures + " failures."); + throw new RuntimeException(); + } + } + +} diff --git a/jdk/test/java/lang/Math/MinMax.java b/jdk/test/java/lang/Math/MinMax.java new file mode 100644 index 00000000000..8ae8cf37ccf --- /dev/null +++ b/jdk/test/java/lang/Math/MinMax.java @@ -0,0 +1,124 @@ +/* + * Copyright 1997 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 4010528 4010529 + @summary Math.min and Math.max should treat negative zero as strictly + less than positive zero + */ + + +public class MinMax { + + + static void go(String what, float result, float correctResult) { + String v = what + ": got " + result + ", expected " + correctResult; + if (!(Float.toString(result).equals(Float.toString(correctResult)))) + throw new RuntimeException(v); + System.err.println(v); + } + + static void go(String what, double result, double correctResult) { + String v = what + ": got " + result + ", expected " + correctResult; + if (!(Double.toString(result).equals(Double.toString(correctResult)))) + throw new RuntimeException(v); + System.err.println(v); + } + + + public static void main(String[] args) { + + float fnz = -0.0f; + float fpz = +0.0f; + + go("Math.min(fnz, fnz)", Math.min(fnz, fnz), fnz); + go("Math.min(fnz, fpz)", Math.min(fnz, fpz), fnz); + go("Math.min(fpz, fnz)", Math.min(fpz, fnz), fnz); + go("Math.min(fpz, fpz)", Math.min(fpz, fpz), fpz); + + go("Math.min(-1.0f, fnz)", Math.min(-1.0f, fnz), -1.0f); + go("Math.min(-1.0f, fpz)", Math.min(-1.0f, fpz), -1.0f); + go("Math.min(+1.0f, fnz)", Math.min(+1.0f, fnz), fnz); + go("Math.min(+1.0f, fpz)", Math.min(+1.0f, fpz), fpz); + go("Math.min(-1.0f, +1.0f)", Math.min(-1.0f, +1.0f), -1.0f); + go("Math.min(fnz, -1.0f)", Math.min(fnz, -1.0f), -1.0f); + go("Math.min(fpz, -1.0f)", Math.min(fpz, -1.0f), -1.0f); + go("Math.min(fnz, +1.0f)", Math.min(fnz, +1.0f), fnz); + go("Math.min(fpz, +1.0f)", Math.min(fpz, +1.0f), fpz); + go("Math.min(+1.0f, -1.0f)", Math.min(+1.0f, -1.0f), -1.0f); + + go("Math.max(fnz, fnz)", Math.max(fnz, fnz), fnz); + go("Math.max(fnz, fpz)", Math.max(fnz, fpz), fpz); + go("Math.max(fpz, fnz)", Math.max(fpz, fnz), fpz); + go("Math.max(fpz, fpz)", Math.max(fpz, fpz), fpz); + + go("Math.max(-1.0f, fnz)", Math.max(-1.0f, fnz), fnz); + go("Math.max(-1.0f, fpz)", Math.max(-1.0f, fpz), fpz); + go("Math.max(+1.0f, fnz)", Math.max(+1.0f, fnz), +1.0f); + go("Math.max(+1.0f, fpz)", Math.max(+1.0f, fpz), +1.0f); + go("Math.max(-1.0f, +1.0f)", Math.max(-1.0f, +1.0f), +1.0f); + go("Math.max(fnz, -1.0f)", Math.max(fnz, -1.0f), fnz); + go("Math.max(fpz, -1.0f)", Math.max(fpz, -1.0f), fpz); + go("Math.max(fnz, +1.0f)", Math.max(fnz, +1.0f), +1.0f); + go("Math.max(fpz, +1.0f)", Math.max(fpz, +1.0f), +1.0f); + go("Math.max(+1.0f, -1.0f)", Math.max(+1.0f, -1.0f), +1.0f); + + + double dnz = -0.0d; + double dpz = +0.0d; + + go("Math.min(dnz, dnz)", Math.min(dnz, dnz), dnz); + go("Math.min(dnz, dpz)", Math.min(dnz, dpz), dnz); + go("Math.min(dpz, dnz)", Math.min(dpz, dnz), dnz); + go("Math.min(dpz, dpz)", Math.min(dpz, dpz), dpz); + + go("Math.min(-1.0d, dnz)", Math.min(-1.0d, dnz), -1.0d); + go("Math.min(-1.0d, dpz)", Math.min(-1.0d, dpz), -1.0d); + go("Math.min(+1.0d, dnz)", Math.min(+1.0d, dnz), dnz); + go("Math.min(+1.0d, dpz)", Math.min(+1.0d, dpz), dpz); + go("Math.min(-1.0d, +1.0d)", Math.min(-1.0d, +1.0d), -1.0d); + go("Math.min(dnz, -1.0d)", Math.min(dnz, -1.0d), -1.0d); + go("Math.min(dpz, -1.0d)", Math.min(dpz, -1.0d), -1.0d); + go("Math.min(dnz, +1.0d)", Math.min(dnz, +1.0d), dnz); + go("Math.min(dpz, +1.0d)", Math.min(dpz, +1.0d), dpz); + go("Math.min(+1.0d, -1.0d)", Math.min(+1.0d, -1.0d), -1.0d); + + go("Math.max(dnz, dnz)", Math.max(dnz, dnz), dnz); + go("Math.max(dnz, dpz)", Math.max(dnz, dpz), dpz); + go("Math.max(dpz, dnz)", Math.max(dpz, dnz), dpz); + go("Math.max(dpz, dpz)", Math.max(dpz, dpz), dpz); + + go("Math.max(-1.0d, dnz)", Math.max(-1.0d, dnz), dnz); + go("Math.max(-1.0d, dpz)", Math.max(-1.0d, dpz), dpz); + go("Math.max(+1.0d, dnz)", Math.max(+1.0d, dnz), +1.0d); + go("Math.max(+1.0d, dpz)", Math.max(+1.0d, dpz), +1.0d); + go("Math.max(-1.0d, +1.0d)", Math.max(-1.0d, +1.0d), +1.0d); + go("Math.max(dnz, -1.0d)", Math.max(dnz, -1.0d), dnz); + go("Math.max(dpz, -1.0d)", Math.max(dpz, -1.0d), dpz); + go("Math.max(dnz, +1.0d)", Math.max(dnz, +1.0d), +1.0d); + go("Math.max(dpz, +1.0d)", Math.max(dpz, +1.0d), +1.0d); + go("Math.max(+1.0d, -1.0d)", Math.max(+1.0d, -1.0d), +1.0d); + + } + +} diff --git a/jdk/test/java/lang/Math/PowTests.java b/jdk/test/java/lang/Math/PowTests.java new file mode 100644 index 00000000000..79764765e33 --- /dev/null +++ b/jdk/test/java/lang/Math/PowTests.java @@ -0,0 +1,301 @@ +/* + * Copyright 2004 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4984407 5033578 + * @summary Tests for {Math, StrictMath}.pow + * @compile -source 1.5 PowTests.java + * @run main PowTests + * @author Joseph D. Darcy + */ + +public class PowTests { + private PowTests(){} + + static final double infinityD = Double.POSITIVE_INFINITY; + + static int testPowCase(double input1, double input2, double expected) { + int failures = 0; + failures += Tests.test("StrictMath.pow(double, double)", input1, input2, + StrictMath.pow(input1, input2), expected); + failures += Tests.test("Math.pow(double, double)", input1, input2, + Math.pow(input1, input2), expected); + return failures; + } + + + static int testStrictPowCase(double input1, double input2, double expected) { + int failures = 0; + failures += Tests.test("StrictMath.pow(double, double)", input1, input2, + StrictMath.pow(input1, input2), expected); + return failures; + } + + static int testNonstrictPowCase(double input1, double input2, double expected) { + int failures = 0; + failures += Tests.test("Math.pow(double, double)", input1, input2, + Math.pow(input1, input2), expected); + return failures; + } + + /* + * Test for bad negation implementation. + */ + static int testPow() { + int failures = 0; + + double [][] testCases = { + {-0.0, 3.0, -0.0}, + {-0.0, 4.0, 0.0}, + {-infinityD, -3.0, -0.0}, + {-infinityD, -4.0, 0.0}, + }; + + for (double[] testCase : testCases) { + failures+=testPowCase(testCase[0], testCase[1], testCase[2]); + } + + return failures; + } + + /* + * Test cross-product of different kinds of arguments. + */ + static int testCrossProduct() { + int failures = 0; + + double testData[] = { + Double.NEGATIVE_INFINITY, +/* > -oo */ -Double.MAX_VALUE, +/**/ (double)Long.MIN_VALUE, +/**/ (double) -((1L<<53)+2L), +/**/ (double) -((1L<<53)), +/**/ (double) -((1L<<53)-1L), +/**/ -((double)Integer.MAX_VALUE + 4.0), +/**/ (double)Integer.MIN_VALUE - 1.0, +/**/ (double)Integer.MIN_VALUE, +/**/ (double)Integer.MIN_VALUE + 1.0, +/**/ -Math.PI, +/**/ -3.0, +/**/ -Math.E, +/**/ -2.0, +/**/ -1.0000000000000004, +/* < -1.0 */ -1.0000000000000002, // nextAfter(-1.0, -oo) + -1.0, +/* > -1.0 */ -0.9999999999999999, // nextAfter(-1.0, +oo) +/* > -1.0 */ -0.9999999999999998, +/**/ -0.5, +/**/ -1.0/3.0, +/* < 0.0 */ -Double.MIN_VALUE, + -0.0, + +0.0, +/* > 0.0 */ +Double.MIN_VALUE, +/**/ +1.0/3.0, +/**/ +0.5, +/**/ +0.9999999999999998, +/* < +1.0 */ +0.9999999999999999, // nextAfter(-1.0, +oo) + +1.0, +/* > 1.0 */ +1.0000000000000002, // nextAfter(+1.0, +oo) +/**/ +1.0000000000000004, +/**/ +2.0, +/**/ +Math.E, +/**/ +3.0, +/**/ +Math.PI, +/**/ -(double)Integer.MIN_VALUE - 1.0, +/**/ -(double)Integer.MIN_VALUE, +/**/ -(double)Integer.MIN_VALUE + 1.0, +/**/ (double)Integer.MAX_VALUE + 4.0, +/**/ (double) ((1L<<53)-1L), +/**/ (double) ((1L<<53)), +/**/ (double) ((1L<<53)+2L), +/**/ -(double)Long.MIN_VALUE, +/* < oo */ Double.MAX_VALUE, + Double.POSITIVE_INFINITY, + Double.NaN + }; + + double NaN = Double.NaN; + for(double x: testData) { + for(double y: testData) { + boolean testPass = false; + double expected=NaN; + double actual; + + // First, switch on y + if( Double.isNaN(y)) { + expected = NaN; + } else if (y == 0.0) { + expected = 1.0; + } else if (Double.isInfinite(y) ) { + if(y > 0) { // x ^ (+oo) + if (Math.abs(x) > 1.0) { + expected = Double.POSITIVE_INFINITY; + } else if (Math.abs(x) == 1.0) { + expected = NaN; + } else if (Math.abs(x) < 1.0) { + expected = +0.0; + } else { // x is NaN + assert Double.isNaN(x); + expected = NaN; + } + } else { // x ^ (-oo) + if (Math.abs(x) > 1.0) { + expected = +0.0; + } else if (Math.abs(x) == 1.0) { + expected = NaN; + } else if (Math.abs(x) < 1.0) { + expected = Double.POSITIVE_INFINITY; + } else { // x is NaN + assert Double.isNaN(x); + expected = NaN; + } + } /* end Double.isInfinite(y) */ + } else if (y == 1.0) { + expected = x; + } else if (Double.isNaN(x)) { // Now start switching on x + assert y != 0.0; + expected = NaN; + } else if (x == Double.NEGATIVE_INFINITY) { + expected = (y < 0.0) ? f2(y) :f1(y); + } else if (x == Double.POSITIVE_INFINITY) { + expected = (y < 0.0) ? +0.0 : Double.POSITIVE_INFINITY; + } else if (equivalent(x, +0.0)) { + assert y != 0.0; + expected = (y < 0.0) ? Double.POSITIVE_INFINITY: +0.0; + } else if (equivalent(x, -0.0)) { + assert y != 0.0; + expected = (y < 0.0) ? f1(y): f2(y); + } else if( x < 0.0) { + assert y != 0.0; + failures += testStrictPowCase(x, y, f3(x, y)); + failures += testNonstrictPowCase(x, y, f3ns(x, y)); + continue; + } else { + // go to next iteration + expected = NaN; + continue; + } + + failures += testPowCase(x, y, expected); + } // y + } // x + return failures; + } + + static boolean equivalent(double a, double b) { + return Double.compare(a, b) == 0; + } + + static double f1(double y) { + return (intClassify(y) == 1)? + Double.NEGATIVE_INFINITY: + Double.POSITIVE_INFINITY; + } + + + static double f2(double y) { + return (intClassify(y) == 1)?-0.0:0.0; + } + + static double f3(double x, double y) { + switch( intClassify(y) ) { + case 0: + return StrictMath.pow(Math.abs(x), y); + // break; + + case 1: + return -StrictMath.pow(Math.abs(x), y); + // break; + + case -1: + return Double.NaN; + // break; + + default: + throw new AssertionError("Bad classification."); + // break; + } + } + + static double f3ns(double x, double y) { + switch( intClassify(y) ) { + case 0: + return Math.pow(Math.abs(x), y); + // break; + + case 1: + return -Math.pow(Math.abs(x), y); + // break; + + case -1: + return Double.NaN; + // break; + + default: + throw new AssertionError("Bad classification."); + // break; + } + } + + static boolean isFinite(double a) { + return (0.0*a == 0); + } + + /** + * Return classification of argument: -1 for non-integers, 0 for + * even integers, 1 for odd integers. + */ + static int intClassify(double a) { + if(!isFinite(a) || // NaNs and infinities + (a != Math.floor(a) )) { // only integers are fixed-points of floor + return -1; + } + else { + // Determine if argument is an odd or even integer. + + a = StrictMath.abs(a); // absolute value doesn't affect odd/even + + if(a+1.0 == a) { // a > maximum odd floating-point integer + return 0; // Large integers are all even + } + else { // Convert double -> long and look at low-order bit + long ell = (long) a; + return ((ell & 0x1L) == (long)1)?1:0; + } + } + } + + public static void main(String [] argv) { + int failures = 0; + + failures += testPow(); + failures += testCrossProduct(); + + if (failures > 0) { + System.err.println("Testing pow incurred " + + failures + " failures."); + throw new RuntimeException(); + } + } +} diff --git a/jdk/test/java/lang/Math/Rint.java b/jdk/test/java/lang/Math/Rint.java new file mode 100644 index 00000000000..d8e35cd1343 --- /dev/null +++ b/jdk/test/java/lang/Math/Rint.java @@ -0,0 +1,122 @@ +/* + * Copyright 1998-2003 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4101566 4831589 + * @summary Check for correct implementation of Math.rint(double) + * + */ + +import sun.misc.FpUtils; +import sun.misc.DoubleConsts; + +public class Rint { + + static int testRintCase(double input, double expected) { + int failures = 0; + double result; + failures += Tests.test("Math.rint", input, Math.rint(input), expected); + failures += Tests.test("Math.rint", -input, Math.rint(-input), -expected); + failures += Tests.test("StrictMath.rint", + input, StrictMath.rint(input), expected); + failures += Tests.test("StrictMath.rint", -input, + StrictMath.rint(-input), -expected); + return failures; + } + + + public static void main(String args[]) { + int failures = 0; + double twoToThe52 = FpUtils.scalb(1.0, 52); // 2^52 + + double [][] testCases = { + {0.0, 0.0}, + {Double.MIN_VALUE, 0.0}, + {FpUtils.nextDown(DoubleConsts.MIN_NORMAL), 0.0}, + {DoubleConsts.MIN_NORMAL, 0.0}, + + {0.2, 0.0}, + + {FpUtils.nextDown(0.5), 0.0}, + { 0.5, 0.0}, + { FpUtils.nextUp(0.5), 1.0}, + + {0.7, 1.0}, + {FpUtils.nextDown(1.0), 1.0}, + { 1.0, 1.0}, + { FpUtils.nextUp(1.0), 1.0}, + + {FpUtils.nextDown(1.5), 1.0}, + { 1.5, 2.0}, + { FpUtils.nextUp(1.5), 2.0}, + + {4.2, 4.0}, + {4.5, 4.0}, + {4.7, 5.0}, + + {7.5, 8.0}, + {7.2, 7.0}, + {7.7, 8.0}, + + {150000.75, 150001.0}, + {300000.5, 300000.0}, + {FpUtils.nextUp(300000.5), 300001.0}, + {FpUtils.nextDown(300000.75), 300001.0}, + {300000.75, 300001.0}, + {FpUtils.nextUp(300000.75), 300001.0}, + {300000.99, 300001.0}, + {262144.75, 262145.0}, //(2^18 ) + 0.75 + {499998.75, 499999.0}, + {524287.75, 524288.0}, //(2^19 -1) + 0.75 + {524288.75, 524289.0}, + + {FpUtils.nextDown(twoToThe52), twoToThe52}, + {twoToThe52, twoToThe52}, + {FpUtils.nextUp(twoToThe52), FpUtils.nextUp(twoToThe52)}, + + {Double.MAX_VALUE, Double.MAX_VALUE}, + {Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY}, + {Double.NaN, Double.NaN} + + }; + + + for(int i = 0; i < testCases.length; i++) { + failures += testRintCase(testCases[i][0], testCases[i][1]); + } + + // Test values throughout exponent range + for(double d = Double.MIN_VALUE; + d < Double.POSITIVE_INFINITY; d *= 2) { + failures += testRintCase(d, ((d<=0.5)?0.0:d)); + } + + if (failures > 0) { + System.err.println("Testing {Math, StrictMath}.rint incurred " + + failures + " failures."); + throw new RuntimeException(); + } + } + +} diff --git a/jdk/test/java/lang/Math/TanTests.java b/jdk/test/java/lang/Math/TanTests.java new file mode 100644 index 00000000000..f603fb872a0 --- /dev/null +++ b/jdk/test/java/lang/Math/TanTests.java @@ -0,0 +1,189 @@ +/* + * Copyright 2004 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 5033578 + * @summary Tests for {Math, StrictMath}.tan + * @compile -source 1.5 TanTests.java + * @run main TanTests + * @author Joseph D. Darcy + */ + +public class TanTests { + private TanTests(){} + + static int testTanCase(double input, double expected, double ulps) { + int failures = 0; + failures += Tests.testUlpDiff("StrictMath.tan(double, double)", input, + StrictMath.tan(input), expected, ulps); + failures += Tests.testUlpDiff("Math.tan(double, double)", input, + Math.tan(input), expected, ulps); + return failures; + } + + static int testTan() { + int failures = 0; + + double [][] testCases = { + // 1.1 ulp case from Gonnet + {0x1.31b97c4000001p24, -0x1.d08538b656222p34, 1.9}, + // Remaining test cases adapted from work by Alex Liu + {0x1.be1b2d17ba207p6, -0x1.cf489c89f8066p49, 1.100000}, + {0x1.e0a9e6ab97de7p7, 0x1.d31ce95f57459p50, 1.100000}, + {0x1.23f8c5bcf003ep11, 0x1.f022585dbb50ap50, 1.100000}, + {0x1.44bdb557e1dc1p20, 0x1.b67eaf362701fp49, 1.100000}, + {0x1.604759040fb6fp68, 0x1.d574bc1f9e903p50, 1.100000}, + {0x1.3d33fa4e5ba47p70, 0x1.ce1dd6e33fef8p49, 1.100000}, + {0x1.f19e5d71b26bap85, 0x1.c2536a9119dd2p55, 1.100000}, + {0x1.43ed062d2d62cp88, -0x1.c94b0c5b7b05p49, 1.100000}, + {0x1.b7b895b030bep88, -0x1.cba9ebb0f20b9p51, 1.100000}, + {0x1.a86090fe7c144p95, 0x1.d5ad72ca48bbfp48, 1.100000}, + {0x1.d199df0700a61p95, -0x1.b8dd636f8dba7p49, 1.100000}, + {0x1.d713037d1d222p106, -0x1.d57f035fd0146p48, 1.100000}, + {0x1.ed1f6b066569bp115, 0x1.840af46cc9bep48, 1.100000}, + {0x1.16800a51eff75p118, 0x1.c9f91caf08a6ap49, 1.100000}, + {0x1.c1169c1040ecdp134, 0x1.e44a7eb56cb7p48, 1.100000}, + {0x1.19b0fb40dddd5p145, -0x1.f1b1c235774b2p48, 1.100000}, + {0x1.4d6b47f2480f8p162, 0x1.da1c2010795a5p51, 1.100000}, + {0x1.682ff8e5429ddp163, -0x1.95a7aee1e93bep55, 1.100000}, + {0x1.d0569fad9657dp204, -0x1.8f2ca17123aa5p49, 1.100000}, + {0x1.55505de5bbc14p206, -0x1.e8d28e39ddf9p50, 1.100000}, + {0x1.cf497083e6c77p206, -0x1.fd3fbaa40de18p49, 1.100000}, + {0x1.c5b30c8686203p214, 0x1.f4d14469638a9p48, 1.100000}, + {0x1.60d15b12ff0b7p217, 0x1.bc150932bd3d7p48, 1.100000}, + {0x1.07cc6858d980bp218, -0x1.f3f7355c983a5p51, 1.100000}, + {0x1.e06a67cd86969p218, 0x1.b0873124d98afp51, 1.100000}, + {0x1.49704174c38e3p229, 0x1.e0301142ccbc2p49, 1.100000}, + {0x1.ea19ceab3b06ap230, -0x1.fc22e687f0482p48, 1.100000}, + {0x1.0c905503fea72p236, -0x1.7d4e9a45014d5p49, 1.100000}, + {0x1.28eb1f8ddd7c3p257, -0x1.a951893680c71p49, 1.100000}, + {0x1.310b11af2bfbep260, 0x1.84d458039c2e6p48, 1.100000}, + {0x1.f3c172bb7afc2p265, -0x1.fb3139d3ba04fp49, 1.100000}, + {0x1.54a28326cfedep267, 0x1.f416de8fb60bap53, 1.100000}, + {0x1.5a5154d9d609dp269, -0x1.83d74cea8141p51, 1.100000}, + {0x1.3ee75fd803b21p275, 0x1.b9ab67b61bf65p50, 1.100000}, + {0x1.f4a4c781834d9p277, -0x1.d639ec63bf3b6p49, 1.100000}, + {0x1.2053d5c14cf78p279, 0x1.fc31413372cdcp50, 1.100000}, + {0x1.896d0a9acee4cp298, 0x1.f9136d6e27a5cp48, 1.100000}, + {0x1.f010da08a862p302, -0x1.fd812c5e13483p49, 1.100000}, + {0x1.65f2e272f729fp308, -0x1.f9f642ddaa32dp49, 1.100000}, + {0x1.a8afbc4edb07dp309, 0x1.fa0d458320902p52, 1.100000}, + {0x1.4d311a5447cdep329, -0x1.f7e98fe193e81p49, 1.100000}, + {0x1.808f66338b21bp345, -0x1.bceaf45f61155p49, 1.100000}, + {0x1.5a34aacf5ded1p350, 0x1.d41f0f13fadd4p49, 1.100000}, + {0x1.3e8b85532bad1p354, -0x1.f0b21179d663ep49, 1.100000}, + {0x1.1c2ecf01570acp394, -0x1.c215c9e2b7b24p49, 1.100000}, + {0x1.666eba99d2837p402, 0x1.fbd5c4b527506p48, 1.100000}, + {0x1.6cc39f07fafbbp460, -0x1.f087548a00e7cp49, 1.100000}, + {0x1.9481228fea3ffp463, -0x1.c585e64ff44c8p48, 1.100000}, + {0x1.79c3af0b4d0d4p466, 0x1.c9ed3716691f2p51, 1.100000}, + {0x1.993ea84c3e23bp468, 0x1.a6b3954fc37f3p49, 1.100000}, + {0x1.cfd6b13f64408p470, -0x1.f4db7cc2c09bp47, 1.100000}, + {0x1.b820ccdd52299p473, 0x1.77a1ff863b0f3p52, 1.100000}, + {0x1.157ef3a1528a5p475, -0x1.f4e14ddc45e49p51, 1.100000}, + {0x1.b492a8997bc36p478, -0x1.e0db26b7f03e8p48, 1.100000}, + {0x1.e0ea5674b831bp480, 0x1.e0ad6b3cdccdfp48, 1.100000}, + {0x1.c62ac8b32cb9ep497, 0x1.c95d00a36f677p48, 1.100000}, + {0x1.467f1daf12b43p498, 0x1.c6d3fdc096f0bp50, 1.100000}, + {0x1.336e5a83e390cp502, 0x1.fc873dae28572p48, 1.100000}, + {0x1.aaab1de0d6727p506, -0x1.e0482967d0354p49, 1.100000}, + {0x1.e5ce06a12139cp507, 0x1.cea42e29735bdp49, 1.100000}, + {0x1.87dad74d0dda8p516, -0x1.b2cde6c0a8b9fp48, 1.100000}, + {0x1.e4feb94ee0989p524, -0x1.b227d0d0ffaa8p49, 1.100000}, + {0x1.31c082b1361ebp525, 0x1.a7ed49158d736p49, 1.100000}, + {0x1.56913865b3e16p531, 0x1.eeb7a32591c3bp52, 1.100000}, + {0x1.36ade1fa883cap544, -0x1.fa087aadc0cbp48, 1.100000}, + {0x1.de57314df4af8p559, 0x1.c686aa5a41075p49, 1.100000}, + {0x1.0bb29bf7960ddp586, -0x1.d29ae1a3023cep50, 1.100000}, + {0x1.049a584685941p588, -0x1.eebfb159dba67p51, 1.100000}, + {0x1.33c1d4257b294p589, 0x1.ea1eedabea109p48, 1.100000}, + {0x1.3587e511bf47bp590, 0x1.c897858ce0ca9p48, 1.100000}, + {0x1.d12ee010c0facp590, 0x1.ab5b4b5065aa3p48, 1.100000}, + {0x1.87bbed5af48d9p605, 0x1.f512c3b2be7cap50, 1.100000}, + {0x1.a0b1131240cebp605, -0x1.fa373983fd571p48, 1.100000}, + {0x1.116fdda1a04c9p616, -0x1.d76fdbc8552f3p51, 1.100000}, + {0x1.67ebae833a034p620, 0x1.e1313af0a4075p50, 1.100000}, + {0x1.9a50fbc5b0fecp627, 0x1.d89150884fbf7p50, 1.100000}, + {0x1.6d625e0757e9cp631, -0x1.d0a5ecf002555p49, 1.100000}, + {0x1.e880344cc9913p636, -0x1.fafd04caaf58bp48, 1.100000}, + {0x1.e0a180b843cc5p650, 0x1.ea2aea3b8c953p49, 1.100000}, + {0x1.fa91ce15157b2p652, 0x1.e6f5f4d47d83fp48, 1.100000}, + {0x1.7696347caf8dfp654, 0x1.e0d36f2aef7dap51, 1.100000}, + {0x1.886484b536161p666, -0x1.e3c96481e335bp51, 1.100000}, + {0x1.0aa3ff2b41abdp675, -0x1.b3300ee04b4c8p50, 1.100000}, + {0x1.d695ac08fe897p675, -0x1.c27fd21ecb13p51, 1.100000}, + {0x1.4c1e532d7a99ap680, 0x1.e2ec695260c39p49, 1.100000}, + {0x1.44a9f3e395802p685, -0x1.e7273ab9ce8e2p52, 1.100000}, + {0x1.3a25ec2b43d45p697, -0x1.d23187ba6321ep49, 1.100000}, + {0x1.96f5c2420c3fdp716, -0x1.ea06ab71ad719p49, 1.100000}, + {0x1.926c063a9406bp741, 0x1.e3d3d9262fd66p48, 1.100000}, + {0x1.1a57713d6fd93p754, -0x1.c10074d49490dp48, 1.100000}, + {0x1.739387922e672p772, 0x1.bda527e215a3cp49, 1.100000}, + {0x1.d286eff17f4d4p793, 0x1.d01c678ebfa1p49, 1.100000}, + {0x1.f3d777206a062p794, -0x1.d8604b6d18385p49, 1.100000}, + {0x1.ae91e6574da91p826, -0x1.fd1b26ab656c2p49, 1.100000}, + {0x1.4422b3c871c9p836, 0x1.9d2cab1f3aebcp48, 1.100000}, + {0x1.7ff8537071e1p840, 0x1.badde451c6ed7p48, 1.100000}, + {0x1.c6fe9202e219dp845, -0x1.b2aa20745de3p51, 1.100000}, + {0x1.a95a0b4015d88p846, 0x1.cdf5dfd045657p50, 1.100000}, + {0x1.f823b9cff0daep867, 0x1.fd72fce3d5505p48, 1.100000}, + {0x1.a6bee2afcd2fp886, 0x1.fe06265cd3aebp49, 1.100000}, + {0x1.7b034b3412d17p892, 0x1.e48055812d391p50, 1.100000}, + {0x1.58588f8cda276p894, 0x1.f806fddf0dd05p53, 1.100000}, + {0x1.ce750a7963463p896, 0x1.e94f1f4018402p48, 1.100000}, + {0x1.3d50a91fe82cfp897, 0x1.cd518fda10e95p48, 1.100000}, + {0x1.f82dea1c0b809p897, -0x1.d6a0ef08179c5p48, 1.100000}, + {0x1.38673e8c6a4afp903, 0x1.f4113a036478p48, 1.100000}, + {0x1.dfb75e4a7432p911, 0x1.eb7bc6cb4d7f3p48, 1.100000}, + {0x1.1230b975a72b3p916, -0x1.e1042be0759f9p48, 1.100000}, + {0x1.302c2f5a4e6e5p916, 0x1.f66a9874cd60ap48, 1.100000}, + {0x1.04e07a1d67b93p921, 0x1.87735139f6a0bp53, 1.100000}, + {0x1.5a3eb79cd06fap931, -0x1.e00930c219ef3p51, 1.100000}, + {0x1.8fb45679936fp937, 0x1.9a427588645c4p50, 1.100000}, + {0x1.c4abb225260c6p964, -0x1.d1e64e91ac6ap50, 1.100000}, + {0x1.b43e449b25382p982, -0x1.f1848cc5ac4fep50, 1.100000}, + {0x1.504d9d7179b1ap983, 0x1.a4e51ea807786p48, 1.100000}, + {0x1.83a5af80fb39bp987, 0x1.a6dde6c2220ebp48, 1.100000}, + {0x1.5d978d9ad84c8p1011, 0x1.ec96900bfd1ddp51, 1.100000}, + }; + + for(double[] testCase: testCases) { + failures += testTanCase(testCase[0], testCase[1], testCase[2]); + } + + return failures; + } + + public static void main(String [] argv) { + int failures = 0; + + failures += testTan(); + + if (failures > 0) { + System.err.println("Testing tan incurred " + + failures + " failures."); + throw new RuntimeException(); + } + } +} diff --git a/jdk/test/java/lang/Math/Tests.java b/jdk/test/java/lang/Math/Tests.java new file mode 100644 index 00000000000..f5f1edfbdd6 --- /dev/null +++ b/jdk/test/java/lang/Math/Tests.java @@ -0,0 +1,341 @@ +/* + * Copyright 2003 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * Shared static test methods for numerical tests. Sharing these + * helper test methods avoids repeated functions in the various test + * programs. The test methods return 1 for a test failure and 0 for + * success. The order of arguments to the test methods is generally + * the test name, followed by the test arguments, the computed result, + * and finally the expected result. + */ + +import sun.misc.FpUtils; + +public class Tests { + private Tests(){}; // do not instantiate + + private static String toHexString(float f) { + if (!Float.isNaN(f)) + return Float.toHexString(f); + else + return "NaN(0x" + Integer.toHexString(Float.floatToRawIntBits(f)) + ")"; + } + + private static String toHexString(double d) { + if (!Double.isNaN(d)) + return Double.toHexString(d); + else + return "NaN(0x" + Long.toHexString(Double.doubleToRawLongBits(d)) + ")"; + } + + public static int test(String testName, float input, + boolean result, boolean expected) { + if (expected != result) { + System.err.println("Failure for " + testName + ":\n" + + "\tFor input " + input + "\t(" + toHexString(input) + ")\n" + + "\texpected " + expected + "\n" + + "\tgot " + result + ")."); + return 1; + } + else + return 0; + } + + public static int test(String testName, double input, + boolean result, boolean expected) { + if (expected != result) { + System.err.println("Failure for " + testName + ":\n" + + "\tFor input " + input + "\t(" + toHexString(input) + ")\n" + + "\texpected " + expected + "\n" + + "\tgot " + result + ")."); + return 1; + } + else + return 0; + } + + public static int test(String testName, float input1, float input2, + boolean result, boolean expected) { + if (expected != result) { + System.err.println("Failure for " + testName + ":\n" + + "\tFor inputs " + input1 + "\t(" + toHexString(input1) + ") and " + + input2 + "\t(" + toHexString(input2) + ")\n" + + "\texpected " + expected + "\n" + + "\tgot " + result + ")."); + return 1; + } + return 0; + } + + public static int test(String testName, double input1, double input2, + boolean result, boolean expected) { + if (expected != result) { + System.err.println("Failure for " + testName + ":\n" + + "\tFor inputs " + input1 + "\t(" + toHexString(input1) + ") and " + + input2 + "\t(" + toHexString(input2) + ")\n" + + "\texpected " + expected + "\n" + + "\tgot " + result + ")."); + return 1; + } + return 0; + } + + public static int test(String testName, float input, + int result, int expected) { + if (expected != result) { + System.err.println("Failure for " + testName + ":\n" + + "\tFor input " + input + "\t(" + toHexString(input) + ")\n" + + "\texpected " + expected + "\n" + + "\tgot " + result + ")."); + return 1; + } + return 0; + } + + public static int test(String testName, double input, + int result, int expected) { + if (expected != result) { + System.err.println("Failure for " + testName + ":\n" + + "\tFor input " + input + "\t(" + toHexString(input) + ")\n" + + "\texpected " + expected + "\n" + + "\tgot " + result + ")."); + return 1; + } + else + return 0; + } + + public static int test(String testName, float input, + float result, float expected) { + if (Float.compare(expected, result) != 0 ) { + System.err.println("Failure for " + testName + ":\n" + + "\tFor input " + input + "\t(" + toHexString(input) + ")\n" + + "\texpected " + expected + "\t(" + toHexString(expected) + ")\n" + + "\tgot " + result + "\t(" + toHexString(result) + ")."); + return 1; + } + else + return 0; + } + + + public static int test(String testName, double input, + double result, double expected) { + if (Double.compare(expected, result ) != 0) { + System.err.println("Failure for " + testName + ":\n" + + "\tFor input " + input + "\t(" + toHexString(input) + ")\n" + + "\texpected " + expected + "\t(" + toHexString(expected) + ")\n" + + "\tgot " + result + "\t(" + toHexString(result) + ")."); + return 1; + } + else + return 0; + } + + public static int test(String testName, + float input1, double input2, + float result, float expected) { + if (Float.compare(expected, result ) != 0) { + System.err.println("Failure for " + testName + ":\n" + + "\tFor inputs " + input1 + "\t(" + toHexString(input1) + ") and " + + input2 + "\t(" + toHexString(input2) + ")\n" + + "\texpected " + expected + "\t(" + toHexString(expected) + ")\n" + + "\tgot " + result + "\t(" + toHexString(result) + ")."); + return 1; + } + else + return 0; + } + + public static int test(String testName, + double input1, double input2, + double result, double expected) { + if (Double.compare(expected, result ) != 0) { + System.err.println("Failure for " + testName + ":\n" + + "\tFor inputs " + input1 + "\t(" + toHexString(input1) + ") and " + + input2 + "\t(" + toHexString(input2) + ")\n" + + "\texpected " + expected + "\t(" + toHexString(expected) + ")\n" + + "\tgot " + result + "\t(" + toHexString(result) + ")."); + return 1; + } + else + return 0; + } + + public static int test(String testName, + float input1, int input2, + float result, float expected) { + if (Float.compare(expected, result ) != 0) { + System.err.println("Failure for " + testName + ":\n" + + "\tFor inputs " + input1 + "\t(" + toHexString(input1) + ") and " + + input2 + "\n" + + "\texpected " + expected + "\t(" + toHexString(expected) + ")\n" + + "\tgot " + result + "\t(" + toHexString(result) + ")."); + return 1; + } + else + return 0; + } + + public static int test(String testName, + double input1, int input2, + double result, double expected) { + if (Double.compare(expected, result ) != 0) { + System.err.println("Failure for " + testName + ":\n" + + "\tFor inputs " + input1 + "\t(" + toHexString(input1) + ") and " + + input2 + "\n" + + "\texpected " + expected + "\t(" + toHexString(expected) + ")\n" + + "\tgot " + result + "\t(" + toHexString(result) + ")."); + return 1; + } + else + return 0; + } + + static int testUlpCore(double result, double expected, double ulps) { + // We assume we won't be unlucky and have an inexact expected + // be nextDown(2^i) when 2^i would be the correctly rounded + // answer. This would cause the ulp size to be half as large + // as it should be, doubling the measured error). + + if (Double.compare(expected, result) == 0) { + return 0; // result and expected are equivalent + } else { + if( ulps == 0.0) { + // Equivalent results required but not found + return 1; + } else { + double difference = expected - result; + if (FpUtils.isUnordered(expected, result) || + Double.isNaN(difference) || + // fail if greater than or unordered + !(Math.abs( difference/Math.ulp(expected) ) <= Math.abs(ulps)) ) { + return 1; + } + else + return 0; + } + } + } + + // One input argument. + public static int testUlpDiff(String testName, double input, + double result, double expected, double ulps) { + int code = testUlpCore(result, expected, ulps); + if (code == 1) { + System.err.println("Failure for " + testName + ":\n" + + "\tFor input " + input + "\t(" + toHexString(input) + ")\n" + + "\texpected " + expected + "\t(" + toHexString(expected) + ")\n" + + "\tgot " + result + "\t(" + toHexString(result) + ");\n" + + "\tdifference greater than ulp tolerance " + ulps); + } + return code; + } + + // Two input arguments. + public static int testUlpDiff(String testName, double input1, double input2, + double result, double expected, double ulps) { + int code = testUlpCore(result, expected, ulps); + if (code == 1) { + System.err.println("Failure for " + testName + ":\n" + + "\tFor inputs " + input1 + "\t(" + toHexString(input1) + ") and " + + input2 + "\t(" + toHexString(input2) + ")\n" + + "\texpected " + expected + "\t(" + toHexString(expected) + ")\n" + + "\tgot " + result + "\t(" + toHexString(result) + ");\n" + + "\tdifference greater than ulp tolerance " + ulps); + } + return code; + } + + // For a successful test, the result must be within the ulp bound of + // expected AND the result must have absolute value less than or + // equal to absBound. + public static int testUlpDiffWithAbsBound(String testName, double input, + double result, double expected, + double ulps, double absBound) { + int code = 0; // return code value + + if (!(StrictMath.abs(result) <= StrictMath.abs(absBound)) && + !Double.isNaN(expected)) { + code = 1; + } else + code = testUlpCore(result, expected, ulps); + + if (code == 1) { + System.err.println("Failure for " + testName + ":\n" + + "\tFor input " + input + "\t(" + toHexString(input) + ")\n" + + "\texpected " + expected + "\t(" + toHexString(expected) + ")\n" + + "\tgot " + result + "\t(" + toHexString(result) + ");\n" + + "\tdifference greater than ulp tolerance " + ulps + + " or the result has larger magnitude than " + absBound); + } + return code; + } + + // For a successful test, the result must be within the ulp bound of + // expected AND the result must have absolute value greater than + // or equal to the lowerBound. + public static int testUlpDiffWithLowerBound(String testName, double input, + double result, double expected, + double ulps, double lowerBound) { + int code = 0; // return code value + + if (!(result >= lowerBound) && !Double.isNaN(expected)) { + code = 1; + } else + code = testUlpCore(result, expected, ulps); + + if (code == 1) { + System.err.println("Failure for " + testName + + ":\n" + + "\tFor input " + input + "\t(" + toHexString(input) + ")" + + "\n\texpected " + expected + "\t(" + toHexString(expected) + ")" + + "\n\tgot " + result + "\t(" + toHexString(result) + ");" + + "\ndifference greater than ulp tolerance " + ulps + + " or result not greater than or equal to the bound " + lowerBound); + } + return code; + } + + public static int testTolerance(String testName, double input, + double result, double expected, double tolerance) { + if (Double.compare(expected, result ) != 0) { + double difference = expected - result; + if (FpUtils.isUnordered(expected, result) || + Double.isNaN(difference) || + // fail if greater than or unordered + !(Math.abs((difference)/expected) <= StrictMath.pow(10, -tolerance)) ) { + System.err.println("Failure for " + testName + ":\n" + + "\tFor input " + input + "\t(" + toHexString(input) + ")\n" + + "\texpected " + expected + "\t(" + toHexString(expected) + ")\n" + + "\tgot " + result + "\t(" + toHexString(result) + ");\n" + + "\tdifference greater than tolerance 10^-" + tolerance); + return 1; + } + return 0; + } + else + return 0; + } +} diff --git a/jdk/test/java/lang/Short/ByteSwap.java b/jdk/test/java/lang/Short/ByteSwap.java new file mode 100644 index 00000000000..da249146159 --- /dev/null +++ b/jdk/test/java/lang/Short/ByteSwap.java @@ -0,0 +1,39 @@ +/* + * Copyright 2003 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4495754 + * @summary Basic test for int byte swap code on short and char + * @author Josh Bloch + */ + +public class ByteSwap { + public static void main(String args[]) { + if (Short.reverseBytes((short)0xaabb) != (short)0xbbaa) + throw new RuntimeException("short"); + + if (Character.reverseBytes((char)0xaabb) != (char)0xbbaa) + throw new RuntimeException("char"); + } +} diff --git a/jdk/test/java/lang/Short/Decode.java b/jdk/test/java/lang/Short/Decode.java new file mode 100644 index 00000000000..0a54036357d --- /dev/null +++ b/jdk/test/java/lang/Short/Decode.java @@ -0,0 +1,98 @@ +/* + * Copyright 1998-2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4136371 5017980 6576055 + * @summary Test Short.decode method + * @author madbot + * @author Joseph D. Darcy + */ + +/** + * There are six methods in java.lang.Short which transform strings + * into a short or Short value: + * + * public Short(String s) + * public static Short decode(String nm) + * public static short parseShort(String s, int radix) + * public static short parseShort(String s) + * public static Short valueOf(String s, int radix) + * public static Short valueOf(String s) + * + * However, of these only decode has a nontrivial implementation + * in that class. + */ +public class Decode { + + private static void check(String ashort, short expected) { + short sh = (Short.decode(ashort)).shortValue(); + if (sh != expected) + throw new RuntimeException("Short.decode failed. String:" + + ashort + " Result:" + sh); + } + + private static void checkFailure(String val, String message) { + try { + short n = (Short.decode(val)).shortValue(); + throw new RuntimeException(message); + } catch (NumberFormatException e) { /* Okay */} + } + + public static void main(String[] args) throws Exception { + check(new String(""+Short.MIN_VALUE), Short.MIN_VALUE); + check(new String(""+Short.MAX_VALUE), Short.MAX_VALUE); + + check("10", (short)10); + check("0x10", (short)16); + check("0X10", (short)16); + check("010", (short)8); + check("#10", (short)16); + + check("+10", (short)10); + check("+0x10", (short)16); + check("+0X10", (short)16); + check("+010", (short)8); + check("+#10", (short)16); + + check("-10", (short)-10); + check("-0x10", (short)-16); + check("-0X10", (short)-16); + check("-010", (short)-8); + check("-#10", (short)-16); + + check(Integer.toString((int)Short.MIN_VALUE), Short.MIN_VALUE); + check(Integer.toString((int)Short.MAX_VALUE), Short.MAX_VALUE); + + checkFailure("0x-10", "Short.decode allows negative sign in wrong position."); + checkFailure("0x+10", "Short.decode allows positive sign in wrong position."); + + checkFailure("+", "Raw plus sign allowed."); + checkFailure("-", "Raw minus sign allowed."); + + checkFailure(Integer.toString((int)Short.MIN_VALUE - 1), "Out of range"); + checkFailure(Integer.toString((int)Short.MAX_VALUE + 1), "Out of range"); + + checkFailure("", "Empty String"); + } +} diff --git a/jdk/test/java/lang/StrictMath/CubeRootTests.java b/jdk/test/java/lang/StrictMath/CubeRootTests.java new file mode 100644 index 00000000000..a7eef55c5e3 --- /dev/null +++ b/jdk/test/java/lang/StrictMath/CubeRootTests.java @@ -0,0 +1,473 @@ +/* + * Copyright 2003-2004 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4347132 + * @summary Tests specifically for StrictMath.cbrt + * @author Joseph D. Darcy + */ + +/** + * The tests in ../Math/CubeRootTests.java test properties that should + * hold for any cube root implementation, including the FDLIBM-based + * one required for StrictMath.cbrt. Therefore, the test cases in + * ../Math/CubeRootTests.java are run against both the Math and + * StrictMath versions of cube root. The role of this test is to + * verify that the FDLIBM cbrt algorithm is being used by running + * golden file tests on values that may vary from one conforming cube + * root implementation to another. + */ + +public class CubeRootTests { + private CubeRootTests(){} + + static int testCubeRootCase(double input, double expected) { + int failures=0; + + double minus_input = -input; + double minus_expected = -expected; + + failures+=Tests.test("StrictMath.cbrt(double)", input, + StrictMath.cbrt(input), expected); + failures+=Tests.test("StrictMath.cbrt(double)", minus_input, + StrictMath.cbrt(minus_input), minus_expected); + return failures; + } + + static int testCubeRoot() { + int failures = 0; + double [][] testCases = { + {0x1.ffffffffffffep-766, 0x1.fffffffffffffp-256}, + {0x1.ffffffffffffep-763, 0x1.fffffffffffffp-255}, + {0x1.ffffffffffffep-760, 0x1.fffffffffffffp-254}, + {0x1.ffffffffffffep-757, 0x1.fffffffffffffp-253}, + {0x1.ffffffffffffep-754, 0x1.fffffffffffffp-252}, + {0x1.ffffffffffffep-751, 0x1.fffffffffffffp-251}, + {0x1.ffffffffffffep-748, 0x1.fffffffffffffp-250}, + {0x1.ffffffffffffep-745, 0x1.fffffffffffffp-249}, + {0x1.ffffffffffffep-742, 0x1.fffffffffffffp-248}, + {0x1.ffffffffffffep-739, 0x1.fffffffffffffp-247}, + {0x1.ffffffffffffep-1006, 0x1.fffffffffffffp-336}, + {0x1.ffffffffffffep-736, 0x1.fffffffffffffp-246}, + {0x1.ffffffffffffep-733, 0x1.fffffffffffffp-245}, + {0x1.ffffffffffffep-730, 0x1.fffffffffffffp-244}, + {0x1.ffffffffffffep-727, 0x1.fffffffffffffp-243}, + {0x1.ffffffffffffep-724, 0x1.fffffffffffffp-242}, + {0x1.ffffffffffffep-721, 0x1.fffffffffffffp-241}, + {0x1.ffffffffffffep-718, 0x1.fffffffffffffp-240}, + {0x1.ffffffffffffep-715, 0x1.fffffffffffffp-239}, + {0x1.ffffffffffffep-712, 0x1.fffffffffffffp-238}, + {0x1.ffffffffffffep-709, 0x1.fffffffffffffp-237}, + {0x1.ffffffffffffep-706, 0x1.fffffffffffffp-236}, + {0x1.ffffffffffffep-703, 0x1.fffffffffffffp-235}, + {0x1.ffffffffffffep-700, 0x1.fffffffffffffp-234}, + {0x1.ffffffffffffep-697, 0x1.fffffffffffffp-233}, + {0x1.ffffffffffffep-694, 0x1.fffffffffffffp-232}, + {0x1.ffffffffffffep-691, 0x1.fffffffffffffp-231}, + {0x1.ffffffffffffep-1003, 0x1.fffffffffffffp-335}, + {0x1.ffffffffffffep-688, 0x1.fffffffffffffp-230}, + {0x1.ffffffffffffep-685, 0x1.fffffffffffffp-229}, + {0x1.ffffffffffffep-682, 0x1.fffffffffffffp-228}, + {0x1.ffffffffffffep-679, 0x1.fffffffffffffp-227}, + {0x1.ffffffffffffep-676, 0x1.fffffffffffffp-226}, + {0x1.ffffffffffffep-673, 0x1.fffffffffffffp-225}, + {0x1.ffffffffffffep-670, 0x1.fffffffffffffp-224}, + {0x1.ffffffffffffep-667, 0x1.fffffffffffffp-223}, + {0x1.ffffffffffffep-664, 0x1.fffffffffffffp-222}, + {0x1.ffffffffffffep-661, 0x1.fffffffffffffp-221}, + {0x1.ffffffffffffep-658, 0x1.fffffffffffffp-220}, + {0x1.ffffffffffffep-655, 0x1.fffffffffffffp-219}, + {0x1.ffffffffffffep-652, 0x1.fffffffffffffp-218}, + {0x1.ffffffffffffep-649, 0x1.fffffffffffffp-217}, + {0x1.ffffffffffffep-646, 0x1.fffffffffffffp-216}, + {0x1.ffffffffffffep-643, 0x1.fffffffffffffp-215}, + {0x1.ffffffffffffep-1000, 0x1.fffffffffffffp-334}, + {0x1.ffffffffffffep-640, 0x1.fffffffffffffp-214}, + {0x1.ffffffffffffep-637, 0x1.fffffffffffffp-213}, + {0x1.ffffffffffffep-634, 0x1.fffffffffffffp-212}, + {0x1.ffffffffffffep-631, 0x1.fffffffffffffp-211}, + {0x1.ffffffffffffep-628, 0x1.fffffffffffffp-210}, + {0x1.ffffffffffffep-625, 0x1.fffffffffffffp-209}, + {0x1.ffffffffffffep-622, 0x1.fffffffffffffp-208}, + {0x1.ffffffffffffep-619, 0x1.fffffffffffffp-207}, + {0x1.ffffffffffffep-616, 0x1.fffffffffffffp-206}, + {0x1.ffffffffffffep-613, 0x1.fffffffffffffp-205}, + {0x1.ffffffffffffep-610, 0x1.fffffffffffffp-204}, + {0x1.ffffffffffffep-607, 0x1.fffffffffffffp-203}, + {0x1.ffffffffffffep-604, 0x1.fffffffffffffp-202}, + {0x1.ffffffffffffep-601, 0x1.fffffffffffffp-201}, + {0x1.ffffffffffffep-598, 0x1.fffffffffffffp-200}, + {0x1.ffffffffffffep-595, 0x1.fffffffffffffp-199}, + {0x1.ffffffffffffep-997, 0x1.fffffffffffffp-333}, + {0x1.ffffffffffffep-592, 0x1.fffffffffffffp-198}, + {0x1.ffffffffffffep-589, 0x1.fffffffffffffp-197}, + {0x1.ffffffffffffep-586, 0x1.fffffffffffffp-196}, + {0x1.ffffffffffffep-583, 0x1.fffffffffffffp-195}, + {0x1.ffffffffffffep-580, 0x1.fffffffffffffp-194}, + {0x1.ffffffffffffep-577, 0x1.fffffffffffffp-193}, + {0x1.ffffffffffffep-574, 0x1.fffffffffffffp-192}, + {0x1.ffffffffffffep-571, 0x1.fffffffffffffp-191}, + {0x1.ffffffffffffep-568, 0x1.fffffffffffffp-190}, + {0x1.ffffffffffffep-565, 0x1.fffffffffffffp-189}, + {0x1.ffffffffffffep-562, 0x1.fffffffffffffp-188}, + {0x1.ffffffffffffep-559, 0x1.fffffffffffffp-187}, + {0x1.ffffffffffffep-556, 0x1.fffffffffffffp-186}, + {0x1.ffffffffffffep-553, 0x1.fffffffffffffp-185}, + {0x1.ffffffffffffep-550, 0x1.fffffffffffffp-184}, + {0x1.ffffffffffffep-547, 0x1.fffffffffffffp-183}, + {0x1.ffffffffffffep-994, 0x1.fffffffffffffp-332}, + {0x1.ffffffffffffep-544, 0x1.fffffffffffffp-182}, + {0x1.ffffffffffffep-541, 0x1.fffffffffffffp-181}, + {0x1.ffffffffffffep-538, 0x1.fffffffffffffp-180}, + {0x1.ffffffffffffep-535, 0x1.fffffffffffffp-179}, + {0x1.ffffffffffffep-532, 0x1.fffffffffffffp-178}, + {0x1.ffffffffffffep-529, 0x1.fffffffffffffp-177}, + {0x0.00000000001fp-1022, 0x1.fa9c313858568p-356}, + {0x1.ffffffffffffep-526, 0x1.fffffffffffffp-176}, + {0x1.ffffffffffffep-523, 0x1.fffffffffffffp-175}, + {0x1.ffffffffffffep-520, 0x1.fffffffffffffp-174}, + {0x1.ffffffffffffep-517, 0x1.fffffffffffffp-173}, + {0x0.00000000001fdp-1022, 0x1.feff7f94ea34dp-356}, + {0x1.ffffffffffffep-514, 0x1.fffffffffffffp-172}, + {0x0.00000001fffe7p-1022, 0x1.ffff7aaa87f1bp-352}, + {0x0.00000001fffffp-1022, 0x1.fffffaaaaa9c7p-352}, + {0x0.00001ffffff4p-1022, 0x1.ffffffcp-348}, + {0x0.00001ffffffffp-1022, 0x1.ffffffffaaaabp-348}, + {0x0.01ffffffffffcp-1022, 0x1.ffffffffffeabp-344}, + {0x1.ffffffffffffep-511, 0x1.fffffffffffffp-171}, + {0x1.ffffffffffffep-508, 0x1.fffffffffffffp-170}, + {0x1.ffffffffffffep-505, 0x1.fffffffffffffp-169}, + {0x1.ffffffffffffep-502, 0x1.fffffffffffffp-168}, + {0x1.ffffffffffffep-499, 0x1.fffffffffffffp-167}, + {0x1.ffffffffffffep-991, 0x1.fffffffffffffp-331}, + {0x1.ffffffffffffep-496, 0x1.fffffffffffffp-166}, + {0x1.ffffffffffffep-493, 0x1.fffffffffffffp-165}, + {0x1.ffffffffffffep-490, 0x1.fffffffffffffp-164}, + {0x1.ffffffffffffep-487, 0x1.fffffffffffffp-163}, + {0x1.ffffffffffffep-484, 0x1.fffffffffffffp-162}, + {0x1.ffffffffffffep-481, 0x1.fffffffffffffp-161}, + {0x1.ffffffffffffep-478, 0x1.fffffffffffffp-160}, + {0x1.ffffffffffffep-475, 0x1.fffffffffffffp-159}, + {0x1.ffffffffffffep-472, 0x1.fffffffffffffp-158}, + {0x1.ffffffffffffep-469, 0x1.fffffffffffffp-157}, + {0x1.ffffffffffffep-466, 0x1.fffffffffffffp-156}, + {0x1.ffffffffffffep-463, 0x1.fffffffffffffp-155}, + {0x1.ffffffffffffep-460, 0x1.fffffffffffffp-154}, + {0x1.ffffffffffffep-457, 0x1.fffffffffffffp-153}, + {0x1.ffffffffffffep-454, 0x1.fffffffffffffp-152}, + {0x1.ffffffffffffep-451, 0x1.fffffffffffffp-151}, + {0x1.ffffffffffffep-988, 0x1.fffffffffffffp-330}, + {0x1.ffffffffffffep-448, 0x1.fffffffffffffp-150}, + {0x1.ffffffffffffep-445, 0x1.fffffffffffffp-149}, + {0x1.ffffffffffffep-442, 0x1.fffffffffffffp-148}, + {0x1.ffffffffffffep-439, 0x1.fffffffffffffp-147}, + {0x1.ffffffffffffep-436, 0x1.fffffffffffffp-146}, + {0x1.ffffffffffffep-433, 0x1.fffffffffffffp-145}, + {0x1.ffffffffffffep-430, 0x1.fffffffffffffp-144}, + {0x1.ffffffffffffep-427, 0x1.fffffffffffffp-143}, + {0x1.ffffffffffffep-424, 0x1.fffffffffffffp-142}, + {0x1.ffffffffffffep-421, 0x1.fffffffffffffp-141}, + {0x1.ffffffffffffep-418, 0x1.fffffffffffffp-140}, + {0x1.ffffffffffffep-415, 0x1.fffffffffffffp-139}, + {0x1.ffffffffffffep-412, 0x1.fffffffffffffp-138}, + {0x1.ffffffffffffep-409, 0x1.fffffffffffffp-137}, + {0x1.ffffffffffffep-406, 0x1.fffffffffffffp-136}, + {0x1.ffffffffffffep-403, 0x1.fffffffffffffp-135}, + {0x1.ffffffffffffep-985, 0x1.fffffffffffffp-329}, + {0x1.ffffffffffffep-400, 0x1.fffffffffffffp-134}, + {0x1.ffffffffffffep-397, 0x1.fffffffffffffp-133}, + {0x1.ffffffffffffep-394, 0x1.fffffffffffffp-132}, + {0x1.ffffffffffffep-391, 0x1.fffffffffffffp-131}, + {0x1.ffffffffffffep-388, 0x1.fffffffffffffp-130}, + {0x1.ffffffffffffep-385, 0x1.fffffffffffffp-129}, + {0x1.ffffffffffffep-382, 0x1.fffffffffffffp-128}, + {0x1.ffffffffffffep-379, 0x1.fffffffffffffp-127}, + {0x1.ffffffffffffep-376, 0x1.fffffffffffffp-126}, + {0x1.ffffffffffffep-373, 0x1.fffffffffffffp-125}, + {0x1.ffffffffffffep-370, 0x1.fffffffffffffp-124}, + {0x1.ffffffffffffep-367, 0x1.fffffffffffffp-123}, + {0x1.ffffffffffffep-364, 0x1.fffffffffffffp-122}, + {0x1.ffffffffffffep-361, 0x1.fffffffffffffp-121}, + {0x1.ffffffffffffep-358, 0x1.fffffffffffffp-120}, + {0x1.ffffffffffffep-355, 0x1.fffffffffffffp-119}, + {0x1.ffffffffffffep-982, 0x1.fffffffffffffp-328}, + {0x1.ffffffffffffep-352, 0x1.fffffffffffffp-118}, + {0x1.ffffffffffffep-349, 0x1.fffffffffffffp-117}, + {0x1.ffffffffffffep-346, 0x1.fffffffffffffp-116}, + {0x1.ffffffffffffep-343, 0x1.fffffffffffffp-115}, + {0x1.ffffffffffffep-340, 0x1.fffffffffffffp-114}, + {0x1.ffffffffffffep-337, 0x1.fffffffffffffp-113}, + {0x1.ffffffffffffep-334, 0x1.fffffffffffffp-112}, + {0x1.ffffffffffffep-331, 0x1.fffffffffffffp-111}, + {0x1.ffffffffffffep-328, 0x1.fffffffffffffp-110}, + {0x1.ffffffffffffep-325, 0x1.fffffffffffffp-109}, + {0x1.ffffffffffffep-322, 0x1.fffffffffffffp-108}, + {0x1.ffffffffffffep-319, 0x1.fffffffffffffp-107}, + {0x1.ffffffffffffep-316, 0x1.fffffffffffffp-106}, + {0x1.ffffffffffffep-313, 0x1.fffffffffffffp-105}, + {0x1.ffffffffffffep-310, 0x1.fffffffffffffp-104}, + {0x1.ffffffffffffep-307, 0x1.fffffffffffffp-103}, + {0x1.ffffffffffffep-979, 0x1.fffffffffffffp-327}, + {0x1.ffffffffffffep-304, 0x1.fffffffffffffp-102}, + {0x1.ffffffffffffep-301, 0x1.fffffffffffffp-101}, + {0x1.ffffffffffffep-298, 0x1.fffffffffffffp-100}, + {0x1.ffffffffffffep-295, 0x1.fffffffffffffp-99}, + {0x1.ffffffffffffep-292, 0x1.fffffffffffffp-98}, + {0x1.ffffffffffffep-289, 0x1.fffffffffffffp-97}, + {0x1.ffffffffffffep-286, 0x1.fffffffffffffp-96}, + {0x1.ffffffffffffep-283, 0x1.fffffffffffffp-95}, + {0x1.ffffffffffffep-280, 0x1.fffffffffffffp-94}, + {0x1.ffffffffffffep-277, 0x1.fffffffffffffp-93}, + {0x1.ffffffffffffep-274, 0x1.fffffffffffffp-92}, + {0x1.ffffffffffffep-271, 0x1.fffffffffffffp-91}, + {0x1.ffffffffffffep-268, 0x1.fffffffffffffp-90}, + {0x1.ffffffffffffep-265, 0x1.fffffffffffffp-89}, + {0x1.ffffffffffffep-262, 0x1.fffffffffffffp-88}, + {0x1.ffffffffffffep-259, 0x1.fffffffffffffp-87}, + {0x1.ffffffffffffep-1021, 0x1.fffffffffffffp-341}, + {0x1.ffffffffffffep-976, 0x1.fffffffffffffp-326}, + {0x1.ffffffffffffep-256, 0x1.fffffffffffffp-86}, + {0x1.ffffffffffffep-253, 0x1.fffffffffffffp-85}, + {0x1.ffffffffffffep-250, 0x1.fffffffffffffp-84}, + {0x1.ffffffffffffep-247, 0x1.fffffffffffffp-83}, + {0x1.ffffffffffffep-244, 0x1.fffffffffffffp-82}, + {0x1.ffffffffffffep-241, 0x1.fffffffffffffp-81}, + {0x1.ffffffffffffep-238, 0x1.fffffffffffffp-80}, + {0x1.ffffffffffffep-235, 0x1.fffffffffffffp-79}, + {0x1.ffffffffffffep-232, 0x1.fffffffffffffp-78}, + {0x1.ffffffffffffep-229, 0x1.fffffffffffffp-77}, + {0x1.ffffffffffffep-226, 0x1.fffffffffffffp-76}, + {0x1.ffffffffffffep-223, 0x1.fffffffffffffp-75}, + {0x1.ffffffffffffep-220, 0x1.fffffffffffffp-74}, + {0x1.ffffffffffffep-217, 0x1.fffffffffffffp-73}, + {0x1.ffffffffffffep-214, 0x1.fffffffffffffp-72}, + {0x1.ffffffffffffep-211, 0x1.fffffffffffffp-71}, + {0x1.ffffffffffffep-973, 0x1.fffffffffffffp-325}, + {0x1.ffffffffffffep-208, 0x1.fffffffffffffp-70}, + {0x1.ffffffffffffep-205, 0x1.fffffffffffffp-69}, + {0x1.ffffffffffffep-202, 0x1.fffffffffffffp-68}, + {0x1.ffffffffffffep-199, 0x1.fffffffffffffp-67}, + {0x1.ffffffffffffep-196, 0x1.fffffffffffffp-66}, + {0x1.ffffffffffffep-193, 0x1.fffffffffffffp-65}, + {0x1.ffffffffffffep-190, 0x1.fffffffffffffp-64}, + {0x1.ffffffffffffep-187, 0x1.fffffffffffffp-63}, + {0x1.ffffffffffffep-184, 0x1.fffffffffffffp-62}, + {0x1.ffffffffffffep-181, 0x1.fffffffffffffp-61}, + {0x1.ffffffffffffep-178, 0x1.fffffffffffffp-60}, + {0x1.ffffffffffffep-175, 0x1.fffffffffffffp-59}, + {0x1.ffffffffffffep-172, 0x1.fffffffffffffp-58}, + {0x1.ffffffffffffep-169, 0x1.fffffffffffffp-57}, + {0x1.ffffffffffffep-166, 0x1.fffffffffffffp-56}, + {0x1.ffffffffffffep-163, 0x1.fffffffffffffp-55}, + {0x1.ffffffffffffep-970, 0x1.fffffffffffffp-324}, + {0x1.ffffffffffffep-160, 0x1.fffffffffffffp-54}, + {0x1.ffffffffffffep-157, 0x1.fffffffffffffp-53}, + {0x1.ffffffffffffep-154, 0x1.fffffffffffffp-52}, + {0x1.ffffffffffffep-151, 0x1.fffffffffffffp-51}, + {0x1.ffffffffffffep-148, 0x1.fffffffffffffp-50}, + {0x1.ffffffffffffep-145, 0x1.fffffffffffffp-49}, + {0x1.ffffffffffffep-142, 0x1.fffffffffffffp-48}, + {0x1.ffffffffffffep-139, 0x1.fffffffffffffp-47}, + {0x1.ffffffffffffep-136, 0x1.fffffffffffffp-46}, + {0x1.ffffffffffffep-133, 0x1.fffffffffffffp-45}, + {0x1.ffffffffffffep-130, 0x1.fffffffffffffp-44}, + {0x1.ffffffffffffep-127, 0x1.fffffffffffffp-43}, + {0x1.ffffffffffffep-124, 0x1.fffffffffffffp-42}, + {0x1.ffffffffffffep-121, 0x1.fffffffffffffp-41}, + {0x1.ffffffffffffep-118, 0x1.fffffffffffffp-40}, + {0x1.ffffffffffffep-115, 0x1.fffffffffffffp-39}, + {0x1.ffffffffffffep-967, 0x1.fffffffffffffp-323}, + {0x1.ffffffffffffep-112, 0x1.fffffffffffffp-38}, + {0x1.ffffffffffffep-109, 0x1.fffffffffffffp-37}, + {0x1.ffffffffffffep-106, 0x1.fffffffffffffp-36}, + {0x1.ffffffffffffep-103, 0x1.fffffffffffffp-35}, + {0x1.ffffffffffffep-100, 0x1.fffffffffffffp-34}, + {0x1.ffffffffffffep-97, 0x1.fffffffffffffp-33}, + {0x1.ffffffffffffep-94, 0x1.fffffffffffffp-32}, + {0x1.ffffffffffffep-91, 0x1.fffffffffffffp-31}, + {0x1.ffffffffffffep-88, 0x1.fffffffffffffp-30}, + {0x1.ffffffffffffep-85, 0x1.fffffffffffffp-29}, + {0x1.ffffffffffffep-82, 0x1.fffffffffffffp-28}, + {0x1.ffffffffffffep-79, 0x1.fffffffffffffp-27}, + {0x1.ffffffffffffep-76, 0x1.fffffffffffffp-26}, + {0x1.ffffffffffffep-73, 0x1.fffffffffffffp-25}, + {0x1.ffffffffffffep-70, 0x1.fffffffffffffp-24}, + {0x1.ffffffffffffep-67, 0x1.fffffffffffffp-23}, + {0x1.ffffffffffffep-964, 0x1.fffffffffffffp-322}, + {0x1.ffffffffffffep-64, 0x1.fffffffffffffp-22}, + {0x1.ffffffffffffep-61, 0x1.fffffffffffffp-21}, + {0x1.ffffffffffffep-58, 0x1.fffffffffffffp-20}, + {0x1.ffffffffffffep-55, 0x1.fffffffffffffp-19}, + {0x1.ffffffffffffep-52, 0x1.fffffffffffffp-18}, + {0x1.ffffffffffffep-49, 0x1.fffffffffffffp-17}, + {0x1.ffffffffffffep-46, 0x1.fffffffffffffp-16}, + {0x1.ffffffffffffep-43, 0x1.fffffffffffffp-15}, + {0x1.ffffffffffffep-40, 0x1.fffffffffffffp-14}, + {0x1.ffffffffffffep-37, 0x1.fffffffffffffp-13}, + {0x1.ffffffffffffep-34, 0x1.fffffffffffffp-12}, + {0x1.ffffffffffffep-31, 0x1.fffffffffffffp-11}, + {0x1.ffffffffffffep-28, 0x1.fffffffffffffp-10}, + {0x1.ffffffffffffep-25, 0x1.fffffffffffffp-9}, + {0x1.ffffffffffffep-22, 0x1.fffffffffffffp-8}, + {0x0.000000000003ep-1022, 0x1.fa9c313858568p-357}, + {0x1.ffffffffffffep-19, 0x1.fffffffffffffp-7}, + {0x1.ffffffffffffep-961, 0x1.fffffffffffffp-321}, + {0x1.ffffffffffffep-16, 0x1.fffffffffffffp-6}, + {0x1.ffffffffffffep-13, 0x1.fffffffffffffp-5}, + {0x1.ffffffffffffep-10, 0x1.fffffffffffffp-4}, + {0x1.ffffffffffffep-7, 0x1.fffffffffffffp-3}, + {0x0.000000000003fp-1022, 0x1.fd51bf2069fe6p-357}, + {0x1.ffffffffffffep-4, 0x1.fffffffffffffp-2}, + {0x1.ffffffffffffep-1, 0x1.fffffffffffffp-1}, + {0x0.000000003fffcp-1022, 0x1.ffff55551c71bp-353}, + {0x0.000003fffffe8p-1022, 0x1.ffffffcp-349}, + {0x0.000003ffffffcp-1022, 0x1.fffffff555555p-349}, + {0x0.003fffffffff9p-1022, 0x1.fffffffffed55p-345}, + {0x1.ffffffffffffep2, 0x1.fffffffffffffp0}, + {0x1.bp4, 0x1.8p1}, + {0x1.ffffffffffffep5, 0x1.fffffffffffffp1}, + {0x1.f3ffffffffff4p6, 0x1.3fffffffffffep2}, + {0x1.f3ffffffffffcp6, 0x1.3ffffffffffffp2}, + {0x1.bp7, 0x1.8p2}, + {0x1.56ffffffffffep8, 0x1.bffffffffffffp2}, + {0x1.ffffffffffffep8, 0x1.fffffffffffffp2}, + {0x1.6c8p9, 0x1.2p3}, + {0x1.f3ffffffffff4p9, 0x1.3fffffffffffep3}, + {0x1.f3ffffffffffcp9, 0x1.3ffffffffffffp3}, + {0x1.4cbfffffffffcp10, 0x1.5fffffffffffep3}, + {0x1.4cbfffffffffep10, 0x1.5ffffffffffffp3}, + {0x1.bp10, 0x1.8p3}, + {0x1.129ffffffffa4p11, 0x1.9ffffffffffd1p3}, + {0x1.129fffffffffep11, 0x1.9ffffffffffffp3}, + {0x1.56ffffffffffep11, 0x1.bffffffffffffp3}, + {0x1.a5ep11, 0x1.ep3}, + {0x1.ffffffffffffep11, 0x1.fffffffffffffp3}, + {0x1.330fffffffc1ep12, 0x1.0fffffffffedbp4}, + {0x1.331p12, 0x1.1p4}, + {0x1.6c8p12, 0x1.2p4}, + {0x1.acafffffffffap12, 0x1.2ffffffffffffp4}, + {0x1.acafffffffffep12, 0x1.2ffffffffffffp4}, + {0x1.ffffffffffffep-958, 0x1.fffffffffffffp-320}, + {0x1.ffffffffffffep-955, 0x1.fffffffffffffp-319}, + {0x1.ffffffffffffep-952, 0x1.fffffffffffffp-318}, + {0x1.ffffffffffffep-949, 0x1.fffffffffffffp-317}, + {0x1.ffffffffffffep-946, 0x1.fffffffffffffp-316}, + {0x1.ffffffffffffep-943, 0x1.fffffffffffffp-315}, + {0x1.ffffffffffffep-940, 0x1.fffffffffffffp-314}, + {0x1.ffffffffffffep-937, 0x1.fffffffffffffp-313}, + {0x1.ffffffffffffep-934, 0x1.fffffffffffffp-312}, + {0x1.ffffffffffffep-931, 0x1.fffffffffffffp-311}, + {0x1.ffffffffffffep-1018, 0x1.fffffffffffffp-340}, + {0x1.ffffffffffffep-928, 0x1.fffffffffffffp-310}, + {0x1.ffffffffffffep-925, 0x1.fffffffffffffp-309}, + {0x1.ffffffffffffep-922, 0x1.fffffffffffffp-308}, + {0x1.ffffffffffffep-919, 0x1.fffffffffffffp-307}, + {0x1.ffffffffffffep-916, 0x1.fffffffffffffp-306}, + {0x1.ffffffffffffep-913, 0x1.fffffffffffffp-305}, + {0x1.ffffffffffffep-910, 0x1.fffffffffffffp-304}, + {0x1.ffffffffffffep-907, 0x1.fffffffffffffp-303}, + {0x1.ffffffffffffep-904, 0x1.fffffffffffffp-302}, + {0x0.0000000000007p-1022, 0x1.e9b5dba58189ep-358}, + {0x1.ffffffffffffep-901, 0x1.fffffffffffffp-301}, + {0x1.ffffffffffffep-898, 0x1.fffffffffffffp-300}, + {0x0.0000000007ffp-1022, 0x1.ffeaa9c70ca31p-354}, + {0x0.0000000007ffep-1022, 0x1.fffd5551c7149p-354}, + {0x0.0000007fffffdp-1022, 0x1.ffffffcp-350}, + {0x0.0000007fffffep-1022, 0x1.ffffffd555555p-350}, + {0x0.0007ffffffffap-1022, 0x1.fffffffff8p-346}, + {0x0.7ffffffffffffp-1022, 0x1.fffffffffffffp-342}, + {0x1.ffffffffffffep-895, 0x1.fffffffffffffp-299}, + {0x1.ffffffffffffep-892, 0x1.fffffffffffffp-298}, + {0x1.ffffffffffffep-889, 0x1.fffffffffffffp-297}, + {0x1.ffffffffffffep-886, 0x1.fffffffffffffp-296}, + {0x1.ffffffffffffep-883, 0x1.fffffffffffffp-295}, + {0x1.ffffffffffffep-1015, 0x1.fffffffffffffp-339}, + {0x1.ffffffffffffep-880, 0x1.fffffffffffffp-294}, + {0x1.ffffffffffffep-877, 0x1.fffffffffffffp-293}, + {0x1.ffffffffffffep-874, 0x1.fffffffffffffp-292}, + {0x1.ffffffffffffep-871, 0x1.fffffffffffffp-291}, + {0x1.ffffffffffffep-868, 0x1.fffffffffffffp-290}, + {0x1.ffffffffffffep-865, 0x1.fffffffffffffp-289}, + {0x1.ffffffffffffep-862, 0x1.fffffffffffffp-288}, + {0x1.ffffffffffffep-859, 0x1.fffffffffffffp-287}, + {0x1.ffffffffffffep-856, 0x1.fffffffffffffp-286}, + {0x1.ffffffffffffep-853, 0x1.fffffffffffffp-285}, + {0x1.ffffffffffffep-850, 0x1.fffffffffffffp-284}, + {0x1.ffffffffffffep-847, 0x1.fffffffffffffp-283}, + {0x1.ffffffffffffep-844, 0x1.fffffffffffffp-282}, + {0x1.ffffffffffffep-841, 0x1.fffffffffffffp-281}, + {0x1.ffffffffffffep-838, 0x1.fffffffffffffp-280}, + {0x1.ffffffffffffep-835, 0x1.fffffffffffffp-279}, + {0x1.ffffffffffffep-1012, 0x1.fffffffffffffp-338}, + {0x1.ffffffffffffep-832, 0x1.fffffffffffffp-278}, + {0x1.ffffffffffffep-829, 0x1.fffffffffffffp-277}, + {0x1.ffffffffffffep-826, 0x1.fffffffffffffp-276}, + {0x1.ffffffffffffep-823, 0x1.fffffffffffffp-275}, + {0x1.ffffffffffffep-820, 0x1.fffffffffffffp-274}, + {0x1.ffffffffffffep-817, 0x1.fffffffffffffp-273}, + {0x1.ffffffffffffep-814, 0x1.fffffffffffffp-272}, + {0x1.ffffffffffffep-811, 0x1.fffffffffffffp-271}, + {0x1.ffffffffffffep-808, 0x1.fffffffffffffp-270}, + {0x1.ffffffffffffep-805, 0x1.fffffffffffffp-269}, + {0x1.ffffffffffffep-802, 0x1.fffffffffffffp-268}, + {0x1.ffffffffffffep-799, 0x1.fffffffffffffp-267}, + {0x1.ffffffffffffep-796, 0x1.fffffffffffffp-266}, + {0x1.ffffffffffffep-793, 0x1.fffffffffffffp-265}, + {0x1.ffffffffffffep-790, 0x1.fffffffffffffp-264}, + {0x1.ffffffffffffep-787, 0x1.fffffffffffffp-263}, + {0x1.ffffffffffffep-1009, 0x1.fffffffffffffp-337}, + {0x1.ffffffffffffep-784, 0x1.fffffffffffffp-262}, + {0x1.ffffffffffffep-781, 0x1.fffffffffffffp-261}, + {0x1.ffffffffffffep-778, 0x1.fffffffffffffp-260}, + {0x1.ffffffffffffep-775, 0x1.fffffffffffffp-259}, + {0x1.ffffffffffffep-772, 0x1.fffffffffffffp-258}, + {0x1.ffffffffffffep-769, 0x1.fffffffffffffp-257}, + {0x0.0000000000ffep-1022, 0x1.ffeaa9c70ca31p-355}, + {0x0.0000000000fffp-1022, 0x1.fff5551c6fcd6p-355}, + {0x0.0000000ffff86p-1022, 0x1.ffffaeaa9dbf1p-351}, + {0x0.0000000ffffffp-1022, 0x1.ffffff5555552p-351}, + {0x0.0000ffffffap-1022, 0x1.ffffffcp-347}, + {0x0.0000ffffffff8p-1022, 0x1.ffffffffaaaabp-347}, + {0x0.0fffffffffffbp-1022, 0x1.fffffffffffcbp-343} + }; + + for(double[] testCase: testCases) + failures+=testCubeRootCase(testCase[0], testCase[1]); + + return failures; + } + + + public static void main(String [] argv) { + int failures = 0; + + failures += testCubeRoot(); + + if (failures > 0) { + System.err.println("Testing the cube root incurred " + + failures + " failures."); + throw new RuntimeException(); + } + } +} diff --git a/jdk/test/java/lang/StrictMath/Expm1Tests.java b/jdk/test/java/lang/StrictMath/Expm1Tests.java new file mode 100644 index 00000000000..667fa480cf0 --- /dev/null +++ b/jdk/test/java/lang/StrictMath/Expm1Tests.java @@ -0,0 +1,795 @@ +/* + * Copyright 2003-2004 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4851638 + * @summary Tests for StrictMath.expm1 + * @author Joseph D. Darcy + */ + +/** + * The tests in ../Math/Expm1Tests.java test properties that should + * hold for any expm1 implementation, including the FDLIBM-based one + * required for StrictMath.expm1. Therefore, the test cases in + * ../Math/Expm1Tests.java are run against both the Math and + * StrictMath versions of expm1. The role of this test is to verify + * that the FDLIBM expm1 algorithm is being used by running golden + * file tests on values that may vary from one conforming expm1 + * implementation to another. + */ + +public class Expm1Tests { + private Expm1Tests(){} + + static int testExpm1Case(double input, double expected) { + return Tests.test("StrictMath.expm1(double)", input, + StrictMath.expm1(input), expected); + } + + static int testExpm1() { + int failures = 0; + + // Test cases in the range [-36.75, 710] + double [][] testCases = { + {-0x1.580000008c619p3, -0x1.fffd3069586f6p-1}, + {-0x1.380000008c721p3, -0x1.fff85bf4a6e98p-1}, + {-0x1.180000008c9fap3, -0x1.ffeb3aeb95524p-1}, + {-0x1.f0000001197ccp2, -0x1.ffc78aadc116ap-1}, + {-0x1.b0000001197e7p2, -0x1.ff6687cca710bp-1}, + {-0x1.70000001197f6p2, -0x1.fe5ed3992a519p-1}, + {-0x1.30000001198p2, -0x1.fb9201482bdfap-1}, + {-0x1.e000000233006p1, -0x1.f3f57b658d6fbp-1}, + {-0x1.6000000233012p1, -0x1.df44d8ee30b76p-1}, + {-0x1.c000000466028p0, -0x1.a7071a097ed5ep-1}, + {-0x1.80000008cc052p-1, -0x1.0e25f8a4a95b7p-1}, + {0x1.ffffffdccfeb7p-3, 0x1.22d78ef909144p-2}, + {0x1.3ffffffb99fd7p0, 0x1.3ec38ed3629a6p1}, + {0x1.1ffffffdccfebp1, 0x1.0f9b882a107edp3}, + {0x1.9ffffffdccfebp1, 0x1.8ca53b70fa11bp4}, + {0x1.0ffffffee67f6p2, 0x1.146bf132050c5p6}, + {0x1.4ffffffee67f5p2, 0x1.7b21ede9f0bdap7}, + {0x1.8ffffffee67f5p2, 0x1.0281a438aa523p9}, + {0x1.cffffffee67f5p2, 0x1.5fc6b5cf322c4p10}, + {0x1.07ffffff733fap3, 0x1.de5406b276b92p11}, + {0x1.27ffffff733fap3, 0x1.451c8690d1567p13}, + {0x1.47ffffff733fap3, 0x1.b9e62ae5924dfp14}, + {0x1.67ffffff733fap3, 0x1.2c4eeb7089cp16}, + {0x1.87ffffff733fap3, 0x1.982a24f2ab78ap17}, + {0x1.a7ffffff733fap3, 0x1.1560a14319349p19}, + {0x1.c7ffffff733fap3, 0x1.78fed772b40f2p20}, + {0x1.e7ffffff733fap3, 0x1.0031f18ee602fp22}, + {0x1.03ffffffb99fdp4, 0x1.5c348d8118f26p23}, + {0x1.13ffffffb99fdp4, 0x1.d942943e22d74p24}, + {0x1.23ffffffb99fcp4, 0x1.419d1309466ep26}, + {0x1.33ffffffb99fcp4, 0x1.b51e403430afep27}, + {0x1.43ffffffb99fcp4, 0x1.290d76c47bd4cp29}, + {0x1.53ffffffb99fcp4, 0x1.93bc8061146dp30}, + {0x1.63ffffffb99fbp4, 0x1.125e0665544a5p32}, + {0x1.73ffffffb99fbp4, 0x1.74e75f9de5d7cp33}, + {0x1.83ffffffb99fbp4, 0x1.fad42d3f28732p34}, + {0x1.93ffffffb99fbp4, 0x1.586d071cb8f87p36}, + {0x1.a3ffffffb99fbp4, 0x1.d41f91d0b4e6ep37}, + {0x1.b3ffffffb99fbp4, 0x1.3e1f6e5bc0242p39}, + {0x1.c3ffffffb99fbp4, 0x1.b05fa9aebfa64p40}, + {0x1.d3ffffffb99fbp4, 0x1.25d410cc90a38p42}, + {0x1.e3ffffffb99fbp4, 0x1.8f5aab33aa6c6p43}, + {0x1.f3ffffffb99fbp4, 0x1.0f63a91bc9797p45}, + {0x1.01ffffffdccfep5, 0x1.70db367c88b28p46}, + {0x1.09ffffffdccfep5, 0x1.f553e36d2975fp47}, + {0x1.11ffffffdccfep5, 0x1.54afff2230e99p49}, + {0x1.19ffffffdccfep5, 0x1.cf0ad451f1e9fp50}, + {0x1.21ffffffdccfep5, 0x1.3aab7c88ef991p52}, + {0x1.29ffffffdccfep5, 0x1.abae41ecccd22p53}, + {0x1.31ffffffdccfep5, 0x1.22a3a0462535fp55}, + {0x1.39ffffffdccfdp5, 0x1.8b050329f95c8p56}, + {0x1.41ffffffdccfdp5, 0x1.0c719224d80a2p58}, + {0x1.49ffffffdccfdp5, 0x1.6cda4c755ea56p59}, + {0x1.51ffffffdccfdp5, 0x1.efe2e2b6ad6ebp60}, + {0x1.59ffffffdccfdp5, 0x1.50fd5a6337c61p62}, + {0x1.61ffffffdccfdp5, 0x1.ca043518d78acp63}, + {0x1.69ffffffdccfdp5, 0x1.374122dd2fbdbp65}, + {0x1.71ffffffdccfdp5, 0x1.a709e46cc671ep66}, + {0x1.79ffffffdccfdp5, 0x1.1f7c0c5482bf3p68}, + {0x1.81ffffffdccfdp5, 0x1.86bb667297515p69}, + {0x1.89ffffffdccfcp5, 0x1.0987aa8375abcp71}, + {0x1.91ffffffdccfcp5, 0x1.68e48248f27ddp72}, + {0x1.99ffffffdccfcp5, 0x1.ea8100a2e27e9p73}, + {0x1.a1ffffffdccfcp5, 0x1.4d54fc02d9352p75}, + {0x1.a9ffffffdccfcp5, 0x1.c50b8ceab6ad1p76}, + {0x1.b1ffffffdccfcp5, 0x1.33e046afc7062p78}, + {0x1.b9ffffffdccfcp5, 0x1.a2726cf2e78e3p79}, + {0x1.c1ffffffdccfcp5, 0x1.1c5d3c581edf2p81}, + {0x1.c9ffffffdccfcp5, 0x1.827db3961daecp82}, + {0x1.d1ffffffdccfbp5, 0x1.06a5db797b4b2p84}, + {0x1.d9ffffffdccfbp5, 0x1.64f9b90e23fb4p85}, + {0x1.e1ffffffdccfbp5, 0x1.e52e132ebafe2p86}, + {0x1.e9ffffffdccfbp5, 0x1.49b6c774442efp88}, + {0x1.f1ffffffdccfbp5, 0x1.c020b4f9d926cp89}, + {0x1.f9ffffffdccfbp5, 0x1.3088cda20d465p91}, + {0x1.00ffffffee67ep6, 0x1.9de7b7a818186p92}, + {0x1.04ffffffee67ep6, 0x1.194717f5da259p94}, + {0x1.08ffffffee67ep6, 0x1.7e4bc97a2360dp95}, + {0x1.0cffffffee67ep6, 0x1.03cc0e87f367bp97}, + {0x1.10ffffffee67ep6, 0x1.6119d231b67f5p98}, + {0x1.14ffffffee67ep6, 0x1.dfe9f0cbe5942p99}, + {0x1.18ffffffee67ep6, 0x1.4622a079fc2a6p101}, + {0x1.1cffffffee67ep6, 0x1.bb4386e45ae94p102}, + {0x1.20ffffffee67ep6, 0x1.2d3a9d9e9fe6p104}, + {0x1.24ffffffee67ep6, 0x1.9969a118d6261p105}, + {0x1.28ffffffee67ep6, 0x1.1639871642331p107}, + {0x1.2cffffffee67ep6, 0x1.7a2587603a84bp108}, + {0x1.30ffffffee67ep6, 0x1.00fa2d6e6a76ep110}, + {0x1.34ffffffee67ep6, 0x1.5d44af7562574p111}, + {0x1.38ffffffee67ep6, 0x1.dab4705f88c02p112}, + {0x1.3cffffffee67ep6, 0x1.42986b24fc9dcp114}, + {0x1.40ffffffee67ep6, 0x1.b673dcb2fe519p115}, + {0x1.44ffffffee67ep6, 0x1.29f59cd896383p117}, + {0x1.48ffffffee67ep6, 0x1.94f806342143cp118}, + {0x1.4cffffffee67ep6, 0x1.133471e4d5b38p120}, + {0x1.50ffffffee67ep6, 0x1.760acce4f0e03p121}, + {0x1.54ffffffee67ep6, 0x1.fc604454828ddp122}, + {0x1.58ffffffee67ep6, 0x1.597a32eee8c46p124}, + {0x1.5cffffffee67ep6, 0x1.d58d694102246p125}, + {0x1.60ffffffee67ep6, 0x1.3f180bd3df0d2p127}, + {0x1.64ffffffee67ep6, 0x1.b1b190d803f07p128}, + {0x1.68ffffffee67ep6, 0x1.26b9b1cab82dap130}, + {0x1.6cffffffee67ep6, 0x1.9092c44a68bc1p131}, + {0x1.70ffffffee67ep6, 0x1.1037c0cf4a5a6p133}, + {0x1.74ffffffee67ep6, 0x1.71fb79fed30fbp134}, + {0x1.78ffffffee67ep6, 0x1.f6dbadec024eep135}, + {0x1.7cffffffee67ep6, 0x1.55ba3f072a6dbp137}, + {0x1.80ffffffee67ep6, 0x1.d074b338a9163p138}, + {0x1.84ffffffee67ep6, 0x1.3ba167320351ap140}, + {0x1.88ffffffee67ep6, 0x1.acfc7e2e0558bp141}, + {0x1.8cffffffee67ep6, 0x1.2386c336b7163p143}, + {0x1.90ffffffee67ep6, 0x1.8c39b90c7cdap144}, + {0x1.94ffffffee67ep6, 0x1.0d435c84d4e66p146}, + {0x1.98ffffffee67ep6, 0x1.6df76efd7275ep147}, + {0x1.9cffffffee67ep6, 0x1.f1666c9163f86p148}, + {0x1.a0ffffffee67ep6, 0x1.5204b679406b7p150}, + {0x1.a4ffffffee67ep6, 0x1.cb6a267e94b7ap151}, + {0x1.a8ffffffee67ep6, 0x1.38346236ba483p153}, + {0x1.acffffffee67ep6, 0x1.a8547ff6d3311p154}, + {0x1.b0ffffffee67ep6, 0x1.205cb8246899ap156}, + {0x1.b4ffffffee67ep6, 0x1.87ecc28a831c1p157}, + {0x1.b8ffffffee67ep6, 0x1.0a572df57323ep159}, + {0x1.bcffffffee67ep6, 0x1.69fe8c886de24p160}, + {0x1.c0ffffffee67ep6, 0x1.ec0055aa644acp161}, + {0x1.c4ffffffee67ep6, 0x1.4e597c5197d13p163}, + {0x1.c8ffffffee67ep6, 0x1.c66d9bb965746p164}, + {0x1.ccffffffee67ep6, 0x1.34d0e22472ce2p166}, + {0x1.d0ffffffee67ep6, 0x1.a3b971da5668ap167}, + {0x1.d4ffffffee67ep6, 0x1.1d3b77e103d1ap169}, + {0x1.d8ffffffee67ep6, 0x1.83abbf32ed4f6p170}, + {0x1.dcffffffee67ep6, 0x1.07731e5137e95p172}, + {0x1.e0ffffffee67ep6, 0x1.6610b39e7ce7p173}, + {0x1.e4ffffffee67ep6, 0x1.e6a93f132076cp174}, + {0x1.e8ffffffee67ep6, 0x1.4ab873ed0fb2cp176}, + {0x1.ecffffffee67ep6, 0x1.c17eebfd11debp177}, + {0x1.f0ffffffee67ep6, 0x1.3176cc87e9082p179}, + {0x1.f4ffffffee67ep6, 0x1.9f2b2fe57487ap180}, + {0x1.f8ffffffee67ep6, 0x1.1a22e9fe60816p182}, + {0x1.fcffffffee67ep6, 0x1.7f768dd1738aap183}, + {0x1.007ffffff733fp7, 0x1.049717079907bp185}, + {0x1.027ffffff733fp7, 0x1.622dc5947dd63p186}, + {0x1.047ffffff733fp7, 0x1.e160ff1ccd30cp187}, + {0x1.067ffffff733fp7, 0x1.472180f8199d7p189}, + {0x1.087ffffff733fp7, 0x1.bc9df0c9b6e0fp190}, + {0x1.0a7ffffff733fp7, 0x1.2e26073757ed6p192}, + {0x1.0c7ffffff733fp7, 0x1.9aa99688f714bp193}, + {0x1.0e7ffffff733fp7, 0x1.1712f6523864dp195}, + {0x1.107ffffff733fp7, 0x1.7b4d0d8e11012p196}, + {0x1.127ffffff733fp7, 0x1.01c301c6bf29cp198}, + {0x1.147ffffff733fp7, 0x1.5e55a41486608p199}, + {0x1.167ffffff733fp7, 0x1.dc276c8c7156p200}, + {0x1.187ffffff733fp7, 0x1.4394876ddc7dap202}, + {0x1.1a7ffffff733fp7, 0x1.b7ca840a6b3bap203}, + {0x1.1c7ffffff733fp7, 0x1.2ade7851ad0fep205}, + {0x1.1e7ffffff733fp7, 0x1.963482987606p206}, + {0x1.207ffffff733fp7, 0x1.140b84f56a91bp208}, + {0x1.227ffffff733fp7, 0x1.772f1dec03a66p209}, + {0x1.247ffffff733fp7, 0x1.fded90f5af3ap210}, + {0x1.267ffffff733fp7, 0x1.5a88311cf6cbdp212}, + {0x1.287ffffff733fp7, 0x1.d6fc5e99a419dp213}, + {0x1.2a7ffffff733fp7, 0x1.40116b9759ebap215}, + {0x1.2c7ffffff733fp7, 0x1.b304801416466p216}, + {0x1.2e7ffffff733fp7, 0x1.27a0063dbe9cep218}, + {0x1.307ffffff733fp7, 0x1.91cbd14945353p219}, + {0x1.327ffffff733fp7, 0x1.110c7e4340e4fp221}, + {0x1.347ffffff733fp7, 0x1.731c9ec8ce996p222}, + {0x1.367ffffff733fp7, 0x1.f864aa9acffbdp223}, + {0x1.387ffffff733fp7, 0x1.56c54eff8fbcdp225}, + {0x1.3a7ffffff733fp7, 0x1.d1dfaced4eb1p226}, + {0x1.3c7ffffff733fp7, 0x1.3c98120a95d78p228}, + {0x1.3e7ffffff733fp7, 0x1.ae4bbfa449eaap229}, + {0x1.407ffffff733fp7, 0x1.246a97a9838dcp231}, + {0x1.427ffffff733fp7, 0x1.8d6f603164cebp232}, + {0x1.447ffffff733fp7, 0x1.0e15cad8b775ep234}, + {0x1.467ffffff733fp7, 0x1.6f15705b3f514p235}, + {0x1.487ffffff733fp7, 0x1.f2eb25494787dp236}, + {0x1.4a7ffffff733fp7, 0x1.530ce0608a8acp238}, + {0x1.4c7ffffff733fp7, 0x1.ccd12fa07172p239}, + {0x1.4e7ffffff733fp7, 0x1.39285fa9c08e7p241}, + {0x1.507ffffff733fp7, 0x1.a9a01de01fd02p242}, + {0x1.527ffffff733fp7, 0x1.213e13894e05p244}, + {0x1.547ffffff733fp7, 0x1.891f0d4674b33p245}, + {0x1.567ffffff733fp7, 0x1.0b275393c60b2p247}, + {0x1.587ffffff733fp7, 0x1.6b1973327581dp248}, + {0x1.5a7ffffff733fp7, 0x1.ed80d645874cfp249}, + {0x1.5c7ffffff733fp7, 0x1.4f5ec835b4172p251}, + {0x1.5e7ffffff733fp7, 0x1.c7d0bf3aec5fcp252}, + {0x1.607ffffff733fp7, 0x1.35c239a263125p254}, + {0x1.627ffffff733fp7, 0x1.a501765319bp255}, + {0x1.647ffffff733fp7, 0x1.1e1a611707cfbp257}, + {0x1.667ffffff733fp7, 0x1.84dab6dcaac3cp258}, + {0x1.687ffffff733fp7, 0x1.08410192ab89ep260}, + {0x1.6a7ffffff733fp7, 0x1.67288834edb2fp261}, + {0x1.6c7ffffff733fp7, 0x1.e825934abdad9p262}, + {0x1.6e7ffffff733fp7, 0x1.4bbae9c58a222p264}, + {0x1.707ffffff733fp7, 0x1.c2de34b24b161p265}, + {0x1.727ffffff733fp7, 0x1.3265856c8dbdcp267}, + {0x1.747ffffff733fp7, 0x1.a06fa4ee04c8ep268}, + {0x1.767ffffff733fp7, 0x1.1aff67d171068p270}, + {0x1.787ffffff733fp7, 0x1.80a23ba5cc0fep271}, + {0x1.7a7ffffff733fp7, 0x1.0562be333b5b6p273}, + {0x1.7c7ffffff733fp7, 0x1.6342909f8e806p274}, + {0x1.7e7ffffff733fp7, 0x1.e2d932898c11cp275}, + {0x1.807ffffff733ep7, 0x1.482128a65b0aap277}, + {0x1.827ffffff733ep7, 0x1.bdf9696894p278}, + {0x1.847ffffff733ep7, 0x1.2f1228ca0924p280}, + {0x1.867ffffff733ep7, 0x1.9bea8605e05b8p281}, + {0x1.887ffffff733ep7, 0x1.17ed0f7b60befp283}, + {0x1.8a7ffffff733ep7, 0x1.7c757ab028d2cp284}, + {0x1.8c7ffffff733ep7, 0x1.028c73122cbaap286}, + {0x1.8e7ffffff733ep7, 0x1.5f676e04b872p287}, + {0x1.907ffffff733ep7, 0x1.dd9b8aa6c07f4p288}, + {0x1.927ffffff733ep7, 0x1.449168bd6830bp290}, + {0x1.947ffffff733ep7, 0x1.b922372b1b22fp291}, + {0x1.967ffffff733ep7, 0x1.2bc809c589606p293}, + {0x1.987ffffff733ep7, 0x1.9771f652c776ap294}, + {0x1.9a7ffffff733ep7, 0x1.14e3401b07fc7p296}, + {0x1.9c7ffffff733ep7, 0x1.785453659b7d4p297}, + {0x1.9e7ffffff733ep7, 0x1.ff7c1414d829fp298}, + {0x1.a07ffffff733ep7, 0x1.5b97024b58a63p300}, + {0x1.a27ffffff733ep7, 0x1.d86c72ba13072p301}, + {0x1.a47ffffff733ep7, 0x1.410b8e3e0a59p303}, + {0x1.a67ffffff733ep7, 0x1.b458783157a34p304}, + {0x1.a87ffffff733ep7, 0x1.28870eb1e33efp306}, + {0x1.aa7ffffff733ep7, 0x1.9305d2eedd47p307}, + {0x1.ac7ffffff733ep7, 0x1.11e1e1f93656cp309}, + {0x1.ae7ffffff733ep7, 0x1.743ea58a8a142p310}, + {0x1.b07ffffff733ep7, 0x1.f9eeda68dbff6p311}, + {0x1.b27ffffff733ep7, 0x1.57d12fadfda18p313}, + {0x1.b47ffffff733ep7, 0x1.d34bc24ce61e7p314}, + {0x1.b67ffffff733ep7, 0x1.3d8f7da8d8d95p316}, + {0x1.b87ffffff733ep7, 0x1.af9c071bbd116p317}, + {0x1.ba7ffffff733ep7, 0x1.254f1e2943f7fp319}, + {0x1.bc7ffffff733ep7, 0x1.8ea5f9553ce5ep320}, + {0x1.be7ffffff733ep7, 0x1.0ee8dda0a100cp322}, + {0x1.c07ffffff733ep7, 0x1.7034513ceac7dp323}, + {0x1.c27ffffff733ep7, 0x1.f4710dcb08bdcp324}, + {0x1.c47ffffff733ep7, 0x1.5415d8b9ef19cp326}, + {0x1.c67ffffff733ep7, 0x1.ce3951590b045p327}, + {0x1.c87ffffff733ep7, 0x1.3a1d1bcad2ec4p329}, + {0x1.ca7ffffff733ep7, 0x1.aaecbef297a4ap330}, + {0x1.cc7ffffff733ep7, 0x1.22201f0c6ae88p332}, + {0x1.ce7ffffff733ep7, 0x1.8a524760ebdc1p333}, + {0x1.d07ffffff733ep7, 0x1.0bf81bdd2ba52p335}, + {0x1.d27ffffff733ep7, 0x1.6c3536f34b0c2p336}, + {0x1.d47ffffff733ep7, 0x1.ef02835e6a7d8p337}, + {0x1.d67ffffff733ep7, 0x1.5064e04e480fep339}, + {0x1.d87ffffff733ep7, 0x1.c934f847894a8p340}, + {0x1.da7ffffff733ep7, 0x1.36b44dbc8b633p342}, + {0x1.dc7ffffff733ep7, 0x1.a64a7b24ebae2p343}, + {0x1.de7ffffff733ep7, 0x1.1ef9f881e57b8p345}, + {0x1.e07ffffff733ep7, 0x1.860a9b4bcf9dfp346}, + {0x1.e27ffffff733ep7, 0x1.090f85bb33493p348}, + {0x1.e47ffffff733ep7, 0x1.6841377bd96e9p349}, + {0x1.e67ffffff733ep7, 0x1.e9a310bd2715dp350}, + {0x1.e87ffffff733ep7, 0x1.4cbe299b1372dp352}, + {0x1.ea7ffffff733ep7, 0x1.c43e8fef69d0dp353}, + {0x1.ec7ffffff733ep7, 0x1.3354f8e156a72p355}, + {0x1.ee7ffffff733ep7, 0x1.a1b51787582dfp356}, + {0x1.f07ffffff733ep7, 0x1.1bdc91f54d333p358}, + {0x1.f27ffffff733ep7, 0x1.81ced3ada5ec9p359}, + {0x1.f47ffffff733ep7, 0x1.062f0486db268p361}, + {0x1.f67ffffff733ep7, 0x1.645833fb72196p362}, + {0x1.f87ffffff733ep7, 0x1.e4528bf7332d2p363}, + {0x1.fa7ffffff733ep7, 0x1.492198206b3aep365}, + {0x1.fc7ffffff733ep7, 0x1.bf55f194851b5p366}, + {0x1.fe7ffffff733ep7, 0x1.2fff02e67affep368}, + {0x1.003ffffffb99fp8, 0x1.9d2c7052fc80ep369}, + {0x1.013ffffffb99fp8, 0x1.18c7d31687cep371}, + {0x1.023ffffffb99fp8, 0x1.7d9ecf7b00132p372}, + {0x1.033ffffffb99fp8, 0x1.035681cb5b766p374}, + {0x1.043ffffffb99fp8, 0x1.607a0decadfaep375}, + {0x1.053ffffffb99fp8, 0x1.df10cb910ae14p376}, + {0x1.063ffffffb99fp8, 0x1.458f0fad99f57p378}, + {0x1.073ffffffb99fp8, 0x1.ba7af6e654fa2p379}, + {0x1.083ffffffb99fp8, 0x1.2cb251c2631d6p381}, + {0x1.093ffffffb99fp8, 0x1.98b06224611f2p382}, + {0x1.0a3ffffffb99fp8, 0x1.15bba3d909807p384}, + {0x1.0b3ffffffb99fp8, 0x1.797a6e0440f8fp385}, + {0x1.0c3ffffffb99fp8, 0x1.0085e752522ap387}, + {0x1.0d3ffffffb99fp8, 0x1.5ca6a71ef489ep388}, + {0x1.0e3ffffffb99fp8, 0x1.d9dda6826dfc7p389}, + {0x1.0f3ffffffb99fp8, 0x1.420674603ebb2p391}, + {0x1.103ffffffb99fp8, 0x1.b5ad79fec979p392}, + {0x1.113ffffffb99fp8, 0x1.296ecbb3d2db7p394}, + {0x1.123ffffffb99fp8, 0x1.9440c9fa6362ap395}, + {0x1.133ffffffb99fp8, 0x1.12b7ec73193e4p397}, + {0x1.143ffffffb99fp8, 0x1.75618ef49dffep398}, + {0x1.153ffffffb99fp8, 0x1.fb7a3e462b12ap399}, + {0x1.163ffffffb99fp8, 0x1.58dde1b590206p401}, + {0x1.173ffffffb99fp8, 0x1.d4b8f4351faecp402}, + {0x1.183ffffffb99fp8, 0x1.3e87aaa373892p404}, + {0x1.193ffffffb99fp8, 0x1.b0ed5561210d9p405}, + {0x1.1a3ffffffb99fp8, 0x1.263457411e3a5p407}, + {0x1.1b3ffffffb99fp8, 0x1.8fdd8535244cdp408}, + {0x1.1c3ffffffb99fp8, 0x1.0fbc955d170d1p410}, + {0x1.1d3ffffffb99fp8, 0x1.7154125122a86p411}, + {0x1.1e3ffffffb99fp8, 0x1.f5f8270411675p412}, + {0x1.1f3ffffffb99fp8, 0x1.551fa026c4e4cp414}, + {0x1.203ffffffb99fp8, 0x1.cfa28c83a9c15p415}, + {0x1.213ffffffb99fp8, 0x1.3b12972ef5f7ap417}, + {0x1.223ffffffb99fp8, 0x1.ac3a63f8c3fc9p418}, + {0x1.233ffffffb99fp8, 0x1.2302db376285dp420}, + {0x1.243ffffffb99fp8, 0x1.8b867194fa443p421}, + {0x1.253ffffffb99fp8, 0x1.0cc98750c45aep423}, + {0x1.263ffffffb99fp8, 0x1.6d51d877b6f1bp424}, + {0x1.273ffffffb99fp8, 0x1.f0855ddfe3faap425}, + {0x1.283ffffffb99fp8, 0x1.516bc53aea3aap427}, + {0x1.293ffffffb99fp8, 0x1.ca9a47b823396p428}, + {0x1.2a3ffffffb99fp8, 0x1.37a71f0652462p430}, + {0x1.2b3ffffffb99fp8, 0x1.a794811822eb3p431}, + {0x1.2c3ffffffb99fp8, 0x1.1fda3ea9c1a4fp433}, + {0x1.2d3ffffffb99fp8, 0x1.873b6d3965cp434}, + {0x1.2e3ffffffb99fp8, 0x1.09deab488e539p436}, + {0x1.2f3ffffffb99fp8, 0x1.695ac21e2870ep437}, + {0x1.303ffffffb99fp8, 0x1.eb21b852a647cp438}, + {0x1.313ffffffb99fp8, 0x1.4dc2340b86b4cp440}, + {0x1.323ffffffb99fp8, 0x1.c59ffe8afa62cp441}, + {0x1.333ffffffb99fp8, 0x1.3445277810b78p443}, + {0x1.343ffffffb99fp8, 0x1.a2fb88779894fp444}, + {0x1.353ffffffb99fp8, 0x1.1cba68f09f8c5p446}, + {0x1.363ffffffb99fp8, 0x1.82fc56a008db6p447}, + {0x1.373ffffffb99fp8, 0x1.06fbea7eda2dfp449}, + {0x1.383ffffffb99fp8, 0x1.656eb0513614ep450}, + {0x1.393ffffffb99fp8, 0x1.e5cd0c4b86aaap451}, + {0x1.3a3ffffffb99fp8, 0x1.4a22d0026e7ffp453}, + {0x1.3b3ffffffb99fp8, 0x1.c0b38a21c236cp454}, + {0x1.3c3ffffffb99fp8, 0x1.30ec961ce5379p456}, + {0x1.3d3ffffffb99fp8, 0x1.9e6f56344e9dp457}, + {0x1.3e3ffffffb99fp8, 0x1.19a341a8e1ccbp459}, + {0x1.3f3ffffffb99fp8, 0x1.7ec90ca3a1c6dp460}, + {0x1.403ffffffb99fp8, 0x1.04212e6d536d6p462}, + {0x1.413ffffffb99fp8, 0x1.618d84739e91cp463}, + {0x1.423ffffffb99fp8, 0x1.e087302e9607ap464}, + {0x1.433ffffffb99fp8, 0x1.468d7cd8e4417p466}, + {0x1.443ffffffb99fp8, 0x1.bbd4c40e0317cp467}, + {0x1.453ffffffb99fp8, 0x1.2d9d50d6e1436p469}, + {0x1.463ffffffb99fp8, 0x1.99efc6cf25729p470}, + {0x1.473ffffffb99fp8, 0x1.1694b0b33138ap472}, + {0x1.483ffffffb99fp8, 0x1.7aa16e7b0810dp473}, + {0x1.493ffffffb99fp8, 0x1.014e60cc3c10bp475}, + {0x1.4a3ffffffb99fp8, 0x1.5db7203d316b3p476}, + {0x1.4b3ffffffb99fp8, 0x1.db4ffad383047p477}, + {0x1.4c3ffffffb99fp8, 0x1.43021e96bc60ep479}, + {0x1.4d3ffffffb99fp8, 0x1.b703864c0ed74p480}, + {0x1.4e3ffffffb99fp8, 0x1.2a573dd0a80e6p482}, + {0x1.4f3ffffffb99fp8, 0x1.957cb72b9f3f6p483}, + {0x1.503ffffffb99fp8, 0x1.138e9e333d9afp485}, + {0x1.513ffffffb99fp8, 0x1.76855bb82cbcep486}, + {0x1.523ffffffb99fp8, 0x1.fd06d7237d52bp487}, + {0x1.533ffffffb99fp8, 0x1.59eb65b9e296ap489}, + {0x1.543ffffffb99fp8, 0x1.d627438458c6ap490}, + {0x1.553ffffffb99fp8, 0x1.3f80999182b7ap492}, + {0x1.563ffffffb99fp8, 0x1.b23fab41d7fcdp493}, + {0x1.573ffffffb99fp8, 0x1.271a437ca4dd9p495}, + {0x1.583ffffffb99fp8, 0x1.9116048ecdd82p496}, + {0x1.593ffffffb99fp8, 0x1.1090f28f03784p498}, + {0x1.5a3ffffffb99fp8, 0x1.7274b4471d222p499}, + {0x1.5b3ffffffb99fp8, 0x1.f78071e284acfp500}, + {0x1.5c3ffffffb99fp8, 0x1.562a3748e0ae8p502}, + {0x1.5d3ffffffb99fp8, 0x1.d10ce1fc412f2p503}, + {0x1.5e3ffffffb99fp8, 0x1.3c08d26ba29edp505}, + {0x1.5f3ffffffb99fp8, 0x1.ad890dbdcc46ap506}, + {0x1.603ffffffb99fp8, 0x1.23e648944393ap508}, + {0x1.613ffffffb99fp8, 0x1.8cbb8c9e43a63p509}, + {0x1.623ffffffb99fp8, 0x1.0d9b966e13d61p511}, + {0x1.633ffffffb99fp8, 0x1.6e6f586d0888dp512}, + {0x1.643ffffffb99fp8, 0x1.f20966b5813aep513}, + {0x1.653ffffffb99fp8, 0x1.5273779badaf2p515}, + {0x1.663ffffffb99fp8, 0x1.cc00ae664a89p516}, + {0x1.673ffffffb99fp8, 0x1.389aae1391554p518}, + {0x1.683ffffffb99fp8, 0x1.a8df88f5b2588p519}, + {0x1.693ffffffb99fp8, 0x1.20bb34172b66ap521}, + {0x1.6a3ffffffb99fp8, 0x1.886d2d5f07833p522}, + {0x1.6b3ffffffb99fp8, 0x1.0aae72b8de01ep524}, + {0x1.6c3ffffffb99fp8, 0x1.6a7528c7487fep525}, + {0x1.6d3ffffffb99fp8, 0x1.eca18af43a36cp526}, + {0x1.6e3ffffffb99fp8, 0x1.4ec709b53a35fp528}, + {0x1.6f3ffffffb99fp8, 0x1.c702815c30a11p529}, + {0x1.703ffffffb99fp8, 0x1.353611c2fab72p531}, + {0x1.713ffffffb99fp8, 0x1.a442f8858a925p532}, + {0x1.723ffffffb99fp8, 0x1.1d98ed4a7bba3p534}, + {0x1.733ffffffb99fp8, 0x1.842ac5348b7cep535}, + {0x1.743ffffffb99fp8, 0x1.07c97097fb529p537}, + {0x1.753ffffffb99fp8, 0x1.6686064a6be2ap538}, + {0x1.763ffffffb99fp8, 0x1.e748b46cfe14cp539}, + {0x1.773ffffffb99fp8, 0x1.4b24d0e9033c7p541}, + {0x1.783ffffffb99fp8, 0x1.c21233e5293dap542}, + {0x1.793ffffffb99fp8, 0x1.31dae2fdf0407p544}, + {0x1.7a3ffffffb99fp8, 0x1.9fb3386e7303dp545}, + {0x1.7b3ffffffb99fp8, 0x1.1a7f5bb80b183p547}, + {0x1.7c3ffffffb99fp8, 0x1.7ff432dfa67a9p548}, + {0x1.7d3ffffffb99fp8, 0x1.04ec79737cde7p550}, + {0x1.7e3ffffffb99fp8, 0x1.62a1d2414486ep551}, + {0x1.7f3ffffffb99fp8, 0x1.e1feb963592a3p552}, + {0x1.803ffffffb99fp8, 0x1.478cb0da3248p554}, + {0x1.813ffffffb99fp8, 0x1.bd2f9f74b3ecep555}, + {0x1.823ffffffb99fp8, 0x1.2e8907921a545p557}, + {0x1.833ffffffb99fp8, 0x1.9b3025158e763p558}, + {0x1.843ffffffb99fp8, 0x1.176e672da841p560}, + {0x1.853ffffffb99fp8, 0x1.7bc9557d90bb5p561}, + {0x1.863ffffffb99fp8, 0x1.021776f23b20ap563}, + {0x1.873ffffffb99fp8, 0x1.5ec86e4bf78ccp564}, + {0x1.883ffffffb99fp8, 0x1.dcc3708ecfe88p565}, + {0x1.893ffffffb99fp8, 0x1.43fe8d7ac0079p567}, + {0x1.8a3ffffffb99fp8, 0x1.b85a9de96d206p568}, + {0x1.8b3ffffffb99fp8, 0x1.2b406595ebc2fp570}, + {0x1.8c3ffffffb99fp8, 0x1.96b99b42ee81ep571}, + {0x1.8d3ffffffb99fp8, 0x1.1465f7bc5d4f3p573}, + {0x1.8e3ffffffb99fp8, 0x1.77aa0c86e3254p574}, + {0x1.8f3ffffffb99fp8, 0x1.fe94a5f24f127p575}, + {0x1.903ffffffb99fp8, 0x1.5af9bc5f10484p577}, + {0x1.913ffffffb99fp8, 0x1.d796b1199ca0dp578}, + {0x1.923ffffffb99fp8, 0x1.407a4b0a99581p580}, + {0x1.933ffffffb99fp8, 0x1.b393098be48c6p581}, + {0x1.943ffffffb99fp8, 0x1.2800e367d7873p583}, + {0x1.953ffffffb99fp8, 0x1.924f782080a9p584}, + {0x1.963ffffffb99fp8, 0x1.1165f5b7b4e77p586}, + {0x1.973ffffffb99fp8, 0x1.739637ce995dep587}, + {0x1.983ffffffb99fp8, 0x1.f909ef553fe1dp588}, + {0x1.993ffffffb99fp8, 0x1.57359ec295bd8p590}, + {0x1.9a3ffffffb99fp8, 0x1.d278529f70c72p591}, + {0x1.9b3ffffffb99fp8, 0x1.3cffce16c6a9fp593}, + {0x1.9c3ffffffb99fp8, 0x1.aed8bd0d76c2ep594}, + {0x1.9d3ffffffb99fp8, 0x1.24ca67ad88b68p596}, + {0x1.9e3ffffffb99fp8, 0x1.8df19938fe6d4p597}, + {0x1.9f3ffffffb99fp8, 0x1.0e6e49b5016fbp599}, + {0x1.a03ffffffb99fp8, 0x1.6f8db78116a48p600}, + {0x1.a13ffffffb99fp8, 0x1.f38e9ecb87da4p601}, + {0x1.a23ffffffb99fp8, 0x1.537bf81122a93p603}, + {0x1.a33ffffffb99fp8, 0x1.cd682d2c39ab4p604}, + {0x1.a43ffffffb99fp8, 0x1.398efb7895c02p606}, + {0x1.a53ffffffb99fp8, 0x1.aa2b938729ffap607}, + {0x1.a63ffffffb99fp8, 0x1.219cd9531c9cep609}, + {0x1.a73ffffffb99fp8, 0x1.899fdc76e059bp610}, + {0x1.a83ffffffb99fp8, 0x1.0b7edc8aa647ep612}, + {0x1.a93ffffffb99fp8, 0x1.6b906c232d65ep613}, + {0x1.aa3ffffffb99fp8, 0x1.ee22898b97fbep614}, + {0x1.ab3ffffffb99fp8, 0x1.4fccab37000cep616}, + {0x1.ac3ffffffb99fp8, 0x1.c866193ae89dbp617}, + {0x1.ad3ffffffb99fp8, 0x1.3627b854c5c27p619}, + {0x1.ae3ffffffb99fp8, 0x1.a58b68788e1e6p620}, + {0x1.af3ffffffb99fp8, 0x1.1e781f8a5efe5p622}, + {0x1.b03ffffffb99fp8, 0x1.855a202353f77p623}, + {0x1.b13ffffffb99fp8, 0x1.0897974f62fe1p625}, + {0x1.b23ffffffb99fp8, 0x1.679e369129826p626}, + {0x1.b33ffffffb99fp8, 0x1.e8c58542c521dp627}, + {0x1.b43ffffffb99fp8, 0x1.4c279b7142392p629}, + {0x1.b53ffffffb99fp8, 0x1.c371efb43e76ep630}, + {0x1.b63ffffffb99fp8, 0x1.32c9ea1ab59ccp632}, + {0x1.b73ffffffb99fp8, 0x1.a0f817c69fb0ap633}, + {0x1.b83ffffffb99fp8, 0x1.1b5c21ca08788p635}, + {0x1.b93ffffffb99fp8, 0x1.812042e534a64p636}, + {0x1.ba3ffffffb99fp8, 0x1.05b86359a079cp638}, + {0x1.bb3ffffffb99fp8, 0x1.63b6f7fddd3efp639}, + {0x1.bc3ffffffb99fp8, 0x1.e3776813fda8ep640}, + {0x1.bd3ffffffb99fp8, 0x1.488cac4ce84e7p642}, + {0x1.be3ffffffb99fp8, 0x1.be8b89ed9a77dp643}, + {0x1.bf3ffffffb99fp8, 0x1.2f75768394a5p645}, + {0x1.c03ffffffb99fp8, 0x1.9c717dbaae2b8p646}, + {0x1.c13ffffffb99fp8, 0x1.1848c7ccfefe3p648}, + {0x1.c23ffffffb99fp8, 0x1.7cf223c0074fbp649}, + {0x1.c33ffffffb99fp8, 0x1.02e12a3ec0173p651}, + {0x1.c43ffffffb99fp8, 0x1.5fda91f1b0d98p652}, + {0x1.c53ffffffb99fp8, 0x1.de38089682abp653}, + {0x1.c63ffffffb99fp8, 0x1.44fbc1a5fe2ddp655}, + {0x1.c73ffffffb99fp8, 0x1.b9b2c1a7cc7aap656}, + {0x1.c83ffffffb99fp8, 0x1.2c2a43919580dp658}, + {0x1.c93ffffffb99fp8, 0x1.97f7770145248p659}, + {0x1.ca3ffffffb99fp8, 0x1.153df9919867p661}, + {0x1.cb3ffffffb99fp8, 0x1.78cfa212f8edcp662}, + {0x1.cc3ffffffb99fp8, 0x1.0011d5d26caedp664}, + {0x1.cd3ffffffb99fp8, 0x1.5c08e649b4b94p665}, + {0x1.ce3ffffffb99fp8, 0x1.d9073dd4a4c7bp666}, + {0x1.cf3ffffffb99fp8, 0x1.4174bfa6c0d24p668}, + {0x1.d03ffffffb99fp8, 0x1.b4e7710dea691p669}, + {0x1.d13ffffffb99fp8, 0x1.28e8378f2345ap671}, + {0x1.d23ffffffb99fp8, 0x1.9389e0a91894fp672}, + {0x1.d33ffffffb99fp8, 0x1.123b9f58df0dap674}, + {0x1.d43ffffffb99fp8, 0x1.74b89d97dfdd3p675}, + {0x1.d53ffffffb99fp8, 0x1.fa94a04bdb05cp676}, + {0x1.d63ffffffb99fp8, 0x1.5841d736b633cp678}, + {0x1.d73ffffffb99fp8, 0x1.d3e4df4a846ddp679}, + {0x1.d83ffffffb99fp8, 0x1.3df78ac6c50cep681}, + {0x1.d93ffffffb99fp8, 0x1.b02972b428f19p682}, + {0x1.da3ffffffb99fp8, 0x1.25af390e18cbep684}, + {0x1.db3ffffffb99fp8, 0x1.8f289821f41b9p685}, + {0x1.dc3ffffffb99fp8, 0x1.0f41a1a5d8764p687}, + {0x1.dd3ffffffb99fp8, 0x1.70acf6623ff32p688}, + {0x1.de3ffffffb99fp8, 0x1.f515070ef61acp689}, + {0x1.df3ffffffb99fp8, 0x1.5485473c56dfcp691}, + {0x1.e03ffffffb99fp8, 0x1.ced0c4e4d59e4p692}, + {0x1.e13ffffffb99fp8, 0x1.3a8407ca209c6p694}, + {0x1.e23ffffffb99fp8, 0x1.ab78a196b76fdp695}, + {0x1.e33ffffffb99fp8, 0x1.227f2ee6fa305p697}, + {0x1.e43ffffffb99fp8, 0x1.8ad37b3bad33ep698}, + {0x1.e53ffffffb99fp8, 0x1.0c4fe93ccdf88p700}, + {0x1.e63ffffffb99fp8, 0x1.6cac8cde514efp701}, + {0x1.e73ffffffb99fp8, 0x1.efa4b5032b54fp702}, + {0x1.e83ffffffb99fp8, 0x1.50d31930266e8p704}, + {0x1.e93ffffffb99fp8, 0x1.c9cac6ffa71cbp705}, + {0x1.ea3ffffffb99fp8, 0x1.371a1bc09599dp707}, + {0x1.eb3ffffffb99fp8, 0x1.a6d4d9189f018p708}, + {0x1.ec3ffffffb99fp8, 0x1.1f580038307ccp710}, + {0x1.ed3ffffffb99fp8, 0x1.868a6825185b7p711}, + {0x1.ee3ffffffb99fp8, 0x1.09665f229766bp713}, + {0x1.ef3ffffffb99fp8, 0x1.68b741d009e02p714}, + {0x1.f03ffffffb99fp8, 0x1.ea437fb4bc319p715}, + {0x1.f13ffffffb99fp8, 0x1.4d2b3038bf046p717}, + {0x1.f23ffffffb99ep8, 0x1.c4d2be652cea4p718}, + {0x1.f33ffffffb99ep8, 0x1.33b9ac04c0212p720}, + {0x1.f43ffffffb99ep8, 0x1.a23df502a4a3ap721}, + {0x1.f53ffffffb99ep8, 0x1.1c39946547606p723}, + {0x1.f63ffffffb99ep8, 0x1.824d3d6b0103dp724}, + {0x1.f73ffffffb99ep8, 0x1.0684ec9be79c4p726}, + {0x1.f83ffffffb99ep8, 0x1.64ccf65229834p727}, + {0x1.f93ffffffb99ep8, 0x1.e4f13d25df78ap728}, + {0x1.fa3ffffffb99ep8, 0x1.498d6fcce3f5ep730}, + {0x1.fb3ffffffb99ep8, 0x1.bfe8844c8ea89p731}, + {0x1.fc3ffffffb99ep8, 0x1.30629e3b46a18p733}, + {0x1.fd3ffffffb99ep8, 0x1.9db3d1822eed1p734}, + {0x1.fe3ffffffb99ep8, 0x1.1923d3162d5cep736}, + {0x1.ff3ffffffb99ep8, 0x1.7e1bd9f724dbcp737}, + {0x1.001ffffffdccfp9, 0x1.03ab7b2c9b517p739}, + {0x1.009ffffffdccfp9, 0x1.60ed8bd54933ep740}, + {0x1.011ffffffdccfp9, 0x1.dfadc3cd79f32p741}, + {0x1.019ffffffdccfp9, 0x1.45f9bbb2a35d1p743}, + {0x1.021ffffffdccfp9, 0x1.bb0bf258b833ap744}, + {0x1.029ffffffdccfp9, 0x1.2d14d8520baf7p746}, + {0x1.031ffffffdccfp9, 0x1.99364b282dd34p747}, + {0x1.039ffffffdccfp9, 0x1.1616a4367556fp749}, + {0x1.041ffffffdccfp9, 0x1.79f61d0f30fbp750}, + {0x1.049ffffffdccfp9, 0x1.00d9f49709365p752}, + {0x1.051ffffffdccfp9, 0x1.5d18e41eebfc4p753}, + {0x1.059ffffffdccfp9, 0x1.da78ea95d97f9p754}, + {0x1.061ffffffdccfp9, 0x1.426ff7fe794b6p756}, + {0x1.069ffffffdccfp9, 0x1.b63ce2972ea1ep757}, + {0x1.071ffffffdccfp9, 0x1.29d0407f62d33p759}, + {0x1.079ffffffdccfp9, 0x1.94c53ee806803p760}, + {0x1.081ffffffdccfp9, 0x1.1311eff49ae9ap762}, + {0x1.089ffffffdccfp9, 0x1.75dbe653c2ceap763}, + {0x1.091ffffffdccfp9, 0x1.fc2085b6a9375p764}, + {0x1.099ffffffdccfp9, 0x1.594ee148935c8p766}, + {0x1.0a1ffffffdccfp9, 0x1.d55288db74dc3p767}, + {0x1.0a9ffffffdccfp9, 0x1.3ef00912762eap769}, + {0x1.0b1ffffffdccfp9, 0x1.b17b2f7ee7f4ep770}, + {0x1.0b9ffffffdccfp9, 0x1.2694bd41472c4p772}, + {0x1.0c1ffffffdccfp9, 0x1.90608a1681a3ep773}, + {0x1.0c9ffffffdccfp9, 0x1.10159ec1486a4p775}, + {0x1.0d1ffffffdccfp9, 0x1.71cd15bf6b516p776}, + {0x1.0d9ffffffdccfp9, 0x1.f69ca06d83551p777}, + {0x1.0e1ffffffdccfp9, 0x1.558f65bed5d1ap779}, + {0x1.0e9ffffffdccfp9, 0x1.d03a766bae541p780}, + {0x1.0f1ffffffdccfp9, 0x1.3b79d39d672c6p782}, + {0x1.0f9ffffffdccfp9, 0x1.acc6b3ef261e7p783}, + {0x1.101ffffffdccfp9, 0x1.2362355c94574p785}, + {0x1.109ffffffdccfp9, 0x1.8c080a68bcd97p786}, + {0x1.111ffffffdccfp9, 0x1.0d21994e9f02ap788}, + {0x1.119ffffffdccfp9, 0x1.6dc98ba5b51bp789}, + {0x1.121ffffffdccfp9, 0x1.f1280e4617147p790}, + {0x1.129ffffffdccfp9, 0x1.51da544077fa2p792}, + {0x1.131ffffffdccfp9, 0x1.cb308b8399fb7p793}, + {0x1.139ffffffdccfp9, 0x1.380d3c9a00e7ep795}, + {0x1.141ffffffdccfp9, 0x1.a81f4b2e55334p796}, + {0x1.149ffffffdccfp9, 0x1.20388fdc417d5p798}, + {0x1.151ffffffdccfp9, 0x1.87bb9df31efbp799}, + {0x1.159ffffffdccfp9, 0x1.0a35c88f80cbp801}, + {0x1.161ffffffdccfp9, 0x1.69d128b22d25ap802}, + {0x1.169ffffffdccfp9, 0x1.ebc2a4ab78bb5p803}, + {0x1.171ffffffdccfp9, 0x1.4e2f8fdd883d6p805}, + {0x1.179ffffffdccfp9, 0x1.c634a0cec7546p806}, + {0x1.181ffffffdccfp9, 0x1.34aa294e0c99ep808}, + {0x1.189ffffffdccfp9, 0x1.a384d0e8ecc3p809}, + {0x1.191ffffffdccfp9, 0x1.1d17b4109e865p811}, + {0x1.199ffffffdccfp9, 0x1.837b23284f5e9p812}, + {0x1.1a1ffffffdccfp9, 0x1.075215b6dcdc8p814}, + {0x1.1a9ffffffdccfp9, 0x1.65e3cde76e421p815}, + {0x1.1b1ffffffdccfp9, 0x1.e66c397f0e285p816}, + {0x1.1b9ffffffdccfp9, 0x1.4a8efbf67ceccp818}, + {0x1.1c1ffffffdccfp9, 0x1.c1468f660e51bp819}, + {0x1.1c9ffffffdccfp9, 0x1.31507f4997713p821}, + {0x1.1d1ffffffdccfp9, 0x1.9ef72130544cep822}, + {0x1.1d9ffffffdccfp9, 0x1.19ff898e9368dp824}, + {0x1.1e1ffffffdccfp9, 0x1.7f4678d82ff18p825}, + {0x1.1e9ffffffdccfp9, 0x1.04766a36fd582p827}, + {0x1.1f1ffffffdccfp9, 0x1.62015c9e2f34p828}, + {0x1.1f9ffffffdccfp9, 0x1.e124a317460fp829}, + {0x1.201ffffffdccfp9, 0x1.46f87c3b54d8ep831}, + {0x1.209ffffffdccfp9, 0x1.bc6630ce5faecp832}, + {0x1.211ffffffdccfp9, 0x1.2e00246624382p834}, + {0x1.219ffffffdccfp9, 0x1.9a761879cac82p835}, + {0x1.221ffffffdccfp9, 0x1.16eff82ee1911p837}, + {0x1.229ffffffdccfp9, 0x1.7b1d7e2eda2c6p838}, + {0x1.231ffffffdccfp9, 0x1.01a2afc0d75c2p840}, + {0x1.239ffffffdccfp9, 0x1.5e29b684536ep841}, + {0x1.241ffffffdccfp9, 0x1.dbebb83e52c5dp842}, + {0x1.249ffffffdccfp9, 0x1.436bf4aaba53p844}, + {0x1.251ffffffdccfp9, 0x1.b7935ef798935p845}, + {0x1.259ffffffdccfp9, 0x1.2ab8fec5df362p847}, + {0x1.261ffffffdccfp9, 0x1.9601939d5137dp848}, + {0x1.269ffffffdccfp9, 0x1.13e8e80d6759dp850}, + {0x1.271ffffffdccfp9, 0x1.770012b39ed67p851}, + {0x1.279ffffffdccfp9, 0x1.fdada086b9c52p852}, + {0x1.281ffffffdccfp9, 0x1.5a5cbd9bfe665p854}, + {0x1.289ffffffdccfp9, 0x1.d6c15030e89c1p855}, + {0x1.291ffffffdccfp9, 0x1.3fe9499128953p857}, + {0x1.299ffffffdccfp9, 0x1.b2cdf43b59797p858}, + {0x1.2a1ffffffdccfp9, 0x1.277af4d2d449ap860}, + {0x1.2a9ffffffdccfp9, 0x1.91996fd498417p861}, + {0x1.2b1ffffffdccfp9, 0x1.10ea41886590dp863}, + {0x1.2b9ffffffdccfp9, 0x1.72ee16480890ep864}, + {0x1.2c1ffffffdccfp9, 0x1.f8256bd5a1072p865}, + {0x1.2c9ffffffdccfp9, 0x1.569a543aa97d8p867}, + {0x1.2d1ffffffdccfp9, 0x1.d1a5429cffadp868}, + {0x1.2d9ffffffdccfp9, 0x1.3c705f8813894p870}, + {0x1.2e1ffffffdccfp9, 0x1.ae15cb5be04dap871}, + {0x1.2e9ffffffdccfp9, 0x1.2445ed3e27324p873}, + {0x1.2f1ffffffdccfp9, 0x1.8d3d8ab9f0bdep874}, + {0x1.2f9ffffffdccfp9, 0x1.0df3ed3fc701dp876}, + {0x1.301ffffffdccfp9, 0x1.6ee76926e122bp877}, + {0x1.309ffffffdccfp9, 0x1.f2ac9640362cap878}, + {0x1.311ffffffdccfp9, 0x1.52e25d083c6f6p880}, + {0x1.319ffffffdccfp9, 0x1.cc9767a099276p881}, + {0x1.321ffffffdccfp9, 0x1.39011b7511e91p883}, + {0x1.329ffffffdccfp9, 0x1.a96abf82e5bedp884}, + {0x1.331ffffffdccfp9, 0x1.2119ceff4e062p886}, + {0x1.339ffffffdccfp9, 0x1.88edc2473f3cfp887}, + {0x1.341ffffffdccfp9, 0x1.0b05d4146a019p889}, + {0x1.349ffffffdccfp9, 0x1.6aebebe3397ccp890}, + {0x1.351ffffffdccfp9, 0x1.ed42f5104656ep891}, + {0x1.359ffffffdccfp9, 0x1.4f34bafe2847bp893}, + {0x1.361ffffffdccfp9, 0x1.c79797c887ff8p894}, + {0x1.369ffffffdccfp9, 0x1.359b628909b0ap896}, + {0x1.371ffffffdccfp9, 0x1.a4ccac407db6ep897}, + {0x1.379ffffffdccfp9, 0x1.1df681534dcc2p899}, + {0x1.381ffffffdccfp9, 0x1.84a9f4d4f272ap900}, + {0x1.389ffffffdccfp9, 0x1.081fdf276bf44p902}, + {0x1.391ffffffdccfp9, 0x1.66fb7f67746f6p903}, + {0x1.399ffffffdccfp9, 0x1.e7e85e064cb73p904}, + {0x1.3a1ffffffdccfp9, 0x1.4b91516684d28p906}, + {0x1.3a9ffffffdccfp9, 0x1.c2a5ac0f3d022p907}, + {0x1.3b1ffffffdccfp9, 0x1.323f1a3f5edc4p909}, + {0x1.3b9ffffffdccfp9, 0x1.a03b6d89faf11p910}, + {0x1.3c1ffffffdccfp9, 0x1.1adbebbbf9351p912}, + {0x1.3c9ffffffdccfp9, 0x1.80720118fc863p913}, + {0x1.3d1ffffffdccfp9, 0x1.0541f7d976c95p915}, + {0x1.3d9ffffffdccfp9, 0x1.631604f454091p916}, + {0x1.3e1ffffffdccfp9, 0x1.e29ca75828ca4p917}, + {0x1.3e9ffffffdccfp9, 0x1.47f803db3082ep919}, + {0x1.3f1ffffffdccfp9, 0x1.bdc17ddb963f2p920}, + {0x1.3f9ffffffdccfp9, 0x1.2eec285d246c2p922}, + {0x1.401ffffffdccfp9, 0x1.9bb6dfb8d5a7bp923}, + {0x1.409ffffffdccfp9, 0x1.17c9f5ff316ddp925}, + {0x1.411ffffffdccfp9, 0x1.7c45c625cf3bcp926}, + {0x1.419ffffffdccfp9, 0x1.026c07ca1067p928}, + {0x1.421ffffffdccfp9, 0x1.5f3b5e200997dp929}, + {0x1.429ffffffdccfp9, 0x1.dd5fa7afd8289p930}, + {0x1.431ffffffdccfp9, 0x1.4468b644f2c7fp932}, + {0x1.439ffffffdccfp9, 0x1.b8eae6ffb1c26p933}, + {0x1.441ffffffdccfp9, 0x1.2ba272f04fa72p935}, + {0x1.449ffffffdccfp9, 0x1.973edf89954efp936}, + {0x1.451ffffffdccfp9, 0x1.14c088262904bp938}, + {0x1.459ffffffdccfp9, 0x1.782523695aef2p939}, + {0x1.461ffffffdccfp9, 0x1.ff3bf1add8023p940}, + {0x1.469ffffffdccfp9, 0x1.5b6b6cd54844dp942}, + {0x1.471ffffffdccfp9, 0x1.d831362a33e02p943}, + {0x1.479ffffffdccfp9, 0x1.40e34cdaa0c9dp945}, + {0x1.481ffffffdccfp9, 0x1.b421c1b7c391cp946}, + {0x1.489ffffffdccfp9, 0x1.2861e04eed965p948}, + {0x1.491ffffffdccfp9, 0x1.92d34a1abd55p949}, + {0x1.499ffffffdccfp9, 0x1.11bf8a7ca8dc9p951}, + {0x1.4a1ffffffdccfp9, 0x1.740ff8ac10594p952}, + {0x1.4a9ffffffdccfp9, 0x1.f9af6a367aa8cp953}, + {0x1.4b1ffffffdccfp9, 0x1.57a613525a444p955}, + {0x1.4b9ffffffdccfp9, 0x1.d3112a55b14f7p956}, + {0x1.4c1ffffffdccfp9, 0x1.3d67ac204487bp958}, + {0x1.4c9ffffffdccfp9, 0x1.af65e8a8eee76p959}, + {0x1.4d1ffffffdccfp9, 0x1.252a57165ab35p961}, + {0x1.4d9ffffffdccfp9, 0x1.8e73fcebbcdf2p962}, + {0x1.4e1ffffffdccfp9, 0x1.0ec6e5905727p964}, + {0x1.4e9ffffffdccfp9, 0x1.7006260fe518p965}, + {0x1.4f1ffffffdccfp9, 0x1.f4324dde1b853p966}, + {0x1.4f9ffffffdccfp9, 0x1.53eb342838912p968}, + {0x1.501ffffffdccfp9, 0x1.cdff5c312677p969}, + {0x1.509ffffffdccfp9, 0x1.39f5b8e646512p971}, + {0x1.511ffffffdccfp9, 0x1.aab736e0229e8p972}, + {0x1.519ffffffdccfp9, 0x1.21fbbe2a7cc33p974}, + {0x1.521ffffffdccfp9, 0x1.8a20d5dbe17b1p975}, + {0x1.529ffffffdccfp9, 0x1.0bd6823000616p977}, + {0x1.531ffffffdccfp9, 0x1.6c078c0f5af0cp978}, + {0x1.539ffffffdccfp9, 0x1.eec471cd26923p979}, + {0x1.541ffffffdccfp9, 0x1.503ab239a52eep981}, + {0x1.549ffffffdccfp9, 0x1.c8fba42a91b8p982}, + {0x1.551ffffffdccfp9, 0x1.368d584898928p984}, + {0x1.559ffffffdccfp9, 0x1.a61587d0f8cb4p985}, + {0x1.561ffffffdccfp9, 0x1.1ed5fcb4fed8p987}, + {0x1.569ffffffdccfp9, 0x1.85d9b3294cbccp988}, + {0x1.571ffffffdccfp9, 0x1.08ee496ae24e1p990}, + {0x1.579ffffffdccfp9, 0x1.68140b7c89c5cp991}, + {0x1.581ffffffdccfp9, 0x1.e965aba3129a2p992}, + {0x1.589ffffffdccfp9, 0x1.4c9470ba47e91p994}, + {0x1.591ffffffdccfp9, 0x1.c405db1de4f69p995}, + {0x1.599ffffffdccfp9, 0x1.332e6fade5fp997}, + {0x1.5a1ffffffdccfp9, 0x1.a180b7549973p998}, + {0x1.5a9ffffffdccfp9, 0x1.1bb8fa248f731p1000}, + {0x1.5b1ffffffdccfp9, 0x1.819e736fecc0ap1001}, + {0x1.5b9ffffffdccfp9, 0x1.060e248ff8e45p1003}, + {0x1.5c1ffffffdccfp9, 0x1.642b85802c37dp1004}, + {0x1.5c9ffffffdccfp9, 0x1.e415d17516714p1005}, + {0x1.5d1ffffffdccfp9, 0x1.48f8532dcd8aap1007}, + {0x1.5d9ffffffdccfp9, 0x1.bf1dda53d4168p1008}, + {0x1.5e1ffffffdccfp9, 0x1.2fd8e4c6c1a74p1010}, + {0x1.5e9ffffffdccfp9, 0x1.9cf8a1a8a05e1p1011}, + {0x1.5f1ffffffdccfp9, 0x1.18a49e2c20c14p1013}, + {0x1.5f9ffffffdccfp9, 0x1.7d6ef5a877896p1014}, + {0x1.601ffffffdccfp9, 0x1.0335fd2d4d32ap1016}, + {0x1.609ffffffdccfp9, 0x1.604ddb98aeeb6p1017}, + {0x1.611ffffffdccfp9, 0x1.ded4b9cce1c65p1018}, + {0x1.619ffffffdccep9, 0x1.45663d67095d1p1020}, + {0x1.621ffffffdccep9, 0x1.ba437b80a6915p1021}, + {0x1.629ffffffdccep9, 0x1.2c8c9d8cda0c8p1023}, + }; + + for (double[] testCase: testCases) + failures+=testExpm1Case(testCase[0], testCase[1]); + + return failures; + } + + public static void main(String [] argv) { + int failures = 0; + + failures += testExpm1(); + + if (failures > 0) { + System.err.println("Testing expm1 incurred " + + failures + " failures."); + throw new RuntimeException(); + } + } +} diff --git a/jdk/test/java/lang/StrictMath/HyperbolicTests.java b/jdk/test/java/lang/StrictMath/HyperbolicTests.java new file mode 100644 index 00000000000..7cb135abf86 --- /dev/null +++ b/jdk/test/java/lang/StrictMath/HyperbolicTests.java @@ -0,0 +1,280 @@ +/* + * Copyright 2003-2004 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4851625 + * @summary Tests for StrictMath.{sinh, cosh, tanh} + * @author Joseph D. Darcy + */ + +/** + * The tests in ../Math/HyperbolicTests.java test properties that + * should hold for any implementation of the hyperbolic functions + * sinh, cos, and tanh, including the FDLIBM-based ones required by + * the StrictMath class. Therefore, the test cases in + * ../Math/HyperbolicTests.java are run against both the Math and + * StrictMath versions of the hyperbolic methods. The role of this + * test is to verify that the FDLIBM algorithms are being used by + * running golden file tests on values that may vary from one + * conforming implementation of the hyperbolics to another. + */ + +public class HyperbolicTests { + private HyperbolicTests(){} + + static int testSinhCase(double input, double expected) { + return Tests.test("StrictMath.sinh(double)", input, + StrictMath.sinh(input), expected); + } + + static int testCoshCase(double input, double expected) { + return Tests.test("StrictMath.cosh(double)", input, + StrictMath.cosh(input), expected); + } + + static int testTanhCase(double input, double expected) { + return Tests.test("StrictMath.tanh(double)", input, + StrictMath.tanh(input), expected); + } + + static int testSinh() { + int failures = 0; + double [][] testCases = { + {0x1.5798ee2308c3ap-27, 0x1.5798ee2308c3bp-27}, + {0x1.ffffffffffff8p-26, 0x1.ffffffffffffap-26}, + {0x1.ffffffffffffep-26, 0x1.0p-25}, + {0x1.ffffffffffff8p-25, 0x1.ffffffffffffep-25}, + {0x1.ffffffffffffap-25, 0x1.0p-24}, + {0x1.ad7f29abcaf47p-24, 0x1.ad7f29abcaf53p-24}, + {0x1.ad7f29abcaf48p-24, 0x1.ad7f29abcaf54p-24}, + {0x1.fffffffffffeap-24, 0x1.0p-23}, + {0x1.ffffffffffff8p-24, 0x1.0000000000007p-23}, + {0x1.fffffffffffaap-23, 0x1.0p-22}, + {0x1.ffffffffffff8p-23, 0x1.0000000000027p-22}, + {0x1.ffffffffffeaap-22, 0x1.0p-21}, + {0x1.ffffffffffff8p-22, 0x1.00000000000a7p-21}, + {0x1.ffffffffffaaap-21, 0x1.0p-20}, + {0x1.ffffffffffff8p-21, 0x1.00000000002a7p-20}, + {0x1.0c6f7a0b5ed8cp-20, 0x1.0c6f7a0b5f09fp-20}, + {0x1.0c6f7a0b5ed8dp-20, 0x1.0c6f7a0b5f0ap-20}, + {0x1.fffffffffeaaap-20, 0x1.0p-19}, + {0x1.ffffffffffff8p-20, 0x1.0000000000aa7p-19}, + {0x1.ffffffffffff8p-19, 0x1.0000000002aa7p-18}, + {0x1.ffffffffffff7p-18, 0x1.000000000aaa6p-17}, + {0x1.4f8b588e368d9p-17, 0x1.4f8b588e4e928p-17}, + {0x1.ffffffffffffep-17, 0x1.000000002aaa9p-16}, + {0x1.0p-16, 0x1.000000002aaaap-16}, + {0x1.fffffffffffffp-16, 0x1.00000000aaaabp-15}, + {0x1.fffffffffeaaap-15, 0x1.00000002aap-14}, + {0x1.ffffffffffffep-15, 0x1.00000002aaaa9p-14}, + {0x1.0p-14, 0x1.00000002aaaaap-14}, + {0x1.a36e2eb1c3dd4p-14, 0x1.a36e2ebd7e43ap-14}, + {0x1.a36e2eb1c3f8cp-14, 0x1.a36e2ebd7e5f1p-14}, + {0x1.a36e2eb1c432cp-14, 0x1.a36e2ebd7e991p-14}, + {0x1.fffffffffffffp-14, 0x1.0000000aaaaabp-13}, + {0x1.ffffffffffffep-13, 0x1.0000002aaaaa9p-12}, + {0x1.0p-12, 0x1.0000002aaaaaap-12}, + {0x1.ffffffffff7f9p-12, 0x1.000000aaaa6a9p-11}, + {0x1.fffffffffffffp-12, 0x1.000000aaaaaadp-11}, + {0x1.ffffffffffffep-11, 0x1.000002aaaaacbp-10}, + {0x1.0p-10, 0x1.000002aaaaaccp-10}, + {0x1.0624dd2f1a79p-10, 0x1.0624e00c1c776p-10}, + {0x1.0624dd2f1a8c9p-10, 0x1.0624e00c1c8bp-10}, + {0x1.0624dd2f1a9fcp-10, 0x1.0624e00c1c9e3p-10}, + {0x1.ffffffffffffep-10, 0x1.00000aaaaaccbp-9}, + {0x1.0p-9, 0x1.00000aaaaacccp-9}, + {0x1.ffffffffffe4ap-9, 0x1.00002aaaacbf2p-8}, + {0x1.fffffffffffffp-9, 0x1.00002aaaacccdp-8}, + {0x1.fffffffffff9dp-8, 0x1.0000aaaaccc9bp-7}, + {0x1.ffffffffffffep-8, 0x1.0000aaaacccccp-7}, + {0x1.0p-7, 0x1.0000aaaaccccdp-7}, + {0x1.47ae147ae146fp-7, 0x1.47af7a654e9e2p-7}, + {0x1.47ae147ae147ap-7, 0x1.47af7a654e9eep-7}, + {0x1.47ae147ae147bp-7, 0x1.47af7a654e9efp-7}, + {0x1.fffffffffffb6p-7, 0x1.0002aaaccccb4p-6}, + {0x1.fffffffffffcap-7, 0x1.0002aaaccccbep-6}, + {0x1.ffffffffffff7p-7, 0x1.0002aaaccccd5p-6}, + {0x1.fffffffffffe9p-6, 0x1.000aaacccd001p-5}, + {0x1.ffffffffffff7p-6, 0x1.000aaacccd008p-5}, + {0x1.fffffffffffffp-6, 0x1.000aaacccd00dp-5}, + {0x1.ffffffffffff6p-5, 0x1.002aacccd9cd7p-4}, + {0x1.ffffffffffff8p-5, 0x1.002aacccd9cd9p-4}, + {0x1.0p-4, 0x1.002aacccd9cddp-4}, + {0x1.9999999999995p-4, 0x1.9a487337b59afp-4}, + {0x1.9999999999996p-4, 0x1.9a487337b59afp-4}, + {0x1.9999999999998p-4, 0x1.9a487337b59b1p-4}, + {0x1.ffffffffffffap-4, 0x1.00aaccd00d2edp-3}, + {0x1.ffffffffffffcp-4, 0x1.00aaccd00d2efp-3}, + {0x1.ffffffffffff3p-3, 0x1.02accd9d080fbp-2}, + {0x1.ffffffffffffdp-3, 0x1.02accd9d08101p-2}, + {0x1.fffffffffffffp-3, 0x1.02accd9d08101p-2}, + {0x1.fffffffffffecp-2, 0x1.0acd00fe63b8cp-1}, + {0x1.ffffffffffffcp-2, 0x1.0acd00fe63b94p-1}, + {0x1.0p-1, 0x1.0acd00fe63b97p-1}, + {0x1.ffffffffffff6p-1, 0x1.2cd9fc44eb97ap0}, + {0x1.ffffffffffffep-1, 0x1.2cd9fc44eb981p0}, + {0x1.fffffffffffffp0, 0x1.d03cf63b6e19ep1}, + {0x1.0p1, 0x1.d03cf63b6e1ap1}, + {0x1.fffffffffffffp1, 0x1.b4a380370362dp4}, + {0x1.0p2, 0x1.b4a380370363p4}, + {0x1.ffffffffffffcp2, 0x1.749ea514eca4ep10}, + {0x1.0p3, 0x1.749ea514eca66p10}, + {0x1.fffffffffffffp3, 0x1.0f2ebd0a7ffdcp22}, + {0x1.0p4, 0x1.0f2ebd0a7ffe4p22}, + {0x1.fffffffffff68p4, 0x1.1f43fcc4b5b83p45}, + {0x1.fffffffffffd4p4, 0x1.1f43fcc4b6316p45}, + {0x1.0p5, 0x1.1f43fcc4b662cp45}, + }; + + for (double[] testCase: testCases) + failures+=testSinhCase(testCase[0], testCase[1]); + + return failures; + } + + static int testCosh() { + int failures = 0; + double [][] testCases = { + {0x1.fffffffffb49fp-8, 0x1.00020000aaaabp0}, + {0x1.47ae147ae0e45p-7, 0x1.000346de27853p0}, + {0x1.fffffffffd9f3p-7, 0x1.0008000aaab05p0}, + {0x1.ffffffffff9f1p-7, 0x1.0008000aaab05p0}, + {0x1.fffffffffe27dp-6, 0x1.002000aaac169p0}, + {0x1.ffffffffff27bp-6, 0x1.002000aaac16bp0}, + {0x1.ffffffffffb9cp-5, 0x1.00800aab05b1ep0}, + {0x1.ffffffffffd9dp-5, 0x1.00800aab05b1fp0}, + {0x1.9999999999368p-4, 0x1.0147f40224b2ep0}, + {0x1.9999999999727p-4, 0x1.0147f40224b35p0}, + {0x1.ffffffffffed1p-4, 0x1.0200aac16db6cp0}, + {0x1.fffffffffffd1p-4, 0x1.0200aac16db6ep0}, + {0x1.ffffffffffeb4p-3, 0x1.080ab05ca613bp0}, + {0x1.ffffffffffff2p-3, 0x1.080ab05ca6146p0}, + {0x1.ffffffffffff3p-2, 0x1.20ac1862ae8cep0}, + {0x1.ffffffffffff9p-2, 0x1.20ac1862ae8dp0}, + {0x1.0p0, 0x1.8b07551d9f551p0}, + {0x1.ffffffffffffbp0, 0x1.e18fa0df2d9b3p1}, + {0x1.ffffffffffffep0, 0x1.e18fa0df2d9b8p1}, + {0x1.fffffffffffffp0, 0x1.e18fa0df2d9bap1}, + {0x1.ffffffffffff9p1, 0x1.b4ee858de3e68p4}, + {0x1.ffffffffffffep1, 0x1.b4ee858de3e7ap4}, + {0x1.fffffffffffffp1, 0x1.b4ee858de3e7dp4}, + {0x1.ffffffffffffcp2, 0x1.749eaa93f4e5ep10}, + {0x1.ffffffffffffdp2, 0x1.749eaa93f4e64p10}, + {0x1.0p3, 0x1.749eaa93f4e76p10}, + {0x1.fffffffffff6fp3, 0x1.0f2ebd0a7fb9p22}, + {0x1.0p4, 0x1.0f2ebd0a8005cp22}, + {0x1.fffffffffffd4p4, 0x1.1f43fcc4b6316p45}, + {0x1.0p5, 0x1.1f43fcc4b662cp45}, + }; + + for (double[] testCase: testCases) + failures+=testCoshCase(testCase[0], testCase[1]); + + return failures; + } + + static int testTanh() { + int failures = 0; + double [][] testCases = { + {0x1.5798ee2308c36p-27, 0x1.5798ee2308c36p-27}, + {0x1.ffffffffffffep-26, 0x1.ffffffffffffbp-26}, + {0x1.ffffffffffffep-25, 0x1.ffffffffffff3p-25}, + {0x1.ad7f29abcaf47p-24, 0x1.ad7f29abcaf2dp-24}, + {0x1.ad7f29abcaf48p-24, 0x1.ad7f29abcaf2ep-24}, + {0x1.ffffffffffffep-24, 0x1.fffffffffffd3p-24}, + {0x1.ffffffffffffep-23, 0x1.fffffffffff53p-23}, + {0x1.ffffffffffffep-22, 0x1.ffffffffffd53p-22}, + {0x1.ffffffffffffep-21, 0x1.ffffffffff553p-21}, + {0x1.0c6f7a0b5ed8dp-20, 0x1.0c6f7a0b5e767p-20}, + {0x1.ffffffffffffep-20, 0x1.fffffffffd553p-20}, + {0x1.ffffffffffffep-19, 0x1.fffffffff5553p-19}, + {0x1.fffffffffffffp-18, 0x1.ffffffffd5555p-18}, + {0x1.0p-17, 0x1.ffffffffd5556p-18}, + {0x1.4f8b588e368edp-17, 0x1.4f8b588e0685p-17}, + {0x1.fffffffffffffp-17, 0x1.ffffffff55554p-17}, + {0x1.fffffffffffffp-16, 0x1.fffffffd55555p-16}, + {0x1.0p-15, 0x1.fffffffd55556p-16}, + {0x1.fffffffffe5ddp-15, 0x1.fffffff553b33p-15}, + {0x1.fffffffffffffp-15, 0x1.fffffff555554p-15}, + {0x1.a36e2eb1c432dp-14, 0x1.a36e2e9a4f663p-14}, + {0x1.ffffffffffffep-14, 0x1.ffffffd555553p-14}, + {0x1.0p-13, 0x1.ffffffd555555p-14}, + {0x1.ffffffffffd51p-13, 0x1.ffffff55552aap-13}, + {0x1.fffffffffffffp-13, 0x1.ffffff5555559p-13}, + {0x1.ffffffffffffep-12, 0x1.fffffd5555597p-12}, + {0x1.0p-11, 0x1.fffffd5555599p-12}, + {0x1.fffffffffff1p-11, 0x1.fffff555558a9p-11}, + {0x1.0p-10, 0x1.fffff5555599ap-11}, + {0x1.0624dd2f1a9c6p-10, 0x1.0624d77516cabp-10}, + {0x1.0624dd2f1a9f8p-10, 0x1.0624d77516cdep-10}, + {0x1.fffffffffffddp-10, 0x1.ffffd55559976p-10}, + {0x1.fffffffffffffp-10, 0x1.ffffd55559999p-10}, + {0x1.ffffffffffffcp-9, 0x1.ffff555599993p-9}, + {0x1.ffffffffffffep-9, 0x1.ffff555599996p-9}, + {0x1.ffffffffffff8p-8, 0x1.fffd555999924p-8}, + {0x1.ffffffffffffep-8, 0x1.fffd555999929p-8}, + {0x1.47ae147ae1458p-7, 0x1.47ab48ae4593cp-7}, + {0x1.47ae147ae1464p-7, 0x1.47ab48ae45947p-7}, + {0x1.ffffffffffffep-7, 0x1.fff5559997df6p-7}, + {0x1.fffffffffffffp-7, 0x1.fff5559997df8p-7}, + {0x1.ffffffffffff9p-6, 0x1.ffd559992b1d8p-6}, + {0x1.ffffffffffffep-6, 0x1.ffd559992b1dcp-6}, + {0x1.ffffffffffff9p-5, 0x1.ff55997e030d1p-5}, + {0x1.fffffffffffffp-5, 0x1.ff55997e030d6p-5}, + {0x1.9999999999996p-4, 0x1.983d7795f4137p-4}, + {0x1.9999999999997p-4, 0x1.983d7795f4137p-4}, + {0x1.fffffffffffffp-4, 0x1.fd5992bc4b834p-4}, + {0x1.0p-3, 0x1.fd5992bc4b834p-4}, + {0x1.fffffffffffffp-3, 0x1.f597ea69a1c86p-3}, + {0x1.ffffffffffffcp-2, 0x1.d9353d7568aefp-2}, + {0x1.ffffffffffffep-2, 0x1.d9353d7568af3p-2}, + {0x1.ffffffffffffbp-1, 0x1.85efab514f393p-1}, + {0x1.ffffffffffffep-1, 0x1.85efab514f393p-1}, + {0x1.fffffffffffd3p0, 0x1.ed9505e1bc3cep-1}, + {0x1.fffffffffffe1p0, 0x1.ed9505e1bc3cfp-1}, + {0x1.ffffffffffed8p1, 0x1.ffa81708a0b4p-1}, + {0x1.fffffffffff92p1, 0x1.ffa81708a0b41p-1}, + }; + + for (double[] testCase: testCases) + failures+=testTanhCase(testCase[0], testCase[1]); + + return failures; + } + + + public static void main(String [] argv) { + int failures = 0; + + failures += testSinh(); + failures += testCosh(); + failures += testTanh(); + + if (failures > 0) { + System.err.println("Testing the hyperbolics incurred " + + failures + " failures."); + throw new RuntimeException(); + } + } +} diff --git a/jdk/test/java/lang/StrictMath/HypotTests.java b/jdk/test/java/lang/StrictMath/HypotTests.java new file mode 100644 index 00000000000..09c601a5185 --- /dev/null +++ b/jdk/test/java/lang/StrictMath/HypotTests.java @@ -0,0 +1,633 @@ +/* + * Copyright 2003-2004 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4851638 + * @summary Tests for StrictMath.hypot + * @author Joseph D. Darcy + */ + +/** + * The tests in ../Math/HypotTests.java test properties that should + * hold for any hypot implementation, including the FDLIBM-based one + * required for StrictMath.hypot. Therefore, the test cases in + * ../Math/HypotTests.java are run against both the Math and + * StrictMath versions of hypot. The role of this test is to verify + * that the FDLIBM hypot algorithm is being used by running golden + * file tests on values that may vary from one conforming hypot + * implementation to another. + */ + +public class HypotTests { + private HypotTests(){} + + static int testHypotCase(double input1, double input2, double expected) { + return Tests.test("StrictMath.hypot(double)", input1, input2, + StrictMath.hypot(input1, input2), expected); + } + + static int testHypot() { + int failures = 0; + + double [][] testCases = { + {0x1.0p0, 0x1.ffffffffffab5p-1, 0x1.6a09e667f39edp0}, + {0x1.0p0, 0x1.ffffffffffffbp0, 0x1.1e3779b97f4a6p1}, + {0x1.0p0, 0x1.7ffffffffffffp1, 0x1.94c583ada5b51p1}, + {0x1.0p0, 0x1.ffffffffffffdp1, 0x1.07e0f66afed06p2}, + {0x1.0p0, 0x1.3fffffffffffdp2, 0x1.465655f122ff3p2}, + {0x1.0p0, 0x1.4p2, 0x1.465655f122ff6p2}, + {0x1.0p0, 0x1.7ffffffffffffp2, 0x1.854bfb363dc38p2}, + {0x1.0p0, 0x1.8p2, 0x1.854bfb363dc39p2}, + {0x1.0p0, 0x1.bfffffffffffep2, 0x1.c48c6001f0abdp2}, + {0x1.0p0, 0x1.fffffffffffffp2, 0x1.01fe03f61badp3}, + {0x1.0p0, 0x1.1fffffffffffap3, 0x1.21c5b70d9f81dp3}, + {0x1.0p0, 0x1.3ffffffffffe5p3, 0x1.419894c2329d5p3}, + {0x1.0p0, 0x1.3ffffffffffe7p3, 0x1.419894c2329d8p3}, + {0x1.0p0, 0x1.5ffffffffff7ep3, 0x1.617398f2aa9c6p3}, + {0x1.0p0, 0x1.5ffffffffff8dp3, 0x1.617398f2aa9d5p3}, + {0x1.0p0, 0x1.7ffffffffff9bp3, 0x1.8154be27734c1p3}, + {0x1.0p0, 0x1.8p3, 0x1.8154be2773526p3}, + {0x1.0p0, 0x1.9fffffffffff4p3, 0x1.a13a9cb996644p3}, + {0x1.0p0, 0x1.9ffffffffffffp3, 0x1.a13a9cb99664fp3}, + {0x1.0p0, 0x1.bfffffffffffep3, 0x1.c12432fec0327p3}, + {0x1.0p0, 0x1.cp3, 0x1.c12432fec0329p3}, + {0x1.0p0, 0x1.dffffffffffbcp3, 0x1.e110c39105f6bp3}, + {0x1.0p0, 0x1.ep3, 0x1.e110c39105fafp3}, + {0x1.0p0, 0x1.ffffffffffeafp3, 0x1.007fe00ff5fc8p4}, + {0x1.0p0, 0x1.0fffffffffff4p4, 0x1.10785dd689a1cp4}, + {0x1.0p0, 0x1.0fffffffffffbp4, 0x1.10785dd689a23p4}, + {0x1.0p0, 0x1.1ffffffffff92p4, 0x1.2071b0abcd7cap4}, + {0x1.0p0, 0x1.1ffffffffff99p4, 0x1.2071b0abcd7d1p4}, + {0x1.0p0, 0x1.2fffffffffffcp4, 0x1.306bb705ae7bfp4}, + {0x1.0p0, 0x1.2ffffffffffffp4, 0x1.306bb705ae7c3p4}, + {0x1.0p0, 0x1.3fffffffffffdp4, 0x1.4066560954a8bp4}, + {0x1.0p0, 0x1.4fffffffffe14p4, 0x1.506177f548fcfp4}, + {0x1.0p0, 0x1.5p4, 0x1.506177f5491bbp4}, + {0x1.0p0, 0x1.5fffffffffffdp4, 0x1.605d0af9d3a42p4}, + {0x1.0p0, 0x1.5fffffffffffep4, 0x1.605d0af9d3a42p4}, + {0x1.0p0, 0x1.6fffffffffff8p4, 0x1.7059005e2c015p4}, + {0x1.0p0, 0x1.6ffffffffffffp4, 0x1.7059005e2c01dp4}, + {0x1.0p0, 0x1.7fffffffffffdp4, 0x1.80554bdc2dc4dp4}, + {0x1.0p0, 0x1.7ffffffffffffp4, 0x1.80554bdc2dc4ep4}, + {0x1.0p0, 0x1.8fffffffffe68p4, 0x1.9051e3235a2cp4}, + {0x1.0p0, 0x1.9p4, 0x1.9051e3235a458p4}, + {0x1.0p0, 0x1.9fffffffffff4p4, 0x1.a04ebd789d00cp4}, + {0x1.0p0, 0x1.ap4, 0x1.a04ebd789d019p4}, + {0x1.0p0, 0x1.afffffffffed8p4, 0x1.b04bd36b639fbp4}, + {0x1.0p0, 0x1.affffffffff43p4, 0x1.b04bd36b63a66p4}, + {0x1.0p0, 0x1.bfffffffffe3ep4, 0x1.c0491e9ab90fdp4}, + {0x1.0p0, 0x1.cp4, 0x1.c0491e9ab92bfp4}, + {0x1.0p0, 0x1.cfffffffffed8p4, 0x1.d0469986884d6p4}, + {0x1.0p0, 0x1.cfffffffffee8p4, 0x1.d0469986884e5p4}, + {0x1.0p0, 0x1.dfffffffffe5cp4, 0x1.e0443f6a33104p4}, + {0x1.0p0, 0x1.dffffffffffffp4, 0x1.e0443f6a332a7p4}, + {0x1.0p0, 0x1.efffffffffff8p4, 0x1.f0420c1e63084p4}, + {0x1.0p0, 0x1.fp4, 0x1.f0420c1e6308dp4}, + {0x1.0p0, 0x1.ffffffffffffdp4, 0x1.001ffe003ff5fp5}, + {0x1.0p0, 0x1.07ffffffffed8p5, 0x1.081f05ef4d755p5}, + {0x1.0p0, 0x1.07ffffffffee8p5, 0x1.081f05ef4d764p5}, + {0x1.0p0, 0x1.0fffffffffff4p5, 0x1.101e1c7371c6bp5}, + {0x1.0p0, 0x1.0fffffffffffbp5, 0x1.101e1c7371c72p5}, + {0x1.0p0, 0x1.17ffffffffff8p5, 0x1.181d404cf7f51p5}, + {0x1.0p0, 0x1.17ffffffffffdp5, 0x1.181d404cf7f56p5}, + {0x1.0p0, 0x1.1fffffffffbf2p5, 0x1.201c705fa7a27p5}, + {0x1.0p0, 0x1.1fffffffffc65p5, 0x1.201c705fa7a9ap5}, + {0x1.0p0, 0x1.27ffffffffe08p5, 0x1.281babadfba01p5}, + {0x1.0p0, 0x1.28p5, 0x1.281babadfbbf9p5}, + {0x1.0p0, 0x1.2ffffffffff64p5, 0x1.301af15517357p5}, + {0x1.0p0, 0x1.2ffffffffff6cp5, 0x1.301af1551735ep5}, + {0x1.0p0, 0x1.37ffffffffc78p5, 0x1.381a40895d3f5p5}, + {0x1.0p0, 0x1.37ffffffffc88p5, 0x1.381a40895d406p5}, + {0x1.0p0, 0x1.3fffffffffffdp5, 0x1.4019989389b2dp5}, + {0x1.0p0, 0x1.4p5, 0x1.4019989389b3p5}, + {0x1.0p0, 0x1.47fffffffffe8p5, 0x1.4818f8ce34e19p5}, + {0x1.0p0, 0x1.47ffffffffffap5, 0x1.4818f8ce34e2cp5}, + {0x1.0p0, 0x1.4fffffffffa64p5, 0x1.501860a3b54bep5}, + {0x1.0p0, 0x1.4fffffffffe47p5, 0x1.501860a3b58a1p5}, + {0x1.0p0, 0x1.57ffffffffff8p5, 0x1.5817cf8c4c199p5}, + {0x1.0p0, 0x1.57fffffffffffp5, 0x1.5817cf8c4c1ap5}, + {0x1.0p0, 0x1.5fffffffffbeep5, 0x1.6017450c8d3e7p5}, + {0x1.0p0, 0x1.6p5, 0x1.6017450c8d7f9p5}, + {0x1.0p0, 0x1.67fffffffffe8p5, 0x1.6816c0b405afp5}, + {0x1.0p0, 0x1.68p5, 0x1.6816c0b405b09p5}, + {0x1.0p0, 0x1.6fffffffffb78p5, 0x1.7016421c06043p5}, + {0x1.0p0, 0x1.7p5, 0x1.7016421c064cbp5}, + {0x1.0p0, 0x1.77ffffffffffp5, 0x1.7815c8e69cc37p5}, + {0x1.0p0, 0x1.77ffffffffffcp5, 0x1.7815c8e69cc43p5}, + {0x1.0p0, 0x1.7ffffffffffffp5, 0x1.801554bda99c5p5}, + {0x1.0p0, 0x1.87fffffffffdp5, 0x1.8814e55214271p5}, + {0x1.0p0, 0x1.87ffffffffffcp5, 0x1.8814e5521429ep5}, + {0x1.0p0, 0x1.8ffffffffffe8p5, 0x1.90147a5b16ce5p5}, + {0x1.0p0, 0x1.8fffffffffffcp5, 0x1.90147a5b16cfap5}, + {0x1.0p0, 0x1.97ffffffffffp5, 0x1.98141395a0592p5}, + {0x1.0p0, 0x1.97fffffffffffp5, 0x1.98141395a05a1p5}, + {0x1.0p0, 0x1.9fffffffff8f4p5, 0x1.a013b0c3c7377p5}, + {0x1.0p0, 0x1.9fffffffffb18p5, 0x1.a013b0c3c759bp5}, + {0x1.0p0, 0x1.a7fffffffffdp5, 0x1.a81351ac4f317p5}, + {0x1.0p0, 0x1.a7ffffffffffp5, 0x1.a81351ac4f338p5}, + {0x1.0p0, 0x1.afffffffff698p5, 0x1.b012f61a35d98p5}, + {0x1.0p0, 0x1.bp5, 0x1.b012f61a367p5}, + {0x1.0p0, 0x1.b7ffffffff85p5, 0x1.b8129ddc56b26p5}, + {0x1.0p0, 0x1.b7ffffffff87p5, 0x1.b8129ddc56b45p5}, + {0x1.0p0, 0x1.bfffffffffffdp5, 0x1.c01248c50d99cp5}, + {0x1.0p0, 0x1.bfffffffffffep5, 0x1.c01248c50d99cp5}, + {0x1.0p0, 0x1.c7ffffffffedp5, 0x1.c811f6a9e9676p5}, + {0x1.0p0, 0x1.c8p5, 0x1.c811f6a9e97a6p5}, + {0x1.0p0, 0x1.cffffffffffe8p5, 0x1.d011a7636789ep5}, + {0x1.0p0, 0x1.d7ffffffffffp5, 0x1.d8115accb20f3p5}, + {0x1.0p0, 0x1.d8p5, 0x1.d8115accb2103p5}, + {0x1.0p0, 0x1.dfffffffffebcp5, 0x1.e01110c367a41p5}, + {0x1.0p0, 0x1.ep5, 0x1.e01110c367b85p5}, + {0x1.0p0, 0x1.e7fffffffffdp5, 0x1.e810c927681fap5}, + {0x1.0p0, 0x1.e8p5, 0x1.e810c9276822ap5}, + {0x1.0p0, 0x1.efffffffff7f8p5, 0x1.f01083daa4dadp5}, + {0x1.0p0, 0x1.fp5, 0x1.f01083daa55b5p5}, + {0x1.0p0, 0x1.f7ffffffffffp5, 0x1.f81040c0f9c6p5}, + {0x1.0p0, 0x1.f8p5, 0x1.f81040c0f9c71p5}, + {0x1.0p0, 0x1.fffffffffffffp5, 0x1.0007ffe000fffp6}, + {0x1.0p0, 0x1.03fffffffffdp6, 0x1.0407e05f7d188p6}, + {0x1.0p0, 0x1.03ffffffffffbp6, 0x1.0407e05f7d1b4p6}, + {0x1.0p0, 0x1.07ffffffff7f8p6, 0x1.0807c1d34edd5p6}, + {0x1.0p0, 0x1.07ffffffff808p6, 0x1.0807c1d34ede4p6}, + {0x1.0p0, 0x1.0bffffffff65p6, 0x1.0c07a430870e5p6}, + {0x1.0p0, 0x1.0bffffffff67p6, 0x1.0c07a43087104p6}, + {0x1.0p0, 0x1.0fffffffffc54p6, 0x1.1007876cda509p6}, + {0x1.0p0, 0x1.0fffffffffe0dp6, 0x1.1007876cda6c2p6}, + {0x1.0p0, 0x1.13fffffffffdp6, 0x1.14076b7e954b4p6}, + {0x1.0p0, 0x1.13ffffffffffep6, 0x1.14076b7e954e3p6}, + {0x1.0p0, 0x1.17ffffffffff8p6, 0x1.1807505c9310dp6}, + {0x1.0p0, 0x1.18p6, 0x1.1807505c93116p6}, + {0x1.0p0, 0x1.1bfffffffecbp6, 0x1.1c0735fe3197ap6}, + {0x1.0p0, 0x1.1bffffffff1dbp6, 0x1.1c0735fe31ea5p6}, + {0x1.0p0, 0x1.1ffffffffebcap6, 0x1.20071c5b4ce64p6}, + {0x1.0p0, 0x1.1fffffffffaf1p6, 0x1.20071c5b4dd8bp6}, + {0x1.0p0, 0x1.23ffffffff83p6, 0x1.2407036c309fdp6}, + {0x1.0p0, 0x1.23ffffffff85p6, 0x1.2407036c30a1cp6}, + {0x1.0p0, 0x1.27ffffffffba8p6, 0x1.2806eb2991e76p6}, + {0x1.0p0, 0x1.28p6, 0x1.2806eb29922cep6}, + {0x1.0p0, 0x1.2bfffffffff7p6, 0x1.2c06d38c8b4ffp6}, + {0x1.0p0, 0x1.2bfffffffff9p6, 0x1.2c06d38c8b52p6}, + {0x1.0p0, 0x1.2fffffffffff4p6, 0x1.3006bc8e938c8p6}, + {0x1.0p0, 0x1.2fffffffffffcp6, 0x1.3006bc8e938cfp6}, + {0x1.0p0, 0x1.33ffffffff87p6, 0x1.3406a6297821ep6}, + {0x1.0p0, 0x1.33ffffffff89p6, 0x1.3406a6297823dp6}, + {0x1.0p0, 0x1.37ffffffff9d8p6, 0x1.380690575943dp6}, + {0x1.0p0, 0x1.37ffffffff9eap6, 0x1.380690575944fp6}, + {0x1.0p0, 0x1.3bffffffffffp6, 0x1.3c067b12a2013p6}, + {0x1.0p0, 0x1.3cp6, 0x1.3c067b12a2024p6}, + {0x1.0p0, 0x1.3fffffffffe19p6, 0x1.40066656044ep6}, + {0x1.0p0, 0x1.4p6, 0x1.40066656046c7p6}, + {0x1.0p0, 0x1.43ffffffff1dp6, 0x1.4406521c75c3p6}, + {0x1.0p0, 0x1.43ffffffffccfp6, 0x1.4406521c7672fp6}, + {0x1.0p0, 0x1.47ffffffff8a8p6, 0x1.48063e612ce7ap6}, + {0x1.0p0, 0x1.47ffffffffcb9p6, 0x1.48063e612d28bp6}, + {0x1.0p0, 0x1.4bfffffffe1fp6, 0x1.4c062b1f96823p6}, + {0x1.0p0, 0x1.4cp6, 0x1.4c062b1f98633p6}, + {0x1.0p0, 0x1.4ffffffffde04p6, 0x1.500618535d07dp6}, + {0x1.0p0, 0x1.5p6, 0x1.500618535f279p6}, + {0x1.0p0, 0x1.53fffffffef1p6, 0x1.540605f85c637p6}, + {0x1.0p0, 0x1.53ffffffffdf3p6, 0x1.540605f85d51ap6}, + {0x1.0p0, 0x1.57ffffffffff8p6, 0x1.5805f40aa0595p6}, + {0x1.0p0, 0x1.5bffffffffffp6, 0x1.5c05e286636b5p6}, + {0x1.0p0, 0x1.5bfffffffffffp6, 0x1.5c05e286636c4p6}, + {0x1.0p0, 0x1.5ffffffffd9cep6, 0x1.6005d1680baa2p6}, + {0x1.0p0, 0x1.5fffffffff873p6, 0x1.6005d1680d947p6}, + {0x1.0p0, 0x1.63ffffffffa5p6, 0x1.6405c0ac30a35p6}, + {0x1.0p0, 0x1.63ffffffffa7p6, 0x1.6405c0ac30a56p6}, + {0x1.0p0, 0x1.67ffffffff988p6, 0x1.6805b04f83ac3p6}, + {0x1.0p0, 0x1.68p6, 0x1.6805b04f8413bp6}, + {0x1.0p0, 0x1.6bfffffffffep6, 0x1.6c05a04ee40c3p6}, + {0x1.0p0, 0x1.6cp6, 0x1.6c05a04ee40e3p6}, + {0x1.0p0, 0x1.6fffffffff018p6, 0x1.700590a74f9b5p6}, + {0x1.0p0, 0x1.6fffffffffbe2p6, 0x1.700590a75057fp6}, + {0x1.0p0, 0x1.73ffffffff4ap6, 0x1.74058155e9b72p6}, + {0x1.0p0, 0x1.74p6, 0x1.74058155ea6d2p6}, + {0x1.0p0, 0x1.77ffffffffffp6, 0x1.78057257f1868p6}, + {0x1.0p0, 0x1.78p6, 0x1.78057257f1878p6}, + {0x1.0p0, 0x1.7bfffffffffep6, 0x1.7c0563aac389bp6}, + {0x1.0p0, 0x1.7bfffffffffe4p6, 0x1.7c0563aac389fp6}, + {0x1.0p0, 0x1.7ffffffffffffp6, 0x1.8005554bda349p6}, + {0x1.0p0, 0x1.8p6, 0x1.8005554bda34bp6}, + {0x1.0p0, 0x1.83fffffffffap6, 0x1.84054738c9dcdp6}, + {0x1.0p0, 0x1.84p6, 0x1.84054738c9e2dp6}, + {0x1.0p0, 0x1.87ffffffff09p6, 0x1.8805396f3f494p6}, + {0x1.0p0, 0x1.87ffffffff0bp6, 0x1.8805396f3f4b5p6}, + {0x1.0p0, 0x1.8bfffffffffep6, 0x1.8c052bed02f7ap6}, + {0x1.0p0, 0x1.8cp6, 0x1.8c052bed02f9bp6}, + {0x1.0p0, 0x1.8fffffffff7c8p6, 0x1.90051eafee07bp6}, + {0x1.0p0, 0x1.9p6, 0x1.90051eafee8b3p6}, + {0x1.0p1, 0x1.fffffffffdcb5p-1, 0x1.1e3779b97f0b5p1}, + {0x1.0p1, 0x1.ffffffffffab5p0, 0x1.6a09e667f39edp1}, + {0x1.0p1, 0x1.7ffffffffffffp1, 0x1.cd82b446159f2p1}, + {0x1.0p1, 0x1.8p1, 0x1.cd82b446159f3p1}, + {0x1.0p1, 0x1.ffffffffffffbp1, 0x1.1e3779b97f4a6p2}, + {0x1.0p1, 0x1.3fffffffffffdp2, 0x1.58a68a4a8d9fp2}, + {0x1.0p1, 0x1.3fffffffffffep2, 0x1.58a68a4a8d9f1p2}, + {0x1.0p1, 0x1.7ffffffffffffp2, 0x1.94c583ada5b51p2}, + {0x1.0p1, 0x1.bfffffffffffep2, 0x1.d1ed52076fbe7p2}, + {0x1.0p1, 0x1.cp2, 0x1.d1ed52076fbe9p2}, + {0x1.0p1, 0x1.ffffffffffffdp2, 0x1.07e0f66afed06p3}, + {0x1.0p1, 0x1.1fffffffffff2p3, 0x1.2706821902e8cp3}, + {0x1.0p1, 0x1.2p3, 0x1.2706821902e9ap3}, + {0x1.0p1, 0x1.3fffffffffffdp3, 0x1.465655f122ff3p3}, + {0x1.0p1, 0x1.4p3, 0x1.465655f122ff6p3}, + {0x1.0p1, 0x1.5ffffffffffd6p3, 0x1.65c55827df1a8p3}, + {0x1.0p1, 0x1.7ffffffffffffp3, 0x1.854bfb363dc38p3}, + {0x1.0p1, 0x1.8p3, 0x1.854bfb363dc39p3}, + {0x1.0p1, 0x1.9ffffffffffe4p3, 0x1.a4e4efeda34c2p3}, + {0x1.0p1, 0x1.ap3, 0x1.a4e4efeda34dep3}, + {0x1.0p1, 0x1.bfffffffffffep3, 0x1.c48c6001f0abdp3}, + {0x1.0p1, 0x1.dfffffffffffcp3, 0x1.e43f746f77956p3}, + {0x1.0p1, 0x1.ep3, 0x1.e43f746f7795bp3}, + {0x1.0p1, 0x1.fffffffffffffp3, 0x1.01fe03f61badp4}, + {0x1.0p1, 0x1.0ffffffffffc4p4, 0x1.11e039f40ee2ap4}, + {0x1.0p1, 0x1.0ffffffffffc7p4, 0x1.11e039f40ee2dp4}, + {0x1.0p1, 0x1.1fffffffffffap4, 0x1.21c5b70d9f81dp4}, + {0x1.0p1, 0x1.2fffffffffffcp4, 0x1.31adf859f9e5ap4}, + {0x1.0p1, 0x1.2fffffffffffep4, 0x1.31adf859f9e5cp4}, + {0x1.0p1, 0x1.3ffffffffffe5p4, 0x1.419894c2329d5p4}, + {0x1.0p1, 0x1.3ffffffffffe7p4, 0x1.419894c2329d8p4}, + {0x1.0p1, 0x1.4fffffffffff4p4, 0x1.518536f3ca668p4}, + {0x1.0p1, 0x1.5p4, 0x1.518536f3ca675p4}, + {0x1.0p1, 0x1.5ffffffffff7ep4, 0x1.617398f2aa9c6p4}, + {0x1.0p1, 0x1.5ffffffffff8dp4, 0x1.617398f2aa9d5p4}, + {0x1.0p1, 0x1.6ffffffffffb8p4, 0x1.716380ce70352p4}, + {0x1.0p1, 0x1.7p4, 0x1.716380ce7039ap4}, + {0x1.0p1, 0x1.7ffffffffff9bp4, 0x1.8154be27734c1p4}, + {0x1.0p1, 0x1.8p4, 0x1.8154be2773526p4}, + {0x1.0p1, 0x1.8ffffffffffe8p4, 0x1.9147284a4142fp4}, + {0x1.0p1, 0x1.8ffffffffffffp4, 0x1.9147284a41446p4}, + {0x1.0p1, 0x1.9fffffffffff4p4, 0x1.a13a9cb996644p4}, + {0x1.0p1, 0x1.9ffffffffffffp4, 0x1.a13a9cb99664fp4}, + {0x1.0p1, 0x1.affffffffff58p4, 0x1.b12efe0a8f113p4}, + {0x1.0p1, 0x1.affffffffffd2p4, 0x1.b12efe0a8f18dp4}, + {0x1.0p1, 0x1.bfffffffffffep4, 0x1.c12432fec0327p4}, + {0x1.0p1, 0x1.cp4, 0x1.c12432fec0329p4}, + {0x1.0p1, 0x1.cffffffffffe8p4, 0x1.d11a25cd6ed78p4}, + {0x1.0p1, 0x1.dp4, 0x1.d11a25cd6ed91p4}, + {0x1.0p1, 0x1.dffffffffffbcp4, 0x1.e110c39105f6bp4}, + {0x1.0p1, 0x1.ep4, 0x1.e110c39105fafp4}, + {0x1.0p1, 0x1.effffffffffe8p4, 0x1.f107fbd0adcf1p4}, + {0x1.0p1, 0x1.efffffffffff8p4, 0x1.f107fbd0addp4}, + {0x1.0p1, 0x1.ffffffffffeafp4, 0x1.007fe00ff5fc8p5}, + {0x1.0p1, 0x1.07fffffffffe8p5, 0x1.087c01e7d5092p5}, + {0x1.0p1, 0x1.08p5, 0x1.087c01e7d50abp5}, + {0x1.0p1, 0x1.0fffffffffff4p5, 0x1.10785dd689a1cp5}, + {0x1.0p1, 0x1.0fffffffffffbp5, 0x1.10785dd689a23p5}, + {0x1.0p1, 0x1.17ffffffffed8p5, 0x1.1874eee5c5cb1p5}, + {0x1.0p1, 0x1.17ffffffffee8p5, 0x1.1874eee5c5cc2p5}, + {0x1.0p1, 0x1.1ffffffffff92p5, 0x1.2071b0abcd7cap5}, + {0x1.0p1, 0x1.1ffffffffff99p5, 0x1.2071b0abcd7d1p5}, + {0x1.0p1, 0x1.27ffffffffea8p5, 0x1.286e9f388de9fp5}, + {0x1.0p1, 0x1.28p5, 0x1.286e9f388dff7p5}, + {0x1.0p1, 0x1.2fffffffffffcp5, 0x1.306bb705ae7bfp5}, + {0x1.0p1, 0x1.2ffffffffffffp5, 0x1.306bb705ae7c3p5}, + {0x1.0p1, 0x1.37ffffffffff8p5, 0x1.3868f4e9108b9p5}, + {0x1.0p1, 0x1.38p5, 0x1.3868f4e9108c1p5}, + {0x1.0p1, 0x1.3fffffffffffdp5, 0x1.4066560954a8bp5}, + {0x1.0p1, 0x1.47ffffffffe28p5, 0x1.4863d7d40ad39p5}, + {0x1.0p1, 0x1.48p5, 0x1.4863d7d40af11p5}, + {0x1.0p1, 0x1.4fffffffffe14p5, 0x1.506177f548fcfp5}, + {0x1.0p1, 0x1.5p5, 0x1.506177f5491bbp5}, + {0x1.0p1, 0x1.57ffffffffeb8p5, 0x1.585f34506bafbp5}, + {0x1.0p1, 0x1.58p5, 0x1.585f34506bc43p5}, + {0x1.0p1, 0x1.5fffffffffffdp5, 0x1.605d0af9d3a42p5}, + {0x1.0p1, 0x1.5fffffffffffep5, 0x1.605d0af9d3a42p5}, + {0x1.0p1, 0x1.67ffffffffda8p5, 0x1.685afa317791bp5}, + {0x1.0p1, 0x1.68p5, 0x1.685afa3177b73p5}, + {0x1.0p1, 0x1.6fffffffffff8p5, 0x1.7059005e2c015p5}, + {0x1.0p1, 0x1.6ffffffffffffp5, 0x1.7059005e2c01dp5}, + {0x1.0p1, 0x1.77ffffffffffp5, 0x1.78571c0982328p5}, + {0x1.0p1, 0x1.78p5, 0x1.78571c0982339p5}, + {0x1.0p1, 0x1.7fffffffffffdp5, 0x1.80554bdc2dc4dp5}, + {0x1.0p1, 0x1.7ffffffffffffp5, 0x1.80554bdc2dc4ep5}, + {0x1.0p1, 0x1.87fffffffffdp5, 0x1.88538e9ad8dacp5}, + {0x1.0p1, 0x1.87fffffffffffp5, 0x1.88538e9ad8ddbp5}, + {0x1.0p1, 0x1.8fffffffffe68p5, 0x1.9051e3235a2cp5}, + {0x1.0p1, 0x1.9p5, 0x1.9051e3235a458p5}, + {0x1.0p1, 0x1.97ffffffffffp5, 0x1.9850486a3f17p5}, + {0x1.0p1, 0x1.97fffffffffffp5, 0x1.9850486a3f17fp5}, + {0x1.0p1, 0x1.9fffffffffff4p5, 0x1.a04ebd789d00cp5}, + {0x1.0p1, 0x1.ap5, 0x1.a04ebd789d019p5}, + {0x1.0p1, 0x1.a7ffffffffe1p5, 0x1.a84d416a2354dp5}, + {0x1.0p1, 0x1.a8p5, 0x1.a84d416a2373dp5}, + {0x1.0p1, 0x1.afffffffffed8p5, 0x1.b04bd36b639fbp5}, + {0x1.0p1, 0x1.affffffffff43p5, 0x1.b04bd36b63a66p5}, + {0x1.0p1, 0x1.b7ffffffffd7p5, 0x1.b84a72b848951p5}, + {0x1.0p1, 0x1.b7ffffffffe2bp5, 0x1.b84a72b848a0cp5}, + {0x1.0p1, 0x1.bfffffffffe3ep5, 0x1.c0491e9ab90fdp5}, + {0x1.0p1, 0x1.cp5, 0x1.c0491e9ab92bfp5}, + {0x1.0p1, 0x1.c7fffffffffdp5, 0x1.c847d6695dbc5p5}, + {0x1.0p1, 0x1.c8p5, 0x1.c847d6695dbf6p5}, + {0x1.0p1, 0x1.cfffffffffed8p5, 0x1.d0469986884d6p5}, + {0x1.0p1, 0x1.cfffffffffee8p5, 0x1.d0469986884e5p5}, + {0x1.0p1, 0x1.d7ffffffffdfp5, 0x1.d845675f37721p5}, + {0x1.0p1, 0x1.d8p5, 0x1.d845675f37931p5}, + {0x1.0p1, 0x1.dfffffffffe5cp5, 0x1.e0443f6a33104p5}, + {0x1.0p1, 0x1.dffffffffffffp5, 0x1.e0443f6a332a7p5}, + {0x1.0p1, 0x1.e7fffffffff05p5, 0x1.e84321273f31ep5}, + {0x1.0p1, 0x1.e7fffffffff1p5, 0x1.e84321273f328p5}, + {0x1.0p1, 0x1.efffffffffff8p5, 0x1.f0420c1e63084p5}, + {0x1.0p1, 0x1.fp5, 0x1.f0420c1e6308dp5}, + {0x1.0p1, 0x1.f7ffffffffc3p5, 0x1.f840ffdf40effp5}, + {0x1.0p1, 0x1.f7fffffffff08p5, 0x1.f840ffdf411d7p5}, + {0x1.0p1, 0x1.ffffffffffffdp5, 0x1.001ffe003ff5fp6}, + {0x1.0p1, 0x1.03fffffffffdp6, 0x1.041f800f9f928p6}, + {0x1.0p1, 0x1.03ffffffffffap6, 0x1.041f800f9f953p6}, + {0x1.0p1, 0x1.07ffffffffed8p6, 0x1.081f05ef4d755p6}, + {0x1.0p1, 0x1.07ffffffffee8p6, 0x1.081f05ef4d764p6}, + {0x1.0p1, 0x1.0bfffffffff5p6, 0x1.0c1e8f739cdcap6}, + {0x1.0p1, 0x1.0bfffffffff7p6, 0x1.0c1e8f739cde9p6}, + {0x1.0p1, 0x1.0fffffffffff4p6, 0x1.101e1c7371c6bp6}, + {0x1.0p1, 0x1.0fffffffffffbp6, 0x1.101e1c7371c72p6}, + {0x1.0p1, 0x1.13fffffffffdp6, 0x1.141dacc811a34p6}, + {0x1.0p1, 0x1.13ffffffffffcp6, 0x1.141dacc811a6p6}, + {0x1.0p1, 0x1.17ffffffffff8p6, 0x1.181d404cf7f51p6}, + {0x1.0p1, 0x1.17ffffffffffdp6, 0x1.181d404cf7f56p6}, + {0x1.0p1, 0x1.1bffffffffffp6, 0x1.1c1cd6dfae4a5p6}, + {0x1.0p1, 0x1.1bffffffffffep6, 0x1.1c1cd6dfae4b4p6}, + {0x1.0p1, 0x1.1fffffffffbf2p6, 0x1.201c705fa7a27p6}, + {0x1.0p1, 0x1.1fffffffffc65p6, 0x1.201c705fa7a9ap6}, + {0x1.0p1, 0x1.23fffffffffdp6, 0x1.241c0cae201cap6}, + {0x1.0p1, 0x1.23ffffffffffp6, 0x1.241c0cae201ebp6}, + {0x1.0p1, 0x1.27ffffffffe08p6, 0x1.281babadfba01p6}, + {0x1.0p1, 0x1.28p6, 0x1.281babadfbbf9p6}, + {0x1.0p1, 0x1.2bffffffffc1p6, 0x1.2c1b4d43ac4cfp6}, + {0x1.0p1, 0x1.2bffffffffc3p6, 0x1.2c1b4d43ac4eep6}, + {0x1.0p1, 0x1.2ffffffffff64p6, 0x1.301af15517357p6}, + {0x1.0p1, 0x1.2ffffffffff6cp6, 0x1.301af1551735ep6}, + {0x1.0p1, 0x1.33ffffffffadp6, 0x1.341a97c97b22ep6}, + {0x1.0p1, 0x1.33ffffffffafp6, 0x1.341a97c97b24fp6}, + {0x1.0p1, 0x1.37ffffffffc78p6, 0x1.381a40895d3f5p6}, + {0x1.0p1, 0x1.37ffffffffc88p6, 0x1.381a40895d406p6}, + {0x1.0p1, 0x1.3bffffffffffp6, 0x1.3c19eb7e71afcp6}, + {0x1.0p1, 0x1.3bfffffffffffp6, 0x1.3c19eb7e71b0cp6}, + {0x1.0p1, 0x1.3fffffffffffdp6, 0x1.4019989389b2dp6}, + {0x1.0p1, 0x1.4p6, 0x1.4019989389b3p6}, + {0x1.0p1, 0x1.43fffffffffdp6, 0x1.441947b4829e8p6}, + {0x1.0p1, 0x1.43ffffffffff8p6, 0x1.441947b482a11p6}, + {0x1.0p1, 0x1.47fffffffffe8p6, 0x1.4818f8ce34e19p6}, + {0x1.0p1, 0x1.47ffffffffffap6, 0x1.4818f8ce34e2cp6}, + {0x1.0p1, 0x1.4bffffffffffp6, 0x1.4c18abce6501fp6}, + {0x1.0p1, 0x1.4bffffffffffcp6, 0x1.4c18abce6502cp6}, + {0x1.0p1, 0x1.4fffffffffa64p6, 0x1.501860a3b54bep6}, + {0x1.0p1, 0x1.4fffffffffe47p6, 0x1.501860a3b58a1p6}, + {0x1.0p1, 0x1.53ffffffffd5p6, 0x1.5418173d9a501p6}, + {0x1.0p1, 0x1.53ffffffffd7p6, 0x1.5418173d9a522p6}, + {0x1.0p1, 0x1.57ffffffffff8p6, 0x1.5817cf8c4c199p6}, + {0x1.0p1, 0x1.57fffffffffffp6, 0x1.5817cf8c4c1ap6}, + {0x1.0p1, 0x1.5bffffffff83p6, 0x1.5c178980bc34bp6}, + {0x1.0p1, 0x1.5bffffffff988p6, 0x1.5c178980bc4a3p6}, + {0x1.0p1, 0x1.5fffffffffbeep6, 0x1.6017450c8d3e7p6}, + {0x1.0p1, 0x1.6p6, 0x1.6017450c8d7f9p6}, + {0x1.0p1, 0x1.63fffffffffdp6, 0x1.6417022204f99p6}, + {0x1.0p1, 0x1.67fffffffffe8p6, 0x1.6816c0b405afp6}, + {0x1.0p1, 0x1.68p6, 0x1.6816c0b405b09p6}, + {0x1.0p1, 0x1.6bfffffffffep6, 0x1.6c1680b6059e8p6}, + {0x1.0p1, 0x1.6cp6, 0x1.6c1680b605a08p6}, + {0x1.0p1, 0x1.6fffffffffb78p6, 0x1.7016421c06043p6}, + {0x1.0p1, 0x1.7p6, 0x1.7016421c064cbp6}, + {0x1.0p1, 0x1.73fffffffffap6, 0x1.741604da8d2b9p6}, + {0x1.0p1, 0x1.73ffffffffff8p6, 0x1.741604da8d311p6}, + {0x1.0p1, 0x1.77ffffffffffp6, 0x1.7815c8e69cc37p6}, + {0x1.0p1, 0x1.77ffffffffffcp6, 0x1.7815c8e69cc43p6}, + {0x1.0p1, 0x1.7bfffffffffep6, 0x1.7c158e35adde4p6}, + {0x1.0p1, 0x1.7bfffffffffe8p6, 0x1.7c158e35addecp6}, + {0x1.0p1, 0x1.7ffffffffffffp6, 0x1.801554bda99c5p6}, + {0x1.0p1, 0x1.83ffffffffdap6, 0x1.84151c74e35e4p6}, + {0x1.0p1, 0x1.83ffffffffdep6, 0x1.84151c74e3625p6}, + {0x1.0p1, 0x1.87fffffffffdp6, 0x1.8814e55214271p6}, + {0x1.0p1, 0x1.87ffffffffffcp6, 0x1.8814e5521429ep6}, + {0x1.0p1, 0x1.8bfffffffffep6, 0x1.8c14af4c540b6p6}, + {0x1.0p1, 0x1.8bffffffffff6p6, 0x1.8c14af4c540cdp6}, + {0x1.0p1, 0x1.8ffffffffffe8p6, 0x1.90147a5b16ce5p6}, + {0x1.0p1, 0x1.8fffffffffffcp6, 0x1.90147a5b16cfap6}, + {0x1.8p1, 0x1.ffffffffffffdp-1, 0x1.94c583ada5b53p1}, + {0x1.8p1, 0x1.0p1, 0x1.cd82b446159f3p1}, + {0x1.8p1, 0x1.7fffffffffff7p1, 0x1.0f876ccdf6cd6p2}, + {0x1.8p1, 0x1.8p1, 0x1.0f876ccdf6cd9p2}, + {0x1.8p1, 0x1.fffffffffffffp1, 0x1.4p2}, + {0x1.8p1, 0x1.3ffffffffffe1p2, 0x1.752e50db3a387p2}, + {0x1.8p1, 0x1.4p2, 0x1.752e50db3a3a2p2}, + {0x1.8p1, 0x1.7ffffffffffffp2, 0x1.ad5336963eefap2}, + {0x1.8p1, 0x1.bfffffffffffep2, 0x1.e768d399dc46dp2}, + {0x1.8p1, 0x1.bffffffffffffp2, 0x1.e768d399dc46fp2}, + {0x1.8p1, 0x1.fffffffffffffp2, 0x1.11687a8ae14a3p3}, + {0x1.8p1, 0x1.1fffffffffff2p3, 0x1.2f9422c23c47p3}, + {0x1.8p1, 0x1.1fffffffffff7p3, 0x1.2f9422c23c475p3}, + {0x1.8p1, 0x1.3fffffffffff1p3, 0x1.4e16fdacff928p3}, + {0x1.8p1, 0x1.3fffffffffff4p3, 0x1.4e16fdacff92bp3}, + {0x1.8p1, 0x1.5ffffffffffffp3, 0x1.6cdb2bbb212ebp3}, + {0x1.8p1, 0x1.7fffffffffffdp3, 0x1.8bd171a07e388p3}, + {0x1.8p1, 0x1.7ffffffffffffp3, 0x1.8bd171a07e389p3}, + {0x1.8p1, 0x1.9ffffffffffe4p3, 0x1.aaeee979b481cp3}, + {0x1.8p1, 0x1.9ffffffffffecp3, 0x1.aaeee979b4825p3}, + {0x1.8p1, 0x1.bffffffffffeep3, 0x1.ca2b9714180e5p3}, + {0x1.8p1, 0x1.cp3, 0x1.ca2b9714180f7p3}, + {0x1.8p1, 0x1.dfffffffffffcp3, 0x1.e98180e9b47edp3}, + {0x1.8p1, 0x1.dfffffffffffep3, 0x1.e98180e9b47efp3}, + {0x1.8p1, 0x1.fffffffffffffp3, 0x1.04760c95db31p4}, + {0x1.8p1, 0x1.0fffffffffff4p4, 0x1.1433ec467efefp4}, + {0x1.8p1, 0x1.1ffffffffffeap4, 0x1.23f8fc68ae515p4}, + {0x1.8p1, 0x1.2p4, 0x1.23f8fc68ae52bp4}, + {0x1.8p1, 0x1.2fffffffffffcp4, 0x1.33c42213ee0c5p4}, + {0x1.8p1, 0x1.3p4, 0x1.33c42213ee0c9p4}, + {0x1.8p1, 0x1.3ffffffffffd9p4, 0x1.439479381ec96p4}, + {0x1.8p1, 0x1.3fffffffffff6p4, 0x1.439479381ecb3p4}, + {0x1.8p1, 0x1.4ffffffffffc4p4, 0x1.53694801747d4p4}, + {0x1.8p1, 0x1.4ffffffffffccp4, 0x1.53694801747dcp4}, + {0x1.8p1, 0x1.5ffffffffffbep4, 0x1.6341f58bad9d2p4}, + {0x1.8p1, 0x1.5ffffffffffc2p4, 0x1.6341f58bad9d7p4}, + {0x1.8p1, 0x1.6fffffffffff8p4, 0x1.731e02ed21f18p4}, + {0x1.8p1, 0x1.6ffffffffffffp4, 0x1.731e02ed21f2p4}, + {0x1.8p1, 0x1.7fffffffffffdp4, 0x1.82fd05f129836p4}, + {0x1.8p1, 0x1.7ffffffffffffp4, 0x1.82fd05f129837p4}, + {0x1.8p1, 0x1.8ffffffffffa8p4, 0x1.92dea50d28578p4}, + {0x1.8p1, 0x1.8ffffffffffffp4, 0x1.92dea50d285cep4}, + {0x1.8p1, 0x1.9ffffffffffe4p4, 0x1.a2c2943e2866p4}, + {0x1.8p1, 0x1.9fffffffffffcp4, 0x1.a2c2943e28678p4}, + {0x1.8p1, 0x1.afffffffffff8p4, 0x1.b2a892946f42dp4}, + {0x1.8p1, 0x1.afffffffffffep4, 0x1.b2a892946f434p4}, + {0x1.8p1, 0x1.bffffffffffeep4, 0x1.c2906842b6bf3p4}, + {0x1.8p1, 0x1.bfffffffffff2p4, 0x1.c2906842b6bf8p4}, + {0x1.8p1, 0x1.cffffffffffe8p4, 0x1.d279e51208c72p4}, + {0x1.8p1, 0x1.dp4, 0x1.d279e51208c8ap4}, + {0x1.8p1, 0x1.dfffffffffff4p4, 0x1.e264df234beddp4}, + {0x1.8p1, 0x1.dfffffffffffcp4, 0x1.e264df234bee4p4}, + {0x1.8p1, 0x1.efffffffffff8p4, 0x1.f25131ed54d64p4}, + {0x1.8p1, 0x1.fp4, 0x1.f25131ed54d6cp4}, + {0x1.8p1, 0x1.fffffffffffffp4, 0x1.011f5eb54147p5}, + {0x1.8p1, 0x1.07fffffffff88p5, 0x1.0916b2b5fff3ep5}, + {0x1.8p1, 0x1.07fffffffffaap5, 0x1.0916b2b5fff6p5}, + {0x1.8p1, 0x1.0ffffffffffc4p5, 0x1.110e8885865b8p5}, + {0x1.8p1, 0x1.0ffffffffffccp5, 0x1.110e8885865c1p5}, + {0x1.8p1, 0x1.17fffffffff58p5, 0x1.1906d51932b7ep5}, + {0x1.8p1, 0x1.17fffffffff77p5, 0x1.1906d51932b9dp5}, + {0x1.8p1, 0x1.1fffffffffffap5, 0x1.20ff8e9d967d6p5}, + {0x1.8p1, 0x1.1fffffffffffep5, 0x1.20ff8e9d967dbp5}, + {0x1.8p1, 0x1.27fffffffffc8p5, 0x1.28f8ac4cd98f2p5}, + {0x1.8p1, 0x1.27fffffffffd8p5, 0x1.28f8ac4cd9903p5}, + {0x1.8p1, 0x1.2ffffffffff7cp5, 0x1.30f2264b9c502p5}, + {0x1.8p1, 0x1.2ffffffffffafp5, 0x1.30f2264b9c535p5}, + {0x1.8p1, 0x1.37ffffffffff8p5, 0x1.38ebf58b30cb4p5}, + {0x1.8p1, 0x1.37fffffffffffp5, 0x1.38ebf58b30cbcp5}, + {0x1.8p1, 0x1.3fffffffffffdp5, 0x1.40e613b03f1dcp5}, + {0x1.8p1, 0x1.3ffffffffffffp5, 0x1.40e613b03f1dfp5}, + {0x1.8p1, 0x1.47fffffffffa1p5, 0x1.48e07afd169d5p5}, + {0x1.8p1, 0x1.47fffffffffa8p5, 0x1.48e07afd169dbp5}, + {0x1.8p1, 0x1.4ffffffffff84p5, 0x1.50db263f101e3p5}, + {0x1.8p1, 0x1.4ffffffffff8cp5, 0x1.50db263f101ecp5}, + {0x1.8p1, 0x1.57ffffffffff8p5, 0x1.58d610be831eep5}, + {0x1.8p1, 0x1.58p5, 0x1.58d610be831f7p5}, + {0x1.8p1, 0x1.5fffffffffffap5, 0x1.60d13630e611p5}, + {0x1.8p1, 0x1.5fffffffffffep5, 0x1.60d13630e6113p5}, + {0x1.8p1, 0x1.67fffffffffe8p5, 0x1.68cc92acc47abp5}, + {0x1.8p1, 0x1.68p5, 0x1.68cc92acc47c3p5}, + {0x1.8p1, 0x1.6fffffffffff8p5, 0x1.70c8229f43a38p5}, + {0x1.8p1, 0x1.6fffffffffffap5, 0x1.70c8229f43a3ap5}, + {0x1.8p1, 0x1.77ffffffffffp5, 0x1.78c3e2c2fb433p5}, + {0x1.8p1, 0x1.77ffffffffffep5, 0x1.78c3e2c2fb441p5}, + {0x1.8p1, 0x1.7ffffffffffffp5, 0x1.80bfd017f10a6p5}, + {0x1.8p1, 0x1.87fffffffff5p5, 0x1.88bbe7dc8d9ap5}, + {0x1.8p1, 0x1.88p5, 0x1.88bbe7dc8da5p5}, + {0x1.8p1, 0x1.8ffffffffffe8p5, 0x1.90b8278768b67p5}, + {0x1.8p1, 0x1.9p5, 0x1.90b8278768b8p5}, + {0x1.8p1, 0x1.97fffffffff2bp5, 0x1.98b48cc1ce669p5}, + {0x1.8p1, 0x1.97fffffffff3p5, 0x1.98b48cc1ce66dp5}, + {0x1.8p1, 0x1.9ffffffffff34p5, 0x1.a0b11562e5efcp5}, + {0x1.8p1, 0x1.ap5, 0x1.a0b11562e5fc8p5}, + {0x1.8p1, 0x1.a7fffffffffdp5, 0x1.a8adbf6b63874p5}, + {0x1.8p1, 0x1.a8p5, 0x1.a8adbf6b638a4p5}, + {0x1.8p1, 0x1.affffffffffd8p5, 0x1.b0aa8901b442cp5}, + {0x1.8p1, 0x1.affffffffffe8p5, 0x1.b0aa8901b443dp5}, + {0x1.8p1, 0x1.b7ffffffffffp5, 0x1.b8a7706e94761p5}, + {0x1.8p1, 0x1.b7ffffffffffep5, 0x1.b8a7706e9477p5}, + {0x1.8p1, 0x1.bfffffffffffep5, 0x1.c0a4741a02dcap5}, + {0x1.8p1, 0x1.cp5, 0x1.c0a4741a02dcdp5}, + {0x1.8p1, 0x1.c7fffffffffdp5, 0x1.c8a1928885b75p5}, + {0x1.8p1, 0x1.c7ffffffffff9p5, 0x1.c8a1928885b9fp5}, + {0x1.8p1, 0x1.cffffffffff28p5, 0x1.d09eca58b7d2cp5}, + {0x1.8p1, 0x1.dp5, 0x1.d09eca58b7e04p5}, + {0x1.8p1, 0x1.d7ffffffffffp5, 0x1.d89c1a4115253p5}, + {0x1.8p1, 0x1.d8p5, 0x1.d89c1a4115264p5}, + {0x1.8p1, 0x1.dfffffffffffcp5, 0x1.e099810dfefd1p5}, + {0x1.8p1, 0x1.e7fffffffffdp5, 0x1.e896fd9ff2afep5}, + {0x1.8p1, 0x1.e7ffffffffffap5, 0x1.e896fd9ff2b29p5}, + {0x1.8p1, 0x1.effffffffff98p5, 0x1.f0948ee9ebc7bp5}, + {0x1.8p1, 0x1.effffffffffcap5, 0x1.f0948ee9ebcadp5}, + {0x1.8p1, 0x1.f7fffffffff7p5, 0x1.f89233efeda08p5}, + {0x1.8p1, 0x1.f7fffffffffb2p5, 0x1.f89233efeda4ap5}, + {0x1.8p1, 0x1.ffffffffffda9p5, 0x1.0047f5e2d7ed7p6}, + {0x1.8p1, 0x1.03ffffffffedp6, 0x1.0446dac6b5468p6}, + {0x1.8p1, 0x1.04p6, 0x1.0446dac6b5598p6}, + {0x1.8p1, 0x1.07fffffffffe8p6, 0x1.0845c83b5eb9bp6}, + {0x1.8p1, 0x1.07ffffffffff9p6, 0x1.0845c83b5ebadp6}, + {0x1.8p1, 0x1.0bffffffffe9bp6, 0x1.0c44bdded82bdp6}, + {0x1.8p1, 0x1.0bffffffffebp6, 0x1.0c44bdded82d1p6}, + {0x1.8p1, 0x1.0fffffffffed4p6, 0x1.1043bb54e5cc9p6}, + {0x1.8p1, 0x1.0ffffffffff1fp6, 0x1.1043bb54e5d14p6}, + {0x1.8p1, 0x1.13ffffffffe9p6, 0x1.1442c046a0ea6p6}, + {0x1.8p1, 0x1.13fffffffff5ap6, 0x1.1442c046a0f7p6}, + {0x1.8p1, 0x1.17fffffffffa8p6, 0x1.1841cc62174cbp6}, + {0x1.8p1, 0x1.17fffffffffb8p6, 0x1.1841cc62174dap6}, + {0x1.8p1, 0x1.1bffffffffffp6, 0x1.1c40df59f1a57p6}, + {0x1.8p1, 0x1.1cp6, 0x1.1c40df59f1a67p6}, + {0x1.8p1, 0x1.1fffffffffffap6, 0x1.203ff8e522535p6}, + {0x1.8p1, 0x1.1ffffffffffffp6, 0x1.203ff8e52253bp6}, + {0x1.8p1, 0x1.23fffffffffdp6, 0x1.243f18be9a334p6}, + {0x1.8p1, 0x1.23ffffffffffbp6, 0x1.243f18be9a36p6}, + {0x1.8p1, 0x1.27fffffffffe8p6, 0x1.283e3ea503c63p6}, + {0x1.8p1, 0x1.27ffffffffff8p6, 0x1.283e3ea503c74p6}, + {0x1.8p1, 0x1.2bffffffffdfp6, 0x1.2c3d6a5a83932p6}, + {0x1.8p1, 0x1.2bffffffffe1p6, 0x1.2c3d6a5a83953p6}, + {0x1.8p1, 0x1.2fffffffffffcp6, 0x1.303c9ba47e6d4p6}, + {0x1.8p1, 0x1.3p6, 0x1.303c9ba47e6d8p6}, + {0x1.8p1, 0x1.33fffffffffdp6, 0x1.343bd24b62468p6}, + {0x1.8p1, 0x1.33fffffffffffp6, 0x1.343bd24b62498p6}, + {0x1.8p1, 0x1.37ffffffffff8p6, 0x1.383b0e1a75c0ap6}, + {0x1.8p1, 0x1.37fffffffffffp6, 0x1.383b0e1a75c12p6}, + {0x1.8p1, 0x1.3bffffffffffp6, 0x1.3c3a4edfa9748p6}, + {0x1.8p1, 0x1.3bffffffffffep6, 0x1.3c3a4edfa9756p6}, + {0x1.8p1, 0x1.3fffffffffd4dp6, 0x1.4039946b6d79fp6}, + {0x1.8p1, 0x1.3ffffffffffffp6, 0x1.4039946b6da51p6}, + {0x1.8p1, 0x1.43fffffffff9p6, 0x1.4438de908abeap6}, + {0x1.8p1, 0x1.43fffffffffbp6, 0x1.4438de908ac0bp6}, + {0x1.8p1, 0x1.47ffffffffd08p6, 0x1.48382d23fccedp6}, + {0x1.8p1, 0x1.47fffffffffa2p6, 0x1.48382d23fcf87p6}, + {0x1.8p1, 0x1.4bffffffffcebp6, 0x1.4c377ffcd212fp6}, + {0x1.8p1, 0x1.4bffffffffcfp6, 0x1.4c377ffcd2133p6}, + {0x1.8p1, 0x1.4ffffffffff44p6, 0x1.5036d6f40ad53p6}, + {0x1.8p1, 0x1.4ffffffffff9bp6, 0x1.5036d6f40adaap6}, + {0x1.8p1, 0x1.53ffffffffedp6, 0x1.543631e47c1e1p6}, + {0x1.8p1, 0x1.54p6, 0x1.543631e47c311p6}, + {0x1.8p1, 0x1.57ffffffffd78p6, 0x1.583590aab542dp6}, + {0x1.8p1, 0x1.58p6, 0x1.583590aab56b5p6}, + {0x1.8p1, 0x1.5bffffffffc7p6, 0x1.5c34f324e60eep6}, + {0x1.8p1, 0x1.5bffffffffc9p6, 0x1.5c34f324e610fp6}, + {0x1.8p1, 0x1.5fffffffffffdp6, 0x1.60345932c760dp6}, + {0x1.8p1, 0x1.5fffffffffffep6, 0x1.60345932c760dp6}, + {0x1.8p1, 0x1.63fffffffff79p6, 0x1.6433c2b58421fp6}, + {0x1.8p1, 0x1.63fffffffff9p6, 0x1.6433c2b584235p6}, + {0x1.8p1, 0x1.67ffffffffda8p6, 0x1.68332f8fa63a6p6}, + {0x1.8p1, 0x1.67fffffffff4dp6, 0x1.68332f8fa654bp6}, + {0x1.8p1, 0x1.6bfffffffffep6, 0x1.6c329fa502ccfp6}, + {0x1.8p1, 0x1.6cp6, 0x1.6c329fa502cefp6}, + {0x1.8p1, 0x1.6fffffffffff8p6, 0x1.703212daa75f3p6}, + {0x1.8p1, 0x1.6ffffffffffffp6, 0x1.703212daa75fbp6}, + {0x1.8p1, 0x1.73fffffffffap6, 0x1.74318916ca409p6}, + {0x1.8p1, 0x1.74p6, 0x1.74318916ca46ap6}, + {0x1.8p1, 0x1.77ffffffffffp6, 0x1.78310240ba47p6}, + {0x1.8p1, 0x1.78p6, 0x1.78310240ba481p6}, + {0x1.8p1, 0x1.7bfffffffffep6, 0x1.7c307e40cff7fp6}, + {0x1.8p1, 0x1.7bfffffffffe4p6, 0x1.7c307e40cff83p6}, + {0x1.8p1, 0x1.7fffffffffff7p6, 0x1.802ffd005ff07p6}, + {0x1.8p1, 0x1.7fffffffffff9p6, 0x1.802ffd005ff0ap6}, + {0x1.8p1, 0x1.83fffffffffap6, 0x1.842f7e69adc1ep6}, + {0x1.8p1, 0x1.83fffffffffffp6, 0x1.842f7e69adc7dp6}, + {0x1.8p1, 0x1.87fffffffffdp6, 0x1.882f0267dfef4p6}, + {0x1.8p1, 0x1.88p6, 0x1.882f0267dff24p6}, + {0x1.8p1, 0x1.8bfffffffffep6, 0x1.8c2e88e6f449ap6}, + {0x1.8p1, 0x1.8bffffffffff6p6, 0x1.8c2e88e6f44b1p6}, + {0x1.8p1, 0x1.8ffffffffffe8p6, 0x1.902e11d3b5549p6}, + {0x1.8p1, 0x1.8fffffffffffep6, 0x1.902e11d3b556p6}, + }; + + for (double[] testCase: testCases) + failures+=testHypotCase(testCase[0], testCase[1], testCase[2]); + + return failures; + } + + public static void main(String [] argv) { + int failures = 0; + + failures += testHypot(); + + if (failures > 0) { + System.err.println("Testing log1p incurred " + + failures + " failures."); + throw new RuntimeException(); + } + } +} diff --git a/jdk/test/java/lang/StrictMath/Log10Tests.java b/jdk/test/java/lang/StrictMath/Log10Tests.java new file mode 100644 index 00000000000..2c61ba1acd3 --- /dev/null +++ b/jdk/test/java/lang/StrictMath/Log10Tests.java @@ -0,0 +1,724 @@ +/* + * Copyright 2003-2004 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4074599 + * @summary Tests for StrictMath.log10 + * @author Joseph D. Darcy + */ + + +/** + * The tests in ../Math/Log10Tests.java test properties that should + * hold for any log10 implementation, including the FDLIBM-based one + * required for StrictMath.log10. Therefore, the test cases in + * ../Math/Log10Tests.java are run against both the Math and + * StrictMath versions of log10. The role of this test is to verify + * that the FDLIBM log10 algorithm is being used by running golden + * file tests on values that may vary from one conforming log10 + * implementation to another. + */ + +public class Log10Tests { + private Log10Tests(){} + + static int testLog10Case(double input, double expected) { + return Tests.test("StrictMath.log10(double)", input, + StrictMath.log10(input), expected); + } + + static int testLog10() { + int failures = 0; + double [][] testCases = { + {0x1.3fffffffffec1p-297, -0x1.653c6a27ae2f8p6}, + {0x1.4p-297, -0x1.653c6a27ae2f7p6}, + {0x1.3fffffffffbe1p-296, -0x1.640828f2a4382p6}, + {0x1.4p-296, -0x1.640828f2a437dp6}, + {0x1.3fffffffffd52p-295, -0x1.62d3e7bd9a406p6}, + {0x1.4p-295, -0x1.62d3e7bd9a403p6}, + {0x1.3fffffffffa72p-294, -0x1.619fa6889049p6}, + {0x1.4p-294, -0x1.619fa68890489p6}, + {0x1.3fffffffff9bbp-293, -0x1.606b655386518p6}, + {0x1.4p-293, -0x1.606b65538650fp6}, + {0x1.3fffffffffbe4p-292, -0x1.5f37241e7c59ap6}, + {0x1.4p-292, -0x1.5f37241e7c595p6}, + {0x1.3ffffffffff7ep-291, -0x1.5e02e2e97261cp6}, + {0x1.4p-291, -0x1.5e02e2e97261bp6}, + {0x1.3fffffffffc9ep-290, -0x1.5ccea1b4686a6p6}, + {0x1.4p-290, -0x1.5ccea1b4686a1p6}, + {0x1.3fffffffffec7p-289, -0x1.5b9a607f5e728p6}, + {0x1.4p-289, -0x1.5b9a607f5e727p6}, + {0x1.3fffffffffbe7p-288, -0x1.5a661f4a547b2p6}, + {0x1.4p-288, -0x1.5a661f4a547adp6}, + {0x1.3fffffffff907p-287, -0x1.5931de154a83cp6}, + {0x1.4p-287, -0x1.5931de154a833p6}, + {0x1.3fffffffffd59p-286, -0x1.57fd9ce0408bcp6}, + {0x1.4p-286, -0x1.57fd9ce0408b9p6}, + {0x1.3fffffffffecap-285, -0x1.56c95bab3694p6}, + {0x1.4p-285, -0x1.56c95bab3693fp6}, + {0x1.3fffffffffbeap-284, -0x1.55951a762c9cap6}, + {0x1.4p-284, -0x1.55951a762c9c5p6}, + {0x1.3ffffffffff84p-283, -0x1.5460d94122a4cp6}, + {0x1.4p-283, -0x1.5460d94122a4bp6}, + {0x1.3fffffffffca4p-282, -0x1.532c980c18ad6p6}, + {0x1.4p-282, -0x1.532c980c18ad1p6}, + {0x1.3fffffffff9c4p-281, -0x1.51f856d70eb6p6}, + {0x1.4p-281, -0x1.51f856d70eb57p6}, + {0x1.3fffffffffe16p-280, -0x1.50c415a204bep6}, + {0x1.4p-280, -0x1.50c415a204bddp6}, + {0x1.3fffffffffd5ep-279, -0x1.4f8fd46cfac66p6}, + {0x1.4p-279, -0x1.4f8fd46cfac63p6}, + {0x1.3fffffffffd5fp-278, -0x1.4e5b9337f0cecp6}, + {0x1.4p-278, -0x1.4e5b9337f0ce9p6}, + {0x1.3fffffffffedp-277, -0x1.4d275202e6d7p6}, + {0x1.4p-277, -0x1.4d275202e6d6fp6}, + {0x1.3fffffffffbfp-276, -0x1.4bf310cddcdfap6}, + {0x1.4p-276, -0x1.4bf310cddcdf5p6}, + {0x1.3ffffffffff8ap-275, -0x1.4abecf98d2e7bp6}, + {0x1.4p-275, -0x1.4abecf98d2e7bp6}, + {0x1.3fffffffffd62p-274, -0x1.498a8e63c8f04p6}, + {0x1.4p-274, -0x1.498a8e63c8f01p6}, + {0x1.3fffffffff9cap-273, -0x1.48564d2ebef9p6}, + {0x1.4p-273, -0x1.48564d2ebef87p6}, + {0x1.3fffffffff6eap-272, -0x1.47220bf9b501ap6}, + {0x1.4p-272, -0x1.47220bf9b500dp6}, + {0x1.3fffffffffb3cp-271, -0x1.45edcac4ab09ap6}, + {0x1.4p-271, -0x1.45edcac4ab093p6}, + {0x1.3fffffffffd65p-270, -0x1.44b9898fa111cp6}, + {0x1.4p-270, -0x1.44b9898fa1119p6}, + {0x1.3fffffffffa85p-269, -0x1.4385485a971a6p6}, + {0x1.4p-269, -0x1.4385485a9719fp6}, + {0x1.3ffffffffe2c7p-268, -0x1.425107258d24dp6}, + {0x1.3fffffffffed7p-268, -0x1.425107258d226p6}, + {0x1.4p-268, -0x1.425107258d225p6}, + {0x1.3fffffffff916p-267, -0x1.411cc5f0832b4p6}, + {0x1.4p-267, -0x1.411cc5f0832abp6}, + {0x1.3fffffffffd68p-266, -0x1.3fe884bb79334p6}, + {0x1.4p-266, -0x1.3fe884bb79331p6}, + {0x1.3fffffffffe21p-265, -0x1.3eb443866f3b9p6}, + {0x1.4p-265, -0x1.3eb443866f3b7p6}, + {0x1.3fffffffffedap-264, -0x1.3d8002516543ep6}, + {0x1.4p-264, -0x1.3d8002516543dp6}, + {0x1.3fffffffffbfap-263, -0x1.3c4bc11c5b4c9p6}, + {0x1.4p-263, -0x1.3c4bc11c5b4c3p6}, + {0x1.3fffffffff862p-262, -0x1.3b177fe751554p6}, + {0x1.4p-262, -0x1.3b177fe751549p6}, + {0x1.3fffffffffa8bp-261, -0x1.39e33eb2475d6p6}, + {0x1.4p-261, -0x1.39e33eb2475cfp6}, + {0x1.3fffffffffeddp-260, -0x1.38aefd7d3d656p6}, + {0x1.4p-260, -0x1.38aefd7d3d655p6}, + {0x1.3fffffffffbfdp-259, -0x1.377abc48336ep6}, + {0x1.4p-259, -0x1.377abc48336dbp6}, + {0x1.3ffffffffff97p-258, -0x1.36467b1329762p6}, + {0x1.4p-258, -0x1.36467b1329761p6}, + {0x1.3fffffffffedfp-257, -0x1.351239de1f7e8p6}, + {0x1.4p-257, -0x1.351239de1f7e7p6}, + {0x1.3fffffffffeep-256, -0x1.33ddf8a91586ep6}, + {0x1.4p-256, -0x1.33ddf8a91586dp6}, + {0x1.3fffffffffcp-255, -0x1.32a9b7740b8f8p6}, + {0x1.4p-255, -0x1.32a9b7740b8f3p6}, + {0x1.3fffffffffd71p-254, -0x1.3175763f0197cp6}, + {0x1.4p-254, -0x1.3175763f01979p6}, + {0x1.3fffffffff588p-253, -0x1.30413509f7a0ep6}, + {0x1.4p-253, -0x1.30413509f79ffp6}, + {0x1.3fffffffff7b1p-252, -0x1.2f0cf3d4eda9p6}, + {0x1.4p-252, -0x1.2f0cf3d4eda85p6}, + {0x1.3fffffffffc03p-251, -0x1.2dd8b29fe3b1p6}, + {0x1.4p-251, -0x1.2dd8b29fe3b0bp6}, + {0x1.3fffffffff86bp-250, -0x1.2ca4716ad9b9cp6}, + {0x1.4p-250, -0x1.2ca4716ad9b91p6}, + {0x1.3fffffffffcbdp-249, -0x1.2b703035cfc1cp6}, + {0x1.4p-249, -0x1.2b703035cfc17p6}, + {0x1.3fffffffffee6p-248, -0x1.2a3bef00c5c9ep6}, + {0x1.4p-248, -0x1.2a3bef00c5c9dp6}, + {0x1.3fffffffffc06p-247, -0x1.2907adcbbbd28p6}, + {0x1.4p-247, -0x1.2907adcbbbd23p6}, + {0x1.3fffffffffd77p-246, -0x1.27d36c96b1dacp6}, + {0x1.4p-246, -0x1.27d36c96b1da9p6}, + {0x1.3fffffffffd78p-245, -0x1.269f2b61a7e32p6}, + {0x1.4p-245, -0x1.269f2b61a7e2fp6}, + {0x1.3ffffffffea0bp-244, -0x1.256aea2c9ded3p6}, + {0x1.3fffffffffee9p-244, -0x1.256aea2c9deb6p6}, + {0x1.4p-244, -0x1.256aea2c9deb5p6}, + {0x1.3fffffffffe32p-243, -0x1.2436a8f793f3ep6}, + {0x1.4p-243, -0x1.2436a8f793f3bp6}, + {0x1.3ffffffffffa3p-242, -0x1.230267c289fc2p6}, + {0x1.4p-242, -0x1.230267c289fc1p6}, + {0x1.3fffffffff591p-241, -0x1.21ce268d80056p6}, + {0x1.4p-241, -0x1.21ce268d80047p6}, + {0x1.3fffffffff9e3p-240, -0x1.2099e558760d6p6}, + {0x1.4p-240, -0x1.2099e558760cdp6}, + {0x1.3fffffffffc0cp-239, -0x1.1f65a4236c158p6}, + {0x1.4p-239, -0x1.1f65a4236c153p6}, + {0x1.3fffffffffd7dp-238, -0x1.1e3162ee621dcp6}, + {0x1.4p-238, -0x1.1e3162ee621d9p6}, + {0x1.3fffffffffd7ep-237, -0x1.1cfd21b958262p6}, + {0x1.4p-237, -0x1.1cfd21b95825fp6}, + {0x1.3fffffffffeefp-236, -0x1.1bc8e0844e2e6p6}, + {0x1.4p-236, -0x1.1bc8e0844e2e5p6}, + {0x1.3fffffffffc0fp-235, -0x1.1a949f4f4437p6}, + {0x1.4p-235, -0x1.1a949f4f4436bp6}, + {0x1.3ffffffffffa9p-234, -0x1.19605e1a3a3f1p6}, + {0x1.4p-234, -0x1.19605e1a3a3f1p6}, + {0x1.3ffffffffffaap-233, -0x1.182c1ce530478p6}, + {0x1.4p-233, -0x1.182c1ce530477p6}, + {0x1.3fffffffff2b7p-232, -0x1.16f7dbb02651p6}, + {0x1.4p-232, -0x1.16f7dbb0264fdp6}, + {0x1.3fffffffffef3p-231, -0x1.15c39a7b1c584p6}, + {0x1.4p-231, -0x1.15c39a7b1c583p6}, + {0x1.3fffffffff932p-230, -0x1.148f594612612p6}, + {0x1.4p-230, -0x1.148f594612609p6}, + {0x1.3fffffffffd84p-229, -0x1.135b181108692p6}, + {0x1.4p-229, -0x1.135b18110868fp6}, + {0x1.3fffffffffaa4p-228, -0x1.1226d6dbfe71cp6}, + {0x1.4p-228, -0x1.1226d6dbfe715p6}, + {0x1.3fffffffffef6p-227, -0x1.10f295a6f479cp6}, + {0x1.4p-227, -0x1.10f295a6f479bp6}, + {0x1.3fffffffffd86p-226, -0x1.0fbe5471ea824p6}, + {0x1.4p-226, -0x1.0fbe5471ea821p6}, + {0x1.3fffffffffd87p-225, -0x1.0e8a133ce08aap6}, + {0x1.4p-225, -0x1.0e8a133ce08a7p6}, + {0x1.3fffffffffef8p-224, -0x1.0d55d207d692ep6}, + {0x1.4p-224, -0x1.0d55d207d692dp6}, + {0x1.3fffffffffef9p-223, -0x1.0c2190d2cc9b4p6}, + {0x1.4p-223, -0x1.0c2190d2cc9b3p6}, + {0x1.3fffffffff42fp-222, -0x1.0aed4f9dc2a4ap6}, + {0x1.4p-222, -0x1.0aed4f9dc2a39p6}, + {0x1.3fffffffff658p-221, -0x1.09b90e68b8accp6}, + {0x1.4p-221, -0x1.09b90e68b8abfp6}, + {0x1.3fffffffffaaap-220, -0x1.0884cd33aeb4cp6}, + {0x1.4p-220, -0x1.0884cd33aeb45p6}, + {0x1.3fffffffffefcp-219, -0x1.07508bfea4bccp6}, + {0x1.4p-219, -0x1.07508bfea4bcbp6}, + {0x1.3fffffffffc1cp-218, -0x1.061c4ac99ac56p6}, + {0x1.4p-218, -0x1.061c4ac99ac51p6}, + {0x1.3fffffffffd8dp-217, -0x1.04e8099490cdap6}, + {0x1.4p-217, -0x1.04e8099490cd7p6}, + {0x1.3fffffffffaadp-216, -0x1.03b3c85f86d65p6}, + {0x1.3fffffffffefep-216, -0x1.03b3c85f86d5ep6}, + {0x1.4p-216, -0x1.03b3c85f86d5dp6}, + {0x1.3ffffffffdbbdp-215, -0x1.027f872a7ce16p6}, + {0x1.3fffffffffeffp-215, -0x1.027f872a7cde4p6}, + {0x1.4p-215, -0x1.027f872a7cde3p6}, + {0x1.3fffffffffc1fp-214, -0x1.014b45f572e6ep6}, + {0x1.4p-214, -0x1.014b45f572e69p6}, + {0x1.3ffffffffffb9p-213, -0x1.001704c068efp6}, + {0x1.4p-213, -0x1.001704c068eefp6}, + {0x1.3fffffffffdbfp-212, -0x1.fdc58716bdefp5}, + {0x1.4p-212, -0x1.fdc58716bdeeap5}, + {0x1.3ffffffffff3p-211, -0x1.fb5d04aca9ff8p5}, + {0x1.4p-211, -0x1.fb5d04aca9ff6p5}, + {0x1.3ffffffffffe9p-210, -0x1.f8f4824296102p5}, + {0x1.4p-210, -0x1.f8f4824296102p5}, + {0x1.3fffffffffd09p-209, -0x1.f68bffd882216p5}, + {0x1.4p-209, -0x1.f68bffd88220ep5}, + {0x1.3fffffffffdc2p-208, -0x1.f4237d6e6e32p5}, + {0x1.4p-208, -0x1.f4237d6e6e31ap5}, + {0x1.3fffffffff23fp-207, -0x1.f1bafb045a44cp5}, + {0x1.3fffffffffe7bp-207, -0x1.f1bafb045a42ap5}, + {0x1.4p-207, -0x1.f1bafb045a426p5}, + {0x1.3ffffffffffecp-206, -0x1.ef52789a46532p5}, + {0x1.4p-206, -0x1.ef52789a46532p5}, + {0x1.3fffffffffdc4p-205, -0x1.ece9f63032644p5}, + {0x1.4p-205, -0x1.ece9f6303263ep5}, + {0x1.3ffffffffe211p-204, -0x1.ea8173c61e79ep5}, + {0x1.3ffffffffff35p-204, -0x1.ea8173c61e74cp5}, + {0x1.4p-204, -0x1.ea8173c61e74ap5}, + {0x1.3ffffffffec25p-203, -0x1.e818f15c0a88ep5}, + {0x1.3fffffffffe7ep-203, -0x1.e818f15c0a85ap5}, + {0x1.4p-203, -0x1.e818f15c0a856p5}, + {0x1.3ffffffffdcadp-202, -0x1.e5b06ef1f69c5p5}, + {0x1.3fffffffffedbp-202, -0x1.e5b06ef1f6966p5}, + {0x1.4p-202, -0x1.e5b06ef1f6962p5}, + {0x1.3fffffffffd0fp-201, -0x1.e347ec87e2a76p5}, + {0x1.4p-201, -0x1.e347ec87e2a6ep5}, + {0x1.3fffffffffe8p-200, -0x1.e0df6a1dceb7ep5}, + {0x1.4p-200, -0x1.e0df6a1dceb7ap5}, + {0x1.3ffffffffff39p-199, -0x1.de76e7b3bac88p5}, + {0x1.4p-199, -0x1.de76e7b3bac86p5}, + {0x1.3fffffffffff2p-198, -0x1.dc0e6549a6d92p5}, + {0x1.4p-198, -0x1.dc0e6549a6d92p5}, + {0x1.3ffffffffff97p-197, -0x1.d9a5e2df92eap5}, + {0x1.4p-197, -0x1.d9a5e2df92e9ep5}, + {0x1.3fffffffffdcbp-196, -0x1.d73d60757efbp5}, + {0x1.4p-196, -0x1.d73d60757efaap5}, + {0x1.3ffffffffff3cp-195, -0x1.d4d4de0b6b0b8p5}, + {0x1.4p-195, -0x1.d4d4de0b6b0b6p5}, + {0x1.3fffffffffee1p-194, -0x1.d26c5ba1571c6p5}, + {0x1.4p-194, -0x1.d26c5ba1571c2p5}, + {0x1.3ffffffffff9ap-193, -0x1.d003d937432dp5}, + {0x1.4p-193, -0x1.d003d937432cep5}, + {0x1.3fffffffffdcep-192, -0x1.cd9b56cd2f3ep5}, + {0x1.4p-192, -0x1.cd9b56cd2f3dap5}, + {0x1.3fffffffffe87p-191, -0x1.cb32d4631b4eap5}, + {0x1.4p-191, -0x1.cb32d4631b4e6p5}, + {0x1.3fffffffffff8p-190, -0x1.c8ca51f9075f2p5}, + {0x1.4p-190, -0x1.c8ca51f9075f2p5}, + {0x1.3fffffffffff9p-189, -0x1.c661cf8ef36fep5}, + {0x1.4p-189, -0x1.c661cf8ef36fep5}, + {0x1.3fffffffffdd1p-188, -0x1.c3f94d24df81p5}, + {0x1.4p-188, -0x1.c3f94d24df80ap5}, + {0x1.3fffffffffe8ap-187, -0x1.c190cabacb91ap5}, + {0x1.4p-187, -0x1.c190cabacb916p5}, + {0x1.3ffffffffff43p-186, -0x1.bf284850b7a24p5}, + {0x1.4p-186, -0x1.bf284850b7a22p5}, + {0x1.3fffffffffffcp-185, -0x1.bcbfc5e6a3b2ep5}, + {0x1.4p-185, -0x1.bcbfc5e6a3b2ep5}, + {0x1.3ffffffffffa1p-184, -0x1.ba57437c8fc3cp5}, + {0x1.4p-184, -0x1.ba57437c8fc3ap5}, + {0x1.3fffffffffd79p-183, -0x1.b7eec1127bd4ep5}, + {0x1.4p-183, -0x1.b7eec1127bd46p5}, + {0x1.3fffffffffe32p-182, -0x1.b5863ea867e58p5}, + {0x1.4p-182, -0x1.b5863ea867e52p5}, + {0x1.3ffffffffe4a7p-181, -0x1.b31dbc3e53faap5}, + {0x1.3ffffffffffffp-181, -0x1.b31dbc3e53f5ep5}, + {0x1.4p-181, -0x1.b31dbc3e53f5ep5}, + {0x1.3fffffffffdd7p-180, -0x1.b0b539d44007p5}, + {0x1.4p-180, -0x1.b0b539d44006ap5}, + {0x1.3fffffffffa9bp-179, -0x1.ae4cb76a2c185p5}, + {0x1.3fffffffffe9p-179, -0x1.ae4cb76a2c17ap5}, + {0x1.4p-179, -0x1.ae4cb76a2c177p5}, + {0x1.3ffffffffe3f1p-178, -0x1.abe43500182d1p5}, + {0x1.3ffffffffff49p-178, -0x1.abe4350018284p5}, + {0x1.4p-178, -0x1.abe4350018283p5}, + {0x1.3fffffffffc69p-177, -0x1.a97bb29604398p5}, + {0x1.4p-177, -0x1.a97bb2960438fp5}, + {0x1.3fffffffffddap-176, -0x1.a713302bf04ap5}, + {0x1.4p-176, -0x1.a713302bf049bp5}, + {0x1.3fffffffffe93p-175, -0x1.a4aaadc1dc5aap5}, + {0x1.4p-175, -0x1.a4aaadc1dc5a7p5}, + {0x1.3fffffffff481p-174, -0x1.a2422b57c86d3p5}, + {0x1.3fffffffffe38p-174, -0x1.a2422b57c86b8p5}, + {0x1.4p-174, -0x1.a2422b57c86b3p5}, + {0x1.3fffffffffef1p-173, -0x1.9fd9a8edb47c2p5}, + {0x1.4p-173, -0x1.9fd9a8edb47bfp5}, + {0x1.3ffffffffffaap-172, -0x1.9d712683a08ccp5}, + {0x1.4p-172, -0x1.9d712683a08cbp5}, + {0x1.3fffffffffddep-171, -0x1.9b08a4198c9dcp5}, + {0x1.4p-171, -0x1.9b08a4198c9d7p5}, + {0x1.3ffffffffff4fp-170, -0x1.98a021af78ae4p5}, + {0x1.4p-170, -0x1.98a021af78ae3p5}, + {0x1.3fffffffffd27p-169, -0x1.96379f4564bf6p5}, + {0x1.4p-169, -0x1.96379f4564befp5}, + {0x1.3fffffffffdep-168, -0x1.93cf1cdb50dp5}, + {0x1.4p-168, -0x1.93cf1cdb50cfbp5}, + {0x1.3fffffffffe99p-167, -0x1.91669a713ce0ap5}, + {0x1.4p-167, -0x1.91669a713ce07p5}, + {0x1.3ffffffffff52p-166, -0x1.8efe180728f14p5}, + {0x1.4p-166, -0x1.8efe180728f13p5}, + {0x1.3fffffffffc72p-165, -0x1.8c95959d15028p5}, + {0x1.4p-165, -0x1.8c95959d1501fp5}, + {0x1.3ffffffffffbp-164, -0x1.8a2d13330112cp5}, + {0x1.4p-164, -0x1.8a2d13330112bp5}, + {0x1.3fffffffffd88p-163, -0x1.87c490c8ed23ep5}, + {0x1.4p-163, -0x1.87c490c8ed237p5}, + {0x1.3fffffffffe9dp-162, -0x1.855c0e5ed9346p5}, + {0x1.4p-162, -0x1.855c0e5ed9343p5}, + {0x1.3fffffffffefap-161, -0x1.82f38bf4c5452p5}, + {0x1.4p-161, -0x1.82f38bf4c544fp5}, + {0x1.3fffffffffd2ep-160, -0x1.808b098ab1562p5}, + {0x1.4p-160, -0x1.808b098ab155bp5}, + {0x1.3fffffffffe9fp-159, -0x1.7e2287209d66ap5}, + {0x1.4p-159, -0x1.7e2287209d667p5}, + {0x1.3ffffffffff58p-158, -0x1.7bba04b689774p5}, + {0x1.4p-158, -0x1.7bba04b689773p5}, + {0x1.3fffffffff099p-157, -0x1.7951824c758aap5}, + {0x1.3ffffffffff59p-157, -0x1.7951824c7588p5}, + {0x1.4p-157, -0x1.7951824c7587fp5}, + {0x1.3fffffffffd31p-156, -0x1.76e8ffe261992p5}, + {0x1.4p-156, -0x1.76e8ffe26198bp5}, + {0x1.3fffffffffdeap-155, -0x1.74807d784da9cp5}, + {0x1.4p-155, -0x1.74807d784da97p5}, + {0x1.3fffffffffea3p-154, -0x1.7217fb0e39ba6p5}, + {0x1.4p-154, -0x1.7217fb0e39ba3p5}, + {0x1.3fffffffffc7bp-153, -0x1.6faf78a425cb8p5}, + {0x1.3ffffffffff5cp-153, -0x1.6faf78a425cbp5}, + {0x1.4p-153, -0x1.6faf78a425cafp5}, + {0x1.3ffffffffffb9p-152, -0x1.6d46f63a11dbcp5}, + {0x1.4p-152, -0x1.6d46f63a11dbbp5}, + {0x1.3fffffffffa54p-151, -0x1.6ade73cffded6p5}, + {0x1.4p-151, -0x1.6ade73cffdec7p5}, + {0x1.3fffffffffbc5p-150, -0x1.6875f165e9fdfp5}, + {0x1.3fffffffffea6p-150, -0x1.6875f165e9fd6p5}, + {0x1.4p-150, -0x1.6875f165e9fd3p5}, + {0x1.3ffffffffff5fp-149, -0x1.660d6efbd60ep5}, + {0x1.4p-149, -0x1.660d6efbd60dfp5}, + {0x1.3fffffffffdefp-148, -0x1.63a4ec91c21fp5}, + {0x1.4p-148, -0x1.63a4ec91c21ebp5}, + {0x1.3fffffffffea8p-147, -0x1.613c6a27ae2fap5}, + {0x1.4p-147, -0x1.613c6a27ae2f7p5}, + {0x1.3ffffffffff61p-146, -0x1.5ed3e7bd9a404p5}, + {0x1.4p-146, -0x1.5ed3e7bd9a403p5}, + {0x1.3ffffffffff62p-145, -0x1.5c6b65538651p5}, + {0x1.4p-145, -0x1.5c6b65538650fp5}, + {0x1.3ffffffffffbfp-144, -0x1.5a02e2e97261cp5}, + {0x1.4p-144, -0x1.5a02e2e97261bp5}, + {0x1.3fffffffffcdfp-143, -0x1.579a607f5e73p5}, + {0x1.4p-143, -0x1.579a607f5e727p5}, + {0x1.3fffffffffd98p-142, -0x1.5531de154a83ap5}, + {0x1.4p-142, -0x1.5531de154a833p5}, + {0x1.3fffffffffe51p-141, -0x1.52c95bab36944p5}, + {0x1.4p-141, -0x1.52c95bab3693fp5}, + {0x1.3ffffffffffc2p-140, -0x1.5060d94122a4cp5}, + {0x1.4p-140, -0x1.5060d94122a4bp5}, + {0x1.3fffffffffdf6p-139, -0x1.4df856d70eb5cp5}, + {0x1.4p-139, -0x1.4df856d70eb57p5}, + {0x1.3fffffffffeafp-138, -0x1.4b8fd46cfac66p5}, + {0x1.4p-138, -0x1.4b8fd46cfac63p5}, + {0x1.3ffffffffff68p-137, -0x1.49275202e6d7p5}, + {0x1.4p-137, -0x1.49275202e6d6fp5}, + {0x1.3ffffffffffc5p-136, -0x1.46becf98d2e7bp5}, + {0x1.4p-136, -0x1.46becf98d2e7bp5}, + {0x1.3fffffffffdf9p-135, -0x1.44564d2ebef8cp5}, + {0x1.4p-135, -0x1.44564d2ebef87p5}, + {0x1.3fffffffffeb2p-134, -0x1.41edcac4ab096p5}, + {0x1.4p-134, -0x1.41edcac4ab093p5}, + {0x1.3ffffffffff6bp-133, -0x1.3f85485a971ap5}, + {0x1.4p-133, -0x1.3f85485a9719fp5}, + {0x1.3ffffffffe699p-132, -0x1.3d1cc5f0832f2p5}, + {0x1.3ffffffffff1p-132, -0x1.3d1cc5f0832aep5}, + {0x1.4p-132, -0x1.3d1cc5f0832abp5}, + {0x1.3ffffffffffc9p-131, -0x1.3ab443866f3b8p5}, + {0x1.4p-131, -0x1.3ab443866f3b7p5}, + {0x1.3fffffffffda1p-130, -0x1.384bc11c5b4cap5}, + {0x1.4p-130, -0x1.384bc11c5b4c3p5}, + {0x1.3ffffffffed15p-129, -0x1.35e33eb247604p5}, + {0x1.3ffffffffff6ep-129, -0x1.35e33eb2475dp5}, + {0x1.4p-129, -0x1.35e33eb2475cfp5}, + {0x1.3ffffffffdd9dp-128, -0x1.337abc483373bp5}, + {0x1.3fffffffffd46p-128, -0x1.337abc48336e2p5}, + {0x1.4p-128, -0x1.337abc48336dbp5}, + {0x1.3fffffffffdffp-127, -0x1.311239de1f7ecp5}, + {0x1.4p-127, -0x1.311239de1f7e7p5}, + {0x1.3fffffffff391p-126, -0x1.2ea9b7740b916p5}, + {0x1.3ffffffffff7p-126, -0x1.2ea9b7740b8f4p5}, + {0x1.4p-126, -0x1.2ea9b7740b8f3p5}, + {0x1.3ffffffffff71p-125, -0x1.2c413509f7ap5}, + {0x1.4p-125, -0x1.2c413509f79ffp5}, + {0x1.3fffffffffc91p-124, -0x1.29d8b29fe3b14p5}, + {0x1.4p-124, -0x1.29d8b29fe3b0bp5}, + {0x1.3fffffffffd4ap-123, -0x1.27703035cfc1ep5}, + {0x1.4p-123, -0x1.27703035cfc17p5}, + {0x1.3fffffffffe03p-122, -0x1.2507adcbbbd28p5}, + {0x1.4p-122, -0x1.2507adcbbbd23p5}, + {0x1.3fffffffffebcp-121, -0x1.229f2b61a7e32p5}, + {0x1.4p-121, -0x1.229f2b61a7e2fp5}, + {0x1.3ffffffffff19p-120, -0x1.2036a8f793f3ep5}, + {0x1.4p-120, -0x1.2036a8f793f3bp5}, + {0x1.3fffffffffd4dp-119, -0x1.1dce268d8004ep5}, + {0x1.4p-119, -0x1.1dce268d80047p5}, + {0x1.3fffffffffebep-118, -0x1.1b65a4236c156p5}, + {0x1.4p-118, -0x1.1b65a4236c153p5}, + {0x1.3ffffffffff77p-117, -0x1.18fd21b95826p5}, + {0x1.4p-117, -0x1.18fd21b95825fp5}, + {0x1.3ffffffffffd4p-116, -0x1.16949f4f4436bp5}, + {0x1.4p-116, -0x1.16949f4f4436bp5}, + {0x1.3fffffffffe08p-115, -0x1.142c1ce53047cp5}, + {0x1.4p-115, -0x1.142c1ce530477p5}, + {0x1.3fffffffffe09p-114, -0x1.11c39a7b1c588p5}, + {0x1.4p-114, -0x1.11c39a7b1c583p5}, + {0x1.3fffffffffec2p-113, -0x1.0f5b181108692p5}, + {0x1.4p-113, -0x1.0f5b18110868fp5}, + {0x1.3ffffffffff7bp-112, -0x1.0cf295a6f479cp5}, + {0x1.4p-112, -0x1.0cf295a6f479bp5}, + {0x1.3ffffffffffd8p-111, -0x1.0a8a133ce08a8p5}, + {0x1.4p-111, -0x1.0a8a133ce08a7p5}, + {0x1.3fffffffffa73p-110, -0x1.082190d2cc9c2p5}, + {0x1.4p-110, -0x1.082190d2cc9b3p5}, + {0x1.3fffffffffec5p-109, -0x1.05b90e68b8ac2p5}, + {0x1.4p-109, -0x1.05b90e68b8abfp5}, + {0x1.3ffffffffedddp-108, -0x1.03508bfea4bfep5}, + {0x1.3ffffffffff7ep-108, -0x1.03508bfea4bccp5}, + {0x1.4p-108, -0x1.03508bfea4bcbp5}, + {0x1.3ffffffffde65p-107, -0x1.00e8099490d35p5}, + {0x1.3fffffffffe0ep-107, -0x1.00e8099490cdcp5}, + {0x1.4p-107, -0x1.00e8099490cd7p5}, + {0x1.3ffffffffed3dp-106, -0x1.fcff0e54f9c2fp4}, + {0x1.3fffffffffe82p-106, -0x1.fcff0e54f9bcep4}, + {0x1.4p-106, -0x1.fcff0e54f9bc6p4}, + {0x1.3fffffffffff3p-105, -0x1.f82e0980d1ddep4}, + {0x1.4p-105, -0x1.f82e0980d1ddep4}, + {0x1.3ffffffffff98p-104, -0x1.f35d04aca9ff8p4}, + {0x1.4p-104, -0x1.f35d04aca9ff6p4}, + {0x1.3ffffffffe3b7p-103, -0x1.ee8bffd8822abp4}, + {0x1.3ffffffffffc7p-103, -0x1.ee8bffd88221p4}, + {0x1.4p-103, -0x1.ee8bffd88220ep4}, + {0x1.3fffffffffdcdp-102, -0x1.e9bafb045a432p4}, + {0x1.4p-102, -0x1.e9bafb045a426p4}, + {0x1.3ffffffffff3ep-101, -0x1.e4e9f63032642p4}, + {0x1.4p-101, -0x1.e4e9f6303263ep4}, + {0x1.3ffffffffe301p-100, -0x1.e018f15c0a8f8p4}, + {0x1.3fffffffffff7p-100, -0x1.e018f15c0a856p4}, + {0x1.4p-100, -0x1.e018f15c0a856p4}, + {0x1.3fffffffffd73p-99, -0x1.db47ec87e2a7cp4}, + {0x1.4p-99, -0x1.db47ec87e2a6ep4}, + {0x1.3ffffffffdd9dp-98, -0x1.d676e7b3bad46p4}, + {0x1.3fffffffffee4p-98, -0x1.d676e7b3bac8cp4}, + {0x1.4p-98, -0x1.d676e7b3bac86p4}, + {0x1.3ffffffffff9dp-97, -0x1.d1a5e2df92eap4}, + {0x1.4p-97, -0x1.d1a5e2df92e9ep4}, + {0x1.3fffffffffffap-96, -0x1.ccd4de0b6b0b6p4}, + {0x1.4p-96, -0x1.ccd4de0b6b0b6p4}, + {0x1.3ffffffffffcdp-95, -0x1.c803d937432dp4}, + {0x1.4p-95, -0x1.c803d937432cep4}, + {0x1.3ffffffffffcep-94, -0x1.c332d4631b4e8p4}, + {0x1.4p-94, -0x1.c332d4631b4e6p4}, + {0x1.3fffffffffe8cp-93, -0x1.be61cf8ef3706p4}, + {0x1.4p-93, -0x1.be61cf8ef36fep4}, + {0x1.3fffffffff983p-92, -0x1.b990cabacb93ap4}, + {0x1.3ffffffffff45p-92, -0x1.b990cabacb91ap4}, + {0x1.4p-92, -0x1.b990cabacb916p4}, + {0x1.3fffffffffffep-91, -0x1.b4bfc5e6a3b2ep4}, + {0x1.4p-91, -0x1.b4bfc5e6a3b2ep4}, + {0x1.3fffffffffdd6p-90, -0x1.afeec1127bd52p4}, + {0x1.4p-90, -0x1.afeec1127bd46p4}, + {0x1.3fffffffffeebp-89, -0x1.ab1dbc3e53f64p4}, + {0x1.4p-89, -0x1.ab1dbc3e53f5ep4}, + {0x1.3ffffffffffa4p-88, -0x1.a64cb76a2c178p4}, + {0x1.4p-88, -0x1.a64cb76a2c177p4}, + {0x1.3fffffffffa9bp-87, -0x1.a17bb296043acp4}, + {0x1.3fffffffffd7cp-87, -0x1.a17bb2960439cp4}, + {0x1.4p-87, -0x1.a17bb2960438fp4}, + {0x1.3fffffffffe91p-86, -0x1.9caaadc1dc5aep4}, + {0x1.3ffffffffffc5p-86, -0x1.9caaadc1dc5a8p4}, + {0x1.3fffffffffe36p-85, -0x1.97d9a8edb47c8p4}, + {0x1.3ffffffffffa7p-84, -0x1.9308a4198c9d8p4}, + {0x1.3ffffffffff7ap-83, -0x1.8e379f4564bf2p4}, + {0x1.3ffffffffffd7p-82, -0x1.89669a713ce08p4}, + {0x1.3fffffffffe95p-81, -0x1.8495959d15026p4}, + {0x1.3ffffffffff4ep-80, -0x1.7fc490c8ed23ap4}, + {0x1.3ffffffffeafbp-79, -0x1.7af38bf4c54c3p4}, + {0x1.3ffffffffffd9p-79, -0x1.7af38bf4c544fp4}, + {0x1.3fffffffffe3bp-78, -0x1.762287209d67p4}, + {0x1.3ffffffffde65p-77, -0x1.7151824c7593ap4}, + {0x1.3fffffffffef4p-77, -0x1.7151824c75884p4}, + {0x1.3ffffffffffadp-76, -0x1.6c807d784da98p4}, + {0x1.3fffffffffb8bp-75, -0x1.67af78a425cc7p4}, + {0x1.3ffffffffffaep-75, -0x1.67af78a425cbp4}, + {0x1.3ffffffffffddp-74, -0x1.62de73cffdec8p4}, + {0x1.3fffffffffe3fp-73, -0x1.5e0d6efbd60e8p4}, + {0x1.3ffffffffff54p-72, -0x1.593c6a27ae2fap4}, + {0x1.3ffffffffffb1p-71, -0x1.546b65538651p4}, + {0x1.3fffffffff571p-70, -0x1.4f9a607f5e762p4}, + {0x1.3fffffffffde5p-70, -0x1.4f9a607f5e732p4}, + {0x1.3fffffffffe9ep-69, -0x1.4ac95bab36946p4}, + {0x1.3ffffffffffb3p-68, -0x1.45f856d70eb58p4}, + {0x1.3ffffffffe1d7p-67, -0x1.41275202e6e16p4}, + {0x1.3ffffffffffb4p-67, -0x1.41275202e6d7p4}, + {0x1.3fffffffffe44p-66, -0x1.3c564d2ebef9p4}, + {0x1.3fffffffffd5fp-65, -0x1.3785485a971aep4}, + {0x1.3fffffffffaadp-64, -0x1.32b443866f3d5p4}, + {0x1.3fffffffffefep-64, -0x1.32b443866f3bcp4}, + {0x1.3ffffffffeb35p-63, -0x1.2de33eb247643p4}, + {0x1.3ffffffffffb7p-63, -0x1.2de33eb2475dp4}, + {0x1.3ffffffffffe6p-62, -0x1.291239de1f7e8p4}, + {0x1.3fffffffffdecp-61, -0x1.24413509f7a0ap4}, + {0x1.3ffffffffff5dp-60, -0x1.1f703035cfc1ap4}, + {0x1.3ffffffffffbap-59, -0x1.1a9f2b61a7e3p4}, + {0x1.3fffffffffd92p-58, -0x1.15ce268d80054p4}, + {0x1.3ffffffffff03p-57, -0x1.10fd21b958264p4}, + {0x1.3ffffffffe6e9p-56, -0x1.0c2c1ce530503p4}, + {0x1.3ffffffffffbcp-56, -0x1.0c2c1ce530478p4}, + {0x1.3ffffffffe2c7p-55, -0x1.075b181108731p4}, + {0x1.3ffffffffff61p-55, -0x1.075b181108692p4}, + {0x1.3ffffffffffecp-54, -0x1.028a133ce08a8p4}, + {0x1.3fffffffff14fp-53, -0x1.fb721cd171621p3}, + {0x1.3fffffffffff8p-53, -0x1.fb721cd17157ep3}, + {0x1.3ffffffffdd9dp-52, -0x1.f1d0132921b2dp3}, + {0x1.3ffffffffffe2p-52, -0x1.f1d01329219bp3}, + {0x1.3ffffffffebebp-51, -0x1.e82e0980d1ebdp3}, + {0x1.3fffffffffe2dp-51, -0x1.e82e0980d1df2p3}, + {0x1.3ffffffffff7p-50, -0x1.de8bffd882214p3}, + {0x1.3fffffffffaadp-49, -0x1.d4e9f6303267ap3}, + {0x1.3ffffffffffcdp-49, -0x1.d4e9f6303264p3}, + {0x1.3fffffffffd77p-48, -0x1.cb47ec87e2a8ap3}, + {0x1.3fffffffffda5p-48, -0x1.cb47ec87e2a89p3}, + {0x1.3ffffffffff16p-47, -0x1.c1a5e2df92ea8p3}, + {0x1.3fffffffff983p-46, -0x1.b803d93743316p3}, + {0x1.3ffffffffffcfp-46, -0x1.b803d937432dp3}, + {0x1.3ffffffffffa2p-45, -0x1.ae61cf8ef3702p3}, + {0x1.3fffffffffbc5p-44, -0x1.a4bfc5e6a3b5ep3}, + {0x1.3ffffffffffffp-44, -0x1.a4bfc5e6a3b2ep3}, + {0x1.3fffffffffdd7p-43, -0x1.9b1dbc3e53f76p3}, + {0x1.3fffffffffebep-42, -0x1.917bb2960439cp3}, + {0x1.3ffffffffe3f1p-41, -0x1.87d9a8edb48f7p3}, + {0x1.3ffffffffff77p-41, -0x1.87d9a8edb47c4p3}, + {0x1.3fffffffff23fp-40, -0x1.7e379f4564c87p3}, + {0x1.3ffffffffffbdp-40, -0x1.7e379f4564bf2p3}, + {0x1.3fffffffffe36p-39, -0x1.7495959d15032p3}, + {0x1.3ffffffffecdbp-38, -0x1.6af38bf4c5523p3}, + {0x1.3ffffffffffa7p-38, -0x1.6af38bf4c5452p3}, + {0x1.3ffffffffffd6p-37, -0x1.6151824c7588p3}, + {0x1.3ffffffffffeep-36, -0x1.57af78a425cafp3}, + {0x1.3ffffffffdcadp-35, -0x1.4e0d6efbd6268p3}, + {0x1.3ffffffffffefp-35, -0x1.4e0d6efbd60ep3}, + {0x1.3fffffffffe68p-34, -0x1.446b65538652p3}, + {0x1.3ffffffffeafbp-33, -0x1.3ac95bab36a28p3}, + {0x1.3ffffffffffd9p-33, -0x1.3ac95bab3694p3}, + {0x1.3ffffffffffdap-32, -0x1.31275202e6d7p3}, + {0x1.3fffffffffcb5p-31, -0x1.2785485a971c4p3}, + {0x1.3ffffffffffc4p-31, -0x1.2785485a971a2p3}, + {0x1.3fffffffffec7p-30, -0x1.1de33eb2475dcp3}, + {0x1.3ffffffffffaep-29, -0x1.14413509f7a02p3}, + {0x1.3ffffffffd9a3p-28, -0x1.0a9f2b61a7fd9p3}, + {0x1.3ffffffffffddp-28, -0x1.0a9f2b61a7e3p3}, + {0x1.3fffffffff32fp-27, -0x1.00fd21b9582edp3}, + {0x1.3fffffffffe6dp-27, -0x1.00fd21b95827p3}, + {0x1.3ffffffffffe4p-26, -0x1.eeb6302210d2p2}, + {0x1.3ffffffffeb35p-25, -0x1.db721cd17174dp2}, + {0x1.3fffffffffffcp-25, -0x1.db721cd17157ep2}, + {0x1.3ffffffffde65p-24, -0x1.c82e0980d20cap2}, + {0x1.3fffffffffeafp-24, -0x1.c82e0980d1dfcp2}, + {0x1.3ffffffffed3dp-23, -0x1.b4e9f630327ep2}, + {0x1.3ffffffffff7fp-23, -0x1.b4e9f6303264ap2}, + {0x1.3ffffffffffdcp-22, -0x1.a1a5e2df92ea2p2}, + {0x1.3ffffffffe91bp-21, -0x1.8e61cf8ef38fbp2}, + {0x1.3ffffffffffffp-21, -0x1.8e61cf8ef36fep2}, + {0x1.3fffffffffeb2p-20, -0x1.7b1dbc3e53f7bp2}, + {0x1.3ffffffffe3b7p-19, -0x1.67d9a8edb4a33p2}, + {0x1.3ffffffffff3dp-19, -0x1.67d9a8edb47dp2}, + {0x1.3ffffffffe6e9p-18, -0x1.5495959d1524dp2}, + {0x1.3fffffffffff6p-18, -0x1.5495959d1502p2}, + {0x1.3ffffffffdb5bp-17, -0x1.4151824c75badp2}, + {0x1.3ffffffffffebp-17, -0x1.4151824c7588p2}, + {0x1.3ffffffffe301p-16, -0x1.2e0d6efbd6364p2}, + {0x1.3ffffffffff11p-16, -0x1.2e0d6efbd60f3p2}, + {0x1.3fffffffff14fp-15, -0x1.1ac95bab36a85p2}, + {0x1.3ffffffffff57p-15, -0x1.1ac95bab3694ep2}, + {0x1.3fffffffff481p-14, -0x1.0785485a9729fp2}, + {0x1.3fffffffffff9p-14, -0x1.0785485a971ap2}, + {0x1.3fffffffff571p-13, -0x1.e8826a13ef5d4p1}, + {0x1.3fffffffffff1p-13, -0x1.e8826a13ef4p1}, + {0x1.3fffffffffc7bp-12, -0x1.c1fa4372b055ap1}, + {0x1.3ffffffffffcfp-12, -0x1.c1fa4372b04c6p1}, + {0x1.3fffffffff189p-11, -0x1.9b721cd171802p1}, + {0x1.3fffffffffffep-11, -0x1.9b721cd17157ep1}, + {0x1.3ffffffffe211p-10, -0x1.74e9f63032b72p1}, + {0x1.3fffffffffff3p-10, -0x1.74e9f6303264p1}, + {0x1.3fffffffffbc5p-9, -0x1.4e61cf8ef37bbp1}, + {0x1.3fffffffffff4p-9, -0x1.4e61cf8ef37p1}, + {0x1.3fffffffff391p-8, -0x1.27d9a8edb49e8p1}, + {0x1.3ffffffffffe9p-8, -0x1.27d9a8edb47c2p1}, + {0x1.3fffffffffaadp-7, -0x1.0151824c7596cp1}, + {0x1.3ffffffffffeap-7, -0x1.0151824c75882p1}, + {0x1.3fffffffffc7bp-6, -0x1.b592b7566d3b6p0}, + {0x1.3fffffffffff2p-6, -0x1.b592b7566d282p0}, + {0x1.3fffffffffda5p-5, -0x1.68826a13ef4dp0}, + {0x1.3fffffffffff6p-5, -0x1.68826a13ef402p0}, + {0x1.3fffffffffb8bp-4, -0x1.1b721cd17170ap0}, + {0x1.3ffffffffffffp-4, -0x1.1b721cd17157ep0}, + {0x1.3fffffffffcb5p-3, -0x1.9cc39f1de7047p-1}, + {0x1.3fffffffffff2p-3, -0x1.9cc39f1de6e06p-1}, + {0x1.3fffffffffc7bp-2, -0x1.02a30498eb36fp-1}, + {0x1.4p-2, -0x1.02a30498eb0fep-1}, + {0x1.3fffffffffda5p-1, -0x1.a209a84fbd684p-3}, + {0x1.3fffffffffffcp-1, -0x1.a209a84fbd002p-3}, + {0x1.3fffffffffff3p0, 0x1.8cf18388647c5p-4}, + {0x1.3fffffffffffdp0, 0x1.8cf18388647fbp-4}, + {0x1.3ffffffffff7bp1, 0x1.977d95ec10b4ap-2}, + {0x1.3fffffffffffcp1, 0x1.977d95ec10bfcp-2}, + {0x1.3ffffffffff2bp2, 0x1.65df657b0426dp-1}, + {0x1.3fffffffffff3p2, 0x1.65df657b042f8p-1}, + {0x1.3fffffffffc83p4, 0x1.4d104d427dd4ap0}, + {0x1.3fffffffffff1p4, 0x1.4d104d427de7ap0}, + {0x1.4p4, 0x1.4d104d427de8p0}, + {0x1.3ffffffffff2bp5, 0x1.9a209a84fbcb6p0}, + {0x1.4p5, 0x1.9a209a84fbdp0}, + {0x1.3fffffffffd23p6, 0x1.e730e7c779a81p0}, + {0x1.3fffffffffffep6, 0x1.e730e7c779b7ep0}, + {0x1.4p6, 0x1.e730e7c779b7fp0}, + {0x1.3ffffffffece3p7, 0x1.1a209a84fb9aep1}, + {0x1.4p7, 0x1.1a209a84fbdp1}, + {0x1.3fffffffffeb3p8, 0x1.40a8c1263ac06p1}, + {0x1.3ffffffffff71p8, 0x1.40a8c1263ac26p1}, + {0x1.4p8, 0x1.40a8c1263ac3fp1}, + {0x1.3fffffffffe3bp9, 0x1.6730e7c779b31p1}, + {0x1.3fffffffffffcp9, 0x1.6730e7c779b7ep1}, + {0x1.4p9, 0x1.6730e7c779b7fp1}, + {0x1.3fffffffff657p10, 0x1.8db90e68b8912p1}, + {0x1.3ffffffffff67p10, 0x1.8db90e68b8aa4p1}, + {0x1.4p10, 0x1.8db90e68b8abfp1}, + {0x1.3fffffffff8ffp11, 0x1.b4413509f78c8p1}, + {0x1.3ffffffffffecp11, 0x1.b4413509f79fcp1}, + {0x1.4p11, 0x1.b4413509f79ffp1}, + {0x1.3fffffffffd23p12, 0x1.dac95bab368cp1}, + {0x1.3ffffffffff5dp12, 0x1.dac95bab36922p1}, + {0x1.4p12, 0x1.dac95bab3693fp1}, + {0x1.3fffffffffe13p13, 0x1.00a8c1263ac15p2}, + {0x1.3fffffffffee2p13, 0x1.00a8c1263ac26p2}, + {0x1.4p13, 0x1.00a8c1263ac3fp2}, + {0x1.3fffffffff193p14, 0x1.13ecd476da29fp2}, + {0x1.3ffffffffffc9p14, 0x1.13ecd476da3dap2}, + {0x1.4p14, 0x1.13ecd476da3dfp2}, + {0x1.3fffffffff5b7p15, 0x1.2730e7c779a9bp2}, + {0x1.3ffffffffff1dp15, 0x1.2730e7c779b6cp2}, + {0x1.4p15, 0x1.2730e7c779b7fp2}, + {0x1.3ffffffffec2fp16, 0x1.3a74fb1819167p2}, + {0x1.3ffffffffffedp16, 0x1.3a74fb181931ep2}, + {0x1.4p16, 0x1.3a74fb181931fp2}, + {0x1.3fffffffffb07p17, 0x1.4db90e68b8a51p2}, + {0x1.3fffffffffecep17, 0x1.4db90e68b8aa4p2}, + {0x1.4p17, 0x1.4db90e68b8abfp2}, + {0x1.3ffffffffff2bp18, 0x1.60fd21b95824dp2}, + {0x1.3ffffffffffb5p18, 0x1.60fd21b958258p2}, + {0x1.4p18, 0x1.60fd21b95825fp2}, + {0x1.3ffffffffffe4p19, 0x1.74413509f79fcp2}, + {0x1.4p19, 0x1.74413509f79ffp2}, + {0x1.3fffffffff6cfp20, 0x1.8785485a970d3p2}, + {0x1.3ffffffffffd9p20, 0x1.8785485a9719cp2}, + {0x1.4p20, 0x1.8785485a9719fp2}, + {0x1.3ffffffffed47p21, 0x1.9ac95bab3679fp2}, + {0x1.3fffffffffebap21, 0x1.9ac95bab36922p2}, + {0x1.4p21, 0x1.9ac95bab3693fp2}, + {0x1.3fffffffff16bp22, 0x1.ae0d6efbd5f9bp2}, + {0x1.3ffffffffff8ap22, 0x1.ae0d6efbd60d4p2}, + {0x1.4p22, 0x1.ae0d6efbd60dfp2}, + {0x1.3ffffffffe667p23, 0x1.c151824c75646p2}, + {0x1.3fffffffffffep23, 0x1.c151824c7587ep2}, + {0x1.4p23, 0x1.c151824c7587fp2}, + {0x1.3fffffffffff3p24, 0x1.d495959d1501ep2}, + {0x1.4p24, 0x1.d495959d1501fp2}, + {0x1.3fffffffffadfp25, 0x1.e7d9a8edb474dp2}, + {0x1.3fffffffffebdp25, 0x1.e7d9a8edb47a2p2}, + {0x1.4p25, 0x1.e7d9a8edb47bfp2}, + }; + + for (double[] testCase: testCases) + failures+=testLog10Case(testCase[0], testCase[1]); + + return failures; + } + + public static void main(String [] argv) { + int failures = 0; + + failures += testLog10(); + + if (failures > 0) { + System.err.println("Testing log10 incurred " + + failures + " failures."); + throw new RuntimeException(); + } + } +} diff --git a/jdk/test/java/lang/StrictMath/Log1pTests.java b/jdk/test/java/lang/StrictMath/Log1pTests.java new file mode 100644 index 00000000000..03b31f649d1 --- /dev/null +++ b/jdk/test/java/lang/StrictMath/Log1pTests.java @@ -0,0 +1,210 @@ +/* + * Copyright 2003-2004 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4851638 + * @summary Tests for StrictMath.log1p + * @author Joseph D. Darcy + */ + +/** + * The tests in ../Math/Log1pTests.java test properties that should + * hold for any log1p implementation, including the FDLIBM-based one + * required for StrictMath.log1p. Therefore, the test cases in + * ../Math/Log1pTests.java are run against both the Math and + * StrictMath versions of log1p. The role of this test is to verify + * that the FDLIBM log1p algorithm is being used by running golden + * file tests on values that may vary from one conforming log1p + * implementation to another. + */ + +public class Log1pTests { + private Log1pTests(){} + + static int testLog1pCase(double input, double expected) { + return Tests.test("StrictMath.log1p(double)", input, + StrictMath.log1p(input), expected); + } + + static int testLog1p() { + int failures = 0; + + double [][] testCases = { + {0x1.fffffffffffffp-54, 0x1.fffffffffffffp-54}, + {0x1.fffffffffcc48p-15, 0x1.fffc000aa74f3p-15}, + {0x1.ffffffffff224p-14, 0x1.fff8002aa8ccfp-14}, + {0x1.ffffffffff90cp-13, 0x1.fff000aaa23bdp-13}, + {0x1.fffffffffffcep-4, 0x1.e27076e2af2bap-4}, + {0x1.fffffffffffffp-2, 0x1.9f323ecbf984bp-2}, + {0x1.ffffffffffffdp-1, 0x1.62e42fefa39eep-1}, + {0x1.0p1, 0x1.193ea7aad030ap0}, + {0x1.ffffffffffffbp1, 0x1.9c041f7ed8d31p0}, + {0x1.fffffffffffffp2, 0x1.193ea7aad030ap1}, + {0x1.fffffffffffe1p3, 0x1.6aa6bc1fa7f73p1}, + {0x1.fffffffffffe1p4, 0x1.bf8d8f4d5b8cap1}, + {0x1.ffffffffffff1p5, 0x1.0b29293942974p2}, + {0x1.fffffffffff41p6, 0x1.37072a9b5b6b4p2}, + {0x1.ffffffffffe65p7, 0x1.63241004e8fdep2}, + {0x1.ffffffffffca1p8, 0x1.8f60adf041b73p2}, + {0x1.fffffffffffffp9, 0x1.bbad39ebe1ccp2}, + {0x1.fffffffffffffp10, 0x1.e801c1698ba43p2}, + {0x1.ffffffffff2dep11, 0x1.0a2d23e3bb54bp3}, + {0x1.ffffffffff18dp12, 0x1.205a66eeb4f81p3}, + {0x1.ffffffffffff9p13, 0x1.368829f0af2dcp3}, + {0x1.fffffffffbc1ep14, 0x1.4cb62cf069217p3}, + {0x1.ffffffffffff5p16, 0x1.791282ee99d8ep3}, + {0x1.fffffffffba46p17, 0x1.8f40bded96cd1p3}, + {0x1.ffffffffffff7p18, 0x1.a56efcec920cbp3}, + {0x1.ffffffffffff7p19, 0x1.bb9d3deb8c76ap3}, + {0x1.ffffffffffff9p20, 0x1.d1cb7fea86bcap3}, + {0x1.ffffffffffff7p24, 0x1.1542457b37d42p4}, + {0x1.fffffffffffe7p29, 0x1.4cb5ecf0e964fp4}, + {0x1.ffffffffffff9p30, 0x1.57cd0e704682p4}, + {0x1.ffffffffffffbp34, 0x1.8429946e1cf5dp4}, + {0x1.fffffffffffedp35, 0x1.8f40b5ed9912dp4}, + {0x1.fffffffffffefp39, 0x1.bb9d3beb8c96ap4}, + {0x1.fffffffffffe1p40, 0x1.c6b45d6b09abap4}, + {0x1.fffffffffffe3p44, 0x1.f310e368fe17fp4}, + {0x1.ffffffffffff5p45, 0x1.fe2804e87b34cp4}, + {0x1.fffffffffffc5p66, 0x1.7386e22edf4a5p5}, + {0x1.fffffffffff98p90, 0x1.f89c7428bca5fp5}, + {0x1.a36e2eb1c317dp-14, 0x1.a368d0657ee51p-14}, + {0x1.0624dd2f18d5cp-10, 0x1.060354f8c2226p-10}, + {0x1.ffffffffffffdp-1, 0x1.62e42fefa39eep-1}, + {0x1.8ffffffffffccp6, 0x1.275e2271bba28p2}, + {0x1.f3fffffffff1p9, 0x1.ba2909ce4f846p2}, + {0x1.387ffffffffa8p13, 0x1.26bbed6fbd838p3}, + {0x1.869ffffffffe4p16, 0x1.7069f7a2d94f4p3}, + {0x1.e847fffffff3ep19, 0x1.ba18abb1dedbcp3}, + {0x1.312cfffffff23p23, 0x1.01e3b85ec299p4}, + {0x1.7d783ffffff17p26, 0x1.26bb1bbe0482ap4}, + {0x1.dcd64ffffffcep29, 0x1.4b927f3304b3ap4}, + {0x1.2a05f1ffffa3p33, 0x1.7069e2aa317fep4}, + {0x1.74876e7ffffbep36, 0x1.9541462195ffap4}, + {0x1.d1a94a1fffddp39, 0x1.ba18a999000a6p4}, + {0x1.2309ce53ffed2p43, 0x1.def00d106aa4ep4}, + {0x1.6bcc41e8ffe73p46, 0x1.01e3b843eaa6cp5}, + {0x1.c6bf52633fe7dp49, 0x1.144f69ff9ffbep5}, + {0x1.1c37937e07fffp53, 0x1.26bb1bbb55515p5}, + {0x1.6345785d89f12p56, 0x1.3926cd770aa62p5}, + {0x1.bc16d674ec76ap59, 0x1.4b927f32bffb6p5}, + {0x1.158e460913c51p63, 0x1.5dfe30ee75504p5}, + {0x1.5af1d78b58badp66, 0x1.7069e2aa2aa58p5}, + {0x1.b1ae4d6e2ecd4p69, 0x1.82d59465dffap5}, + {0x1.0f0cf064dd066p73, 0x1.95414621954d6p5}, + {0x1.52d02c7e14a9p76, 0x1.a7acf7dd4aa4cp5}, + {0x1.a784379d99c19p79, 0x1.ba18a998fff98p5}, + {0x1.08b2a2c27fb5p83, 0x1.cc845b54b54bap5}, + {0x1.4adf4b7320322p86, 0x1.def00d106aa42p5}, + {0x1.9d971e4fe7b91p89, 0x1.f15bbecc1ff6ap5}, + {0x1.027e72f1f0ea3p93, 0x1.01e3b843eaa63p6}, + {0x1.431e0fae6d44bp96, 0x1.0b199121c5512p6}, + {0x1.93e5939a086bcp99, 0x1.144f69ff9ffb4p6}, + {0x1.f8def8808ac86p102, 0x1.1d8542dd7aa65p6}, + {0x1.3b8b5b5056dc7p106, 0x1.26bb1bbb55514p6}, + {0x1.8a6e32246c76cp109, 0x1.2ff0f4992ffb8p6}, + {0x1.ed09bead86a07p112, 0x1.3926cd770aa41p6}, + {0x1.3426172c74d33p116, 0x1.425ca654e550ep6}, + {0x1.812f9cf791f1ep119, 0x1.4b927f32bffb4p6}, + {0x1.e17b8435758f2p122, 0x1.54c858109aa3ep6}, + {0x1.2ced32a169cfap126, 0x1.5dfe30ee754fap6}, + {0x1.78287f49c497cp129, 0x1.673409cc4ffbp6}, + {0x1.d6329f1c3492ep132, 0x1.7069e2aa2aa3p6}, + {0x1.25dfa371a14b8p136, 0x1.799fbb88054f2p6}, + {0x1.6f578c4e09f0ap139, 0x1.82d59465dffa8p6}, + {0x1.cb2d6f618c4b4p142, 0x1.8c0b6d43baa4cp6}, + {0x1.1efc659cf77abp146, 0x1.95414621954eap6}, + {0x1.66bb7f0435c5bp149, 0x1.9e771eff6ffa6p6}, + {0x1.c06a5ec5428a4p152, 0x1.a7acf7dd4aa36p6}, + {0x1.18427b3b49fc9p156, 0x1.b0e2d0bb254f6p6}, + {0x1.5e531a0a1c729p159, 0x1.ba18a998fff9cp6}, + {0x1.b5e7e08ca3686p162, 0x1.c34e8276daa4p6}, + {0x1.11b0ec57e6492p166, 0x1.cc845b54b54f2p6}, + {0x1.561d276ddfd7dp169, 0x1.d5ba34328ff9ap6}, + {0x1.aba471495757bp172, 0x1.def00d106aa3p6}, + {0x1.0b46c6cdd6a8ep176, 0x1.e825e5ee454ddp6}, + {0x1.4e1878814c5f4p179, 0x1.f15bbecc1ff88p6}, + {0x1.a19e96a19f65ap182, 0x1.fa9197a9faa2ep6}, + {0x1.05031e2503cfcp186, 0x1.01e3b843eaa71p7}, + {0x1.4643e5ae441d2p189, 0x1.067ea4b2d7fb6p7}, + {0x1.97d4df19d5c5dp192, 0x1.0b199121c5516p7}, + {0x1.fdca16e04ae24p195, 0x1.0fb47d90b2a65p7}, + {0x1.3e9e4e4c2f2dap199, 0x1.144f69ff9ffc4p7}, + {0x1.8e45e1df3ac31p202, 0x1.18ea566e8d514p7}, + {0x1.f1d75a5709306p205, 0x1.1d8542dd7aa63p7}, + {0x1.372698766608cp209, 0x1.22202f4c67fcp7}, + {0x1.84f03e93fef5p212, 0x1.26bb1bbb55508p7}, + {0x1.e62c4e38fdba1p215, 0x1.2b56082a42a4bp7}, + {0x1.2fdbb0e39f6b8p219, 0x1.2ff0f4992ffb6p7}, + {0x1.7bd29d1c875a2p222, 0x1.348be1081d50cp7}, + {0x1.dac74463a76e9p225, 0x1.3926cd770aa42p7}, + {0x1.28bc8abe48f57p229, 0x1.3dc1b9e5f7fap7}, + {0x1.72ebad6ddc67ep232, 0x1.425ca654e550ep7}, + {0x1.cfa698c952a3ap235, 0x1.46f792c3d2a53p7}, + {0x1.21c81f7dd42b1p239, 0x1.4b927f32bffb6p7}, + {0x1.6a3a275d4926bp242, 0x1.502d6ba1ad50ap7}, + {0x1.c4c8b134970ddp245, 0x1.54c858109aa0ep7}, + {0x1.61bcca711985dp252, 0x1.5dfe30ee75508p7}, + {0x1.ba2bfd0d5fe2ap255, 0x1.62991d5d62a5cp7}, + {0x1.59725db2728b7p262, 0x1.6bcef63b3d4fcp7}, + {0x1.afcef51f0fa33p265, 0x1.7069e2aa2aa5ap7}, + {0x1.0de1593368f8cp269, 0x1.7504cf1917f95p7}, + {0x1.5159af804425ep272, 0x1.799fbb88055p7}, + {0x1.a5b01b605409p275, 0x1.7e3aa7f6f2a3ep7}, + {0x1.078e111c34e5bp279, 0x1.82d59465dff9fp7}, + {0x1.497195634225fp282, 0x1.877080d4cd4f4p7}, + {0x1.9bcdfabc13053p285, 0x1.8c0b6d43baa4ep7}, + {0x1.0160bcb58c08cp289, 0x1.90a659b2a7fa7p7}, + {0x1.41b8ebe2eec13p292, 0x1.95414621954f4p7}, + {0x1.922726dbaa542p295, 0x1.99dc329082a46p7}, + {0x1.f6b0f09295714p298, 0x1.9e771eff6ffa3p7}, + {0x1.3a2e965b9d0b2p302, 0x1.a3120b6e5d4eep7}, + {0x1.88ba3bf284dd1p305, 0x1.a7acf7dd4aa4ep7}, + {0x1.32d17ed576f35p312, 0x1.b0e2d0bb254ep7}, + {0x1.7f85de8ad56bep315, 0x1.b57dbd2a12a44p7}, + {0x1.df67562d87c5cp318, 0x1.ba18a998fff65p7}, + {0x1.2ba095dc76db7p322, 0x1.beb39607ed4fp7}, + {0x1.7688bb5394bd3p325, 0x1.c34e8276daa48p7}, + {0x1.d42aea2878b45p328, 0x1.c7e96ee5c7f87p7}, + {0x1.249ad2594989p332, 0x1.cc845b54b54a6p7}, + }; + + for (double[] testCase: testCases) + failures+=testLog1pCase(testCase[0], testCase[1]); + + return failures; + } + + public static void main(String [] argv) { + int failures = 0; + + failures += testLog1p(); + + if (failures > 0) { + System.err.println("Testing log1p incurred " + + failures + " failures."); + throw new RuntimeException(); + } + } +} diff --git a/jdk/test/java/lang/StrictMath/Tests.java b/jdk/test/java/lang/StrictMath/Tests.java new file mode 100644 index 00000000000..268fc0613c5 --- /dev/null +++ b/jdk/test/java/lang/StrictMath/Tests.java @@ -0,0 +1,65 @@ +/* + * Copyright 2003 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * + * + * Shared static test method for StrictMath tests. + */ + + +public class Tests { + private Tests(){} + + static int test(String testName, + double input, + double result, + double expected) { + if (Double.compare(expected, result ) != 0) { + System.err.println("Failure for " + testName + ":\n" + + "\tFor input " + input + "\t(" + Double.toHexString(input) + ")\n" + + "\texpected " + expected + "\t(" + Double.toHexString(expected) + ")\n" + + "\tgot " + result + "\t(" + Double.toHexString(result) + ")."); + return 1; + } + else + return 0; + } + + static int test(String testName, double input1, double input2, + double result, double expected) { + if (Double.compare(expected, result ) != 0) { + System.err.println("Failure for " + testName + ":\n" + + "\tFor input " + input1 + "\t(" + Double.toHexString(input1) + "), " + + + input2 + "\t(" + Double.toHexString(input2) + ")\n" + + "\texpected " + expected + "\t(" + Double.toHexString(expected) + ")\n" + + "\tgot " + result + "\t(" + Double.toHexString(result) + ")."); + return 1; + } + else + return 0; + } + + + +} diff --git a/jdk/test/java/lang/ToString.java b/jdk/test/java/lang/ToString.java new file mode 100644 index 00000000000..6033368716c --- /dev/null +++ b/jdk/test/java/lang/ToString.java @@ -0,0 +1,104 @@ +/* + * Copyright 2000 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4031762 + * @summary Test the primitive wrappers static toString() + */ + +import java.util.Random; + +public class ToString { + + private static Random generator = new Random(); + + public static void main(String args[]) throws Exception { + // boolean wrapper + boolean b = false; + Boolean B = new Boolean(b); + if (!B.toString().equals(Boolean.toString(b))) + throw new RuntimeException("Boolean wrapper toString() failure."); + b = true; + B = new Boolean(b); + if (!B.toString().equals(Boolean.toString(b))) + throw new RuntimeException("Boolean wrapper toString() failure."); + + // char wrapper + for(int x=0; x<100; x++) { + char c = (char)generator.nextInt(); + Character C = new Character(c); + if (!C.toString().equals(Character.toString(c))) + throw new RuntimeException("Character wrapper toString() failure."); + } + + // byte wrapper + for(int x=0; x<100; x++) { + byte y = (byte)generator.nextInt(); + Byte Y = new Byte(y); + if (!Y.toString().equals(Byte.toString(y))) + throw new RuntimeException("Byte wrapper toString() failure."); + } + + // short wrapper + for(int x=0; x<100; x++) { + short s = (short)generator.nextInt(); + Short S = new Short(s); + if (!S.toString().equals(Short.toString(s))) + throw new RuntimeException("Short wrapper toString() failure."); + } + + // int wrapper + for(int x=0; x<100; x++) { + int i = generator.nextInt(); + Integer I = new Integer(i); + if (!I.toString().equals(Integer.toString(i))) + throw new RuntimeException("Integer wrapper toString() failure."); + } + + // long wrapper + for(int x=0; x<100; x++) { + long l = generator.nextLong(); + Long L = new Long(l); + if (!L.toString().equals(Long.toString(l))) + throw new RuntimeException("Long wrapper toString() failure."); + } + + // float wrapper + for(int x=0; x<100; x++) { + float f = generator.nextFloat(); + Float F = new Float(f); + if (!F.toString().equals(Float.toString(f))) + throw new RuntimeException("Float wrapper toString() failure."); + } + + // double wrapper + for(int x=0; x<100; x++) { + double d = generator.nextDouble(); + Double D = new Double(d); + if (!D.toString().equals(Double.toString(d))) + throw new RuntimeException("Double wrapper toString() failure."); + } + + } +} diff --git a/jdk/test/java/lang/annotation/AnnotationTypeMismatchException/FoundType.java b/jdk/test/java/lang/annotation/AnnotationTypeMismatchException/FoundType.java new file mode 100644 index 00000000000..b856b574a38 --- /dev/null +++ b/jdk/test/java/lang/annotation/AnnotationTypeMismatchException/FoundType.java @@ -0,0 +1,44 @@ +/* + * Copyright 2004 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6179014 + * @summary AnnotationTypeMismatchException.foundType method shouldn't loop. + * @author Scott Seligman + * @run main/timeout=30 FoundType + */ + +import java.lang.annotation.*; + +public class FoundType { + + private static final String TYPE = "a.halting.Problem"; + + public static void main(String[] args) { + AnnotationTypeMismatchException ex = + new AnnotationTypeMismatchException(null, TYPE); + if (!TYPE.equals(ex.foundType())) + throw new Error(); + } +} diff --git a/jdk/test/java/lang/annotation/Missing/A.java b/jdk/test/java/lang/annotation/Missing/A.java new file mode 100644 index 00000000000..190d4e19750 --- /dev/null +++ b/jdk/test/java/lang/annotation/Missing/A.java @@ -0,0 +1,30 @@ +/* + * Copyright 2005 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/** + * Class to have a missing annotation applied for running MissingTest. + */ +@Missing +@Marker +public class A { +} diff --git a/jdk/test/java/lang/annotation/Missing/B.java b/jdk/test/java/lang/annotation/Missing/B.java new file mode 100644 index 00000000000..9546db03a8d --- /dev/null +++ b/jdk/test/java/lang/annotation/Missing/B.java @@ -0,0 +1,31 @@ +/* + * Copyright 2005 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/** + * Class to have an indirectly missing annotation applied for for + * running MisssingTest. + */ +@MissingWrapper(@Missing) +@Marker +public class B { +} diff --git a/jdk/test/java/lang/annotation/Missing/C.java b/jdk/test/java/lang/annotation/Missing/C.java new file mode 100644 index 00000000000..55ff14dc8cb --- /dev/null +++ b/jdk/test/java/lang/annotation/Missing/C.java @@ -0,0 +1,31 @@ +/* + * Copyright 2005 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/** + * Class to have a missing annotation applied for running MissingTest. + */ +public class C { + public void method1(@Missing @Marker Object param1) { + return; + } +} diff --git a/jdk/test/java/lang/annotation/Missing/D.java b/jdk/test/java/lang/annotation/Missing/D.java new file mode 100644 index 00000000000..a3b091c841e --- /dev/null +++ b/jdk/test/java/lang/annotation/Missing/D.java @@ -0,0 +1,31 @@ +/* + * Copyright 2005 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/** + * Class to have a missing annotation applied for running MissingTest. + */ +public class D { + public void method1(@MissingWrapper(@Missing) @Marker Object param1) { + return; + } +} diff --git a/jdk/test/java/lang/annotation/Missing/Marker.java b/jdk/test/java/lang/annotation/Missing/Marker.java new file mode 100644 index 00000000000..61f0719e88d --- /dev/null +++ b/jdk/test/java/lang/annotation/Missing/Marker.java @@ -0,0 +1,32 @@ +/* + * Copyright 2005 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.*; + +/** + * A marker annotation. Used so that at least one annotation will be + * present on the classes tested by MissingTest. + */ +@Retention(RUNTIME) +public @interface Marker {} diff --git a/jdk/test/java/lang/annotation/Missing/Missing.java b/jdk/test/java/lang/annotation/Missing/Missing.java new file mode 100644 index 00000000000..9e47adfff7e --- /dev/null +++ b/jdk/test/java/lang/annotation/Missing/Missing.java @@ -0,0 +1,32 @@ +/* + * Copyright 2005 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.*; + +/** + * The class file for this annotation type is missing when MissingTest + * is run. + */ +@Retention(RUNTIME) +public @interface Missing {} diff --git a/jdk/test/java/lang/annotation/Missing/MissingTest.java b/jdk/test/java/lang/annotation/Missing/MissingTest.java new file mode 100644 index 00000000000..e0583f278f1 --- /dev/null +++ b/jdk/test/java/lang/annotation/Missing/MissingTest.java @@ -0,0 +1,135 @@ +/* + * Copyright 2005 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6322301 + * @summary Verify when missing annotation classes cause exceptions + * @author Joseph D. Darcy + * @compile MissingTest.java A.java B.java C.java D.java Marker.java Missing.java MissingWrapper.java + * @clean Missing + * @run main MissingTest + */ + +import java.lang.reflect.*; + +/** + * This test verifies that a missing annotation class leads to the + * expected exceptional behavior; a missing directly applied + * annotation is currently ignored but a missing annotation value + * inside another annotation throws an exception. + * + * To be run as intended, the annotation type Missing should *not* be + * on the classpath when the test is run; with jtreg, it is deleted by + * the @clean directive. + */ +public class MissingTest { + /** + * For the annotated element argument, get all its annotations and + * see whether or not an exception is throw upon reading the + * annotations. Additionally, verify at least one annotation is + * present. + */ + private static void testAnnotation(AnnotatedElement element, + boolean exceptionExpected) { + java.lang.annotation.Annotation[] annotations; + try { + annotations = element.getAnnotations(); + if (exceptionExpected) { + System.err.println("Error: Did not get an exception reading annotations on " + + element); + System.err.println("Annotations found: " + + java.util.Arrays.toString(annotations)); + throw new RuntimeException(); + } + if (annotations.length == 0) { + System.err.println("Error: no annotations found on " + element); + throw new RuntimeException(); + } + } catch (Throwable t) { + if (!exceptionExpected) { + System.err.println("Error: Got an unexpected exception reading annotations on " + + element); + throw new RuntimeException(t); + } + } + } + + /** + * For the annotated element argument, get all its annotations and + * see whether or not an exception is throw upon reading the + * annotations. Additionally, verify at least one annotation is + * present. + */ + private static void testParameterAnnotation(Method m, + boolean exceptionExpected) { + java.lang.annotation.Annotation[][] annotationsArray; + try { + annotationsArray = m.getParameterAnnotations(); + if (exceptionExpected) { + System.err.println("Error: Did not get an exception reading annotations on method" + + m); + System.err.println("Annotations found: " + + java.util.Arrays.toString(annotationsArray)); + throw new RuntimeException(); + } + if (annotationsArray.length == 0 ) { + System.err.println("Error: no parameters for " + m); + throw new RuntimeException(); + } else { + java.lang.annotation.Annotation[] annotations = annotationsArray[0]; + if (annotations.length == 0) { + System.err.println("Error: no annotations on " + m); + throw new RuntimeException(); + } + } + } catch (Throwable t) { + if (!exceptionExpected) { + System.err.println("Error: Got an unexpected exception reading annotations on " + + m); + throw new RuntimeException(t); + } + } + } + + public static void main(String argv[]) throws Exception { + // Class A has a directly applied annotation whose class is + // missing. + testAnnotation(A.class, false); + + // Class B has a directly applied annotation whose value + // includes to an annotation class that is missing. + testAnnotation(B.class, true); + + + // Class C has a directly applied parameter annotation whose + // class is missing. + testParameterAnnotation(C.class.getDeclaredMethod("method1", Object.class), + false); + + // Class D has a directly applied parameter annotation whose value + // includes to an annotation class that is missing. + testParameterAnnotation(D.class.getDeclaredMethod("method1", Object.class), + true); + } +} diff --git a/jdk/test/java/lang/annotation/Missing/MissingWrapper.java b/jdk/test/java/lang/annotation/Missing/MissingWrapper.java new file mode 100644 index 00000000000..7cb4141de1f --- /dev/null +++ b/jdk/test/java/lang/annotation/Missing/MissingWrapper.java @@ -0,0 +1,34 @@ +/* + * Copyright 2005 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.*; + +/** + * Annotation wrapper around an annotation whose class will be missing + * when MissingTest is run. + */ +@Retention(RUNTIME) +public @interface MissingWrapper { + Missing value(); +} diff --git a/jdk/test/java/lang/annotation/PackageMain.java b/jdk/test/java/lang/annotation/PackageMain.java new file mode 100644 index 00000000000..d545682ef4b --- /dev/null +++ b/jdk/test/java/lang/annotation/PackageMain.java @@ -0,0 +1,36 @@ +/* + * Copyright 2004 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +import java.lang.annotation.Documented; + +public class PackageMain { + public static void main(String[] args) throws Exception { + Class c = Class.forName("foo.bar.Baz"); + System.out.println("c=" + c); + System.out.println("cl=" + c.getClassLoader()); + Package p = c.getPackage(); + System.out.println("p=" + p); + Documented d = p.getAnnotation(Documented.class); + if (d == null) throw new Error(); + } +} diff --git a/jdk/test/java/lang/annotation/RecursiveAnnotation.java b/jdk/test/java/lang/annotation/RecursiveAnnotation.java new file mode 100644 index 00000000000..ab16f5c8e8f --- /dev/null +++ b/jdk/test/java/lang/annotation/RecursiveAnnotation.java @@ -0,0 +1,44 @@ +/* + * Copyright 2004 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 5037685 + * @summary Under certain circumstances, recursive annotations disappeared + * @author Josh Bloch + */ + +import java.lang.annotation.*; +import static java.lang.annotation.RetentionPolicy.*; + +@Rat public class RecursiveAnnotation { + public static void main(String[] args) { + if (!RecursiveAnnotation.class.isAnnotationPresent(Rat.class)) + throw new RuntimeException("RecursiveAnnotation"); + + if (!Rat.class.isAnnotationPresent(Rat.class)) + throw new RuntimeException("Rat"); + } +} + +@Retention(RUNTIME) @Rat @interface Rat { } diff --git a/jdk/test/java/lang/annotation/UnitTest.java b/jdk/test/java/lang/annotation/UnitTest.java new file mode 100644 index 00000000000..ed8b05c3cc0 --- /dev/null +++ b/jdk/test/java/lang/annotation/UnitTest.java @@ -0,0 +1,4983 @@ +/* + * Copyright 2003-2004 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4906359 4963461 4965058 4965039 4986770 + * @summary Unit test for annotation reading + * @author Josh Bloch + * @compile -source 1.5 UnitTest.java + * @run main UnitTest + */ + +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.*; +import java.util.*; +import java.lang.reflect.*; +import java.io.*; + +public class UnitTest { + private static final Class[] X = new Class[0]; + private static final Class[] Y = { int.class }; + + static int numTests = 0; + + public static void main(String[] args) throws Exception { + + // *** TESTS ON ANNOTATED METHODS *** + + // MULTIMEMBER SCALAR TYPES ON METHOD + checkScalarTypes(UnitTest.class.getMethod("scalarTypesMethod", X)); + checkScalarTypesOverrideDefault(UnitTest.class.getMethod("scalarTypesOverrideDefaultMethod", X)); + checkScalarTypesAcceptDefault(UnitTest.class.getMethod("scalarTypesAcceptDefaultMethod", X)); + + // MULTIMEMBER ARRAY TYPES ON METHOD + checkArrayTypes0(UnitTest.class.getMethod("emptyArrayTypesMethod", X)); + checkArrayTypes1(UnitTest.class.getMethod("singleElementArrayTypesMethod", X)); + checkArrayTypes2(UnitTest.class.getMethod("twoElementArrayTypesMethod", X)); + checkArrayTypesAcceptDefault(UnitTest.class.getMethod("arrayTypesAcceptDefaultMethod", X)); + checkArrayTypesOverrideDefault(UnitTest.class.getMethod("arrayTypesOverrideDefaultMethod", X)); + + // MARKER TYPE ON METHOD + checkMarker(UnitTest.class.getMethod("markerMethod", X)); + + // SINGLE-MEMBER SCALAR TYPES ON METHOD + checkSingleMemberByte(UnitTest.class.getMethod("SingleMemberByte", X)); + checkSingleMemberShort(UnitTest.class.getMethod("SingleMemberShort", X)); + checkSingleMemberInt(UnitTest.class.getMethod("SingleMemberInt", X)); + checkSingleMemberLong(UnitTest.class.getMethod("SingleMemberLong", X)); + checkSingleMemberChar(UnitTest.class.getMethod("SingleMemberChar", X)); + checkSingleMemberFloat(UnitTest.class.getMethod("SingleMemberFloat", X)); + checkSingleMemberDouble(UnitTest.class.getMethod("SingleMemberDouble", X)); + checkSingleMemberBoolean(UnitTest.class.getMethod("SingleMemberBoolean", X)); + checkSingleMemberString(UnitTest.class.getMethod("SingleMemberString", X)); + checkSingleMemberClass(UnitTest.class.getMethod("SingleMemberClass", X)); + checkSingleMemberEnum(UnitTest.class.getMethod("SingleMemberEnum", X)); + + // SINGLE-MEMBER SCALAR TYPES WITH DEFAULT-OVERRIDE ON METHOD + checkSingleMemberByteOvrdDef(UnitTest.class.getMethod("SingleMemberByteOvrdDef", X)); + checkSingleMemberShortOvrdDef(UnitTest.class.getMethod("SingleMemberShortOvrdDef", X)); + checkSingleMemberIntOvrdDef(UnitTest.class.getMethod("SingleMemberIntOvrdDef", X)); + checkSingleMemberLongOvrdDef(UnitTest.class.getMethod("SingleMemberLongOvrdDef", X)); + checkSingleMemberCharOvrdDef(UnitTest.class.getMethod("SingleMemberCharOvrdDef", X)); + checkSingleMemberFloatOvrdDef(UnitTest.class.getMethod("SingleMemberFloatOvrdDef", X)); + checkSingleMemberDoubleOvrdDef(UnitTest.class.getMethod("SingleMemberDoubleOvrdDef", X)); + checkSingleMemberBooleanOvrdDef(UnitTest.class.getMethod("SingleMemberBooleanOvrdDef", X)); + checkSingleMemberStringOvrdDef(UnitTest.class.getMethod("SingleMemberStringOvrdDef", X)); + checkSingleMemberClassOvrdDef(UnitTest.class.getMethod("SingleMemberClassOvrdDef", X)); + checkSingleMemberEnumOvrdDef(UnitTest.class.getMethod("SingleMemberEnumOvrdDef", X)); + + // SINGLE-MEMBER SCALAR TYPES WITH DEFAULT-ACCEPT ON METHOD + checkSingleMemberByteAcceptDef(UnitTest.class.getMethod("SingleMemberByteAcceptDef", X)); + checkSingleMemberShortAcceptDef(UnitTest.class.getMethod("SingleMemberShortAcceptDef", X)); + checkSingleMemberIntAcceptDef(UnitTest.class.getMethod("SingleMemberIntAcceptDef", X)); + checkSingleMemberLongAcceptDef(UnitTest.class.getMethod("SingleMemberLongAcceptDef", X)); + checkSingleMemberCharAcceptDef(UnitTest.class.getMethod("SingleMemberCharAcceptDef", X)); + checkSingleMemberFloatAcceptDef(UnitTest.class.getMethod("SingleMemberFloatAcceptDef", X)); + checkSingleMemberDoubleAcceptDef(UnitTest.class.getMethod("SingleMemberDoubleAcceptDef", X)); + checkSingleMemberBooleanAcceptDef(UnitTest.class.getMethod("SingleMemberBooleanAcceptDef", X)); + checkSingleMemberStringAcceptDef(UnitTest.class.getMethod("SingleMemberStringAcceptDef", X)); + checkSingleMemberClassAcceptDef(UnitTest.class.getMethod("SingleMemberClassAcceptDef", X)); + checkSingleMemberEnumAcceptDef(UnitTest.class.getMethod("SingleMemberEnumAcceptDef", X)); + + // SINGLE-MEMBER ARRAY TYPES (EMPTY ARRAY) ON METHOD + checkSingleMemberByteArrEmpty(UnitTest.class.getMethod("SingleMemberByteArrEmpty", X)); + checkSingleMemberShortArrEmpty(UnitTest.class.getMethod("SingleMemberShortArrEmpty", X)); + checkSingleMemberIntArrEmpty(UnitTest.class.getMethod("SingleMemberIntArrEmpty", X)); + checkSingleMemberLongArrEmpty(UnitTest.class.getMethod("SingleMemberLongArrEmpty", X)); + checkSingleMemberCharArrEmpty(UnitTest.class.getMethod("SingleMemberCharArrEmpty", X)); + checkSingleMemberFloatArrEmpty(UnitTest.class.getMethod("SingleMemberFloatArrEmpty", X)); + checkSingleMemberDoubleArrEmpty(UnitTest.class.getMethod("SingleMemberDoubleArrEmpty", X)); + checkSingleMemberBooleanArrEmpty(UnitTest.class.getMethod("SingleMemberBooleanArrEmpty", X)); + checkSingleMemberStringArrEmpty(UnitTest.class.getMethod("SingleMemberStringArrEmpty", X)); + checkSingleMemberClassArrEmpty(UnitTest.class.getMethod("SingleMemberClassArrEmpty", X)); + checkSingleMemberEnumArrEmpty(UnitTest.class.getMethod("SingleMemberEnumArrEmpty", X)); + + // SINGLE-MEMBER ARRAY TYPES (ONE-ELEMENT ARRAY) ON METHOD + checkSingleMemberByteArrOne(UnitTest.class.getMethod("SingleMemberByteArrOne", X)); + checkSingleMemberShortArrOne(UnitTest.class.getMethod("SingleMemberShortArrOne", X)); + checkSingleMemberIntArrOne(UnitTest.class.getMethod("SingleMemberIntArrOne", X)); + checkSingleMemberLongArrOne(UnitTest.class.getMethod("SingleMemberLongArrOne", X)); + checkSingleMemberCharArrOne(UnitTest.class.getMethod("SingleMemberCharArrOne", X)); + checkSingleMemberFloatArrOne(UnitTest.class.getMethod("SingleMemberFloatArrOne", X)); + checkSingleMemberDoubleArrOne(UnitTest.class.getMethod("SingleMemberDoubleArrOne", X)); + checkSingleMemberBooleanArrOne(UnitTest.class.getMethod("SingleMemberBooleanArrOne", X)); + checkSingleMemberStringArrOne(UnitTest.class.getMethod("SingleMemberStringArrOne", X)); + checkSingleMemberClassArrOne(UnitTest.class.getMethod("SingleMemberClassArrOne", X)); + checkSingleMemberEnumArrOne(UnitTest.class.getMethod("SingleMemberEnumArrOne", X)); + + // SINGLE-MEMBER ARRAY TYPES (TWO-ELEMENT ARRAY) ON METHOD + checkSingleMemberByteArrTwo(UnitTest.class.getMethod("SingleMemberByteArrTwo", X)); + checkSingleMemberShortArrTwo(UnitTest.class.getMethod("SingleMemberShortArrTwo", X)); + checkSingleMemberIntArrTwo(UnitTest.class.getMethod("SingleMemberIntArrTwo", X)); + checkSingleMemberLongArrTwo(UnitTest.class.getMethod("SingleMemberLongArrTwo", X)); + checkSingleMemberCharArrTwo(UnitTest.class.getMethod("SingleMemberCharArrTwo", X)); + checkSingleMemberFloatArrTwo(UnitTest.class.getMethod("SingleMemberFloatArrTwo", X)); + checkSingleMemberDoubleArrTwo(UnitTest.class.getMethod("SingleMemberDoubleArrTwo", X)); + checkSingleMemberBooleanArrTwo(UnitTest.class.getMethod("SingleMemberBooleanArrTwo", X)); + checkSingleMemberStringArrTwo(UnitTest.class.getMethod("SingleMemberStringArrTwo", X)); + checkSingleMemberClassArrTwo(UnitTest.class.getMethod("SingleMemberClassArrTwo", X)); + checkSingleMemberEnumArrTwo(UnitTest.class.getMethod("SingleMemberEnumArrTwo", X)); + + // SINGLE-MEMBER ARRAY TYPES WITH DEFAULT (OVERRIDE)ON METHOD + checkSingleMemberByteArrOvrdDef(UnitTest.class.getMethod("SingleMemberByteArrOvrdDef", X)); + checkSingleMemberShortArrOvrdDef(UnitTest.class.getMethod("SingleMemberShortArrOvrdDef", X)); + checkSingleMemberIntArrOvrdDef(UnitTest.class.getMethod("SingleMemberIntArrOvrdDef", X)); + checkSingleMemberLongArrOvrdDef(UnitTest.class.getMethod("SingleMemberLongArrOvrdDef", X)); + checkSingleMemberCharArrOvrdDef(UnitTest.class.getMethod("SingleMemberCharArrOvrdDef", X)); + checkSingleMemberFloatArrOvrdDef(UnitTest.class.getMethod("SingleMemberFloatArrOvrdDef", X)); + checkSingleMemberDoubleArrOvrdDef(UnitTest.class.getMethod("SingleMemberDoubleArrOvrdDef", X)); + checkSingleMemberBooleanArrOvrdDef(UnitTest.class.getMethod("SingleMemberBooleanArrOvrdDef", X)); + checkSingleMemberStringArrOvrdDef(UnitTest.class.getMethod("SingleMemberStringArrOvrdDef", X)); + checkSingleMemberClassArrOvrdDef(UnitTest.class.getMethod("SingleMemberClassArrOvrdDef", X)); + checkSingleMemberEnumArrOvrdDef(UnitTest.class.getMethod("SingleMemberEnumArrOvrdDef", X)); + + // SINGLE-MEMBER ARRAY TYPES WITH DEFAULT (ACCEPT)ON METHOD + checkSingleMemberByteArrAcceptDef(UnitTest.class.getMethod("SingleMemberByteArrAcceptDef", X)); + checkSingleMemberShortArrAcceptDef(UnitTest.class.getMethod("SingleMemberShortArrAcceptDef", X)); + checkSingleMemberIntArrAcceptDef(UnitTest.class.getMethod("SingleMemberIntArrAcceptDef", X)); + checkSingleMemberLongArrAcceptDef(UnitTest.class.getMethod("SingleMemberLongArrAcceptDef", X)); + checkSingleMemberCharArrAcceptDef(UnitTest.class.getMethod("SingleMemberCharArrAcceptDef", X)); + checkSingleMemberFloatArrAcceptDef(UnitTest.class.getMethod("SingleMemberFloatArrAcceptDef", X)); + checkSingleMemberDoubleArrAcceptDef(UnitTest.class.getMethod("SingleMemberDoubleArrAcceptDef", X)); + checkSingleMemberBooleanArrAcceptDef(UnitTest.class.getMethod("SingleMemberBooleanArrAcceptDef", X)); + checkSingleMemberStringArrAcceptDef(UnitTest.class.getMethod("SingleMemberStringArrAcceptDef", X)); + checkSingleMemberClassArrAcceptDef(UnitTest.class.getMethod("SingleMemberClassArrAcceptDef", X)); + checkSingleMemberEnumArrAcceptDef(UnitTest.class.getMethod("SingleMemberEnumArrAcceptDef", X)); + + // *** TESTS ON ANNOTATED FIELDS *** + + // MULTIMEMBER SCALAR TYPES ON FIELD + checkScalarTypes(UnitTest.class.getField("scalarTypesField")); + checkScalarTypesAcceptDefault(UnitTest.class.getField("scalarTypesAcceptDefaultField")); + checkScalarTypesOverrideDefault(UnitTest.class.getField("scalarTypesOverrideDefaultField")); + + // MULTIMEMBER ARRAY TYPES ON FIELD + checkArrayTypes0(UnitTest.class.getField("emptyArrayTypesField")); + checkArrayTypes1(UnitTest.class.getField("singleElementArrayTypesField")); + checkArrayTypes2(UnitTest.class.getField("twoElementArrayTypesField")); + checkArrayTypesAcceptDefault(UnitTest.class.getField("arrayTypesAcceptDefaultField")); + checkArrayTypesOverrideDefault(UnitTest.class.getField("arrayTypesOverrideDefaultField")); + + // MARKER TYPE ON FIELD + checkMarker(UnitTest.class.getField("markerField")); + + // SINGLE-MEMBER SCALAR TYPES ON FIELD + checkSingleMemberByte(UnitTest.class.getField("SingleMemberByteField")); + checkSingleMemberShort(UnitTest.class.getField("SingleMemberShortField")); + checkSingleMemberInt(UnitTest.class.getField("SingleMemberIntField")); + checkSingleMemberLong(UnitTest.class.getField("SingleMemberLongField")); + checkSingleMemberChar(UnitTest.class.getField("SingleMemberCharField")); + checkSingleMemberFloat(UnitTest.class.getField("SingleMemberFloatField")); + checkSingleMemberDouble(UnitTest.class.getField("SingleMemberDoubleField")); + checkSingleMemberBoolean(UnitTest.class.getField("SingleMemberBooleanField")); + checkSingleMemberString(UnitTest.class.getField("SingleMemberStringField")); + checkSingleMemberClass(UnitTest.class.getField("SingleMemberClassField")); + checkSingleMemberEnum(UnitTest.class.getField("SingleMemberEnumField")); + + // SINGLE-MEMBER SCALAR TYPES WITH DEFAULT-OVERRIDE ON FIELD + checkSingleMemberByteOvrdDef(UnitTest.class.getField("SingleMemberByteOvrdDefField")); + checkSingleMemberShortOvrdDef(UnitTest.class.getField("SingleMemberShortOvrdDefField")); + checkSingleMemberIntOvrdDef(UnitTest.class.getField("SingleMemberIntOvrdDefField")); + checkSingleMemberLongOvrdDef(UnitTest.class.getField("SingleMemberLongOvrdDefField")); + checkSingleMemberCharOvrdDef(UnitTest.class.getField("SingleMemberCharOvrdDefField")); + checkSingleMemberFloatOvrdDef(UnitTest.class.getField("SingleMemberFloatOvrdDefField")); + checkSingleMemberDoubleOvrdDef(UnitTest.class.getField("SingleMemberDoubleOvrdDefField")); + checkSingleMemberBooleanOvrdDef(UnitTest.class.getField("SingleMemberBooleanOvrdDefField")); + checkSingleMemberStringOvrdDef(UnitTest.class.getField("SingleMemberStringOvrdDefField")); + checkSingleMemberClassOvrdDef(UnitTest.class.getField("SingleMemberClassOvrdDefField")); + checkSingleMemberEnumOvrdDef(UnitTest.class.getField("SingleMemberEnumOvrdDefField")); + + // SINGLE-MEMBER SCALAR TYPES WITH DEFAULT-ACCEPT ON FIELD + checkSingleMemberByteAcceptDef(UnitTest.class.getField("SingleMemberByteAcceptDefField")); + checkSingleMemberShortAcceptDef(UnitTest.class.getField("SingleMemberShortAcceptDefField")); + checkSingleMemberIntAcceptDef(UnitTest.class.getField("SingleMemberIntAcceptDefField")); + checkSingleMemberLongAcceptDef(UnitTest.class.getField("SingleMemberLongAcceptDefField")); + checkSingleMemberCharAcceptDef(UnitTest.class.getField("SingleMemberCharAcceptDefField")); + checkSingleMemberFloatAcceptDef(UnitTest.class.getField("SingleMemberFloatAcceptDefField")); + checkSingleMemberDoubleAcceptDef(UnitTest.class.getField("SingleMemberDoubleAcceptDefField")); + checkSingleMemberBooleanAcceptDef(UnitTest.class.getField("SingleMemberBooleanAcceptDefField")); + checkSingleMemberStringAcceptDef(UnitTest.class.getField("SingleMemberStringAcceptDefField")); + checkSingleMemberClassAcceptDef(UnitTest.class.getField("SingleMemberClassAcceptDefField")); + checkSingleMemberEnumAcceptDef(UnitTest.class.getField("SingleMemberEnumAcceptDefField")); + + // SINGLE-MEMBER ARRAY TYPES (EMPTY ARRAY) ON FIELD + checkSingleMemberByteArrEmpty(UnitTest.class.getField("SingleMemberByteArrEmptyField")); + checkSingleMemberShortArrEmpty(UnitTest.class.getField("SingleMemberShortArrEmptyField")); + checkSingleMemberIntArrEmpty(UnitTest.class.getField("SingleMemberIntArrEmptyField")); + checkSingleMemberLongArrEmpty(UnitTest.class.getField("SingleMemberLongArrEmptyField")); + checkSingleMemberCharArrEmpty(UnitTest.class.getField("SingleMemberCharArrEmptyField")); + checkSingleMemberFloatArrEmpty(UnitTest.class.getField("SingleMemberFloatArrEmptyField")); + checkSingleMemberDoubleArrEmpty(UnitTest.class.getField("SingleMemberDoubleArrEmptyField")); + checkSingleMemberBooleanArrEmpty(UnitTest.class.getField("SingleMemberBooleanArrEmptyField")); + checkSingleMemberStringArrEmpty(UnitTest.class.getField("SingleMemberStringArrEmptyField")); + checkSingleMemberClassArrEmpty(UnitTest.class.getField("SingleMemberClassArrEmptyField")); + checkSingleMemberEnumArrEmpty(UnitTest.class.getField("SingleMemberEnumArrEmptyField")); + + // SINGLE-MEMBER ARRAY TYPES (ONE-ELEMENT ARRAY) ON FIELD + checkSingleMemberByteArrOne(UnitTest.class.getField("SingleMemberByteArrOneField")); + checkSingleMemberShortArrOne(UnitTest.class.getField("SingleMemberShortArrOneField")); + checkSingleMemberIntArrOne(UnitTest.class.getField("SingleMemberIntArrOneField")); + checkSingleMemberLongArrOne(UnitTest.class.getField("SingleMemberLongArrOneField")); + checkSingleMemberCharArrOne(UnitTest.class.getField("SingleMemberCharArrOneField")); + checkSingleMemberFloatArrOne(UnitTest.class.getField("SingleMemberFloatArrOneField")); + checkSingleMemberDoubleArrOne(UnitTest.class.getField("SingleMemberDoubleArrOneField")); + checkSingleMemberBooleanArrOne(UnitTest.class.getField("SingleMemberBooleanArrOneField")); + checkSingleMemberStringArrOne(UnitTest.class.getField("SingleMemberStringArrOneField")); + checkSingleMemberClassArrOne(UnitTest.class.getField("SingleMemberClassArrOneField")); + checkSingleMemberEnumArrOne(UnitTest.class.getField("SingleMemberEnumArrOneField")); + + // SINGLE-MEMBER ARRAY TYPES (TWO-ELEMENT ARRAY) ON FIELD + checkSingleMemberByteArrTwo(UnitTest.class.getField("SingleMemberByteArrTwoField")); + checkSingleMemberShortArrTwo(UnitTest.class.getField("SingleMemberShortArrTwoField")); + checkSingleMemberIntArrTwo(UnitTest.class.getField("SingleMemberIntArrTwoField")); + checkSingleMemberLongArrTwo(UnitTest.class.getField("SingleMemberLongArrTwoField")); + checkSingleMemberCharArrTwo(UnitTest.class.getField("SingleMemberCharArrTwoField")); + checkSingleMemberFloatArrTwo(UnitTest.class.getField("SingleMemberFloatArrTwoField")); + checkSingleMemberDoubleArrTwo(UnitTest.class.getField("SingleMemberDoubleArrTwoField")); + checkSingleMemberBooleanArrTwo(UnitTest.class.getField("SingleMemberBooleanArrTwoField")); + checkSingleMemberStringArrTwo(UnitTest.class.getField("SingleMemberStringArrTwoField")); + checkSingleMemberClassArrTwo(UnitTest.class.getField("SingleMemberClassArrTwoField")); + checkSingleMemberEnumArrTwo(UnitTest.class.getField("SingleMemberEnumArrTwoField")); + + // SINGLE-MEMBER ARRAY TYPES WITH DEFAULT (OVERRIDE)ON FIELD + checkSingleMemberByteArrOvrdDef(UnitTest.class.getField("SingleMemberByteArrOvrdDefField")); + checkSingleMemberShortArrOvrdDef(UnitTest.class.getField("SingleMemberShortArrOvrdDefField")); + checkSingleMemberIntArrOvrdDef(UnitTest.class.getField("SingleMemberIntArrOvrdDefField")); + checkSingleMemberLongArrOvrdDef(UnitTest.class.getField("SingleMemberLongArrOvrdDefField")); + checkSingleMemberCharArrOvrdDef(UnitTest.class.getField("SingleMemberCharArrOvrdDefField")); + checkSingleMemberFloatArrOvrdDef(UnitTest.class.getField("SingleMemberFloatArrOvrdDefField")); + checkSingleMemberDoubleArrOvrdDef(UnitTest.class.getField("SingleMemberDoubleArrOvrdDefField")); + checkSingleMemberBooleanArrOvrdDef(UnitTest.class.getField("SingleMemberBooleanArrOvrdDefField")); + checkSingleMemberStringArrOvrdDef(UnitTest.class.getField("SingleMemberStringArrOvrdDefField")); + checkSingleMemberClassArrOvrdDef(UnitTest.class.getField("SingleMemberClassArrOvrdDefField")); + checkSingleMemberEnumArrOvrdDef(UnitTest.class.getField("SingleMemberEnumArrOvrdDefField")); + + // SINGLE-MEMBER ARRAY TYPES WITH DEFAULT (ACCEPT)ON FIELD + checkSingleMemberByteArrAcceptDef(UnitTest.class.getField("SingleMemberByteArrAcceptDefField")); + checkSingleMemberShortArrAcceptDef(UnitTest.class.getField("SingleMemberShortArrAcceptDefField")); + checkSingleMemberIntArrAcceptDef(UnitTest.class.getField("SingleMemberIntArrAcceptDefField")); + checkSingleMemberLongArrAcceptDef(UnitTest.class.getField("SingleMemberLongArrAcceptDefField")); + checkSingleMemberCharArrAcceptDef(UnitTest.class.getField("SingleMemberCharArrAcceptDefField")); + checkSingleMemberFloatArrAcceptDef(UnitTest.class.getField("SingleMemberFloatArrAcceptDefField")); + checkSingleMemberDoubleArrAcceptDef(UnitTest.class.getField("SingleMemberDoubleArrAcceptDefField")); + checkSingleMemberBooleanArrAcceptDef(UnitTest.class.getField("SingleMemberBooleanArrAcceptDefField")); + checkSingleMemberStringArrAcceptDef(UnitTest.class.getField("SingleMemberStringArrAcceptDefField")); + checkSingleMemberClassArrAcceptDef(UnitTest.class.getField("SingleMemberClassArrAcceptDefField")); + checkSingleMemberEnumArrAcceptDef(UnitTest.class.getField("SingleMemberEnumArrAcceptDefField")); + + // *** TESTS ON ANNOTATED ENUM CONSTS *** + + // MULTIMEMBER SCALAR TYPES ON ENUM CONST + checkScalarTypes(TestType.class.getField("scalarTypesField")); + checkScalarTypesAcceptDefault(TestType.class.getField("scalarTypesAcceptDefaultField")); + checkScalarTypesOverrideDefault(TestType.class.getField("scalarTypesOverrideDefaultField")); + + // MULTIMEMBER ARRAY TYPES ON ENUM CONST + checkArrayTypes0(TestType.class.getField("emptyArrayTypesField")); + checkArrayTypes1(TestType.class.getField("singleElementArrayTypesField")); + checkArrayTypes2(TestType.class.getField("twoElementArrayTypesField")); + checkArrayTypesAcceptDefault(TestType.class.getField("arrayTypesAcceptDefaultField")); + checkArrayTypesOverrideDefault(TestType.class.getField("arrayTypesOverrideDefaultField")); + + // MARKER TYPE ON CLASS + checkMarker(TestType.class.getField("marker")); + + // SINGLE-MEMBER SCALAR TYPES ON CLASS + checkSingleMemberByte(TestType.class.getField("SingleMemberByte")); + checkSingleMemberShort(TestType.class.getField("SingleMemberShort")); + checkSingleMemberInt(TestType.class.getField("SingleMemberInt")); + checkSingleMemberLong(TestType.class.getField("SingleMemberLong")); + checkSingleMemberChar(TestType.class.getField("SingleMemberChar")); + checkSingleMemberFloat(TestType.class.getField("SingleMemberFloat")); + checkSingleMemberDouble(TestType.class.getField("SingleMemberDouble")); + checkSingleMemberBoolean(TestType.class.getField("SingleMemberBoolean")); + checkSingleMemberString(TestType.class.getField("SingleMemberString")); + checkSingleMemberClass(TestType.class.getField("SingleMemberClass")); + checkSingleMemberEnum(TestType.class.getField("SingleMemberEnum")); + + // SINGLE-MEMBER SCALAR TYPES WITH DEFAULT-OVERRIDE ON CLASS + checkSingleMemberByteOvrdDef(TestType.class.getField("SingleMemberByteOvrdDef")); + checkSingleMemberShortOvrdDef(TestType.class.getField("SingleMemberShortOvrdDef")); + checkSingleMemberIntOvrdDef(TestType.class.getField("SingleMemberIntOvrdDef")); + checkSingleMemberLongOvrdDef(TestType.class.getField("SingleMemberLongOvrdDef")); + checkSingleMemberCharOvrdDef(TestType.class.getField("SingleMemberCharOvrdDef")); + checkSingleMemberFloatOvrdDef(TestType.class.getField("SingleMemberFloatOvrdDef")); + checkSingleMemberDoubleOvrdDef(TestType.class.getField("SingleMemberDoubleOvrdDef")); + checkSingleMemberBooleanOvrdDef(TestType.class.getField("SingleMemberBooleanOvrdDef")); + checkSingleMemberStringOvrdDef(TestType.class.getField("SingleMemberStringOvrdDef")); + checkSingleMemberClassOvrdDef(TestType.class.getField("SingleMemberClassOvrdDef")); + checkSingleMemberEnumOvrdDef(TestType.class.getField("SingleMemberEnumOvrdDef")); + + // SINGLE-MEMBER SCALAR TYPES WITH DEFAULT-ACCEPT ON CLASS + checkSingleMemberByteAcceptDef(TestType.class.getField("SingleMemberByteAcceptDef")); + checkSingleMemberShortAcceptDef(TestType.class.getField("SingleMemberShortAcceptDef")); + checkSingleMemberIntAcceptDef(TestType.class.getField("SingleMemberIntAcceptDef")); + checkSingleMemberLongAcceptDef(TestType.class.getField("SingleMemberLongAcceptDef")); + checkSingleMemberCharAcceptDef(TestType.class.getField("SingleMemberCharAcceptDef")); + checkSingleMemberFloatAcceptDef(TestType.class.getField("SingleMemberFloatAcceptDef")); + checkSingleMemberDoubleAcceptDef(TestType.class.getField("SingleMemberDoubleAcceptDef")); + checkSingleMemberBooleanAcceptDef(TestType.class.getField("SingleMemberBooleanAcceptDef")); + checkSingleMemberStringAcceptDef(TestType.class.getField("SingleMemberStringAcceptDef")); + checkSingleMemberClassAcceptDef(TestType.class.getField("SingleMemberClassAcceptDef")); + checkSingleMemberEnumAcceptDef(TestType.class.getField("SingleMemberEnumAcceptDef")); + + // SINGLE-MEMBER ARRAY TYPES (TestType.class.getField("EMPTY ARRAY) ON CLASS + checkSingleMemberByteArrEmpty(TestType.class.getField("SingleMemberByteArrEmpty")); + checkSingleMemberShortArrEmpty(TestType.class.getField("SingleMemberShortArrEmpty")); + checkSingleMemberIntArrEmpty(TestType.class.getField("SingleMemberIntArrEmpty")); + checkSingleMemberLongArrEmpty(TestType.class.getField("SingleMemberLongArrEmpty")); + checkSingleMemberCharArrEmpty(TestType.class.getField("SingleMemberCharArrEmpty")); + checkSingleMemberFloatArrEmpty(TestType.class.getField("SingleMemberFloatArrEmpty")); + checkSingleMemberDoubleArrEmpty(TestType.class.getField("SingleMemberDoubleArrEmpty")); + checkSingleMemberBooleanArrEmpty(TestType.class.getField("SingleMemberBooleanArrEmpty")); + checkSingleMemberStringArrEmpty(TestType.class.getField("SingleMemberStringArrEmpty")); + checkSingleMemberClassArrEmpty(TestType.class.getField("SingleMemberClassArrEmpty")); + checkSingleMemberEnumArrEmpty(TestType.class.getField("SingleMemberEnumArrEmpty")); + + // SINGLE-MEMBER ARRAY TYPES (TestType.class.getField("ONE-ELEMENT ARRAY) ON CLASS + checkSingleMemberByteArrOne(TestType.class.getField("SingleMemberByteArrOne")); + checkSingleMemberShortArrOne(TestType.class.getField("SingleMemberShortArrOne")); + checkSingleMemberIntArrOne(TestType.class.getField("SingleMemberIntArrOne")); + checkSingleMemberLongArrOne(TestType.class.getField("SingleMemberLongArrOne")); + checkSingleMemberCharArrOne(TestType.class.getField("SingleMemberCharArrOne")); + checkSingleMemberFloatArrOne(TestType.class.getField("SingleMemberFloatArrOne")); + checkSingleMemberDoubleArrOne(TestType.class.getField("SingleMemberDoubleArrOne")); + checkSingleMemberBooleanArrOne(TestType.class.getField("SingleMemberBooleanArrOne")); + checkSingleMemberStringArrOne(TestType.class.getField("SingleMemberStringArrOne")); + checkSingleMemberClassArrOne(TestType.class.getField("SingleMemberClassArrOne")); + checkSingleMemberEnumArrOne(TestType.class.getField("SingleMemberEnumArrOne")); + + // SINGLE-MEMBER ARRAY TYPES (TestType.class.getField("TWO-ELEMENT ARRAY) ON CLASS + checkSingleMemberByteArrTwo(TestType.class.getField("SingleMemberByteArrTwo")); + checkSingleMemberShortArrTwo(TestType.class.getField("SingleMemberShortArrTwo")); + checkSingleMemberIntArrTwo(TestType.class.getField("SingleMemberIntArrTwo")); + checkSingleMemberLongArrTwo(TestType.class.getField("SingleMemberLongArrTwo")); + checkSingleMemberCharArrTwo(TestType.class.getField("SingleMemberCharArrTwo")); + checkSingleMemberFloatArrTwo(TestType.class.getField("SingleMemberFloatArrTwo")); + checkSingleMemberDoubleArrTwo(TestType.class.getField("SingleMemberDoubleArrTwo")); + checkSingleMemberBooleanArrTwo(TestType.class.getField("SingleMemberBooleanArrTwo")); + checkSingleMemberStringArrTwo(TestType.class.getField("SingleMemberStringArrTwo")); + checkSingleMemberClassArrTwo(TestType.class.getField("SingleMemberClassArrTwo")); + checkSingleMemberEnumArrTwo(TestType.class.getField("SingleMemberEnumArrTwo")); + + // SINGLE-MEMBER ARRAY TYPES WITH DEFAULT (TestType.class.getField("OVERRIDE)ON CLASS + checkSingleMemberByteArrOvrdDef(TestType.class.getField("SingleMemberByteArrOvrdDef")); + checkSingleMemberShortArrOvrdDef(TestType.class.getField("SingleMemberShortArrOvrdDef")); + checkSingleMemberIntArrOvrdDef(TestType.class.getField("SingleMemberIntArrOvrdDef")); + checkSingleMemberLongArrOvrdDef(TestType.class.getField("SingleMemberLongArrOvrdDef")); + checkSingleMemberCharArrOvrdDef(TestType.class.getField("SingleMemberCharArrOvrdDef")); + checkSingleMemberFloatArrOvrdDef(TestType.class.getField("SingleMemberFloatArrOvrdDef")); + checkSingleMemberDoubleArrOvrdDef(TestType.class.getField("SingleMemberDoubleArrOvrdDef")); + checkSingleMemberBooleanArrOvrdDef(TestType.class.getField("SingleMemberBooleanArrOvrdDef")); + checkSingleMemberStringArrOvrdDef(TestType.class.getField("SingleMemberStringArrOvrdDef")); + checkSingleMemberClassArrOvrdDef(TestType.class.getField("SingleMemberClassArrOvrdDef")); + checkSingleMemberEnumArrOvrdDef(TestType.class.getField("SingleMemberEnumArrOvrdDef")); + + // SINGLE-MEMBER ARRAY TYPES WITH DEFAULT (TestType.class.getField("ACCEPT)ON CLASS + checkSingleMemberByteArrAcceptDef(TestType.class.getField("SingleMemberByteArrAcceptDef")); + checkSingleMemberShortArrAcceptDef(TestType.class.getField("SingleMemberShortArrAcceptDef")); + checkSingleMemberIntArrAcceptDef(TestType.class.getField("SingleMemberIntArrAcceptDef")); + checkSingleMemberLongArrAcceptDef(TestType.class.getField("SingleMemberLongArrAcceptDef")); + checkSingleMemberCharArrAcceptDef(TestType.class.getField("SingleMemberCharArrAcceptDef")); + checkSingleMemberFloatArrAcceptDef(TestType.class.getField("SingleMemberFloatArrAcceptDef")); + checkSingleMemberDoubleArrAcceptDef(TestType.class.getField("SingleMemberDoubleArrAcceptDef")); + checkSingleMemberBooleanArrAcceptDef(TestType.class.getField("SingleMemberBooleanArrAcceptDef")); + checkSingleMemberStringArrAcceptDef(TestType.class.getField("SingleMemberStringArrAcceptDef")); + checkSingleMemberClassArrAcceptDef(TestType.class.getField("SingleMemberClassArrAcceptDef")); + checkSingleMemberEnumArrAcceptDef(TestType.class.getField("SingleMemberEnumArrAcceptDef")); + + // *** TESTS ON ANNOTATED CONSTRUCTORS *** + + // MULTIMEMBER SCALAR TYPES ON CONSTRUCTOR + checkScalarTypes(UnitTest.class.getConstructor(new Class[]{Iterator.class})); + checkScalarTypesOverrideDefault(UnitTest.class.getConstructor(new Class[]{Map.class})); + checkScalarTypesAcceptDefault(UnitTest.class.getConstructor(new Class[]{Set.class})); + + // MULTIMEMBER ARRAY TYPES ON CONSTRUCTOR + checkArrayTypes0(UnitTest.class.getConstructor(new Class[]{List.class})); + checkArrayTypes1(UnitTest.class.getConstructor(new Class[]{Collection.class})); + checkArrayTypes2(UnitTest.class.getConstructor(new Class[]{SortedSet.class})); + checkArrayTypesAcceptDefault(UnitTest.class.getConstructor(new Class[]{SortedMap.class})); + checkArrayTypesOverrideDefault(UnitTest.class.getConstructor(new Class[]{RandomAccess.class})); + + // MARKER TYPE ON CONSTRUCTOR + checkMarker(UnitTest.class.getConstructor(new Class[] { })); + + // SINGLE-MEMBER SCALAR TYPES ON CONSTRUCTOR + checkSingleMemberByte(UnitTest.class.getConstructor(new Class[] { byte.class })); + checkSingleMemberShort(UnitTest.class.getConstructor(new Class[] { short.class })); + checkSingleMemberInt(UnitTest.class.getConstructor(new Class[] { int.class })); + checkSingleMemberLong(UnitTest.class.getConstructor(new Class[] { long.class })); + checkSingleMemberChar(UnitTest.class.getConstructor(new Class[] { char.class })); + checkSingleMemberFloat(UnitTest.class.getConstructor(new Class[] { float.class })); + checkSingleMemberDouble(UnitTest.class.getConstructor(new Class[] { double.class })); + checkSingleMemberBoolean(UnitTest.class.getConstructor(new Class[] { boolean.class })); + checkSingleMemberString(UnitTest.class.getConstructor(new Class[] { String.class })); + checkSingleMemberClass(UnitTest.class.getConstructor(new Class[] { Class.class })); + checkSingleMemberEnum(UnitTest.class.getConstructor(new Class[] { Enum.class })); + + // SINGLE-MEMBER SCALAR TYPES WITH DEFAULT-OVERRIDE ON CONSTRUCTOR + checkSingleMemberByteOvrdDef(UnitTest.class.getConstructor(new Class[] { byte.class, Set.class })); + checkSingleMemberShortOvrdDef(UnitTest.class.getConstructor(new Class[] { short.class, Set.class })); + checkSingleMemberIntOvrdDef(UnitTest.class.getConstructor(new Class[] { int.class, Set.class })); + checkSingleMemberLongOvrdDef(UnitTest.class.getConstructor(new Class[] { long.class, Set.class })); + checkSingleMemberCharOvrdDef(UnitTest.class.getConstructor(new Class[] { char.class, Set.class })); + checkSingleMemberFloatOvrdDef(UnitTest.class.getConstructor(new Class[] { float.class, Set.class })); + checkSingleMemberDoubleOvrdDef(UnitTest.class.getConstructor(new Class[] { double.class, Set.class })); + checkSingleMemberBooleanOvrdDef(UnitTest.class.getConstructor(new Class[] { boolean.class, Set.class })); + checkSingleMemberStringOvrdDef(UnitTest.class.getConstructor(new Class[] { String.class, Set.class })); + checkSingleMemberClassOvrdDef(UnitTest.class.getConstructor(new Class[] { Class.class, Set.class })); + checkSingleMemberEnumOvrdDef(UnitTest.class.getConstructor(new Class[] { Enum.class, Set.class })); + + // SINGLE-MEMBER SCALAR TYPES WITH DEFAULT-ACCEPT ON CONSTRUCTOR + checkSingleMemberByteAcceptDef(UnitTest.class.getConstructor(new Class[] { byte.class, Map.class })); + checkSingleMemberShortAcceptDef(UnitTest.class.getConstructor(new Class[] { short.class, Map.class })); + checkSingleMemberIntAcceptDef(UnitTest.class.getConstructor(new Class[] { int.class, Map.class })); + checkSingleMemberLongAcceptDef(UnitTest.class.getConstructor(new Class[] { long.class, Map.class })); + checkSingleMemberCharAcceptDef(UnitTest.class.getConstructor(new Class[] { char.class, Map.class })); + checkSingleMemberFloatAcceptDef(UnitTest.class.getConstructor(new Class[] { float.class, Map.class })); + checkSingleMemberDoubleAcceptDef(UnitTest.class.getConstructor(new Class[] { double.class, Map.class })); + checkSingleMemberBooleanAcceptDef(UnitTest.class.getConstructor(new Class[] { boolean.class, Map.class })); + checkSingleMemberStringAcceptDef(UnitTest.class.getConstructor(new Class[] { String.class, Map.class })); + checkSingleMemberClassAcceptDef(UnitTest.class.getConstructor(new Class[] { Class.class, Map.class })); + checkSingleMemberEnumAcceptDef(UnitTest.class.getConstructor(new Class[] { Enum.class, Map.class })); + + // SINGLE-MEMBER ARRAY TYPES (EMPTY ARRAY) ON CONSTRUCTOR + checkSingleMemberByteArrEmpty(UnitTest.class.getConstructor(new Class[] { byte[].class })); + checkSingleMemberShortArrEmpty(UnitTest.class.getConstructor(new Class[] { short[].class })); + checkSingleMemberIntArrEmpty(UnitTest.class.getConstructor(new Class[] { int[].class })); + checkSingleMemberLongArrEmpty(UnitTest.class.getConstructor(new Class[] { long[].class })); + checkSingleMemberCharArrEmpty(UnitTest.class.getConstructor(new Class[] { char[].class })); + checkSingleMemberFloatArrEmpty(UnitTest.class.getConstructor(new Class[] { float[].class })); + checkSingleMemberDoubleArrEmpty(UnitTest.class.getConstructor(new Class[] { double[].class })); + checkSingleMemberBooleanArrEmpty(UnitTest.class.getConstructor(new Class[] { boolean[].class })); + checkSingleMemberStringArrEmpty(UnitTest.class.getConstructor(new Class[] { String[].class })); + checkSingleMemberClassArrEmpty(UnitTest.class.getConstructor(new Class[] { Class[].class })); + checkSingleMemberEnumArrEmpty(UnitTest.class.getConstructor(new Class[] { Enum[].class })); + + // SINGLE-MEMBER ARRAY TYPES (ONE-ELEMENT ARRAY) ON CONSTRUCTOR + checkSingleMemberByteArrOne(UnitTest.class.getConstructor(new Class[] { byte[].class, Set.class })); + checkSingleMemberShortArrOne(UnitTest.class.getConstructor(new Class[] { short[].class, Set.class })); + checkSingleMemberIntArrOne(UnitTest.class.getConstructor(new Class[] { int[].class, Set.class })); + checkSingleMemberLongArrOne(UnitTest.class.getConstructor(new Class[] { long[].class, Set.class })); + checkSingleMemberCharArrOne(UnitTest.class.getConstructor(new Class[] { char[].class, Set.class })); + checkSingleMemberFloatArrOne(UnitTest.class.getConstructor(new Class[] { float[].class, Set.class })); + checkSingleMemberDoubleArrOne(UnitTest.class.getConstructor(new Class[] { double[].class, Set.class })); + checkSingleMemberBooleanArrOne(UnitTest.class.getConstructor(new Class[] { boolean[].class, Set.class })); + checkSingleMemberStringArrOne(UnitTest.class.getConstructor(new Class[] { String[].class, Set.class })); + checkSingleMemberClassArrOne(UnitTest.class.getConstructor(new Class[] { Class[].class, Set.class })); + checkSingleMemberEnumArrOne(UnitTest.class.getConstructor(new Class[] { Enum[].class, Set.class })); + + // SINGLE-MEMBER ARRAY TYPES (TWO-ELEMENT ARRAY) ON CONSTRUCTOR + checkSingleMemberByteArrTwo(UnitTest.class.getConstructor(new Class[] { byte[].class, Map.class })); + checkSingleMemberShortArrTwo(UnitTest.class.getConstructor(new Class[] { short[].class, Map.class })); + checkSingleMemberIntArrTwo(UnitTest.class.getConstructor(new Class[] { int[].class, Map.class })); + checkSingleMemberLongArrTwo(UnitTest.class.getConstructor(new Class[] { long[].class, Map.class })); + checkSingleMemberCharArrTwo(UnitTest.class.getConstructor(new Class[] { char[].class, Map.class })); + checkSingleMemberFloatArrTwo(UnitTest.class.getConstructor(new Class[] { float[].class, Map.class })); + checkSingleMemberDoubleArrTwo(UnitTest.class.getConstructor(new Class[] { double[].class, Map.class })); + checkSingleMemberBooleanArrTwo(UnitTest.class.getConstructor(new Class[] { boolean[].class, Map.class })); + checkSingleMemberStringArrTwo(UnitTest.class.getConstructor(new Class[] { String[].class, Map.class })); + checkSingleMemberClassArrTwo(UnitTest.class.getConstructor(new Class[] { Class[].class, Map.class })); + checkSingleMemberEnumArrTwo(UnitTest.class.getConstructor(new Class[] { Enum[].class, Map.class })); + + // SINGLE-MEMBER ARRAY TYPES WITH DEFAULT (OVERRIDE)ON CONSTRUCTOR + checkSingleMemberByteArrOvrdDef(UnitTest.class.getConstructor(new Class[] { byte[].class, List.class })); + checkSingleMemberShortArrOvrdDef(UnitTest.class.getConstructor(new Class[] { short[].class, List.class })); + checkSingleMemberIntArrOvrdDef(UnitTest.class.getConstructor(new Class[] { int[].class, List.class })); + checkSingleMemberLongArrOvrdDef(UnitTest.class.getConstructor(new Class[] { long[].class, List.class })); + checkSingleMemberCharArrOvrdDef(UnitTest.class.getConstructor(new Class[] { char[].class, List.class })); + checkSingleMemberFloatArrOvrdDef(UnitTest.class.getConstructor(new Class[] { float[].class, List.class })); + checkSingleMemberDoubleArrOvrdDef(UnitTest.class.getConstructor(new Class[] { double[].class, List.class })); + checkSingleMemberBooleanArrOvrdDef(UnitTest.class.getConstructor(new Class[] { boolean[].class, List.class })); + checkSingleMemberStringArrOvrdDef(UnitTest.class.getConstructor(new Class[] { String[].class, List.class })); + checkSingleMemberClassArrOvrdDef(UnitTest.class.getConstructor(new Class[] { Class[].class, List.class })); + checkSingleMemberEnumArrOvrdDef(UnitTest.class.getConstructor(new Class[] { Enum[].class, List.class })); + + // SINGLE-MEMBER ARRAY TYPES WITH DEFAULT (ACCEPT)ON CONSTRUCTOR + checkSingleMemberByteArrAcceptDef(UnitTest.class.getConstructor(new Class[] { byte[].class, Collection.class })); + checkSingleMemberShortArrAcceptDef(UnitTest.class.getConstructor(new Class[] { short[].class, Collection.class })); + checkSingleMemberIntArrAcceptDef(UnitTest.class.getConstructor(new Class[] { int[].class, Collection.class })); + checkSingleMemberLongArrAcceptDef(UnitTest.class.getConstructor(new Class[] { long[].class, Collection.class })); + checkSingleMemberCharArrAcceptDef(UnitTest.class.getConstructor(new Class[] { char[].class, Collection.class })); + checkSingleMemberFloatArrAcceptDef(UnitTest.class.getConstructor(new Class[] { float[].class, Collection.class })); + checkSingleMemberDoubleArrAcceptDef(UnitTest.class.getConstructor(new Class[] { double[].class, Collection.class })); + checkSingleMemberBooleanArrAcceptDef(UnitTest.class.getConstructor(new Class[] { boolean[].class, Collection.class })); + checkSingleMemberStringArrAcceptDef(UnitTest.class.getConstructor(new Class[] { String[].class, Collection.class })); + checkSingleMemberClassArrAcceptDef(UnitTest.class.getConstructor(new Class[] { Class[].class, Collection.class })); + checkSingleMemberEnumArrAcceptDef(UnitTest.class.getConstructor(new Class[] { Enum[].class, Collection.class })); + + // *** TESTS ON ANNOTATED PARAMETERS *** + + // MULTIMEMBER SCALAR TYPES ON PARAM + checkScalarTypesParam(UnitTest.class.getMethod("scalarTypesParam", Y)); + checkScalarTypesOverrideDefaultParam(UnitTest.class.getMethod("scalarTypesOverrideDefaultParam", Y)); + checkScalarTypesAcceptDefaultParam(UnitTest.class.getMethod("scalarTypesAcceptDefaultParam", Y)); + + // MULTIMEMBER ARRAY TYPES ON PARAM + checkArrayTypes0Param(UnitTest.class.getMethod("emptyArrayTypesParam", Y)); + checkArrayTypes1Param(UnitTest.class.getMethod("singleElementArrayTypesParam", Y)); + checkArrayTypes2Param(UnitTest.class.getMethod("twoElementArrayTypesParam", Y)); + checkArrayTypesAcceptDefaultParam(UnitTest.class.getMethod("arrayTypesAcceptDefaultParam", Y)); + checkArrayTypesOverrideDefaultParam(UnitTest.class.getMethod("arrayTypesOverrideDefaultParam", Y)); + + // MARKER TYPE ON PARAMETER + checkMarkerParam(UnitTest.class.getMethod("markerParam", Y)); + + // SINGLE-MEMBER SCALAR TYPES ON PARAMETER + checkSingleMemberByteParam(UnitTest.class.getMethod("SingleMemberByteParam", Y)); + checkSingleMemberShortParam(UnitTest.class.getMethod("SingleMemberShortParam", Y)); + checkSingleMemberIntParam(UnitTest.class.getMethod("SingleMemberIntParam", Y)); + checkSingleMemberLongParam(UnitTest.class.getMethod("SingleMemberLongParam", Y)); + checkSingleMemberCharParam(UnitTest.class.getMethod("SingleMemberCharParam", Y)); + checkSingleMemberFloatParam(UnitTest.class.getMethod("SingleMemberFloatParam", Y)); + checkSingleMemberDoubleParam(UnitTest.class.getMethod("SingleMemberDoubleParam", Y)); + checkSingleMemberBooleanParam(UnitTest.class.getMethod("SingleMemberBooleanParam", Y)); + checkSingleMemberStringParam(UnitTest.class.getMethod("SingleMemberStringParam", Y)); + checkSingleMemberClassParam(UnitTest.class.getMethod("SingleMemberClassParam", Y)); + checkSingleMemberEnumParam(UnitTest.class.getMethod("SingleMemberEnumParam", Y)); + + // SINGLE-MEMBER SCALAR TYPES WITH DEFAULT-OVERRIDE ON PARAMETER + checkSingleMemberByteOvrdDefParam(UnitTest.class.getMethod("SingleMemberByteOvrdDefParam", Y)); + checkSingleMemberShortOvrdDefParam(UnitTest.class.getMethod("SingleMemberShortOvrdDefParam", Y)); + checkSingleMemberIntOvrdDefParam(UnitTest.class.getMethod("SingleMemberIntOvrdDefParam", Y)); + checkSingleMemberLongOvrdDefParam(UnitTest.class.getMethod("SingleMemberLongOvrdDefParam", Y)); + checkSingleMemberCharOvrdDefParam(UnitTest.class.getMethod("SingleMemberCharOvrdDefParam", Y)); + checkSingleMemberFloatOvrdDefParam(UnitTest.class.getMethod("SingleMemberFloatOvrdDefParam", Y)); + checkSingleMemberDoubleOvrdDefParam(UnitTest.class.getMethod("SingleMemberDoubleOvrdDefParam", Y)); + checkSingleMemberBooleanOvrdDefParam(UnitTest.class.getMethod("SingleMemberBooleanOvrdDefParam", Y)); + checkSingleMemberStringOvrdDefParam(UnitTest.class.getMethod("SingleMemberStringOvrdDefParam", Y)); + checkSingleMemberClassOvrdDefParam(UnitTest.class.getMethod("SingleMemberClassOvrdDefParam", Y)); + checkSingleMemberEnumOvrdDefParam(UnitTest.class.getMethod("SingleMemberEnumOvrdDefParam", Y)); + + // SINGLE-MEMBER SCALAR TYPES WITH DEFAULT-ACCEPT ON PARAMETER + checkSingleMemberByteAcceptDefParam(UnitTest.class.getMethod("SingleMemberByteAcceptDefParam", Y)); + checkSingleMemberShortAcceptDefParam(UnitTest.class.getMethod("SingleMemberShortAcceptDefParam", Y)); + checkSingleMemberIntAcceptDefParam(UnitTest.class.getMethod("SingleMemberIntAcceptDefParam", Y)); + checkSingleMemberLongAcceptDefParam(UnitTest.class.getMethod("SingleMemberLongAcceptDefParam", Y)); + checkSingleMemberCharAcceptDefParam(UnitTest.class.getMethod("SingleMemberCharAcceptDefParam", Y)); + checkSingleMemberFloatAcceptDefParam(UnitTest.class.getMethod("SingleMemberFloatAcceptDefParam", Y)); + checkSingleMemberDoubleAcceptDefParam(UnitTest.class.getMethod("SingleMemberDoubleAcceptDefParam", Y)); + checkSingleMemberBooleanAcceptDefParam(UnitTest.class.getMethod("SingleMemberBooleanAcceptDefParam", Y)); + checkSingleMemberStringAcceptDefParam(UnitTest.class.getMethod("SingleMemberStringAcceptDefParam", Y)); + checkSingleMemberClassAcceptDefParam(UnitTest.class.getMethod("SingleMemberClassAcceptDefParam", Y)); + checkSingleMemberEnumAcceptDefParam(UnitTest.class.getMethod("SingleMemberEnumAcceptDefParam", Y)); + + // SINGLE-MEMBER ARRAY TYPES Param(UnitTest.class.getMethod("EMPTY ARRAY) ON PARAMETER + checkSingleMemberByteArrEmptyParam(UnitTest.class.getMethod("SingleMemberByteArrEmptyParam", Y)); + checkSingleMemberShortArrEmptyParam(UnitTest.class.getMethod("SingleMemberShortArrEmptyParam", Y)); + checkSingleMemberIntArrEmptyParam(UnitTest.class.getMethod("SingleMemberIntArrEmptyParam", Y)); + checkSingleMemberLongArrEmptyParam(UnitTest.class.getMethod("SingleMemberLongArrEmptyParam", Y)); + checkSingleMemberCharArrEmptyParam(UnitTest.class.getMethod("SingleMemberCharArrEmptyParam", Y)); + checkSingleMemberFloatArrEmptyParam(UnitTest.class.getMethod("SingleMemberFloatArrEmptyParam", Y)); + checkSingleMemberDoubleArrEmptyParam(UnitTest.class.getMethod("SingleMemberDoubleArrEmptyParam", Y)); + checkSingleMemberBooleanArrEmptyParam(UnitTest.class.getMethod("SingleMemberBooleanArrEmptyParam", Y)); + checkSingleMemberStringArrEmptyParam(UnitTest.class.getMethod("SingleMemberStringArrEmptyParam", Y)); + checkSingleMemberClassArrEmptyParam(UnitTest.class.getMethod("SingleMemberClassArrEmptyParam", Y)); + checkSingleMemberEnumArrEmptyParam(UnitTest.class.getMethod("SingleMemberEnumArrEmptyParam", Y)); + + // SINGLE-MEMBER ARRAY TYPES Param(UnitTest.class.getMethod("ONE-ELEMENT ARRAY) ON PARAMETER + checkSingleMemberByteArrOneParam(UnitTest.class.getMethod("SingleMemberByteArrOneParam", Y)); + checkSingleMemberShortArrOneParam(UnitTest.class.getMethod("SingleMemberShortArrOneParam", Y)); + checkSingleMemberIntArrOneParam(UnitTest.class.getMethod("SingleMemberIntArrOneParam", Y)); + checkSingleMemberLongArrOneParam(UnitTest.class.getMethod("SingleMemberLongArrOneParam", Y)); + checkSingleMemberCharArrOneParam(UnitTest.class.getMethod("SingleMemberCharArrOneParam", Y)); + checkSingleMemberFloatArrOneParam(UnitTest.class.getMethod("SingleMemberFloatArrOneParam", Y)); + checkSingleMemberDoubleArrOneParam(UnitTest.class.getMethod("SingleMemberDoubleArrOneParam", Y)); + checkSingleMemberBooleanArrOneParam(UnitTest.class.getMethod("SingleMemberBooleanArrOneParam", Y)); + checkSingleMemberStringArrOneParam(UnitTest.class.getMethod("SingleMemberStringArrOneParam", Y)); + checkSingleMemberClassArrOneParam(UnitTest.class.getMethod("SingleMemberClassArrOneParam", Y)); + checkSingleMemberEnumArrOneParam(UnitTest.class.getMethod("SingleMemberEnumArrOneParam", Y)); + + // SINGLE-MEMBER ARRAY TYPES Param(UnitTest.class.getMethod("TWO-ELEMENT ARRAY) ON PARAMETER + checkSingleMemberByteArrTwoParam(UnitTest.class.getMethod("SingleMemberByteArrTwoParam", Y)); + checkSingleMemberShortArrTwoParam(UnitTest.class.getMethod("SingleMemberShortArrTwoParam", Y)); + checkSingleMemberIntArrTwoParam(UnitTest.class.getMethod("SingleMemberIntArrTwoParam", Y)); + checkSingleMemberLongArrTwoParam(UnitTest.class.getMethod("SingleMemberLongArrTwoParam", Y)); + checkSingleMemberCharArrTwoParam(UnitTest.class.getMethod("SingleMemberCharArrTwoParam", Y)); + checkSingleMemberFloatArrTwoParam(UnitTest.class.getMethod("SingleMemberFloatArrTwoParam", Y)); + checkSingleMemberDoubleArrTwoParam(UnitTest.class.getMethod("SingleMemberDoubleArrTwoParam", Y)); + checkSingleMemberBooleanArrTwoParam(UnitTest.class.getMethod("SingleMemberBooleanArrTwoParam", Y)); + checkSingleMemberStringArrTwoParam(UnitTest.class.getMethod("SingleMemberStringArrTwoParam", Y)); + checkSingleMemberClassArrTwoParam(UnitTest.class.getMethod("SingleMemberClassArrTwoParam", Y)); + checkSingleMemberEnumArrTwoParam(UnitTest.class.getMethod("SingleMemberEnumArrTwoParam", Y)); + + // SINGLE-MEMBER ARRAY TYPES WITH DEFAULT Param(UnitTest.class.getMethod("OVERRIDE)ON PARAMETER + checkSingleMemberByteArrOvrdDefParam(UnitTest.class.getMethod("SingleMemberByteArrOvrdDefParam", Y)); + checkSingleMemberShortArrOvrdDefParam(UnitTest.class.getMethod("SingleMemberShortArrOvrdDefParam", Y)); + checkSingleMemberIntArrOvrdDefParam(UnitTest.class.getMethod("SingleMemberIntArrOvrdDefParam", Y)); + checkSingleMemberLongArrOvrdDefParam(UnitTest.class.getMethod("SingleMemberLongArrOvrdDefParam", Y)); + checkSingleMemberCharArrOvrdDefParam(UnitTest.class.getMethod("SingleMemberCharArrOvrdDefParam", Y)); + checkSingleMemberFloatArrOvrdDefParam(UnitTest.class.getMethod("SingleMemberFloatArrOvrdDefParam", Y)); + checkSingleMemberDoubleArrOvrdDefParam(UnitTest.class.getMethod("SingleMemberDoubleArrOvrdDefParam", Y)); + checkSingleMemberBooleanArrOvrdDefParam(UnitTest.class.getMethod("SingleMemberBooleanArrOvrdDefParam", Y)); + checkSingleMemberStringArrOvrdDefParam(UnitTest.class.getMethod("SingleMemberStringArrOvrdDefParam", Y)); + checkSingleMemberClassArrOvrdDefParam(UnitTest.class.getMethod("SingleMemberClassArrOvrdDefParam", Y)); + checkSingleMemberEnumArrOvrdDefParam(UnitTest.class.getMethod("SingleMemberEnumArrOvrdDefParam", Y)); + + // SINGLE-MEMBER ARRAY TYPES WITH DEFAULT Param(UnitTest.class.getMethod("ACCEPT)ON PARAMETER + checkSingleMemberByteArrAcceptDefParam(UnitTest.class.getMethod("SingleMemberByteArrAcceptDefParam", Y)); + checkSingleMemberShortArrAcceptDefParam(UnitTest.class.getMethod("SingleMemberShortArrAcceptDefParam", Y)); + checkSingleMemberIntArrAcceptDefParam(UnitTest.class.getMethod("SingleMemberIntArrAcceptDefParam", Y)); + checkSingleMemberLongArrAcceptDefParam(UnitTest.class.getMethod("SingleMemberLongArrAcceptDefParam", Y)); + checkSingleMemberCharArrAcceptDefParam(UnitTest.class.getMethod("SingleMemberCharArrAcceptDefParam", Y)); + checkSingleMemberFloatArrAcceptDefParam(UnitTest.class.getMethod("SingleMemberFloatArrAcceptDefParam", Y)); + checkSingleMemberDoubleArrAcceptDefParam(UnitTest.class.getMethod("SingleMemberDoubleArrAcceptDefParam", Y)); + checkSingleMemberBooleanArrAcceptDefParam(UnitTest.class.getMethod("SingleMemberBooleanArrAcceptDefParam", Y)); + checkSingleMemberStringArrAcceptDefParam(UnitTest.class.getMethod("SingleMemberStringArrAcceptDefParam", Y)); + checkSingleMemberClassArrAcceptDefParam(UnitTest.class.getMethod("SingleMemberClassArrAcceptDefParam", Y)); + checkSingleMemberEnumArrAcceptDefParam(UnitTest.class.getMethod("SingleMemberEnumArrAcceptDefParam", Y)); + + // *** TESTS ON ANNOTATED CLASSES *** + + // MULTIMEMBER SCALAR TYPES ON CLASS + checkScalarTypes(scalarTypesClass.class); + checkScalarTypesOverrideDefault(scalarTypesOverrideDefaultClass.class); + checkScalarTypesAcceptDefault(scalarTypesAcceptDefaultClass.class); + + // MULTIMEMBER ARRAY TYPES ON CLASS + checkArrayTypes0(emptyArrayTypesClass.class); + checkArrayTypes1(singleElementArrayTypesClass.class); + checkArrayTypes2(twoElementArrayTypesClass.class); + checkArrayTypesOverrideDefault(arrayTypesOverrideDefaultClass.class); + checkArrayTypesAcceptDefault(arrayTypesAcceptDefaultClass.class); + + // MARKER TYPE ON CLASS + checkMarker(markerClass.class); + + // SINGLE-MEMBER SCALAR TYPES ON CLASS + checkSingleMemberByte(SingleMemberByteClass.class); + checkSingleMemberShort(SingleMemberShortClass.class); + checkSingleMemberInt(SingleMemberIntClass.class); + checkSingleMemberLong(SingleMemberLongClass.class); + checkSingleMemberChar(SingleMemberCharClass.class); + checkSingleMemberFloat(SingleMemberFloatClass.class); + checkSingleMemberDouble(SingleMemberDoubleClass.class); + checkSingleMemberBoolean(SingleMemberBooleanClass.class); + checkSingleMemberString(SingleMemberStringClass.class); + checkSingleMemberClass(SingleMemberClassClass.class); + checkSingleMemberEnum(SingleMemberEnumClass.class); + + // SINGLE-MEMBER SCALAR TYPES WITH DEFAULT-OVERRIDE ON CLASS + checkSingleMemberByteOvrdDef(SingleMemberByteOvrdDefClass.class); + checkSingleMemberShortOvrdDef(SingleMemberShortOvrdDefClass.class); + checkSingleMemberIntOvrdDef(SingleMemberIntOvrdDefClass.class); + checkSingleMemberLongOvrdDef(SingleMemberLongOvrdDefClass.class); + checkSingleMemberCharOvrdDef(SingleMemberCharOvrdDefClass.class); + checkSingleMemberFloatOvrdDef(SingleMemberFloatOvrdDefClass.class); + checkSingleMemberDoubleOvrdDef(SingleMemberDoubleOvrdDefClass.class); + checkSingleMemberBooleanOvrdDef(SingleMemberBooleanOvrdDefClass.class); + checkSingleMemberStringOvrdDef(SingleMemberStringOvrdDefClass.class); + checkSingleMemberClassOvrdDef(SingleMemberClassOvrdDefClass.class); + checkSingleMemberEnumOvrdDef(SingleMemberEnumOvrdDefClass.class); + + // SINGLE-MEMBER SCALAR TYPES WITH DEFAULT-ACCEPT ON CLASS + checkSingleMemberByteAcceptDef(SingleMemberByteAcceptDefClass.class); + checkSingleMemberShortAcceptDef(SingleMemberShortAcceptDefClass.class); + checkSingleMemberIntAcceptDef(SingleMemberIntAcceptDefClass.class); + checkSingleMemberLongAcceptDef(SingleMemberLongAcceptDefClass.class); + checkSingleMemberCharAcceptDef(SingleMemberCharAcceptDefClass.class); + checkSingleMemberFloatAcceptDef(SingleMemberFloatAcceptDefClass.class); + checkSingleMemberDoubleAcceptDef(SingleMemberDoubleAcceptDefClass.class); + checkSingleMemberBooleanAcceptDef(SingleMemberBooleanAcceptDefClass.class); + checkSingleMemberStringAcceptDef(SingleMemberStringAcceptDefClass.class); + checkSingleMemberClassAcceptDef(SingleMemberClassAcceptDefClass.class); + checkSingleMemberEnumAcceptDef(SingleMemberEnumAcceptDefClass.class); + + // SINGLE-MEMBER ARRAY TYPES (EMPTY ARRAY) ON CLASS + checkSingleMemberByteArrEmpty(SingleMemberByteArrEmptyClass.class); + checkSingleMemberShortArrEmpty(SingleMemberShortArrEmptyClass.class); + checkSingleMemberIntArrEmpty(SingleMemberIntArrEmptyClass.class); + checkSingleMemberLongArrEmpty(SingleMemberLongArrEmptyClass.class); + checkSingleMemberCharArrEmpty(SingleMemberCharArrEmptyClass.class); + checkSingleMemberFloatArrEmpty(SingleMemberFloatArrEmptyClass.class); + checkSingleMemberDoubleArrEmpty(SingleMemberDoubleArrEmptyClass.class); + checkSingleMemberBooleanArrEmpty(SingleMemberBooleanArrEmptyClass.class); + checkSingleMemberStringArrEmpty(SingleMemberStringArrEmptyClass.class); + checkSingleMemberClassArrEmpty(SingleMemberClassArrEmptyClass.class); + checkSingleMemberEnumArrEmpty(SingleMemberEnumArrEmptyClass.class); + + // SINGLE-MEMBER ARRAY TYPES (ONE-ELEMENT ARRAY) ON CLASS + checkSingleMemberByteArrOne(SingleMemberByteArrOneClass.class); + checkSingleMemberShortArrOne(SingleMemberShortArrOneClass.class); + checkSingleMemberIntArrOne(SingleMemberIntArrOneClass.class); + checkSingleMemberLongArrOne(SingleMemberLongArrOneClass.class); + checkSingleMemberCharArrOne(SingleMemberCharArrOneClass.class); + checkSingleMemberFloatArrOne(SingleMemberFloatArrOneClass.class); + checkSingleMemberDoubleArrOne(SingleMemberDoubleArrOneClass.class); + checkSingleMemberBooleanArrOne(SingleMemberBooleanArrOneClass.class); + checkSingleMemberStringArrOne(SingleMemberStringArrOneClass.class); + checkSingleMemberClassArrOne(SingleMemberClassArrOneClass.class); + checkSingleMemberEnumArrOne(SingleMemberEnumArrOneClass.class); + + // SINGLE-MEMBER ARRAY TYPES (TWO-ELEMENT ARRAY) ON CLASS + checkSingleMemberByteArrTwo(SingleMemberByteArrTwoClass.class); + checkSingleMemberShortArrTwo(SingleMemberShortArrTwoClass.class); + checkSingleMemberIntArrTwo(SingleMemberIntArrTwoClass.class); + checkSingleMemberLongArrTwo(SingleMemberLongArrTwoClass.class); + checkSingleMemberCharArrTwo(SingleMemberCharArrTwoClass.class); + checkSingleMemberFloatArrTwo(SingleMemberFloatArrTwoClass.class); + checkSingleMemberDoubleArrTwo(SingleMemberDoubleArrTwoClass.class); + checkSingleMemberBooleanArrTwo(SingleMemberBooleanArrTwoClass.class); + checkSingleMemberStringArrTwo(SingleMemberStringArrTwoClass.class); + checkSingleMemberClassArrTwo(SingleMemberClassArrTwoClass.class); + checkSingleMemberEnumArrTwo(SingleMemberEnumArrTwoClass.class); + + // SINGLE-MEMBER ARRAY TYPES WITH DEFAULT (OVERRIDE)ON CLASS + checkSingleMemberByteArrOvrdDef(SingleMemberByteArrOvrdDefClass.class); + checkSingleMemberShortArrOvrdDef(SingleMemberShortArrOvrdDefClass.class); + checkSingleMemberIntArrOvrdDef(SingleMemberIntArrOvrdDefClass.class); + checkSingleMemberLongArrOvrdDef(SingleMemberLongArrOvrdDefClass.class); + checkSingleMemberCharArrOvrdDef(SingleMemberCharArrOvrdDefClass.class); + checkSingleMemberFloatArrOvrdDef(SingleMemberFloatArrOvrdDefClass.class); + checkSingleMemberDoubleArrOvrdDef(SingleMemberDoubleArrOvrdDefClass.class); + checkSingleMemberBooleanArrOvrdDef(SingleMemberBooleanArrOvrdDefClass.class); + checkSingleMemberStringArrOvrdDef(SingleMemberStringArrOvrdDefClass.class); + checkSingleMemberClassArrOvrdDef(SingleMemberClassArrOvrdDefClass.class); + checkSingleMemberEnumArrOvrdDef(SingleMemberEnumArrOvrdDefClass.class); + + // SINGLE-MEMBER ARRAY TYPES WITH DEFAULT (ACCEPT)ON CLASS + checkSingleMemberByteArrAcceptDef(SingleMemberByteArrAcceptDefClass.class); + checkSingleMemberShortArrAcceptDef(SingleMemberShortArrAcceptDefClass.class); + checkSingleMemberIntArrAcceptDef(SingleMemberIntArrAcceptDefClass.class); + checkSingleMemberLongArrAcceptDef(SingleMemberLongArrAcceptDefClass.class); + checkSingleMemberCharArrAcceptDef(SingleMemberCharArrAcceptDefClass.class); + checkSingleMemberFloatArrAcceptDef(SingleMemberFloatArrAcceptDefClass.class); + checkSingleMemberDoubleArrAcceptDef(SingleMemberDoubleArrAcceptDefClass.class); + checkSingleMemberBooleanArrAcceptDef(SingleMemberBooleanArrAcceptDefClass.class); + checkSingleMemberStringArrAcceptDef(SingleMemberStringArrAcceptDefClass.class); + checkSingleMemberClassArrAcceptDef(SingleMemberClassArrAcceptDefClass.class); + checkSingleMemberEnumArrAcceptDef(SingleMemberEnumArrAcceptDefClass.class); + + // *** TESTS FOR EQUALS AND HASHCODE - POSITIVE + + // MULTIMEMBER SCALAR TYPES + checkEquals(scalarTypesClass.class, UnitTest.class.getField("scalarTypesField"), + ScalarTypes.class); + checkEquals(scalarTypesOverrideDefaultClass.class, UnitTest.class.getField("scalarTypesOverrideDefaultField"), + ScalarTypesWithDefault.class); + checkEquals(scalarTypesAcceptDefaultClass.class, UnitTest.class.getField("scalarTypesAcceptDefaultField"), + ScalarTypesWithDefault.class); + + // MULTIMEMBER ARRAY TYPES + checkEquals(emptyArrayTypesClass.class, UnitTest.class.getField("emptyArrayTypesField"), + ArrayTypes.class); + checkEquals(singleElementArrayTypesClass.class, UnitTest.class.getField("singleElementArrayTypesField"), + ArrayTypes.class); + checkEquals(twoElementArrayTypesClass.class, UnitTest.class.getField("twoElementArrayTypesField"), + ArrayTypes.class); + checkEquals(arrayTypesOverrideDefaultClass.class, UnitTest.class.getField("arrayTypesOverrideDefaultField"), + ArrayTypesWithDefault.class); + checkEquals(arrayTypesAcceptDefaultClass.class, UnitTest.class.getField("arrayTypesAcceptDefaultField"), + ArrayTypesWithDefault.class); + + // MARKER TYPE + checkEquals(markerClass.class, UnitTest.class.getField("markerField"), + Marker.class); + + // SINGLE-MEMBER SCALAR TYPES + checkEquals(SingleMemberByteClass.class, UnitTest.class.getField("SingleMemberByteField"), + SingleMemberByte.class); + checkEquals(SingleMemberShortClass.class, UnitTest.class.getField("SingleMemberShortField"), + SingleMemberShort.class); + checkEquals(SingleMemberIntClass.class, UnitTest.class.getField("SingleMemberIntField"), + SingleMemberInt.class); + checkEquals(SingleMemberLongClass.class, UnitTest.class.getField("SingleMemberLongField"), + SingleMemberLong.class); + checkEquals(SingleMemberCharClass.class, UnitTest.class.getField("SingleMemberCharField"), + SingleMemberChar.class); + checkEquals(SingleMemberFloatClass.class, UnitTest.class.getField("SingleMemberFloatField"), + SingleMemberFloat.class); + checkEquals(SingleMemberDoubleClass.class, UnitTest.class.getField("SingleMemberDoubleField"), + SingleMemberDouble.class); + checkEquals(SingleMemberBooleanClass.class, UnitTest.class.getField("SingleMemberBooleanField"), + SingleMemberBoolean.class); + checkEquals(SingleMemberStringClass.class, UnitTest.class.getField("SingleMemberStringField"), + SingleMemberString.class); + checkEquals(SingleMemberClassClass.class, UnitTest.class.getField("SingleMemberClassField"), + SingleMemberClass.class); + checkEquals(SingleMemberEnumClass.class, UnitTest.class.getField("SingleMemberEnumField"), + SingleMemberEnum.class); + + // SINGLE-MEMBER SCALAR TYPES WITH DEFAULT-OVERRIDE + checkEquals(SingleMemberByteOvrdDefClass.class, UnitTest.class.getField("SingleMemberByteOvrdDefField"), + SingleMemberByteWithDef.class); + checkEquals(SingleMemberShortOvrdDefClass.class, UnitTest.class.getField("SingleMemberShortOvrdDefField"), + SingleMemberShortWithDef.class); + checkEquals(SingleMemberIntOvrdDefClass.class, UnitTest.class.getField("SingleMemberIntOvrdDefField"), + SingleMemberIntWithDef.class); + checkEquals(SingleMemberLongOvrdDefClass.class, UnitTest.class.getField("SingleMemberLongOvrdDefField"), + SingleMemberLongWithDef.class); + checkEquals(SingleMemberCharOvrdDefClass.class, UnitTest.class.getField("SingleMemberCharOvrdDefField"), + SingleMemberCharWithDef.class); + checkEquals(SingleMemberFloatOvrdDefClass.class, UnitTest.class.getField("SingleMemberFloatOvrdDefField"), + SingleMemberFloatWithDef.class); + checkEquals(SingleMemberDoubleOvrdDefClass.class, UnitTest.class.getField("SingleMemberDoubleOvrdDefField"), + SingleMemberDoubleWithDef.class); + checkEquals(SingleMemberBooleanOvrdDefClass.class, UnitTest.class.getField("SingleMemberBooleanOvrdDefField"), + SingleMemberBooleanWithDef.class); + checkEquals(SingleMemberStringOvrdDefClass.class, UnitTest.class.getField("SingleMemberStringOvrdDefField"), + SingleMemberStringWithDef.class); + checkEquals(SingleMemberClassOvrdDefClass.class, UnitTest.class.getField("SingleMemberClassOvrdDefField"), + SingleMemberClassWithDef.class); + checkEquals(SingleMemberEnumOvrdDefClass.class, UnitTest.class.getField("SingleMemberEnumOvrdDefField"), + SingleMemberEnumWithDef.class); + + // SINGLE-MEMBER SCALAR TYPES WITH DEFAULT-ACCEPT + checkEquals(SingleMemberByteAcceptDefClass.class, UnitTest.class.getField("SingleMemberByteAcceptDefField"), + SingleMemberByteWithDef.class); + checkEquals(SingleMemberShortAcceptDefClass.class, UnitTest.class.getField("SingleMemberShortAcceptDefField"), + SingleMemberShortWithDef.class); + checkEquals(SingleMemberIntAcceptDefClass.class, UnitTest.class.getField("SingleMemberIntAcceptDefField"), + SingleMemberIntWithDef.class); + checkEquals(SingleMemberLongAcceptDefClass.class, UnitTest.class.getField("SingleMemberLongAcceptDefField"), + SingleMemberLongWithDef.class); + checkEquals(SingleMemberCharAcceptDefClass.class, UnitTest.class.getField("SingleMemberCharAcceptDefField"), + SingleMemberCharWithDef.class); + checkEquals(SingleMemberFloatAcceptDefClass.class, UnitTest.class.getField("SingleMemberFloatAcceptDefField"), + SingleMemberFloatWithDef.class); + checkEquals(SingleMemberDoubleAcceptDefClass.class, UnitTest.class.getField("SingleMemberDoubleAcceptDefField"), + SingleMemberDoubleWithDef.class); + checkEquals(SingleMemberBooleanAcceptDefClass.class, UnitTest.class.getField("SingleMemberBooleanAcceptDefField"), + SingleMemberBooleanWithDef.class); + checkEquals(SingleMemberStringAcceptDefClass.class, UnitTest.class.getField("SingleMemberStringAcceptDefField"), + SingleMemberStringWithDef.class); + checkEquals(SingleMemberClassAcceptDefClass.class, UnitTest.class.getField("SingleMemberClassAcceptDefField"), + SingleMemberClassWithDef.class); + checkEquals(SingleMemberEnumAcceptDefClass.class, UnitTest.class.getField("SingleMemberEnumAcceptDefField"), + SingleMemberEnumWithDef.class); + + // SINGLE-MEMBER ARRAY TYPES (EMPTY ARRAY) + checkEquals(SingleMemberByteArrEmptyClass.class, UnitTest.class.getField("SingleMemberByteArrEmptyField"), + SingleMemberByteArray.class); + checkEquals(SingleMemberShortArrEmptyClass.class, UnitTest.class.getField("SingleMemberShortArrEmptyField"), + SingleMemberShortArray.class); + checkEquals(SingleMemberIntArrEmptyClass.class, UnitTest.class.getField("SingleMemberIntArrEmptyField"), + SingleMemberIntArray.class); + checkEquals(SingleMemberLongArrEmptyClass.class, UnitTest.class.getField("SingleMemberLongArrEmptyField"), + SingleMemberLongArray.class); + checkEquals(SingleMemberCharArrEmptyClass.class, UnitTest.class.getField("SingleMemberCharArrEmptyField"), + SingleMemberCharArray.class); + checkEquals(SingleMemberFloatArrEmptyClass.class, UnitTest.class.getField("SingleMemberFloatArrEmptyField"), + SingleMemberFloatArray.class); + checkEquals(SingleMemberDoubleArrEmptyClass.class, UnitTest.class.getField("SingleMemberDoubleArrEmptyField"), + SingleMemberDoubleArray.class); + checkEquals(SingleMemberBooleanArrEmptyClass.class, UnitTest.class.getField("SingleMemberBooleanArrEmptyField"), + SingleMemberBooleanArray.class); + checkEquals(SingleMemberStringArrEmptyClass.class, UnitTest.class.getField("SingleMemberStringArrEmptyField"), + SingleMemberStringArray.class); + checkEquals(SingleMemberClassArrEmptyClass.class, UnitTest.class.getField("SingleMemberClassArrEmptyField"), + SingleMemberClassArray.class); + checkEquals(SingleMemberEnumArrEmptyClass.class, UnitTest.class.getField("SingleMemberEnumArrEmptyField"), + SingleMemberEnumArray.class); + + // SINGLE-MEMBER ARRAY TYPES (ONE-ELEMENT ARRAY) + checkEquals(SingleMemberByteArrOneClass.class, UnitTest.class.getField("SingleMemberByteArrOneField"), + SingleMemberByteArray.class); + checkEquals(SingleMemberShortArrOneClass.class, UnitTest.class.getField("SingleMemberShortArrOneField"), + SingleMemberShortArray.class); + checkEquals(SingleMemberIntArrOneClass.class, UnitTest.class.getField("SingleMemberIntArrOneField"), + SingleMemberIntArray.class); + checkEquals(SingleMemberLongArrOneClass.class, UnitTest.class.getField("SingleMemberLongArrOneField"), + SingleMemberLongArray.class); + checkEquals(SingleMemberCharArrOneClass.class, UnitTest.class.getField("SingleMemberCharArrOneField"), + SingleMemberCharArray.class); + checkEquals(SingleMemberFloatArrOneClass.class, UnitTest.class.getField("SingleMemberFloatArrOneField"), + SingleMemberFloatArray.class); + checkEquals(SingleMemberDoubleArrOneClass.class, UnitTest.class.getField("SingleMemberDoubleArrOneField"), + SingleMemberDoubleArray.class); + checkEquals(SingleMemberBooleanArrOneClass.class, UnitTest.class.getField("SingleMemberBooleanArrOneField"), + SingleMemberBooleanArray.class); + checkEquals(SingleMemberStringArrOneClass.class, UnitTest.class.getField("SingleMemberStringArrOneField"), + SingleMemberStringArray.class); + checkEquals(SingleMemberClassArrOneClass.class, UnitTest.class.getField("SingleMemberClassArrOneField"), + SingleMemberClassArray.class); + checkEquals(SingleMemberEnumArrOneClass.class, UnitTest.class.getField("SingleMemberEnumArrOneField"), + SingleMemberEnumArray.class); + + // SINGLE-MEMBER ARRAY TYPES (TWO-ELEMENT ARRAY) + checkEquals(SingleMemberByteArrTwoClass.class, UnitTest.class.getField("SingleMemberByteArrTwoField"), + SingleMemberByteArray.class); + checkEquals(SingleMemberShortArrTwoClass.class, UnitTest.class.getField("SingleMemberShortArrTwoField"), + SingleMemberShortArray.class); + checkEquals(SingleMemberIntArrTwoClass.class, UnitTest.class.getField("SingleMemberIntArrTwoField"), + SingleMemberIntArray.class); + checkEquals(SingleMemberLongArrTwoClass.class, UnitTest.class.getField("SingleMemberLongArrTwoField"), + SingleMemberLongArray.class); + checkEquals(SingleMemberCharArrTwoClass.class, UnitTest.class.getField("SingleMemberCharArrTwoField"), + SingleMemberCharArray.class); + checkEquals(SingleMemberFloatArrTwoClass.class, UnitTest.class.getField("SingleMemberFloatArrTwoField"), + SingleMemberFloatArray.class); + checkEquals(SingleMemberDoubleArrTwoClass.class, UnitTest.class.getField("SingleMemberDoubleArrTwoField"), + SingleMemberDoubleArray.class); + checkEquals(SingleMemberBooleanArrTwoClass.class, UnitTest.class.getField("SingleMemberBooleanArrTwoField"), + SingleMemberBooleanArray.class); + checkEquals(SingleMemberStringArrTwoClass.class, UnitTest.class.getField("SingleMemberStringArrTwoField"), + SingleMemberStringArray.class); + checkEquals(SingleMemberClassArrTwoClass.class, UnitTest.class.getField("SingleMemberClassArrTwoField"), + SingleMemberClassArray.class); + checkEquals(SingleMemberEnumArrTwoClass.class, UnitTest.class.getField("SingleMemberEnumArrTwoField"), + SingleMemberEnumArray.class); + + // SINGLE-MEMBER ARRAY TYPES WITH DEFAULT (OVERRIDE) + checkEquals(SingleMemberByteArrOvrdDefClass.class, UnitTest.class.getField("SingleMemberByteArrOvrdDefField"), + SingleMemberByteArrayDef.class); + checkEquals(SingleMemberShortArrOvrdDefClass.class, UnitTest.class.getField("SingleMemberShortArrOvrdDefField"), + SingleMemberShortArrayDef.class); + checkEquals(SingleMemberIntArrOvrdDefClass.class, UnitTest.class.getField("SingleMemberIntArrOvrdDefField"), + SingleMemberIntArrayDef.class); + checkEquals(SingleMemberLongArrOvrdDefClass.class, UnitTest.class.getField("SingleMemberLongArrOvrdDefField"), + SingleMemberLongArrayDef.class); + checkEquals(SingleMemberCharArrOvrdDefClass.class, UnitTest.class.getField("SingleMemberCharArrOvrdDefField"), + SingleMemberCharArrayDef.class); + checkEquals(SingleMemberFloatArrOvrdDefClass.class, UnitTest.class.getField("SingleMemberFloatArrOvrdDefField"), + SingleMemberFloatArrayDef.class); + checkEquals(SingleMemberDoubleArrOvrdDefClass.class, UnitTest.class.getField("SingleMemberDoubleArrOvrdDefField"), + SingleMemberDoubleArrayDef.class); + checkEquals(SingleMemberBooleanArrOvrdDefClass.class, UnitTest.class.getField("SingleMemberBooleanArrOvrdDefField"), + SingleMemberBooleanArrayDef.class); + checkEquals(SingleMemberStringArrOvrdDefClass.class, UnitTest.class.getField("SingleMemberStringArrOvrdDefField"), + SingleMemberStringArrayDef.class); + checkEquals(SingleMemberClassArrOvrdDefClass.class, UnitTest.class.getField("SingleMemberClassArrOvrdDefField"), + SingleMemberClassArrayDef.class); + checkEquals(SingleMemberEnumArrOvrdDefClass.class, UnitTest.class.getField("SingleMemberEnumArrOvrdDefField"), + SingleMemberEnumArrayDef.class); + + // SINGLE-MEMBER ARRAY TYPES WITH DEFAULT (ACCEPT) + checkEquals(SingleMemberByteArrAcceptDefClass.class, UnitTest.class.getField("SingleMemberByteArrAcceptDefField"), + SingleMemberByteArrayDef.class); + checkEquals(SingleMemberShortArrAcceptDefClass.class, UnitTest.class.getField("SingleMemberShortArrAcceptDefField"), + SingleMemberShortArrayDef.class); + checkEquals(SingleMemberIntArrAcceptDefClass.class, UnitTest.class.getField("SingleMemberIntArrAcceptDefField"), + SingleMemberIntArrayDef.class); + checkEquals(SingleMemberLongArrAcceptDefClass.class, UnitTest.class.getField("SingleMemberLongArrAcceptDefField"), + SingleMemberLongArrayDef.class); + checkEquals(SingleMemberCharArrAcceptDefClass.class, UnitTest.class.getField("SingleMemberCharArrAcceptDefField"), + SingleMemberCharArrayDef.class); + checkEquals(SingleMemberFloatArrAcceptDefClass.class, UnitTest.class.getField("SingleMemberFloatArrAcceptDefField"), + SingleMemberFloatArrayDef.class); + checkEquals(SingleMemberDoubleArrAcceptDefClass.class, UnitTest.class.getField("SingleMemberDoubleArrAcceptDefField"), + SingleMemberDoubleArrayDef.class); + checkEquals(SingleMemberBooleanArrAcceptDefClass.class, UnitTest.class.getField("SingleMemberBooleanArrAcceptDefField"), + SingleMemberBooleanArrayDef.class); + checkEquals(SingleMemberStringArrAcceptDefClass.class, UnitTest.class.getField("SingleMemberStringArrAcceptDefField"), + SingleMemberStringArrayDef.class); + checkEquals(SingleMemberClassArrAcceptDefClass.class, UnitTest.class.getField("SingleMemberClassArrAcceptDefField"), + SingleMemberClassArrayDef.class); + checkEquals(SingleMemberEnumArrAcceptDefClass.class, UnitTest.class.getField("SingleMemberEnumArrAcceptDefField"), + SingleMemberEnumArrayDef.class); + + // *** TESTS FOR EQUALS AND HASHCODE - NEGATIVE + + // MULTIMEMBER SCALAR TYPES + checkUnequals(scalarTypesOverrideDefaultClass.class, UnitTest.class.getField("scalarTypesAcceptDefaultField"), + ScalarTypesWithDefault.class); + checkUnequals(scalarTypesAcceptDefaultClass.class, UnitTest.class.getField("scalarTypesOverrideDefaultField"), + ScalarTypesWithDefault.class); + + // MULTIMEMBER ARRAY TYPES + checkUnequals(emptyArrayTypesClass.class, UnitTest.class.getField("singleElementArrayTypesField"), + ArrayTypes.class); + checkUnequals(singleElementArrayTypesClass.class, UnitTest.class.getField("twoElementArrayTypesField"), + ArrayTypes.class); + checkUnequals(twoElementArrayTypesClass.class, UnitTest.class.getField("singleElementArrayTypesField"), + ArrayTypes.class); + checkUnequals(arrayTypesOverrideDefaultClass.class, UnitTest.class.getField("arrayTypesAcceptDefaultField"), + ArrayTypesWithDefault.class); + checkUnequals(arrayTypesAcceptDefaultClass.class, UnitTest.class.getField("arrayTypesOverrideDefaultField"), + ArrayTypesWithDefault.class); + + // SINGLE-MEMBER SCALAR TYPES WITH DEFAULT-OVERRIDE + checkUnequals(SingleMemberByteOvrdDefClass.class, UnitTest.class.getField("SingleMemberByteAcceptDefField"), + SingleMemberByteWithDef.class); + checkUnequals(SingleMemberShortOvrdDefClass.class, UnitTest.class.getField("SingleMemberShortAcceptDefField"), + SingleMemberShortWithDef.class); + checkUnequals(SingleMemberIntOvrdDefClass.class, UnitTest.class.getField("SingleMemberIntAcceptDefField"), + SingleMemberIntWithDef.class); + checkUnequals(SingleMemberLongOvrdDefClass.class, UnitTest.class.getField("SingleMemberLongAcceptDefField"), + SingleMemberLongWithDef.class); + checkUnequals(SingleMemberCharOvrdDefClass.class, UnitTest.class.getField("SingleMemberCharAcceptDefField"), + SingleMemberCharWithDef.class); + checkUnequals(SingleMemberFloatOvrdDefClass.class, UnitTest.class.getField("SingleMemberFloatAcceptDefField"), + SingleMemberFloatWithDef.class); + checkUnequals(SingleMemberDoubleOvrdDefClass.class, UnitTest.class.getField("SingleMemberDoubleAcceptDefField"), + SingleMemberDoubleWithDef.class); + checkUnequals(SingleMemberBooleanOvrdDefClass.class, UnitTest.class.getField("SingleMemberBooleanAcceptDefField"), + SingleMemberBooleanWithDef.class); + checkUnequals(SingleMemberStringOvrdDefClass.class, UnitTest.class.getField("SingleMemberStringAcceptDefField"), + SingleMemberStringWithDef.class); + checkUnequals(SingleMemberClassOvrdDefClass.class, UnitTest.class.getField("SingleMemberClassAcceptDefField"), + SingleMemberClassWithDef.class); + checkUnequals(SingleMemberEnumOvrdDefClass.class, UnitTest.class.getField("SingleMemberEnumAcceptDefField"), + SingleMemberEnumWithDef.class); + + // SINGLE-MEMBER SCALAR TYPES WITH DEFAULT-ACCEPT + checkUnequals(SingleMemberByteAcceptDefClass.class, UnitTest.class.getField("SingleMemberByteOvrdDefField"), + SingleMemberByteWithDef.class); + checkUnequals(SingleMemberShortAcceptDefClass.class, UnitTest.class.getField("SingleMemberShortOvrdDefField"), + SingleMemberShortWithDef.class); + checkUnequals(SingleMemberIntAcceptDefClass.class, UnitTest.class.getField("SingleMemberIntOvrdDefField"), + SingleMemberIntWithDef.class); + checkUnequals(SingleMemberLongAcceptDefClass.class, UnitTest.class.getField("SingleMemberLongOvrdDefField"), + SingleMemberLongWithDef.class); + checkUnequals(SingleMemberCharAcceptDefClass.class, UnitTest.class.getField("SingleMemberCharOvrdDefField"), + SingleMemberCharWithDef.class); + checkUnequals(SingleMemberFloatAcceptDefClass.class, UnitTest.class.getField("SingleMemberFloatOvrdDefField"), + SingleMemberFloatWithDef.class); + checkUnequals(SingleMemberDoubleAcceptDefClass.class, UnitTest.class.getField("SingleMemberDoubleOvrdDefField"), + SingleMemberDoubleWithDef.class); + checkUnequals(SingleMemberBooleanAcceptDefClass.class, UnitTest.class.getField("SingleMemberBooleanOvrdDefField"), + SingleMemberBooleanWithDef.class); + checkUnequals(SingleMemberStringAcceptDefClass.class, UnitTest.class.getField("SingleMemberStringOvrdDefField"), + SingleMemberStringWithDef.class); + checkUnequals(SingleMemberClassAcceptDefClass.class, UnitTest.class.getField("SingleMemberClassOvrdDefField"), + SingleMemberClassWithDef.class); + checkUnequals(SingleMemberEnumAcceptDefClass.class, UnitTest.class.getField("SingleMemberEnumOvrdDefField"), + SingleMemberEnumWithDef.class); + + // SINGLE-MEMBER ARRAY TYPES (EMPTY ARRAY) + checkUnequals(SingleMemberByteArrEmptyClass.class, UnitTest.class.getField("SingleMemberByteArrOneField"), + SingleMemberByteArray.class); + checkUnequals(SingleMemberShortArrEmptyClass.class, UnitTest.class.getField("SingleMemberShortArrOneField"), + SingleMemberShortArray.class); + checkUnequals(SingleMemberIntArrEmptyClass.class, UnitTest.class.getField("SingleMemberIntArrOneField"), + SingleMemberIntArray.class); + checkUnequals(SingleMemberLongArrEmptyClass.class, UnitTest.class.getField("SingleMemberLongArrOneField"), + SingleMemberLongArray.class); + checkUnequals(SingleMemberCharArrEmptyClass.class, UnitTest.class.getField("SingleMemberCharArrOneField"), + SingleMemberCharArray.class); + checkUnequals(SingleMemberFloatArrEmptyClass.class, UnitTest.class.getField("SingleMemberFloatArrOneField"), + SingleMemberFloatArray.class); + checkUnequals(SingleMemberDoubleArrEmptyClass.class, UnitTest.class.getField("SingleMemberDoubleArrOneField"), + SingleMemberDoubleArray.class); + checkUnequals(SingleMemberBooleanArrEmptyClass.class, UnitTest.class.getField("SingleMemberBooleanArrOneField"), + SingleMemberBooleanArray.class); + checkUnequals(SingleMemberStringArrEmptyClass.class, UnitTest.class.getField("SingleMemberStringArrOneField"), + SingleMemberStringArray.class); + checkUnequals(SingleMemberClassArrEmptyClass.class, UnitTest.class.getField("SingleMemberClassArrOneField"), + SingleMemberClassArray.class); + checkUnequals(SingleMemberEnumArrEmptyClass.class, UnitTest.class.getField("SingleMemberEnumArrOneField"), + SingleMemberEnumArray.class); + + // SINGLE-MEMBER ARRAY TYPES (ONE-ELEMENT ARRAY) + checkUnequals(SingleMemberByteArrOneClass.class, UnitTest.class.getField("SingleMemberByteArrTwoField"), + SingleMemberByteArray.class); + checkUnequals(SingleMemberShortArrOneClass.class, UnitTest.class.getField("SingleMemberShortArrTwoField"), + SingleMemberShortArray.class); + checkUnequals(SingleMemberIntArrOneClass.class, UnitTest.class.getField("SingleMemberIntArrTwoField"), + SingleMemberIntArray.class); + checkUnequals(SingleMemberLongArrOneClass.class, UnitTest.class.getField("SingleMemberLongArrTwoField"), + SingleMemberLongArray.class); + checkUnequals(SingleMemberCharArrOneClass.class, UnitTest.class.getField("SingleMemberCharArrTwoField"), + SingleMemberCharArray.class); + checkUnequals(SingleMemberFloatArrOneClass.class, UnitTest.class.getField("SingleMemberFloatArrTwoField"), + SingleMemberFloatArray.class); + checkUnequals(SingleMemberDoubleArrOneClass.class, UnitTest.class.getField("SingleMemberDoubleArrTwoField"), + SingleMemberDoubleArray.class); + checkUnequals(SingleMemberBooleanArrOneClass.class, UnitTest.class.getField("SingleMemberBooleanArrTwoField"), + SingleMemberBooleanArray.class); + checkUnequals(SingleMemberStringArrOneClass.class, UnitTest.class.getField("SingleMemberStringArrTwoField"), + SingleMemberStringArray.class); + checkUnequals(SingleMemberClassArrOneClass.class, UnitTest.class.getField("SingleMemberClassArrTwoField"), + SingleMemberClassArray.class); + checkUnequals(SingleMemberEnumArrOneClass.class, UnitTest.class.getField("SingleMemberEnumArrTwoField"), + SingleMemberEnumArray.class); + + // SINGLE-MEMBER ARRAY TYPES (TWO-ELEMENT ARRAY) + checkUnequals(SingleMemberByteArrTwoClass.class, UnitTest.class.getField("SingleMemberByteArrOneField"), + SingleMemberByteArray.class); + checkUnequals(SingleMemberShortArrTwoClass.class, UnitTest.class.getField("SingleMemberShortArrOneField"), + SingleMemberShortArray.class); + checkUnequals(SingleMemberIntArrTwoClass.class, UnitTest.class.getField("SingleMemberIntArrOneField"), + SingleMemberIntArray.class); + checkUnequals(SingleMemberLongArrTwoClass.class, UnitTest.class.getField("SingleMemberLongArrOneField"), + SingleMemberLongArray.class); + checkUnequals(SingleMemberCharArrTwoClass.class, UnitTest.class.getField("SingleMemberCharArrOneField"), + SingleMemberCharArray.class); + checkUnequals(SingleMemberFloatArrTwoClass.class, UnitTest.class.getField("SingleMemberFloatArrOneField"), + SingleMemberFloatArray.class); + checkUnequals(SingleMemberDoubleArrTwoClass.class, UnitTest.class.getField("SingleMemberDoubleArrOneField"), + SingleMemberDoubleArray.class); + checkUnequals(SingleMemberBooleanArrTwoClass.class, UnitTest.class.getField("SingleMemberBooleanArrOneField"), + SingleMemberBooleanArray.class); + checkUnequals(SingleMemberStringArrTwoClass.class, UnitTest.class.getField("SingleMemberStringArrOneField"), + SingleMemberStringArray.class); + checkUnequals(SingleMemberClassArrTwoClass.class, UnitTest.class.getField("SingleMemberClassArrOneField"), + SingleMemberClassArray.class); + checkUnequals(SingleMemberEnumArrTwoClass.class, UnitTest.class.getField("SingleMemberEnumArrOneField"), + SingleMemberEnumArray.class); + + // SINGLE-MEMBER ARRAY TYPES WITH DEFAULT (OVERRIDE) + checkUnequals(SingleMemberByteArrOvrdDefClass.class, UnitTest.class.getField("SingleMemberByteArrAcceptDefField"), + SingleMemberByteArrayDef.class); + checkUnequals(SingleMemberShortArrOvrdDefClass.class, UnitTest.class.getField("SingleMemberShortArrAcceptDefField"), + SingleMemberShortArrayDef.class); + checkUnequals(SingleMemberIntArrOvrdDefClass.class, UnitTest.class.getField("SingleMemberIntArrAcceptDefField"), + SingleMemberIntArrayDef.class); + checkUnequals(SingleMemberLongArrOvrdDefClass.class, UnitTest.class.getField("SingleMemberLongArrAcceptDefField"), + SingleMemberLongArrayDef.class); + checkUnequals(SingleMemberCharArrOvrdDefClass.class, UnitTest.class.getField("SingleMemberCharArrAcceptDefField"), + SingleMemberCharArrayDef.class); + checkUnequals(SingleMemberFloatArrOvrdDefClass.class, UnitTest.class.getField("SingleMemberFloatArrAcceptDefField"), + SingleMemberFloatArrayDef.class); + checkUnequals(SingleMemberDoubleArrOvrdDefClass.class, UnitTest.class.getField("SingleMemberDoubleArrAcceptDefField"), + SingleMemberDoubleArrayDef.class); + checkUnequals(SingleMemberBooleanArrOvrdDefClass.class, UnitTest.class.getField("SingleMemberBooleanArrAcceptDefField"), + SingleMemberBooleanArrayDef.class); + checkUnequals(SingleMemberStringArrOvrdDefClass.class, UnitTest.class.getField("SingleMemberStringArrAcceptDefField"), + SingleMemberStringArrayDef.class); + checkUnequals(SingleMemberClassArrOvrdDefClass.class, UnitTest.class.getField("SingleMemberClassArrAcceptDefField"), + SingleMemberClassArrayDef.class); + checkUnequals(SingleMemberEnumArrOvrdDefClass.class, UnitTest.class.getField("SingleMemberEnumArrAcceptDefField"), + SingleMemberEnumArrayDef.class); + + // SINGLE-MEMBER ARRAY TYPES WITH DEFAULT (ACCEPT) + checkUnequals(SingleMemberByteArrAcceptDefClass.class, UnitTest.class.getField("SingleMemberByteArrOvrdDefField"), + SingleMemberByteArrayDef.class); + checkUnequals(SingleMemberShortArrAcceptDefClass.class, UnitTest.class.getField("SingleMemberShortArrOvrdDefField"), + SingleMemberShortArrayDef.class); + checkUnequals(SingleMemberIntArrAcceptDefClass.class, UnitTest.class.getField("SingleMemberIntArrOvrdDefField"), + SingleMemberIntArrayDef.class); + checkUnequals(SingleMemberLongArrAcceptDefClass.class, UnitTest.class.getField("SingleMemberLongArrOvrdDefField"), + SingleMemberLongArrayDef.class); + checkUnequals(SingleMemberCharArrAcceptDefClass.class, UnitTest.class.getField("SingleMemberCharArrOvrdDefField"), + SingleMemberCharArrayDef.class); + checkUnequals(SingleMemberFloatArrAcceptDefClass.class, UnitTest.class.getField("SingleMemberFloatArrOvrdDefField"), + SingleMemberFloatArrayDef.class); + checkUnequals(SingleMemberDoubleArrAcceptDefClass.class, UnitTest.class.getField("SingleMemberDoubleArrOvrdDefField"), + SingleMemberDoubleArrayDef.class); + checkUnequals(SingleMemberBooleanArrAcceptDefClass.class, UnitTest.class.getField("SingleMemberBooleanArrOvrdDefField"), + SingleMemberBooleanArrayDef.class); + checkUnequals(SingleMemberStringArrAcceptDefClass.class, UnitTest.class.getField("SingleMemberStringArrOvrdDefField"), + SingleMemberStringArrayDef.class); + checkUnequals(SingleMemberClassArrAcceptDefClass.class, UnitTest.class.getField("SingleMemberClassArrOvrdDefField"), + SingleMemberClassArrayDef.class); + checkUnequals(SingleMemberEnumArrAcceptDefClass.class, UnitTest.class.getField("SingleMemberEnumArrOvrdDefField"), + SingleMemberEnumArrayDef.class); + + // *** TESTS FOR SERIALIZATION AND DESERIALIZATION + + // MULTIMEMBER SCALAR TYPES + checkSerialization(scalarTypesClass.class, ScalarTypes.class); + checkSerialization(scalarTypesOverrideDefaultClass.class, ScalarTypesWithDefault.class); + checkSerialization(scalarTypesAcceptDefaultClass.class, ScalarTypesWithDefault.class); + + // MULTIMEMBER ARRAY TYPES + checkSerialization(emptyArrayTypesClass.class, ArrayTypes.class); + checkSerialization(singleElementArrayTypesClass.class, ArrayTypes.class); + checkSerialization(twoElementArrayTypesClass.class, ArrayTypes.class); + checkSerialization(arrayTypesOverrideDefaultClass.class, ArrayTypesWithDefault.class); + checkSerialization(arrayTypesAcceptDefaultClass.class, ArrayTypesWithDefault.class); + + // MARKER TYPE + checkSerialization(markerClass.class, Marker.class); + + // SINGLE-MEMBER SCALAR TYPES + checkSerialization(SingleMemberByteClass.class, SingleMemberByte.class); + checkSerialization(SingleMemberShortClass.class, SingleMemberShort.class); + checkSerialization(SingleMemberIntClass.class, SingleMemberInt.class); + checkSerialization(SingleMemberLongClass.class, SingleMemberLong.class); + checkSerialization(SingleMemberCharClass.class, SingleMemberChar.class); + checkSerialization(SingleMemberFloatClass.class, SingleMemberFloat.class); + checkSerialization(SingleMemberDoubleClass.class, SingleMemberDouble.class); + checkSerialization(SingleMemberBooleanClass.class, SingleMemberBoolean.class); + checkSerialization(SingleMemberStringClass.class, SingleMemberString.class); + checkSerialization(SingleMemberClassClass.class, SingleMemberClass.class); + checkSerialization(SingleMemberEnumClass.class, SingleMemberEnum.class); + + // SINGLE-MEMBER SCALAR TYPES WITH DEFAULT-OVERRIDE + checkSerialization(SingleMemberByteOvrdDefClass.class, SingleMemberByteWithDef.class); + checkSerialization(SingleMemberShortOvrdDefClass.class, SingleMemberShortWithDef.class); + checkSerialization(SingleMemberIntOvrdDefClass.class, SingleMemberIntWithDef.class); + checkSerialization(SingleMemberLongOvrdDefClass.class, SingleMemberLongWithDef.class); + checkSerialization(SingleMemberCharOvrdDefClass.class, SingleMemberCharWithDef.class); + checkSerialization(SingleMemberFloatOvrdDefClass.class, SingleMemberFloatWithDef.class); + checkSerialization(SingleMemberDoubleOvrdDefClass.class, SingleMemberDoubleWithDef.class); + checkSerialization(SingleMemberBooleanOvrdDefClass.class, SingleMemberBooleanWithDef.class); + checkSerialization(SingleMemberStringOvrdDefClass.class, SingleMemberStringWithDef.class); + checkSerialization(SingleMemberClassOvrdDefClass.class, SingleMemberClassWithDef.class); + checkSerialization(SingleMemberEnumOvrdDefClass.class, SingleMemberEnumWithDef.class); + + // SINGLE-MEMBER SCALAR TYPES WITH DEFAULT-ACCEPT + checkSerialization(SingleMemberByteAcceptDefClass.class, SingleMemberByteWithDef.class); + checkSerialization(SingleMemberShortAcceptDefClass.class, SingleMemberShortWithDef.class); + checkSerialization(SingleMemberIntAcceptDefClass.class, SingleMemberIntWithDef.class); + checkSerialization(SingleMemberLongAcceptDefClass.class, SingleMemberLongWithDef.class); + checkSerialization(SingleMemberCharAcceptDefClass.class, SingleMemberCharWithDef.class); + checkSerialization(SingleMemberFloatAcceptDefClass.class, SingleMemberFloatWithDef.class); + checkSerialization(SingleMemberDoubleAcceptDefClass.class, SingleMemberDoubleWithDef.class); + checkSerialization(SingleMemberBooleanAcceptDefClass.class, SingleMemberBooleanWithDef.class); + checkSerialization(SingleMemberStringAcceptDefClass.class, SingleMemberStringWithDef.class); + checkSerialization(SingleMemberClassAcceptDefClass.class, SingleMemberClassWithDef.class); + checkSerialization(SingleMemberEnumAcceptDefClass.class, SingleMemberEnumWithDef.class); + + // SINGLE-MEMBER ARRAY TYPES (EMPTY ARRAY) + checkSerialization(SingleMemberByteArrEmptyClass.class, SingleMemberByteArray.class); + checkSerialization(SingleMemberShortArrEmptyClass.class, SingleMemberShortArray.class); + checkSerialization(SingleMemberIntArrEmptyClass.class, SingleMemberIntArray.class); + checkSerialization(SingleMemberLongArrEmptyClass.class, SingleMemberLongArray.class); + checkSerialization(SingleMemberCharArrEmptyClass.class, SingleMemberCharArray.class); + checkSerialization(SingleMemberFloatArrEmptyClass.class, SingleMemberFloatArray.class); + checkSerialization(SingleMemberDoubleArrEmptyClass.class, SingleMemberDoubleArray.class); + checkSerialization(SingleMemberBooleanArrEmptyClass.class, SingleMemberBooleanArray.class); + checkSerialization(SingleMemberStringArrEmptyClass.class, SingleMemberStringArray.class); + checkSerialization(SingleMemberClassArrEmptyClass.class, SingleMemberClassArray.class); + checkSerialization(SingleMemberEnumArrEmptyClass.class, SingleMemberEnumArray.class); + + // SINGLE-MEMBER ARRAY TYPES (ONE-ELEMENT ARRAY) + checkSerialization(SingleMemberByteArrOneClass.class, SingleMemberByteArray.class); + checkSerialization(SingleMemberShortArrOneClass.class, SingleMemberShortArray.class); + checkSerialization(SingleMemberIntArrOneClass.class, SingleMemberIntArray.class); + checkSerialization(SingleMemberLongArrOneClass.class, SingleMemberLongArray.class); + checkSerialization(SingleMemberCharArrOneClass.class, SingleMemberCharArray.class); + checkSerialization(SingleMemberFloatArrOneClass.class, SingleMemberFloatArray.class); + checkSerialization(SingleMemberDoubleArrOneClass.class, SingleMemberDoubleArray.class); + checkSerialization(SingleMemberBooleanArrOneClass.class, SingleMemberBooleanArray.class); + checkSerialization(SingleMemberStringArrOneClass.class, SingleMemberStringArray.class); + checkSerialization(SingleMemberClassArrOneClass.class, SingleMemberClassArray.class); + checkSerialization(SingleMemberEnumArrOneClass.class, SingleMemberEnumArray.class); + + // SINGLE-MEMBER ARRAY TYPES (TWO-ELEMENT ARRAY) + checkSerialization(SingleMemberByteArrTwoClass.class, SingleMemberByteArray.class); + checkSerialization(SingleMemberShortArrTwoClass.class, SingleMemberShortArray.class); + checkSerialization(SingleMemberIntArrTwoClass.class, SingleMemberIntArray.class); + checkSerialization(SingleMemberLongArrTwoClass.class, SingleMemberLongArray.class); + checkSerialization(SingleMemberCharArrTwoClass.class, SingleMemberCharArray.class); + checkSerialization(SingleMemberFloatArrTwoClass.class, SingleMemberFloatArray.class); + checkSerialization(SingleMemberDoubleArrTwoClass.class, SingleMemberDoubleArray.class); + checkSerialization(SingleMemberBooleanArrTwoClass.class, SingleMemberBooleanArray.class); + checkSerialization(SingleMemberStringArrTwoClass.class, SingleMemberStringArray.class); + checkSerialization(SingleMemberClassArrTwoClass.class, SingleMemberClassArray.class); + checkSerialization(SingleMemberEnumArrTwoClass.class, SingleMemberEnumArray.class); + + // SINGLE-MEMBER ARRAY TYPES WITH DEFAULT (OVERRIDE) + checkSerialization(SingleMemberByteArrOvrdDefClass.class, SingleMemberByteArrayDef.class); + checkSerialization(SingleMemberShortArrOvrdDefClass.class, SingleMemberShortArrayDef.class); + checkSerialization(SingleMemberIntArrOvrdDefClass.class, SingleMemberIntArrayDef.class); + checkSerialization(SingleMemberLongArrOvrdDefClass.class, SingleMemberLongArrayDef.class); + checkSerialization(SingleMemberCharArrOvrdDefClass.class, SingleMemberCharArrayDef.class); + checkSerialization(SingleMemberFloatArrOvrdDefClass.class, SingleMemberFloatArrayDef.class); + checkSerialization(SingleMemberDoubleArrOvrdDefClass.class, SingleMemberDoubleArrayDef.class); + checkSerialization(SingleMemberBooleanArrOvrdDefClass.class, SingleMemberBooleanArrayDef.class); + checkSerialization(SingleMemberStringArrOvrdDefClass.class, SingleMemberStringArrayDef.class); + checkSerialization(SingleMemberClassArrOvrdDefClass.class, SingleMemberClassArrayDef.class); + checkSerialization(SingleMemberEnumArrOvrdDefClass.class, SingleMemberEnumArrayDef.class); + + // SINGLE-MEMBER ARRAY TYPES WITH DEFAULT (ACCEPT) + checkSerialization(SingleMemberByteArrAcceptDefClass.class, SingleMemberByteArrayDef.class); + checkSerialization(SingleMemberShortArrAcceptDefClass.class, SingleMemberShortArrayDef.class); + checkSerialization(SingleMemberIntArrAcceptDefClass.class, SingleMemberIntArrayDef.class); + checkSerialization(SingleMemberLongArrAcceptDefClass.class, SingleMemberLongArrayDef.class); + checkSerialization(SingleMemberCharArrAcceptDefClass.class, SingleMemberCharArrayDef.class); + checkSerialization(SingleMemberFloatArrAcceptDefClass.class, SingleMemberFloatArrayDef.class); + checkSerialization(SingleMemberDoubleArrAcceptDefClass.class, SingleMemberDoubleArrayDef.class); + checkSerialization(SingleMemberBooleanArrAcceptDefClass.class, SingleMemberBooleanArrayDef.class); + checkSerialization(SingleMemberStringArrAcceptDefClass.class, SingleMemberStringArrayDef.class); + checkSerialization(SingleMemberClassArrAcceptDefClass.class, SingleMemberClassArrayDef.class); + checkSerialization(SingleMemberEnumArrAcceptDefClass.class, SingleMemberEnumArrayDef.class); + + // *** TESTS FOR ANNOTATION INHERITANCE AND ENUMERATING DECLARED ANNOTATIONS + + // Inheritance tests + checkInheritence(Grandpa.class, true, true); + checkInheritence(Dad.class, true, false); + checkInheritence(Son.class, true, true); + + // Declared annotations tests + checkDeclaredAnnotations(Grandpa.class, true, true); + checkDeclaredAnnotations(Dad.class, false, false); + checkDeclaredAnnotations(Son.class, false, true); + + // Generate summary + System.out.println("\n" + numTests + " tests completed"); + if (failCount != 0) + throw new Exception("Failure count: " + failCount); + else + System.out.println("Success."); + } + + static int failCount = 0; + + private static void fail(String test) { + System.out.println("Failure: " + test); + failCount++; + } + + // ANNOTATION-VERIFICATION METHODS + + // Scalar multi-member + + static void checkScalarTypes(AnnotatedElement e) { + try { + checkScalarTypes(e.getAnnotation(ScalarTypes.class), e); + } catch(Throwable t) { + fail("ScalarTypes " + e + ": " + t); + t.printStackTrace(); + } + } + + static void checkScalarTypes(ScalarTypes st, AnnotatedElement e) throws Exception { + numTests++; + if (!(st.b() == 1 && + st.s() == 2 && + st.i() == 3 && + st.l() == 4L && + st.c() == '5' && + st.f() == 6.0f && + st.d() == 7.0 && + st.bool() == true && + st.str().equals("custom") && + st.cls() == Map.class && + st.e() == Stooge.MOE && + st.a().x() == 1 && st.a().y() == 2)) + fail("ScalarTypes" + e); + } + + static void checkScalarTypesOverrideDefault(AnnotatedElement e) { + try { + checkScalarTypesOverrideDefault(e.getAnnotation(ScalarTypesWithDefault.class), e); + } catch(Throwable t) { + fail("ScalarTypesOverrideDefaults" + e + ": " + t); + } + } + + static void checkScalarTypesOverrideDefault(ScalarTypesWithDefault st, AnnotatedElement e) { + numTests++; + if (!(st.b() == 1 && + st.s() == 2 && + st.i() == 3 && + st.l() == 4L && + st.c() == '5' && + st.f() == 6.0f && + st.d() == 7.0 && + st.bool() == true && + st.str().equals("custom") && + st.cls() == Map.class && + st.e() == Stooge.MOE)) + fail("ScalarTypesOverrideDefaults" + e); + } + + static void checkScalarTypesAcceptDefault(AnnotatedElement e) { + try { + checkScalarTypesAcceptDefault(e.getAnnotation(ScalarTypesWithDefault.class), e); + } catch(Throwable t) { + fail("ScalarTypesAcceptDefaults" + e + ": " + t); + } + } + + static void checkScalarTypesAcceptDefault(ScalarTypesWithDefault st, AnnotatedElement e) { + numTests++; + if (!(st.b() == 11 && + st.s() == 12 && + st.i() == 13 && + st.l() == 14L && + st.c() == 'V' && + st.f() == 16.0f && + st.d() == 17.0 && + st.bool() == false && + st.str().equals("default") && + st.cls() == Class.class && + st.e() == Stooge.LARRY && + st.a().x() == 11 && st.a().y() == 12)) + fail("ScalarTypesAcceptDefaults" + e); + } + + // Array multi-member + + static void checkArrayTypes0(AnnotatedElement e) { + try { + checkArrayTypes0(e.getAnnotation(ArrayTypes.class), e); + } catch(Throwable t) { + fail("ArrayTypes(Empty)" + e + ": " + t); + } + } + + static void checkArrayTypes0(ArrayTypes at, AnnotatedElement e) { + numTests++; + if (!(at.b().length == 0 && + at.s().length == 0 && + at.i().length == 0 && + at.l().length == 0 && + at.c().length == 0 && + at.f().length == 0 && + at.d().length == 0 && + at.bool().length == 0 && + at.str().length == 0 && + at.cls().length == 0 && + at.e().length == 0 && + at.a().length == 0)) { + fail("ArrayTypes(Empty)" + e); + } + } + + static void checkArrayTypes1(AnnotatedElement e) { + try { + checkArrayTypes1(e.getAnnotation(ArrayTypes.class), e); + } catch(Throwable t) { + fail("ArrayTypes(One element)" + e + ": " + t); + } + } + + static void checkArrayTypes1(ArrayTypes at, AnnotatedElement e) { + numTests++; + if (!(at.b()[0] == 1 && + at.s()[0] == 2 && + at.i()[0] == 3 && + at.l()[0] == 4L && + at.c()[0] == '5' && + at.f()[0] == 6.0f && + at.d()[0] == 7.0 && + at.bool()[0] == true && + at.str()[0].equals("custom") && + at.cls()[0] == Map.class && + at.e()[0] == Stooge.MOE && + at.a()[0].x() == 1 && at.a()[0].y() == 2 && + + at.b().length==1 && at.s().length==1 && at.i().length==1 && + at.l().length==1 && at.c().length==1 && at.d().length==1 && + at.bool().length==1 && at.str().length==1 && + at.cls().length==1 && at.cls().length==1 && at.a().length==1)) + fail("ArrayTypes(One element)" + e); + } + + static void checkArrayTypes2(AnnotatedElement e) { + try { + checkArrayTypes2(e.getAnnotation(ArrayTypes.class), e); + } catch(Throwable t) { + fail("ArrayTypes(Two element)" + e + ": " + t); + } + } + + static void checkArrayTypes2(ArrayTypes at, AnnotatedElement e) { + numTests++; + if (!(at.b()[0] == 1 && at.b()[1] == 2 && + at.s()[0] == 2 && at.s()[1] == 3 && + at.i()[0] == 3 && at.i()[1] == 4 && + at.l()[0] == 4L && at.l()[1] == 5L && + at.c()[0] == '5' && at.c()[1] == '6' && + at.f()[0] == 6.0f && at.f()[1] == 7.0f && + at.d()[0] == 7.0 && at.d()[1] == 8.0 && + at.bool()[0] == true && at.bool()[1] == false && + at.str()[0].equals("custom") && at.str()[1].equals("paint") && + at.cls()[0] == Map.class && at.cls()[1] == Set.class && + at.e()[0] == Stooge.MOE && at.e()[1] == Stooge.CURLY && + at.a()[0].x() == 1 && at.a()[0].y() == 2 && at.a()[1].x() == 3 && at.a()[1].y() == 4 && + + at.b().length==2 && at.s().length==2 && at.i().length==2 && + at.l().length==2 && at.c().length==2 && at.d().length==2 && + at.bool().length==2 && at.str().length==2 && + at.cls().length==2 && at.cls().length==2 && at.a().length==2)) + fail("ArrayTypes(Two element)" + e); + } + + static void checkArrayTypesOverrideDefault(AnnotatedElement e) { + try { + checkArrayTypesOverrideDefault(e.getAnnotation(ArrayTypesWithDefault.class), e); + } catch(Throwable t) { + fail("ArrayTypesOverrideDefault" + e + ": " + t); + } + } + + static void checkArrayTypesOverrideDefault(ArrayTypesWithDefault at, AnnotatedElement e) { + numTests++; + if (!(at.b()[0] == 1 && + at.s()[0] == 2 && + at.i()[0] == 3 && + at.l()[0] == 4L && + at.c()[0] == '5' && + at.f()[0] == 6.0f && + at.d()[0] == 7.0 && + at.bool()[0] == true && + at.str()[0].equals("custom") && + at.cls()[0] == Map.class && + at.e()[0] == Stooge.MOE && + at.a()[0].x() == 1 && at.a()[0].y() == 2 && + + at.b().length==1 && at.s().length==1 && at.i().length==1 && + at.l().length==1 && at.c().length==1 && at.d().length==1 && + at.bool().length==1 && at.str().length==1 && + at.cls().length==1 && at.cls().length==1)) + fail("ArrayTypesOverrideDefault" + e); + } + + static void checkArrayTypesAcceptDefault(AnnotatedElement e) { + try { + checkArrayTypesAcceptDefault(e.getAnnotation(ArrayTypesWithDefault.class), e); + } catch(Throwable t) { + fail("ArrayTypesAcceptDefault" + e + ": " + t); + } + } + + static void checkArrayTypesAcceptDefault(ArrayTypesWithDefault at, AnnotatedElement e) { + numTests++; + if (!(at.b()[0] == 11 && + at.s()[0] == 12 && + at.i()[0] == 13 && + at.l()[0] == 14L && + at.c()[0] == 'V' && + at.f()[0] == 16.0f && + at.d()[0] == 17.0 && + at.bool()[0] == false && + at.str()[0].equals("default") && + at.cls()[0] == Class.class && + at.e()[0] == Stooge.LARRY && + at.a()[0].x() == 11 && at.a()[0].y() == 12 && + + at.b().length==1 && at.s().length==1 && at.i().length==1 && + at.l().length==1 && at.c().length==1 && at.d().length==1 && + at.bool().length==1 && at.str().length==1 && + at.cls().length==1 && at.cls().length==1)) + fail("ArrayTypesAcceptDefault" + e); + } + + // Scalar multi-member for parameters + + static void checkScalarTypesParam(Method m) { + try { + checkScalarTypes((ScalarTypes) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("ScalarTypes" + m + ": " + t); + } + } + + static void checkScalarTypesOverrideDefaultParam(Method m) { + try { + checkScalarTypesOverrideDefault((ScalarTypesWithDefault) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("ScalarTypesOverrideDefaults" + m + ": " + t); + } + } + + static void checkScalarTypesAcceptDefaultParam(Method m) { + try { + checkScalarTypesAcceptDefault((ScalarTypesWithDefault) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("ScalarTypesAcceptDefaults" + m + ": " + t); + } + } + + // Array multi-member for parameters + + static void checkArrayTypes0Param(Method m) { + try { + checkArrayTypes0((ArrayTypes) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("ArrayTypes(Empty)" + m + ": " + t); + } + } + + static void checkArrayTypes1Param(Method m) { + try { + checkArrayTypes1((ArrayTypes) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("ArrayTypes(One Element)" + m + ": " + t); + } + } + + static void checkArrayTypes2Param(Method m) { + try { + checkArrayTypes2((ArrayTypes) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("ArrayTypes(Two Elements)" + m + ": " + t); + } + } + + static void checkArrayTypesOverrideDefaultParam(Method m) { + try { + checkArrayTypesOverrideDefault((ArrayTypesWithDefault) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("ArrayTypesOverrideDefault" + m + ": " + t); + } + } + + static void checkArrayTypesAcceptDefaultParam(Method m) { + try { + checkArrayTypesAcceptDefault((ArrayTypesWithDefault) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("ArrayTypesAcceptDefault" + m + ": " + t); + } + } + + // marker type on parameter + static void checkMarkerParam(Method m) { + try { + checkMarker((Marker) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("Marker" + m + ": " + t); + } + } + + // single-member scalar types on parameter + static void checkSingleMemberByteParam(Method m) { + try { + checkSingleMemberByte((SingleMemberByte) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberByte" + m + ": " + t); + } + } + + static void checkSingleMemberShortParam(Method m) { + try { + checkSingleMemberShort((SingleMemberShort) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberShort" + m + ": " + t); + } + } + + static void checkSingleMemberIntParam(Method m) { + try { + checkSingleMemberInt((SingleMemberInt) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberInt" + m + ": " + t); + } + } + + static void checkSingleMemberLongParam(Method m) { + try { + checkSingleMemberLong((SingleMemberLong) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberLong" + m + ": " + t); + } + } + + static void checkSingleMemberCharParam(Method m) { + try { + checkSingleMemberChar((SingleMemberChar) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberChar" + m + ": " + t); + } + } + + static void checkSingleMemberFloatParam(Method m) { + try { + checkSingleMemberFloat((SingleMemberFloat) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberFloat" + m + ": " + t); + } + } + + static void checkSingleMemberDoubleParam(Method m) { + try { + checkSingleMemberDouble((SingleMemberDouble) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberDouble" + m + ": " + t); + } + } + + static void checkSingleMemberBooleanParam(Method m) { + try { + checkSingleMemberBoolean((SingleMemberBoolean) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberBoolean" + m + ": " + t); + } + } + + static void checkSingleMemberStringParam(Method m) { + try { + checkSingleMemberString((SingleMemberString) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberString" + m + ": " + t); + } + } + + static void checkSingleMemberClassParam(Method m) { + try { + checkSingleMemberClass((SingleMemberClass) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberClass" + m + ": " + t); + } + } + + static void checkSingleMemberEnumParam(Method m) { + try { + checkSingleMemberEnum((SingleMemberEnum) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberEnum" + m + ": " + t); + } + } + + // single-member scalar types with default-override on parameter + static void checkSingleMemberByteOvrdDefParam(Method m) { + try { + checkSingleMemberByteOvrdDef((SingleMemberByteWithDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberByteOvrdDef" + m + ": " + t); + } + } + + static void checkSingleMemberShortOvrdDefParam(Method m) { + try { + checkSingleMemberShortOvrdDef((SingleMemberShortWithDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberShortOvrdDef" + m + ": " + t); + } + } + + static void checkSingleMemberIntOvrdDefParam(Method m) { + try { + checkSingleMemberIntOvrdDef((SingleMemberIntWithDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberIntOvrdDef" + m + ": " + t); + } + } + + static void checkSingleMemberLongOvrdDefParam(Method m) { + try { + checkSingleMemberLongOvrdDef((SingleMemberLongWithDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberLongOvrdDef" + m + ": " + t); + } + } + + static void checkSingleMemberCharOvrdDefParam(Method m) { + try { + checkSingleMemberCharOvrdDef((SingleMemberCharWithDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberCharOvrdDef" + m + ": " + t); + } + } + + static void checkSingleMemberFloatOvrdDefParam(Method m) { + try { + checkSingleMemberFloatOvrdDef((SingleMemberFloatWithDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberFloatOvrdDef" + m + ": " + t); + } + } + + static void checkSingleMemberDoubleOvrdDefParam(Method m) { + try { + checkSingleMemberDoubleOvrdDef((SingleMemberDoubleWithDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberDoubleOvrdDef" + m + ": " + t); + } + } + + static void checkSingleMemberBooleanOvrdDefParam(Method m) { + try { + checkSingleMemberBooleanOvrdDef((SingleMemberBooleanWithDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberBooleanOvrdDef" + m + ": " + t); + } + } + + static void checkSingleMemberStringOvrdDefParam(Method m) { + try { + checkSingleMemberStringOvrdDef((SingleMemberStringWithDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberStringOvrdDef" + m + ": " + t); + } + } + + static void checkSingleMemberClassOvrdDefParam(Method m) { + try { + checkSingleMemberClassOvrdDef((SingleMemberClassWithDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberClassOvrdDef" + m + ": " + t); + } + } + + static void checkSingleMemberEnumOvrdDefParam(Method m) { + try { + checkSingleMemberEnumOvrdDef((SingleMemberEnumWithDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberEnumOvrdDef" + m + ": " + t); + } + } + + // single-member scalar types with default-accept on PARAMETER + static void checkSingleMemberByteAcceptDefParam(Method m) { + try { + checkSingleMemberByteAcceptDef((SingleMemberByteWithDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberByteAcceptDef" + m + ": " + t); + } + } + + static void checkSingleMemberShortAcceptDefParam(Method m) { + try { + checkSingleMemberShortAcceptDef((SingleMemberShortWithDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberShortAcceptDef" + m + ": " + t); + } + } + + static void checkSingleMemberIntAcceptDefParam(Method m) { + try { + checkSingleMemberIntAcceptDef((SingleMemberIntWithDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberIntAcceptDef" + m + ": " + t); + } + } + + static void checkSingleMemberLongAcceptDefParam(Method m) { + try { + checkSingleMemberLongAcceptDef((SingleMemberLongWithDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberLongAcceptDef" + m + ": " + t); + } + } + + static void checkSingleMemberCharAcceptDefParam(Method m) { + try { + checkSingleMemberCharAcceptDef((SingleMemberCharWithDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberCharAcceptDef" + m + ": " + t); + } + } + + static void checkSingleMemberFloatAcceptDefParam(Method m) { + try { + checkSingleMemberFloatAcceptDef((SingleMemberFloatWithDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberFloatAcceptDef" + m + ": " + t); + } + } + + static void checkSingleMemberDoubleAcceptDefParam(Method m) { + try { + checkSingleMemberDoubleAcceptDef((SingleMemberDoubleWithDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberDoubleAcceptDef" + m + ": " + t); + } + } + + static void checkSingleMemberBooleanAcceptDefParam(Method m) { + try { + checkSingleMemberBooleanAcceptDef((SingleMemberBooleanWithDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberBooleanAcceptDef" + m + ": " + t); + } + } + + static void checkSingleMemberStringAcceptDefParam(Method m) { + try { + checkSingleMemberStringAcceptDef((SingleMemberStringWithDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberStringAcceptDef" + m + ": " + t); + } + } + + static void checkSingleMemberClassAcceptDefParam(Method m) { + try { + checkSingleMemberClassAcceptDef((SingleMemberClassWithDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberClassAcceptDef" + m + ": " + t); + } + } + + static void checkSingleMemberEnumAcceptDefParam(Method m) { + try { + checkSingleMemberEnumAcceptDef((SingleMemberEnumWithDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberEnumAcceptDef" + m + ": " + t); + } + } + + // single-member array types (empty array) parameter + static void checkSingleMemberByteArrEmptyParam(Method m) { + try { + checkSingleMemberByteArrEmpty((SingleMemberByteArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberByteArrEmpty" + m + ": " + t); + } + } + + static void checkSingleMemberShortArrEmptyParam(Method m) { + try { + checkSingleMemberShortArrEmpty((SingleMemberShortArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberShortArrEmpty" + m + ": " + t); + } + } + + static void checkSingleMemberIntArrEmptyParam(Method m) { + try { + checkSingleMemberIntArrEmpty((SingleMemberIntArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberIntArrEmpty" + m + ": " + t); + } + } + + static void checkSingleMemberLongArrEmptyParam(Method m) { + try { + checkSingleMemberLongArrEmpty((SingleMemberLongArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberLongArrEmpty" + m + ": " + t); + } + } + + static void checkSingleMemberCharArrEmptyParam(Method m) { + try { + checkSingleMemberCharArrEmpty((SingleMemberCharArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberCharArrEmpty" + m + ": " + t); + } + } + + static void checkSingleMemberFloatArrEmptyParam(Method m) { + try { + checkSingleMemberFloatArrEmpty((SingleMemberFloatArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberFloatArrEmpty" + m + ": " + t); + } + } + + static void checkSingleMemberDoubleArrEmptyParam(Method m) { + try { + checkSingleMemberDoubleArrEmpty((SingleMemberDoubleArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberDoubleArrEmpty" + m + ": " + t); + } + } + + static void checkSingleMemberBooleanArrEmptyParam(Method m) { + try { + checkSingleMemberBooleanArrEmpty((SingleMemberBooleanArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberBooleanArrEmpty" + m + ": " + t); + } + } + + static void checkSingleMemberStringArrEmptyParam(Method m) { + try { + checkSingleMemberStringArrEmpty((SingleMemberStringArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberStringArrEmpty" + m + ": " + t); + } + } + + static void checkSingleMemberClassArrEmptyParam(Method m) { + try { + checkSingleMemberClassArrEmpty((SingleMemberClassArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberClassArrEmpty" + m + ": " + t); + } + } + + static void checkSingleMemberEnumArrEmptyParam(Method m) { + try { + checkSingleMemberEnumArrEmpty((SingleMemberEnumArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberEnumArrEmpty" + m + ": " + t); + } + } + + // single-member array types (one-element array) on parameter + static void checkSingleMemberByteArrOneParam(Method m) { + try { + checkSingleMemberByteArrOne((SingleMemberByteArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberByteArrOne" + m + ": " + t); + } + } + + static void checkSingleMemberShortArrOneParam(Method m) { + try { + checkSingleMemberShortArrOne((SingleMemberShortArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberShortArrOne" + m + ": " + t); + } + } + + static void checkSingleMemberIntArrOneParam(Method m) { + try { + checkSingleMemberIntArrOne((SingleMemberIntArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberIntArrOne" + m + ": " + t); + } + } + + static void checkSingleMemberLongArrOneParam(Method m) { + try { + checkSingleMemberLongArrOne((SingleMemberLongArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberLongArrOne" + m + ": " + t); + } + } + + static void checkSingleMemberCharArrOneParam(Method m) { + try { + checkSingleMemberCharArrOne((SingleMemberCharArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberCharArrOne" + m + ": " + t); + } + } + + static void checkSingleMemberFloatArrOneParam(Method m) { + try { + checkSingleMemberFloatArrOne((SingleMemberFloatArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberFloatArrOne" + m + ": " + t); + } + } + + static void checkSingleMemberDoubleArrOneParam(Method m) { + try { + checkSingleMemberDoubleArrOne((SingleMemberDoubleArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberDoubleArrOne" + m + ": " + t); + } + } + + static void checkSingleMemberBooleanArrOneParam(Method m) { + try { + checkSingleMemberBooleanArrOne((SingleMemberBooleanArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberBooleanArrOne" + m + ": " + t); + } + } + + static void checkSingleMemberStringArrOneParam(Method m) { + try { + checkSingleMemberStringArrOne((SingleMemberStringArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberStringArrOne" + m + ": " + t); + } + } + + static void checkSingleMemberClassArrOneParam(Method m) { + try { + checkSingleMemberClassArrOne((SingleMemberClassArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberClassArrOne" + m + ": " + t); + } + } + + static void checkSingleMemberEnumArrOneParam(Method m) { + try { + checkSingleMemberEnumArrOne((SingleMemberEnumArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberEnumArrOne" + m + ": " + t); + } + } + + // single-member array types (two-element array) on parameter + static void checkSingleMemberByteArrTwoParam(Method m) { + try { + checkSingleMemberByteArrTwo((SingleMemberByteArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberByteArrTwo" + m + ": " + t); + } + } + + static void checkSingleMemberShortArrTwoParam(Method m) { + try { + checkSingleMemberShortArrTwo((SingleMemberShortArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberShortArrTwo" + m + ": " + t); + } + } + + static void checkSingleMemberIntArrTwoParam(Method m) { + try { + checkSingleMemberIntArrTwo((SingleMemberIntArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberIntArrTwo" + m + ": " + t); + } + } + + static void checkSingleMemberLongArrTwoParam(Method m) { + try { + checkSingleMemberLongArrTwo((SingleMemberLongArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberLongArrTwo" + m + ": " + t); + } + } + + static void checkSingleMemberCharArrTwoParam(Method m) { + try { + checkSingleMemberCharArrTwo((SingleMemberCharArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberCharArrTwo" + m + ": " + t); + } + } + + static void checkSingleMemberFloatArrTwoParam(Method m) { + try { + checkSingleMemberFloatArrTwo((SingleMemberFloatArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberFloatArrTwo" + m + ": " + t); + } + } + + static void checkSingleMemberDoubleArrTwoParam(Method m) { + try { + checkSingleMemberDoubleArrTwo((SingleMemberDoubleArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberDoubleArrTwo" + m + ": " + t); + } + } + + static void checkSingleMemberBooleanArrTwoParam(Method m) { + try { + checkSingleMemberBooleanArrTwo((SingleMemberBooleanArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberBooleanArrTwo" + m + ": " + t); + } + } + + static void checkSingleMemberStringArrTwoParam(Method m) { + try { + checkSingleMemberStringArrTwo((SingleMemberStringArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberStringArrTwo" + m + ": " + t); + } + } + + static void checkSingleMemberClassArrTwoParam(Method m) { + try { + checkSingleMemberClassArrTwo((SingleMemberClassArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberClassArrTwo" + m + ": " + t); + } + } + + static void checkSingleMemberEnumArrTwoParam(Method m) { + try { + checkSingleMemberEnumArrTwo((SingleMemberEnumArray) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberEnumArrTwo" + m + ": " + t); + } + } + + // single-member array types with default (override)on parameter + static void checkSingleMemberByteArrOvrdDefParam(Method m) { + try { + checkSingleMemberByteArrOvrdDef((SingleMemberByteArrayDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberByteArrOvrdDef" + m + ": " + t); + } + } + + static void checkSingleMemberShortArrOvrdDefParam(Method m) { + try { + checkSingleMemberShortArrOvrdDef((SingleMemberShortArrayDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberShortArrOvrdDef" + m + ": " + t); + } + } + + static void checkSingleMemberIntArrOvrdDefParam(Method m) { + try { + checkSingleMemberIntArrOvrdDef((SingleMemberIntArrayDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberIntArrOvrdDef" + m + ": " + t); + } + } + + static void checkSingleMemberLongArrOvrdDefParam(Method m) { + try { + checkSingleMemberLongArrOvrdDef((SingleMemberLongArrayDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberLongArrOvrdDef" + m + ": " + t); + } + } + + static void checkSingleMemberCharArrOvrdDefParam(Method m) { + try { + checkSingleMemberCharArrOvrdDef((SingleMemberCharArrayDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberCharArrOvrdDef" + m + ": " + t); + } + } + + static void checkSingleMemberFloatArrOvrdDefParam(Method m) { + try { + checkSingleMemberFloatArrOvrdDef((SingleMemberFloatArrayDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberFloatArrOvrdDef" + m + ": " + t); + } + } + + static void checkSingleMemberDoubleArrOvrdDefParam(Method m) { + try { + checkSingleMemberDoubleArrOvrdDef((SingleMemberDoubleArrayDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberDoubleArrOvrdDef" + m + ": " + t); + } + } + + static void checkSingleMemberBooleanArrOvrdDefParam(Method m) { + try { + checkSingleMemberBooleanArrOvrdDef((SingleMemberBooleanArrayDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberBooleanArrOvrdDef" + m + ": " + t); + } + } + + static void checkSingleMemberStringArrOvrdDefParam(Method m) { + try { + checkSingleMemberStringArrOvrdDef((SingleMemberStringArrayDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberStringArrOvrdDef" + m + ": " + t); + } + } + + static void checkSingleMemberClassArrOvrdDefParam(Method m) { + try { + checkSingleMemberClassArrOvrdDef((SingleMemberClassArrayDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberClassArrOvrdDef" + m + ": " + t); + } + } + + static void checkSingleMemberEnumArrOvrdDefParam(Method m) { + try { + checkSingleMemberEnumArrOvrdDef((SingleMemberEnumArrayDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberEnumArrOvrdDef" + m + ": " + t); + } + } + + // single-member array types with default (accept)on parameter + static void checkSingleMemberByteArrAcceptDefParam(Method m) { + try { + checkSingleMemberByteArrAcceptDef((SingleMemberByteArrayDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberByteArrAcceptDef" + m + ": " + t); + } + } + + static void checkSingleMemberShortArrAcceptDefParam(Method m) { + try { + checkSingleMemberShortArrAcceptDef((SingleMemberShortArrayDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberShortArrAcceptDef" + m + ": " + t); + } + } + + static void checkSingleMemberIntArrAcceptDefParam(Method m) { + try { + checkSingleMemberIntArrAcceptDef((SingleMemberIntArrayDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberIntArrAcceptDef" + m + ": " + t); + } + } + + static void checkSingleMemberLongArrAcceptDefParam(Method m) { + try { + checkSingleMemberLongArrAcceptDef((SingleMemberLongArrayDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberLongArrAcceptDef" + m + ": " + t); + } + } + + static void checkSingleMemberCharArrAcceptDefParam(Method m) { + try { + checkSingleMemberCharArrAcceptDef((SingleMemberCharArrayDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberCharArrAcceptDef" + m + ": " + t); + } + } + + static void checkSingleMemberFloatArrAcceptDefParam(Method m) { + try { + checkSingleMemberFloatArrAcceptDef((SingleMemberFloatArrayDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberFloatArrAcceptDef" + m + ": " + t); + } + } + + static void checkSingleMemberDoubleArrAcceptDefParam(Method m) { + try { + checkSingleMemberDoubleArrAcceptDef((SingleMemberDoubleArrayDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberDoubleArrAcceptDef" + m + ": " + t); + } + } + + static void checkSingleMemberBooleanArrAcceptDefParam(Method m) { + try { + checkSingleMemberBooleanArrAcceptDef((SingleMemberBooleanArrayDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberBooleanArrAcceptDef" + m + ": " + t); + } + } + + static void checkSingleMemberStringArrAcceptDefParam(Method m) { + try { + checkSingleMemberStringArrAcceptDef((SingleMemberStringArrayDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberStringArrAcceptDef" + m + ": " + t); + } + } + + static void checkSingleMemberClassArrAcceptDefParam(Method m) { + try { + checkSingleMemberClassArrAcceptDef((SingleMemberClassArrayDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberClassArrAcceptDef" + m + ": " + t); + } + } + + static void checkSingleMemberEnumArrAcceptDefParam(Method m) { + try { + checkSingleMemberEnumArrAcceptDef((SingleMemberEnumArrayDef) m.getParameterAnnotations()[0][0], m); + } catch(Throwable t) { + fail("SingleMemberEnumArrAcceptDef" + m + ": " + t); + } + } + + // Marker + static void checkMarker(AnnotatedElement e) { + checkMarker(e.getAnnotation(Marker.class), e); + } + static void checkMarker(Marker m, AnnotatedElement e) { + numTests++; + try { + if (m == null) fail("Marker " + e); + } catch(Throwable t) { + fail("Marker " + e + ": " + t); + } + } + + // Single-member + + static void checkSingleMemberByte(AnnotatedElement e) { + checkSingleMemberByte(e.getAnnotation(SingleMemberByte.class), e); + } + static void checkSingleMemberByte(SingleMemberByte a, AnnotatedElement e) { + numTests++; + try { + if (a.value() != 1) fail("SingleMemberByte " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberByte " + e + ": " + t); + } + } + + static void checkSingleMemberShort(AnnotatedElement e) { + checkSingleMemberShort(e.getAnnotation(SingleMemberShort.class), e); + } + static void checkSingleMemberShort(SingleMemberShort a, AnnotatedElement e) { + numTests++; + try { + if (a.value() != 2) fail("SingleMemberShort " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberShort " + e + ": " + t); + } + } + + static void checkSingleMemberInt(AnnotatedElement e) { + checkSingleMemberInt(e.getAnnotation(SingleMemberInt.class), e); + } + static void checkSingleMemberInt(SingleMemberInt a, AnnotatedElement e) { + numTests++; + try { + if (a.value() != 3) fail("SingleMemberInt " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberInt " + e + ": " + t); + } + } + + static void checkSingleMemberLong(AnnotatedElement e) { + checkSingleMemberLong(e.getAnnotation(SingleMemberLong.class), e); + } + static void checkSingleMemberLong(SingleMemberLong a, AnnotatedElement e) { + numTests++; + try { + if (a.value() != 4L) fail("SingleMemberLong " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberLong " + e + ": " + t); + } + } + + static void checkSingleMemberChar(AnnotatedElement e) { + checkSingleMemberChar(e.getAnnotation(SingleMemberChar.class), e); + } + static void checkSingleMemberChar(SingleMemberChar a, AnnotatedElement e) { + numTests++; + try { + if (a.value() != '5') fail("SingleMemberChar " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberChar " + e + ": " + t); + } + } + + static void checkSingleMemberFloat(AnnotatedElement e) { + checkSingleMemberFloat(e.getAnnotation(SingleMemberFloat.class), e); + } + static void checkSingleMemberFloat(SingleMemberFloat a, AnnotatedElement e) { + numTests++; + try { + if (a.value() != 6.0f) fail("SingleMemberFloat " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberFloat " + e + ": " + t); + } + } + + static void checkSingleMemberDouble(AnnotatedElement e) { + checkSingleMemberDouble(e.getAnnotation(SingleMemberDouble.class), e); + } + static void checkSingleMemberDouble(SingleMemberDouble a, AnnotatedElement e) { + numTests++; + try { + if (a.value() != 7.0) fail("SingleMemberDouble " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberDouble " + e + ": " + t); + } + } + + static void checkSingleMemberBoolean(AnnotatedElement e) { + checkSingleMemberBoolean(e.getAnnotation(SingleMemberBoolean.class), e); + } + static void checkSingleMemberBoolean(SingleMemberBoolean a, AnnotatedElement e) { + numTests++; + try { + if (!a.value()) fail("SingleMemberBoolean " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberBoolean " + e + ": " + t); + } + } + + static void checkSingleMemberString(AnnotatedElement e) { + checkSingleMemberString(e.getAnnotation(SingleMemberString.class), e); + } + static void checkSingleMemberString(SingleMemberString a, AnnotatedElement e) { + numTests++; + try { + if (!(a.value().equals("custom"))) fail("SingleMemberString " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberString " + e + ": " + t); + } + } + + static void checkSingleMemberClass(AnnotatedElement e) { + checkSingleMemberClass(e.getAnnotation(SingleMemberClass.class), e); + } + static void checkSingleMemberClass(SingleMemberClass a, AnnotatedElement e) { + numTests++; + try { + if (a.value() != Map.class) fail("SingleMemberClass " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberClass " + e + ": " + t); + } + } + + static void checkSingleMemberEnum(AnnotatedElement e) { + checkSingleMemberEnum(e.getAnnotation(SingleMemberEnum.class), e); + } + static void checkSingleMemberEnum(SingleMemberEnum a, AnnotatedElement e) { + numTests++; + try { + if (a.value() != Stooge.MOE) fail("SingleMemberEnum " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberEnum " + e + ": " + t); + } + } + + // Single-member with default (Override) + + static void checkSingleMemberByteOvrdDef(AnnotatedElement e) { + checkSingleMemberByteOvrdDef(e.getAnnotation(SingleMemberByteWithDef.class), e); + } + static void checkSingleMemberByteOvrdDef(SingleMemberByteWithDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value() != 1) fail("SingleMemberByteOvrdDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberByteOvrdDef " + e + ": " + t); + } + } + + static void checkSingleMemberShortOvrdDef(AnnotatedElement e) { + checkSingleMemberShortOvrdDef(e.getAnnotation(SingleMemberShortWithDef.class), e); + } + static void checkSingleMemberShortOvrdDef(SingleMemberShortWithDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value() != 2) fail("SingleMemberShortOvrdDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberShortOvrdDef " + e + ": " + t); + } + } + + static void checkSingleMemberIntOvrdDef(AnnotatedElement e) { + checkSingleMemberIntOvrdDef(e.getAnnotation(SingleMemberIntWithDef.class), e); + } + static void checkSingleMemberIntOvrdDef(SingleMemberIntWithDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value() != 3) fail("SingleMemberIntOvrdDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberIntOvrdDef " + e + ": " + t); + } + } + + static void checkSingleMemberLongOvrdDef(AnnotatedElement e) { + checkSingleMemberLongOvrdDef(e.getAnnotation(SingleMemberLongWithDef.class), e); + } + static void checkSingleMemberLongOvrdDef(SingleMemberLongWithDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value() != 4L) fail("SingleMemberLongOvrdDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberLongOvrdDef " + e + ": " + t); + } + } + + static void checkSingleMemberCharOvrdDef(AnnotatedElement e) { + checkSingleMemberCharOvrdDef(e.getAnnotation(SingleMemberCharWithDef.class), e); + } + static void checkSingleMemberCharOvrdDef(SingleMemberCharWithDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value() != '5') fail("SingleMemberCharOvrdDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberCharOvrdDef " + e + ": " + t); + } + } + + static void checkSingleMemberFloatOvrdDef(AnnotatedElement e) { + checkSingleMemberFloatOvrdDef(e.getAnnotation(SingleMemberFloatWithDef.class), e); + } + static void checkSingleMemberFloatOvrdDef(SingleMemberFloatWithDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value() != 6.0f) fail("SingleMemberFloatOvrdDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberFloatOvrdDef " + e + ": " + t); + } + } + + static void checkSingleMemberDoubleOvrdDef(AnnotatedElement e) { + checkSingleMemberDoubleOvrdDef(e.getAnnotation(SingleMemberDoubleWithDef.class), e); + } + static void checkSingleMemberDoubleOvrdDef(SingleMemberDoubleWithDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value() != 7.0) fail("SingleMemberDoubleOvrdDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberDoubleOvrdDef " + e + ": " + t); + } + } + + static void checkSingleMemberBooleanOvrdDef(AnnotatedElement e) { + checkSingleMemberBooleanOvrdDef(e.getAnnotation(SingleMemberBooleanWithDef.class), e); + } + static void checkSingleMemberBooleanOvrdDef(SingleMemberBooleanWithDef a, AnnotatedElement e) { + numTests++; + try { + if (!a.value()) fail("SingleMemberBooleanOvrdDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberBooleanOvrdDef " + e + ": " + t); + } + } + + static void checkSingleMemberStringOvrdDef(AnnotatedElement e) { + checkSingleMemberStringOvrdDef(e.getAnnotation(SingleMemberStringWithDef.class), e); + } + static void checkSingleMemberStringOvrdDef(SingleMemberStringWithDef a, AnnotatedElement e) { + numTests++; + try { + if (!(a.value().equals("custom"))) fail("SingleMemberStringOvrdDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberStringOvrdDef " + e + ": " + t); + } + } + + static void checkSingleMemberClassOvrdDef(AnnotatedElement e) { + checkSingleMemberClassOvrdDef(e.getAnnotation(SingleMemberClassWithDef.class), e); + } + static void checkSingleMemberClassOvrdDef(SingleMemberClassWithDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value() != Map.class) fail("SingleMemberClassOvrdDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberClassOvrdDef " + e + ": " + t); + } + } + + static void checkSingleMemberEnumOvrdDef(AnnotatedElement e) { + checkSingleMemberEnumOvrdDef(e.getAnnotation(SingleMemberEnumWithDef.class), e); + } + static void checkSingleMemberEnumOvrdDef(SingleMemberEnumWithDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value() != Stooge.MOE) fail("SingleMemberEnumOvrdDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberEnumOvrdDef " + e + ": " + t); + } + } + + // Single-member with default (Accept) + + static void checkSingleMemberByteAcceptDef(AnnotatedElement e) { + checkSingleMemberByteAcceptDef(e.getAnnotation(SingleMemberByteWithDef.class), e); + } + static void checkSingleMemberByteAcceptDef(SingleMemberByteWithDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value() != 11) fail("SingleMemberByteAcceptDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberByteAcceptDef " + e + ": " + t); + } + } + + static void checkSingleMemberShortAcceptDef(AnnotatedElement e) { + checkSingleMemberShortAcceptDef(e.getAnnotation(SingleMemberShortWithDef.class), e); + } + static void checkSingleMemberShortAcceptDef(SingleMemberShortWithDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value() != 12) fail("SingleMemberShortAcceptDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberShortAcceptDef " + e + ": " + t); + } + } + + static void checkSingleMemberIntAcceptDef(AnnotatedElement e) { + checkSingleMemberIntAcceptDef(e.getAnnotation(SingleMemberIntWithDef.class), e); + } + static void checkSingleMemberIntAcceptDef(SingleMemberIntWithDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value() != 13) fail("SingleMemberIntAcceptDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberIntAcceptDef " + e + ": " + t); + } + } + + static void checkSingleMemberLongAcceptDef(AnnotatedElement e) { + checkSingleMemberLongAcceptDef(e.getAnnotation(SingleMemberLongWithDef.class), e); + } + static void checkSingleMemberLongAcceptDef(SingleMemberLongWithDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value() != 14L) fail("SingleMemberLongAcceptDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberLongAcceptDef " + e + ": " + t); + } + } + + static void checkSingleMemberCharAcceptDef(AnnotatedElement e) { + checkSingleMemberCharAcceptDef(e.getAnnotation(SingleMemberCharWithDef.class), e); + } + static void checkSingleMemberCharAcceptDef(SingleMemberCharWithDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value() != 'V') fail("SingleMemberCharAcceptDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberCharAcceptDef " + e + ": " + t); + } + } + + static void checkSingleMemberFloatAcceptDef(AnnotatedElement e) { + checkSingleMemberFloatAcceptDef(e.getAnnotation(SingleMemberFloatWithDef.class), e); + } + static void checkSingleMemberFloatAcceptDef(SingleMemberFloatWithDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value() != 16.0f) fail("SingleMemberFloatAcceptDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberFloatAcceptDef " + e + ": " + t); + } + } + + static void checkSingleMemberDoubleAcceptDef(AnnotatedElement e) { + checkSingleMemberDoubleAcceptDef(e.getAnnotation(SingleMemberDoubleWithDef.class), e); + } + static void checkSingleMemberDoubleAcceptDef(SingleMemberDoubleWithDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value() != 17.0) fail("SingleMemberDoubleAcceptDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberDoubleAcceptDef " + e + ": " + t); + } + } + + static void checkSingleMemberBooleanAcceptDef(AnnotatedElement e) { + checkSingleMemberBooleanAcceptDef(e.getAnnotation(SingleMemberBooleanWithDef.class), e); + } + static void checkSingleMemberBooleanAcceptDef(SingleMemberBooleanWithDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value()) fail("SingleMemberBooleanAcceptDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberBooleanAcceptDef " + e + ": " + t); + } + } + + static void checkSingleMemberStringAcceptDef(AnnotatedElement e) { + checkSingleMemberStringAcceptDef(e.getAnnotation(SingleMemberStringWithDef.class), e); + } + static void checkSingleMemberStringAcceptDef(SingleMemberStringWithDef a, AnnotatedElement e) { + numTests++; + try { + if (!(a.value().equals("default"))) fail("SingleMemberStringAcceptDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberStringAcceptDef " + e + ": " + t); + } + } + + static void checkSingleMemberClassAcceptDef(AnnotatedElement e) { + checkSingleMemberClassAcceptDef(e.getAnnotation(SingleMemberClassWithDef.class), e); + } + static void checkSingleMemberClassAcceptDef(SingleMemberClassWithDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value() != Class.class) fail("SingleMemberClassAcceptDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberClassAcceptDef " + e + ": " + t); + } + } + + static void checkSingleMemberEnumAcceptDef(AnnotatedElement e) { + checkSingleMemberEnumAcceptDef(e.getAnnotation(SingleMemberEnumWithDef.class), e); + } + static void checkSingleMemberEnumAcceptDef(SingleMemberEnumWithDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value() != Stooge.LARRY) fail("SingleMemberEnumAcceptDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberEnumAcceptDef " + e + ": " + t); + } + } + + // Single member array (empty array) + static void checkSingleMemberByteArrEmpty(AnnotatedElement e) { + checkSingleMemberByteArrEmpty(e.getAnnotation(SingleMemberByteArray.class), e); + } + static void checkSingleMemberByteArrEmpty(SingleMemberByteArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 0) fail("SingleMemberByteArrEmpty " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberByteArrEmpty " + e + ": " + t); + } + } + + static void checkSingleMemberShortArrEmpty(AnnotatedElement e) { + checkSingleMemberShortArrEmpty(e.getAnnotation(SingleMemberShortArray.class), e); + } + static void checkSingleMemberShortArrEmpty(SingleMemberShortArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 0) fail("SingleMemberShortArrEmpty " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberShortArrEmpty " + e + ": " + t); + } + } + + static void checkSingleMemberIntArrEmpty(AnnotatedElement e) { + checkSingleMemberIntArrEmpty(e.getAnnotation(SingleMemberIntArray.class), e); + } + static void checkSingleMemberIntArrEmpty(SingleMemberIntArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 0) fail("SingleMemberIntArrEmpty " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberIntArrEmpty " + e + ": " + t); + } + } + + static void checkSingleMemberLongArrEmpty(AnnotatedElement e) { + checkSingleMemberLongArrEmpty(e.getAnnotation(SingleMemberLongArray.class), e); + } + static void checkSingleMemberLongArrEmpty(SingleMemberLongArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 0) fail("SingleMemberLongArrEmpty " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberLongArrEmpty " + e + ": " + t); + } + } + + static void checkSingleMemberCharArrEmpty(AnnotatedElement e) { + checkSingleMemberCharArrEmpty(e.getAnnotation(SingleMemberCharArray.class), e); + } + static void checkSingleMemberCharArrEmpty(SingleMemberCharArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 0) fail("SingleMemberCharArrEmpty " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberCharArrEmpty " + e + ": " + t); + } + } + + static void checkSingleMemberFloatArrEmpty(AnnotatedElement e) { + checkSingleMemberFloatArrEmpty(e.getAnnotation(SingleMemberFloatArray.class), e); + } + static void checkSingleMemberFloatArrEmpty(SingleMemberFloatArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 0) fail("SingleMemberFloatArrEmpty " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberFloatArrEmpty " + e + ": " + t); + } + } + + static void checkSingleMemberDoubleArrEmpty(AnnotatedElement e) { + checkSingleMemberDoubleArrEmpty(e.getAnnotation(SingleMemberDoubleArray.class), e); + } + static void checkSingleMemberDoubleArrEmpty(SingleMemberDoubleArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 0) fail("SingleMemberDoubleArrEmpty " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberDoubleArrEmpty " + e + ": " + t); + } + } + + static void checkSingleMemberBooleanArrEmpty(AnnotatedElement e) { + checkSingleMemberBooleanArrEmpty(e.getAnnotation(SingleMemberBooleanArray.class), e); + } + static void checkSingleMemberBooleanArrEmpty(SingleMemberBooleanArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 0) fail("SingleMemberBooleanArrEmpty " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberBooleanArrEmpty " + e + ": " + t); + } + } + + static void checkSingleMemberStringArrEmpty(AnnotatedElement e) { + checkSingleMemberStringArrEmpty(e.getAnnotation(SingleMemberStringArray.class), e); + } + static void checkSingleMemberStringArrEmpty(SingleMemberStringArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 0) fail("SingleMemberStringArrEmpty " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberStringArrEmpty " + e + ": " + t); + } + } + + static void checkSingleMemberClassArrEmpty(AnnotatedElement e) { + checkSingleMemberClassArrEmpty(e.getAnnotation(SingleMemberClassArray.class), e); + } + static void checkSingleMemberClassArrEmpty(SingleMemberClassArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 0) fail("SingleMemberClassArrEmpty " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberClassArrEmpty " + e + ": " + t); + } + } + + static void checkSingleMemberEnumArrEmpty(AnnotatedElement e) { + checkSingleMemberEnumArrEmpty(e.getAnnotation(SingleMemberEnumArray.class), e); + } + static void checkSingleMemberEnumArrEmpty(SingleMemberEnumArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 0) fail("SingleMemberEnumArrEmpty " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberEnumArrEmpty " + e + ": " + t); + } + } + + // Single member array (one element array) + static void checkSingleMemberByteArrOne(AnnotatedElement e) { + checkSingleMemberByteArrOne(e.getAnnotation(SingleMemberByteArray.class), e); + } + static void checkSingleMemberByteArrOne(SingleMemberByteArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || a.value()[0] != (byte)1) + fail("SingleMemberByteArrOne " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberByteArrOne " + e + ": " + t); + } + } + + static void checkSingleMemberShortArrOne(AnnotatedElement e) { + checkSingleMemberShortArrOne(e.getAnnotation(SingleMemberShortArray.class), e); + } + static void checkSingleMemberShortArrOne(SingleMemberShortArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || a.value()[0] != (short)2) + fail("SingleMemberShortArrOne " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberShortArrOne " + e + ": " + t); + } + } + + static void checkSingleMemberIntArrOne(AnnotatedElement e) { + checkSingleMemberIntArrOne(e.getAnnotation(SingleMemberIntArray.class), e); + } + static void checkSingleMemberIntArrOne(SingleMemberIntArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || a.value()[0] != 3) + fail("SingleMemberIntArrOne " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberIntArrOne " + e + ": " + t); + } + } + + static void checkSingleMemberLongArrOne(AnnotatedElement e) { + checkSingleMemberLongArrOne(e.getAnnotation(SingleMemberLongArray.class), e); + } + static void checkSingleMemberLongArrOne(SingleMemberLongArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || a.value()[0] != 4L) + fail("SingleMemberLongArrOne " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberLongArrOne " + e + ": " + t); + } + } + + static void checkSingleMemberCharArrOne(AnnotatedElement e) { + checkSingleMemberCharArrOne(e.getAnnotation(SingleMemberCharArray.class), e); + } + static void checkSingleMemberCharArrOne(SingleMemberCharArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || a.value()[0] != '5') + fail("SingleMemberCharArrOne " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberCharArrOne " + e + ": " + t); + } + } + + static void checkSingleMemberFloatArrOne(AnnotatedElement e) { + checkSingleMemberFloatArrOne(e.getAnnotation(SingleMemberFloatArray.class), e); + } + static void checkSingleMemberFloatArrOne(SingleMemberFloatArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || a.value()[0] != 6.0f) + fail("SingleMemberFloatArrOne " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberFloatArrOne " + e + ": " + t); + } + } + + static void checkSingleMemberDoubleArrOne(AnnotatedElement e) { + checkSingleMemberDoubleArrOne(e.getAnnotation(SingleMemberDoubleArray.class), e); + } + static void checkSingleMemberDoubleArrOne(SingleMemberDoubleArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || a.value()[0] != 7.0) + fail("SingleMemberDoubleArrOne " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberDoubleArrOne " + e + ": " + t); + } + } + + static void checkSingleMemberBooleanArrOne(AnnotatedElement e) { + checkSingleMemberBooleanArrOne(e.getAnnotation(SingleMemberBooleanArray.class), e); + } + static void checkSingleMemberBooleanArrOne(SingleMemberBooleanArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || !a.value()[0]) + fail("SingleMemberBooleanArrOne " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberBooleanArrOne " + e + ": " + t); + } + } + + static void checkSingleMemberStringArrOne(AnnotatedElement e) { + checkSingleMemberStringArrOne(e.getAnnotation(SingleMemberStringArray.class), e); + } + static void checkSingleMemberStringArrOne(SingleMemberStringArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || !(a.value()[0].equals("custom"))) + fail("SingleMemberStringArrOne " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberStringArrOne " + e + ": " + t); + } + } + + static void checkSingleMemberClassArrOne(AnnotatedElement e) { + checkSingleMemberClassArrOne(e.getAnnotation(SingleMemberClassArray.class), e); + } + static void checkSingleMemberClassArrOne(SingleMemberClassArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || a.value()[0] != Map.class) + fail("SingleMemberClassArrOne " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberClassArrOne " + e + ": " + t); + } + } + + static void checkSingleMemberEnumArrOne(AnnotatedElement e) { + checkSingleMemberEnumArrOne(e.getAnnotation(SingleMemberEnumArray.class), e); + } + static void checkSingleMemberEnumArrOne(SingleMemberEnumArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || a.value()[0] != Stooge.MOE) + fail("SingleMemberEnumArrOne " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberEnumArrOne " + e + ": " + t); + } + } + + // Single member array (two element array) + static void checkSingleMemberByteArrTwo(AnnotatedElement e) { + checkSingleMemberByteArrTwo(e.getAnnotation(SingleMemberByteArray.class), e); + } + static void checkSingleMemberByteArrTwo(SingleMemberByteArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 2 || a.value()[0] != (byte)1 || a.value()[1] != (byte)2) + fail("SingleMemberByteArrTwo " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberByteArrTwo " + e + ": " + t); + } + } + + static void checkSingleMemberShortArrTwo(AnnotatedElement e) { + checkSingleMemberShortArrTwo(e.getAnnotation(SingleMemberShortArray.class), e); + } + static void checkSingleMemberShortArrTwo(SingleMemberShortArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 2 || a.value()[0] != (short)2 || a.value()[1] != (short)3) + fail("SingleMemberShortArrTwo " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberShortArrTwo " + e + ": " + t); + } + } + + static void checkSingleMemberIntArrTwo(AnnotatedElement e) { + checkSingleMemberIntArrTwo(e.getAnnotation(SingleMemberIntArray.class), e); + } + static void checkSingleMemberIntArrTwo(SingleMemberIntArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 2 || a.value()[0] != 3 || a.value()[1] != 4) + fail("SingleMemberIntArrTwo " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberIntArrTwo " + e + ": " + t); + } + } + + static void checkSingleMemberLongArrTwo(AnnotatedElement e) { + checkSingleMemberLongArrTwo(e.getAnnotation(SingleMemberLongArray.class), e); + } + static void checkSingleMemberLongArrTwo(SingleMemberLongArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 2 || a.value()[0] != 4L || a.value()[1] != 5L) + fail("SingleMemberLongArrTwo " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberLongArrTwo " + e + ": " + t); + } + } + + static void checkSingleMemberCharArrTwo(AnnotatedElement e) { + checkSingleMemberCharArrTwo(e.getAnnotation(SingleMemberCharArray.class), e); + } + static void checkSingleMemberCharArrTwo(SingleMemberCharArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 2 || a.value()[0] != '5' || a.value()[1] != '6') + fail("SingleMemberCharArrTwo " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberCharArrTwo " + e + ": " + t); + } + } + + static void checkSingleMemberFloatArrTwo(AnnotatedElement e) { + checkSingleMemberFloatArrTwo(e.getAnnotation(SingleMemberFloatArray.class), e); + } + static void checkSingleMemberFloatArrTwo(SingleMemberFloatArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 2 || a.value()[0] != 6.0f || a.value()[1] != 7.0f) + fail("SingleMemberFloatArrTwo " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberFloatArrTwo " + e + ": " + t); + } + } + + static void checkSingleMemberDoubleArrTwo(AnnotatedElement e) { + checkSingleMemberDoubleArrTwo(e.getAnnotation(SingleMemberDoubleArray.class), e); + } + static void checkSingleMemberDoubleArrTwo(SingleMemberDoubleArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 2 || a.value()[0] != 7.0 || a.value()[1] != 8.0) + fail("SingleMemberDoubleArrTwo " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberDoubleArrTwo " + e + ": " + t); + } + } + + static void checkSingleMemberBooleanArrTwo(AnnotatedElement e) { + checkSingleMemberBooleanArrTwo(e.getAnnotation(SingleMemberBooleanArray.class), e); + } + static void checkSingleMemberBooleanArrTwo(SingleMemberBooleanArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 2 || !a.value()[0] || a.value()[1]) + fail("SingleMemberBooleanArrTwo " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberBooleanArrTwo " + e + ": " + t); + } + } + + static void checkSingleMemberStringArrTwo(AnnotatedElement e) { + checkSingleMemberStringArrTwo(e.getAnnotation(SingleMemberStringArray.class), e); + } + static void checkSingleMemberStringArrTwo(SingleMemberStringArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 2 || !(a.value()[0].equals("custom")) || !(a.value()[1].equals("paint"))) + fail("SingleMemberStringArrTwo " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberStringArrTwo " + e + ": " + t); + } + } + + static void checkSingleMemberClassArrTwo(AnnotatedElement e) { + checkSingleMemberClassArrTwo(e.getAnnotation(SingleMemberClassArray.class), e); + } + static void checkSingleMemberClassArrTwo(SingleMemberClassArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 2 || a.value()[0] != Map.class || a.value()[1] != Set.class) + fail("SingleMemberClassArrTwo " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberClassArrTwo " + e + ": " + t); + } + } + + static void checkSingleMemberEnumArrTwo(AnnotatedElement e) { + checkSingleMemberEnumArrTwo(e.getAnnotation(SingleMemberEnumArray.class), e); + } + static void checkSingleMemberEnumArrTwo(SingleMemberEnumArray a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 2 || a.value()[0] != Stooge.MOE || a.value()[1] != Stooge.CURLY) + fail("SingleMemberEnumArrTwo " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberEnumArrTwo " + e + ": " + t); + } + } + + // Single member array with default (override) + static void checkSingleMemberByteArrOvrdDef(AnnotatedElement e) { + checkSingleMemberByteArrOvrdDef(e.getAnnotation(SingleMemberByteArrayDef.class), e); + } + static void checkSingleMemberByteArrOvrdDef(SingleMemberByteArrayDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || a.value()[0] != (byte)1) + fail("SingleMemberByteArrOvrdDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberByteArrOvrdDef " + e + ": " + t); + } + } + + static void checkSingleMemberShortArrOvrdDef(AnnotatedElement e) { + checkSingleMemberShortArrOvrdDef(e.getAnnotation(SingleMemberShortArrayDef.class), e); + } + static void checkSingleMemberShortArrOvrdDef(SingleMemberShortArrayDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || a.value()[0] != (short)2) + fail("SingleMemberShortArrOvrdDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberShortArrOvrdDef " + e + ": " + t); + } + } + + static void checkSingleMemberIntArrOvrdDef(AnnotatedElement e) { + checkSingleMemberIntArrOvrdDef(e.getAnnotation(SingleMemberIntArrayDef.class), e); + } + static void checkSingleMemberIntArrOvrdDef(SingleMemberIntArrayDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || a.value()[0] != 3) + fail("SingleMemberIntArrOvrdDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberIntArrOvrdDef " + e + ": " + t); + } + } + + static void checkSingleMemberLongArrOvrdDef(AnnotatedElement e) { + checkSingleMemberLongArrOvrdDef(e.getAnnotation(SingleMemberLongArrayDef.class), e); + } + static void checkSingleMemberLongArrOvrdDef(SingleMemberLongArrayDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || a.value()[0] != 4L) + fail("SingleMemberLongArrOvrdDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberLongArrOvrdDef " + e + ": " + t); + } + } + + static void checkSingleMemberCharArrOvrdDef(AnnotatedElement e) { + checkSingleMemberCharArrOvrdDef(e.getAnnotation(SingleMemberCharArrayDef.class), e); + } + static void checkSingleMemberCharArrOvrdDef(SingleMemberCharArrayDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || a.value()[0] != '5') + fail("SingleMemberCharArrOvrdDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberCharArrOvrdDef " + e + ": " + t); + } + } + + static void checkSingleMemberFloatArrOvrdDef(AnnotatedElement e) { + checkSingleMemberFloatArrOvrdDef(e.getAnnotation(SingleMemberFloatArrayDef.class), e); + } + static void checkSingleMemberFloatArrOvrdDef(SingleMemberFloatArrayDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || a.value()[0] != 6.0f) + fail("SingleMemberFloatArrOvrdDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberFloatArrOvrdDef " + e + ": " + t); + } + } + + static void checkSingleMemberDoubleArrOvrdDef(AnnotatedElement e) { + checkSingleMemberDoubleArrOvrdDef(e.getAnnotation(SingleMemberDoubleArrayDef.class), e); + } + static void checkSingleMemberDoubleArrOvrdDef(SingleMemberDoubleArrayDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || a.value()[0] != 7.0) + fail("SingleMemberDoubleArrOvrdDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberDoubleArrOvrdDef " + e + ": " + t); + } + } + + static void checkSingleMemberBooleanArrOvrdDef(AnnotatedElement e) { + checkSingleMemberBooleanArrOvrdDef(e.getAnnotation(SingleMemberBooleanArrayDef.class), e); + } + static void checkSingleMemberBooleanArrOvrdDef(SingleMemberBooleanArrayDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || !a.value()[0]) + fail("SingleMemberBooleanArrOvrdDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberBooleanArrOvrdDef " + e + ": " + t); + } + } + + static void checkSingleMemberStringArrOvrdDef(AnnotatedElement e) { + checkSingleMemberStringArrOvrdDef(e.getAnnotation(SingleMemberStringArrayDef.class), e); + } + static void checkSingleMemberStringArrOvrdDef(SingleMemberStringArrayDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || !(a.value()[0].equals("custom"))) + fail("SingleMemberStringArrOvrdDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberStringArrOvrdDef " + e + ": " + t); + } + } + + static void checkSingleMemberClassArrOvrdDef(AnnotatedElement e) { + checkSingleMemberClassArrOvrdDef(e.getAnnotation(SingleMemberClassArrayDef.class), e); + } + static void checkSingleMemberClassArrOvrdDef(SingleMemberClassArrayDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || a.value()[0] != Map.class) + fail("SingleMemberClassArrOvrdDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberClassArrOvrdDef " + e + ": " + t); + } + } + + static void checkSingleMemberEnumArrOvrdDef(AnnotatedElement e) { + checkSingleMemberEnumArrOvrdDef(e.getAnnotation(SingleMemberEnumArrayDef.class), e); + } + static void checkSingleMemberEnumArrOvrdDef(SingleMemberEnumArrayDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || a.value()[0] != Stooge.MOE) + fail("SingleMemberEnumArrOvrdDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberEnumArrOvrdDef " + e + ": " + t); + } + } + + // Single member array with default (accept) + static void checkSingleMemberByteArrAcceptDef(AnnotatedElement e) { + checkSingleMemberByteArrAcceptDef(e.getAnnotation(SingleMemberByteArrayDef.class), e); + } + static void checkSingleMemberByteArrAcceptDef(SingleMemberByteArrayDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || a.value()[0] != (byte)11) + fail("SingleMemberByteArrAcceptDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberByteArrAcceptDef " + e + ": " + t); + } + } + + static void checkSingleMemberShortArrAcceptDef(AnnotatedElement e) { + checkSingleMemberShortArrAcceptDef(e.getAnnotation(SingleMemberShortArrayDef.class), e); + } + static void checkSingleMemberShortArrAcceptDef(SingleMemberShortArrayDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || a.value()[0] != (short)12) + fail("SingleMemberShortArrAcceptDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberShortArrAcceptDef " + e + ": " + t); + } + } + + static void checkSingleMemberIntArrAcceptDef(AnnotatedElement e) { + checkSingleMemberIntArrAcceptDef(e.getAnnotation(SingleMemberIntArrayDef.class), e); + } + static void checkSingleMemberIntArrAcceptDef(SingleMemberIntArrayDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || a.value()[0] != 13) + fail("SingleMemberIntArrAcceptDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberIntArrAcceptDef " + e + ": " + t); + } + } + + static void checkSingleMemberLongArrAcceptDef(AnnotatedElement e) { + checkSingleMemberLongArrAcceptDef(e.getAnnotation(SingleMemberLongArrayDef.class), e); + } + static void checkSingleMemberLongArrAcceptDef(SingleMemberLongArrayDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || a.value()[0] != 14L) + fail("SingleMemberLongArrAcceptDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberLongArrAcceptDef " + e + ": " + t); + } + } + + static void checkSingleMemberCharArrAcceptDef(AnnotatedElement e) { + checkSingleMemberCharArrAcceptDef(e.getAnnotation(SingleMemberCharArrayDef.class), e); + } + static void checkSingleMemberCharArrAcceptDef(SingleMemberCharArrayDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || a.value()[0] != 'V') + fail("SingleMemberCharArrAcceptDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberCharArrAcceptDef " + e + ": " + t); + } + } + + static void checkSingleMemberFloatArrAcceptDef(AnnotatedElement e) { + checkSingleMemberFloatArrAcceptDef(e.getAnnotation(SingleMemberFloatArrayDef.class), e); + } + static void checkSingleMemberFloatArrAcceptDef(SingleMemberFloatArrayDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || a.value()[0] != 16.0f) + fail("SingleMemberFloatArrAcceptDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberFloatArrAcceptDef " + e + ": " + t); + } + } + + static void checkSingleMemberDoubleArrAcceptDef(AnnotatedElement e) { + checkSingleMemberDoubleArrAcceptDef(e.getAnnotation(SingleMemberDoubleArrayDef.class), e); + } + static void checkSingleMemberDoubleArrAcceptDef(SingleMemberDoubleArrayDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || a.value()[0] != 17.0) + fail("SingleMemberDoubleArrAcceptDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberDoubleArrAcceptDef " + e + ": " + t); + } + } + + static void checkSingleMemberBooleanArrAcceptDef(AnnotatedElement e) { + checkSingleMemberBooleanArrAcceptDef(e.getAnnotation(SingleMemberBooleanArrayDef.class), e); + } + static void checkSingleMemberBooleanArrAcceptDef(SingleMemberBooleanArrayDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || a.value()[0]) + fail("SingleMemberBooleanArrAcceptDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberBooleanArrAcceptDef " + e + ": " + t); + } + } + + static void checkSingleMemberStringArrAcceptDef(AnnotatedElement e) { + checkSingleMemberStringArrAcceptDef(e.getAnnotation(SingleMemberStringArrayDef.class), e); + } + static void checkSingleMemberStringArrAcceptDef(SingleMemberStringArrayDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || !(a.value()[0].equals("default"))) + fail("SingleMemberStringArrAcceptDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberStringArrAcceptDef " + e + ": " + t); + } + } + + static void checkSingleMemberClassArrAcceptDef(AnnotatedElement e) { + checkSingleMemberClassArrAcceptDef(e.getAnnotation(SingleMemberClassArrayDef.class), e); + } + static void checkSingleMemberClassArrAcceptDef(SingleMemberClassArrayDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || a.value()[0] != Class.class) + fail("SingleMemberClassArrAcceptDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberClassArrAcceptDef " + e + ": " + t); + } + } + + static void checkSingleMemberEnumArrAcceptDef(AnnotatedElement e) { + checkSingleMemberEnumArrAcceptDef(e.getAnnotation(SingleMemberEnumArrayDef.class), e); + } + static void checkSingleMemberEnumArrAcceptDef(SingleMemberEnumArrayDef a, AnnotatedElement e) { + numTests++; + try { + if (a.value().length != 1 || a.value()[0] != Stooge.LARRY) + fail("SingleMemberEnumArrAcceptDef " + e + " = " + a.value()); + } catch(Throwable t) { + fail("SingleMemberEnumArrAcceptDef " + e + ": " + t); + } + } + + // Verfification methods for equals/hashCode/serialization + + static void checkEquals(AnnotatedElement e1, AnnotatedElement e2, Class annoType) { + numTests++; + T a1 = e1.getAnnotation(annoType); + T a2 = e2.getAnnotation(annoType); + try { + if (!a1.equals(a2)) + fail(a1 + " != " + a2); + if (a1.hashCode() != a2.hashCode()) + fail(a1 + ".hashCode() [" + a1.hashCode() + "] != " + a2 + " .hashCode()["+ a2.hashCode()+"]"); + if (!(a1.toString().equals(a2.toString()))) + fail(a1 + ".toString() != " + a2 + ".toString()"); + } catch(Throwable t) { + fail(a1 + " == " + a2 + ": " + t); + } + } + + static void checkUnequals(AnnotatedElement e1, AnnotatedElement e2, Class annoType) { + numTests++; + T a1 = e1.getAnnotation(annoType); + T a2 = e2.getAnnotation(annoType); + try { + if (a1.equals(a2)) + fail(a1 + " == " + a2); + if (a1.hashCode() == a2.hashCode()) + fail(a1 + ".hashCode() [" + a1.hashCode() + "] == " + a2 + " .hashCode()[" + a2.hashCode() + "]"); + if (a1.toString().equals(a2.toString())) + fail(a1 + ".toString() == " + a2 + ".toString()"); + } catch(Throwable t) { + fail(a1 + " != " + a2 + ": " + t); + } + } + + // Verfification method for serialization/deserialization + + static void checkSerialization(AnnotatedElement e, Class annoType) { + numTests++; + T a1 = e.getAnnotation(annoType); + Object a2 = deepCopy(a1); + try { + if (!a1.equals(a2)) + fail("Serialization: " + a1 + " != " + a2); + if (a1.hashCode() != a2.hashCode()) + fail("Serialization: " + a1 + ".hashCode() [" + a1.hashCode() + "] != " + a2 + " .hashCode()["+a2.hashCode()+"]"); + if (!(a1.toString().equals(a2.toString()))) + fail("Serialization: " + a1 + ".toString() != " + a2 + ".toString()"); + } catch(Throwable t) { + fail("Serialization: " + a1 + " == " + a2 + ": " + t); + } + } + + private static Object deepCopy(Object original) { + try { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(bos); + oos.writeObject(original); + oos.flush(); + ByteArrayInputStream bin = new ByteArrayInputStream( + bos.toByteArray()); + ObjectInputStream ois = new ObjectInputStream(bin); + return ois.readObject(); + } catch(Exception e) { + throw new IllegalArgumentException(e); + } + } + + // Verification method for inheritance test + static void checkInheritence(AnnotatedElement e, boolean shouldHaveFoo, boolean shouldHaveBar) { + numTests++; + try { + boolean hasFoo = e.isAnnotationPresent(Foo.class); + boolean hasBar = e.isAnnotationPresent(Bar.class); + if (hasFoo != shouldHaveFoo || hasBar != shouldHaveBar) + fail("Inheritance(1): " + e +" - Foo: " + hasFoo + ", Bar: " + hasBar); + + // Now test getAnnotations + hasFoo = hasBar = false; + Annotation[] allAnnotations = e.getAnnotations(); + for (Annotation a : allAnnotations) { + if (a instanceof Foo) + hasFoo = true; + else if (a instanceof Bar) + hasBar = true; + } + if (hasFoo != shouldHaveFoo ||hasBar != shouldHaveBar) + fail("Inheritance(2): " + e +" - Foo: " + hasFoo + ", Bar: " + hasBar); + } catch(Throwable t) { + fail("Inheritance: " + e +": " + t); + } + } + + // Verification method for declared annotations test + static void checkDeclaredAnnotations(AnnotatedElement e, boolean shouldHaveFoo, boolean shouldHaveBar) { + numTests++; + try { + boolean hasFoo = false; + boolean hasBar = false; + Annotation[] declaredAnnotations = e.getDeclaredAnnotations(); + for (Annotation a : declaredAnnotations) { + if (a instanceof Foo) + hasFoo = true; + else if (a instanceof Bar) + hasBar = true; + } + if (hasFoo != shouldHaveFoo ||hasBar != shouldHaveBar) + fail("Declared annotations: " + e +" - Foo: " + hasFoo + ", Bar: " + hasBar); + } catch(Throwable t) { + fail("Declared annotations: " + e +": " + t); + } + } + + + // ANNOTATED METHODS + + @ScalarTypes ( + b = 1, + s = 2, + i = 3, + l = 4L, + c = '5', + f = 6.0f, + d = 7.0, + bool = true, + str = "custom", + cls = Map.class, + e = Stooge.MOE, + a = @Point(x = 1, y = 2) + ) + public void scalarTypesMethod() { } + + @ScalarTypesWithDefault ( ) + public void scalarTypesAcceptDefaultMethod() { } + + @ScalarTypesWithDefault ( + b = 1, + s = 2, + i = 3, + l = 4L, + c = '5', + f = 6.0f, + d = 7.0, + bool = true, + str = "custom", + cls = Map.class, + e = Stooge.MOE + ) + public void scalarTypesOverrideDefaultMethod() { } + + @ArrayTypes ( + b = { }, + s = { }, + i = { }, + l = { }, + c = { }, + f = { }, + d = { }, + bool = { }, + str = { }, + cls = { }, + e = { }, + a = { } + ) + public void emptyArrayTypesMethod() { } + + @ArrayTypes ( + b = 1, + s = 2, + i = 3, + l = 4L, + c = '5', + f = 6.0f, + d = 7.0, + bool = true, + str = "custom", + cls = Map.class, + e = Stooge.MOE, + a = { @Point(x = 1, y = 2) } + ) + public void singleElementArrayTypesMethod() { } + + @ArrayTypes ( + b = { 1, 2 }, + s = { 2, 3 }, + i = { 3, 4 }, + l = { 4L, 5L }, + c = { '5', '6' }, + f = { 6.0f, 7.0f }, + d = { 7.0, 8.0 }, + bool = { true, false }, + str = { "custom", "paint" }, + cls = { Map.class, Set.class }, + e = { Stooge.MOE, Stooge.CURLY }, + a = { @Point(x = 1, y = 2), @Point(x = 3, y = 4) } + ) + public void twoElementArrayTypesMethod() { } + + @ArrayTypesWithDefault ( + ) + public void arrayTypesAcceptDefaultMethod() { } + + @ArrayTypesWithDefault ( + b = 1, + s = 2, + i = 3, + l = 4L, + c = '5', + f = 6.0f, + d = 7.0, + bool = true, + str = "custom", + cls = Map.class, + e = Stooge.MOE, + a = { @Point(x = 1, y = 2) } + ) + public void arrayTypesOverrideDefaultMethod() { } + + // Marker + @Marker public void markerMethod() { } + + // Single-member (shorthand) + @SingleMemberByte(1) public void SingleMemberByte() {} + @SingleMemberShort(2) public void SingleMemberShort() {} + @SingleMemberInt(3) public void SingleMemberInt() {} + @SingleMemberLong(4L) public void SingleMemberLong() {} + @SingleMemberChar('5') public void SingleMemberChar() {} + @SingleMemberFloat(6.0f) public void SingleMemberFloat() {} + @SingleMemberDouble(7.0) public void SingleMemberDouble() {} + @SingleMemberBoolean(true) public void SingleMemberBoolean() {} + @SingleMemberString("custom") public void SingleMemberString() {} + @SingleMemberClass(Map.class) public void SingleMemberClass() {} + @SingleMemberEnum(Stooge.MOE) public void SingleMemberEnum() {} + + // Single-member with default (Override) + @SingleMemberByteWithDef(1) public void SingleMemberByteOvrdDef() {} + @SingleMemberShortWithDef(2) public void SingleMemberShortOvrdDef() {} + @SingleMemberIntWithDef(3) public void SingleMemberIntOvrdDef() {} + @SingleMemberLongWithDef(4L) public void SingleMemberLongOvrdDef() {} + @SingleMemberCharWithDef('5') public void SingleMemberCharOvrdDef() {} + @SingleMemberFloatWithDef(6.0f) public void SingleMemberFloatOvrdDef() {} + @SingleMemberDoubleWithDef(7.0) public void SingleMemberDoubleOvrdDef() {} + @SingleMemberBooleanWithDef(true) public void SingleMemberBooleanOvrdDef() {} + @SingleMemberStringWithDef("custom") public void SingleMemberStringOvrdDef() {} + @SingleMemberClassWithDef(Map.class) public void SingleMemberClassOvrdDef() {} + @SingleMemberEnumWithDef(Stooge.MOE) public void SingleMemberEnumOvrdDef() {} + + // Single-member with default (Accept) + @SingleMemberByteWithDef public void SingleMemberByteAcceptDef() {} + @SingleMemberShortWithDef public void SingleMemberShortAcceptDef() {} + @SingleMemberIntWithDef public void SingleMemberIntAcceptDef() {} + @SingleMemberLongWithDef public void SingleMemberLongAcceptDef() {} + @SingleMemberCharWithDef public void SingleMemberCharAcceptDef() {} + @SingleMemberFloatWithDef public void SingleMemberFloatAcceptDef() {} + @SingleMemberDoubleWithDef public void SingleMemberDoubleAcceptDef() {} + @SingleMemberBooleanWithDef public void SingleMemberBooleanAcceptDef() {} + @SingleMemberStringWithDef public void SingleMemberStringAcceptDef() {} + @SingleMemberClassWithDef public void SingleMemberClassAcceptDef() {} + @SingleMemberEnumWithDef public void SingleMemberEnumAcceptDef() {} + + // Single member array (empty array) + @SingleMemberByteArray({}) public void SingleMemberByteArrEmpty() {} + @SingleMemberShortArray({}) public void SingleMemberShortArrEmpty() {} + @SingleMemberIntArray({}) public void SingleMemberIntArrEmpty() {} + @SingleMemberLongArray({}) public void SingleMemberLongArrEmpty() {} + @SingleMemberCharArray({}) public void SingleMemberCharArrEmpty() {} + @SingleMemberFloatArray({}) public void SingleMemberFloatArrEmpty() {} + @SingleMemberDoubleArray({}) public void SingleMemberDoubleArrEmpty() {} + @SingleMemberBooleanArray({})public void SingleMemberBooleanArrEmpty() {} + @SingleMemberStringArray({}) public void SingleMemberStringArrEmpty() {} + @SingleMemberClassArray({}) public void SingleMemberClassArrEmpty() {} + @SingleMemberEnumArray({}) public void SingleMemberEnumArrEmpty() {} + + // Single member array (one-element shorthand) + @SingleMemberByteArray(1) public void SingleMemberByteArrOne() {} + @SingleMemberShortArray(2) public void SingleMemberShortArrOne() {} + @SingleMemberIntArray(3) public void SingleMemberIntArrOne() {} + @SingleMemberLongArray(4L) public void SingleMemberLongArrOne() {} + @SingleMemberCharArray('5') public void SingleMemberCharArrOne() {} + @SingleMemberFloatArray(6.0f) public void SingleMemberFloatArrOne() {} + @SingleMemberDoubleArray(7.0) public void SingleMemberDoubleArrOne() {} + @SingleMemberBooleanArray(true) public void SingleMemberBooleanArrOne() {} + @SingleMemberStringArray("custom") public void SingleMemberStringArrOne() {} + @SingleMemberClassArray(Map.class) public void SingleMemberClassArrOne() {} + @SingleMemberEnumArray(Stooge.MOE) public void SingleMemberEnumArrOne() {} + + // Single member array (two elements) + @SingleMemberByteArray({1, 2}) public void SingleMemberByteArrTwo() {} + @SingleMemberShortArray({2, 3}) public void SingleMemberShortArrTwo() {} + @SingleMemberIntArray({3, 4}) public void SingleMemberIntArrTwo() {} + @SingleMemberLongArray({4L, 5L}) public void SingleMemberLongArrTwo() {} + @SingleMemberCharArray({'5', '6'}) public void SingleMemberCharArrTwo() {} + @SingleMemberFloatArray({6.0f, 7.0f}) public void SingleMemberFloatArrTwo() {} + @SingleMemberDoubleArray({7.0, 8.0}) public void SingleMemberDoubleArrTwo() {} + @SingleMemberBooleanArray({true, false}) public void SingleMemberBooleanArrTwo(){} + @SingleMemberStringArray({"custom", "paint"}) public void SingleMemberStringArrTwo(){} + @SingleMemberClassArray({Map.class, Set.class}) public void SingleMemberClassArrTwo() {} + @SingleMemberEnumArray({Stooge.MOE, Stooge.CURLY}) public void SingleMemberEnumArrTwo() {} + + // Single member array with default (override) + @SingleMemberByteArrayDef(1) public void SingleMemberByteArrOvrdDef() {} + @SingleMemberShortArrayDef(2) public void SingleMemberShortArrOvrdDef() {} + @SingleMemberIntArrayDef(3) public void SingleMemberIntArrOvrdDef() {} + @SingleMemberLongArrayDef(4L) public void SingleMemberLongArrOvrdDef() {} + @SingleMemberCharArrayDef('5') public void SingleMemberCharArrOvrdDef() {} + @SingleMemberFloatArrayDef(6.0f) public void SingleMemberFloatArrOvrdDef() {} + @SingleMemberDoubleArrayDef(7.0) public void SingleMemberDoubleArrOvrdDef() {} + @SingleMemberBooleanArrayDef(true) public void SingleMemberBooleanArrOvrdDef(){} + @SingleMemberStringArrayDef("custom") public void SingleMemberStringArrOvrdDef() {} + @SingleMemberClassArrayDef(Map.class) public void SingleMemberClassArrOvrdDef() {} + @SingleMemberEnumArrayDef(Stooge.MOE) public void SingleMemberEnumArrOvrdDef() {} + + // Single member array with default - accept + @SingleMemberByteArrayDef public void SingleMemberByteArrAcceptDef() {} + @SingleMemberShortArrayDef public void SingleMemberShortArrAcceptDef() {} + @SingleMemberIntArrayDef public void SingleMemberIntArrAcceptDef() {} + @SingleMemberLongArrayDef public void SingleMemberLongArrAcceptDef() {} + @SingleMemberCharArrayDef public void SingleMemberCharArrAcceptDef() {} + @SingleMemberFloatArrayDef public void SingleMemberFloatArrAcceptDef() {} + @SingleMemberDoubleArrayDef public void SingleMemberDoubleArrAcceptDef() {} + @SingleMemberBooleanArrayDef public void SingleMemberBooleanArrAcceptDef() {} + @SingleMemberStringArrayDef public void SingleMemberStringArrAcceptDef() {} + @SingleMemberClassArrayDef public void SingleMemberClassArrAcceptDef() {} + @SingleMemberEnumArrayDef public void SingleMemberEnumArrAcceptDef() {} + + // ANNOTATED FIELDS + @ScalarTypes ( + b = 1, + s = 2, + i = 3, + l = 4L, + c = '5', + f = 6.0f, + d = 7.0, + bool = true, + str = "custom", + cls = Map.class, + e = Stooge.MOE, + a = @Point(x = 1, y = 2) + ) + public int scalarTypesField; + + @ScalarTypesWithDefault ( ) + public int scalarTypesAcceptDefaultField; + + @ScalarTypesWithDefault ( + b = 1, + s = 2, + i = 3, + l = 4L, + c = '5', + f = 6.0f, + d = 7.0, + bool = true, + str = "custom", + cls = Map.class, + e = Stooge.MOE + ) + public int scalarTypesOverrideDefaultField; + + @ArrayTypes ( + b = { }, + s = { }, + i = { }, + l = { }, + c = { }, + f = { }, + d = { }, + bool = { }, + str = { }, + cls = { }, + e = { }, + a = { } + ) + public int emptyArrayTypesField; + + @ArrayTypes ( + b = 1, + s = 2, + i = 3, + l = 4L, + c = '5', + f = 6.0f, + d = 7.0, + bool = true, + str = "custom", + cls = Map.class, + e = Stooge.MOE, + a = { @Point(x = 1, y = 2) } + ) + public int singleElementArrayTypesField; + + @ArrayTypes ( + b = { 1, 2 }, + s = { 2, 3 }, + i = { 3, 4 }, + l = { 4L, 5L }, + c = { '5', '6' }, + f = { 6.0f, 7.0f }, + d = { 7.0, 8.0 }, + bool = { true, false }, + str = { "custom", "paint" }, + cls = { Map.class, Set.class }, + e = { Stooge.MOE, Stooge.CURLY }, + a = { @Point(x = 1, y = 2), @Point(x = 3, y = 4) } + ) + public int twoElementArrayTypesField; + + @ArrayTypesWithDefault ( ) + public int arrayTypesAcceptDefaultField; + + @ArrayTypesWithDefault ( + b = 1, + s = 2, + i = 3, + l = 4L, + c = '5', + f = 6.0f, + d = 7.0, + bool = true, + str = "custom", + cls = Map.class, + e = Stooge.MOE, + a = { @Point(x = 1, y = 2) } + ) + public int arrayTypesOverrideDefaultField; + + @Marker public int markerField; + + // Single-member (shorthand) + @SingleMemberByte(1) public int SingleMemberByteField; + @SingleMemberShort(2) public int SingleMemberShortField; + @SingleMemberInt(3) public int SingleMemberIntField; + @SingleMemberLong(4L) public int SingleMemberLongField; + @SingleMemberChar('5') public int SingleMemberCharField; + @SingleMemberFloat(6.0f) public int SingleMemberFloatField; + @SingleMemberDouble(7.0) public int SingleMemberDoubleField; + @SingleMemberBoolean(true) public int SingleMemberBooleanField; + @SingleMemberString("custom") public int SingleMemberStringField; + @SingleMemberClass(Map.class) public int SingleMemberClassField; + @SingleMemberEnum(Stooge.MOE) public int SingleMemberEnumField; + + // Single-member with default (Override) + @SingleMemberByteWithDef(1) public int SingleMemberByteOvrdDefField; + @SingleMemberShortWithDef(2) public int SingleMemberShortOvrdDefField; + @SingleMemberIntWithDef(3) public int SingleMemberIntOvrdDefField; + @SingleMemberLongWithDef(4L) public int SingleMemberLongOvrdDefField; + @SingleMemberCharWithDef('5') public int SingleMemberCharOvrdDefField; + @SingleMemberFloatWithDef(6.0f) public int SingleMemberFloatOvrdDefField; + @SingleMemberDoubleWithDef(7.0) public int SingleMemberDoubleOvrdDefField; + @SingleMemberBooleanWithDef(true) public int SingleMemberBooleanOvrdDefField; + @SingleMemberStringWithDef("custom") public int SingleMemberStringOvrdDefField; + @SingleMemberClassWithDef(Map.class) public int SingleMemberClassOvrdDefField; + @SingleMemberEnumWithDef(Stooge.MOE) public int SingleMemberEnumOvrdDefField; + + // Single-member with default (Accept) + @SingleMemberByteWithDef public int SingleMemberByteAcceptDefField; + @SingleMemberShortWithDef public int SingleMemberShortAcceptDefField; + @SingleMemberIntWithDef public int SingleMemberIntAcceptDefField; + @SingleMemberLongWithDef public int SingleMemberLongAcceptDefField; + @SingleMemberCharWithDef public int SingleMemberCharAcceptDefField; + @SingleMemberFloatWithDef public int SingleMemberFloatAcceptDefField; + @SingleMemberDoubleWithDef public int SingleMemberDoubleAcceptDefField; + @SingleMemberBooleanWithDef public int SingleMemberBooleanAcceptDefField; + @SingleMemberStringWithDef public int SingleMemberStringAcceptDefField; + @SingleMemberClassWithDef public int SingleMemberClassAcceptDefField; + @SingleMemberEnumWithDef public int SingleMemberEnumAcceptDefField; + + // Single member array (empty array) + @SingleMemberByteArray({}) public int SingleMemberByteArrEmptyField; + @SingleMemberShortArray({}) public int SingleMemberShortArrEmptyField; + @SingleMemberIntArray({}) public int SingleMemberIntArrEmptyField; + @SingleMemberLongArray({}) public int SingleMemberLongArrEmptyField; + @SingleMemberCharArray({}) public int SingleMemberCharArrEmptyField; + @SingleMemberFloatArray({}) public int SingleMemberFloatArrEmptyField; + @SingleMemberDoubleArray({}) public int SingleMemberDoubleArrEmptyField; + @SingleMemberBooleanArray({})public int SingleMemberBooleanArrEmptyField; + @SingleMemberStringArray({}) public int SingleMemberStringArrEmptyField; + @SingleMemberClassArray({}) public int SingleMemberClassArrEmptyField; + @SingleMemberEnumArray({}) public int SingleMemberEnumArrEmptyField; + + // Single member array (one-element shorthand) + @SingleMemberByteArray(1) public int SingleMemberByteArrOneField; + @SingleMemberShortArray(2) public int SingleMemberShortArrOneField; + @SingleMemberIntArray(3) public int SingleMemberIntArrOneField; + @SingleMemberLongArray(4L) public int SingleMemberLongArrOneField; + @SingleMemberCharArray('5') public int SingleMemberCharArrOneField; + @SingleMemberFloatArray(6.0f) public int SingleMemberFloatArrOneField; + @SingleMemberDoubleArray(7.0) public int SingleMemberDoubleArrOneField; + @SingleMemberBooleanArray(true) public int SingleMemberBooleanArrOneField; + @SingleMemberStringArray("custom") public int SingleMemberStringArrOneField; + @SingleMemberClassArray(Map.class) public int SingleMemberClassArrOneField; + @SingleMemberEnumArray(Stooge.MOE) public int SingleMemberEnumArrOneField; + + // Single member array (two elements) + @SingleMemberByteArray({1, 2}) public int SingleMemberByteArrTwoField; + @SingleMemberShortArray({2, 3}) public int SingleMemberShortArrTwoField; + @SingleMemberIntArray({3, 4}) public int SingleMemberIntArrTwoField; + @SingleMemberLongArray({4L, 5L}) public int SingleMemberLongArrTwoField; + @SingleMemberCharArray({'5', '6'}) public int SingleMemberCharArrTwoField; + @SingleMemberFloatArray({6.0f, 7.0f}) public int SingleMemberFloatArrTwoField; + @SingleMemberDoubleArray({7.0, 8.0}) public int SingleMemberDoubleArrTwoField; + @SingleMemberBooleanArray({true,false}) public int SingleMemberBooleanArrTwoField; + @SingleMemberStringArray({"custom", "paint"}) public int SingleMemberStringArrTwoField; + @SingleMemberClassArray({Map.class, Set.class}) public int SingleMemberClassArrTwoField; + @SingleMemberEnumArray({Stooge.MOE, Stooge.CURLY}) public int SingleMemberEnumArrTwoField; + + // Single member array with default (override) + @SingleMemberByteArrayDef(1) public int SingleMemberByteArrOvrdDefField; + @SingleMemberShortArrayDef(2) public int SingleMemberShortArrOvrdDefField; + @SingleMemberIntArrayDef(3) public int SingleMemberIntArrOvrdDefField; + @SingleMemberLongArrayDef(4L) public int SingleMemberLongArrOvrdDefField; + @SingleMemberCharArrayDef('5') public int SingleMemberCharArrOvrdDefField; + @SingleMemberFloatArrayDef(6.0f) public int SingleMemberFloatArrOvrdDefField; + @SingleMemberDoubleArrayDef(7.0) public int SingleMemberDoubleArrOvrdDefField; + @SingleMemberBooleanArrayDef(true) public int SingleMemberBooleanArrOvrdDefField; + @SingleMemberStringArrayDef("custom") public int SingleMemberStringArrOvrdDefField; + @SingleMemberClassArrayDef(Map.class) public int SingleMemberClassArrOvrdDefField; + @SingleMemberEnumArrayDef(Stooge.MOE) public int SingleMemberEnumArrOvrdDefField; + + // Single member array with default - accept + @SingleMemberByteArrayDef public int SingleMemberByteArrAcceptDefField; + @SingleMemberShortArrayDef public int SingleMemberShortArrAcceptDefField; + @SingleMemberIntArrayDef public int SingleMemberIntArrAcceptDefField; + @SingleMemberLongArrayDef public int SingleMemberLongArrAcceptDefField; + @SingleMemberCharArrayDef public int SingleMemberCharArrAcceptDefField; + @SingleMemberFloatArrayDef public int SingleMemberFloatArrAcceptDefField; + @SingleMemberDoubleArrayDef public int SingleMemberDoubleArrAcceptDefField; + @SingleMemberBooleanArrayDef public int SingleMemberBooleanArrAcceptDefField; + @SingleMemberStringArrayDef public int SingleMemberStringArrAcceptDefField; + @SingleMemberClassArrayDef public int SingleMemberClassArrAcceptDefField; + @SingleMemberEnumArrayDef public int SingleMemberEnumArrAcceptDefField; + + // ANNOTATED ENUM CONSTANTS + enum TestType { + @ScalarTypes ( + b = 1, + s = 2, + i = 3, + l = 4L, + c = '5', + f = 6.0f, + d = 7.0, + bool = true, + str = "custom", + cls = Map.class, + e = Stooge.MOE, + a = @Point(x = 1, y = 2) + ) + scalarTypesField, + + @ScalarTypesWithDefault ( ) + scalarTypesAcceptDefaultField, + + @ScalarTypesWithDefault ( + b = 1, + s = 2, + i = 3, + l = 4L, + c = '5', + f = 6.0f, + d = 7.0, + bool = true, + str = "custom", + cls = Map.class, + e = Stooge.MOE + ) + scalarTypesOverrideDefaultField, + + @ArrayTypes ( + b = { }, + s = { }, + i = { }, + l = { }, + c = { }, + f = { }, + d = { }, + bool = { }, + str = { }, + cls = { }, + e = { }, + a = { } + ) + emptyArrayTypesField, + + @ArrayTypes ( + b = 1, + s = 2, + i = 3, + l = 4L, + c = '5', + f = 6.0f, + d = 7.0, + bool = true, + str = "custom", + cls = Map.class, + e = Stooge.MOE, + a = @Point(x = 1, y = 2) + ) + singleElementArrayTypesField, + + @ArrayTypes ( + b = { 1, 2 }, + s = { 2, 3 }, + i = { 3, 4 }, + l = { 4L, 5L }, + c = { '5', '6' }, + f = { 6.0f, 7.0f }, + d = { 7.0, 8.0 }, + bool = { true, false }, + str = { "custom", "paint" }, + cls = { Map.class, Set.class }, + e = { Stooge.MOE, Stooge.CURLY }, + a = { @Point(x = 1, y = 2), @Point(x = 3, y = 4) } + ) + twoElementArrayTypesField, + + @ArrayTypesWithDefault ( ) + arrayTypesAcceptDefaultField, + + @ArrayTypesWithDefault ( + b = 1, + s = 2, + i = 3, + l = 4L, + c = '5', + f = 6.0f, + d = 7.0, + bool = true, + str = "custom", + cls = Map.class, + e = Stooge.MOE, + a = { @Point(x = 1, y = 2) } + ) + arrayTypesOverrideDefaultField, + + // marker + @Marker marker, + + // Single-member (shorthand) + @SingleMemberByte(1) SingleMemberByte, + @SingleMemberShort(2) SingleMemberShort, + @SingleMemberInt(3) SingleMemberInt, + @SingleMemberLong(4L) SingleMemberLong, + @SingleMemberChar('5') SingleMemberChar, + @SingleMemberFloat(6.0f) SingleMemberFloat, + @SingleMemberDouble(7.0) SingleMemberDouble, + @SingleMemberBoolean(true) SingleMemberBoolean, + @SingleMemberString("custom") SingleMemberString, + @SingleMemberClass(Map.class) SingleMemberClass, + @SingleMemberEnum(Stooge.MOE) SingleMemberEnum, + + // Single-member with default (Override) + @SingleMemberByteWithDef(1) SingleMemberByteOvrdDef, + @SingleMemberShortWithDef(2) SingleMemberShortOvrdDef, + @SingleMemberIntWithDef(3) SingleMemberIntOvrdDef, + @SingleMemberLongWithDef(4L) SingleMemberLongOvrdDef, + @SingleMemberCharWithDef('5') SingleMemberCharOvrdDef, + @SingleMemberFloatWithDef(6.0f) SingleMemberFloatOvrdDef, + @SingleMemberDoubleWithDef(7.0) SingleMemberDoubleOvrdDef, + @SingleMemberBooleanWithDef(true) SingleMemberBooleanOvrdDef, + @SingleMemberStringWithDef("custom") SingleMemberStringOvrdDef, + @SingleMemberClassWithDef(Map.class) SingleMemberClassOvrdDef, + @SingleMemberEnumWithDef(Stooge.MOE) SingleMemberEnumOvrdDef, + + // Single-member with default (Accept) + @SingleMemberByteWithDef SingleMemberByteAcceptDef, + @SingleMemberShortWithDef SingleMemberShortAcceptDef, + @SingleMemberIntWithDef SingleMemberIntAcceptDef, + @SingleMemberLongWithDef SingleMemberLongAcceptDef, + @SingleMemberCharWithDef SingleMemberCharAcceptDef, + @SingleMemberFloatWithDef SingleMemberFloatAcceptDef, + @SingleMemberDoubleWithDef SingleMemberDoubleAcceptDef, + @SingleMemberBooleanWithDef SingleMemberBooleanAcceptDef, + @SingleMemberStringWithDef SingleMemberStringAcceptDef, + @SingleMemberClassWithDef SingleMemberClassAcceptDef, + @SingleMemberEnumWithDef SingleMemberEnumAcceptDef, + + // Single member array (empty array) + @SingleMemberByteArray({}) SingleMemberByteArrEmpty, + @SingleMemberShortArray({}) SingleMemberShortArrEmpty, + @SingleMemberIntArray({}) SingleMemberIntArrEmpty, + @SingleMemberLongArray({}) SingleMemberLongArrEmpty, + @SingleMemberCharArray({}) SingleMemberCharArrEmpty, + @SingleMemberFloatArray({}) SingleMemberFloatArrEmpty, + @SingleMemberDoubleArray({}) SingleMemberDoubleArrEmpty, + @SingleMemberBooleanArray({})SingleMemberBooleanArrEmpty, + @SingleMemberStringArray({}) SingleMemberStringArrEmpty, + @SingleMemberClassArray({}) SingleMemberClassArrEmpty, + @SingleMemberEnumArray({}) SingleMemberEnumArrEmpty, + + // Single member array (one-element shorthand) + @SingleMemberByteArray(1) SingleMemberByteArrOne, + @SingleMemberShortArray(2) SingleMemberShortArrOne, + @SingleMemberIntArray(3) SingleMemberIntArrOne, + @SingleMemberLongArray(4L) SingleMemberLongArrOne, + @SingleMemberCharArray('5') SingleMemberCharArrOne, + @SingleMemberFloatArray(6.0f) SingleMemberFloatArrOne, + @SingleMemberDoubleArray(7.0) SingleMemberDoubleArrOne, + @SingleMemberBooleanArray(true) SingleMemberBooleanArrOne, + @SingleMemberStringArray("custom") SingleMemberStringArrOne, + @SingleMemberClassArray(Map.class) SingleMemberClassArrOne, + @SingleMemberEnumArray(Stooge.MOE) SingleMemberEnumArrOne, + + // Single member array (two elements) + @SingleMemberByteArray({1, 2}) SingleMemberByteArrTwo, + @SingleMemberShortArray({2, 3}) SingleMemberShortArrTwo, + @SingleMemberIntArray({3, 4}) SingleMemberIntArrTwo, + @SingleMemberLongArray({4L, 5L}) SingleMemberLongArrTwo, + @SingleMemberCharArray({'5', '6'}) SingleMemberCharArrTwo, + @SingleMemberFloatArray({6.0f, 7.0f}) SingleMemberFloatArrTwo, + @SingleMemberDoubleArray({7.0, 8.0}) SingleMemberDoubleArrTwo, + @SingleMemberBooleanArray({true,false}) SingleMemberBooleanArrTwo, + @SingleMemberStringArray({"custom", "paint"}) SingleMemberStringArrTwo, + @SingleMemberClassArray({Map.class, Set.class}) SingleMemberClassArrTwo, + @SingleMemberEnumArray({Stooge.MOE, Stooge.CURLY}) SingleMemberEnumArrTwo, + + // Single member array with default (override) + @SingleMemberByteArrayDef(1) SingleMemberByteArrOvrdDef, + @SingleMemberShortArrayDef(2) SingleMemberShortArrOvrdDef, + @SingleMemberIntArrayDef(3) SingleMemberIntArrOvrdDef, + @SingleMemberLongArrayDef(4L) SingleMemberLongArrOvrdDef, + @SingleMemberCharArrayDef('5') SingleMemberCharArrOvrdDef, + @SingleMemberFloatArrayDef(6.0f) SingleMemberFloatArrOvrdDef, + @SingleMemberDoubleArrayDef(7.0) SingleMemberDoubleArrOvrdDef, + @SingleMemberBooleanArrayDef(true) SingleMemberBooleanArrOvrdDef, + @SingleMemberStringArrayDef("custom") SingleMemberStringArrOvrdDef, + @SingleMemberClassArrayDef(Map.class) SingleMemberClassArrOvrdDef, + @SingleMemberEnumArrayDef(Stooge.MOE) SingleMemberEnumArrOvrdDef, + + // Single member array with default - accept + @SingleMemberByteArrayDef SingleMemberByteArrAcceptDef, + @SingleMemberShortArrayDef SingleMemberShortArrAcceptDef, + @SingleMemberIntArrayDef SingleMemberIntArrAcceptDef, + @SingleMemberLongArrayDef SingleMemberLongArrAcceptDef, + @SingleMemberCharArrayDef SingleMemberCharArrAcceptDef, + @SingleMemberFloatArrayDef SingleMemberFloatArrAcceptDef, + @SingleMemberDoubleArrayDef SingleMemberDoubleArrAcceptDef, + @SingleMemberBooleanArrayDef SingleMemberBooleanArrAcceptDef, + @SingleMemberStringArrayDef SingleMemberStringArrAcceptDef, + @SingleMemberClassArrayDef SingleMemberClassArrAcceptDef, + @SingleMemberEnumArrayDef SingleMemberEnumArrAcceptDef, + } + + // ANNOTATED CONSTRUCTORS + + @ScalarTypes ( + b = 1, + s = 2, + i = 3, + l = 4L, + c = '5', + f = 6.0f, + d = 7.0, + bool = true, + str = "custom", + cls = Map.class, + e = Stooge.MOE, + a = @Point(x = 1, y = 2) + ) + public UnitTest(Iterator it) { } // scalar types + + @ScalarTypesWithDefault ( ) + public UnitTest(Set s) { } // scalarTypesAcceptDefault + + @ScalarTypesWithDefault ( + b = 1, + s = 2, + i = 3, + l = 4L, + c = '5', + f = 6.0f, + d = 7.0, + bool = true, + str = "custom", + cls = Map.class, + e = Stooge.MOE + ) + public UnitTest(Map s) { } // scalarTypesOverrideDefault + + @ArrayTypes ( + b = { }, + s = { }, + i = { }, + l = { }, + c = { }, + f = { }, + d = { }, + bool = { }, + str = { }, + cls = { }, + e = { }, + a = { } + ) + public UnitTest(List l){ } // emptyArrayTypes + + @ArrayTypes ( + b = 1, + s = 2, + i = 3, + l = 4L, + c = '5', + f = 6.0f, + d = 7.0, + bool = true, + str = "custom", + cls = Map.class, + e = Stooge.MOE, + a = @Point(x = 1, y = 2) + ) + public UnitTest(Collection c) { } // singleElementArrayTypes + + @ArrayTypes ( + b = { 1, 2 }, + s = { 2, 3 }, + i = { 3, 4 }, + l = { 4L, 5L }, + c = { '5', '6' }, + f = { 6.0f, 7.0f }, + d = { 7.0, 8.0 }, + bool = { true, false }, + str = { "custom", "paint" }, + cls = { Map.class, Set.class }, + e = { Stooge.MOE, Stooge.CURLY }, + a = { @Point(x = 1, y = 2), @Point(x = 3, y = 4) } + ) + public UnitTest(SortedSet ss) { } // twoElementArrayTypes + + @ArrayTypesWithDefault ( ) + public UnitTest(SortedMap sm) { } // arrayTypesAcceptDefault + + @ArrayTypesWithDefault ( + b = 1, + s = 2, + i = 3, + l = 4L, + c = '5', + f = 6.0f, + d = 7.0, + bool = true, + str = "custom", + cls = Map.class, + e = Stooge.MOE, + a = { @Point(x = 1, y = 2) } + ) + public UnitTest(RandomAccess r) { } // arrayTypesOverrideDefault + + // Marker + @Marker public UnitTest() { } // marker + + // Single-member (shorthand) + @SingleMemberByte(1) public UnitTest(byte b) { } + @SingleMemberShort(2) public UnitTest(short s) { } + @SingleMemberInt(3) public UnitTest(int i) { } + @SingleMemberLong(4L) public UnitTest(long l) { } + @SingleMemberChar('5') public UnitTest(char c) { } + @SingleMemberFloat(6.0f) public UnitTest(float f) { } + @SingleMemberDouble(7.0) public UnitTest(double d) { } + @SingleMemberBoolean(true) public UnitTest(boolean b) { } + @SingleMemberString("custom") public UnitTest(String s) { } + @SingleMemberClass(Map.class) public UnitTest(Class c) { } + @SingleMemberEnum(Stooge.MOE) public UnitTest(Enum e) { } + + // Single-member with default (Override) + @SingleMemberByteWithDef(1) public UnitTest(byte b, Set s) { } + @SingleMemberShortWithDef(2) public UnitTest(short s, Set x) { } + @SingleMemberIntWithDef(3) public UnitTest(int i, Set s) { } + @SingleMemberLongWithDef(4L) public UnitTest(long l, Set s) { } + @SingleMemberCharWithDef('5') public UnitTest(char c, Set s) { } + @SingleMemberFloatWithDef(6.0f) public UnitTest(float f, Set s) { } + @SingleMemberDoubleWithDef(7.0) public UnitTest(double d, Set s) { } + @SingleMemberBooleanWithDef(true) public UnitTest(boolean b, Set s) { } + @SingleMemberStringWithDef("custom") public UnitTest(String s, Set x) { } + @SingleMemberClassWithDef(Map.class) public UnitTest(Class c, Set s) { } + @SingleMemberEnumWithDef(Stooge.MOE) public UnitTest(Enum e, Set s) { } + + // Single-member with default (Accept) + @SingleMemberByteWithDef public UnitTest(byte b, Map m) { } + @SingleMemberShortWithDef public UnitTest(short s, Map m) { } + @SingleMemberIntWithDef public UnitTest(int i, Map m) { } + @SingleMemberLongWithDef public UnitTest(long l, Map m) { } + @SingleMemberCharWithDef public UnitTest(char c, Map m) { } + @SingleMemberFloatWithDef public UnitTest(float f, Map m) { } + @SingleMemberDoubleWithDef public UnitTest(double d, Map m) { } + @SingleMemberBooleanWithDef public UnitTest(boolean b, Map m) { } + @SingleMemberStringWithDef public UnitTest(String s, Map m) { } + @SingleMemberClassWithDef public UnitTest(Class c, Map m) { } + @SingleMemberEnumWithDef public UnitTest(Enum e, Map m) { } + + // Single member array (empty array) + @SingleMemberByteArray({}) public UnitTest(byte[] b) { } + @SingleMemberShortArray({}) public UnitTest(short[] s) { } + @SingleMemberIntArray({}) public UnitTest(int[] i) { } + @SingleMemberLongArray({}) public UnitTest(long[] l) { } + @SingleMemberCharArray({}) public UnitTest(char[] c) { } + @SingleMemberFloatArray({}) public UnitTest(float[] f) { } + @SingleMemberDoubleArray({}) public UnitTest(double[] d) { } + @SingleMemberBooleanArray({})public UnitTest(boolean[] b) { } + @SingleMemberStringArray({}) public UnitTest(String[] s) { } + @SingleMemberClassArray({}) public UnitTest(Class[] c) { } + @SingleMemberEnumArray({}) public UnitTest(Enum[] e) { } + + // Single member array (one-element shorthand) + @SingleMemberByteArray(1) public UnitTest(byte[] b, Set s) { } + @SingleMemberShortArray(2) public UnitTest(short[] s, Set x) { } + @SingleMemberIntArray(3) public UnitTest(int[] i, Set s) { } + @SingleMemberLongArray(4L) public UnitTest(long[] l, Set s) { } + @SingleMemberCharArray('5') public UnitTest(char[] c, Set s) { } + @SingleMemberFloatArray(6.0f) public UnitTest(float[] f, Set s) { } + @SingleMemberDoubleArray(7.0) public UnitTest(double[] d, Set s) { } + @SingleMemberBooleanArray(true) public UnitTest(boolean[] b, Set s) { } + @SingleMemberStringArray("custom") public UnitTest(String[] s, Set x) { } + @SingleMemberClassArray(Map.class) public UnitTest(Class[] c, Set s) { } + @SingleMemberEnumArray(Stooge.MOE) public UnitTest(Enum[] e, Set s) { } + + // Single member array (two elements) + @SingleMemberByteArray({1, 2}) public UnitTest(byte[] b, Map m) { } + @SingleMemberShortArray({2, 3}) public UnitTest(short[] s, Map m) { } + @SingleMemberIntArray({3, 4}) public UnitTest(int[] i, Map m) { } + @SingleMemberLongArray({4L, 5L}) public UnitTest(long[] l, Map m) { } + @SingleMemberCharArray({'5', '6'}) public UnitTest(char[] c, Map m) { } + @SingleMemberFloatArray({6.0f, 7.0f}) public UnitTest(float[] f, Map m) { } + @SingleMemberDoubleArray({7.0, 8.0}) public UnitTest(double[] d, Map m) { } + @SingleMemberBooleanArray({true, false}) public UnitTest(boolean[] b, Map m) { } + @SingleMemberStringArray({"custom", "paint"}) public UnitTest(String[] s, Map m) { } + @SingleMemberClassArray({Map.class,Set.class}) public UnitTest(Class[] c, Map m) { } + @SingleMemberEnumArray({Stooge.MOE, Stooge.CURLY}) public UnitTest(Enum[] e, Map m) { } + + + // Single member array with default (override) + @SingleMemberByteArrayDef(1) public UnitTest(byte[] b, List l) { } + @SingleMemberShortArrayDef(2) public UnitTest(short[] s, List l) { } + @SingleMemberIntArrayDef(3) public UnitTest(int[] i, List l) { } + @SingleMemberLongArrayDef(4L) public UnitTest(long[] l, List x) { } + @SingleMemberCharArrayDef('5') public UnitTest(char[] c, List l) { } + @SingleMemberFloatArrayDef(6.0f) public UnitTest(float[] f, List l) { } + @SingleMemberDoubleArrayDef(7.0) public UnitTest(double[] d, List l) { } + @SingleMemberBooleanArrayDef(true) public UnitTest(boolean[] b, List l) { } + @SingleMemberStringArrayDef("custom") public UnitTest(String[] s, List l) { } + @SingleMemberClassArrayDef(Map.class) public UnitTest(Class[] c, List l) { } + @SingleMemberEnumArrayDef(Stooge.MOE) public UnitTest(Enum[] e, List l) { } + + // Single member array with default - accept + @SingleMemberByteArrayDef public UnitTest(byte[] b, Collection c) { } + @SingleMemberShortArrayDef public UnitTest(short[] s, Collection c) { } + @SingleMemberIntArrayDef public UnitTest(int[] i, Collection c) { } + @SingleMemberLongArrayDef public UnitTest(long[] l, Collection c) { } + @SingleMemberCharArrayDef public UnitTest(char[] c, Collection x) { } + @SingleMemberFloatArrayDef public UnitTest(float[] f, Collection c) { } + @SingleMemberDoubleArrayDef public UnitTest(double[] d, Collection c) { } + @SingleMemberBooleanArrayDef public UnitTest(boolean[] b, Collection c) { } + @SingleMemberStringArrayDef public UnitTest(String[] s, Collection c) { } + @SingleMemberClassArrayDef public UnitTest(Class[] c, Collection x) { } + @SingleMemberEnumArrayDef public UnitTest(Enum[] e, Collection c) { } + + // ANNOTATED PARAMETERS + + public void scalarTypesParam( + @ScalarTypes ( + b = 1, + s = 2, + i = 3, + l = 4L, + c = '5', + f = 6.0f, + d = 7.0, + bool = true, + str = "custom", + cls = Map.class, + e = Stooge.MOE, + a = @Point(x = 1, y = 2) + ) + int x) { } + + + public void scalarTypesAcceptDefaultParam( + @ScalarTypesWithDefault int x) { } + + public void scalarTypesOverrideDefaultParam( + @ScalarTypesWithDefault ( + b = 1, + s = 2, + i = 3, + l = 4L, + c = '5', + f = 6.0f, + d = 7.0, + bool = true, + str = "custom", + cls = Map.class, + e = Stooge.MOE + ) + int x) { } + + public void emptyArrayTypesParam( + @ArrayTypes ( + b = { }, + s = { }, + i = { }, + l = { }, + c = { }, + f = { }, + d = { }, + bool = { }, + str = { }, + cls = { }, + e = { }, + a = { } + ) + int x) { } + + public void singleElementArrayTypesParam( + @ArrayTypes ( + b = 1, + s = 2, + i = 3, + l = 4L, + c = '5', + f = 6.0f, + d = 7.0, + bool = true, + str = "custom", + cls = Map.class, + e = Stooge.MOE, + a = @Point(x = 1, y = 2) + ) + int x) { } + + public void twoElementArrayTypesParam( + @ArrayTypes ( + b = { 1, 2 }, + s = { 2, 3 }, + i = { 3, 4 }, + l = { 4L, 5L }, + c = { '5', '6' }, + f = { 6.0f, 7.0f }, + d = { 7.0, 8.0 }, + bool = { true, false }, + str = { "custom", "paint" }, + cls = { Map.class, Set.class }, + e = { Stooge.MOE, Stooge.CURLY }, + a = { @Point(x = 1, y = 2), @Point(x = 3, y = 4) } + ) + int x) { } + + public void arrayTypesAcceptDefaultParam( + @ArrayTypesWithDefault + int x) { } + + public void arrayTypesOverrideDefaultParam( + @ArrayTypesWithDefault ( + b = 1, + s = 2, + i = 3, + l = 4L, + c = '5', + f = 6.0f, + d = 7.0, + bool = true, + str = "custom", + cls = Map.class, + e = Stooge.MOE, + a = { @Point(x = 1, y = 2) } + ) + int x) { } + + // Marker + public void markerParam(@Marker int x) { } + + // Single-member (shorthand) + public void SingleMemberByteParam(@SingleMemberByte(1) int x) {} + public void SingleMemberShortParam(@SingleMemberShort(2) int x) {} + public void SingleMemberIntParam(@SingleMemberInt(3) int x) {} + public void SingleMemberLongParam(@SingleMemberLong(4L) int x) {} + public void SingleMemberCharParam(@SingleMemberChar('5') int x) {} + public void SingleMemberFloatParam(@SingleMemberFloat(6.0f) int x) {} + public void SingleMemberDoubleParam(@SingleMemberDouble(7.0) int x) {} + public void SingleMemberBooleanParam(@SingleMemberBoolean(true) int x) {} + public void SingleMemberStringParam(@SingleMemberString("custom") int x) {} + public void SingleMemberClassParam(@SingleMemberClass(Map.class) int x) {} + public void SingleMemberEnumParam(@SingleMemberEnum(Stooge.MOE) int x) {} + + // Single-member with default (Override) + public void SingleMemberByteOvrdDefParam(@SingleMemberByteWithDef(1) int x) {} + public void SingleMemberShortOvrdDefParam(@SingleMemberShortWithDef(2) int x) {} + public void SingleMemberIntOvrdDefParam(@SingleMemberIntWithDef(3) int x) {} + public void SingleMemberLongOvrdDefParam(@SingleMemberLongWithDef(4L) int x) {} + public void SingleMemberCharOvrdDefParam(@SingleMemberCharWithDef('5') int x) {} + public void SingleMemberFloatOvrdDefParam(@SingleMemberFloatWithDef(6.0f) int x) {} + public void SingleMemberDoubleOvrdDefParam(@SingleMemberDoubleWithDef(7.0) int x) {} + public void SingleMemberBooleanOvrdDefParam(@SingleMemberBooleanWithDef(true) int x) {} + public void SingleMemberStringOvrdDefParam(@SingleMemberStringWithDef("custom") int x) {} + public void SingleMemberClassOvrdDefParam(@SingleMemberClassWithDef(Map.class) int x) {} + public void SingleMemberEnumOvrdDefParam(@SingleMemberEnumWithDef(Stooge.MOE) int x) {} + + // Single-member with default (Accept) + public void SingleMemberByteAcceptDefParam(@SingleMemberByteWithDef int x) {} + public void SingleMemberShortAcceptDefParam(@SingleMemberShortWithDef int x) {} + public void SingleMemberIntAcceptDefParam(@SingleMemberIntWithDef int x) {} + public void SingleMemberLongAcceptDefParam(@SingleMemberLongWithDef int x) {} + public void SingleMemberCharAcceptDefParam(@SingleMemberCharWithDef int x) {} + public void SingleMemberFloatAcceptDefParam(@SingleMemberFloatWithDef int x) {} + public void SingleMemberDoubleAcceptDefParam(@SingleMemberDoubleWithDef int x) {} + public void SingleMemberBooleanAcceptDefParam(@SingleMemberBooleanWithDef int x){} + public void SingleMemberStringAcceptDefParam(@SingleMemberStringWithDef int x) {} + public void SingleMemberClassAcceptDefParam(@SingleMemberClassWithDef int x) {} + public void SingleMemberEnumAcceptDefParam(@SingleMemberEnumWithDef int x) {} + + // Single member array (empty array) + public void SingleMemberByteArrEmptyParam(@SingleMemberByteArray({}) int x) {} + public void SingleMemberShortArrEmptyParam(@SingleMemberShortArray({}) int x) {} + public void SingleMemberIntArrEmptyParam(@SingleMemberIntArray({}) int x) {} + public void SingleMemberLongArrEmptyParam(@SingleMemberLongArray({}) int x) {} + public void SingleMemberCharArrEmptyParam(@SingleMemberCharArray({}) int x) {} + public void SingleMemberFloatArrEmptyParam(@SingleMemberFloatArray({}) int x) {} + public void SingleMemberDoubleArrEmptyParam(@SingleMemberDoubleArray({}) int x) {} + public void SingleMemberBooleanArrEmptyParam(@SingleMemberBooleanArray({}) int x) {} + public void SingleMemberStringArrEmptyParam(@SingleMemberStringArray({}) int x) {} + public void SingleMemberClassArrEmptyParam(@SingleMemberClassArray({}) int x) {} + public void SingleMemberEnumArrEmptyParam(@SingleMemberEnumArray({}) int x) {} + + // Single member array (one-element shorthand) + public void SingleMemberByteArrOneParam(@SingleMemberByteArray(1) int x) {} + public void SingleMemberShortArrOneParam(@SingleMemberShortArray(2) int x) {} + public void SingleMemberIntArrOneParam(@SingleMemberIntArray(3) int x) {} + public void SingleMemberLongArrOneParam(@SingleMemberLongArray(4L) int x) {} + public void SingleMemberCharArrOneParam(@SingleMemberCharArray('5') int x) {} + public void SingleMemberFloatArrOneParam(@SingleMemberFloatArray(6.0f) int x) {} + public void SingleMemberDoubleArrOneParam(@SingleMemberDoubleArray(7.0) int x) {} + public void SingleMemberBooleanArrOneParam(@SingleMemberBooleanArray(true) int x) {} + public void SingleMemberStringArrOneParam(@SingleMemberStringArray("custom") int x) {} + public void SingleMemberClassArrOneParam(@SingleMemberClassArray(Map.class) int x) {} + public void SingleMemberEnumArrOneParam(@SingleMemberEnumArray(Stooge.MOE) int x) {} + + // Single member array (two elements) + public void SingleMemberByteArrTwoParam(@SingleMemberByteArray({1, 2}) int x) {} + public void SingleMemberShortArrTwoParam(@SingleMemberShortArray({2, 3}) int x) {} + public void SingleMemberIntArrTwoParam(@SingleMemberIntArray({3, 4}) int x) {} + public void SingleMemberLongArrTwoParam(@SingleMemberLongArray({4L, 5L}) int x) {} + public void SingleMemberCharArrTwoParam(@SingleMemberCharArray({'5', '6'}) int x) {} + public void SingleMemberFloatArrTwoParam(@SingleMemberFloatArray({6.0f, 7.0f}) int x) {} + public void SingleMemberDoubleArrTwoParam(@SingleMemberDoubleArray({7.0, 8.0}) int x) {} + public void SingleMemberBooleanArrTwoParam(@SingleMemberBooleanArray({true, false}) int x){} + public void SingleMemberStringArrTwoParam(@SingleMemberStringArray({"custom", "paint"}) int x) {} + public void SingleMemberClassArrTwoParam(@SingleMemberClassArray({Map.class, Set.class}) int x) {} + public void SingleMemberEnumArrTwoParam(@SingleMemberEnumArray({Stooge.MOE, Stooge.CURLY}) int x) {} + + // Single member array with default (override) + public void SingleMemberByteArrOvrdDefParam(@SingleMemberByteArrayDef(1) int x) {} + public void SingleMemberShortArrOvrdDefParam(@SingleMemberShortArrayDef(2) int x) {} + public void SingleMemberIntArrOvrdDefParam(@SingleMemberIntArrayDef(3) int x) {} + public void SingleMemberLongArrOvrdDefParam(@SingleMemberLongArrayDef(4L) int x) {} + public void SingleMemberCharArrOvrdDefParam(@SingleMemberCharArrayDef('5') int x) {} + public void SingleMemberFloatArrOvrdDefParam(@SingleMemberFloatArrayDef(6.0f) int x) {} + public void SingleMemberDoubleArrOvrdDefParam(@SingleMemberDoubleArrayDef(7.0) int x) {} + public void SingleMemberBooleanArrOvrdDefParam(@SingleMemberBooleanArrayDef(true) int x){} + public void SingleMemberStringArrOvrdDefParam(@SingleMemberStringArrayDef("custom") int x) {} + public void SingleMemberClassArrOvrdDefParam(@SingleMemberClassArrayDef(Map.class) int x) {} + public void SingleMemberEnumArrOvrdDefParam(@SingleMemberEnumArrayDef(Stooge.MOE) int x) {} + + // Single member array with default - accept + public void SingleMemberByteArrAcceptDefParam(@SingleMemberByteArrayDef int x) {} + public void SingleMemberShortArrAcceptDefParam(@SingleMemberShortArrayDef int x) {} + public void SingleMemberIntArrAcceptDefParam(@SingleMemberIntArrayDef int x) {} + public void SingleMemberLongArrAcceptDefParam(@SingleMemberLongArrayDef int x) {} + public void SingleMemberCharArrAcceptDefParam(@SingleMemberCharArrayDef int x) {} + public void SingleMemberFloatArrAcceptDefParam(@SingleMemberFloatArrayDef int x) {} + public void SingleMemberDoubleArrAcceptDefParam(@SingleMemberDoubleArrayDef int x) {} + public void SingleMemberBooleanArrAcceptDefParam(@SingleMemberBooleanArrayDef int x){} + public void SingleMemberStringArrAcceptDefParam(@SingleMemberStringArrayDef int x) {} + public void SingleMemberClassArrAcceptDefParam(@SingleMemberClassArrayDef int x) {} + public void SingleMemberEnumArrAcceptDefParam(@SingleMemberEnumArrayDef int x) {} +} + +// Helper types + +enum Stooge { LARRY, MOE, CURLY } + +@Target({}) @interface Point { int x(); int y(); } + +// ANNOTATION TYPES + +@Retention(RUNTIME) @interface ScalarTypes { + byte b(); + short s(); + int i(); + long l(); + char c(); + float f(); + double d(); + boolean bool(); + String str(); + Class cls(); + Stooge e(); + Point a(); +} + +@Retention(RUNTIME) @interface ScalarTypesWithDefault { + byte b() default 11; + short s() default 12; + int i() default 13; + long l() default 14; + char c() default 'V'; + float f() default 16.0f; + double d() default 17.0; + boolean bool() default false; + String str() default "default"; + Class cls() default Class.class; + Stooge e() default Stooge.LARRY; + Point a() default @Point(x = 11, y = 12); +} + +@Retention(RUNTIME) @interface ArrayTypes { + byte[] b(); + short[] s(); + int[] i(); + long[] l(); + char[] c(); + float[] f(); + double[] d(); + boolean[] bool(); + String[] str(); + Class[] cls(); + Stooge[] e(); + Point[] a(); +} + +@Retention(RUNTIME) @interface ArrayTypesWithDefault { + byte[] b() default { 11 }; + short[] s() default { 12 }; + int[] i() default { 13 }; + long[] l() default { 14L }; + char[] c() default { 'V' }; + float[] f() default { 16.0f }; + double[] d() default { 17.0 }; + boolean[] bool() default { false }; + String[] str() default { "default" }; + Class[] cls() default { Class.class }; + Stooge[] e() default { Stooge.LARRY }; + Point[] a() default { @Point(x = 11, y = 12) }; +} + +@Retention(RUNTIME) @interface Marker { } + +@Retention(RUNTIME) @interface SingleMemberByte { byte value(); } +@Retention(RUNTIME) @interface SingleMemberShort { short value(); } +@Retention(RUNTIME) @interface SingleMemberInt { int value(); } +@Retention(RUNTIME) @interface SingleMemberLong { long value(); } +@Retention(RUNTIME) @interface SingleMemberChar { char value(); } +@Retention(RUNTIME) @interface SingleMemberFloat { float value(); } +@Retention(RUNTIME) @interface SingleMemberDouble { double value(); } +@Retention(RUNTIME) @interface SingleMemberBoolean { boolean value(); } +@Retention(RUNTIME) @interface SingleMemberString { String value(); } +@Retention(RUNTIME) @interface SingleMemberClass { Class value(); } +@Retention(RUNTIME) @interface SingleMemberEnum { Stooge value(); } + +@Retention(RUNTIME) @interface SingleMemberByteWithDef { byte value() default 11; } +@Retention(RUNTIME) @interface SingleMemberShortWithDef { short value() default 12; } +@Retention(RUNTIME) @interface SingleMemberIntWithDef { int value() default 13; } +@Retention(RUNTIME) @interface SingleMemberLongWithDef { long value() default 14; } +@Retention(RUNTIME) @interface SingleMemberCharWithDef { char value() default 'V'; } +@Retention(RUNTIME) @interface SingleMemberFloatWithDef { float value() default 16.0f; } +@Retention(RUNTIME) @interface SingleMemberDoubleWithDef { double value() default 17.0; } +@Retention(RUNTIME) @interface SingleMemberBooleanWithDef { boolean value() default false; } +@Retention(RUNTIME) @interface SingleMemberStringWithDef { String value() default "default"; } +@Retention(RUNTIME) @interface SingleMemberClassWithDef { Class value() default Class.class; } +@Retention(RUNTIME) @interface SingleMemberEnumWithDef { Stooge value() default Stooge.LARRY; } + +@Retention(RUNTIME) @interface SingleMemberByteArray { byte[] value(); } +@Retention(RUNTIME) @interface SingleMemberShortArray { short[] value(); } +@Retention(RUNTIME) @interface SingleMemberIntArray { int[] value(); } +@Retention(RUNTIME) @interface SingleMemberLongArray { long[] value(); } +@Retention(RUNTIME) @interface SingleMemberCharArray { char[] value(); } +@Retention(RUNTIME) @interface SingleMemberFloatArray { float[] value(); } +@Retention(RUNTIME) @interface SingleMemberDoubleArray { double[] value(); } +@Retention(RUNTIME) @interface SingleMemberBooleanArray { boolean[] value(); } +@Retention(RUNTIME) @interface SingleMemberStringArray { String[] value(); } +@Retention(RUNTIME) @interface SingleMemberClassArray { Class[] value(); } +@Retention(RUNTIME) @interface SingleMemberEnumArray { Stooge[] value(); } + +@Retention(RUNTIME) @interface SingleMemberByteArrayDef { byte[] value() default { 11 }; } +@Retention(RUNTIME) @interface SingleMemberShortArrayDef { short[] value() default { 12 }; } +@Retention(RUNTIME) @interface SingleMemberIntArrayDef { int[] value() default { 13 }; } +@Retention(RUNTIME) @interface SingleMemberLongArrayDef { long[] value() default { 14 }; } +@Retention(RUNTIME) @interface SingleMemberCharArrayDef { char[] value() default { 'V' }; } +@Retention(RUNTIME) @interface SingleMemberFloatArrayDef { float[] value() default { 16.0f };} +@Retention(RUNTIME) @interface SingleMemberDoubleArrayDef { double[] value() default { 17.0 }; } +@Retention(RUNTIME) @interface SingleMemberBooleanArrayDef { boolean[] value() default { false };} +@Retention(RUNTIME) @interface SingleMemberStringArrayDef { + String[] value() default {"default"}; +} +@Retention(RUNTIME) @interface SingleMemberClassArrayDef { + Class[] value() default {Class.class}; +} +@Retention(RUNTIME) @interface SingleMemberEnumArrayDef { + Stooge[] value() default {Stooge.LARRY}; +} + +// Annotation types for inheritance and declared-annotations tests +@Inherited @Retention(RUNTIME) @interface Foo { } + @Retention(RUNTIME) @interface Bar { } + + + // ANNOTATED CLASSES + + @ScalarTypes ( + b = 1, + s = 2, + i = 3, + l = 4L, + c = '5', + f = 6.0f, + d = 7.0, + bool = true, + str = "custom", + cls = Map.class, + e = Stooge.MOE, + a = @Point(x = 1, y = 2) + ) + class scalarTypesClass { } + + @ScalarTypesWithDefault ( ) + class scalarTypesAcceptDefaultClass { } + + @ScalarTypesWithDefault ( + b = 1, + s = 2, + i = 3, + l = 4L, + c = '5', + f = 6.0f, + d = 7.0, + bool = true, + str = "custom", + cls = Map.class, + e = Stooge.MOE + ) + class scalarTypesOverrideDefaultClass { } + + @ArrayTypes ( + b = { }, + s = { }, + i = { }, + l = { }, + c = { }, + f = { }, + d = { }, + bool = { }, + str = { }, + cls = { }, + e = { }, + a = { } + ) + class emptyArrayTypesClass { } + + @ArrayTypes ( + b = 1, + s = 2, + i = 3, + l = 4L, + c = '5', + f = 6.0f, + d = 7.0, + bool = true, + str = "custom", + cls = Map.class, + e = Stooge.MOE, + a = @Point(x = 1, y = 2) + ) + class singleElementArrayTypesClass { } + + @ArrayTypes ( + b = { 1, 2 }, + s = { 2, 3 }, + i = { 3, 4 }, + l = { 4L, 5L }, + c = { '5', '6' }, + f = { 6.0f, 7.0f }, + d = { 7.0, 8.0 }, + bool = { true, false }, + str = { "custom", "paint" }, + cls = { Map.class, Set.class }, + e = { Stooge.MOE, Stooge.CURLY }, + a = { @Point(x = 1, y = 2), @Point(x = 3, y = 4) } + ) + class twoElementArrayTypesClass { } + + @ArrayTypesWithDefault ( + ) + class arrayTypesAcceptDefaultClass { } + + @ArrayTypesWithDefault ( + b = 1, + s = 2, + i = 3, + l = 4L, + c = '5', + f = 6.0f, + d = 7.0, + bool = true, + str = "custom", + cls = Map.class, + e = Stooge.MOE, + a = { @Point(x = 1, y = 2) } + ) + class arrayTypesOverrideDefaultClass { } + + @Marker class markerClass { } + + // Single-member (shorthand) + @SingleMemberByte(1) class SingleMemberByteClass { } + @SingleMemberShort(2) class SingleMemberShortClass { } + @SingleMemberInt(3) class SingleMemberIntClass { } + @SingleMemberLong(4L) class SingleMemberLongClass { } + @SingleMemberChar('5') class SingleMemberCharClass { } + @SingleMemberFloat(6.0f) class SingleMemberFloatClass { } + @SingleMemberDouble(7.0) class SingleMemberDoubleClass { } + @SingleMemberBoolean(true) class SingleMemberBooleanClass { } + @SingleMemberString("custom") class SingleMemberStringClass { } + @SingleMemberClass(Map.class) class SingleMemberClassClass { } + @SingleMemberEnum(Stooge.MOE) class SingleMemberEnumClass { } + + // Single-member with default (Override) + @SingleMemberByteWithDef(1) class SingleMemberByteOvrdDefClass { } + @SingleMemberShortWithDef(2) class SingleMemberShortOvrdDefClass { } + @SingleMemberIntWithDef(3) class SingleMemberIntOvrdDefClass { } + @SingleMemberLongWithDef(4L) class SingleMemberLongOvrdDefClass { } + @SingleMemberCharWithDef('5') class SingleMemberCharOvrdDefClass { } + @SingleMemberFloatWithDef(6.0f) class SingleMemberFloatOvrdDefClass { } + @SingleMemberDoubleWithDef(7.0) class SingleMemberDoubleOvrdDefClass { } + @SingleMemberBooleanWithDef(true) class SingleMemberBooleanOvrdDefClass { } + @SingleMemberStringWithDef("custom") class SingleMemberStringOvrdDefClass { } + @SingleMemberClassWithDef(Map.class) class SingleMemberClassOvrdDefClass { } + @SingleMemberEnumWithDef(Stooge.MOE) class SingleMemberEnumOvrdDefClass { } + + // Single-member with default (Accept) + @SingleMemberByteWithDef class SingleMemberByteAcceptDefClass { } + @SingleMemberShortWithDef class SingleMemberShortAcceptDefClass { } + @SingleMemberIntWithDef class SingleMemberIntAcceptDefClass { } + @SingleMemberLongWithDef class SingleMemberLongAcceptDefClass { } + @SingleMemberCharWithDef class SingleMemberCharAcceptDefClass { } + @SingleMemberFloatWithDef class SingleMemberFloatAcceptDefClass { } + @SingleMemberDoubleWithDef class SingleMemberDoubleAcceptDefClass { } + @SingleMemberBooleanWithDef class SingleMemberBooleanAcceptDefClass { } + @SingleMemberStringWithDef class SingleMemberStringAcceptDefClass { } + @SingleMemberClassWithDef class SingleMemberClassAcceptDefClass { } + @SingleMemberEnumWithDef class SingleMemberEnumAcceptDefClass { } + + // Single member array (empty array) + @SingleMemberByteArray({}) class SingleMemberByteArrEmptyClass { } + @SingleMemberShortArray({}) class SingleMemberShortArrEmptyClass { } + @SingleMemberIntArray({}) class SingleMemberIntArrEmptyClass { } + @SingleMemberLongArray({}) class SingleMemberLongArrEmptyClass { } + @SingleMemberCharArray({}) class SingleMemberCharArrEmptyClass { } + @SingleMemberFloatArray({}) class SingleMemberFloatArrEmptyClass { } + @SingleMemberDoubleArray({}) class SingleMemberDoubleArrEmptyClass { } + @SingleMemberBooleanArray({})class SingleMemberBooleanArrEmptyClass { } + @SingleMemberStringArray({}) class SingleMemberStringArrEmptyClass { } + @SingleMemberClassArray({}) class SingleMemberClassArrEmptyClass { } + @SingleMemberEnumArray({}) class SingleMemberEnumArrEmptyClass { } + + // Single member array (one-element shorthand) + @SingleMemberByteArray(1) class SingleMemberByteArrOneClass { } + @SingleMemberShortArray(2) class SingleMemberShortArrOneClass { } + @SingleMemberIntArray(3) class SingleMemberIntArrOneClass { } + @SingleMemberLongArray(4L) class SingleMemberLongArrOneClass { } + @SingleMemberCharArray('5') class SingleMemberCharArrOneClass { } + @SingleMemberFloatArray(6.0f) class SingleMemberFloatArrOneClass { } + @SingleMemberDoubleArray(7.0) class SingleMemberDoubleArrOneClass { } + @SingleMemberBooleanArray(true) class SingleMemberBooleanArrOneClass { } + @SingleMemberStringArray("custom") class SingleMemberStringArrOneClass { } + @SingleMemberClassArray(Map.class) class SingleMemberClassArrOneClass { } + @SingleMemberEnumArray(Stooge.MOE) class SingleMemberEnumArrOneClass { } + + // Single member array (two elements) + @SingleMemberByteArray({1, 2}) class SingleMemberByteArrTwoClass { } + @SingleMemberShortArray({2, 3}) class SingleMemberShortArrTwoClass { } + @SingleMemberIntArray({3, 4}) class SingleMemberIntArrTwoClass { } + @SingleMemberLongArray({4L, 5L}) class SingleMemberLongArrTwoClass { } + @SingleMemberCharArray({'5', '6'}) class SingleMemberCharArrTwoClass { } + @SingleMemberFloatArray({6.0f, 7.0f}) class SingleMemberFloatArrTwoClass { } + @SingleMemberDoubleArray({7.0, 8.0}) class SingleMemberDoubleArrTwoClass { } + @SingleMemberBooleanArray({true,false}) class SingleMemberBooleanArrTwoClass { } + @SingleMemberStringArray({"custom", "paint"}) class SingleMemberStringArrTwoClass { } + @SingleMemberClassArray({Map.class, Set.class}) class SingleMemberClassArrTwoClass { } + @SingleMemberEnumArray({Stooge.MOE, Stooge.CURLY}) class SingleMemberEnumArrTwoClass { } + + // Single member array with default (override) + @SingleMemberByteArrayDef(1) class SingleMemberByteArrOvrdDefClass { } + @SingleMemberShortArrayDef(2) class SingleMemberShortArrOvrdDefClass { } + @SingleMemberIntArrayDef(3) class SingleMemberIntArrOvrdDefClass { } + @SingleMemberLongArrayDef(4L) class SingleMemberLongArrOvrdDefClass { } + @SingleMemberCharArrayDef('5') class SingleMemberCharArrOvrdDefClass { } + @SingleMemberFloatArrayDef(6.0f) class SingleMemberFloatArrOvrdDefClass { } + @SingleMemberDoubleArrayDef(7.0) class SingleMemberDoubleArrOvrdDefClass { } + @SingleMemberBooleanArrayDef(true) class SingleMemberBooleanArrOvrdDefClass { } + @SingleMemberStringArrayDef("custom") class SingleMemberStringArrOvrdDefClass { } + @SingleMemberClassArrayDef(Map.class) class SingleMemberClassArrOvrdDefClass { } + @SingleMemberEnumArrayDef(Stooge.MOE) class SingleMemberEnumArrOvrdDefClass { } + + // Single member array with default - accept + @SingleMemberByteArrayDef class SingleMemberByteArrAcceptDefClass { } + @SingleMemberShortArrayDef class SingleMemberShortArrAcceptDefClass { } + @SingleMemberIntArrayDef class SingleMemberIntArrAcceptDefClass { } + @SingleMemberLongArrayDef class SingleMemberLongArrAcceptDefClass { } + @SingleMemberCharArrayDef class SingleMemberCharArrAcceptDefClass { } + @SingleMemberFloatArrayDef class SingleMemberFloatArrAcceptDefClass { } + @SingleMemberDoubleArrayDef class SingleMemberDoubleArrAcceptDefClass { } + @SingleMemberBooleanArrayDef class SingleMemberBooleanArrAcceptDefClass { } + @SingleMemberStringArrayDef class SingleMemberStringArrAcceptDefClass { } + @SingleMemberClassArrayDef class SingleMemberClassArrAcceptDefClass { } + @SingleMemberEnumArrayDef class SingleMemberEnumArrAcceptDefClass { } + + // Annotated classes for inheritance and declared-annotations tests + @Foo @Bar class Grandpa { } + class Dad extends Grandpa { } + @Bar class Son extends Dad { } diff --git a/jdk/test/java/lang/annotation/loaderLeak/A.java b/jdk/test/java/lang/annotation/loaderLeak/A.java new file mode 100644 index 00000000000..0836eb4507c --- /dev/null +++ b/jdk/test/java/lang/annotation/loaderLeak/A.java @@ -0,0 +1,28 @@ +/* + * Copyright 2004 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +public +@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) +@interface A { + B b(); +} diff --git a/jdk/test/java/lang/annotation/loaderLeak/B.java b/jdk/test/java/lang/annotation/loaderLeak/B.java new file mode 100644 index 00000000000..f22a6707936 --- /dev/null +++ b/jdk/test/java/lang/annotation/loaderLeak/B.java @@ -0,0 +1,24 @@ +/* + * Copyright 2004 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +public @interface B {} diff --git a/jdk/test/java/lang/annotation/loaderLeak/C.java b/jdk/test/java/lang/annotation/loaderLeak/C.java new file mode 100644 index 00000000000..be5347670e6 --- /dev/null +++ b/jdk/test/java/lang/annotation/loaderLeak/C.java @@ -0,0 +1,24 @@ +/* + * Copyright 2004 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +public @A(b=@B()) class C {} diff --git a/jdk/test/java/lang/annotation/loaderLeak/LoaderLeak.sh b/jdk/test/java/lang/annotation/loaderLeak/LoaderLeak.sh new file mode 100644 index 00000000000..d8a47462f9b --- /dev/null +++ b/jdk/test/java/lang/annotation/loaderLeak/LoaderLeak.sh @@ -0,0 +1,84 @@ +#!/bin/sh + +# Copyright 2004 Sun Microsystems, Inc. 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 +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, +# CA 95054 USA or visit www.sun.com if you need additional information or +# have any questions. + +if [ "${TESTSRC}" = "" ] +then + echo "TESTSRC not set. Test cannot execute. Failed." + exit 1 +fi +echo "TESTSRC=${TESTSRC}" +if [ "${TESTJAVA}" = "" ] +then + echo "TESTJAVA not set. Test cannot execute. Failed." + exit 1 +fi +echo "TESTJAVA=${TESTJAVA}" +if [ "${TESTCLASSES}" = "" ] +then + echo "TESTCLASSES not set. Test cannot execute. Failed." + exit 1 +fi +echo "TESTCLASSES=${TESTCLASSES}" +echo "CLASSPATH=${CLASSPATH}" + +# set platform-dependent variables +OS=`uname -s` +case "$OS" in + SunOS | Linux ) + NULL=/dev/null + PS=":" + FS="/" + ;; + Windows* ) + NULL=NUL + PS=";" + FS="\\" + ;; + * ) + echo "Unrecognized system!" + exit 1; + ;; +esac + +mkdir -p classes +cp ${TESTSRC}${FS}*.java . +${TESTJAVA}${FS}bin${FS}javac -d classes A.java B.java C.java +${TESTJAVA}${FS}bin${FS}javac Main.java +${TESTJAVA}${FS}bin${FS}java Main +result=$? +if [ $result -eq 0 ] +then + echo "Passed 1 of 2" +else + echo "Failed 1 of 2" + exit $result +fi +${TESTJAVA}${FS}bin${FS}java Main foo +result=$? +if [ $result -eq 0 ] +then + echo "Passed 2 of 2" +else + echo "Failed 2 of 2" +fi +exit $result diff --git a/jdk/test/java/lang/annotation/loaderLeak/Main.java b/jdk/test/java/lang/annotation/loaderLeak/Main.java new file mode 100644 index 00000000000..b27616b0c08 --- /dev/null +++ b/jdk/test/java/lang/annotation/loaderLeak/Main.java @@ -0,0 +1,127 @@ +/* + * Copyright 2004 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 5040740 + * @summary annotations cause memory leak + * @author gafter + * + * @run shell LoaderLeak.sh + */ + +import java.net.*; +import java.lang.ref.*; +import java.util.*; +import java.io.*; + +public class Main { + public static void main(String[] args) throws Exception { + for (int i=0; i<100; i++) + doTest(args.length != 0); + } + + static void doTest(boolean readAnn) throws Exception { + // URL classes = new URL("file://" + System.getProperty("user.dir") + "/classes"); + // URL[] path = { classes }; + // URLClassLoader loader = new URLClassLoader(path); + ClassLoader loader = new SimpleClassLoader(); + WeakReference> c = new WeakReference(loader.loadClass("C")); + if (c.get() == null) throw new AssertionError(); + if (c.get().getClassLoader() != loader) throw new AssertionError(); + if (readAnn) System.out.println(c.get().getAnnotations()[0]); + if (c.get() == null) throw new AssertionError(); + System.gc(); + System.gc(); + if (c.get() == null) throw new AssertionError(); + System.gc(); + System.gc(); + loader = null; + System.gc(); + System.gc(); + if (c.get() != null) throw new AssertionError(); + } +} + +class SimpleClassLoader extends ClassLoader { + private Hashtable classes = new Hashtable(); + + public SimpleClassLoader() { + } + private byte getClassImplFromDataBase(String className)[] { + byte result[]; + try { + FileInputStream fi = new FileInputStream("classes/"+className+".class"); + result = new byte[fi.available()]; + fi.read(result); + return result; + } catch (Exception e) { + + /* + * If we caught an exception, either the class wasnt found or it + * was unreadable by our process. + */ + return null; + } + } + public Class loadClass(String className) throws ClassNotFoundException { + return (loadClass(className, true)); + } + public synchronized Class loadClass(String className, boolean resolveIt) + throws ClassNotFoundException { + Class result; + byte classData[]; + + /* Check our local cache of classes */ + result = (Class)classes.get(className); + if (result != null) { + return result; + } + + /* Check with the primordial class loader */ + try { + result = super.findSystemClass(className); + return result; + } catch (ClassNotFoundException e) { + } + + /* Try to load it from our repository */ + classData = getClassImplFromDataBase(className); + if (classData == null) { + throw new ClassNotFoundException(); + } + + /* Define it (parse the class file) */ + result = defineClass(classData, 0, classData.length); + if (result == null) { + throw new ClassFormatError(); + } + + if (resolveIt) { + resolveClass(result); + } + + classes.put(className, result); + return result; + } +} diff --git a/jdk/test/java/lang/annotation/package-info.java b/jdk/test/java/lang/annotation/package-info.java new file mode 100644 index 00000000000..78afb3f6c0a --- /dev/null +++ b/jdk/test/java/lang/annotation/package-info.java @@ -0,0 +1,37 @@ +/* + * Copyright 2004 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4901290 5037531 + * @summary Package annotations + * @author gafter + * + * @compile -source 1.5 package-info.java PackageMain.java + * @run main PackageMain + */ + +@java.lang.annotation.Documented +package foo.bar; + +class Baz {} diff --git a/jdk/test/java/lang/reflect/Generics/Probe.java b/jdk/test/java/lang/reflect/Generics/Probe.java index 79628a30bf6..30d6f21e5a3 100644 --- a/jdk/test/java/lang/reflect/Generics/Probe.java +++ b/jdk/test/java/lang/reflect/Generics/Probe.java @@ -23,7 +23,7 @@ /* * @test - * @bug 5003916 + * @bug 5003916 6704655 * @summary Testing parsing of signatures attributes of nested classes * @author Joseph D. Darcy * @compile -source 1.5 Probe.java @@ -32,8 +32,10 @@ import java.lang.reflect.*; import java.lang.annotation.*; +import java.util.*; +import static java.util.Arrays.*; -@Classes({ +@Classes(value={ "java.util.concurrent.FutureTask", "java.util.concurrent.ConcurrentHashMap$EntryIterator", "java.util.concurrent.ConcurrentHashMap$KeyIterator", @@ -56,7 +58,9 @@ import java.lang.annotation.*; "java.util.HashMap$ValueIterator", "java.util.LinkedHashMap$EntryIterator", "java.util.LinkedHashMap$KeyIterator", - "java.util.LinkedHashMap$ValueIterator", + "java.util.LinkedHashMap$ValueIterator" + }, + sunClasses={ "javax.crypto.SunJCE_c", "javax.crypto.SunJCE_e", "javax.crypto.SunJCE_f", @@ -66,7 +70,15 @@ import java.lang.annotation.*; }) public class Probe { public static void main (String[] args) throws Throwable { - String [] names = (Probe.class).getAnnotation(Classes.class).value(); + Classes classesAnnotation = (Probe.class).getAnnotation(Classes.class); + List names = + new ArrayList(asList(classesAnnotation.value())); + + if (System.getProperty("java.runtime.name").startsWith("Java(TM)")) { + // Sun production JDK; test crypto classes too + for(String name: classesAnnotation.sunClasses()) + names.add(name); + } int errs = 0; for(String name: names) { @@ -140,4 +152,5 @@ public class Probe { @Retention(RetentionPolicy.RUNTIME) @interface Classes { String [] value(); // list of classes to probe + String [] sunClasses(); // list of Sun-production JDK specific classes to probe } diff --git a/jdk/test/java/math/BigDecimal/AddTests.java b/jdk/test/java/math/BigDecimal/AddTests.java new file mode 100644 index 00000000000..828a7064f1b --- /dev/null +++ b/jdk/test/java/math/BigDecimal/AddTests.java @@ -0,0 +1,280 @@ +/* + * Copyright 2006 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6362557 + * @summary Some tests of add(BigDecimal, mc) + * @author Joseph D. Darcy + */ + +import java.math.*; +import static java.math.BigDecimal.*; +import java.util.Set; +import java.util.EnumSet; + +public class AddTests { + + private static Set nonExactRoundingModes = + EnumSet.complementOf(EnumSet.of(RoundingMode.UNNECESSARY)); + + /** + * Test for extreme value of scale and rounding precision that + * could cause integer overflow in right-shift-into-sticky-bit + * computations. + */ + private static int extremaTests() { + int failures = 0; + + failures += addWithoutException(valueOf(1, -Integer.MAX_VALUE), + valueOf(2, Integer.MAX_VALUE), null); + failures += addWithoutException(valueOf(1, -Integer.MAX_VALUE), + valueOf(-2, Integer.MAX_VALUE), null); + return failures; + } + + /** + * Print sum of b1 and b2; correct result will not throw an + * exception. + */ + private static int addWithoutException(BigDecimal b1, BigDecimal b2, MathContext mc) { + if (mc == null) + mc = new MathContext(2, RoundingMode.DOWN); + + try { + BigDecimal sum = b1.add(b2, mc); + printAddition(b1, b2, sum.toString()); + return 0; + } catch(ArithmeticException ae) { + printAddition(b1, b2, "Exception!"); + return 1; + } + } + + /** + * Test combinations of operands that may meet the condensation + * criteria when rounded to different precisions. + */ + private static int roundingGradationTests() { + int failures = 0; + + failures += roundAway(new BigDecimal("1234e100"), + new BigDecimal( "1234e97")); + + failures += roundAway(new BigDecimal("1234e100"), + new BigDecimal( "1234e96")); + + failures += roundAway(new BigDecimal("1234e100"), + new BigDecimal( "1234e95")); + + failures += roundAway(new BigDecimal("1234e100"), + new BigDecimal( "1234e94")); + + failures += roundAway(new BigDecimal("1234e100"), + new BigDecimal( "1234e93")); + + failures += roundAway(new BigDecimal("1234e100"), + new BigDecimal( "1234e92")); + + failures += roundAway(new BigDecimal("1234e100"), + new BigDecimal("1234e50")); + + + failures += roundAway(new BigDecimal("1000e100"), + new BigDecimal( "1234e97")); + + failures += roundAway(new BigDecimal("1000e100"), + new BigDecimal( "1234e96")); + + failures += roundAway(new BigDecimal("1000e100"), + new BigDecimal( "1234e95")); + + failures += roundAway(new BigDecimal("1000e100"), + new BigDecimal( "1234e94")); + + failures += roundAway(new BigDecimal("1000e100"), + new BigDecimal( "1234e93")); + + failures += roundAway(new BigDecimal("1000e100"), + new BigDecimal( "1234e92")); + + failures += roundAway(new BigDecimal("1000e100"), + new BigDecimal("1234e50")); + + + + failures += roundAway(new BigDecimal("1999e100"), + new BigDecimal( "1234e97")); + + failures += roundAway(new BigDecimal("1999e100"), + new BigDecimal( "1234e96")); + + failures += roundAway(new BigDecimal("1999e100"), + new BigDecimal( "1234e95")); + + failures += roundAway(new BigDecimal("1999e100"), + new BigDecimal( "1234e94")); + + failures += roundAway(new BigDecimal("1999e100"), + new BigDecimal( "1234e93")); + + failures += roundAway(new BigDecimal("1999e100"), + new BigDecimal( "1234e92")); + + failures += roundAway(new BigDecimal("1999e100"), + new BigDecimal("1234e50")); + + + + failures += roundAway(new BigDecimal("9999e100"), + new BigDecimal( "1234e97")); + + failures += roundAway(new BigDecimal("9999e100"), + new BigDecimal( "1234e96")); + + failures += roundAway(new BigDecimal("9999e100"), + new BigDecimal( "1234e95")); + + failures += roundAway(new BigDecimal("9999e100"), + new BigDecimal( "1234e94")); + + failures += roundAway(new BigDecimal("9999e100"), + new BigDecimal( "1234e93")); + + failures += roundAway(new BigDecimal("9999e100"), + new BigDecimal( "1234e92")); + + failures += roundAway(new BigDecimal("9999e100"), + new BigDecimal("1234e50")); + + return failures; + } + + private static void printAddition(BigDecimal b1, BigDecimal b2, String s) { + System.out.println("" + b1+ "\t+\t" + b2 + "\t=\t" + s); + } + + private static int roundAway(BigDecimal b1, BigDecimal b2) { + int failures = 0; + + b1.precision(); + b2.precision(); + + BigDecimal b1_negate = b1.negate(); + BigDecimal b2_negate = b2.negate(); + + b1_negate.precision(); + b2_negate.precision(); + + failures += roundAway1(b1, b2); + failures += roundAway1(b1, b2_negate); + failures += roundAway1(b1_negate, b2); + failures += roundAway1(b1_negate, b2_negate); + + return failures; + } + + private static int roundAway1(BigDecimal b1, BigDecimal b2) { + int failures = 0; + failures += roundAway0(b1, b2); + failures += roundAway0(b2, b1); + return failures; + } + + /** + * Compare b1.add(b2, mc) with b1.add(b2).round(mc) for a variety + * of MathContexts. + */ + private static int roundAway0(BigDecimal b1, BigDecimal b2) { + int failures = 0; + BigDecimal exactSum = b1.add(b2); + + for(int precision = 1 ; precision < exactSum.precision()+2; precision++) { + for(RoundingMode rm : nonExactRoundingModes) { + MathContext mc = new MathContext(precision, rm); + BigDecimal roundedExactSum = exactSum.round(mc); + + try { + BigDecimal sum = b1.add(b2, mc); + + if (!roundedExactSum.equals(sum) ) { + failures++; + System.out.println("Exact sum " + exactSum + + "\trounded by " + mc + + "\texpected: " + roundedExactSum + " got: "); + printAddition(b1, b2, sum.toString()); + } +// else { +// System.out.print(mc + "\t"); +// printAddition(b1, b2, sum.toString()); +// } + + } catch (ArithmeticException ae) { + printAddition(b1, b2, "Exception!"); + failures++; + } + } + } + + return failures; + } + + /** + * Verify calling the precision method should not change the + * computed result. + */ + private static int precisionConsistencyTest() { + int failures = 0; + MathContext mc = new MathContext(1,RoundingMode.DOWN); + BigDecimal a = BigDecimal.valueOf(1999, -1); //value is equivalent to 19990 + + BigDecimal sum1 = a.add(BigDecimal.ONE, mc); + a.precision(); + BigDecimal sum2 = a.add(BigDecimal.ONE, mc); + + if (!sum1.equals(sum2)) { + failures ++; + System.out.println("Unequal sums after calling precision!"); + System.out.print("Before:\t"); + printAddition(a, BigDecimal.ONE, sum1.toString()); + + System.out.print("After:\t"); + printAddition(a, BigDecimal.ONE, sum2.toString()); + } + + return failures; + } + + public static void main(String argv[]) { + int failures = 0; + + failures += extremaTests(); + failures += roundingGradationTests(); + failures += precisionConsistencyTest(); + + if (failures > 0) { + throw new RuntimeException("Incurred " + failures + + " failures while testing rounding add."); + } + } +} diff --git a/jdk/test/java/math/BigDecimal/CompareToTests.java b/jdk/test/java/math/BigDecimal/CompareToTests.java new file mode 100644 index 00000000000..a33da953a8e --- /dev/null +++ b/jdk/test/java/math/BigDecimal/CompareToTests.java @@ -0,0 +1,101 @@ +/* + * Copyright 2006 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6473768 + * @summary Tests of BigDecimal.compareTo + * @author Joseph D. Darcy + */ +import java.math.*; +import static java.math.BigDecimal.*; + +public class CompareToTests { + private static int compareToTests() { + int failures = 0; + + final BigDecimal MINUS_ONE = BigDecimal.ONE.negate(); + + // First operand, second operand, expected compareTo result + BigDecimal [][] testCases = { + // Basics + {valueOf(0), valueOf(0), ZERO}, + {valueOf(0), valueOf(1), MINUS_ONE}, + {valueOf(1), valueOf(2), MINUS_ONE}, + {valueOf(2), valueOf(1), ONE}, + {valueOf(10), valueOf(10), ZERO}, + + // Significands would compare differently than scaled value + {valueOf(2,1), valueOf(2), MINUS_ONE}, + {valueOf(2,-1), valueOf(2), ONE}, + {valueOf(1,1), valueOf(2), MINUS_ONE}, + {valueOf(1,-1), valueOf(2), ONE}, + {valueOf(5,-1), valueOf(2), ONE}, + + // Boundary and near boundary values + {valueOf(Long.MAX_VALUE), valueOf(Long.MAX_VALUE), ZERO}, + {valueOf(Long.MAX_VALUE-1), valueOf(Long.MAX_VALUE), MINUS_ONE}, + {valueOf(Long.MIN_VALUE), valueOf(Long.MAX_VALUE), MINUS_ONE}, + {valueOf(Long.MIN_VALUE+1), valueOf(Long.MAX_VALUE), MINUS_ONE}, + {valueOf(Long.MIN_VALUE), valueOf(Long.MIN_VALUE), ZERO}, + {valueOf(Long.MIN_VALUE+1), valueOf(Long.MAX_VALUE), ONE}, + }; + + for (BigDecimal[] testCase : testCases) { + BigDecimal a = testCase[0]; + BigDecimal a_negate = a.negate(); + BigDecimal b = testCase[1]; + BigDecimal b_negate = b.negate(); + int expected = testCase[2].intValue(); + + failures += compareToTest(a, b, expected); + failures += compareToTest(a_negate, b, -1); + failures += compareToTest(a, b_negate, 1); + failures += compareToTest(a_negate, b_negate, -expected); + } + + + return failures; + } + + private static int compareToTest(BigDecimal a, BigDecimal b, int expected) { + int result = a.compareTo(b); + int failed = (result==expected) ? 0 : 1; + if (result == 1) { + System.err.println("(" + a + ").compareTo(" + b + ") => " + result + + "\n\tExpected " + expected); + } + return result; + } + + public static void main(String argv[]) { + int failures = 0; + + failures += compareToTests(); + + if (failures > 0) { + throw new RuntimeException("Incurred " + failures + + " failures while testing exact compareTo."); + } + } +} diff --git a/jdk/test/java/math/BigDecimal/Constructor.java b/jdk/test/java/math/BigDecimal/Constructor.java new file mode 100644 index 00000000000..f93c5849f43 --- /dev/null +++ b/jdk/test/java/math/BigDecimal/Constructor.java @@ -0,0 +1,42 @@ +/* + * Copyright 1999 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4259453 + * @summary Test string constructor of BigDecimal + */ +import java.math.BigDecimal; + +public class Constructor { + public static void main(String[] args) throws Exception { + boolean nfe = false; + try { + BigDecimal bd = new BigDecimal("1.2e"); + } catch (NumberFormatException e) { + nfe = true; + } + if (!nfe) + throw new Exception("Didn't throw NumberFormatException"); + } +} diff --git a/jdk/test/java/math/BigDecimal/DivideTests.java b/jdk/test/java/math/BigDecimal/DivideTests.java new file mode 100644 index 00000000000..e988ca554d6 --- /dev/null +++ b/jdk/test/java/math/BigDecimal/DivideTests.java @@ -0,0 +1,340 @@ +/* + * Copyright 2003-2005 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4851776 4907265 6177836 + * @summary Some tests for the divide methods. + * @author Joseph D. Darcy + * @compile -source 1.5 DivideTests.java + * @run main DivideTests + */ + +import java.math.*; +import static java.math.BigDecimal.*; + +public class DivideTests { + + // Preliminary exact divide method; could be used for comparison + // purposes. + BigDecimal anotherDivide(BigDecimal dividend, BigDecimal divisor) { + /* + * Handle zero cases first. + */ + if (divisor.signum() == 0) { // x/0 + if (dividend.signum() == 0) // 0/0 + throw new ArithmeticException("Division undefined"); // NaN + throw new ArithmeticException("Division by zero"); + } + if (dividend.signum() == 0) // 0/y + return BigDecimal.ZERO; + else { + /* + * Determine if there is a result with a terminating + * decimal expansion. Putting aside overflow and + * underflow considerations, the existance of an exact + * result only depends on the ratio of the intVal's of the + * dividend (i.e. this) and and divisor since the scales + * of the argument just affect where the decimal point + * lies. + * + * For the ratio of (a = this.intVal) and (b = + * divisor.intVal) to have a finite decimal expansion, + * once a/b is put in lowest terms, b must be equal to + * (2^i)*(5^j) for some integer i,j >= 0. Therefore, we + * first compute to see if b_prime =(b/gcd(a,b)) is equal + * to (2^i)*(5^j). + */ + BigInteger TWO = BigInteger.valueOf(2); + BigInteger FIVE = BigInteger.valueOf(5); + BigInteger TEN = BigInteger.valueOf(10); + + BigInteger divisorIntvalue = divisor.scaleByPowerOfTen(divisor.scale()).toBigInteger().abs(); + BigInteger dividendIntvalue = dividend.scaleByPowerOfTen(dividend.scale()).toBigInteger().abs(); + + BigInteger b_prime = divisorIntvalue.divide(dividendIntvalue.gcd(divisorIntvalue)); + + boolean goodDivisor = false; + int i=0, j=0; + + badDivisor: { + while(! b_prime.equals(BigInteger.ONE) ) { + int b_primeModTen = b_prime.mod(TEN).intValue() ; + + switch(b_primeModTen) { + case 0: + // b_prime divisible by 10=2*5, increment i and j + i++; + j++; + b_prime = b_prime.divide(TEN); + break; + + case 5: + // b_prime divisible by 5, increment j + j++; + b_prime = b_prime.divide(FIVE); + break; + + case 2: + case 4: + case 6: + case 8: + // b_prime divisible by 2, increment i + i++; + b_prime = b_prime.divide(TWO); + break; + + default: // hit something we shouldn't have + b_prime = BigInteger.ONE; // terminate loop + break badDivisor; + } + } + + goodDivisor = true; + } + + if( ! goodDivisor ) { + throw new ArithmeticException("Non terminating decimal expansion"); + } + else { + // What is a rule for determining how many digits are + // needed? Once that is determined, cons up a new + // MathContext object and pass it on to the divide(bd, + // mc) method; precision == ?, roundingMode is unnecessary. + + // Are we sure this is the right scale to use? Should + // also determine a precision-based method. + MathContext mc = new MathContext(dividend.precision() + + (int)Math.ceil( + 10.0*divisor.precision()/3.0), + RoundingMode.UNNECESSARY); + // Should do some more work here to rescale, etc. + return dividend.divide(divisor, mc); + } + } + } + + public static int powersOf2and5() { + int failures = 0; + + for(int i = 0; i < 6; i++) { + int powerOf2 = (int)StrictMath.pow(2.0, i); + + for(int j = 0; j < 6; j++) { + int powerOf5 = (int)StrictMath.pow(5.0, j); + int product; + + BigDecimal bd; + + try { + bd = BigDecimal.ONE.divide(new BigDecimal(product=powerOf2*powerOf5)); + } catch (ArithmeticException e) { + failures++; + System.err.println((new BigDecimal(powerOf2)).toString() + " / " + + (new BigDecimal(powerOf5)).toString() + " threw an exception."); + e.printStackTrace(); + } + + try { + bd = new BigDecimal(powerOf2).divide(new BigDecimal(powerOf5)); + } catch (ArithmeticException e) { + failures++; + System.err.println((new BigDecimal(powerOf2)).toString() + " / " + + (new BigDecimal(powerOf5)).toString() + " threw an exception."); + e.printStackTrace(); + } + + try { + bd = new BigDecimal(powerOf5).divide(new BigDecimal(powerOf2)); + } catch (ArithmeticException e) { + failures++; + System.err.println((new BigDecimal(powerOf5)).toString() + " / " + + (new BigDecimal(powerOf2)).toString() + " threw an exception."); + + e.printStackTrace(); + } + + } + } + return failures; + } + + public static int nonTerminating() { + int failures = 0; + int[] primes = {1, 3, 7, 13, 17}; + + // For each pair of prime products, verify the ratio of + // non-equal products has a non-terminating expansion. + + for(int i = 0; i < primes.length; i++) { + for(int j = i+1; j < primes.length; j++) { + + for(int m = 0; m < primes.length; m++) { + for(int n = m+1; n < primes.length; n++) { + int dividend = primes[i] * primes[j]; + int divisor = primes[m] * primes[n]; + + if ( ((dividend/divisor) * divisor) != dividend ) { + try { + BigDecimal quotient = (new BigDecimal(dividend). + divide(new BigDecimal(divisor))); + failures++; + System.err.println("Exact quotient " + quotient.toString() + + " returned for non-terminating fraction " + + dividend + " / " + divisor + "."); + } + catch (ArithmeticException e) { + ; // Correct result + } + } + + } + } + } + } + + return failures; + } + + public static int properScaleTests(){ + int failures = 0; + + BigDecimal[][] testCases = { + {new BigDecimal("1"), new BigDecimal("5"), new BigDecimal("2e-1")}, + {new BigDecimal("1"), new BigDecimal("50e-1"), new BigDecimal("2e-1")}, + {new BigDecimal("10e-1"), new BigDecimal("5"), new BigDecimal("2e-1")}, + {new BigDecimal("1"), new BigDecimal("500e-2"), new BigDecimal("2e-1")}, + {new BigDecimal("100e-2"), new BigDecimal("5"), new BigDecimal("20e-2")}, + {new BigDecimal("1"), new BigDecimal("32"), new BigDecimal("3125e-5")}, + {new BigDecimal("1"), new BigDecimal("64"), new BigDecimal("15625e-6")}, + {new BigDecimal("1.0000000"), new BigDecimal("64"), new BigDecimal("156250e-7")}, + }; + + + for(BigDecimal[] tc : testCases) { + BigDecimal quotient; + if (! (quotient = tc[0].divide(tc[1])).equals(tc[2]) ) { + failures++; + System.err.println("Unexpected quotient from " + tc[0] + " / " + tc[1] + + "; expected " + tc[2] + " got " + quotient); + } + } + + return failures; + } + + public static int trailingZeroTests() { + int failures = 0; + + MathContext mc = new MathContext(3, RoundingMode.FLOOR); + BigDecimal[][] testCases = { + {new BigDecimal("19"), new BigDecimal("100"), new BigDecimal("0.19")}, + {new BigDecimal("21"), new BigDecimal("110"), new BigDecimal("0.190")}, + }; + + for(BigDecimal[] tc : testCases) { + BigDecimal quotient; + if (! (quotient = tc[0].divide(tc[1], mc)).equals(tc[2]) ) { + failures++; + System.err.println("Unexpected quotient from " + tc[0] + " / " + tc[1] + + "; expected " + tc[2] + " got " + quotient); + } + } + + return failures; + } + + public static int scaledRoundedDivideTests() { + int failures = 0; + // Tests of the traditional scaled divide under different + // rounding modes. + + // Encode rounding mode and scale for the divide in a + // BigDecimal with the significand equal to the rounding mode + // and the scale equal to the number's scale. + + // {dividend, dividisor, rounding, quotient} + BigDecimal a = new BigDecimal("31415"); + BigDecimal a_minus = a.negate(); + BigDecimal b = new BigDecimal("10000"); + + BigDecimal c = new BigDecimal("31425"); + BigDecimal c_minus = c.negate(); + + BigDecimal[][] testCases = { + {a, b, BigDecimal.valueOf(ROUND_UP, 3), new BigDecimal("3.142")}, + {a_minus, b, BigDecimal.valueOf(ROUND_UP, 3), new BigDecimal("-3.142")}, + + {a, b, BigDecimal.valueOf(ROUND_DOWN, 3), new BigDecimal("3.141")}, + {a_minus, b, BigDecimal.valueOf(ROUND_DOWN, 3), new BigDecimal("-3.141")}, + + {a, b, BigDecimal.valueOf(ROUND_CEILING, 3), new BigDecimal("3.142")}, + {a_minus, b, BigDecimal.valueOf(ROUND_CEILING, 3), new BigDecimal("-3.141")}, + + {a, b, BigDecimal.valueOf(ROUND_FLOOR, 3), new BigDecimal("3.141")}, + {a_minus, b, BigDecimal.valueOf(ROUND_FLOOR, 3), new BigDecimal("-3.142")}, + + {a, b, BigDecimal.valueOf(ROUND_HALF_UP, 3), new BigDecimal("3.142")}, + {a_minus, b, BigDecimal.valueOf(ROUND_HALF_UP, 3), new BigDecimal("-3.142")}, + + {a, b, BigDecimal.valueOf(ROUND_DOWN, 3), new BigDecimal("3.141")}, + {a_minus, b, BigDecimal.valueOf(ROUND_DOWN, 3), new BigDecimal("-3.141")}, + + {a, b, BigDecimal.valueOf(ROUND_HALF_EVEN, 3), new BigDecimal("3.142")}, + {a_minus, b, BigDecimal.valueOf(ROUND_HALF_EVEN, 3), new BigDecimal("-3.142")}, + + {c, b, BigDecimal.valueOf(ROUND_HALF_EVEN, 3), new BigDecimal("3.142")}, + {c_minus, b, BigDecimal.valueOf(ROUND_HALF_EVEN, 3), new BigDecimal("-3.142")}, + }; + + for(BigDecimal tc[] : testCases) { + int scale = tc[2].scale(); + int rm = tc[2].unscaledValue().intValue(); + + BigDecimal quotient = tc[0].divide(tc[1], scale, rm); + if (!quotient.equals(tc[3])) { + failures++; + System.err.println("Unexpected quotient from " + tc[0] + " / " + tc[1] + + " scale " + scale + " rounding mode " + RoundingMode.valueOf(rm) + + "; expected " + tc[3] + " got " + quotient); + } + } + + return failures; + } + + public static void main(String argv[]) { + int failures = 0; + + failures += powersOf2and5(); + failures += nonTerminating(); + failures += properScaleTests(); + failures += trailingZeroTests(); + failures += scaledRoundedDivideTests(); + + if (failures > 0) { + throw new RuntimeException("Incurred " + failures + + " failures while testing exact divide."); + } + } +} diff --git a/jdk/test/java/math/BigDecimal/FloatDoubleValueTests.java b/jdk/test/java/math/BigDecimal/FloatDoubleValueTests.java new file mode 100644 index 00000000000..a75850da20c --- /dev/null +++ b/jdk/test/java/math/BigDecimal/FloatDoubleValueTests.java @@ -0,0 +1,164 @@ +/* + * Copyright 2005 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6274390 + * @summary Verify {float, double}Value methods work with condensed representation + */ +import java.math.*; + +public class FloatDoubleValueTests { + private static final long two2the24 = 1L<<23; + private static final long two2the53 = 1L<<52; + + // Largest long that fits exactly in a float + private static final long maxFltLong = (long)(Integer.MAX_VALUE & ~(0xff)); + + // Largest long that fits exactly in a double + private static final long maxDblLong = Long.MAX_VALUE & ~(0x7ffL); + + static void testDoubleValue0(long i, BigDecimal bd) { + if (bd.doubleValue() != i || + bd.longValue() != i) + throw new RuntimeException("Unexpected equality failure for " + + i + "\t" + bd); + } + + static void testFloatValue0(long i, BigDecimal bd) { + if (bd.floatValue() != i || + bd.longValue() != i) + throw new RuntimeException("Unexpected equality failure for " + + i + "\t" + bd); + } + + static void checkFloat(BigDecimal bd, float f) { + float fbd = bd.floatValue(); + if (f != fbd ) { + String message = String.format("Bad conversion:"+ + "got %g (%a)\texpected %g (%a)", + f, f, fbd, fbd); + throw new RuntimeException(message); + } + } + + static void checkDouble(BigDecimal bd, double d) { + double dbd = bd.doubleValue(); + if (d != dbd ) { + String message = String.format("Bad conversion:"+ + "got %g (%a)\texpected %g (%a)", + d, d, dbd, dbd); + throw new RuntimeException(message); + } + } + + // Test integral values that will convert exactly to both float + // and double. + static void testFloatDoubleValue() { + long longValues[] = { + 0, + 1, + 2, + + two2the24-1, + two2the24, + two2the24+1, + + maxFltLong-1, + maxFltLong, + maxFltLong+1, + }; + + for(long i : longValues) { + BigDecimal bd1 = new BigDecimal(i); + BigDecimal bd2 = new BigDecimal(-i); + + testDoubleValue0( i, bd1); + testDoubleValue0(-i, bd2); + + testFloatValue0( i, bd1); + testFloatValue0(-i, bd2); + } + + } + + static void testDoubleValue() { + long longValues[] = { + Integer.MAX_VALUE-1, + Integer.MAX_VALUE, + (long)Integer.MAX_VALUE+1, + + two2the53-1, + two2the53, + two2the53+1, + + maxDblLong, + }; + + // Test integral values that will convert exactly to double + // but not float. + for(long i : longValues) { + BigDecimal bd1 = new BigDecimal(i); + BigDecimal bd2 = new BigDecimal(-i); + + testDoubleValue0( i, bd1); + testDoubleValue0(-i, bd2); + + checkFloat(bd1, (float)i); + checkFloat(bd2, -(float)i); + } + + // Now check values that should not convert the same in double + for(long i = maxDblLong; i < Long.MAX_VALUE; i++) { + BigDecimal bd1 = new BigDecimal(i); + BigDecimal bd2 = new BigDecimal(-i); + checkDouble(bd1, (double)i); + checkDouble(bd2, -(double)i); + + checkFloat(bd1, (float)i); + checkFloat(bd2, -(float)i); + } + + checkDouble(new BigDecimal(Long.MIN_VALUE), (double)Long.MIN_VALUE); + checkDouble(new BigDecimal(Long.MAX_VALUE), (double)Long.MAX_VALUE); + } + + static void testFloatValue() { + // Now check values that should not convert the same in float + for(long i = maxFltLong; i <= Integer.MAX_VALUE; i++) { + BigDecimal bd1 = new BigDecimal(i); + BigDecimal bd2 = new BigDecimal(-i); + checkFloat(bd1, (float)i); + checkFloat(bd2, -(float)i); + + testDoubleValue0( i, bd1); + testDoubleValue0(-i, bd2); + } + } + + public static void main(String[] args) throws Exception { + testFloatDoubleValue(); + testDoubleValue(); + testFloatValue(); + } +} diff --git a/jdk/test/java/math/BigDecimal/IntegralDivisionTests.java b/jdk/test/java/math/BigDecimal/IntegralDivisionTests.java new file mode 100644 index 00000000000..100eca40cce --- /dev/null +++ b/jdk/test/java/math/BigDecimal/IntegralDivisionTests.java @@ -0,0 +1,352 @@ +/* + * Copyright 2003-2005 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +/* + * @test + * @bug 4904082 4917089 6337226 + * @summary Tests that integral division and related methods return the proper result and scale. + * @author Joseph D. Darcy + * @compile -source 1.5 IntegralDivisionTests.java + * @run main IntegralDivisionTests + */ +import java.math.*; +public class IntegralDivisionTests { + + static int dividetoIntegralValueTests() { + int failures = 0; + + // Exact integer quotient should have the same results from + // the exact divide and dividetoIntegralValue + + + // Rounded results + BigDecimal [][] moreTestCases = { + {new BigDecimal("11003"), new BigDecimal("10"), new BigDecimal("1100")}, + {new BigDecimal("11003"), new BigDecimal("1e1"), new BigDecimal("1100.0")}, + {new BigDecimal("1e9"), new BigDecimal("1"), new BigDecimal("1e9")}, + {new BigDecimal("1e9"), new BigDecimal("1.00"), new BigDecimal("1e9")}, + {new BigDecimal("1e9"), new BigDecimal("0.1"), new BigDecimal("1e10")}, + {new BigDecimal("10e8"), new BigDecimal("0.1"), new BigDecimal("10e9")}, + {new BigDecimal("400e1"), new BigDecimal("5"), new BigDecimal("80e1")}, + {new BigDecimal("400e1"), new BigDecimal("4.999999999"), new BigDecimal("8e2")}, + {new BigDecimal("40e2"), new BigDecimal("5"), new BigDecimal("8e2")}, + }; + + for(BigDecimal [] testCase: moreTestCases) { + BigDecimal quotient; + if (! (quotient=testCase[0].divideToIntegralValue(testCase[1])).equals(testCase[2]) ){ + failures++; + // BigDecimal exact = testCase[0].divide(testCase[1]); + System.err.println(); + System.err.println("dividend = " + testCase[0] + " scale = " + testCase[0].scale()); + System.err.println("divisor = " + testCase[1] + " scale = " + testCase[1].scale()); + System.err.println("quotient = " + quotient + " scale = " + quotient.scale()); + System.err.println("expected = " + testCase[2] + " scale = " + testCase[2].scale()); + // System.err.println("exact = " + exact + " scale = " + exact.scale()); + } + } + + return failures; + } + + static int dividetoIntegralValueRoundedTests() { + int failures = 0; + + BigDecimal dividend = new BigDecimal("11003"); + BigDecimal divisor = new BigDecimal("10"); + BigDecimal [] quotients = { // Expected results with precision = + new BigDecimal("1100"), // 0 + null, // 1 + new BigDecimal("11e2"), // 2 + new BigDecimal("110e1"), // 3 + new BigDecimal("1100"), // 4 + }; + failures += divideContextTestPrecs(dividend, divisor, quotients); + + dividend = new BigDecimal("11003"); + divisor = new BigDecimal("1e1"); + BigDecimal [] quotients2 = { // Expected results with precision = + new BigDecimal("1100.0"), // 0 + null, // 1 + new BigDecimal("11e2"), // 2 + new BigDecimal("110e1"), // 3 + new BigDecimal("1100"), // 4 + new BigDecimal("1100.0"), // 5 + }; + failures += divideContextTestPrecs(dividend, divisor, quotients2); + + dividend = new BigDecimal("1230000"); + divisor = new BigDecimal("100"); + BigDecimal [] quotients3 = { // Expected results with precision = + new BigDecimal("12300"), // 0 + null, // 1 + null, // 2 + new BigDecimal("123e2"), // 3 + new BigDecimal("1230e1"), // 4 + new BigDecimal("12300"), // 5 + }; + failures += divideContextTestPrecs(dividend, divisor, quotients3); + + dividend = new BigDecimal("33"); + divisor = new BigDecimal("3"); + BigDecimal [] quotients4 = { // Expected results with precision = + new BigDecimal("11"), // 0 + null, // 1 + new BigDecimal("11"), // 2 + new BigDecimal("11"), // 3 + }; + failures += divideContextTestPrecs(dividend, divisor, quotients4); + + dividend = new BigDecimal("34"); + divisor = new BigDecimal("3"); + BigDecimal [] quotients5 = { // Expected results with precision = + new BigDecimal("11"), // 0 + null, // 1 + new BigDecimal("11"), // 2 + new BigDecimal("11"), // 3 + }; + failures += divideContextTestPrecs(dividend, divisor, quotients5); + + return failures; + } + + static int divideContextTestPrecs(BigDecimal dividend, + BigDecimal divisor, + BigDecimal[] quotients) + { + int failures = 0; + for(int i = 0; i < quotients.length; i++) { + BigDecimal result = null; + BigDecimal quotient = quotients[i]; + + try { + result = dividend.divideToIntegralValue(divisor, + new MathContext(i, RoundingMode.DOWN)); + } catch (ArithmeticException e) { + if (quotient != null) { + failures++; + System.err.println(); + System.err.println("Unexpected exception:"); + System.err.println("dividend = " + dividend + " scale = " + dividend.scale()); + System.err.println("divisor = " + divisor + " scale = " + divisor.scale()); + System.err.println("expected = " + quotient + " scale = " + quotient.scale()); + } + } + + if (quotient != null) { + if (! result.equals(quotient)) { + failures++; + System.err.println(); + System.err.println("Unexpected result:"); + System.err.println("dividend = " + dividend + " scale = " + dividend.scale()); + System.err.println("divisor = " + divisor + " scale = " + divisor.scale()); + System.err.println("quotient = " + result + " scale = " + result.scale()); + System.err.println("expected = " + quotient + " scale = " + quotient.scale()); + System.err.println("precision = " + i); + } + } else { + if (result != null) { + failures++; + System.err.println(); + System.err.println("Unexpected unexceptional result:"); + System.err.println("dividend = " + dividend + " scale = " + dividend.scale()); + System.err.println("divisor = " + divisor + " scale = " + divisor.scale()); + System.err.println("quotient = " + result + " scale = " + result.scale()); + System.err.println("precision = " + i); + } + } + + } + return failures; + } + + + static int divideContextTests(BigDecimal dividend, + BigDecimal divisor, + BigDecimal expected, + MathContext mc) { + int failures = 0; + + failures += divideContextTest(dividend, divisor, expected, mc); + failures += divideContextTest(dividend.negate(), divisor.negate(), expected, mc); + + if (expected != null) { + failures += divideContextTest(dividend.negate(), divisor, expected.negate(), mc); + failures += divideContextTest(dividend, divisor.negate(), expected.negate(), mc); + } + + return failures; + } + + + static int divideContextTest(BigDecimal dividend, + BigDecimal divisor, + BigDecimal expected, + MathContext mc) + { + int failures = 0; + + BigDecimal result = null; + + try { + result = dividend.divideToIntegralValue(divisor, mc); + } catch (ArithmeticException e) { + if (expected != null) { + failures++; + System.err.println(); + System.err.println("Unexpected exception:"); + System.err.println("dividend = " + dividend + " scale = " + dividend.scale()); + System.err.println("divisor = " + divisor + " scale = " + divisor.scale()); + System.err.println("expected = " + expected + " scale = " + expected.scale()); + System.err.println("MathContext = " + mc); + } + } + + if (expected != null) { + if (! result.equals(expected)) { + failures++; + System.err.println(); + System.err.println("Unexpected result:"); + System.err.println("dividend = " + dividend + " scale = " + dividend.scale()); + System.err.println("divisor = " + divisor + " scale = " + divisor.scale()); + System.err.println("expected = " + expected + " scale = " + expected.scale()); + System.err.println("result = " + result + " scale = " + result.scale()); + System.err.println("MathContext = " + mc); + } + } else { + if (result != null) { + failures++; + System.err.println(); + System.err.println("Unexpected unexceptional result:"); + System.err.println("dividend = " + dividend + " scale = " + dividend.scale()); + System.err.println("divisor = " + divisor + " scale = " + divisor.scale()); + System.err.println("quotient = " + result + " scale = " + result.scale()); + System.err.println("MathConext = " + mc); + } + } + + return failures; + } + + static int dividetoIntegralValueScalingTests() { + int failures = 0; + + BigDecimal dividend = new BigDecimal("123456789000"); + BigDecimal divisor = BigDecimal.ONE; + BigDecimal expected = new BigDecimal("123456789e3"); + MathContext mc = new MathContext(9,RoundingMode.DOWN); + failures += divideContextTests(dividend, divisor, expected, mc); + + + // 100/3 = 33 remainder 1 + int [] precisions = {0, 2, 3, 4}; + dividend = new BigDecimal(100); + divisor = new BigDecimal(3); + expected = new BigDecimal(33); + + for(RoundingMode rm: RoundingMode.values()) + for(int precision: precisions) { + failures += divideContextTests(dividend, divisor, expected, + new MathContext(precision, rm)); + } + + // 123000/10 = 12300 remainder 0 + dividend = new BigDecimal(123000); + divisor = new BigDecimal(10); + int[] precisions1 = {0, 1, 2, 3, 4, 5}; + BigDecimal[] expected1 = { + new BigDecimal("12300"), + null, + null, + new BigDecimal("123e2"), + new BigDecimal("1230e1"), + new BigDecimal("12300"), + }; + + for(RoundingMode rm: RoundingMode.values()) + for(int i = 0; i < precisions1.length; i++) { + failures += divideContextTests(dividend, divisor, + expected1[i], + new MathContext(precisions1[i], rm)); + } + + // 123e3/10 = 123e2 remainder 0 + dividend = new BigDecimal("123e3"); + divisor = new BigDecimal(10); + int[] precisions2 = {0, 1, 2, 3, 4, 5}; + BigDecimal[] expected2 = { + new BigDecimal("123e2"), + null, + null, + new BigDecimal("123e2"), + new BigDecimal("123e2"), + new BigDecimal("123e2"), + }; + + for(RoundingMode rm: RoundingMode.values()) + for(int i = 0; i < precisions2.length; i++) { + failures += divideContextTests(dividend, divisor, + expected2[i], + new MathContext(precisions2[i], rm)); + } + + + // 123000/1e1 = 12300.0 remainder 0 + dividend = new BigDecimal("123000"); + divisor = new BigDecimal("1e1"); + int[] precisions3 = {0, 1, 2, 3, 4, 5, 6}; + BigDecimal[] expected3 = { + new BigDecimal("12300.0"), + null, + null, + new BigDecimal("123e2"), + new BigDecimal("1230e1"), + new BigDecimal("12300"), + new BigDecimal("12300.0"), + }; + + for(RoundingMode rm: RoundingMode.values()) + for(int i = 0; i < precisions3.length; i++) { + failures += divideContextTests(dividend, divisor, + expected3[i], + new MathContext(precisions3[i], rm)); + } + + + + return failures; + } + + public static void main(String argv[]) { + int failures = 0; + + failures += dividetoIntegralValueTests(); + failures += dividetoIntegralValueRoundedTests(); + failures += dividetoIntegralValueScalingTests(); + + if (failures > 0) { + System.err.println("Encountered " + failures + + " failures while testing integral division."); + throw new RuntimeException(); + } + } +} diff --git a/jdk/test/java/math/BigDecimal/NegateTests.java b/jdk/test/java/math/BigDecimal/NegateTests.java new file mode 100644 index 00000000000..2556bbde035 --- /dev/null +++ b/jdk/test/java/math/BigDecimal/NegateTests.java @@ -0,0 +1,111 @@ +/* + * Copyright 2005 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6325535 + * @summary Test for the rounding behavior of negate(MathContext) + * @author Joseph D. Darcy + */ + +import java.math.*; + +public class NegateTests { + + static BigDecimal negateThenRound(BigDecimal bd, MathContext mc) { + return bd.negate().plus(mc); + } + + + static BigDecimal absThenRound(BigDecimal bd, MathContext mc) { + return bd.abs().plus(mc); + } + + + static int negateTest(BigDecimal[][] testCases, MathContext mc) { + int failures = 0; + + for (BigDecimal [] testCase : testCases) { + + BigDecimal bd = testCase[0]; + BigDecimal neg1 = bd.negate(mc); + BigDecimal neg2 = negateThenRound(bd, mc); + BigDecimal expected = testCase[1]; + + if (! neg1.equals(expected) ) { + failures++; + System.err.println("(" + bd + ").negate(" + mc + ") => " + + neg1 + " != expected " + expected); + } + + if (! neg1.equals(neg2) ) { + failures++; + System.err.println("(" + bd + ").negate(" + mc + ") => " + + neg1 + " != ntr " + neg2); + } + + // Test abs consistency + BigDecimal abs = bd.abs(mc); + BigDecimal expectedAbs = absThenRound(bd,mc); + if (! abs.equals(expectedAbs) ) { + failures++; + System.err.println("(" + bd + ").abs(" + mc + ") => " + + abs + " != atr " + expectedAbs); + } + + } + + return failures; + } + + static int negateTests() { + int failures = 0; + BigDecimal [][] testCasesCeiling = { + {new BigDecimal("1.3"), new BigDecimal("-1")}, + {new BigDecimal("-1.3"), new BigDecimal("2")}, + }; + + failures += negateTest(testCasesCeiling, + new MathContext(1, RoundingMode.CEILING)); + + BigDecimal [][] testCasesFloor = { + {new BigDecimal("1.3"), new BigDecimal("-2")}, + {new BigDecimal("-1.3"), new BigDecimal("1")}, + }; + + failures += negateTest(testCasesFloor, + new MathContext(1, RoundingMode.FLOOR)); + + return failures; + } + + public static void main(String argv[]) { + int failures = 0; + + failures += negateTests(); + + if (failures > 0 ) + throw new RuntimeException("Incurred " + failures + " failures" + + " testing the negate and/or abs."); + } +} diff --git a/jdk/test/java/math/BigDecimal/PowTests.java b/jdk/test/java/math/BigDecimal/PowTests.java new file mode 100644 index 00000000000..9623b70bc11 --- /dev/null +++ b/jdk/test/java/math/BigDecimal/PowTests.java @@ -0,0 +1,98 @@ +/* + * Copyright 2003 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4916097 + * @summary Some exponent over/undeflow tests for the pow method + * @author Joseph D. Darcy + * @compile -source 1.5 PowTests.java + * @run main PowTests + */ + +import java.math.*; + +public class PowTests { + static int zeroAndOneTests() { + int failures = 0; + + BigDecimal[][] testCases = { + {BigDecimal.valueOf(0, Integer.MAX_VALUE), new BigDecimal(0), BigDecimal.valueOf(1, 0)}, + {BigDecimal.valueOf(0, Integer.MAX_VALUE), new BigDecimal(1), BigDecimal.valueOf(0, Integer.MAX_VALUE)}, + {BigDecimal.valueOf(0, Integer.MAX_VALUE), new BigDecimal(2), BigDecimal.valueOf(0, Integer.MAX_VALUE)}, + {BigDecimal.valueOf(0, Integer.MAX_VALUE), new BigDecimal(999999999), BigDecimal.valueOf(0, Integer.MAX_VALUE)}, + + {BigDecimal.valueOf(0, Integer.MIN_VALUE), new BigDecimal(0), BigDecimal.valueOf(1, 0)}, + {BigDecimal.valueOf(0, Integer.MIN_VALUE), new BigDecimal(1), BigDecimal.valueOf(0, Integer.MIN_VALUE)}, + {BigDecimal.valueOf(0, Integer.MIN_VALUE), new BigDecimal(2), BigDecimal.valueOf(0, Integer.MIN_VALUE)}, + {BigDecimal.valueOf(0, Integer.MIN_VALUE), new BigDecimal(999999999), BigDecimal.valueOf(0, Integer.MIN_VALUE)}, + + {BigDecimal.valueOf(1, Integer.MAX_VALUE), new BigDecimal(0), BigDecimal.valueOf(1, 0)}, + {BigDecimal.valueOf(1, Integer.MAX_VALUE), new BigDecimal(1), BigDecimal.valueOf(1, Integer.MAX_VALUE)}, + {BigDecimal.valueOf(1, Integer.MAX_VALUE), new BigDecimal(2), null}, // overflow + {BigDecimal.valueOf(1, Integer.MAX_VALUE), new BigDecimal(999999999), null}, // overflow + + {BigDecimal.valueOf(1, Integer.MIN_VALUE), new BigDecimal(0), BigDecimal.valueOf(1, 0)}, + {BigDecimal.valueOf(1, Integer.MIN_VALUE), new BigDecimal(1), BigDecimal.valueOf(1, Integer.MIN_VALUE)}, + {BigDecimal.valueOf(1, Integer.MIN_VALUE), new BigDecimal(2), null}, // underflow + {BigDecimal.valueOf(1, Integer.MIN_VALUE), new BigDecimal(999999999), null}, // underflow + }; + + for(BigDecimal[] testCase: testCases) { + int exponent = testCase[1].intValueExact(); + BigDecimal result; + + try{ + result = testCase[0].pow(exponent); + if (!result.equals(testCase[2]) ) { + failures++; + System.err.println("Unexpected result while raising " + + testCase[0] + + " to the " + exponent + " power; expected " + + testCase[2] + ", got " + result + "."); + } + } catch (ArithmeticException e) { + if (testCase[2] != null) { + failures++; + System.err.println("Unexpected exception while raising " + testCase[0] + + " to the " + exponent + " power."); + + } + } + } + + return failures; + } + + public static void main(String argv[]) { + int failures = 0; + + failures += zeroAndOneTests(); + + if (failures > 0) { + throw new RuntimeException("Incurred " + failures + + " failures while testing pow methods."); + } + } + +} diff --git a/jdk/test/java/math/BigDecimal/RoundingTests.java b/jdk/test/java/math/BigDecimal/RoundingTests.java new file mode 100644 index 00000000000..69a66a174c1 --- /dev/null +++ b/jdk/test/java/math/BigDecimal/RoundingTests.java @@ -0,0 +1,59 @@ +/* + * Copyright 2005 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6334849 + * @summary Tests of dropping digits near the scale threshold + * @author Joseph D. Darcy + */ +import java.math.*; +public class RoundingTests { + private static int roundingTests() { + int failures = 0; + BigDecimal bd1 = BigDecimal.valueOf(11, Integer.MIN_VALUE); + BigDecimal bd2 = null; + MathContext mc = new MathContext(1); + try { + bd2 = bd1.round(mc); // should overflow here + failures++; + System.err.printf("Did not get expected overflow rounding %s to %d digits, got %s%n", + bd1, mc.getPrecision(), bd2); + } catch(ArithmeticException e) { + ; // expected + } + return failures; + } + + public static void main(String argv[]) { + int failures = 0; + + failures += roundingTests(); + + if (failures > 0) { + System.err.println("Encountered " + failures + + " failures while testing rounding."); + throw new RuntimeException(); + } + } +} diff --git a/jdk/test/java/math/BigDecimal/ScaleByPowerOfTenTests.java b/jdk/test/java/math/BigDecimal/ScaleByPowerOfTenTests.java new file mode 100644 index 00000000000..cb0519262d6 --- /dev/null +++ b/jdk/test/java/math/BigDecimal/ScaleByPowerOfTenTests.java @@ -0,0 +1,58 @@ +/* + * Copyright 2003 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4899722 + * @summary Basic tests of scaleByPowerOfTen + * @author Joseph D. Darcy + */ + +import java.math.*; + +public class ScaleByPowerOfTenTests { + + public static void main(String argv[]) { + for (int i = -10; i < 10; i++) { + BigDecimal bd = BigDecimal.ONE.scaleByPowerOfTen(i); + BigDecimal expected; + + if (!bd.equals(expected = new BigDecimal(BigInteger.ONE, -i))) { + throw new RuntimeException("Unexpected result " + + bd.toString() + + "; expected " + + expected.toString()); + } + + bd = BigDecimal.ONE.negate().scaleByPowerOfTen(i); + if (!bd.equals(expected = new BigDecimal(BigInteger.ONE.negate(), -i))) { + throw new RuntimeException("Unexpected result " + + bd.toString() + + "; expected " + + expected.toString()); + } + + + } + } +} diff --git a/jdk/test/java/math/BigDecimal/SerializationTests.java b/jdk/test/java/math/BigDecimal/SerializationTests.java new file mode 100644 index 00000000000..902e21661ab --- /dev/null +++ b/jdk/test/java/math/BigDecimal/SerializationTests.java @@ -0,0 +1,76 @@ +/* + * Copyright 2005 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6177836 + * @summary Verify BigDecimal objects with collapsed values are serialized properly. + * @author Joseph D. Darcy + */ + +import java.math.*; +import java.io.*; + +public class SerializationTests { + + static void checkSerialForm(BigDecimal bd) throws Exception { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(bos); + oos.writeObject(bd); + oos.flush(); + oos.close(); + ObjectInputStream ois = new + ObjectInputStream(new ByteArrayInputStream(bos.toByteArray())); + BigDecimal tmp = (BigDecimal)ois.readObject(); + + if (!bd.equals(tmp) || + bd.hashCode() != tmp.hashCode()) { + System.err.print(" original : " + bd); + System.err.println(" (hash: 0x" + Integer.toHexString(bd.hashCode()) + ")"); + System.err.print("serialized : " + tmp); + System.err.println(" (hash: 0x" + Integer.toHexString(tmp.hashCode()) + ")"); + throw new RuntimeException("Bad serial roundtrip"); + } + } + + public static void main(String[] args) throws Exception { + BigDecimal values[] = { + BigDecimal.ZERO, + BigDecimal.ONE, + BigDecimal.TEN, + new BigDecimal(0), + new BigDecimal(1), + new BigDecimal(10), + new BigDecimal(Integer.MAX_VALUE), + new BigDecimal(Long.MAX_VALUE-1), + new BigDecimal(BigInteger.valueOf(1), 1), + new BigDecimal(BigInteger.valueOf(100), 50), + }; + + for(BigDecimal value : values) { + checkSerialForm(value); + checkSerialForm(value.negate()); + } + + } +} diff --git a/jdk/test/java/math/BigDecimal/StringConstructor.java b/jdk/test/java/math/BigDecimal/StringConstructor.java new file mode 100644 index 00000000000..5fdd23c0456 --- /dev/null +++ b/jdk/test/java/math/BigDecimal/StringConstructor.java @@ -0,0 +1,163 @@ +/* + * Copyright 1999-2005 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4103117 4331084 4488017 4490929 6255285 6268365 + * @summary Tests the BigDecimal string constructor. + */ + +import java.math.*; +import java.util.Random; + +public class StringConstructor { + + private static int seed = new Random().nextInt(); + private static Random rnd = new Random(seed); + + public static void main(String[] args) throws Exception { + constructWithError(""); + constructWithError("+"); + constructWithError("-"); + constructWithError("+e"); + constructWithError("-e"); + constructWithError("e+"); + constructWithError("1.-0"); + constructWithError(".-123"); + constructWithError("-"); + constructWithError("--1.1"); + constructWithError("-+1.1"); + constructWithError("+-1.1"); + constructWithError("1-.1"); + constructWithError("1+.1"); + constructWithError("1.111+1"); + constructWithError("1.111-1"); + constructWithError("11.e+"); + constructWithError("11.e-"); + constructWithError("11.e+-"); + constructWithError("11.e-+"); + constructWithError("11.e-+1"); + constructWithError("11.e+-1"); + + // Range checks + constructWithError("1e"+Integer.MIN_VALUE); + constructWithError("10e"+Integer.MIN_VALUE); + constructWithError("0.01e"+Integer.MIN_VALUE); + constructWithError("1e"+((long)Integer.MIN_VALUE-1)); + constructWithError("1e"+((long)Integer.MAX_VALUE + 1)); + + leadingExponentZeroTest(); + nonAsciiZeroTest(); + + // Roundtrip tests + for (int i=0; i<100; i++) { + int size = rnd.nextInt(100) + 1; + BigInteger bi = new BigInteger(size, rnd); + if (rnd.nextBoolean()) + bi = bi.negate(); + int decimalLength = bi.toString().length(); + int scale = rnd.nextInt(decimalLength); + BigDecimal bd = new BigDecimal(bi, scale); + String bdString = bd.toString(); + // System.err.println("bi" + bi.toString() + "\tscale " + scale); + // System.err.println("bd string: " + bdString); + BigDecimal bdDoppel = new BigDecimal(bdString); + if (!bd.equals(bdDoppel)) { + System.err.println("Random number seed = " + seed); + System.err.println("bd string: scale: " + bd.scale() + + "\t" + bdString); + System.err.println("bd doppel: scale: " + bdDoppel.scale() + + "\t" + bdDoppel.toString()); + throw new RuntimeException("String constructor failure."); + } + } + } + + + /* + * Verify precision is set properly if the significand has + * non-ASCII leading zeros. + */ + private static void nonAsciiZeroTest() { + String values[] = { + "00004e5", + "\u0660\u0660\u0660\u06604e5", + }; + + BigDecimal expected = new BigDecimal("4e5"); + + for(String s : values) { + BigDecimal tmp = new BigDecimal(s); + // System.err.println("Testing " + s); + if (! expected.equals(tmp) || tmp.precision() != 1) { + System.err.println("Bad conversion of " + s + "got " + + tmp + "precision = " + tmp.precision()); + throw new RuntimeException("String constructor failure."); + } + } + + } + + private static void leadingExponentZeroTest() { + BigDecimal twelve = new BigDecimal("12"); + BigDecimal onePointTwo = new BigDecimal("1.2"); + + String start = "1.2e0"; + String end = "1"; + String middle = ""; + + // Test with more excess zeros than the largest number of + // decimal digits needed to represent a long + int limit = ((int)Math.log10(Long.MAX_VALUE)) + 6; + for(int i = 0; i < limit; i++, middle += "0") { + String t1 = start + middle; + String t2 = t1 + end; + + // System.out.println(i + "\t" + t1 + "\t" + t2); + testString(t1, onePointTwo); + testString(t2, twelve); + } + } + + private static void testString(String s, BigDecimal expected) { + testString0(s, expected); + testString0(switchZero(s), expected); + } + + private static void testString0(String s, BigDecimal expected) { + if (!expected.equals(new BigDecimal(s))) + throw new RuntimeException(s + " is not equal to " + expected); + } + + private static String switchZero(String s) { + return s.replace('0', '\u0660'); // Arabic-Indic zero + } + + private static void constructWithError(String badString) { + try { + BigDecimal d = new BigDecimal(badString); + throw new RuntimeException(badString + " accepted"); + } catch(NumberFormatException e) { + } + } +} diff --git a/jdk/test/java/math/BigDecimal/StrippingZerosTest.java b/jdk/test/java/math/BigDecimal/StrippingZerosTest.java new file mode 100644 index 00000000000..918d46ef10f --- /dev/null +++ b/jdk/test/java/math/BigDecimal/StrippingZerosTest.java @@ -0,0 +1,79 @@ +/* + * Copyright 2003 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4108852 + * @summary A few tests of stripTrailingZeros + * @author Joseph D. Darcy + */ + +import java.math.*; + +public class StrippingZerosTest { + public static void main(String argv[]) { + BigDecimal [][] testCases = { + {new BigDecimal("1.00000"), new BigDecimal("1")}, + {new BigDecimal("1.000"), new BigDecimal("1")}, + {new BigDecimal("1"), new BigDecimal("1")}, + {new BigDecimal("0.1234"), new BigDecimal("0.1234")}, + {new BigDecimal("0.12340"), new BigDecimal("0.1234")}, + {new BigDecimal("0.12340000000"), new BigDecimal("0.1234")}, + {new BigDecimal("1234.5678"), new BigDecimal("1234.5678")}, + {new BigDecimal("1234.56780"), new BigDecimal("1234.5678")}, + {new BigDecimal("1234.567800000"), new BigDecimal("1234.5678")}, + {new BigDecimal("0"), new BigDecimal("0")}, + {new BigDecimal("0e100"), new BigDecimal("0e100")}, + {new BigDecimal("0e-100"), new BigDecimal("0e-100")}, + {new BigDecimal("10"), new BigDecimal("1e1")}, + {new BigDecimal("20"), new BigDecimal("2e1")}, + {new BigDecimal("100"), new BigDecimal("1e2")}, + {new BigDecimal("1000000000"), new BigDecimal("1e9")}, + {new BigDecimal("100000000e1"), new BigDecimal("1e9")}, + {new BigDecimal("10000000e2"), new BigDecimal("1e9")}, + {new BigDecimal("1000000e3"), new BigDecimal("1e9")}, + {new BigDecimal("100000e4"), new BigDecimal("1e9")}, + }; + + for(int i = 0; i < testCases.length; i++) { + + if (!(testCases[i][0]).stripTrailingZeros().equals(testCases[i][1])) { + throw new RuntimeException("For input " + testCases[i][0].toString() + + " did not received expected result " + + testCases[i][1].toString() + ", got " + + testCases[i][0].stripTrailingZeros()); + } + + testCases[i][0] = testCases[i][0].negate(); + testCases[i][1] = testCases[i][1].negate(); + + if (!(testCases[i][0]).stripTrailingZeros().equals(testCases[i][1])) { + throw new RuntimeException("For input " + testCases[i][0].toString() + + " did not received expected result " + + testCases[i][1].toString() + ", got " + + testCases[i][0].stripTrailingZeros()); + } + + } + } +} diff --git a/jdk/test/java/math/BigDecimal/ToPlainStringTests.java b/jdk/test/java/math/BigDecimal/ToPlainStringTests.java new file mode 100644 index 00000000000..aca745b7e4b --- /dev/null +++ b/jdk/test/java/math/BigDecimal/ToPlainStringTests.java @@ -0,0 +1,90 @@ +/* + * Copyright 2004 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4984872 + * @summary Basic tests of toPlainString method + * @author Joseph D. Darcy + * @compile -source 1.5 ToPlainStringTests.java + * @run main ToPlainStringTests + */ + +import java.math.*; + +public class ToPlainStringTests { + public static void main(String argv[]) { + String [][] testCases = { + {"0", "0"}, + {"1", "1"}, + {"10", "10"}, + {"2e1", "20"}, + {"3e2", "300"}, + {"4e3", "4000"}, + {"5e4", "50000"}, + {"6e5", "600000"}, + {"7e6", "7000000"}, + {"8e7", "80000000"}, + {"9e8", "900000000"}, + {"1e9", "1000000000"}, + + {".0", "0.0"}, + {".1", "0.1"}, + {".10", "0.10"}, + {"1e-1", "0.1"}, + {"1e-1", "0.1"}, + {"2e-2", "0.02"}, + {"3e-3", "0.003"}, + {"4e-4", "0.0004"}, + {"5e-5", "0.00005"}, + {"6e-6", "0.000006"}, + {"7e-7", "0.0000007"}, + {"8e-8", "0.00000008"}, + {"9e-9", "0.000000009"}, + {"9000e-12", "0.000000009000"}, + }; + + int errors = 0; + for(String[] testCase: testCases) { + BigDecimal bd = new BigDecimal(testCase[0]); + String s; + + if (!(s=bd.toPlainString()).equals(testCase[1])) { + errors++; + System.err.println("Unexpected plain result ``" + + s + "'' from BigDecimal " + + bd); + } + + if (!(s=("-"+bd.toPlainString())).equals("-"+testCase[1])) { + errors++; + System.err.println("Unexpected plain result ``" + + s + "'' from BigDecimal " + + bd); + } + } + + if(errors > 0) + throw new RuntimeException(errors + " errors during run."); + } +} diff --git a/jdk/test/java/math/BigDecimal/ZeroScalingTests.java b/jdk/test/java/math/BigDecimal/ZeroScalingTests.java new file mode 100644 index 00000000000..a48e005a4b1 --- /dev/null +++ b/jdk/test/java/math/BigDecimal/ZeroScalingTests.java @@ -0,0 +1,466 @@ +/* + * Copyright 2003 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4902952 4905407 4916149 + * @summary Tests that the scale of zero is propagated properly and has the proper effect. + * @author Joseph D. Darcy + * @compile -source 1.5 ZeroScalingTests.java + * @run main ZeroScalingTests + */ + +import java.math.*; +import java.util.*; + +public class ZeroScalingTests { + + static MathContext longEnough = new MathContext(50, RoundingMode.UNNECESSARY); + + static BigDecimal[] zeros = new BigDecimal[23]; + static { + for(int i = 0; i < 21; i++) { + zeros[i] = new BigDecimal(BigInteger.ZERO, i-10); + } + zeros[21] = new BigDecimal(BigInteger.ZERO, Integer.MIN_VALUE); + zeros[22] = new BigDecimal(BigInteger.ZERO, Integer.MAX_VALUE); + } + + static BigDecimal element = BigDecimal.valueOf(100, -2); + + static MathContext contexts[] = { + new MathContext(0, RoundingMode.UNNECESSARY), + new MathContext(100, RoundingMode.UNNECESSARY), + new MathContext(5, RoundingMode.UNNECESSARY), + new MathContext(4, RoundingMode.UNNECESSARY), + new MathContext(3, RoundingMode.UNNECESSARY), + new MathContext(2, RoundingMode.UNNECESSARY), + new MathContext(1, RoundingMode.UNNECESSARY), + }; + + + static int addTests() { + int failures = 0; + + for(BigDecimal zero1: zeros) { + for(BigDecimal zero2: zeros) { + BigDecimal expected = new BigDecimal(BigInteger.ZERO, + Math.max(zero1.scale(), zero2.scale())); + BigDecimal result; + + if(! (result=zero1.add(zero2)).equals(expected) ) { + failures++; + System.err.println("For classic exact add, expected scale of " + + expected.scale() + "; got " + + result.scale() + "."); + } + + if(! (result=zero1.add(zero2, MathContext.UNLIMITED)).equals(expected) ) { + failures++; + System.err.println("For UNLIMITED math context add," + + " expected scale of " + + expected.scale() + "; got " + + result.scale() + "."); + } + + if(! (result=zero1.add(zero2, longEnough)).equals(expected) ) { + failures++; + System.err.println("For longEnough math context add," + + " expected scale of " + + expected.scale() + "; got " + + result.scale() + "."); + } + + } + } + + // Test effect of adding zero to a nonzero value. + for (MathContext mc: contexts) { + for (BigDecimal zero: zeros) { + if (Math.abs((long)zero.scale()) < 100 ) { + + int preferredScale = Math.max(zero.scale(), element.scale()); + if (mc.getPrecision() != 0) { + if (preferredScale < -4 ) + preferredScale = -4; + else if (preferredScale > -(5 - mc.getPrecision())) { + preferredScale = -(5 - mc.getPrecision()); + } + } + + + /* + System.err.println("\n " + element + " +\t" + zero + " =\t" + result); + + System.err.println("scales" + element.scale() + " \t" + zero.scale() + + " \t " + result.scale() + "\t precison = " + mc.getPrecision()); + System.err.println("expected scale = " + preferredScale); + */ + + BigDecimal result = element.add(zero, mc); + if (result.scale() != preferredScale || + result.compareTo(element) != 0) { + failures++; + System.err.println("Expected scale " + preferredScale + + " result scale was " + result.scale() + + " ; value was " + result); + } + + result = zero.add(element, mc); + if (result.scale() != preferredScale || + result.compareTo(element) != 0) { + failures++; + System.err.println("Expected scale " + preferredScale + + " result scale was " + result.scale() + + " ; value was " + result); + } + + result = element.negate().add(zero, mc); + if (result.scale() != preferredScale || + result.compareTo(element.negate()) != 0) { + failures++; + System.err.println("Expected scale " + preferredScale + + " result scale was " + result.scale() + + " ; value was " + result); + } + + result = zero.add(element.negate(), mc); + if (result.scale() != preferredScale || + result.compareTo(element.negate()) != 0) { + failures++; + System.err.println("Expected scale " + preferredScale + + " result scale was " + result.scale() + + " ; value was " + result); + } + + } + } + } + + return failures; + } + + static int subtractTests() { + int failures = 0; + + for(BigDecimal zero1: zeros) { + for(BigDecimal zero2: zeros) { + BigDecimal expected = new BigDecimal(BigInteger.ZERO, + Math.max(zero1.scale(), zero2.scale())); + BigDecimal result; + + if(! (result=zero1.subtract(zero2)).equals(expected) ) { + failures++; + System.err.println("For classic exact subtract, expected scale of " + + expected.scale() + "; got " + + result.scale() + "."); + } + + if(! (result=zero1.subtract(zero2, MathContext.UNLIMITED)).equals(expected) ) { + failures++; + System.err.println("For UNLIMITED math context subtract," + + " expected scale of " + + expected.scale() + "; got " + + result.scale() + "."); + } + + if(! (result=zero1.subtract(zero2, longEnough)).equals(expected) ) { + failures++; + System.err.println("For longEnough math context subtract," + + " expected scale of " + + expected.scale() + "; got " + + result.scale() + "."); + } + + } + } + + + // Test effect of adding zero to a nonzero value. + for (MathContext mc: contexts) { + for (BigDecimal zero: zeros) { + if (Math.abs((long)zero.scale()) < 100 ) { + + int preferredScale = Math.max(zero.scale(), element.scale()); + if (mc.getPrecision() != 0) { + if (preferredScale < -4 ) + preferredScale = -4; + else if (preferredScale > -(5 - mc.getPrecision())) { + preferredScale = -(5 - mc.getPrecision()); + } + } + + + /* + System.err.println("\n " + element + " +\t" + zero + " =\t" + result); + + System.err.println("scales" + element.scale() + " \t" + zero.scale() + + " \t " + result.scale() + "\t precison = " + mc.getPrecision()); + System.err.println("expected scale = " + preferredScale); + */ + + BigDecimal result = element.subtract(zero, mc); + if (result.scale() != preferredScale || + result.compareTo(element) != 0) { + failures++; + System.err.println("Expected scale " + preferredScale + + " result scale was " + result.scale() + + " ; value was " + result); + } + + result = zero.subtract(element, mc); + if (result.scale() != preferredScale || + result.compareTo(element.negate()) != 0) { + failures++; + System.err.println("Expected scale " + preferredScale + + " result scale was " + result.scale() + + " ; value was " + result); + } + + result = element.negate().subtract(zero, mc); + if (result.scale() != preferredScale || + result.compareTo(element.negate()) != 0) { + failures++; + System.err.println("Expected scale " + preferredScale + + " result scale was " + result.scale() + + " ; value was " + result); + } + + result = zero.subtract(element.negate(), mc); + if (result.scale() != preferredScale || + result.compareTo(element) != 0) { + failures++; + System.err.println("Expected scale " + preferredScale + + " result scale was " + result.scale() + + " ; value was " + result); + } + + } + } + } + + return failures; + } + + static int multiplyTests() { + int failures = 0; + + BigDecimal ones[] = { + BigDecimal.valueOf(1, 0), + BigDecimal.valueOf(10, 1), + BigDecimal.valueOf(1000, 3), + BigDecimal.valueOf(100000000, 8), + }; + + List values = new LinkedList(); + values.addAll(Arrays.asList(zeros)); + values.addAll(Arrays.asList(ones)); + + for(BigDecimal zero1: zeros) { + for(BigDecimal value: values) { + BigDecimal expected = new BigDecimal(BigInteger.ZERO, + (int)Math.min(Math.max((long)zero1.scale()+value.scale(), + Integer.MIN_VALUE ), + Integer.MAX_VALUE ) ); + BigDecimal result; + + if(! (result=zero1.multiply(value)).equals(expected) ) { + failures++; + System.err.println("For classic exact multiply, expected scale of " + + expected.scale() + "; got " + + result.scale() + "."); + } + + if(! (result=zero1.multiply(value, MathContext.UNLIMITED)).equals(expected) ) { + failures++; + System.err.println("For UNLIMITED math context multiply," + + " expected scale of " + + expected.scale() + "; got " + + result.scale() + "."); + } + + if(! (result=zero1.multiply(value, longEnough)).equals(expected) ) { + failures++; + System.err.println("For longEnough math context multiply," + + " expected scale of " + + expected.scale() + "; got " + + result.scale() + "."); + } + + } + } + + return failures; + } + + static int divideTests() { + int failures = 0; + + BigDecimal [] ones = { + BigDecimal.valueOf(1, 0), + BigDecimal.valueOf(10, -1), + BigDecimal.valueOf(100, -2), + BigDecimal.valueOf(1000, -3), + BigDecimal.valueOf(1000000, -5), + }; + + for(BigDecimal one: ones) { + for(BigDecimal zero: zeros) { + BigDecimal expected = new BigDecimal(BigInteger.ZERO, + (int)Math.min(Math.max((long)zero.scale() - one.scale(), + Integer.MIN_VALUE ), + Integer.MAX_VALUE ) ); + BigDecimal result; + + if(! (result=zero.divide(one)).equals(expected) ) { + failures++; + System.err.println("For classic exact divide, expected scale of " + + expected.scale() + "; got " + + result.scale() + "."); + } + + if(! (result=zero.divide(one, MathContext.UNLIMITED)).equals(expected) ) { + failures++; + System.err.println("For UNLIMITED math context divide," + + " expected scale of " + + expected.scale() + "; got " + + result.scale() + "."); + } + + if(! (result=zero.divide(one, longEnough)).equals(expected) ) { + failures++; + System.err.println("For longEnough math context divide," + + " expected scale of " + + expected.scale() + "; got " + + result.scale() + "."); + } + + } + } + + return failures; + } + + static int setScaleTests() { + int failures = 0; + + int scales[] = { + Integer.MIN_VALUE, + Integer.MIN_VALUE+1, + -10000000, + -3, + -2, + -1, + 0, + 1, + 2, + 3, + 10, + 10000000, + Integer.MAX_VALUE-1, + Integer.MAX_VALUE + }; + + for(BigDecimal zero: zeros) { + for(int scale: scales) { + try { + BigDecimal bd = zero.setScale(scale); + } + catch (ArithmeticException e) { + failures++; + System.err.println("Exception when trying to set a scale of " + scale + + " on " + zero); + } + } + } + + return failures; + } + + static int toEngineeringStringTests() { + int failures = 0; + + String [][] testCases = { + {"0E+10", "0.00E+12"}, + {"0E+9", "0E+9"}, + {"0E+8", "0.0E+9"}, + {"0E+7", "0.00E+9"}, + + {"0E-10", "0.0E-9"}, + {"0E-9", "0E-9"}, + {"0E-8", "0.00E-6"}, + {"0E-7", "0.0E-6"}, + }; + + for(String[] testCase: testCases) { + BigDecimal bd = new BigDecimal(testCase[0]); + String result = bd.toEngineeringString(); + + if (!result.equals(testCase[1]) || + !bd.equals(new BigDecimal(result))) { + failures++; + System.err.println("From input ``" + testCase[0] + ",'' " + + " bad engineering string output ``" + result + + "''; expected ``" + testCase[1] + ".''"); + } + + } + + return failures; + } + + static int ulpTests() { + int failures = 0; + + for(BigDecimal zero: zeros) { + BigDecimal result; + BigDecimal expected = BigDecimal.valueOf(1, zero.scale()); + + if (! (result=zero.ulp()).equals(expected) ) { + failures++; + System.err.println("Unexpected ulp value for zero value " + + zero + "; expected " + expected + + ", got " + result); + } + } + + return failures; + } + + public static void main(String argv[]) { + int failures = 0; + + failures += addTests(); + failures += subtractTests(); + failures += multiplyTests(); + failures += divideTests(); + failures += setScaleTests(); + failures += toEngineeringStringTests(); + failures += ulpTests(); + + if (failures > 0 ) { + throw new RuntimeException("Incurred " + failures + " failures" + + " testing the preservation of zero scales."); + } + } +} diff --git a/jdk/test/java/math/BigInteger/BigIntegerTest.java b/jdk/test/java/math/BigInteger/BigIntegerTest.java new file mode 100644 index 00000000000..75ce0033779 --- /dev/null +++ b/jdk/test/java/math/BigInteger/BigIntegerTest.java @@ -0,0 +1,792 @@ +/* + * Copyright 1998-2003 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4181191 4161971 4227146 4194389 4823171 4624738 4812225 + * @summary tests methods in BigInteger + * @run main/timeout=400 BigIntegerTest + * @author madbot + */ + +import java.util.Random; +import java.math.BigInteger; +import java.io.*; + +/** + * This is a simple test class created to ensure that the results + * generated by BigInteger adhere to certain identities. Passing + * this test is a strong assurance that the BigInteger operations + * are working correctly. + * + * Three arguments may be specified which give the number of + * decimal digits you desire in the three batches of test numbers. + * + * The tests are performed on arrays of random numbers which are + * generated by a Random class as well as special cases which + * throw in boundary numbers such as 0, 1, maximum sized, etc. + * + */ +public class BigIntegerTest { + static Random rnd = new Random(); + static int size = 1000; // numbers per batch + static boolean failure = false; + + // Some variables for sizing test numbers in bits + private static int order1 = 100; + private static int order2 = 60; + private static int order3 = 30; + + public static void pow() { + int failCount1 = 0; + + for (int i=0; i>= 1; + } + + if (bigX.bitCount() != bitCount) { + //System.err.println(x+": "+bitCount+", "+bigX.bitCount()); + failCount++; + } + } + report("Bit Count", failCount); + } + + public static void bitLength() { + int failCount = 0; + + for (int i=0; i0) + order1 = (int)((Integer.parseInt(args[0]))* 3.333); + if (args.length >1) + order2 = (int)((Integer.parseInt(args[1]))* 3.333); + if (args.length >2) + order3 = (int)((Integer.parseInt(args[2]))* 3.333); + + prime(); + nextProbablePrime(); + + arithmetic(); + divideAndRemainder(); + pow(); + + bitCount(); + bitLength(); + bitOps(); + bitwise(); + + shift(); + + byteArrayConv(); + + modInv(); + modExp(); + modExp2(); + + stringConv(); + serialize(); + + if (failure) + throw new RuntimeException("Failure in BigIntegerTest."); + } + + /* + * Get a random or boundary-case number. This is designed to provide + * a lot of numbers that will find failure points, such as max sized + * numbers, empty BigIntegers, etc. + * + * If order is less than 2, order is changed to 2. + */ + private static BigInteger fetchNumber(int order) { + boolean negative = rnd.nextBoolean(); + int numType = rnd.nextInt(6); + BigInteger result = null; + if (order < 2) order = 2; + + switch (numType) { + case 0: // Empty + result = BigInteger.ZERO; + break; + + case 1: // One + result = BigInteger.ONE; + break; + + case 2: // All bits set in number + int numBytes = (order+7)/8; + byte[] fullBits = new byte[numBytes]; + for(int i=0; i 0) + failure = true; + } +} diff --git a/jdk/test/java/math/BigInteger/ModPow.java b/jdk/test/java/math/BigInteger/ModPow.java new file mode 100644 index 00000000000..6f07c3df230 --- /dev/null +++ b/jdk/test/java/math/BigInteger/ModPow.java @@ -0,0 +1,52 @@ +/* + * Copyright 1998 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + * @bug 4181191 + * @summary test BigInteger modPow method + */ +import java.math.BigInteger; +import java.util.Random; + +public class ModPow { + public static void main(String[] args) { + Random rnd = new Random(1234); + + for (int i=0; i<2000; i++) { + BigInteger m = new BigInteger(800, rnd); + BigInteger base = new BigInteger(16, rnd); + if (rnd.nextInt() % 1 == 0) + base = base.negate(); + BigInteger exp = new BigInteger(8, rnd); + + BigInteger z = base.modPow(exp, m); + BigInteger w = base.pow(exp.intValue()).mod(m); + if (!z.equals(w)){ + System.err.println(base +" ** " + exp + " mod "+ m); + System.err.println("modPow : " + z); + System.err.println("pow.mod: " + w); + throw new RuntimeException("BigInteger modPow failure."); + } + } + } +} diff --git a/jdk/test/java/math/BigInteger/ModPow65537.java b/jdk/test/java/math/BigInteger/ModPow65537.java new file mode 100644 index 00000000000..18d11514962 --- /dev/null +++ b/jdk/test/java/math/BigInteger/ModPow65537.java @@ -0,0 +1,96 @@ +/* + * Copyright 2003 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4891312 + * @summary verify that modPow() not broken by the special case for 65537 + * @author Andreas Sterbenz + */ + +import java.math.BigInteger; +import java.util.*; + +import java.security.*; +import java.security.spec.*; + +public class ModPow65537 { + + public static void main(String[] args) throws Exception { + // SunRsaSign uses BigInteger internally + KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", "SunRsaSign"); + kpg.initialize(new RSAKeyGenParameterSpec(512, BigInteger.valueOf(65537))); + KeyPair kp = kpg.generateKeyPair(); + testSigning(kp); + + kpg.initialize(new RSAKeyGenParameterSpec(512, BigInteger.valueOf(65539))); + kp = kpg.generateKeyPair(); + testSigning(kp); + + kpg.initialize(new RSAKeyGenParameterSpec(512, BigInteger.valueOf(3))); + kp = kpg.generateKeyPair(); + testSigning(kp); + + // basic known answer test + BigInteger base = new BigInteger("19058071224156864789844466979330892664777520457048234786139035643344145635582"); + BigInteger mod = new BigInteger("75554098474976067521257305210610421240510163914613117319380559667371251381587"); + BigInteger exp1 = BigInteger.valueOf(65537); + BigInteger exp2 = BigInteger.valueOf(75537); + BigInteger exp3 = new BigInteger("13456870775607312149"); + + BigInteger res1 = new BigInteger("5770048609366563851320890693196148833634112303472168971638730461010114147506"); + BigInteger res2 = new BigInteger("63446979364051087123350579021875958137036620431381329472348116892915461751531"); + BigInteger res3 = new BigInteger("39016891919893878823999350081191675846357272199067075794096200770872982089502"); + + if (base.modPow(exp1, mod).equals(res1) == false) { + throw new Exception("Error using " + exp1); + } + if (base.modPow(exp2, mod).equals(res2) == false) { + throw new Exception("Error using " + exp2); + } + if (base.modPow(exp3, mod).equals(res3) == false) { + throw new Exception("Error using " + exp3); + } + + System.out.println("Passed"); + } + + private static void testSigning(KeyPair kp) throws Exception { + System.out.println(kp.getPublic()); + byte[] data = new byte[1024]; + new Random().nextBytes(data); + + Signature sig = Signature.getInstance("SHA1withRSA", "SunRsaSign"); + sig.initSign(kp.getPrivate()); + sig.update(data); + byte[] sigBytes = sig.sign(); + + sig.initVerify(kp.getPublic()); + sig.update(data); + if (sig.verify(sigBytes) == false) { + throw new Exception("signature verification failed"); + } + System.out.println("OK"); + } + +} diff --git a/jdk/test/java/math/BigInteger/ModPowPowersof2.java b/jdk/test/java/math/BigInteger/ModPowPowersof2.java new file mode 100644 index 00000000000..7ba02661438 --- /dev/null +++ b/jdk/test/java/math/BigInteger/ModPowPowersof2.java @@ -0,0 +1,85 @@ +/* + * Copyright 1998 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @bug 4098742 + @summary Test biginteger modpow method + @author Michael McCloskey + @run main/othervm ModPowPowersof2 +*/ + +import java.math.BigInteger; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.File; +import java.io.IOException; + +/** + * This class tests to see if using modPow on a power + * of two crashes the vm + * + */ +public class ModPowPowersof2 { + + public static void main(String args[]) throws Exception { + // Construct a command that runs the test in other vm + String[] command = new String[4]; + int n = 0; + + command[n++] = System.getProperty("java.home") + File.separator + + "bin" + File.separator + "java"; + if (System.getProperty("java.class.path") != null) { + command[n++] = "-classpath"; + command[n++] = System.getProperty("java.class.path"); + } + + command[n++] = "ModPowPowersof2$ModTester"; + + // Exec another vm to run test in + Process p = null; + p = Runtime.getRuntime().exec(command); + + // Read the result to determine if test failed + BufferedReader in = new BufferedReader(new InputStreamReader( + p.getInputStream())); + String s; + s = in.readLine(); + if (s == null) + throw new RuntimeException("ModPow causes vm crash"); + + } + + public static class ModTester { + public static void main(String [] args) { + BigInteger two = BigInteger.valueOf(2); + BigInteger four = BigInteger.valueOf(4); + + two.modPow(two, BigInteger.valueOf(4)); + two.modPow(two, BigInteger.valueOf(8)); + two.modPow(four, BigInteger.valueOf(8)); + + System.out.println("success"); + } + } + +} diff --git a/jdk/test/java/math/BigInteger/OperatorNpeTests.java b/jdk/test/java/math/BigInteger/OperatorNpeTests.java new file mode 100644 index 00000000000..6639dfa23e7 --- /dev/null +++ b/jdk/test/java/math/BigInteger/OperatorNpeTests.java @@ -0,0 +1,72 @@ +/* + * Copyright 2006 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6365176 + * @summary Get NullPointerExceptions when expected + * @author Joseph D. Darcy + */ + +import java.math.*; +import static java.math.BigInteger.*; + +public class OperatorNpeTests { + + public static void main(String... argv) { + BigInteger[] specialValues = {ZERO, ONE, TEN}; + + for (BigInteger bd : specialValues) { + BigInteger result; + try { + result = bd.multiply(null); + throw new RuntimeException("Instead of NPE got " + result); + } catch (NullPointerException npe) { + ; // Expected + } + + try { + result = bd.divide(null); + throw new RuntimeException("Instead of NPE got " + result); + } catch (NullPointerException npe) { + ; // Expected + } + + try { + result = bd.add(null); + throw new RuntimeException("Instead of NPE got " + result); + } catch (NullPointerException npe) { + ; // Expected + } + + try { + result = bd.subtract(null); + throw new RuntimeException("Instead of NPE got " + result); + } catch (NullPointerException npe) { + ; // Expected + } + + + } + } +} diff --git a/jdk/test/java/math/BigInteger/ProbablePrime.java b/jdk/test/java/math/BigInteger/ProbablePrime.java new file mode 100644 index 00000000000..44b129beffb --- /dev/null +++ b/jdk/test/java/math/BigInteger/ProbablePrime.java @@ -0,0 +1,48 @@ +/* + * Copyright 2002 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4654323 + * @summary Tests functionality of isProbablePrime(Integer.MAX_VALUE) + */ +import java.math.*; + +public class ProbablePrime { + public static void main(String [] argv) { + BigInteger num = new BigInteger("4"); + int certainties[] = {-1, 0, 1, 2, 100, Integer.MAX_VALUE-1, + Integer.MAX_VALUE}; + boolean expectations[] = {true, true, false, false, false, + false, false}; + + for(int i = 0; i < certainties.length; i++) { + boolean b; + if((b=num.isProbablePrime(certainties[i])) != + expectations[i]) + throw new RuntimeException("Unexpected answer " + b + + " for certainty " + + certainties[i]); + } + } +} diff --git a/jdk/test/java/math/BigInteger/StringConstructor.java b/jdk/test/java/math/BigInteger/StringConstructor.java new file mode 100644 index 00000000000..530d7f22439 --- /dev/null +++ b/jdk/test/java/math/BigInteger/StringConstructor.java @@ -0,0 +1,90 @@ +/* + * Copyright 2001-2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4489146 5017980 + * @summary tests String constructors of BigInteger + * @author Joseph D. Darcy + */ +import java.math.*; + +public class StringConstructor { + + + public static void main(String [] argv) { + // Good strings + constructWithoutError("0", 0L); + constructWithoutError("000000000000000000", 0L); + constructWithoutError("1", 1L); + constructWithoutError("-1", -1L); + constructWithoutError("+1", +1L); + constructWithoutError( "123456789123456789", 123456789123456789L); + constructWithoutError("+123456789123456789", 123456789123456789L); + constructWithoutError("-123456789123456789", -123456789123456789L); + constructWithoutError(Integer.toString(Integer.MIN_VALUE), + (long)Integer.MIN_VALUE); + constructWithoutError(Integer.toString(Integer.MAX_VALUE), + (long)Integer.MAX_VALUE); + constructWithoutError(Long.toString(Long.MIN_VALUE), + Long.MIN_VALUE); + constructWithoutError(Long.toString(Long.MAX_VALUE), + Long.MAX_VALUE); + + // Bad strings + constructWithError(""); + constructWithError("-"); + constructWithError("+"); + constructWithError("--"); + constructWithError("++"); + constructWithError("-000-0"); + constructWithError("+000+0"); + constructWithError("+000-0"); + constructWithError("--1234567890"); + constructWithError("++1234567890"); + constructWithError("-0-12345678"); + constructWithError("+0+12345678"); + constructWithError("--12345678-12345678-12345678"); + constructWithError("++12345678+12345678+12345678"); + constructWithError("12345-"); + constructWithError("12345+"); + } + + // this method adapted from ../BigDecimal/StringConstructor.java + private static void constructWithError(String badString) { + try { + BigInteger bi = new BigInteger(badString); + throw new RuntimeException(badString + " accepted"); + } catch(NumberFormatException e) { + } + } + + private static void constructWithoutError(String goodString, long value) { + BigInteger bi = new BigInteger(goodString); + if(bi.longValue() != value) { + System.err.printf("From ``%s'' expected %d, got %s.\n", goodString, value, bi); + throw new RuntimeException(); + } + } + +} diff --git a/jdk/test/java/math/BigInteger/UnicodeConstructor.java b/jdk/test/java/math/BigInteger/UnicodeConstructor.java new file mode 100644 index 00000000000..df00450d847 --- /dev/null +++ b/jdk/test/java/math/BigInteger/UnicodeConstructor.java @@ -0,0 +1,57 @@ +/* + * Copyright 1998 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4040456 + * @summary Test biginteger constructor with i18n string + */ + +import java.math.*; + +/** + * This class tests to see if creating a biginteger with an + * unicode japanese zero and one succeeds + * + */ +public class UnicodeConstructor { + + public static void main(String args[]) { + + try { + // the code for japanese zero + BigInteger b1 = new BigInteger("\uff10"); + System.err.println(b1.toString()); + + // Japanese 1010 + BigInteger b2 = new BigInteger("\uff11\uff10\uff11\uff10"); + System.err.println(b2.toString()); + } + catch (ArrayIndexOutOfBoundsException e) { + throw new RuntimeException( + "BigInteger is not accepting unicode initializers."); + } + + } + +} diff --git a/jdk/test/java/math/RoundingMode/RoundingModeTests.java b/jdk/test/java/math/RoundingMode/RoundingModeTests.java new file mode 100644 index 00000000000..03fd5e7ac80 --- /dev/null +++ b/jdk/test/java/math/RoundingMode/RoundingModeTests.java @@ -0,0 +1,85 @@ +/* + * Copyright 2003 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4851776 4891522 4905335 + * @summary Basic tests for the RoundingMode class. + * @author Joseph D. Darcy + * @compile -source 1.5 RoundingModeTests.java + * @run main RoundingModeTests + */ + +import java.math.RoundingMode; +import java.math.BigDecimal; + +public class RoundingModeTests { + public static void main(String [] argv) { + + // For each member of the family, make sure + // rm == valueOf(rm.toString()) + + for(RoundingMode rm: RoundingMode.values()) { + if (rm != RoundingMode.valueOf(rm.toString())) { + throw new RuntimeException("Bad roundtrip conversion of " + + rm.toString()); + } + } + + // Test that mapping of old integers to new values is correct + if (RoundingMode.valueOf(BigDecimal.ROUND_CEILING) != + RoundingMode.CEILING) { + throw new RuntimeException("Bad mapping for ROUND_CEILING"); + } + + if (RoundingMode.valueOf(BigDecimal.ROUND_DOWN) != + RoundingMode.DOWN) { + throw new RuntimeException("Bad mapping for ROUND_DOWN"); + } + + if (RoundingMode.valueOf(BigDecimal.ROUND_FLOOR) != + RoundingMode.FLOOR) { + throw new RuntimeException("Bad mapping for ROUND_FLOOR"); + } + + if (RoundingMode.valueOf(BigDecimal.ROUND_HALF_DOWN) != + RoundingMode.HALF_DOWN) { + throw new RuntimeException("Bad mapping for ROUND_HALF_DOWN"); + } + + if (RoundingMode.valueOf(BigDecimal.ROUND_HALF_EVEN) != + RoundingMode.HALF_EVEN) { + throw new RuntimeException("Bad mapping for ROUND_HALF_EVEN"); + } + + if (RoundingMode.valueOf(BigDecimal.ROUND_HALF_UP) != + RoundingMode.HALF_UP) { + throw new RuntimeException("Bad mapping for ROUND_HALF_UP"); + } + + if (RoundingMode.valueOf(BigDecimal.ROUND_UNNECESSARY) != + RoundingMode.UNNECESSARY) { + throw new RuntimeException("Bad mapping for ROUND_UNNECESARY"); + } + } +} diff --git a/jdk/test/java/net/CookieHandler/B6791927.java b/jdk/test/java/net/CookieHandler/B6791927.java new file mode 100644 index 00000000000..f1e1f7f3991 --- /dev/null +++ b/jdk/test/java/net/CookieHandler/B6791927.java @@ -0,0 +1,48 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/** + * @test + * @bug 6791927 + * @summary Wrong Locale in HttpCookie::expiryDate2DeltaSeconds + */ + +import java.net.*; +import java.util.List; +import java.util.Locale; + +public class B6791927 { + public static final void main( String[] aaParamters ) throws Exception{ + // Forces a non US locale + Locale.setDefault(Locale.FRANCE); + List cookies = HttpCookie.parse("set-cookie: CUSTOMER=WILE_E_COYOTE; expires=Wednesday, 09-Nov-2019 23:12:40 GMT"); + if (cookies == null || cookies.isEmpty()) { + throw new RuntimeException("No cookie found"); + } + for (HttpCookie c : cookies) { + if (c.getMaxAge() == 0) { + throw new RuntimeException("Expiration date shouldn't be 0"); + } + } + } +} diff --git a/jdk/test/java/net/CookieHandler/TestHttpCookie.java b/jdk/test/java/net/CookieHandler/TestHttpCookie.java index 43d5484e27c..f1f89f8daab 100644 --- a/jdk/test/java/net/CookieHandler/TestHttpCookie.java +++ b/jdk/test/java/net/CookieHandler/TestHttpCookie.java @@ -24,7 +24,7 @@ /** * @test * @summary Unit test for java.net.HttpCookie - * @bug 6244040 6277796 6277801 6277808 6294071 6692802 + * @bug 6244040 6277796 6277801 6277808 6294071 6692802 6790677 * @author Edward Wang */ @@ -278,10 +278,6 @@ public class TestHttpCookie { .c("this is a coyote").cu("http://www.coyote.org").dsc(true) .d(".coyote.org").a(3600).port("80"); - // illegal characters in set-cookie header - test("Set-Cookie2:Customer=;Version#=\"1\";Path=&\"/acme\"") - .nil(); - // empty set-cookie string test("").nil(); @@ -311,6 +307,9 @@ public class TestHttpCookie { test("Set-Cookie2:C1=\"V1\";Domain=\".sun1.com\";path=\"/www1\";Max-Age=\"100\",C2=\"V2\";Domain=\".sun2.com\";path=\"/www2\";Max-Age=\"200\"") .n(0, "C1").v(0, "V1").p(0, "/www1").a(0, 100).d(0, ".sun1.com") .n(1, "C2").v(1, "V2").p(1, "/www2").a(1, 200).d(1, ".sun2.com"); + + // Bug 6790677: Should ignore bogus attributes + test("Set-Cookie2:C1=\"V1\";foobar").n(0, "C1").v(0, "V1"); } static void netscape() { diff --git a/jdk/test/java/net/URLClassLoader/closetest/CloseTest.java b/jdk/test/java/net/URLClassLoader/closetest/CloseTest.java new file mode 100644 index 00000000000..b0fdd577b42 --- /dev/null +++ b/jdk/test/java/net/URLClassLoader/closetest/CloseTest.java @@ -0,0 +1,246 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/** + * @test + * @bug 4167874 + * @library ../../../../com/sun/net/httpserver + * @build FileServerHandler + * @run shell build.sh + * @run main/othervm CloseTest + * @summary URL-downloaded jar files can consume all available file descriptors + */ + +import java.io.*; +import java.net.*; +import java.lang.reflect.*; +import java.util.concurrent.*; +import com.sun.net.httpserver.*; + +public class CloseTest { + + static void copyFile (String src, String dst) { + copyFile (new File(src), new File(dst)); + } + + static void copyDir (String src, String dst) { + copyDir (new File(src), new File(dst)); + } + + static void copyFile (File src, File dst) { + try { + if (!src.isFile()) { + throw new RuntimeException ("File not found: " + src.toString()); + } + dst.delete(); + dst.createNewFile(); + FileInputStream i = new FileInputStream (src); + FileOutputStream o = new FileOutputStream (dst); + byte[] buf = new byte [1024]; + int count; + while ((count=i.read(buf)) >= 0) { + o.write (buf, 0, count); + } + i.close(); + o.close(); + } catch (IOException e) { + throw new RuntimeException (e); + } + } + + static void rm_minus_rf (File path) { + if (!path.exists()) { + return; + } + if (path.isFile()) { + if (!path.delete()) { + throw new RuntimeException ("Could not delete " + path); + } + } else if (path.isDirectory ()) { + String[] names = path.list(); + File[] files = path.listFiles(); + for (int i=0; i 0) { + Frame f = new Frame(); + f.setSize(300, 300); + f.setBackground(Color.white); + f.show(); + } + + test1(); + test2(); + } + + static void test1() { + String target = "BACK WARDS"; + String str = "If this text is >" + target + "< the test passed."; + int start = str.indexOf(target); + int limit = start + target.length(); + + System.out.println("start: " + start + " limit: " + limit); + + AttributedString astr = new AttributedString(str); + astr.addAttribute(TextAttribute.BIDI_EMBEDDING, + new Integer(-1), + start, + limit); + + Bidi bidi = new Bidi(astr.getIterator()); + + for (int i = 0; i < bidi.getRunCount(); ++i) { + System.out.println("run " + i + + " from " + bidi.getRunStart(i) + + " to " + bidi.getRunLimit(i) + + " at level " + bidi.getRunLevel(i)); + } + + System.out.println(bidi); + + byte[] embs = new byte[str.length() + 3]; + for (int i = start + 1; i < limit + 1; ++i) { + embs[i] = -1; + } + + Bidi bidi2 = new Bidi(str.toCharArray(), 0, embs, 1, str.length(), Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT); + for (int i = 0; i < bidi2.getRunCount(); ++i) { + System.out.println("run " + i + + " from " + bidi2.getRunStart(i) + + " to " + bidi2.getRunLimit(i) + + " at level " + bidi2.getRunLevel(i)); + } + + System.out.println(bidi2); + + if (bidi.getRunCount() != 3 || bidi2.getRunCount() != 3) { + throw new Error("Bidi run count incorrect"); + } + } + + // make sure BIDI_EMBEDDING values of 0 are mapped to base run direction, instead of flagging an error. + static void test2() { + String target = "BACK WARDS"; + String str = "If this text is >" + target + "< the test passed."; + int length = str.length(); + int start = str.indexOf(target); + int limit = start + target.length(); + + System.out.println("start: " + start + " limit: " + limit); + + AttributedString astr = new AttributedString(str); + astr.addAttribute(TextAttribute.RUN_DIRECTION, TextAttribute.RUN_DIRECTION_RTL); + + astr.addAttribute(TextAttribute.BIDI_EMBEDDING, + new Integer(-3), + start, + limit); + + Bidi bidi = new Bidi(astr.getIterator()); + + for (int i = 0; i < bidi.getRunCount(); ++i) { + System.out.println("run " + i + + " from " + bidi.getRunStart(i) + + " to " + bidi.getRunLimit(i) + + " at level " + bidi.getRunLevel(i)); + } + + System.out.println(bidi); + + if (bidi.getRunCount() != 6) { // runs of spaces and angles at embedding bound,s and final period, each get level 1 + throw new Error("Bidi embedding processing failed"); + } + } +} diff --git a/jdk/test/java/text/Bidi/BidiSurrogateTest.java b/jdk/test/java/text/Bidi/BidiSurrogateTest.java new file mode 100644 index 00000000000..b24e1a1123f --- /dev/null +++ b/jdk/test/java/text/Bidi/BidiSurrogateTest.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4888843 + * @summary verify that surrogate pairs representing codepoints with R or AL directionality + * and correctly recognized and reordered. + */ + +import java.text.Bidi; + +public class BidiSurrogateTest { + private static final String RTLS = new String(Character.toChars(0x10800)); // surrogate code point with R directionality + private static final String LTRS = new String(Character.toChars(0x107ff)); // surrogate code point with L directionality + private static final String LRE = "\u202a"; + private static final String RLE = "\u202b"; + private static final String PDF = "\u202c"; + + + public static void main(String[] args) { + new BidiSurrogateTest().test(); + } + + void test() { + test0(); + test1(); + } + + void test0() { + // test unpaired surrogates - should have L directionality + testRequiresBidi("\ud800", false); // unpaired lead surrogate + testRequiresBidi("\udc00", false); // unpaired trail surrogate + testRequiresBidi("\udc00\ud800", false); // out of order surrogates + testRequiresBidi("a\udc00b\ud800c", false); // out of order surrogates split + testRequiresBidi(LTRS, false); // supplementary with L + testRequiresBidi(RTLS, true); // supplementary with R + testRequiresBidi("a" + RTLS + "b", true); // R supplementary in LTR text + testRequiresBidi(LTRS + RTLS, true); // R supplementary in LTR supplementary text + testRequiresBidi(LRE, false); // LRE lone embedding + testRequiresBidi(RLE, true); // RLE lone embedding + testRequiresBidi(PDF, false); // PDF lone pop embedding + } + + void testRequiresBidi(String string, boolean requiresBidi) { + char[] text = string.toCharArray(); + if (Bidi.requiresBidi(text, 0, text.length) != requiresBidi) { + throw new RuntimeException("testRequiresBidi failed with '" + string + "', " + requiresBidi); + } + } + + void test1() { + // test that strings with surrogate runs process surrogate directionality ok + testBidi("This is a string with " + LTRS + " in it.", false); + testBidi("This is a string with \ud800 in it.", false); + testBidi("This is a string with \u0640 in it.", 22, 1); + testBidi(RTLS, true); + testBidi("This is a string with " + RTLS + RTLS + RTLS + " in it.", 22, 6); + } + + void testBidi(String string, boolean directionIsRTL) { + Bidi bidi = new Bidi(string, Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT); + if (bidi.isMixed()) { + throw new RuntimeException("bidi is mixed"); + } + if (bidi.isRightToLeft() != directionIsRTL) { + throw new RuntimeException("bidi is not " + (directionIsRTL ? "rtl" : "ltr")); + } + } + + void testBidi(String string, int rtlstart, int rtllength) { + Bidi bidi = new Bidi(string, Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT); + for (int i = 0; i < bidi.getRunCount(); ++i) { + if ((bidi.getRunLevel(i) & 1) != 0) { + if (bidi.getRunStart(i) != rtlstart || + bidi.getRunLimit(i) != rtlstart + rtllength) { + throw new RuntimeException("first rtl run didn't match " + rtlstart + ", " + rtllength); + } + break; + } + } + } +} diff --git a/jdk/test/java/text/Format/DateFormat/Bug4823811.java b/jdk/test/java/text/Format/DateFormat/Bug4823811.java index 65b4aa26349..6aa0787bfc2 100644 --- a/jdk/test/java/text/Format/DateFormat/Bug4823811.java +++ b/jdk/test/java/text/Format/DateFormat/Bug4823811.java @@ -25,6 +25,7 @@ * @test * @bug 4823811 * @summary Confirm that text which includes numbers with a trailing minus sign is parsed correctly. + * @run main/othervm -Duser.timezone=GMT+09:00 Bug4823811 */ import java.text.*; diff --git a/jdk/test/java/text/Format/DateFormat/Bug6683975.java b/jdk/test/java/text/Format/DateFormat/Bug6683975.java new file mode 100644 index 00000000000..0638c557158 --- /dev/null +++ b/jdk/test/java/text/Format/DateFormat/Bug6683975.java @@ -0,0 +1,114 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/** + * @test + * @bug 6683975 + * @summary Make sure that date is formatted correctlyin th locale. + */ +import java.text.*; +import java.util.*; + +public class Bug6683975 { + + private static boolean err = false; + + private static Locale th = new Locale("th", ""); + private static Locale th_TH = new Locale("th", "TH"); + private static String expected_th[] = { + "\u0e27\u0e31\u0e19\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23\u0e17\u0e35\u0e48 30 \u0e01\u0e31\u0e19\u0e22\u0e32\u0e22\u0e19 \u0e04.\u0e28. 2008, 8 \u0e19\u0e32\u0e2c\u0e34\u0e01\u0e32 0 \u0e19\u0e32\u0e17\u0e35 00 \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35", // 0: FULL + "30 \u0e01\u0e31\u0e19\u0e22\u0e32\u0e22\u0e19 2008, 8 \u0e19\u0e32\u0e2c\u0e34\u0e01\u0e32 0 \u0e19\u0e32\u0e17\u0e35", // 1: LONG + "30 \u0e01.\u0e22. 2008, 8:00:00", // 2: MEDIUM + "30/9/2008, 8:00 \u0e19.", // 3: SHORT + }; + private static String expected_th_TH[] = { + "\u0e27\u0e31\u0e19\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23\u0e17\u0e35\u0e48 30 \u0e01\u0e31\u0e19\u0e22\u0e32\u0e22\u0e19 \u0e1e.\u0e28. 2551, 8 \u0e19\u0e32\u0e2c\u0e34\u0e01\u0e32 0 \u0e19\u0e32\u0e17\u0e35 00 \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35", // 0: FULL + "30 \u0e01\u0e31\u0e19\u0e22\u0e32\u0e22\u0e19 2551, 8 \u0e19\u0e32\u0e2c\u0e34\u0e01\u0e32 0 \u0e19\u0e32\u0e17\u0e35", // 1: LONG + "30 \u0e01.\u0e22. 2551, 8:00:00", // 2: MEDIUM + "30/9/2551, 8:00 \u0e19." // 3: SHORT + }; + private static String stylePattern[] = { + "FULL", "LONG", "MEDIUM", "SHORT" + }; + + private static void test(int style) { + DateFormat df_th = DateFormat.getDateTimeInstance(style, style, th); + DateFormat df_th_TH = DateFormat.getDateTimeInstance(style, style, th_TH); + + String str_th = ((SimpleDateFormat)df_th).toPattern(); + String str_th_TH = ((SimpleDateFormat)df_th_TH).toPattern(); + if (!str_th.equals(str_th_TH)) { + err = true; + System.err.println("Error: Pattern for th locale should be the same as pattern for th_TH locale. (" + stylePattern[style] + ")"); + System.err.println("\tth: " + str_th); + System.err.println("\tth_TH: " + str_th_TH); + } + + Date date = new Date(2008-1900, Calendar.SEPTEMBER, 30, 8, 0, 0); + str_th = df_th.format(date); + if (!expected_th[style].equals(str_th)) { + err = true; + System.err.println("Error: Formatted date in th locale is incorrect in " + stylePattern[style] + " pattern."); + System.err.println("\tExpected: " + expected_th[style]); + System.err.println("\tGot: " + str_th); + } + + str_th_TH = df_th_TH.format(date); + if (!expected_th_TH[style].equals(str_th_TH)) { + err = true; + System.err.println("Error: Formatted date in th_TH locale is incorrect in " + stylePattern[style] + " pattern."); + System.err.println("\tExpected: " + expected_th_TH[style]); + System.err.println("\tGot: " + str_th_TH); + } + } + + public static void main(String[] args) { + TimeZone timezone = TimeZone.getDefault(); + Locale locale = Locale.getDefault(); + + TimeZone.setDefault(TimeZone.getTimeZone("US/Pacific")); + Locale.setDefault(Locale.US); + + try { + test(DateFormat.FULL); + test(DateFormat.LONG); + test(DateFormat.MEDIUM); + test(DateFormat.SHORT); + } + catch (Exception e) { + err = true; + System.err.println("Unexpected exception was thrown: " + e); + } + finally { + TimeZone.setDefault(timezone); + Locale.setDefault(locale); + + if (err) { + throw new RuntimeException("Failed."); + } else { + System.out.println("Passed."); + } + } + } + +} diff --git a/jdk/test/java/util/Calendar/Bug6645263.java b/jdk/test/java/util/Calendar/Bug6645263.java new file mode 100644 index 00000000000..148926e6210 --- /dev/null +++ b/jdk/test/java/util/Calendar/Bug6645263.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +/* + * @test + * @bug 6645263 + * @summary Test field normalization in non-lenient from the partially normalized state + */ + +import java.util.*; + +public class Bug6645263 { + public static void main(String[] args) { + Calendar cal = new GregorianCalendar(Locale.US); + cal.setLenient(false); + cal.set(Calendar.YEAR, 2007); + cal.set(Calendar.MONTH, Calendar.NOVEMBER); + cal.set(Calendar.WEEK_OF_MONTH, 4); + cal.set(Calendar.DAY_OF_WEEK, 1); + // Let cal calculate the time from the given fields + cal.getTime(); + + // Change DAY_OF_MONTH + cal.set(Calendar.DAY_OF_MONTH, 1); + // The following line shouldn't throw an IllegalArgumentException. + cal.getTime(); + } +} diff --git a/jdk/test/java/util/Currency/ValidateISO4217.java b/jdk/test/java/util/Currency/ValidateISO4217.java index ed1f2bc259d..c925554f77b 100644 --- a/jdk/test/java/util/Currency/ValidateISO4217.java +++ b/jdk/test/java/util/Currency/ValidateISO4217.java @@ -22,7 +22,7 @@ */ /* * @test - * @bug 4691089 4819436 4942982 5104960 6544471 + * @bug 4691089 4819436 4942982 5104960 6544471 6627549 * @summary Validate ISO 4217 data for Currency class. */ @@ -86,6 +86,8 @@ public class ValidateISO4217 { {"JE", "GBP", "826", "2"}, // Jersey {"GG", "GBP", "826", "2"}, // Guernsey {"IM", "GBP", "826", "2"}, // Isle of Man + {"BL", "EUR", "978", "2"}, // Saint Barthelemy + {"MF", "EUR", "978", "2"}, // Saint Martin }; /* Codes that are obsolete, do not have related country */ diff --git a/jdk/test/java/util/Formatter/Basic-X.java b/jdk/test/java/util/Formatter/Basic-X.java index b4a603f7bcd..4677062cc14 100644 --- a/jdk/test/java/util/Formatter/Basic-X.java +++ b/jdk/test/java/util/Formatter/Basic-X.java @@ -1054,6 +1054,52 @@ public class Basic$Type$ extends Basic { test("%4.1f", " 1.0", val); test("%4.2f", "0.99", val); test("%4.3f", "0.990", val); + + // #6476425 + val = new BigDecimal("0.00001"); + test("%.0f", "0", val); + test("%.1f", "0.0", val); + test("%.2f", "0.00", val); + test("%.3f", "0.000", val); + test("%.4f", "0.0000", val); + test("%.5f", "0.00001", val); + + val = new BigDecimal("1.00001"); + test("%.0f", "1", val); + test("%.1f", "1.0", val); + test("%.2f", "1.00", val); + test("%.3f", "1.000", val); + test("%.4f", "1.0000", val); + test("%.5f", "1.00001", val); + + val = new BigDecimal("1.23456"); + test("%.0f", "1", val); + test("%.1f", "1.2", val); + test("%.2f", "1.23", val); + test("%.3f", "1.235", val); + test("%.4f", "1.2346", val); + test("%.5f", "1.23456", val); + test("%.6f", "1.234560", val); + + val = new BigDecimal("9.99999"); + test("%.0f", "10", val); + test("%.1f", "10.0", val); + test("%.2f", "10.00", val); + test("%.3f", "10.000", val); + test("%.4f", "10.0000", val); + test("%.5f", "9.99999", val); + test("%.6f", "9.999990", val); + + + val = new BigDecimal("1.99999"); + test("%.0f", "2", val); + test("%.1f", "2.0", val); + test("%.2f", "2.00", val); + test("%.3f", "2.000", val); + test("%.4f", "2.0000", val); + test("%.5f", "1.99999", val); + test("%.6f", "1.999990", val); + #end[BigDecimal] #if[float] diff --git a/jdk/test/java/util/Formatter/Basic.java b/jdk/test/java/util/Formatter/Basic.java index 22d92495d49..3a957b2f4fa 100644 --- a/jdk/test/java/util/Formatter/Basic.java +++ b/jdk/test/java/util/Formatter/Basic.java @@ -25,7 +25,7 @@ * @summary Unit test for formatter * @bug 4906370 4962433 4973103 4989961 5005818 5031150 4970931 4989491 5002937 * 5005104 5007745 5061412 5055180 5066788 5088703 6317248 6318369 6320122 - * 6344623 6369500 6534606 6282094 6286592 + * 6344623 6369500 6534606 6282094 6286592 6476425 * * @run shell/timeout=240 Basic.sh */ diff --git a/jdk/test/java/util/Formatter/BasicBigDecimal.java b/jdk/test/java/util/Formatter/BasicBigDecimal.java index d35da256576..da96391384c 100644 --- a/jdk/test/java/util/Formatter/BasicBigDecimal.java +++ b/jdk/test/java/util/Formatter/BasicBigDecimal.java @@ -1055,6 +1055,52 @@ public class BasicBigDecimal extends Basic { test("%4.2f", "0.99", val); test("%4.3f", "0.990", val); + // #6476425 + val = new BigDecimal("0.00001"); + test("%.0f", "0", val); + test("%.1f", "0.0", val); + test("%.2f", "0.00", val); + test("%.3f", "0.000", val); + test("%.4f", "0.0000", val); + test("%.5f", "0.00001", val); + + val = new BigDecimal("1.00001"); + test("%.0f", "1", val); + test("%.1f", "1.0", val); + test("%.2f", "1.00", val); + test("%.3f", "1.000", val); + test("%.4f", "1.0000", val); + test("%.5f", "1.00001", val); + + val = new BigDecimal("1.23456"); + test("%.0f", "1", val); + test("%.1f", "1.2", val); + test("%.2f", "1.23", val); + test("%.3f", "1.235", val); + test("%.4f", "1.2346", val); + test("%.5f", "1.23456", val); + test("%.6f", "1.234560", val); + + val = new BigDecimal("9.99999"); + test("%.0f", "10", val); + test("%.1f", "10.0", val); + test("%.2f", "10.00", val); + test("%.3f", "10.000", val); + test("%.4f", "10.0000", val); + test("%.5f", "9.99999", val); + test("%.6f", "9.999990", val); + + + val = new BigDecimal("1.99999"); + test("%.0f", "2", val); + test("%.1f", "2.0", val); + test("%.2f", "2.00", val); + test("%.3f", "2.000", val); + test("%.4f", "2.0000", val); + test("%.5f", "1.99999", val); + test("%.6f", "1.999990", val); + + diff --git a/jdk/test/java/util/Formatter/BasicBigInteger.java b/jdk/test/java/util/Formatter/BasicBigInteger.java index e93f60d398d..4bba5a0fbe4 100644 --- a/jdk/test/java/util/Formatter/BasicBigInteger.java +++ b/jdk/test/java/util/Formatter/BasicBigInteger.java @@ -1503,6 +1503,52 @@ public class BasicBigInteger extends Basic { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jdk/test/java/util/Formatter/BasicBoolean.java b/jdk/test/java/util/Formatter/BasicBoolean.java index c7af21083aa..ea60e388652 100644 --- a/jdk/test/java/util/Formatter/BasicBoolean.java +++ b/jdk/test/java/util/Formatter/BasicBoolean.java @@ -1503,6 +1503,52 @@ public class BasicBoolean extends Basic { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jdk/test/java/util/Formatter/BasicBooleanObject.java b/jdk/test/java/util/Formatter/BasicBooleanObject.java index 81c1f3e1ada..b4fbabb76b8 100644 --- a/jdk/test/java/util/Formatter/BasicBooleanObject.java +++ b/jdk/test/java/util/Formatter/BasicBooleanObject.java @@ -1503,6 +1503,52 @@ public class BasicBooleanObject extends Basic { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jdk/test/java/util/Formatter/BasicByte.java b/jdk/test/java/util/Formatter/BasicByte.java index ff44286fdc3..deaf37957e5 100644 --- a/jdk/test/java/util/Formatter/BasicByte.java +++ b/jdk/test/java/util/Formatter/BasicByte.java @@ -1503,6 +1503,52 @@ public class BasicByte extends Basic { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jdk/test/java/util/Formatter/BasicByteObject.java b/jdk/test/java/util/Formatter/BasicByteObject.java index e2b158c3e85..06eb68ebd27 100644 --- a/jdk/test/java/util/Formatter/BasicByteObject.java +++ b/jdk/test/java/util/Formatter/BasicByteObject.java @@ -1503,6 +1503,52 @@ public class BasicByteObject extends Basic { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jdk/test/java/util/Formatter/BasicChar.java b/jdk/test/java/util/Formatter/BasicChar.java index bb1b5037e88..5ada7b166e7 100644 --- a/jdk/test/java/util/Formatter/BasicChar.java +++ b/jdk/test/java/util/Formatter/BasicChar.java @@ -1503,6 +1503,52 @@ public class BasicChar extends Basic { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jdk/test/java/util/Formatter/BasicCharObject.java b/jdk/test/java/util/Formatter/BasicCharObject.java index 2d15fa1c528..1e7d05d543f 100644 --- a/jdk/test/java/util/Formatter/BasicCharObject.java +++ b/jdk/test/java/util/Formatter/BasicCharObject.java @@ -1503,6 +1503,52 @@ public class BasicCharObject extends Basic { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jdk/test/java/util/Formatter/BasicDateTime.java b/jdk/test/java/util/Formatter/BasicDateTime.java index 97ae65026bb..fd42da06f70 100644 --- a/jdk/test/java/util/Formatter/BasicDateTime.java +++ b/jdk/test/java/util/Formatter/BasicDateTime.java @@ -1503,6 +1503,52 @@ public class BasicDateTime extends Basic { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jdk/test/java/util/Formatter/BasicDouble.java b/jdk/test/java/util/Formatter/BasicDouble.java index abbd093fc0a..d985b46b1a5 100644 --- a/jdk/test/java/util/Formatter/BasicDouble.java +++ b/jdk/test/java/util/Formatter/BasicDouble.java @@ -1053,6 +1053,52 @@ public class BasicDouble extends Basic { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jdk/test/java/util/Formatter/BasicDoubleObject.java b/jdk/test/java/util/Formatter/BasicDoubleObject.java index d49f9e60910..70dfd2929e5 100644 --- a/jdk/test/java/util/Formatter/BasicDoubleObject.java +++ b/jdk/test/java/util/Formatter/BasicDoubleObject.java @@ -1053,6 +1053,52 @@ public class BasicDoubleObject extends Basic { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jdk/test/java/util/Formatter/BasicFloat.java b/jdk/test/java/util/Formatter/BasicFloat.java index 61493b59b98..122b44f1e75 100644 --- a/jdk/test/java/util/Formatter/BasicFloat.java +++ b/jdk/test/java/util/Formatter/BasicFloat.java @@ -1056,6 +1056,52 @@ public class BasicFloat extends Basic { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + //--------------------------------------------------------------------- // %f - float diff --git a/jdk/test/java/util/Formatter/BasicFloatObject.java b/jdk/test/java/util/Formatter/BasicFloatObject.java index fb7bffa150f..64c874cf2d5 100644 --- a/jdk/test/java/util/Formatter/BasicFloatObject.java +++ b/jdk/test/java/util/Formatter/BasicFloatObject.java @@ -1069,6 +1069,52 @@ public class BasicFloatObject extends Basic { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jdk/test/java/util/Formatter/BasicInt.java b/jdk/test/java/util/Formatter/BasicInt.java index 1945d5b612a..4010d2250e0 100644 --- a/jdk/test/java/util/Formatter/BasicInt.java +++ b/jdk/test/java/util/Formatter/BasicInt.java @@ -1503,6 +1503,52 @@ public class BasicInt extends Basic { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jdk/test/java/util/Formatter/BasicIntObject.java b/jdk/test/java/util/Formatter/BasicIntObject.java index 267ffd2eb95..fe41ea2964b 100644 --- a/jdk/test/java/util/Formatter/BasicIntObject.java +++ b/jdk/test/java/util/Formatter/BasicIntObject.java @@ -1503,6 +1503,52 @@ public class BasicIntObject extends Basic { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jdk/test/java/util/Formatter/BasicLong.java b/jdk/test/java/util/Formatter/BasicLong.java index 151dcb78975..fe232f1978e 100644 --- a/jdk/test/java/util/Formatter/BasicLong.java +++ b/jdk/test/java/util/Formatter/BasicLong.java @@ -1503,6 +1503,52 @@ public class BasicLong extends Basic { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jdk/test/java/util/Formatter/BasicLongObject.java b/jdk/test/java/util/Formatter/BasicLongObject.java index 3944418b3a6..c99e0ba3c2a 100644 --- a/jdk/test/java/util/Formatter/BasicLongObject.java +++ b/jdk/test/java/util/Formatter/BasicLongObject.java @@ -1503,6 +1503,52 @@ public class BasicLongObject extends Basic { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jdk/test/java/util/Formatter/BasicShort.java b/jdk/test/java/util/Formatter/BasicShort.java index 5554c15382d..39079e4ad1e 100644 --- a/jdk/test/java/util/Formatter/BasicShort.java +++ b/jdk/test/java/util/Formatter/BasicShort.java @@ -1503,6 +1503,52 @@ public class BasicShort extends Basic { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jdk/test/java/util/Formatter/BasicShortObject.java b/jdk/test/java/util/Formatter/BasicShortObject.java index 629fb573674..e2dcc230174 100644 --- a/jdk/test/java/util/Formatter/BasicShortObject.java +++ b/jdk/test/java/util/Formatter/BasicShortObject.java @@ -1503,6 +1503,52 @@ public class BasicShortObject extends Basic { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jdk/test/java/util/Formatter/genBasic.sh b/jdk/test/java/util/Formatter/genBasic.sh index 493e0360444..2c352ad39cf 100644 --- a/jdk/test/java/util/Formatter/genBasic.sh +++ b/jdk/test/java/util/Formatter/genBasic.sh @@ -23,14 +23,14 @@ # have any questions. # -SPP='sh ../../../../make/java/nio/spp.sh' +javac -d . ../../../../make/tools/src/build/tools/spp/Spp.java gen() { # if [ $3 = "true" ] # then $SPP -K$1 -Dtype=$1 -DType=$2 -KprimBasic$2.java # else $SPP -K$1 -Dtype=$1 -DType=$2 -K$3 Basic$2.java # fi - $SPP -K$1 -Dtype=$1 -DType=$2 -K$3 -K$4 -K$5 -K$6 Basic$2.java + java build.tools.spp.Spp -K$1 -Dtype=$1 -DType=$2 -K$3 -K$4 -K$5 -K$6 Basic$2.java } gen boolean Boolean prim "" "" "" @@ -54,3 +54,5 @@ gen Double DoubleObject "" fp "" "" gen BigDecimal BigDecimal "" fp "" "" gen Calendar DateTime "" "" "" datetime + +rm -rf build diff --git a/jdk/test/java/util/Locale/LocaleTest.java b/jdk/test/java/util/Locale/LocaleTest.java index 1bd3bd1dbe2..99fa44b7842 100644 --- a/jdk/test/java/util/Locale/LocaleTest.java +++ b/jdk/test/java/util/Locale/LocaleTest.java @@ -24,7 +24,7 @@ * @test * @bug 4052404 4052440 4084688 4092475 4101316 4105828 4107014 4107953 4110613 * 4118587 4118595 4122371 4126371 4126880 4135316 4135752 4139504 4139940 4143951 - * 4147315 4147317 4147552 4335196 4778440 5010672 6475525 6544471 + * 4147315 4147317 4147552 4335196 4778440 5010672 6475525 6544471 6627549 6786276 * @summary test Locales */ /* @@ -439,8 +439,8 @@ public class LocaleTest extends LocaleTestFmwk { String[] spotCheck2 = { "US", "CA", "GB", "FR", "DE", "IT", "JP", "KR", "CN", "TW", "TH" }; - if (test.length != 245) - errln("Expected getISOCountries to return 245 countries; it returned " + test.length); + if (test.length != 246) + errln("Expected getISOCountries to return 246 countries; it returned " + test.length); else { for (int i = 0; i < spotCheck2.length; i++) { int j; diff --git a/jdk/test/java/util/Locale/data/deflocale.sol10 b/jdk/test/java/util/Locale/data/deflocale.sol10 index f79d413663d..712a1e159ec 100644 --- a/jdk/test/java/util/Locale/data/deflocale.sol10 +++ b/jdk/test/java/util/Locale/data/deflocale.sol10 @@ -1,7 +1,7 @@ Solaris 10 3/05 s10_74L2a SPARC - Copyright 2005 Sun Microsystems, Inc. All Rights Reserved. - Use is subject to license terms. - Assembled 22 January 2005 + + (copyright from `uname -a` goes here) + SunOS deltas4 5.10 Generic_118833-03 sun4u sparc SUNW,Sun-Blade-2500 OS Locale: C diff --git a/jdk/test/javax/sound/midi/Gervill/AudioFloatConverter/GetFormat.java b/jdk/test/javax/sound/midi/Gervill/AudioFloatConverter/GetFormat.java new file mode 100644 index 00000000000..5dbfbce300b --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/AudioFloatConverter/GetFormat.java @@ -0,0 +1,41 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test AudioFloatConverter getFormat method */ + +import javax.sound.sampled.*; +import com.sun.media.sound.*; + +public class GetFormat { + + public static void main(String[] args) throws Exception { + AudioFormat frm = new AudioFormat(8000, 16, 1, true, false); + AudioFloatConverter conv = AudioFloatConverter.getConverter(frm); + if(!conv.getFormat().matches(frm)) + throw new RuntimeException("Incorrect audio format returned."); + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/AudioFloatConverter/ToFloatArray.java b/jdk/test/javax/sound/midi/Gervill/AudioFloatConverter/ToFloatArray.java new file mode 100644 index 00000000000..c76097c0925 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/AudioFloatConverter/ToFloatArray.java @@ -0,0 +1,160 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test AudioFloatConverter toFloatArray method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ToFloatArray { + + public static void main(String[] args) throws Exception { + float[] testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + + // Check conversion using PCM_FLOAT + for (int big = 0; big < 2; big+=1) + for (int bits = 32; bits <= 64; bits+=32) { + AudioFormat frm = new AudioFormat( + AudioFloatConverter.PCM_FLOAT, + 44100, bits, 1, bits/8, + 44100, big==1); + byte[] buff = new byte[testarray.length * frm.getFrameSize()]; + float[] testarray2 = new float[testarray.length]; + AudioFloatConverter conv = AudioFloatConverter.getConverter(frm); + conv.toByteArray(testarray, buff); + conv.toFloatArray(buff, testarray2); + for (int i = 0; i < testarray2.length; i++) { + if(Math.abs(testarray[i] - testarray2[i]) > 0.05) + throw new RuntimeException("Conversion failed for " + frm +" , arrays not equal enough!\n"); + } + } + + // Check conversion from float2byte and byte2float. + for (int big = 0; big < 2; big+=1) + for (int signed = 0; signed < 2; signed+=1) + for (int bits = 6; bits <= 40; bits+=2) { + AudioFormat frm = new AudioFormat(44100, bits, 1, signed==1, big==1); + byte[] buff = new byte[testarray.length * frm.getFrameSize()]; + float[] testarray2 = new float[testarray.length]; + AudioFloatConverter conv = AudioFloatConverter.getConverter(frm); + conv.toByteArray(testarray, buff); + conv.toFloatArray(buff, testarray2); + for (int i = 0; i < testarray2.length; i++) { + if(Math.abs(testarray[i] - testarray2[i]) > 0.05) + throw new RuntimeException("Conversion failed for " + frm +" , arrays not equal enough!\n"); + } + } + + // Check big/little + for (int big = 0; big < 2; big+=1) + for (int signed = 0; signed < 2; signed+=1) + for (int bits = 6; bits <= 40; bits+=2) { + AudioFormat frm = new AudioFormat(44100, bits, 1, signed==1, big==1); + byte[] buff = new byte[testarray.length * frm.getFrameSize()]; + AudioFloatConverter conv = AudioFloatConverter.getConverter(frm); + conv.toByteArray(testarray, buff); + byte[] buff2 = new byte[testarray.length * frm.getFrameSize()]; + int fs = frm.getFrameSize(); + for (int i = 0; i < buff2.length; i+=fs) { + for (int j = 0; j < fs; j++) { + buff2[i+(fs-j-1)] = buff[i+j]; + } + } + float[] testarray2 = new float[testarray.length]; + AudioFormat frm2 = new AudioFormat(44100, bits, 1, signed==1, big==0); + AudioFloatConverter.getConverter(frm2).toFloatArray(buff2, testarray2); + for (int i = 0; i < testarray2.length; i++) { + if(Math.abs(testarray[i] - testarray2[i]) > 0.05) + { + throw new RuntimeException("Conversion failed for " + frm +" to " + frm2 + " , arrays not equal enough!\n"); + } + } + } + + // Check signed/unsigned + for (int big = 0; big < 2; big+=1) + for (int signed = 0; signed < 2; signed+=1) + for (int bits = 6; bits <= 40; bits+=2) { + AudioFormat frm = new AudioFormat(44100, bits, 1, signed==1, big==1); + byte[] b = new byte[testarray.length * frm.getFrameSize()]; + AudioFloatConverter conv = AudioFloatConverter.getConverter(frm); + conv.toByteArray(testarray, b); + int fs = frm.getFrameSize(); + if(big==1) + { + for(int i=0; i < b.length; i+= fs ) + b[i] = (b[i] >= 0) ? (byte)(0x80 | b[i]) : (byte)(0x7F & b[i]); + } + else + { + for(int i=(0+fs-1); i < b.length; i+= fs ) + b[i] = (b[i] >= 0) ? (byte)(0x80 | b[i]) : (byte)(0x7F & b[i]); + } + float[] testarray2 = new float[testarray.length]; + AudioFormat frm2 = new AudioFormat(44100, bits, 1, signed==0, big==1); + AudioFloatConverter.getConverter(frm2).toFloatArray(b, testarray2); + for (int i = 0; i < testarray2.length; i++) { + if(Math.abs(testarray[i] - testarray2[i]) > 0.05) + { + throw new RuntimeException("Conversion failed for " + frm +" to " + frm2 + " , arrays not equal enough!\n"); + } + } + } + + // Check if conversion 32->24, 24->16, 16->8 result in same float data + AudioFormat frm = new AudioFormat(44100, 40, 1, true, true); + byte[] b = new byte[testarray.length * frm.getFrameSize()]; + AudioFloatConverter.getConverter(frm).toByteArray(testarray, b); + for (int bits = 6; bits <= 40; bits+=2) { + AudioFormat frm2 = new AudioFormat(44100, bits, 1, true, true); + byte[] b2 = new byte[testarray.length * frm2.getFrameSize()]; + int fs1 = frm.getFrameSize(); + int fs2 = frm2.getFrameSize(); + int ii = 0; + for (int i = 0; i < b.length; i+=fs1) + for (int j = 0; j < fs2; j++) + b2[ii++] = b[i+j]; + float[] testarray2 = new float[testarray.length]; + AudioFloatConverter.getConverter(frm2).toFloatArray(b2, testarray2); + for (int i = 0; i < testarray2.length; i++) { + if(Math.abs(testarray[i] - testarray2[i]) > 0.05) + { + throw new RuntimeException("Conversion failed for " + frm +" to " + frm2 + " , arrays not equal enough!\n"); + } + } + } + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/Available.java b/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/Available.java new file mode 100644 index 00000000000..49e51ede2ee --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/Available.java @@ -0,0 +1,81 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test AudioFloatInputStream available method */ + +import java.io.*; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Available { + + static float[] test_float_array; + static byte[] test_byte_array; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static AudioFloatInputStream getStream1() + { + return AudioFloatInputStream.getInputStream(format, test_byte_array, 0, test_byte_array.length); + } + + static AudioFloatInputStream getStream2() + { + AudioInputStream strm = new AudioInputStream(new ByteArrayInputStream(test_byte_array), format, 1024); + return AudioFloatInputStream.getInputStream(strm); + } + + static void setUp() throws Exception { + test_float_array = new float[1024]; + test_byte_array = new byte[1024*format.getFrameSize()]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + test_float_array[i] = (float)Math.sin(10*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + test_float_array[i] *= 0.3; + } + AudioFloatConverter.getConverter(format).toByteArray(test_float_array, test_byte_array); + } + + public static void main(String[] args) throws Exception { + setUp(); + for (int i = 0; i < 2; i++) { + AudioFloatInputStream stream = null; + if(i == 0) stream = getStream1(); + if(i == 1) stream = getStream2(); + float[] buff = new float[512]; + if(stream.available() != 1024) + throw new RuntimeException("stream.available return incorrect value."); + stream.read(buff); + if(stream.available() != 512) + throw new RuntimeException("stream.available return incorrect value."); + } + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/Close.java b/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/Close.java new file mode 100644 index 00000000000..76de1f91246 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/Close.java @@ -0,0 +1,72 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test AudioFloatInputStream close method */ + +import java.io.*; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Close { + + static float[] test_float_array; + static byte[] test_byte_array; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static AudioFloatInputStream getStream1() + { + return AudioFloatInputStream.getInputStream(format, test_byte_array, 0, test_byte_array.length); + } + + static AudioFloatInputStream getStream2() + { + AudioInputStream strm = new AudioInputStream(new ByteArrayInputStream(test_byte_array), format, 1024); + return AudioFloatInputStream.getInputStream(strm); + } + + static void setUp() throws Exception { + test_float_array = new float[1024]; + test_byte_array = new byte[1024*format.getFrameSize()]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + test_float_array[i] = (float)Math.sin(10*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + test_float_array[i] *= 0.3; + } + AudioFloatConverter.getConverter(format).toByteArray(test_float_array, test_byte_array); + } + + public static void main(String[] args) throws Exception { + setUp(); + getStream1().close(); + getStream2().close(); + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/GetFormat.java b/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/GetFormat.java new file mode 100644 index 00000000000..b161ecb93e5 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/GetFormat.java @@ -0,0 +1,74 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test AudioFloatInputStream getFormat method */ + +import java.io.*; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetFormat { + + static float[] test_float_array; + static byte[] test_byte_array; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static AudioFloatInputStream getStream1() + { + return AudioFloatInputStream.getInputStream(format, test_byte_array, 0, test_byte_array.length); + } + + static AudioFloatInputStream getStream2() + { + AudioInputStream strm = new AudioInputStream(new ByteArrayInputStream(test_byte_array), format, 1024); + return AudioFloatInputStream.getInputStream(strm); + } + + static void setUp() throws Exception { + test_float_array = new float[1024]; + test_byte_array = new byte[1024*format.getFrameSize()]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + test_float_array[i] = (float)Math.sin(10*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + test_float_array[i] *= 0.3; + } + AudioFloatConverter.getConverter(format).toByteArray(test_float_array, test_byte_array); + } + + public static void main(String[] args) throws Exception { + setUp(); + if(!getStream1().getFormat().matches(format)) + throw new RuntimeException("Incorrect audio format returned."); + if(!getStream2().getFormat().matches(format)) + throw new RuntimeException("Incorrect audio format returned."); + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/GetFrameLength.java b/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/GetFrameLength.java new file mode 100644 index 00000000000..530896ae5e5 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/GetFrameLength.java @@ -0,0 +1,74 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test AudioFloatInputStream getFrameLength method */ + +import java.io.*; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetFrameLength { + + static float[] test_float_array; + static byte[] test_byte_array; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static AudioFloatInputStream getStream1() + { + return AudioFloatInputStream.getInputStream(format, test_byte_array, 0, test_byte_array.length); + } + + static AudioFloatInputStream getStream2() + { + AudioInputStream strm = new AudioInputStream(new ByteArrayInputStream(test_byte_array), format, 1024); + return AudioFloatInputStream.getInputStream(strm); + } + + static void setUp() throws Exception { + test_float_array = new float[1024]; + test_byte_array = new byte[1024*format.getFrameSize()]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + test_float_array[i] = (float)Math.sin(10*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + test_float_array[i] *= 0.3; + } + AudioFloatConverter.getConverter(format).toByteArray(test_float_array, test_byte_array); + } + + public static void main(String[] args) throws Exception { + setUp(); + if(getStream1().getFrameLength() != 1024L) + throw new RuntimeException("Incorrect frame length returned."); + if(getStream2().getFrameLength() != 1024L) + throw new RuntimeException("Incorrect frame length returned."); + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/MarkSupported.java b/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/MarkSupported.java new file mode 100644 index 00000000000..6120494419a --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/MarkSupported.java @@ -0,0 +1,74 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test AudioFloatInputStream markSupported method */ + +import java.io.*; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class MarkSupported { + + static float[] test_float_array; + static byte[] test_byte_array; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static AudioFloatInputStream getStream1() + { + return AudioFloatInputStream.getInputStream(format, test_byte_array, 0, test_byte_array.length); + } + + static AudioFloatInputStream getStream2() + { + AudioInputStream strm = new AudioInputStream(new ByteArrayInputStream(test_byte_array), format, 1024); + return AudioFloatInputStream.getInputStream(strm); + } + + static void setUp() throws Exception { + test_float_array = new float[1024]; + test_byte_array = new byte[1024*format.getFrameSize()]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + test_float_array[i] = (float)Math.sin(10*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + test_float_array[i] *= 0.3; + } + AudioFloatConverter.getConverter(format).toByteArray(test_float_array, test_byte_array); + } + + public static void main(String[] args) throws Exception { + setUp(); + if(!getStream1().markSupported()) + throw new RuntimeException("Mark not supported."); + if(!getStream2().markSupported()) + throw new RuntimeException("Mark not supported."); + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/Read.java b/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/Read.java new file mode 100644 index 00000000000..ab23fac2649 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/Read.java @@ -0,0 +1,83 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test AudioFloatInputStream read method */ + +import java.io.*; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Read { + + static float[] test_float_array; + static byte[] test_byte_array; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static AudioFloatInputStream getStream1() + { + return AudioFloatInputStream.getInputStream(format, test_byte_array, 0, test_byte_array.length); + } + + static AudioFloatInputStream getStream2() + { + AudioInputStream strm = new AudioInputStream(new ByteArrayInputStream(test_byte_array), format, 1024); + return AudioFloatInputStream.getInputStream(strm); + } + + static void setUp() throws Exception { + test_float_array = new float[1024]; + test_byte_array = new byte[1024*format.getFrameSize()]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + test_float_array[i] = (float)Math.sin(10*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + test_float_array[i] *= 0.3; + } + AudioFloatConverter.getConverter(format).toByteArray(test_float_array, test_byte_array); + } + + public static void main(String[] args) throws Exception { + setUp(); + + for (int i = 0; i < 2; i++) { + AudioFloatInputStream stream = null; + if(i == 0) stream = getStream1(); + if(i == 1) stream = getStream2(); + float v = 0; + stream.skip(512); + v = stream.read(); + if(!(Math.abs(v - test_float_array[512]) < 0.0001)) + { + throw new RuntimeException("Read returned unexpected value."); + } + } + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/ReadFloatArray.java b/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/ReadFloatArray.java new file mode 100644 index 00000000000..2fa1b481494 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/ReadFloatArray.java @@ -0,0 +1,81 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test AudioFloatInputStream read(float[]) method */ + +import java.io.*; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ReadFloatArray { + + static float[] test_float_array; + static byte[] test_byte_array; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static AudioFloatInputStream getStream1() + { + return AudioFloatInputStream.getInputStream(format, test_byte_array, 0, test_byte_array.length); + } + + static AudioFloatInputStream getStream2() + { + AudioInputStream strm = new AudioInputStream(new ByteArrayInputStream(test_byte_array), format, 1024); + return AudioFloatInputStream.getInputStream(strm); + } + + static void setUp() throws Exception { + test_float_array = new float[1024]; + test_byte_array = new byte[1024*format.getFrameSize()]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + test_float_array[i] = (float)Math.sin(10*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + test_float_array[i] *= 0.3; + } + AudioFloatConverter.getConverter(format).toByteArray(test_float_array, test_byte_array); + } + + public static void main(String[] args) throws Exception { + setUp(); + + for (int i = 0; i < 2; i++) { + AudioFloatInputStream stream = null; + if(i == 0) stream = getStream1(); + if(i == 1) stream = getStream2(); + float[] buff = new float[1024]; + stream.read(buff); + for (int j = 0; j < buff.length; j++) + if(!(Math.abs(buff[j] - test_float_array[j]) < 0.0001)) + throw new RuntimeException("Incorrect data in buffer."); + } + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/ReadFloatArrayIntInt.java b/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/ReadFloatArrayIntInt.java new file mode 100644 index 00000000000..8393672739a --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/ReadFloatArrayIntInt.java @@ -0,0 +1,83 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test AudioFloatInputStream read(float[], int, int) method */ + +import java.io.*; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ReadFloatArrayIntInt { + + static float[] test_float_array; + static byte[] test_byte_array; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static AudioFloatInputStream getStream1() + { + return AudioFloatInputStream.getInputStream(format, test_byte_array, 0, test_byte_array.length); + } + + static AudioFloatInputStream getStream2() + { + AudioInputStream strm = new AudioInputStream(new ByteArrayInputStream(test_byte_array), format, 1024); + return AudioFloatInputStream.getInputStream(strm); + } + + static void setUp() throws Exception { + test_float_array = new float[1024]; + test_byte_array = new byte[1024*format.getFrameSize()]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + test_float_array[i] = (float)Math.sin(10*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + test_float_array[i] *= 0.3; + } + AudioFloatConverter.getConverter(format).toByteArray(test_float_array, test_byte_array); + } + + public static void main(String[] args) throws Exception { + setUp(); + + for (int i = 0; i < 2; i++) { + AudioFloatInputStream stream = null; + if(i == 0) stream = getStream1(); + if(i == 1) stream = getStream2(); + float[] buff = new float[1024]; + stream.read(buff,0,512); + stream.read(buff,512,512); + for (int j = 0; j < buff.length; j++) + if(!(Math.abs(buff[j] - test_float_array[j]) < 0.0001)) + throw new RuntimeException("Incorrect data in buffer."); + + } + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/Reset.java b/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/Reset.java new file mode 100644 index 00000000000..8553181639a --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/Reset.java @@ -0,0 +1,87 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test AudioFloatInputStream reset method */ + +import java.io.*; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Reset { + + static float[] test_float_array; + static byte[] test_byte_array; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static AudioFloatInputStream getStream1() + { + return AudioFloatInputStream.getInputStream(format, test_byte_array, 0, test_byte_array.length); + } + + static AudioFloatInputStream getStream2() + { + AudioInputStream strm = new AudioInputStream(new ByteArrayInputStream(test_byte_array), format, 1024); + return AudioFloatInputStream.getInputStream(strm); + } + + static void setUp() throws Exception { + test_float_array = new float[1024]; + test_byte_array = new byte[1024*format.getFrameSize()]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + test_float_array[i] = (float)Math.sin(10*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + test_float_array[i] *= 0.3; + } + AudioFloatConverter.getConverter(format).toByteArray(test_float_array, test_byte_array); + } + + public static void main(String[] args) throws Exception { + setUp(); + + for (int i = 0; i < 2; i++) { + AudioFloatInputStream stream = null; + if(i == 0) stream = getStream1(); + if(i == 1) stream = getStream2(); + float[] buff = new float[512]; + float[] buff2 = new float[512]; + stream.read(buff); + stream.mark(512); + stream.read(buff); + stream.reset(); + stream.read(buff2); + for (int j = 0; j < buff2.length; j++) + if(!(Math.abs(buff[j] - buff2[j]) < 0.0001)) + throw new RuntimeException("Incorrect data in buffer."); + + } + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/Skip.java b/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/Skip.java new file mode 100644 index 00000000000..2388646a886 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/AudioFloatInputStream/Skip.java @@ -0,0 +1,83 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test AudioFloatInputStream skip method */ + +import java.io.*; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Skip { + + static float[] test_float_array; + static byte[] test_byte_array; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static AudioFloatInputStream getStream1() + { + return AudioFloatInputStream.getInputStream(format, test_byte_array, 0, test_byte_array.length); + } + + static AudioFloatInputStream getStream2() + { + AudioInputStream strm = new AudioInputStream(new ByteArrayInputStream(test_byte_array), format, 1024); + return AudioFloatInputStream.getInputStream(strm); + } + + static void setUp() throws Exception { + test_float_array = new float[1024]; + test_byte_array = new byte[1024*format.getFrameSize()]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + test_float_array[i] = (float)Math.sin(10*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + test_float_array[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + test_float_array[i] *= 0.3; + } + AudioFloatConverter.getConverter(format).toByteArray(test_float_array, test_byte_array); + } + + public static void main(String[] args) throws Exception { + setUp(); + + for (int i = 0; i < 2; i++) { + AudioFloatInputStream stream = null; + if(i == 0) stream = getStream1(); + if(i == 1) stream = getStream2(); + float[] buff = new float[512]; + stream.skip(512); + stream.read(buff); + for (int j = 0; j < buff.length; j++) + if(!(Math.abs(buff[j] - test_float_array[j+512]) < 0.0001)) + throw new RuntimeException("Incorrect data in buffer."); + + } + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/DLSSoundbankReader/TestGetSoundbankFile.java b/jdk/test/javax/sound/midi/Gervill/DLSSoundbankReader/TestGetSoundbankFile.java new file mode 100644 index 00000000000..4b7b8e8975f --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/DLSSoundbankReader/TestGetSoundbankFile.java @@ -0,0 +1,52 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test DLSSoundbankReader getSoundbank(File) method */ + +import java.io.File; + +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; + +import com.sun.media.sound.DLSSoundbankReader; + +public class TestGetSoundbankFile { + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + File file = new File(System.getProperty("test.src", "."), "ding.dls"); + Soundbank dls = new DLSSoundbankReader().getSoundbank(file); + assertTrue(dls.getInstruments().length == 1); + Patch patch = dls.getInstruments()[0].getPatch(); + assertTrue(patch.getProgram() == 0); + assertTrue(patch.getBank() == 0); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/DLSSoundbankReader/TestGetSoundbankInputStream.java b/jdk/test/javax/sound/midi/Gervill/DLSSoundbankReader/TestGetSoundbankInputStream.java new file mode 100644 index 00000000000..f82d31cbfec --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/DLSSoundbankReader/TestGetSoundbankInputStream.java @@ -0,0 +1,63 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test DLSSoundbankReader getSoundbank(InputStream) method */ + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; + +import com.sun.media.sound.DLSSoundbankReader; + +public class TestGetSoundbankInputStream { + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + File file = new File(System.getProperty("test.src", "."), "ding.dls"); + FileInputStream fis = new FileInputStream(file); + BufferedInputStream bis = new BufferedInputStream(fis); + try + { + Soundbank dls = new DLSSoundbankReader().getSoundbank(bis); + assertTrue(dls.getInstruments().length == 1); + Patch patch = dls.getInstruments()[0].getPatch(); + assertTrue(patch.getProgram() == 0); + assertTrue(patch.getBank() == 0); + } + finally + { + bis.close(); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/DLSSoundbankReader/TestGetSoundbankInputStream2.java b/jdk/test/javax/sound/midi/Gervill/DLSSoundbankReader/TestGetSoundbankInputStream2.java new file mode 100644 index 00000000000..e0c393256c3 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/DLSSoundbankReader/TestGetSoundbankInputStream2.java @@ -0,0 +1,119 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test DLSSoundbankReader getSoundbank(InputStream) method using + very bad InputStream which can only read 1 byte at time */ + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; + +import com.sun.media.sound.DLSSoundbankReader; + +public class TestGetSoundbankInputStream2 { + + private static class BadInputStream extends InputStream + { + + InputStream is; + + public BadInputStream(InputStream is) + { + this.is = is; + } + + public int read() throws IOException { + return is.read(); + } + + public int read(byte[] b, int off, int len) throws IOException { + if(len > 1) len = 1; + return is.read(b, off, len); + } + + public int read(byte[] b) throws IOException { + return read(b, 0, b.length); + } + + public long skip(long n) throws IOException { + if(n > 1) n = 1; + return is.skip(n); + } + + public int available() throws IOException { + int avail = is.available(); + if(avail > 1) avail = 1; + return avail; + } + + public void close() throws IOException { + is.close(); + } + + public synchronized void mark(int readlimit) { + is.mark(readlimit); + } + + public boolean markSupported() { + return is.markSupported(); + } + + public synchronized void reset() throws IOException { + is.reset(); + } + + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + File file = new File(System.getProperty("test.src", "."), "ding.dls"); + FileInputStream fis = new FileInputStream(file); + BufferedInputStream bis = new BufferedInputStream(fis); + try + { + InputStream badis = new BadInputStream(bis); + Soundbank dls = new DLSSoundbankReader().getSoundbank(badis); + assertTrue(dls.getInstruments().length == 1); + Patch patch = dls.getInstruments()[0].getPatch(); + assertTrue(patch.getProgram() == 0); + assertTrue(patch.getBank() == 0); + } + finally + { + bis.close(); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/DLSSoundbankReader/TestGetSoundbankUrl.java b/jdk/test/javax/sound/midi/Gervill/DLSSoundbankReader/TestGetSoundbankUrl.java new file mode 100644 index 00000000000..502b753e7c5 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/DLSSoundbankReader/TestGetSoundbankUrl.java @@ -0,0 +1,54 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test DLSSoundbankReader getSoundbank(File) method */ + +import java.io.File; +import java.net.URL; + +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; + +import com.sun.media.sound.DLSSoundbankReader; + +public class TestGetSoundbankUrl { + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + File file = new File(System.getProperty("test.src", "."), "ding.dls"); + URL url = file.toURI().toURL(); + Soundbank dls = new DLSSoundbankReader().getSoundbank(url); + assertTrue(dls.getInstruments().length == 1); + Patch patch = dls.getInstruments()[0].getPatch(); + assertTrue(patch.getProgram() == 0); + assertTrue(patch.getBank() == 0); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/DLSSoundbankReader/ding.dls b/jdk/test/javax/sound/midi/Gervill/DLSSoundbankReader/ding.dls new file mode 100644 index 00000000000..278f5f14ba4 Binary files /dev/null and b/jdk/test/javax/sound/midi/Gervill/DLSSoundbankReader/ding.dls differ diff --git a/jdk/test/javax/sound/midi/Gervill/EmergencySoundbank/TestCreateSoundbank.java b/jdk/test/javax/sound/midi/Gervill/EmergencySoundbank/TestCreateSoundbank.java new file mode 100644 index 00000000000..bf3ec3394f4 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/EmergencySoundbank/TestCreateSoundbank.java @@ -0,0 +1,59 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test EmergencySoundbank createSoundbank() method */ + +import java.io.File; + +import javax.sound.midi.Instrument; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; + +import com.sun.media.sound.EmergencySoundbank; +import com.sun.media.sound.ModelInstrument; +import com.sun.media.sound.ModelPatch; + +public class TestCreateSoundbank { + + public static void main(String[] args) throws Exception { + + Soundbank soundbank = EmergencySoundbank.createSoundbank(); + for (int i = 0; i < 128; i++) { + Patch patch = new ModelPatch(0, i, false); + ModelInstrument ins = (ModelInstrument)soundbank.getInstrument(patch); + if(ins == null) + throw new Exception("Instrument " + i + " is missing!"); + if(ins.getPerformers().length == 0) + throw new Exception("Instrument " + i + " doesn't have any performers!"); + } + Patch patch = new ModelPatch(0, 0, true); + ModelInstrument ins = (ModelInstrument)soundbank.getInstrument(patch); + if(ins == null) + throw new Exception("Drumkit instrument is missing!"); + if(ins.getPerformers().length == 0) + throw new Exception("Drumkit instrument doesn't have any performers!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/GetInputStream.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/GetInputStream.java new file mode 100644 index 00000000000..0a70adbaaef --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/GetInputStream.java @@ -0,0 +1,91 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer getInputStream method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetInputStream { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + for (int i = 0; i < 2; i++) { + ModelByteBuffer buff; + if(i == 0) + buff = new ModelByteBuffer(test_file); + else + buff = new ModelByteBuffer(test_byte_array); + + byte[] b = new byte[test_byte_array.length]; + buff.getInputStream().read(b); + for (int j = 0; j < b.length; j++) + if(b[i] != test_byte_array[i]) + throw new RuntimeException("Byte array compare fails!"); + } + } + finally + { + tearDown(); + } + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/GetRoot.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/GetRoot.java new file mode 100644 index 00000000000..56a07869ad2 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/GetRoot.java @@ -0,0 +1,82 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer getRoot method */ + +import java.io.File; +import java.io.FileOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetRoot { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + ModelByteBuffer buff = new ModelByteBuffer(test_file); + ModelByteBuffer buff2 = buff.subbuffer(10, 10); + ModelByteBuffer buff3 = buff2.subbuffer(2, 2); + if(buff != buff3.getRoot()) + throw new RuntimeException("ModelByteBuffer doesn't return correct root!"); + } + finally + { + tearDown(); + } + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/Load.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/Load.java new file mode 100644 index 00000000000..ce3ee25dc1a --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/Load.java @@ -0,0 +1,89 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer load method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Load { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + ModelByteBuffer buff = new ModelByteBuffer(test_file); + + buff.load(); + if(buff.array() == null) + throw new RuntimeException("buf is null!"); + if(buff.array().length != test_byte_array.length) + throw new RuntimeException("buff.array().length length is incorrect!"); + byte[] b = buff.array(); + for (int i = 0; i < b.length; i++) + if(test_byte_array[i] != b[i]) + throw new RuntimeException("buff.array() incorrect!"); + } + finally + { + tearDown(); + } + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/LoadAll.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/LoadAll.java new file mode 100644 index 00000000000..a5f61edd15b --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/LoadAll.java @@ -0,0 +1,93 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer loadAll method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class LoadAll { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + ModelByteBuffer buff = new ModelByteBuffer(test_file); + List col = new ArrayList(); + col.add(buff); + ModelByteBuffer.loadAll(col); + if(buff.array() == null) + throw new RuntimeException("buf is null!"); + if(buff.array().length != test_byte_array.length) + throw new RuntimeException("buff.array().length length is incorrect!"); + byte[] b = buff.array(); + for (int i = 0; i < b.length; i++) + if(test_byte_array[i] != b[i]) + throw new RuntimeException("buff.array() incorrect!"); + + } + finally + { + tearDown(); + } + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/NewModelByteBufferByteArray.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/NewModelByteBufferByteArray.java new file mode 100644 index 00000000000..d9f3940ba95 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/NewModelByteBufferByteArray.java @@ -0,0 +1,84 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer(byte[]) constructor */ + +import java.io.File; +import java.io.FileOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelByteBufferByteArray { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + ModelByteBuffer buff = new ModelByteBuffer(test_byte_array); + if(buff.array() != test_byte_array) + throw new RuntimeException("buff.bytearray incorrect!"); + if(buff.capacity() != test_byte_array.length) + throw new RuntimeException("buff.capacity() incorrect!"); + if(buff.arrayOffset() != 0) + throw new RuntimeException("buff.arrayOffset not 0!"); + } + finally + { + tearDown(); + } + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/NewModelByteBufferByteArrayIntInt.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/NewModelByteBufferByteArrayIntInt.java new file mode 100644 index 00000000000..e7b71e6b5ef --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/NewModelByteBufferByteArrayIntInt.java @@ -0,0 +1,86 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer(byte[],int,int) constructor */ + +import java.io.File; +import java.io.FileOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelByteBufferByteArrayIntInt { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + ModelByteBuffer buff = new ModelByteBuffer(test_byte_array,10,20); + if(buff.array() != test_byte_array) + throw new RuntimeException("buff.array() incorrect!"); + if(buff.capacity() != 20) + throw new RuntimeException("buff.capacity() not 20!"); + if(buff.arrayOffset() != 10) + throw new RuntimeException("buff.arrayOffset() not 10!"); + if(buff.getFile() != null) + throw new RuntimeException("buff.getFile() not null!"); + } + finally + { + tearDown(); + } + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/NewModelByteBufferFile.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/NewModelByteBufferFile.java new file mode 100644 index 00000000000..677860cf06b --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/NewModelByteBufferFile.java @@ -0,0 +1,88 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer(File) constructor */ + +import java.io.File; +import java.io.FileOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelByteBufferFile { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + ModelByteBuffer buff = new ModelByteBuffer(test_file); + if(buff.array() != null) + throw new RuntimeException("buff.array() not null!"); + if(buff.capacity() != test_file.length()) + throw new RuntimeException("buff.capacity() incorrect!"); + if(buff.arrayOffset() != 0) + throw new RuntimeException("buff.arrayOffset() not 0!"); + if(buff.getFile() != test_file) + throw new RuntimeException("buff.getFile() incorrect!"); + if(buff.getFilePointer() != 0) + throw new RuntimeException("buff.getFilePointer() not 0!"); + } + finally + { + tearDown(); + } + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/NewModelByteBufferFileLongLong.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/NewModelByteBufferFileLongLong.java new file mode 100644 index 00000000000..100fb77232c --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/NewModelByteBufferFileLongLong.java @@ -0,0 +1,88 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer(File,long,long) constructor */ + +import java.io.File; +import java.io.FileOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelByteBufferFileLongLong { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + ModelByteBuffer buff = new ModelByteBuffer(test_file,10,20); + if(buff.array() != null) + throw new RuntimeException("buff.array() not null!"); + if(buff.capacity() != 20) + throw new RuntimeException("buff.capacity() not 20!"); + if(buff.arrayOffset() != 0) + throw new RuntimeException("buff.arrayOffset() not 0!"); + if(buff.getFile() != test_file) + throw new RuntimeException("buff.getFile incorrect!"); + if(buff.getFilePointer() != 10) + throw new RuntimeException("buff.getFilePointer not 10!"); + } + finally + { + tearDown(); + } + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/Available.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/Available.java new file mode 100644 index 00000000000..0543d74e915 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/Available.java @@ -0,0 +1,107 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer.RandomFileInputStream available() method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Available { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + for (int i = 0; i < 8; i++) { + ModelByteBuffer buff; + if(i % 2 == 0) + buff = new ModelByteBuffer(test_file); + else + buff = new ModelByteBuffer(test_byte_array); + if((i / 2) == 1) + buff.subbuffer(5); + if((i / 2) == 2) + buff.subbuffer(5,500); + if((i / 2) == 3) + buff.subbuffer(5,600,true); + + long capacity = buff.capacity(); + InputStream is = buff.getInputStream(); + try + { + int ret = is.available(); + if(ret != capacity) + throw new RuntimeException("is.available() return unexpected value!"); + } + finally + { + is.close(); + } + if(buff.capacity() != capacity) + throw new RuntimeException("Capacity variable should not change!"); + } + } + finally + { + tearDown(); + } + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/Close.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/Close.java new file mode 100644 index 00000000000..2b84ae0105b --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/Close.java @@ -0,0 +1,104 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer.RandomFileInputStream close method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Close { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + for (int i = 0; i < 8; i++) { + ModelByteBuffer buff; + if(i % 2 == 0) + buff = new ModelByteBuffer(test_file); + else + buff = new ModelByteBuffer(test_byte_array); + if((i / 2) == 1) + buff.subbuffer(5); + if((i / 2) == 2) + buff.subbuffer(5,500); + if((i / 2) == 3) + buff.subbuffer(5,600,true); + + long capacity = buff.capacity(); + InputStream is = buff.getInputStream(); + try + { + } + finally + { + is.close(); + } + if(buff.capacity() != capacity) + throw new RuntimeException("Capacity variable should not change!"); + } + } + finally + { + tearDown(); + } + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/MarkReset.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/MarkReset.java new file mode 100644 index 00000000000..2755912a4a1 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/MarkReset.java @@ -0,0 +1,129 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer.RandomFileInputStream mark and reset methods */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class MarkReset { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + for (int i = 0; i < 8; i++) { + ModelByteBuffer buff; + if(i % 2 == 0) + buff = new ModelByteBuffer(test_file); + else + buff = new ModelByteBuffer(test_byte_array); + if((i / 2) == 1) + buff.subbuffer(5); + if((i / 2) == 2) + buff.subbuffer(5,500); + if((i / 2) == 3) + buff.subbuffer(5,600,true); + + long capacity = buff.capacity(); + InputStream is = buff.getInputStream(); + try + { + is.mark(1000); + int ret = is.available(); + int a = is.read(); + is.skip(75); + is.reset(); + if(is.available() != ret) + throw new RuntimeException( + "is.available() returns incorrect value (" + + is.available() + "!="+(ret)+") !"); + int b = is.read(); + if(a != b) + throw new RuntimeException( + "is doesn't return same value after reset (" + + a + "!="+b+") !"); + + is.skip(15); + ret = is.available(); + is.mark(1000); + is.reset(); + if(is.available() != ret) + throw new RuntimeException( + "is.available() returns incorrect value (" + + is.available() + "!="+(ret)+") !"); + + + } + finally + { + is.close(); + } + if(buff.capacity() != capacity) + throw new RuntimeException("Capacity variable should not change!"); + } + } + finally + { + tearDown(); + } + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/MarkSupported.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/MarkSupported.java new file mode 100644 index 00000000000..5662cfff404 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/MarkSupported.java @@ -0,0 +1,106 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer.RandomFileInputStream markSupported() method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class MarkSupported { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + for (int i = 0; i < 8; i++) { + ModelByteBuffer buff; + if(i % 2 == 0) + buff = new ModelByteBuffer(test_file); + else + buff = new ModelByteBuffer(test_byte_array); + if((i / 2) == 1) + buff.subbuffer(5); + if((i / 2) == 2) + buff.subbuffer(5,500); + if((i / 2) == 3) + buff.subbuffer(5,600,true); + + long capacity = buff.capacity(); + InputStream is = buff.getInputStream(); + try + { + if(!is.markSupported()) + throw new RuntimeException("InputStream doesn't support mark/reset!"); + } + finally + { + is.close(); + } + if(buff.capacity() != capacity) + throw new RuntimeException("Capacity variable should not change!"); + } + } + finally + { + tearDown(); + } + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/Read.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/Read.java new file mode 100644 index 00000000000..20502c77bf2 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/Read.java @@ -0,0 +1,117 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer.RandomFileInputStream read() method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Read { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + for (int i = 0; i < 8; i++) { + ModelByteBuffer buff; + if(i % 2 == 0) + buff = new ModelByteBuffer(test_file); + else + buff = new ModelByteBuffer(test_byte_array); + if((i / 2) == 1) + buff.subbuffer(5); + if((i / 2) == 2) + buff.subbuffer(5,500); + if((i / 2) == 3) + buff.subbuffer(5,600,true); + + long capacity = buff.capacity(); + InputStream is = buff.getInputStream(); + try + { + byte[] b = new byte[100]; + int ret = is.available(); + int n = is.read(); + if(n == -1) + throw new RuntimeException("is.read shouldn't return -1!"); + if(is.available() != ret - 1) + throw new RuntimeException( + "is.available() returns incorrect value (" + + is.available() + "!="+(ret - 1)+") !"); + is.skip(5000); + if(is.read() != -1) + throw new RuntimeException( + "is.read() doesn't return -1!"); + } + finally + { + is.close(); + } + if(buff.capacity() != capacity) + throw new RuntimeException("Capacity variable should not change!"); + } + } + finally + { + tearDown(); + } + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/ReadByte.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/ReadByte.java new file mode 100644 index 00000000000..aa08ca707b1 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/ReadByte.java @@ -0,0 +1,118 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer.RandomFileInputStream read(byte[]) method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ReadByte { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + for (int i = 0; i < 8; i++) { + ModelByteBuffer buff; + if(i % 2 == 0) + buff = new ModelByteBuffer(test_file); + else + buff = new ModelByteBuffer(test_byte_array); + if((i / 2) == 1) + buff.subbuffer(5); + if((i / 2) == 2) + buff.subbuffer(5,500); + if((i / 2) == 3) + buff.subbuffer(5,600,true); + + long capacity = buff.capacity(); + InputStream is = buff.getInputStream(); + try + { + byte[] b = new byte[100]; + int ret = is.available(); + int n = is.read(b); + if(n == -1) + throw new RuntimeException("is.read shouldn't return -1!"); + if(is.available() != ret - n) + throw new RuntimeException( + "is.available() returns incorrect value (" + + is.available() + "!="+(ret - n)+") !"); + is.skip(5000); + if(is.read(b) != -1) + throw new RuntimeException( + "is.read() doesn't return -1!"); + + } + finally + { + is.close(); + } + if(buff.capacity() != capacity) + throw new RuntimeException("Capacity variable should not change!"); + } + } + finally + { + tearDown(); + } + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/ReadByteIntInt.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/ReadByteIntInt.java new file mode 100644 index 00000000000..6917de297b5 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/ReadByteIntInt.java @@ -0,0 +1,118 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer.RandomFileInputStream read(byte[], int, int) method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ReadByteIntInt { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + for (int i = 0; i < 8; i++) { + ModelByteBuffer buff; + if(i % 2 == 0) + buff = new ModelByteBuffer(test_file); + else + buff = new ModelByteBuffer(test_byte_array); + if((i / 2) == 1) + buff.subbuffer(5); + if((i / 2) == 2) + buff.subbuffer(5,500); + if((i / 2) == 3) + buff.subbuffer(5,600,true); + + long capacity = buff.capacity(); + InputStream is = buff.getInputStream(); + try + { + byte[] b = new byte[100]; + int ret = is.available(); + int n = is.read(b, 7, 50); + if(n == -1) + throw new RuntimeException("is.read shouldn't return -1!"); + if(is.available() != ret - n) + throw new RuntimeException( + "is.available() returns incorrect value (" + + is.available() + "!="+(ret - n)+") !"); + is.skip(5000); + if(is.read(b, 7, 50) != -1) + throw new RuntimeException( + "is.read() doesn't return -1!"); + + } + finally + { + is.close(); + } + if(buff.capacity() != capacity) + throw new RuntimeException("Capacity variable should not change!"); + } + } + finally + { + tearDown(); + } + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/Skip.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/Skip.java new file mode 100644 index 00000000000..6d943da3016 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/RandomFileInputStream/Skip.java @@ -0,0 +1,131 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer.RandomFileInputStream skip(long) method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Skip { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + for (int i = 0; i < 8; i++) { + ModelByteBuffer buff; + if(i % 2 == 0) + buff = new ModelByteBuffer(test_file); + else + buff = new ModelByteBuffer(test_byte_array); + if((i / 2) == 1) + buff.subbuffer(5); + if((i / 2) == 2) + buff.subbuffer(5,500); + if((i / 2) == 3) + buff.subbuffer(5,600,true); + + long capacity = buff.capacity(); + InputStream is = buff.getInputStream(); + try + { + int ret = is.available(); + long n = is.skip(75); + if(n == -1) + throw new RuntimeException("is.read shouldn't return -1!"); + if(is.available() != ret - n) + throw new RuntimeException( + "is.available() returns incorrect value (" + + is.available() + "!="+(ret - n)+") !"); + + ret = is.available(); + n = is.skip(-100); + if(n != 0) + throw new RuntimeException("is.skip(-100) shouldn't skip values!"); + if(is.available() != ret - n) + throw new RuntimeException( + "is.available() returns incorrect value (" + + is.available() + "!="+(ret - n)+") !"); + + ret = is.available(); + n = is.skip(5000); + if(is.available() != ret - n) + throw new RuntimeException( + "is.available() returns incorrect value (" + + is.available() + "!="+(ret - n)+") !"); + if(is.available() != 0) + throw new RuntimeException( + "is.available() returns incorrect value (" + + is.available() + "!="+(0)+") !"); } + finally + { + is.close(); + } + if(buff.capacity() != capacity) + throw new RuntimeException("Capacity variable should not change!"); + } + } + finally + { + tearDown(); + } + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/SubbufferLong.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/SubbufferLong.java new file mode 100644 index 00000000000..83c0240a42e --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/SubbufferLong.java @@ -0,0 +1,92 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer subbuffer(long) method */ + +import java.io.File; +import java.io.FileOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SubbufferLong { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + for (int i = 0; i < 2; i++) { + ModelByteBuffer buff; + if(i == 0) + buff = new ModelByteBuffer(test_file); + else + buff = new ModelByteBuffer(test_byte_array); + + ModelByteBuffer buff2 = buff.subbuffer(10); + if(buff2.getFilePointer() != buff.getFilePointer()) + throw new RuntimeException("buff2.getFilePointer() incorreect!"); + if(buff2.arrayOffset() != 10) + throw new RuntimeException("buff2.arrayOffset() not 10!"); + if(buff2.capacity() != buff.capacity()-10) + throw new RuntimeException("buff2.capacity() not correct!"); + } + } + finally + { + tearDown(); + } + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/SubbufferLongLong.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/SubbufferLongLong.java new file mode 100644 index 00000000000..70b22e91dc7 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/SubbufferLongLong.java @@ -0,0 +1,92 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer subbuffer(long,long) method */ + +import java.io.File; +import java.io.FileOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SubbufferLongLong { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + for (int i = 0; i < 2; i++) { + ModelByteBuffer buff; + if(i == 0) + buff = new ModelByteBuffer(test_file); + else + buff = new ModelByteBuffer(test_byte_array); + + ModelByteBuffer buff2 = buff.subbuffer(10,21); + if(buff2.getFilePointer() != buff.getFilePointer()) + throw new RuntimeException("buff2.getFilePointer() incorrect!"); + if(buff2.arrayOffset() != 10) + throw new RuntimeException("buff2.arrayOffset() not 10!"); + if(buff2.capacity() != 11) + throw new RuntimeException("buff2.capacity() not 11!"); + } + } + finally + { + tearDown(); + } + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/SubbufferLongLongBoolean.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/SubbufferLongLongBoolean.java new file mode 100644 index 00000000000..d5907789c60 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/SubbufferLongLongBoolean.java @@ -0,0 +1,98 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer subbuffer(long,long,boolean) method */ + +import java.io.File; +import java.io.FileOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SubbufferLongLongBoolean { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + for (int i = 0; i < 2; i++) { + ModelByteBuffer buff; + if(i == 0) + buff = new ModelByteBuffer(test_file); + else + buff = new ModelByteBuffer(test_byte_array); + + ModelByteBuffer buff2 = buff.subbuffer(10,21,true); + if(buff2.getRoot() != buff2); + if(buff2.capacity() != 11); + if(i == 0) + { + if(buff2.getFilePointer() != buff.getFilePointer()+10) + throw new RuntimeException("buff2.getFilePointer() incorrect!"); + } + else + { + if(buff2.arrayOffset() != 10) + throw new RuntimeException("buff2.arrayOffset() not 10!"); + } + } + } + finally + { + tearDown(); + } + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/Unload.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/Unload.java new file mode 100644 index 00000000000..577210855a9 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/Unload.java @@ -0,0 +1,83 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer unload method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Unload { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + ModelByteBuffer buff = new ModelByteBuffer(test_file); + buff.load(); + buff.unload(); + if(buff.array() != null) + throw new RuntimeException("buff.array() not null!"); + } + finally + { + tearDown(); + } + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/WriteTo.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/WriteTo.java new file mode 100644 index 00000000000..804c48b6eb7 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBuffer/WriteTo.java @@ -0,0 +1,92 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBuffer writeTo method */ + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class WriteTo { + + static float[] testarray; + static byte[] test_byte_array; + static File test_file; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + test_file = File.createTempFile("test", ".raw"); + FileOutputStream fos = new FileOutputStream(test_file); + fos.write(test_byte_array); + } + + static void tearDown() throws Exception { + if(!test_file.delete()) + test_file.deleteOnExit(); + } + + public static void main(String[] args) throws Exception { + try + { + setUp(); + + for (int i = 0; i < 2; i++) { + ModelByteBuffer buff; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + if(i == 0) + buff = new ModelByteBuffer(test_file); + else + buff = new ModelByteBuffer(test_byte_array); + buff.writeTo(baos); + byte[] b = baos.toByteArray(); + for (int j = 0; j < b.length; j++) + if(b[i] != test_byte_array[i]) + throw new RuntimeException("baos.toByteArray() incorrect!"); + } + } + finally + { + tearDown(); + } + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/GetAttenuation.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/GetAttenuation.java new file mode 100644 index 00000000000..ff2c4cddd5b --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/GetAttenuation.java @@ -0,0 +1,97 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBufferWavetable getAttenuation method */ + +import java.io.ByteArrayOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetAttenuation { + + static float[] testarray; + static byte[] test_byte_array; + static byte[] test_byte_array_8ext; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + static AudioFormat format24 = new AudioFormat(44100, 24, 1, true, false); + static ModelByteBuffer buffer; + static ModelByteBuffer buffer_wave; + static ModelByteBuffer buffer8; + static ModelByteBuffer buffer16_8; + static ModelByteBuffer buffer24; + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + buffer = new ModelByteBuffer(test_byte_array); + + byte[] test_byte_array2 = new byte[testarray.length*3]; + buffer24 = new ModelByteBuffer(test_byte_array2); + test_byte_array_8ext = new byte[testarray.length]; + byte[] test_byte_array_8_16 = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format24).toByteArray(testarray, test_byte_array2); + int ix = 0; + int x = 0; + for (int i = 0; i < test_byte_array_8ext.length; i++) { + test_byte_array_8ext[i] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + } + buffer16_8 = new ModelByteBuffer(test_byte_array_8_16); + buffer8 = new ModelByteBuffer(test_byte_array_8ext); + + AudioInputStream ais = new AudioInputStream(buffer.getInputStream(), format, testarray.length); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + AudioSystem.write(ais, AudioFileFormat.Type.WAVE, baos); + buffer_wave = new ModelByteBuffer(baos.toByteArray()); + } + + public static void main(String[] args) throws Exception { + + setUp(); + + ModelByteBufferWavetable wavetable = new ModelByteBufferWavetable(buffer,format); + wavetable.setAttenuation(10f); + if(wavetable.getAttenuation() != 10f) + throw new RuntimeException("wavetable.getAttenuation() not 10!"); + wavetable.setAttenuation(20f); + if(wavetable.getAttenuation() != 20f) + throw new RuntimeException("wavetable.getAttenuation() not 20!"); + + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/GetChannels.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/GetChannels.java new file mode 100644 index 00000000000..56673d9831e --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/GetChannels.java @@ -0,0 +1,97 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBufferWavetable getChannels method */ + +import java.io.ByteArrayOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetChannels { + + static float[] testarray; + static byte[] test_byte_array; + static byte[] test_byte_array_8ext; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + static AudioFormat format24 = new AudioFormat(44100, 24, 1, true, false); + static ModelByteBuffer buffer; + static ModelByteBuffer buffer_wave; + static ModelByteBuffer buffer8; + static ModelByteBuffer buffer16_8; + static ModelByteBuffer buffer24; + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + buffer = new ModelByteBuffer(test_byte_array); + + byte[] test_byte_array2 = new byte[testarray.length*3]; + buffer24 = new ModelByteBuffer(test_byte_array2); + test_byte_array_8ext = new byte[testarray.length]; + byte[] test_byte_array_8_16 = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format24).toByteArray(testarray, test_byte_array2); + int ix = 0; + int x = 0; + for (int i = 0; i < test_byte_array_8ext.length; i++) { + test_byte_array_8ext[i] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + } + buffer16_8 = new ModelByteBuffer(test_byte_array_8_16); + buffer8 = new ModelByteBuffer(test_byte_array_8ext); + + AudioInputStream ais = new AudioInputStream(buffer.getInputStream(), format, testarray.length); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + AudioSystem.write(ais, AudioFileFormat.Type.WAVE, baos); + buffer_wave = new ModelByteBuffer(baos.toByteArray()); + } + + public static void main(String[] args) throws Exception { + + setUp(); + + AudioFormat format1 = new AudioFormat(44100, 16, 1, true, false); + AudioFormat format2 = new AudioFormat(44100, 16, 2, true, false); + ModelByteBufferWavetable wavetable = new ModelByteBufferWavetable(buffer,format1,10f); + if(wavetable.getChannels() != 1) + throw new RuntimeException("wavetable.getChannels() not 1!"); + wavetable = new ModelByteBufferWavetable(buffer,format2,10f); + if(wavetable.getChannels() != 2) + throw new RuntimeException("wavetable.getChannels() not 2!"); + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/GetLoopLength.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/GetLoopLength.java new file mode 100644 index 00000000000..fcfd6dbfd91 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/GetLoopLength.java @@ -0,0 +1,96 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBufferWavetable getLoopLength method */ + +import java.io.ByteArrayOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetLoopLength { + + static float[] testarray; + static byte[] test_byte_array; + static byte[] test_byte_array_8ext; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + static AudioFormat format24 = new AudioFormat(44100, 24, 1, true, false); + static ModelByteBuffer buffer; + static ModelByteBuffer buffer_wave; + static ModelByteBuffer buffer8; + static ModelByteBuffer buffer16_8; + static ModelByteBuffer buffer24; + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + buffer = new ModelByteBuffer(test_byte_array); + + byte[] test_byte_array2 = new byte[testarray.length*3]; + buffer24 = new ModelByteBuffer(test_byte_array2); + test_byte_array_8ext = new byte[testarray.length]; + byte[] test_byte_array_8_16 = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format24).toByteArray(testarray, test_byte_array2); + int ix = 0; + int x = 0; + for (int i = 0; i < test_byte_array_8ext.length; i++) { + test_byte_array_8ext[i] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + } + buffer16_8 = new ModelByteBuffer(test_byte_array_8_16); + buffer8 = new ModelByteBuffer(test_byte_array_8ext); + + AudioInputStream ais = new AudioInputStream(buffer.getInputStream(), format, testarray.length); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + AudioSystem.write(ais, AudioFileFormat.Type.WAVE, baos); + buffer_wave = new ModelByteBuffer(baos.toByteArray()); + } + + public static void main(String[] args) throws Exception { + + setUp(); + + ModelByteBufferWavetable wavetable = new ModelByteBufferWavetable(buffer,format); + wavetable.setLoopLength(10f); + if(wavetable.getLoopLength() != 10f) + throw new RuntimeException("wavetable.getLoopLength() not 10!"); + wavetable.setLoopLength(20f); + if(wavetable.getLoopLength() != 20f) + throw new RuntimeException("wavetable.getLoopLength() not 20!"); + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/GetLoopStart.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/GetLoopStart.java new file mode 100644 index 00000000000..b2adb34d1c1 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/GetLoopStart.java @@ -0,0 +1,96 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBufferWavetable getLoopStart method */ + +import java.io.ByteArrayOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetLoopStart { + + static float[] testarray; + static byte[] test_byte_array; + static byte[] test_byte_array_8ext; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + static AudioFormat format24 = new AudioFormat(44100, 24, 1, true, false); + static ModelByteBuffer buffer; + static ModelByteBuffer buffer_wave; + static ModelByteBuffer buffer8; + static ModelByteBuffer buffer16_8; + static ModelByteBuffer buffer24; + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + buffer = new ModelByteBuffer(test_byte_array); + + byte[] test_byte_array2 = new byte[testarray.length*3]; + buffer24 = new ModelByteBuffer(test_byte_array2); + test_byte_array_8ext = new byte[testarray.length]; + byte[] test_byte_array_8_16 = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format24).toByteArray(testarray, test_byte_array2); + int ix = 0; + int x = 0; + for (int i = 0; i < test_byte_array_8ext.length; i++) { + test_byte_array_8ext[i] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + } + buffer16_8 = new ModelByteBuffer(test_byte_array_8_16); + buffer8 = new ModelByteBuffer(test_byte_array_8ext); + + AudioInputStream ais = new AudioInputStream(buffer.getInputStream(), format, testarray.length); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + AudioSystem.write(ais, AudioFileFormat.Type.WAVE, baos); + buffer_wave = new ModelByteBuffer(baos.toByteArray()); + } + + public static void main(String[] args) throws Exception { + + setUp(); + + ModelByteBufferWavetable wavetable = new ModelByteBufferWavetable(buffer,format); + wavetable.setLoopStart(10f); + if(wavetable.getLoopStart() != 10f) + throw new RuntimeException("wavetable.getLoopStart() not 10!"); + wavetable.setLoopStart(20f); + if(wavetable.getLoopStart() != 20f) + throw new RuntimeException("wavetable.getLoopStart() not 20!"); + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/GetPitchCorrection.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/GetPitchCorrection.java new file mode 100644 index 00000000000..8343283d069 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/GetPitchCorrection.java @@ -0,0 +1,97 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBufferWavetable getPitchCorrect method */ + +import java.io.ByteArrayOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetPitchCorrection { + + static float[] testarray; + static byte[] test_byte_array; + static byte[] test_byte_array_8ext; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + static AudioFormat format24 = new AudioFormat(44100, 24, 1, true, false); + static ModelByteBuffer buffer; + static ModelByteBuffer buffer_wave; + static ModelByteBuffer buffer8; + static ModelByteBuffer buffer16_8; + static ModelByteBuffer buffer24; + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + buffer = new ModelByteBuffer(test_byte_array); + + byte[] test_byte_array2 = new byte[testarray.length*3]; + buffer24 = new ModelByteBuffer(test_byte_array2); + test_byte_array_8ext = new byte[testarray.length]; + byte[] test_byte_array_8_16 = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format24).toByteArray(testarray, test_byte_array2); + int ix = 0; + int x = 0; + for (int i = 0; i < test_byte_array_8ext.length; i++) { + test_byte_array_8ext[i] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + } + buffer16_8 = new ModelByteBuffer(test_byte_array_8_16); + buffer8 = new ModelByteBuffer(test_byte_array_8ext); + + AudioInputStream ais = new AudioInputStream(buffer.getInputStream(), format, testarray.length); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + AudioSystem.write(ais, AudioFileFormat.Type.WAVE, baos); + buffer_wave = new ModelByteBuffer(baos.toByteArray()); + } + + public static void main(String[] args) throws Exception { + + setUp(); + + ModelByteBufferWavetable wavetable = new ModelByteBufferWavetable(buffer,format); + wavetable.setPitchcorrection(10f); + if(wavetable.getPitchcorrection() != 10f) + throw new RuntimeException("wavetable.getPitchcorrection() not 10!"); + wavetable.setPitchcorrection(20f); + if(wavetable.getPitchcorrection() != 20f) + throw new RuntimeException("wavetable.getPitchcorrection() not 20!"); + + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/NewModelByteBufferWavetableModelByteBuffer.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/NewModelByteBufferWavetableModelByteBuffer.java new file mode 100644 index 00000000000..c3d6ab1b030 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/NewModelByteBufferWavetableModelByteBuffer.java @@ -0,0 +1,94 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBufferWavetable(ModelByteBuffer) method */ + +import java.io.ByteArrayOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelByteBufferWavetableModelByteBuffer { + + static float[] testarray; + static byte[] test_byte_array; + static byte[] test_byte_array_8ext; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + static AudioFormat format24 = new AudioFormat(44100, 24, 1, true, false); + static ModelByteBuffer buffer; + static ModelByteBuffer buffer_wave; + static ModelByteBuffer buffer8; + static ModelByteBuffer buffer16_8; + static ModelByteBuffer buffer24; + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + buffer = new ModelByteBuffer(test_byte_array); + + byte[] test_byte_array2 = new byte[testarray.length*3]; + buffer24 = new ModelByteBuffer(test_byte_array2); + test_byte_array_8ext = new byte[testarray.length]; + byte[] test_byte_array_8_16 = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format24).toByteArray(testarray, test_byte_array2); + int ix = 0; + int x = 0; + for (int i = 0; i < test_byte_array_8ext.length; i++) { + test_byte_array_8ext[i] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + } + buffer16_8 = new ModelByteBuffer(test_byte_array_8_16); + buffer8 = new ModelByteBuffer(test_byte_array_8ext); + + AudioInputStream ais = new AudioInputStream(buffer.getInputStream(), format, testarray.length); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + AudioSystem.write(ais, AudioFileFormat.Type.WAVE, baos); + buffer_wave = new ModelByteBuffer(baos.toByteArray()); + } + + public static void main(String[] args) throws Exception { + + setUp(); + + ModelByteBufferWavetable wavetable = new ModelByteBufferWavetable(buffer_wave); + if(wavetable.getBuffer() != buffer_wave) + throw new RuntimeException("wavetable.getBuffer() incorrect!"); + if(!wavetable.getFormat().matches(format)) + throw new RuntimeException("wavetable.getFormat() incorrect!"); + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/NewModelByteBufferWavetableModelByteBufferAudioFormat.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/NewModelByteBufferWavetableModelByteBufferAudioFormat.java new file mode 100644 index 00000000000..6005f1f4969 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/NewModelByteBufferWavetableModelByteBufferAudioFormat.java @@ -0,0 +1,94 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBufferWavetable(ModelByteBuffer, AudioFormat) method */ + +import java.io.ByteArrayOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelByteBufferWavetableModelByteBufferAudioFormat { + + static float[] testarray; + static byte[] test_byte_array; + static byte[] test_byte_array_8ext; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + static AudioFormat format24 = new AudioFormat(44100, 24, 1, true, false); + static ModelByteBuffer buffer; + static ModelByteBuffer buffer_wave; + static ModelByteBuffer buffer8; + static ModelByteBuffer buffer16_8; + static ModelByteBuffer buffer24; + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + buffer = new ModelByteBuffer(test_byte_array); + + byte[] test_byte_array2 = new byte[testarray.length*3]; + buffer24 = new ModelByteBuffer(test_byte_array2); + test_byte_array_8ext = new byte[testarray.length]; + byte[] test_byte_array_8_16 = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format24).toByteArray(testarray, test_byte_array2); + int ix = 0; + int x = 0; + for (int i = 0; i < test_byte_array_8ext.length; i++) { + test_byte_array_8ext[i] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + } + buffer16_8 = new ModelByteBuffer(test_byte_array_8_16); + buffer8 = new ModelByteBuffer(test_byte_array_8ext); + + AudioInputStream ais = new AudioInputStream(buffer.getInputStream(), format, testarray.length); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + AudioSystem.write(ais, AudioFileFormat.Type.WAVE, baos); + buffer_wave = new ModelByteBuffer(baos.toByteArray()); + } + + public static void main(String[] args) throws Exception { + + setUp(); + + ModelByteBufferWavetable wavetable = new ModelByteBufferWavetable(buffer,format); + if(wavetable.getBuffer() != buffer) + throw new RuntimeException("wavetable.getBuffer() incorrect!"); + if(wavetable.getFormat() != format) + throw new RuntimeException("wavetable.getFormat() incorrect!"); + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/NewModelByteBufferWavetableModelByteBufferAudioFormatFloat.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/NewModelByteBufferWavetableModelByteBufferAudioFormatFloat.java new file mode 100644 index 00000000000..c3073b62dba --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/NewModelByteBufferWavetableModelByteBufferAudioFormatFloat.java @@ -0,0 +1,94 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBufferWavetable(ModelByteBuffer, AudioFormat) method */ + +import java.io.ByteArrayOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelByteBufferWavetableModelByteBufferAudioFormatFloat { + + static float[] testarray; + static byte[] test_byte_array; + static byte[] test_byte_array_8ext; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + static AudioFormat format24 = new AudioFormat(44100, 24, 1, true, false); + static ModelByteBuffer buffer; + static ModelByteBuffer buffer_wave; + static ModelByteBuffer buffer8; + static ModelByteBuffer buffer16_8; + static ModelByteBuffer buffer24; + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + buffer = new ModelByteBuffer(test_byte_array); + + byte[] test_byte_array2 = new byte[testarray.length*3]; + buffer24 = new ModelByteBuffer(test_byte_array2); + test_byte_array_8ext = new byte[testarray.length]; + byte[] test_byte_array_8_16 = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format24).toByteArray(testarray, test_byte_array2); + int ix = 0; + int x = 0; + for (int i = 0; i < test_byte_array_8ext.length; i++) { + test_byte_array_8ext[i] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + } + buffer16_8 = new ModelByteBuffer(test_byte_array_8_16); + buffer8 = new ModelByteBuffer(test_byte_array_8ext); + + AudioInputStream ais = new AudioInputStream(buffer.getInputStream(), format, testarray.length); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + AudioSystem.write(ais, AudioFileFormat.Type.WAVE, baos); + buffer_wave = new ModelByteBuffer(baos.toByteArray()); + } + + public static void main(String[] args) throws Exception { + + setUp(); + + ModelByteBufferWavetable wavetable = new ModelByteBufferWavetable(buffer,format); + if(wavetable.getBuffer() != buffer) + throw new RuntimeException("wavetable.getBuffer() incorrect!"); + if(!wavetable.getFormat().matches(format)) + throw new RuntimeException("wavetable.getFormat() incorrect!"); + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/NewModelByteBufferWavetableModelByteBufferFloat.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/NewModelByteBufferWavetableModelByteBufferFloat.java new file mode 100644 index 00000000000..3ad0823c95a --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/NewModelByteBufferWavetableModelByteBufferFloat.java @@ -0,0 +1,96 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBufferWavetable(ModelByteBuffer, AudioFormat, float) method */ + +import java.io.ByteArrayOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelByteBufferWavetableModelByteBufferFloat { + + static float[] testarray; + static byte[] test_byte_array; + static byte[] test_byte_array_8ext; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + static AudioFormat format24 = new AudioFormat(44100, 24, 1, true, false); + static ModelByteBuffer buffer; + static ModelByteBuffer buffer_wave; + static ModelByteBuffer buffer8; + static ModelByteBuffer buffer16_8; + static ModelByteBuffer buffer24; + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + buffer = new ModelByteBuffer(test_byte_array); + + byte[] test_byte_array2 = new byte[testarray.length*3]; + buffer24 = new ModelByteBuffer(test_byte_array2); + test_byte_array_8ext = new byte[testarray.length]; + byte[] test_byte_array_8_16 = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format24).toByteArray(testarray, test_byte_array2); + int ix = 0; + int x = 0; + for (int i = 0; i < test_byte_array_8ext.length; i++) { + test_byte_array_8ext[i] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + } + buffer16_8 = new ModelByteBuffer(test_byte_array_8_16); + buffer8 = new ModelByteBuffer(test_byte_array_8ext); + + AudioInputStream ais = new AudioInputStream(buffer.getInputStream(), format, testarray.length); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + AudioSystem.write(ais, AudioFileFormat.Type.WAVE, baos); + buffer_wave = new ModelByteBuffer(baos.toByteArray()); + } + + public static void main(String[] args) throws Exception { + + setUp(); + + ModelByteBufferWavetable wavetable = new ModelByteBufferWavetable(buffer,format,10f); + if(wavetable.getBuffer() != buffer) + throw new RuntimeException("wavetable.getBuffer() incorrect!"); + if(!wavetable.getFormat().matches(format)) + throw new RuntimeException("wavetable.getFormat() incorrect!"); + if(wavetable.getPitchcorrection() != 10f) + throw new RuntimeException("wavetable.getPitchcorrection() not 10!"); + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/Open.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/Open.java new file mode 100644 index 00000000000..745cc1fa033 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/Open.java @@ -0,0 +1,92 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBufferWavetable open method */ + +import java.io.ByteArrayOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Open { + + static float[] testarray; + static byte[] test_byte_array; + static byte[] test_byte_array_8ext; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + static AudioFormat format24 = new AudioFormat(44100, 24, 1, true, false); + static ModelByteBuffer buffer; + static ModelByteBuffer buffer_wave; + static ModelByteBuffer buffer8; + static ModelByteBuffer buffer16_8; + static ModelByteBuffer buffer24; + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + buffer = new ModelByteBuffer(test_byte_array); + + byte[] test_byte_array2 = new byte[testarray.length*3]; + buffer24 = new ModelByteBuffer(test_byte_array2); + test_byte_array_8ext = new byte[testarray.length]; + byte[] test_byte_array_8_16 = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format24).toByteArray(testarray, test_byte_array2); + int ix = 0; + int x = 0; + for (int i = 0; i < test_byte_array_8ext.length; i++) { + test_byte_array_8ext[i] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + } + buffer16_8 = new ModelByteBuffer(test_byte_array_8_16); + buffer8 = new ModelByteBuffer(test_byte_array_8ext); + + AudioInputStream ais = new AudioInputStream(buffer.getInputStream(), format, testarray.length); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + AudioSystem.write(ais, AudioFileFormat.Type.WAVE, baos); + buffer_wave = new ModelByteBuffer(baos.toByteArray()); + } + + public static void main(String[] args) throws Exception { + + setUp(); + + ModelByteBufferWavetable wavetable = new ModelByteBufferWavetable(buffer,format); + if(wavetable.open(44100) != null) + throw new RuntimeException("wavetable.open(44100) doesn't return null!"); + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/Set8BitExtensionBuffer.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/Set8BitExtensionBuffer.java new file mode 100644 index 00000000000..24559f9f1e4 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/Set8BitExtensionBuffer.java @@ -0,0 +1,119 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBufferWavetable set8BitExtensionBuffer method */ + +import java.io.ByteArrayOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Set8BitExtensionBuffer { + + static float[] testarray; + static byte[] test_byte_array; + static byte[] test_byte_array_8ext; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + static AudioFormat format24 = new AudioFormat(44100, 24, 1, true, false); + static ModelByteBuffer buffer; + static ModelByteBuffer buffer_wave; + static ModelByteBuffer buffer8; + static ModelByteBuffer buffer16_8; + static ModelByteBuffer buffer24; + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + buffer = new ModelByteBuffer(test_byte_array); + + byte[] test_byte_array2 = new byte[testarray.length*3]; + buffer24 = new ModelByteBuffer(test_byte_array2); + test_byte_array_8ext = new byte[testarray.length]; + byte[] test_byte_array_8_16 = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format24).toByteArray(testarray, test_byte_array2); + int ix = 0; + int x = 0; + for (int i = 0; i < test_byte_array_8ext.length; i++) { + test_byte_array_8ext[i] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + } + buffer16_8 = new ModelByteBuffer(test_byte_array_8_16); + buffer8 = new ModelByteBuffer(test_byte_array_8ext); + + AudioInputStream ais = new AudioInputStream(buffer.getInputStream(), format, testarray.length); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + AudioSystem.write(ais, AudioFileFormat.Type.WAVE, baos); + buffer_wave = new ModelByteBuffer(baos.toByteArray()); + } + + static float compare(float[] a, float[] b) + { + float ac_error = 0; + int counter = 0; + for (int i = 0; i < a.length; i++) { + ac_error += Math.abs(a[i] - b[i]); + counter++; + } + return ac_error / ((float)counter); + + } + + public static void main(String[] args) throws Exception { + + setUp(); + + ModelByteBufferWavetable wavetable = new ModelByteBufferWavetable(buffer16_8,format,10f); + float[] f1 = new float[testarray.length]; + float[] f2 = new float[testarray.length]; + wavetable.openStream().read(f1); + wavetable.set8BitExtensionBuffer(buffer8); + if(wavetable.get8BitExtensionBuffer() != buffer8) + throw new RuntimeException("wavetable.get8BitExtensionBuffer() incorrect!"); + wavetable.openStream().read(f2); + // f2 should have more accurity than f1, + // about 256 times more, or 8 bits + float spec1 = compare(f1, testarray); + float spec2 = compare(f2, testarray); + if((spec1/spec2) <= 200) + throw new RuntimeException("(spec1/spec2) <= 200!"); + + + } + + + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/SetLoopType.java b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/SetLoopType.java new file mode 100644 index 00000000000..854815368bd --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelByteBufferWavetable/SetLoopType.java @@ -0,0 +1,96 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBufferWavetable SetLoopType method */ + +import java.io.ByteArrayOutputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetLoopType { + + static float[] testarray; + static byte[] test_byte_array; + static byte[] test_byte_array_8ext; + static AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + static AudioFormat format24 = new AudioFormat(44100, 24, 1, true, false); + static ModelByteBuffer buffer; + static ModelByteBuffer buffer_wave; + static ModelByteBuffer buffer8; + static ModelByteBuffer buffer16_8; + static ModelByteBuffer buffer24; + + static void setUp() throws Exception { + testarray = new float[1024]; + for (int i = 0; i < 1024; i++) { + double ii = i / 1024.0; + ii = ii * ii; + testarray[i] = (float)Math.sin(10*ii*2*Math.PI); + testarray[i] += (float)Math.sin(1.731 + 2*ii*2*Math.PI); + testarray[i] += (float)Math.sin(0.231 + 6.3*ii*2*Math.PI); + testarray[i] *= 0.3; + } + test_byte_array = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format).toByteArray(testarray, test_byte_array); + buffer = new ModelByteBuffer(test_byte_array); + + byte[] test_byte_array2 = new byte[testarray.length*3]; + buffer24 = new ModelByteBuffer(test_byte_array2); + test_byte_array_8ext = new byte[testarray.length]; + byte[] test_byte_array_8_16 = new byte[testarray.length*2]; + AudioFloatConverter.getConverter(format24).toByteArray(testarray, test_byte_array2); + int ix = 0; + int x = 0; + for (int i = 0; i < test_byte_array_8ext.length; i++) { + test_byte_array_8ext[i] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + test_byte_array_8_16[x++] = test_byte_array2[ix++]; + } + buffer16_8 = new ModelByteBuffer(test_byte_array_8_16); + buffer8 = new ModelByteBuffer(test_byte_array_8ext); + + AudioInputStream ais = new AudioInputStream(buffer.getInputStream(), format, testarray.length); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + AudioSystem.write(ais, AudioFileFormat.Type.WAVE, baos); + buffer_wave = new ModelByteBuffer(baos.toByteArray()); + } + + public static void main(String[] args) throws Exception { + + setUp(); + + ModelByteBufferWavetable wavetable = new ModelByteBufferWavetable(buffer,format); + wavetable.setLoopType(1); + if(wavetable.getLoopType() != 1) + throw new RuntimeException("wavetable.getLoopType() not 1!"); + wavetable.setLoopType(2); + if(wavetable.getLoopType() != 2) + throw new RuntimeException("wavetable.getLoopType() not 2!"); + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelDestination/NewModelDestination.java b/jdk/test/javax/sound/midi/Gervill/ModelDestination/NewModelDestination.java new file mode 100644 index 00000000000..b46c156c212 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelDestination/NewModelDestination.java @@ -0,0 +1,46 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelDestination constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelDestination { + + public static void main(String[] args) throws Exception { + ModelDestination dest = new ModelDestination(); + if(dest.getIdentifier() != ModelDestination.DESTINATION_NONE) + throw new RuntimeException("dest.getIdentifier() is not equals ModelDestination.DESTINATION_NONE!"); + if(!(dest.getTransform() instanceof ModelStandardTransform)) + throw new RuntimeException("dest.getTransform() is not instancoef ModelStandardTransform!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelDestination/NewModelDestinationModelIdentifier.java b/jdk/test/javax/sound/midi/Gervill/ModelDestination/NewModelDestinationModelIdentifier.java new file mode 100644 index 00000000000..b64af94e8de --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelDestination/NewModelDestinationModelIdentifier.java @@ -0,0 +1,46 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelDestination(ModelIdentifier) constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelDestinationModelIdentifier { + + public static void main(String[] args) throws Exception { + ModelDestination dest = new ModelDestination(ModelDestination.DESTINATION_EG1_ATTACK); + if(dest.getIdentifier() != ModelDestination.DESTINATION_EG1_ATTACK) + throw new RuntimeException("dest.getIdentifier() is not equals ModelDestination.DESTINATION_EG1_ATTACK!"); + if(!(dest.getTransform() instanceof ModelStandardTransform)) + throw new RuntimeException("dest.getTransform() is not instancoef ModelStandardTransform!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelDestination/SetIdentifier.java b/jdk/test/javax/sound/midi/Gervill/ModelDestination/SetIdentifier.java new file mode 100644 index 00000000000..64418fe271b --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelDestination/SetIdentifier.java @@ -0,0 +1,45 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBufferWavetable setIdentifier(ModelIdentifier) method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetIdentifier { + + public static void main(String[] args) throws Exception { + ModelDestination dest = new ModelDestination(); + dest.setIdentifier(ModelDestination.DESTINATION_EG1_ATTACK); + if(dest.getIdentifier() != ModelDestination.DESTINATION_EG1_ATTACK) + throw new RuntimeException("dest.getIdentifier() is not equals ModelDestination.DESTINATION_EG1_ATTACK!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelDestination/SetTransform.java b/jdk/test/javax/sound/midi/Gervill/ModelDestination/SetTransform.java new file mode 100644 index 00000000000..0b7e359b00e --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelDestination/SetTransform.java @@ -0,0 +1,46 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelByteBufferWavetable setTransform(ModelTransform) method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetTransform{ + + public static void main(String[] args) throws Exception { + ModelDestination dest = new ModelDestination(); + ModelStandardTransform newtransform = new ModelStandardTransform(); + dest.setTransform(newtransform); + if(dest.getTransform() != newtransform) + throw new RuntimeException("dest.getTransform() is incorrect!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/EqualsObject.java b/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/EqualsObject.java new file mode 100644 index 00000000000..b9235739beb --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/EqualsObject.java @@ -0,0 +1,54 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelIdentifier equals method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class EqualsObject { + + public static void main(String[] args) throws Exception { + ModelIdentifier id = new ModelIdentifier("test","a",1); + ModelIdentifier id2 = new ModelIdentifier("test","a",1); + ModelIdentifier id3 = new ModelIdentifier("test","a",2); + ModelIdentifier id4 = new ModelIdentifier("test","b",1); + ModelIdentifier id5 = new ModelIdentifier("hello","a",1); + if(!id.equals(id2)) + throw new RuntimeException("Compare failed!"); + if(id.equals(id3)) + throw new RuntimeException("Compare failed!"); + if(id.equals(id4)) + throw new RuntimeException("Compare failed!"); + if(id.equals(id5)) + throw new RuntimeException("Compare failed!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/NewModelIdentifierString.java b/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/NewModelIdentifierString.java new file mode 100644 index 00000000000..d599a71de79 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/NewModelIdentifierString.java @@ -0,0 +1,48 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelIdentifier(String) constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelIdentifierString { + + public static void main(String[] args) throws Exception { + ModelIdentifier id = new ModelIdentifier("test"); + if(!id.getObject().equals("test")) + throw new RuntimeException("id.getObject() doesn't return \"test\"!"); + if(id.getVariable() != null) + throw new RuntimeException("id.getVariable() doesn't return null!"); + if(id.getInstance() != 0) + throw new RuntimeException("id.getInstance() doesn't return 0!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/NewModelIdentifierStringInt.java b/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/NewModelIdentifierStringInt.java new file mode 100644 index 00000000000..ecfee41c2ee --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/NewModelIdentifierStringInt.java @@ -0,0 +1,48 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelIdentifier(String, integer) constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelIdentifierStringInt { + + public static void main(String[] args) throws Exception { + ModelIdentifier id = new ModelIdentifier("test",1); + if(!id.getObject().equals("test")) + throw new RuntimeException("id.getObject() doesn't return \"test\"!"); + if(id.getVariable() != null) + throw new RuntimeException("id.getVariable() doesn't return null!"); + if(id.getInstance() != 1) + throw new RuntimeException("id.getInstance() doesn't return 1!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/NewModelIdentifierStringString.java b/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/NewModelIdentifierStringString.java new file mode 100644 index 00000000000..8b27369b88e --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/NewModelIdentifierStringString.java @@ -0,0 +1,48 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelIdentifier(String,String) constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelIdentifierStringString { + + public static void main(String[] args) throws Exception { + ModelIdentifier id = new ModelIdentifier("test","a"); + if(!id.getObject().equals("test")) + throw new RuntimeException("id.getObject() doesn't return \"test\"!"); + if(!id.getVariable().equals("a")) + throw new RuntimeException("id.getVariable() doesn't return \"a\"!"); + if(id.getInstance() != 0) + throw new RuntimeException("id.getInstance() doesn't return 0!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/NewModelIdentifierStringStringInt.java b/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/NewModelIdentifierStringStringInt.java new file mode 100644 index 00000000000..923ff12fe00 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/NewModelIdentifierStringStringInt.java @@ -0,0 +1,48 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelIdentifier(String,String,int) constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelIdentifierStringStringInt { + + public static void main(String[] args) throws Exception { + ModelIdentifier id = new ModelIdentifier("test","a",1);; + if(!id.getObject().equals("test")) + throw new RuntimeException("id.getObject() doesn't return \"test\"!"); + if(!id.getVariable().equals("a")) + throw new RuntimeException("id.getVariable() doesn't return \"a\"!"); + if(id.getInstance() != 1) + throw new RuntimeException("id.getInstance() doesn't return 1!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/SetInstance.java b/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/SetInstance.java new file mode 100644 index 00000000000..92cf70a4823 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/SetInstance.java @@ -0,0 +1,45 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelIdentifier setInstance method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetInstance { + + public static void main(String[] args) throws Exception { + ModelIdentifier id = new ModelIdentifier("test","a",1); + id.setInstance(2); + if(id.getInstance() != 2) + throw new RuntimeException("id.getInstance() doesn't return 2!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/SetObject.java b/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/SetObject.java new file mode 100644 index 00000000000..d9f9b076629 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/SetObject.java @@ -0,0 +1,45 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelIdentifier setObject method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetObject { + + public static void main(String[] args) throws Exception { + ModelIdentifier id = new ModelIdentifier("test","a",1); + id.setObject("hello"); + if(!id.getObject().equals("hello")) + throw new RuntimeException("id.getObject() does't return \"hello\"!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/SetVariable.java b/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/SetVariable.java new file mode 100644 index 00000000000..82b2f5c22e7 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelIdentifier/SetVariable.java @@ -0,0 +1,45 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelIdentifier setVariable method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetVariable { + + public static void main(String[] args) throws Exception { + ModelIdentifier id = new ModelIdentifier("test","a",1); + id.setVariable("b"); + if(!id.getVariable().equals("b")) + throw new RuntimeException("id.getVariable() does't return \"b\"!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelPerformer/GetOscillators.java b/jdk/test/javax/sound/midi/Gervill/ModelPerformer/GetOscillators.java new file mode 100644 index 00000000000..c148580f85c --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelPerformer/GetOscillators.java @@ -0,0 +1,44 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelPerformer getOscillators method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetOscillators { + + public static void main(String[] args) throws Exception { + ModelPerformer performer = new ModelPerformer(); + if(performer.getOscillators() == null) + throw new RuntimeException("performer.getOscillators() returned null!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetConnectionBlocks.java b/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetConnectionBlocks.java new file mode 100644 index 00000000000..4d26e6bebc5 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetConnectionBlocks.java @@ -0,0 +1,48 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelPerformer setConnectionBlocks method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetConnectionBlocks { + + public static void main(String[] args) throws Exception { + ModelPerformer performer = new ModelPerformer(); + List newlist = new ArrayList(); + performer.setConnectionBlocks(newlist); + if(performer.getConnectionBlocks() != newlist) + throw new RuntimeException("performer.getConnectionBlocks() returned incorrect data!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetDefaultConnectionsEnabled.java b/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetDefaultConnectionsEnabled.java new file mode 100644 index 00000000000..9b44f95a998 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetDefaultConnectionsEnabled.java @@ -0,0 +1,49 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelPerformer setDefaultConnectionsEnabled method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetDefaultConnectionsEnabled { + + public static void main(String[] args) throws Exception { + ModelPerformer performer = new ModelPerformer(); + performer.setDefaultConnectionsEnabled(true); + if(performer.isDefaultConnectionsEnabled() != true) + throw new RuntimeException("performer.isAddDefaultConnectionsEnabled() didn't return true!"); + performer.setDefaultConnectionsEnabled(false); + if(performer.isDefaultConnectionsEnabled() != false) + throw new RuntimeException("performer.isAddDefaultConnectionsEnabled() didn't return false!"); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetExclusiveClass.java b/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetExclusiveClass.java new file mode 100644 index 00000000000..fb1053fa755 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetExclusiveClass.java @@ -0,0 +1,45 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelPerformer setExclusiveClass method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetExclusiveClass { + + public static void main(String[] args) throws Exception { + ModelPerformer performer = new ModelPerformer(); + performer.setExclusiveClass(10); + if(performer.getExclusiveClass() != 10) + throw new RuntimeException("performer.getExclusiveClass() didn't return 10!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetKeyFrom.java b/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetKeyFrom.java new file mode 100644 index 00000000000..27b9b314c68 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetKeyFrom.java @@ -0,0 +1,45 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelPerformer setKeyFrom method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetKeyFrom { + + public static void main(String[] args) throws Exception { + ModelPerformer performer = new ModelPerformer(); + performer.setKeyFrom(10); + if(performer.getKeyFrom() != 10) + throw new RuntimeException("performer.getKeyFrom() didn't return 10!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetKeyTo.java b/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetKeyTo.java new file mode 100644 index 00000000000..e23e13235ac --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetKeyTo.java @@ -0,0 +1,45 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelPerformer setKeyTo method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetKeyTo { + + public static void main(String[] args) throws Exception { + ModelPerformer performer = new ModelPerformer(); + performer.setKeyTo(10); + if(performer.getKeyTo() != 10) + throw new RuntimeException("performer.getKeyTo() didn't return 10!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetName.java b/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetName.java new file mode 100644 index 00000000000..9c6fb129672 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetName.java @@ -0,0 +1,45 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelPerformer setName method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetName { + + public static void main(String[] args) throws Exception { + ModelPerformer performer = new ModelPerformer(); + performer.setName("hello"); + if(!performer.getName().equals("hello")) + throw new RuntimeException("performer.getName() didn't return \"hello\"!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetSelfNonExclusive.java b/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetSelfNonExclusive.java new file mode 100644 index 00000000000..86f5ea006b4 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetSelfNonExclusive.java @@ -0,0 +1,48 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelPerformer setSelfNonExclusive method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetSelfNonExclusive { + + public static void main(String[] args) throws Exception { + ModelPerformer performer = new ModelPerformer(); + performer.setSelfNonExclusive(true); + if(performer.isSelfNonExclusive() != true) + throw new RuntimeException("performer.isSelfNonExclusive() didn't return true!"); + performer.setSelfNonExclusive(false); + if(performer.isSelfNonExclusive() != false) + throw new RuntimeException("performer.isSelfNonExclusive() didn't return false!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetVelFrom.java b/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetVelFrom.java new file mode 100644 index 00000000000..bdc4176d0ca --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetVelFrom.java @@ -0,0 +1,45 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelPerformer setVelFrom method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetVelFrom { + + public static void main(String[] args) throws Exception { + ModelPerformer performer = new ModelPerformer(); + performer.setVelFrom(10); + if(performer.getVelFrom() != 10) + throw new RuntimeException("performer.getVelFrom() didn't return 10!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetVelTo.java b/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetVelTo.java new file mode 100644 index 00000000000..cbba49007f4 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelPerformer/SetVelTo.java @@ -0,0 +1,45 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelPerformer setVelTo method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetVelTo { + + public static void main(String[] args) throws Exception { + ModelPerformer performer = new ModelPerformer(); + performer.setVelTo(10); + if(performer.getVelTo() != 10) + throw new RuntimeException("performer.getVelTo() didn't return 10!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelSource/NewModelSource.java b/jdk/test/javax/sound/midi/Gervill/ModelSource/NewModelSource.java new file mode 100644 index 00000000000..e2766c30fed --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelSource/NewModelSource.java @@ -0,0 +1,48 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelSource() constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelSource { + + public static void main(String[] args) throws Exception { + ModelSource src = new ModelSource(); + if(src.getIdentifier() != ModelSource.SOURCE_NONE) + throw new RuntimeException("src.getIdentifier() doesn't return ModelSource.SOURCE_NONE!"); + if(!(src.getTransform() instanceof ModelStandardTransform)) + throw new RuntimeException("src.getTransform() doesn't return object which is instance of ModelStandardTransform!"); + + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelSource/NewModelSourceModelIdentifier.java b/jdk/test/javax/sound/midi/Gervill/ModelSource/NewModelSourceModelIdentifier.java new file mode 100644 index 00000000000..00ae37699ab --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelSource/NewModelSourceModelIdentifier.java @@ -0,0 +1,46 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelSource(ModelIdentifier) constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelSourceModelIdentifier { + + public static void main(String[] args) throws Exception { + ModelSource src = new ModelSource(ModelSource.SOURCE_NOTEON_KEYNUMBER); + if(src.getIdentifier() != ModelSource.SOURCE_NOTEON_KEYNUMBER) + throw new RuntimeException("src.getIdentifier() doesn't return ModelSource.SOURCE_NOTEON_KEYNUMBER!"); + if(!(src.getTransform() instanceof ModelStandardTransform)) + throw new RuntimeException("src.getTransform() doesn't return object which is instance of ModelStandardTransform!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelSource/NewModelSourceModelIdentifierBoolean.java b/jdk/test/javax/sound/midi/Gervill/ModelSource/NewModelSourceModelIdentifierBoolean.java new file mode 100644 index 00000000000..397718b2820 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelSource/NewModelSourceModelIdentifierBoolean.java @@ -0,0 +1,49 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelSource(ModelIdentifier,boolean) constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelSourceModelIdentifierBoolean { + + public static void main(String[] args) throws Exception { + ModelSource src = new ModelSource(ModelSource.SOURCE_NOTEON_KEYNUMBER,ModelStandardTransform.DIRECTION_MAX2MIN); + if(src.getIdentifier() != ModelSource.SOURCE_NOTEON_KEYNUMBER) + throw new RuntimeException("src.getIdentifier() doesn't return ModelSource.SOURCE_NOTEON_KEYNUMBER!"); + if(!(src.getTransform() instanceof ModelStandardTransform)) + throw new RuntimeException("src.getTransform() doesn't return object which is instance of ModelStandardTransform!"); + ModelStandardTransform trans = (ModelStandardTransform)src.getTransform(); + if(trans.getDirection() != ModelStandardTransform.DIRECTION_MAX2MIN) + throw new RuntimeException("trans.getDirection() doesn't return ModelStandardTransform.DIRECTION_MAX2MIN!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelSource/NewModelSourceModelIdentifierBooleanBoolean.java b/jdk/test/javax/sound/midi/Gervill/ModelSource/NewModelSourceModelIdentifierBooleanBoolean.java new file mode 100644 index 00000000000..1d8776a67be --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelSource/NewModelSourceModelIdentifierBooleanBoolean.java @@ -0,0 +1,51 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelSource(ModelIdentifier,boolean,boolean) constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelSourceModelIdentifierBooleanBoolean { + + public static void main(String[] args) throws Exception { + ModelSource src = new ModelSource(ModelSource.SOURCE_NOTEON_KEYNUMBER,ModelStandardTransform.DIRECTION_MAX2MIN,ModelStandardTransform.POLARITY_BIPOLAR); + if(src.getIdentifier() != ModelSource.SOURCE_NOTEON_KEYNUMBER) + throw new RuntimeException("src.getIdentifier() doesn't return ModelSource.SOURCE_NOTEON_KEYNUMBER!"); + if(!(src.getTransform() instanceof ModelStandardTransform)) + throw new RuntimeException("src.getTransform() doesn't return object which is instance of ModelStandardTransform!"); + ModelStandardTransform trans = (ModelStandardTransform)src.getTransform(); + if(trans.getDirection() != ModelStandardTransform.DIRECTION_MAX2MIN) + throw new RuntimeException("trans.getDirection() doesn't return ModelStandardTransform.DIRECTION_MAX2MIN!"); + if(trans.getPolarity() != ModelStandardTransform.POLARITY_BIPOLAR) + throw new RuntimeException("trans.getPolarity() doesn't return ModelStandardTransform.POLARITY_BIPOLAR!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelSource/NewModelSourceModelIdentifierBooleanBooleanInt.java b/jdk/test/javax/sound/midi/Gervill/ModelSource/NewModelSourceModelIdentifierBooleanBooleanInt.java new file mode 100644 index 00000000000..fe66b1bccf9 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelSource/NewModelSourceModelIdentifierBooleanBooleanInt.java @@ -0,0 +1,56 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelSource(ModelIdentifier,boolean,boolean,int) constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelSourceModelIdentifierBooleanBooleanInt { + + public static void main(String[] args) throws Exception { + ModelSource src = new ModelSource(ModelSource.SOURCE_NOTEON_KEYNUMBER, + ModelStandardTransform.DIRECTION_MAX2MIN, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_CONCAVE); + if(src.getIdentifier() != ModelSource.SOURCE_NOTEON_KEYNUMBER) + throw new RuntimeException("src.getIdentifier() doesn't return ModelSource.SOURCE_NOTEON_KEYNUMBER!"); + if(!(src.getTransform() instanceof ModelStandardTransform)) + throw new RuntimeException("src.getTransform() doesn't return object which is instance of ModelStandardTransform!"); + ModelStandardTransform trans = (ModelStandardTransform)src.getTransform(); + if(trans.getDirection() != ModelStandardTransform.DIRECTION_MAX2MIN) + throw new RuntimeException("trans.getDirection() doesn't return ModelStandardTransform.DIRECTION_MAX2MIN!"); + if(trans.getPolarity() != ModelStandardTransform.POLARITY_BIPOLAR) + throw new RuntimeException("trans.getPolarity() doesn't return ModelStandardTransform.POLARITY_BIPOLAR!"); + if(trans.getTransform() != ModelStandardTransform.TRANSFORM_CONCAVE) + throw new RuntimeException("trans.getTransform() doesn't return ModelStandardTransform.TRANSFORM_CONCAVE!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelSource/NewModelSourceModelIdentifierModelTransform.java b/jdk/test/javax/sound/midi/Gervill/ModelSource/NewModelSourceModelIdentifierModelTransform.java new file mode 100644 index 00000000000..42c880ebb61 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelSource/NewModelSourceModelIdentifierModelTransform.java @@ -0,0 +1,47 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelSource(ModelIdentifier,ModelTransform) constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelSourceModelIdentifierModelTransform { + + public static void main(String[] args) throws Exception { + ModelStandardTransform trans = new ModelStandardTransform(); + ModelSource src = new ModelSource(ModelSource.SOURCE_NOTEON_KEYNUMBER, trans); + if(src.getIdentifier() != ModelSource.SOURCE_NOTEON_KEYNUMBER) + throw new RuntimeException("src.getIdentifier() doesn't return ModelSource.SOURCE_NOTEON_KEYNUMBER!"); + if(src.getTransform() != trans) + throw new RuntimeException("src.getTransform() doesn't return trans!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelSource/SetIdentifier.java b/jdk/test/javax/sound/midi/Gervill/ModelSource/SetIdentifier.java new file mode 100644 index 00000000000..793231577eb --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelSource/SetIdentifier.java @@ -0,0 +1,45 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelSource setIdentifier method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetIdentifier { + + public static void main(String[] args) throws Exception { + ModelSource src = new ModelSource(); + src.setIdentifier(ModelSource.SOURCE_NOTEON_KEYNUMBER); + if(src.getIdentifier() != ModelSource.SOURCE_NOTEON_KEYNUMBER) + throw new RuntimeException("src.getIdentifier() doesn't return ModelSource.SOURCE_NOTEON_KEYNUMBER!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelSource/SetTransform.java b/jdk/test/javax/sound/midi/Gervill/ModelSource/SetTransform.java new file mode 100644 index 00000000000..b36b4382e79 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelSource/SetTransform.java @@ -0,0 +1,46 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelSource setTransform method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetTransform { + + public static void main(String[] args) throws Exception { + ModelSource src = new ModelSource(); + ModelStandardTransform trans = new ModelStandardTransform(); + src.setTransform(trans); + if(src.getTransform() != trans) + throw new RuntimeException("src.getTransform() doesn't return trans!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/NewModelStandardTransform.java b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/NewModelStandardTransform.java new file mode 100644 index 00000000000..04fa862f1ee --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/NewModelStandardTransform.java @@ -0,0 +1,48 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelStandardTransform constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelStandardTransform { + + public static void main(String[] args) throws Exception { + ModelStandardTransform transform = new ModelStandardTransform(); + if(transform.getDirection() != ModelStandardTransform.DIRECTION_MIN2MAX) + throw new RuntimeException("transform.getDirection() doesn't return ModelStandardTransform.DIRECTION_MIN2MAX!"); + if(transform.getPolarity() != ModelStandardTransform.POLARITY_UNIPOLAR) + throw new RuntimeException("transform.getPolarity() doesn't return ModelStandardTransform.POLARITY_UNIPOLAR!"); + if(transform.getTransform() != ModelStandardTransform.TRANSFORM_LINEAR) + throw new RuntimeException("transform.getTransform() doesn't return ModelStandardTransform.TRANSFORM_LINEAR!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/NewModelStandardTransformBoolean.java b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/NewModelStandardTransformBoolean.java new file mode 100644 index 00000000000..6d6362944be --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/NewModelStandardTransformBoolean.java @@ -0,0 +1,48 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelStandardTransform(boolean) constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelStandardTransformBoolean { + + public static void main(String[] args) throws Exception { + ModelStandardTransform transform = new ModelStandardTransform(ModelStandardTransform.DIRECTION_MAX2MIN); + if(transform.getDirection() != ModelStandardTransform.DIRECTION_MAX2MIN) + throw new RuntimeException("transform.getDirection() doesn't return ModelStandardTransform.DIRECTION_MAX2MIN!"); + if(transform.getPolarity() != ModelStandardTransform.POLARITY_UNIPOLAR) + throw new RuntimeException("transform.getPolarity() doesn't return ModelStandardTransform.POLARITY_UNIPOLAR!"); + if(transform.getTransform() != ModelStandardTransform.TRANSFORM_LINEAR) + throw new RuntimeException("transform.getTransform() doesn't return ModelStandardTransform.TRANSFORM_LINEAR!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/NewModelStandardTransformBooleanBoolean.java b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/NewModelStandardTransformBooleanBoolean.java new file mode 100644 index 00000000000..b3656a3cc3c --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/NewModelStandardTransformBooleanBoolean.java @@ -0,0 +1,50 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelStandardTransform(boolean,boolean) constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelStandardTransformBooleanBoolean { + + public static void main(String[] args) throws Exception { + ModelStandardTransform transform = new ModelStandardTransform( + ModelStandardTransform.DIRECTION_MAX2MIN, + ModelStandardTransform.POLARITY_BIPOLAR); + if(transform.getDirection() != ModelStandardTransform.DIRECTION_MAX2MIN) + throw new RuntimeException("transform.getDirection() doesn't return ModelStandardTransform.DIRECTION_MAX2MIN!"); + if(transform.getPolarity() != ModelStandardTransform.POLARITY_BIPOLAR) + throw new RuntimeException("transform.getPolarity() doesn't return ModelStandardTransform.POLARITY_BIPOLAR!"); + if(transform.getTransform() != ModelStandardTransform.TRANSFORM_LINEAR) + throw new RuntimeException("transform.getTransform() doesn't return ModelStandardTransform.TRANSFORM_LINEAR!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/NewModelStandardTransformBooleanBooleanInt.java b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/NewModelStandardTransformBooleanBooleanInt.java new file mode 100644 index 00000000000..06593ea9bf5 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/NewModelStandardTransformBooleanBooleanInt.java @@ -0,0 +1,51 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelStandardTransform(boolean,boolean,int) constructor */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewModelStandardTransformBooleanBooleanInt { + + public static void main(String[] args) throws Exception { + ModelStandardTransform transform = new ModelStandardTransform( + ModelStandardTransform.DIRECTION_MAX2MIN, + ModelStandardTransform.POLARITY_BIPOLAR, + ModelStandardTransform.TRANSFORM_CONVEX); + if(transform.getDirection() != ModelStandardTransform.DIRECTION_MAX2MIN) + throw new RuntimeException("transform.getDirection() doesn't return ModelStandardTransform.DIRECTION_MAX2MIN!"); + if(transform.getPolarity() != ModelStandardTransform.POLARITY_BIPOLAR) + throw new RuntimeException("transform.getPolarity() doesn't return ModelStandardTransform.POLARITY_BIPOLAR!"); + if(transform.getTransform() != ModelStandardTransform.TRANSFORM_CONVEX) + throw new RuntimeException("transform.getTransform() doesn't return ModelStandardTransform.TRANSFORM_CONVEX!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/SetDirection.java b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/SetDirection.java new file mode 100644 index 00000000000..b0941296dcb --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/SetDirection.java @@ -0,0 +1,45 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelStandardTransform setDirection method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetDirection { + + public static void main(String[] args) throws Exception { + ModelStandardTransform transform = new ModelStandardTransform(); + transform.setDirection(ModelStandardTransform.DIRECTION_MAX2MIN); + if(transform.getDirection() != ModelStandardTransform.DIRECTION_MAX2MIN) + throw new RuntimeException("transform.getDirection() doesn't return ModelStandardTransform.DIRECTION_MAX2MIN!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/SetPolarity.java b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/SetPolarity.java new file mode 100644 index 00000000000..804e8b60820 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/SetPolarity.java @@ -0,0 +1,45 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelStandardTransform setPolarity method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetPolarity { + + public static void main(String[] args) throws Exception { + ModelStandardTransform transform = new ModelStandardTransform(); + transform.setPolarity(ModelStandardTransform.POLARITY_BIPOLAR); + if(transform.getPolarity() != ModelStandardTransform.POLARITY_BIPOLAR) + throw new RuntimeException("transform.getPolarity() doesn't return ModelStandardTransform.POLARITY_BIPOLAR!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/SetTransform.java b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/SetTransform.java new file mode 100644 index 00000000000..8cfe08fbdbf --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/SetTransform.java @@ -0,0 +1,74 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelStandardTransform setTransform method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetTransform { + + + private static boolean checkLinearity(ModelStandardTransform transform) + { + double lastx = 0; + for (int p = 0; p < 2; p++) + for (int d = 0; d < 2; d++) + for (double i = 0; i < 1.0; i+=0.001) { + if(p == 0) + transform.setPolarity(ModelStandardTransform.POLARITY_UNIPOLAR); + else + transform.setPolarity(ModelStandardTransform.POLARITY_BIPOLAR); + if(d == 0) + transform.setDirection(ModelStandardTransform.DIRECTION_MIN2MAX); + else + transform.setDirection(ModelStandardTransform.DIRECTION_MAX2MIN); + double x = transform.transform(i); + if(i == 0) + lastx = x; + else + { + if(lastx - x > 0.2) return false; + lastx = x; + } + } + return true; + } + + + public static void main(String[] args) throws Exception { + ModelStandardTransform transform = new ModelStandardTransform(); + transform.setTransform(ModelStandardTransform.TRANSFORM_CONVEX); + if(transform.getTransform() != ModelStandardTransform.TRANSFORM_CONVEX) + throw new RuntimeException("transform.getTransform() doesn't return ModelStandardTransform.TRANSFORM_CONVEX!"); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/TransformAbsolute.java b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/TransformAbsolute.java new file mode 100644 index 00000000000..a2f690dcc5c --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/TransformAbsolute.java @@ -0,0 +1,73 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelStandardTransform transform method */ + +import com.sun.media.sound.ModelStandardTransform; + +public class TransformAbsolute { + + private static boolean checkLinearity(ModelStandardTransform transform) + { + double lastx = 0; + for (int p = 0; p < 2; p++) + for (int d = 0; d < 2; d++) + for (double i = 0; i < 1.0; i+=0.001) { + if(p == 0) + transform.setPolarity(ModelStandardTransform.POLARITY_UNIPOLAR); + else + transform.setPolarity(ModelStandardTransform.POLARITY_BIPOLAR); + if(d == 0) + transform.setDirection(ModelStandardTransform.DIRECTION_MIN2MAX); + else + transform.setDirection(ModelStandardTransform.DIRECTION_MAX2MIN); + double x = transform.transform(i); + if(i == 0) + lastx = x; + else + { + if(lastx - x > 0.2) return false; + lastx = x; + } + } + return true; + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + + } + + public static void main(String[] args) throws Exception { + ModelStandardTransform transform = new ModelStandardTransform(); + transform.setTransform(ModelStandardTransform.TRANSFORM_ABSOLUTE); + assertTrue(Math.abs(transform.transform(0.2f) - 0.2f) < 0.0001f); + assertTrue(Math.abs(transform.transform(-0.8f) - 0.8f) < 0.0001f); + assertTrue(checkLinearity(transform)); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/TransformConcave.java b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/TransformConcave.java new file mode 100644 index 00000000000..448658df19b --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/TransformConcave.java @@ -0,0 +1,98 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelStandardTransform transform method */ + +import com.sun.media.sound.ModelStandardTransform; + +public class TransformConcave { + + private static boolean checkLinearity(ModelStandardTransform transform) + { + double lastx = 0; + for (int p = 0; p < 2; p++) + for (int d = 0; d < 2; d++) + for (double i = 0; i < 1.0; i+=0.001) { + if(p == 0) + transform.setPolarity(ModelStandardTransform.POLARITY_UNIPOLAR); + else + transform.setPolarity(ModelStandardTransform.POLARITY_BIPOLAR); + if(d == 0) + transform.setDirection(ModelStandardTransform.DIRECTION_MIN2MAX); + else + transform.setDirection(ModelStandardTransform.DIRECTION_MAX2MIN); + double x = transform.transform(i); + if(i == 0) + lastx = x; + else + { + if(lastx - x > 0.2) return false; + lastx = x; + } + } + return true; + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + ModelStandardTransform transform = new ModelStandardTransform(); + transform.setTransform(ModelStandardTransform.TRANSFORM_CONCAVE); + assertTrue(checkLinearity(transform)); + + transform.setDirection(ModelStandardTransform.DIRECTION_MIN2MAX); + transform.setPolarity(ModelStandardTransform.POLARITY_UNIPOLAR); + assertTrue(Math.abs(transform.transform(0.0f) - 0.0f) < 0.0001f); + assertTrue(transform.transform(0.5f) < 0.5f); + assertTrue(Math.abs(transform.transform(1.0f) - 1.0f) < 0.0001f); + + transform.setDirection(ModelStandardTransform.DIRECTION_MAX2MIN); + transform.setPolarity(ModelStandardTransform.POLARITY_UNIPOLAR); + assertTrue(Math.abs(transform.transform(1.0f) - 0.0f) < 0.0001f); + assertTrue(transform.transform(0.5f) < 0.5f); + assertTrue(Math.abs(transform.transform(0.0f) - 1.0f) < 0.0001f); + + transform.setDirection(ModelStandardTransform.DIRECTION_MIN2MAX); + transform.setPolarity(ModelStandardTransform.POLARITY_BIPOLAR); + assertTrue(Math.abs(transform.transform(0.0f) + 1.0f) < 0.0001f); + assertTrue(transform.transform(0.25f) > -0.5f); + assertTrue(Math.abs(transform.transform(0.5f) - 0.0f) < 0.0001f); + assertTrue(transform.transform(0.75f) < 0.5f); + assertTrue(Math.abs(transform.transform(1.0f) - 1.0f) < 0.0001f); + + transform.setDirection(ModelStandardTransform.DIRECTION_MAX2MIN); + transform.setPolarity(ModelStandardTransform.POLARITY_BIPOLAR); + assertTrue(Math.abs(transform.transform(1.0f) + 1.0f) < 0.0001f); + assertTrue(transform.transform(0.75f) > -0.5f); + assertTrue(Math.abs(transform.transform(0.50f) - 0.0f) < 0.0001f); + assertTrue(transform.transform(0.25f) < 0.5f); + assertTrue(Math.abs(transform.transform(0.0f) - 1.0f) < 0.0001f); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/TransformConvex.java b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/TransformConvex.java new file mode 100644 index 00000000000..fc8ec5e2a63 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/TransformConvex.java @@ -0,0 +1,98 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelStandardTransform transform method */ + +import com.sun.media.sound.ModelStandardTransform; + +public class TransformConvex { + + private static boolean checkLinearity(ModelStandardTransform transform) + { + double lastx = 0; + for (int p = 0; p < 2; p++) + for (int d = 0; d < 2; d++) + for (double i = 0; i < 1.0; i+=0.001) { + if(p == 0) + transform.setPolarity(ModelStandardTransform.POLARITY_UNIPOLAR); + else + transform.setPolarity(ModelStandardTransform.POLARITY_BIPOLAR); + if(d == 0) + transform.setDirection(ModelStandardTransform.DIRECTION_MIN2MAX); + else + transform.setDirection(ModelStandardTransform.DIRECTION_MAX2MIN); + double x = transform.transform(i); + if(i == 0) + lastx = x; + else + { + if(lastx - x > 0.2) return false; + lastx = x; + } + } + return true; + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + ModelStandardTransform transform = new ModelStandardTransform(); + transform.setTransform(ModelStandardTransform.TRANSFORM_CONVEX); + assertTrue(checkLinearity(transform)); + + transform.setDirection(ModelStandardTransform.DIRECTION_MIN2MAX); + transform.setPolarity(ModelStandardTransform.POLARITY_UNIPOLAR); + assertTrue(Math.abs(transform.transform(0.0f) - 0.0f) < 0.0001f); + assertTrue(transform.transform(0.5f) > 0.5f); + assertTrue(Math.abs(transform.transform(1.0f) - 1.0f) < 0.0001f); + + transform.setDirection(ModelStandardTransform.DIRECTION_MAX2MIN); + transform.setPolarity(ModelStandardTransform.POLARITY_UNIPOLAR); + assertTrue(Math.abs(transform.transform(1.0f) - 0.0f) < 0.0001f); + assertTrue(transform.transform(0.5f) > 0.5f); + assertTrue(Math.abs(transform.transform(0.0f) - 1.0f) < 0.0001f); + + transform.setDirection(ModelStandardTransform.DIRECTION_MIN2MAX); + transform.setPolarity(ModelStandardTransform.POLARITY_BIPOLAR); + assertTrue(Math.abs(transform.transform(0.0f) + 1.0f) < 0.0001f); + assertTrue(transform.transform(0.25f) < -0.5f); + assertTrue(Math.abs(transform.transform(0.5f) - 0.0f) < 0.0001f); + assertTrue(transform.transform(0.75f) > 0.5f); + assertTrue(Math.abs(transform.transform(1.0f) - 1.0f) < 0.0001f); + + transform.setDirection(ModelStandardTransform.DIRECTION_MAX2MIN); + transform.setPolarity(ModelStandardTransform.POLARITY_BIPOLAR); + assertTrue(Math.abs(transform.transform(1.0f) + 1.0f) < 0.0001f); + assertTrue(transform.transform(0.75f) < -0.5f); + assertTrue(Math.abs(transform.transform(0.50f) - 0.0f) < 0.0001f); + assertTrue(transform.transform(0.25f) > 0.5f); + assertTrue(Math.abs(transform.transform(0.0f) - 1.0f) < 0.0001f); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/TransformLinear.java b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/TransformLinear.java new file mode 100644 index 00000000000..1e575178684 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/TransformLinear.java @@ -0,0 +1,90 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelStandardTransform transform method */ + +import com.sun.media.sound.ModelStandardTransform; + +public class TransformLinear { + + private static boolean checkLinearity(ModelStandardTransform transform) + { + double lastx = 0; + for (int p = 0; p < 2; p++) + for (int d = 0; d < 2; d++) + for (double i = 0; i < 1.0; i+=0.001) { + if(p == 0) + transform.setPolarity(ModelStandardTransform.POLARITY_UNIPOLAR); + else + transform.setPolarity(ModelStandardTransform.POLARITY_BIPOLAR); + if(d == 0) + transform.setDirection(ModelStandardTransform.DIRECTION_MIN2MAX); + else + transform.setDirection(ModelStandardTransform.DIRECTION_MAX2MIN); + double x = transform.transform(i); + if(i == 0) + lastx = x; + else + { + if(lastx - x > 0.2) return false; + lastx = x; + } + } + return true; + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + ModelStandardTransform transform = new ModelStandardTransform(); + transform.setTransform(ModelStandardTransform.TRANSFORM_LINEAR); + assertTrue(checkLinearity(transform)); + + transform.setDirection(ModelStandardTransform.DIRECTION_MIN2MAX); + transform.setPolarity(ModelStandardTransform.POLARITY_UNIPOLAR); + assertTrue(Math.abs(transform.transform(0.2f) - 0.2f) < 0.0001f); + assertTrue(Math.abs(transform.transform(0.8f) - 0.8f) < 0.0001f); + + transform.setDirection(ModelStandardTransform.DIRECTION_MAX2MIN); + transform.setPolarity(ModelStandardTransform.POLARITY_UNIPOLAR); + assertTrue(Math.abs(transform.transform(0.2f) - 0.8f) < 0.0001f); + assertTrue(Math.abs(transform.transform(0.8f) - 0.2f) < 0.0001f); + + transform.setDirection(ModelStandardTransform.DIRECTION_MIN2MAX); + transform.setPolarity(ModelStandardTransform.POLARITY_BIPOLAR); + assertTrue(Math.abs(transform.transform(0.2f) - (-0.6f)) < 0.0001f); + assertTrue(Math.abs(transform.transform(0.8f) - (0.6f)) < 0.0001f); + + transform.setDirection(ModelStandardTransform.DIRECTION_MAX2MIN); + transform.setPolarity(ModelStandardTransform.POLARITY_BIPOLAR); + assertTrue(Math.abs(transform.transform(0.2f) - (0.6f)) < 0.0001f); + assertTrue(Math.abs(transform.transform(0.8f) - (-0.6f)) < 0.0001f); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/TransformSwitch.java b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/TransformSwitch.java new file mode 100644 index 00000000000..21ba674e817 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/ModelStandardTransform/TransformSwitch.java @@ -0,0 +1,63 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test ModelStandardTransform transform method */ + +import com.sun.media.sound.ModelStandardTransform; + +public class TransformSwitch { + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + ModelStandardTransform transform = new ModelStandardTransform(); + transform.setTransform(ModelStandardTransform.TRANSFORM_SWITCH); + + transform.setDirection(ModelStandardTransform.DIRECTION_MIN2MAX); + transform.setPolarity(ModelStandardTransform.POLARITY_UNIPOLAR); + assertTrue(Math.abs(transform.transform(0.2f) - 0.0f) < 0.0001f); + assertTrue(Math.abs(transform.transform(0.8f) - 1.0f) < 0.0001f); + + transform.setDirection(ModelStandardTransform.DIRECTION_MAX2MIN); + transform.setPolarity(ModelStandardTransform.POLARITY_UNIPOLAR); + assertTrue(Math.abs(transform.transform(0.2f) - 1.0f) < 0.0001f); + assertTrue(Math.abs(transform.transform(0.8f) - 0.0f) < 0.0001f); + + transform.setDirection(ModelStandardTransform.DIRECTION_MIN2MAX); + transform.setPolarity(ModelStandardTransform.POLARITY_BIPOLAR); + assertTrue(Math.abs(transform.transform(0.2f) + 1.0f) < 0.0001f); + assertTrue(Math.abs(transform.transform(0.8f) - 1.0f) < 0.0001f); + + transform.setDirection(ModelStandardTransform.DIRECTION_MAX2MIN); + transform.setPolarity(ModelStandardTransform.POLARITY_BIPOLAR); + assertTrue(Math.abs(transform.transform(0.2f) - 1.0f) < 0.0001f); + assertTrue(Math.abs(transform.transform(0.8f) + 1.0f) < 0.0001f); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/Available.java b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/Available.java new file mode 100644 index 00000000000..6e7aa1f8d32 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/Available.java @@ -0,0 +1,78 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader available method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Available { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + writer = new RIFFWriter(tempfile, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.writeByte(10); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + RIFFReader readchunk = reader.nextChunk(); + int avail = readchunk.available(); + readchunk.readByte(); + assertEquals(avail - 1,readchunk.available()); + fis.close(); + reader = null; + + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/Close.java b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/Close.java new file mode 100644 index 00000000000..5f1192d8bf1 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/Close.java @@ -0,0 +1,72 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader close method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Close { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + writer = new RIFFWriter(tempfile, "TEST"); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + reader.close(); + reader = null; + + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/GetFilePointer.java b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/GetFilePointer.java new file mode 100644 index 00000000000..7a04e6fe611 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/GetFilePointer.java @@ -0,0 +1,78 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader getFilePointer method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetFilePointer { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + writer = new RIFFWriter(tempfile, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.writeByte(10); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + RIFFReader readchunk = reader.nextChunk(); + long p = readchunk.getFilePointer(); + readchunk.readByte(); + assertEquals(p+1,readchunk.getFilePointer()); + fis.close(); + reader = null; + + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/GetSize.java b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/GetSize.java new file mode 100644 index 00000000000..e35eecd851d --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/GetSize.java @@ -0,0 +1,77 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader getSize method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetSize { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + writer = new RIFFWriter(tempfile, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.writeByte(10); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + RIFFReader readchunk = reader.nextChunk(); + assertEquals(readchunk.getSize(), (long)readchunk.available()); + readchunk.readByte(); + fis.close(); + reader = null; + + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/HasNextChunk.java b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/HasNextChunk.java new file mode 100644 index 00000000000..b6137e51530 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/HasNextChunk.java @@ -0,0 +1,85 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader hasNextChunk method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class HasNextChunk { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean a) throws Exception + { + if(!a) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + writer = new RIFFWriter(tempfile, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.writeByte(10); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + assertTrue(reader.hasNextChunk()); + RIFFReader readchunk = reader.nextChunk(); + readchunk.readByte(); + readchunk.close(); + assertTrue(!reader.hasNextChunk()); + fis.close(); + reader = null; + + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/Read.java b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/Read.java new file mode 100644 index 00000000000..a4b0a07acf7 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/Read.java @@ -0,0 +1,79 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader read method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Read { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + + writer = new RIFFWriter(tempfile, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.write((byte)33); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + assertEquals(reader.getFormat(), "RIFF"); + assertEquals(reader.getType(), "TEST"); + RIFFReader readchunk = reader.nextChunk(); + assertEquals(readchunk.getFormat(), "TSCH"); + assertEquals(readchunk.read(), 33); + fis.close(); + reader = null; + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadByte.java b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadByte.java new file mode 100644 index 00000000000..7ee23c5fb6a --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadByte.java @@ -0,0 +1,79 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader read(byte) method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ReadByte { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + + writer = new RIFFWriter(tempfile, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.writeByte((byte)33); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + assertEquals(reader.getFormat(), "RIFF"); + assertEquals(reader.getType(), "TEST"); + RIFFReader readchunk = reader.nextChunk(); + assertEquals(readchunk.getFormat(), "TSCH"); + assertEquals((int)reader.readByte(), 33); + fis.close(); + reader = null; + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadByteArrayIntInt.java b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadByteArrayIntInt.java new file mode 100644 index 00000000000..78e480a197b --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadByteArrayIntInt.java @@ -0,0 +1,81 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader read(byte[], int, int) method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ReadByteArrayIntInt { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + writer = new RIFFWriter(tempfile, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.write(new byte[] {1,2,3}); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + assertEquals(reader.getFormat(), "RIFF"); + assertEquals(reader.getType(), "TEST"); + RIFFReader readchunk = reader.nextChunk(); + assertEquals(readchunk.getFormat(), "TSCH"); + assertEquals(readchunk.read(), 1); + assertEquals(readchunk.read(), 2); + assertEquals(readchunk.read(), 3); + fis.close(); + reader = null; + + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadInt.java b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadInt.java new file mode 100644 index 00000000000..5408a761ec8 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadInt.java @@ -0,0 +1,79 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader readInt method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ReadInt { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + writer = new RIFFWriter(tempfile, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.writeInt(133); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + assertEquals(reader.getFormat(), "RIFF"); + assertEquals(reader.getType(), "TEST"); + RIFFReader readchunk = reader.nextChunk(); + assertEquals(readchunk.getFormat(), "TSCH"); + assertEquals(reader.readInt(), 133); + fis.close(); + reader = null; + + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadLong.java b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadLong.java new file mode 100644 index 00000000000..290a22407e1 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadLong.java @@ -0,0 +1,79 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader readLong method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ReadLong { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + writer = new RIFFWriter(tempfile, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.writeLong(133L); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + assertEquals(reader.getFormat(), "RIFF"); + assertEquals(reader.getType(), "TEST"); + RIFFReader readchunk = reader.nextChunk(); + assertEquals(readchunk.getFormat(), "TSCH"); + assertEquals(reader.readLong(), 133L); + fis.close(); + reader = null; + + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadShort.java b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadShort.java new file mode 100644 index 00000000000..2b316d584e1 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadShort.java @@ -0,0 +1,79 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader readShort method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ReadShort { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + writer = new RIFFWriter(tempfile, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.writeShort((short)133); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + assertEquals(reader.getFormat(), "RIFF"); + assertEquals(reader.getType(), "TEST"); + RIFFReader readchunk = reader.nextChunk(); + assertEquals(readchunk.getFormat(), "TSCH"); + assertEquals(reader.readShort(), (short)133); + fis.close(); + reader = null; + + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadString.java b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadString.java new file mode 100644 index 00000000000..7985b1b3620 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadString.java @@ -0,0 +1,79 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader readString method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ReadString { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + writer = new RIFFWriter(tempfile, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.writeString("HELLO",5); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + assertEquals(reader.getFormat(), "RIFF"); + assertEquals(reader.getType(), "TEST"); + RIFFReader readchunk = reader.nextChunk(); + assertEquals(readchunk.getFormat(), "TSCH"); + assertEquals(reader.readString(5), "HELLO"); + fis.close(); + reader = null; + + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadUnsignedByte.java b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadUnsignedByte.java new file mode 100644 index 00000000000..594862dc459 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadUnsignedByte.java @@ -0,0 +1,79 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader readUnsignedByte method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ReadUnsignedByte { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + writer = new RIFFWriter(tempfile, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.writeUnsignedByte(77); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + assertEquals(reader.getFormat(), "RIFF"); + assertEquals(reader.getType(), "TEST"); + RIFFReader readchunk = reader.nextChunk(); + assertEquals(readchunk.getFormat(), "TSCH"); + assertEquals(reader.readUnsignedByte(), 77); + fis.close(); + reader = null; + + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadUnsignedInt.java b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadUnsignedInt.java new file mode 100644 index 00000000000..d0e2847fa5f --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadUnsignedInt.java @@ -0,0 +1,79 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader readUnsignedInt method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ReadUnsignedInt { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + writer = new RIFFWriter(tempfile, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.writeUnsignedInt(55377); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + assertEquals(reader.getFormat(), "RIFF"); + assertEquals(reader.getType(), "TEST"); + RIFFReader readchunk = reader.nextChunk(); + assertEquals(readchunk.getFormat(), "TSCH"); + assertEquals(reader.readUnsignedInt(), 55377L); + fis.close(); + reader = null; + + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadUnsignedShort.java b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadUnsignedShort.java new file mode 100644 index 00000000000..a61a0cb01f3 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/ReadUnsignedShort.java @@ -0,0 +1,79 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader readUnsignedShort method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ReadUnsignedShort { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + writer = new RIFFWriter(tempfile, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.writeUnsignedShort(377); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + assertEquals(reader.getFormat(), "RIFF"); + assertEquals(reader.getType(), "TEST"); + RIFFReader readchunk = reader.nextChunk(); + assertEquals(readchunk.getFormat(), "TSCH"); + assertEquals(reader.readUnsignedShort(), 377); + fis.close(); + reader = null; + + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/Skip.java b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/Skip.java new file mode 100644 index 00000000000..d3408c994fa --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/Skip.java @@ -0,0 +1,78 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffReader skip method */ + +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Skip { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + writer = new RIFFWriter(tempfile, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.write((byte)33); + chunk.write((byte)44); + writer.close(); + writer = null; + FileInputStream fis = new FileInputStream(tempfile); + reader = new RIFFReader(fis); + RIFFReader readchunk = reader.nextChunk(); + reader.skip(1); + assertEquals(readchunk.read(), 44); + fis.close(); + reader = null; + + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/WriteOutputStream.java b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/WriteOutputStream.java new file mode 100644 index 00000000000..a7f5d23113f --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/WriteOutputStream.java @@ -0,0 +1,81 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test RiffWriter(OutputStream) constructor */ + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class WriteOutputStream { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + RIFFWriter writer = null; + RIFFReader reader = null; + File tempfile = File.createTempFile("test",".riff"); + try + { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + writer = new RIFFWriter(baos, "TEST"); + RIFFWriter chunk = writer.writeChunk("TSCH"); + chunk.write((byte)33); + writer.close(); + writer = null; + ByteArrayInputStream fis = new ByteArrayInputStream(baos.toByteArray()); + reader = new RIFFReader(fis); + assertEquals(reader.getFormat(), "RIFF"); + assertEquals(reader.getType(), "TEST"); + RIFFReader readchunk = reader.nextChunk(); + assertEquals(readchunk.getFormat(), "TSCH"); + assertEquals(readchunk.read(), 33); + fis.close(); + reader = null; + + + } + finally + { + if(writer != null) + writer.close(); + if(reader != null) + reader.close(); + + if(tempfile.exists()) + if(!tempfile.delete()) + tempfile.deleteOnExit(); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SF2SoundbankReader/TestGetSoundbankFile.java b/jdk/test/javax/sound/midi/Gervill/SF2SoundbankReader/TestGetSoundbankFile.java new file mode 100644 index 00000000000..f526d6ef672 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SF2SoundbankReader/TestGetSoundbankFile.java @@ -0,0 +1,52 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SF2SoundbankReader getSoundbank(File) method */ + +import java.io.File; + +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; + +import com.sun.media.sound.SF2SoundbankReader; + +public class TestGetSoundbankFile { + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + File file = new File(System.getProperty("test.src", "."), "ding.sf2"); + Soundbank sf2 = new SF2SoundbankReader().getSoundbank(file); + assertTrue(sf2.getInstruments().length == 1); + Patch patch = sf2.getInstruments()[0].getPatch(); + assertTrue(patch.getProgram() == 0); + assertTrue(patch.getBank() == 0); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SF2SoundbankReader/TestGetSoundbankInputStream.java b/jdk/test/javax/sound/midi/Gervill/SF2SoundbankReader/TestGetSoundbankInputStream.java new file mode 100644 index 00000000000..446b6f2dd8f --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SF2SoundbankReader/TestGetSoundbankInputStream.java @@ -0,0 +1,63 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SF2SoundbankReader getSoundbank(InputStream) method */ + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; + +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; + +import com.sun.media.sound.SF2SoundbankReader; + +public class TestGetSoundbankInputStream { + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + File file = new File(System.getProperty("test.src", "."), "ding.sf2"); + FileInputStream fis = new FileInputStream(file); + BufferedInputStream bis = new BufferedInputStream(fis); + try + { + Soundbank sf2 = new SF2SoundbankReader().getSoundbank(bis); + assertTrue(sf2.getInstruments().length == 1); + Patch patch = sf2.getInstruments()[0].getPatch(); + assertTrue(patch.getProgram() == 0); + assertTrue(patch.getBank() == 0); + } + finally + { + bis.close(); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SF2SoundbankReader/TestGetSoundbankInputStream2.java b/jdk/test/javax/sound/midi/Gervill/SF2SoundbankReader/TestGetSoundbankInputStream2.java new file mode 100644 index 00000000000..a914a6446ed --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SF2SoundbankReader/TestGetSoundbankInputStream2.java @@ -0,0 +1,119 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SF2SoundbankReader getSoundbank(InputStream) method using + very bad InputStream which can only read 1 byte at time */ + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; + +import com.sun.media.sound.SF2SoundbankReader; + +public class TestGetSoundbankInputStream2 { + + private static class BadInputStream extends InputStream + { + + InputStream is; + + public BadInputStream(InputStream is) + { + this.is = is; + } + + public int read() throws IOException { + return is.read(); + } + + public int read(byte[] b, int off, int len) throws IOException { + if(len > 1) len = 1; + return is.read(b, off, len); + } + + public int read(byte[] b) throws IOException { + return read(b, 0, b.length); + } + + public long skip(long n) throws IOException { + if(n > 1) n = 1; + return is.skip(n); + } + + public int available() throws IOException { + int avail = is.available(); + if(avail > 1) avail = 1; + return avail; + } + + public void close() throws IOException { + is.close(); + } + + public synchronized void mark(int readlimit) { + is.mark(readlimit); + } + + public boolean markSupported() { + return is.markSupported(); + } + + public synchronized void reset() throws IOException { + is.reset(); + } + + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + File file = new File(System.getProperty("test.src", "."), "ding.sf2"); + FileInputStream fis = new FileInputStream(file); + BufferedInputStream bis = new BufferedInputStream(fis); + try + { + InputStream badis = new BadInputStream(bis); + Soundbank sf2 = new SF2SoundbankReader().getSoundbank(badis); + assertTrue(sf2.getInstruments().length == 1); + Patch patch = sf2.getInstruments()[0].getPatch(); + assertTrue(patch.getProgram() == 0); + assertTrue(patch.getBank() == 0); + } + finally + { + bis.close(); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SF2SoundbankReader/TestGetSoundbankUrl.java b/jdk/test/javax/sound/midi/Gervill/SF2SoundbankReader/TestGetSoundbankUrl.java new file mode 100644 index 00000000000..16e39399bf4 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SF2SoundbankReader/TestGetSoundbankUrl.java @@ -0,0 +1,54 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SF2SoundbankReader getSoundbank(File) method */ + +import java.io.File; +import java.net.URL; + +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; + +import com.sun.media.sound.SF2SoundbankReader; + +public class TestGetSoundbankUrl { + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + File file = new File(System.getProperty("test.src", "."), "ding.sf2"); + URL url = file.toURI().toURL(); + Soundbank sf2 = new SF2SoundbankReader().getSoundbank(url); + assertTrue(sf2.getInstruments().length == 1); + Patch patch = sf2.getInstruments()[0].getPatch(); + assertTrue(patch.getProgram() == 0); + assertTrue(patch.getBank() == 0); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SF2SoundbankReader/ding.sf2 b/jdk/test/javax/sound/midi/Gervill/SF2SoundbankReader/ding.sf2 new file mode 100644 index 00000000000..86327f056a4 Binary files /dev/null and b/jdk/test/javax/sound/midi/Gervill/SF2SoundbankReader/ding.sf2 differ diff --git a/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelInstrument.java b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelInstrument.java new file mode 100644 index 00000000000..f598461e4d1 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelInstrument.java @@ -0,0 +1,86 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleInstrument add(ModelInstrument) method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AddModelInstrument { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + + SimpleInstrument instrument = new SimpleInstrument(); + + ModelPerformer[] performers = new ModelPerformer[2]; + + performers[0] = new ModelPerformer(); + performers[0].setExclusiveClass(1); + performers[0].setKeyFrom(36); + performers[0].setKeyTo(48); + performers[0].setVelFrom(16); + performers[0].setVelTo(80); + performers[0].setSelfNonExclusive(true); + performers[0].setDefaultConnectionsEnabled(false); + performers[0].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[0].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + performers[1] = new ModelPerformer(); + performers[1].setExclusiveClass(0); + performers[1].setKeyFrom(12); + performers[1].setKeyTo(24); + performers[1].setVelFrom(20); + performers[1].setVelTo(90); + performers[1].setSelfNonExclusive(false); + performers[0].setDefaultConnectionsEnabled(true); + performers[1].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[1].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + SimpleInstrument subins = new SimpleInstrument(); + subins.add(performers[0]); + instrument.add(subins); + instrument.add(performers[1]); + ModelPerformer[] performers2 = instrument.getPerformers(); + for (int i = 0; i < performers2.length; i++) { + assertEquals(performers[i].getConnectionBlocks(), performers2[i].getConnectionBlocks()); + assertEquals(performers[i].getExclusiveClass(), performers2[i].getExclusiveClass()); + assertEquals(performers[i].getKeyFrom(), performers2[i].getKeyFrom()); + assertEquals(performers[i].getKeyTo(), performers2[i].getKeyTo()); + assertEquals(performers[i].getVelFrom(), performers2[i].getVelFrom()); + assertEquals(performers[i].getVelTo(), performers2[i].getVelTo()); + assertEquals(performers[i].getOscillators(), performers2[i].getOscillators()); + assertEquals(performers[i].isSelfNonExclusive(), performers2[i].isSelfNonExclusive()); + assertEquals(performers[i].isDefaultConnectionsEnabled(), performers2[i].isDefaultConnectionsEnabled()); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelInstrumentIntInt.java b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelInstrumentIntInt.java new file mode 100644 index 00000000000..682d68be4e6 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelInstrumentIntInt.java @@ -0,0 +1,91 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleInstrument add(ModelInstrument,int,int) method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AddModelInstrumentIntInt { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + + SimpleInstrument instrument = new SimpleInstrument(); + + ModelPerformer[] performers = new ModelPerformer[2]; + + performers[0] = new ModelPerformer(); + performers[0].setExclusiveClass(1); + performers[0].setKeyFrom(36); + performers[0].setKeyTo(48); + performers[0].setVelFrom(16); + performers[0].setVelTo(80); + performers[0].setSelfNonExclusive(true); + performers[0].setDefaultConnectionsEnabled(false); + performers[0].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[0].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + performers[1] = new ModelPerformer(); + performers[1].setExclusiveClass(0); + performers[1].setKeyFrom(12); + performers[1].setKeyTo(24); + performers[1].setVelFrom(20); + performers[1].setVelTo(90); + performers[1].setSelfNonExclusive(false); + performers[0].setDefaultConnectionsEnabled(true); + performers[1].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[1].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + SimpleInstrument subins = new SimpleInstrument(); + subins.add(performers[0]); + instrument.add(subins, 18, 40); + ModelPerformer[] performers2 = instrument.getPerformers(); + for (int i = 0; i < performers2.length; i++) { + assertEquals(performers[i].getConnectionBlocks(), performers2[i].getConnectionBlocks()); + assertEquals(performers[i].getExclusiveClass(), performers2[i].getExclusiveClass()); + if(performers[i].getKeyFrom() < 18) + assertEquals(18, performers2[i].getKeyFrom()); + else + assertEquals(performers[i].getKeyFrom(), performers2[i].getKeyFrom()); + if(performers[i].getKeyTo() > 40) + assertEquals(40, performers2[i].getKeyTo()); + else + assertEquals(performers[i].getKeyTo(), performers2[i].getKeyTo()); + assertEquals(performers[i].getVelFrom(), performers2[i].getVelFrom()); + assertEquals(performers[i].getVelTo(), performers2[i].getVelTo()); + assertEquals(performers[i].getOscillators(), performers2[i].getOscillators()); + assertEquals(performers[i].isSelfNonExclusive(), performers2[i].isSelfNonExclusive()); + assertEquals(performers[i].isDefaultConnectionsEnabled(), performers2[i].isDefaultConnectionsEnabled()); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelInstrumentIntIntIntInt.java b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelInstrumentIntIntIntInt.java new file mode 100644 index 00000000000..93fae266fda --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelInstrumentIntIntIntInt.java @@ -0,0 +1,97 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleInstrument add(ModelInstrument,int,int,int,int) method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AddModelInstrumentIntIntIntInt { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + + SimpleInstrument instrument = new SimpleInstrument(); + + ModelPerformer[] performers = new ModelPerformer[2]; + + performers[0] = new ModelPerformer(); + performers[0].setExclusiveClass(1); + performers[0].setKeyFrom(36); + performers[0].setKeyTo(48); + performers[0].setVelFrom(16); + performers[0].setVelTo(80); + performers[0].setSelfNonExclusive(true); + performers[0].setDefaultConnectionsEnabled(false); + performers[0].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[0].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + performers[1] = new ModelPerformer(); + performers[1].setExclusiveClass(0); + performers[1].setKeyFrom(12); + performers[1].setKeyTo(24); + performers[1].setVelFrom(20); + performers[1].setVelTo(90); + performers[1].setSelfNonExclusive(false); + performers[0].setDefaultConnectionsEnabled(true); + performers[1].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[1].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + SimpleInstrument subins = new SimpleInstrument(); + subins.add(performers[0]); + instrument.add(subins,18,40,20,75); + ModelPerformer[] performers2 = instrument.getPerformers(); + for (int i = 0; i < performers2.length; i++) { + assertEquals(performers[i].getConnectionBlocks(), performers2[i].getConnectionBlocks()); + assertEquals(performers[i].getExclusiveClass(), performers2[i].getExclusiveClass()); + if(performers[i].getKeyFrom() < 18) + assertEquals(18, performers2[i].getKeyFrom()); + else + assertEquals(performers[i].getKeyFrom(), performers2[i].getKeyFrom()); + if(performers[i].getKeyTo() > 40) + assertEquals(40, performers2[i].getKeyTo()); + else + assertEquals(performers[i].getKeyTo(), performers2[i].getKeyTo()); + if(performers[i].getVelFrom() < 20) + assertEquals(20, performers2[i].getVelFrom()); + else + assertEquals(performers[i].getVelFrom(), performers2[i].getVelFrom()); + if(performers[i].getVelTo() > 75) + assertEquals(75, performers2[i].getVelTo()); + else + assertEquals(performers[i].getVelTo(), performers2[i].getVelTo()); + assertEquals(performers[i].getOscillators(), performers2[i].getOscillators()); + assertEquals(performers[i].isSelfNonExclusive(), performers2[i].isSelfNonExclusive()); + assertEquals(performers[i].isDefaultConnectionsEnabled(), performers2[i].isDefaultConnectionsEnabled()); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelInstrumentIntIntIntIntInt.java b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelInstrumentIntIntIntIntInt.java new file mode 100644 index 00000000000..9417fdd4047 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelInstrumentIntIntIntIntInt.java @@ -0,0 +1,97 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleInstrument add(ModelInstrument,int,int,int,int,int) method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AddModelInstrumentIntIntIntIntInt { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + + SimpleInstrument instrument = new SimpleInstrument(); + + ModelPerformer[] performers = new ModelPerformer[2]; + + performers[0] = new ModelPerformer(); + performers[0].setExclusiveClass(1); + performers[0].setKeyFrom(36); + performers[0].setKeyTo(48); + performers[0].setVelFrom(16); + performers[0].setVelTo(80); + performers[0].setSelfNonExclusive(true); + performers[0].setDefaultConnectionsEnabled(false); + performers[0].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[0].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + performers[1] = new ModelPerformer(); + performers[1].setExclusiveClass(0); + performers[1].setKeyFrom(12); + performers[1].setKeyTo(24); + performers[1].setVelFrom(20); + performers[1].setVelTo(90); + performers[1].setSelfNonExclusive(false); + performers[0].setDefaultConnectionsEnabled(true); + performers[1].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[1].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + SimpleInstrument subins = new SimpleInstrument(); + subins.add(performers[0]); + instrument.add(subins,18,40,20,75,12); + ModelPerformer[] performers2 = instrument.getPerformers(); + for (int i = 0; i < performers2.length; i++) { + assertEquals(performers[i].getConnectionBlocks(), performers2[i].getConnectionBlocks()); + assertEquals(12, performers2[i].getExclusiveClass()); + if(performers[i].getKeyFrom() < 18) + assertEquals(18, performers2[i].getKeyFrom()); + else + assertEquals(performers[i].getKeyFrom(), performers2[i].getKeyFrom()); + if(performers[i].getKeyTo() > 40) + assertEquals(40, performers2[i].getKeyTo()); + else + assertEquals(performers[i].getKeyTo(), performers2[i].getKeyTo()); + if(performers[i].getVelFrom() < 20) + assertEquals(20, performers2[i].getVelFrom()); + else + assertEquals(performers[i].getVelFrom(), performers2[i].getVelFrom()); + if(performers[i].getVelTo() > 75) + assertEquals(75, performers2[i].getVelTo()); + else + assertEquals(performers[i].getVelTo(), performers2[i].getVelTo()); + assertEquals(performers[i].getOscillators(), performers2[i].getOscillators()); + assertEquals(performers[i].isSelfNonExclusive(), performers2[i].isSelfNonExclusive()); + assertEquals(performers[i].isDefaultConnectionsEnabled(), performers2[i].isDefaultConnectionsEnabled()); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformer.java b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformer.java new file mode 100644 index 00000000000..42f4645aa42 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformer.java @@ -0,0 +1,83 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleInstrument add(ModelPerformer) method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AddModelPerformer { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + + SimpleInstrument instrument = new SimpleInstrument(); + + ModelPerformer[] performers = new ModelPerformer[2]; + + performers[0] = new ModelPerformer(); + performers[0].setExclusiveClass(1); + performers[0].setKeyFrom(36); + performers[0].setKeyTo(48); + performers[0].setVelFrom(16); + performers[0].setVelTo(80); + performers[0].setSelfNonExclusive(true); + performers[0].setDefaultConnectionsEnabled(false); + performers[0].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[0].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + performers[1] = new ModelPerformer(); + performers[1].setExclusiveClass(0); + performers[1].setKeyFrom(12); + performers[1].setKeyTo(24); + performers[1].setVelFrom(20); + performers[1].setVelTo(90); + performers[1].setSelfNonExclusive(false); + performers[0].setDefaultConnectionsEnabled(true); + performers[1].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[1].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + instrument.add(performers[0]); + ModelPerformer[] performers2 = instrument.getPerformers(); + for (int i = 0; i < performers2.length; i++) { + assertEquals(performers[i].getConnectionBlocks(), performers2[i].getConnectionBlocks()); + assertEquals(performers[i].getExclusiveClass(), performers2[i].getExclusiveClass()); + assertEquals(performers[i].getKeyFrom(), performers2[i].getKeyFrom()); + assertEquals(performers[i].getKeyTo(), performers2[i].getKeyTo()); + assertEquals(performers[i].getVelFrom(), performers2[i].getVelFrom()); + assertEquals(performers[i].getVelTo(), performers2[i].getVelTo()); + assertEquals(performers[i].getOscillators(), performers2[i].getOscillators()); + assertEquals(performers[i].isSelfNonExclusive(), performers2[i].isSelfNonExclusive()); + assertEquals(performers[i].isDefaultConnectionsEnabled(), performers2[i].isDefaultConnectionsEnabled()); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerArray.java b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerArray.java new file mode 100644 index 00000000000..93d7d5dd662 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerArray.java @@ -0,0 +1,83 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleInstrument add(ModelPerformer[]) method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AddModelPerformerArray { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + + SimpleInstrument instrument = new SimpleInstrument(); + + ModelPerformer[] performers = new ModelPerformer[2]; + + performers[0] = new ModelPerformer(); + performers[0].setExclusiveClass(1); + performers[0].setKeyFrom(36); + performers[0].setKeyTo(48); + performers[0].setVelFrom(16); + performers[0].setVelTo(80); + performers[0].setSelfNonExclusive(true); + performers[0].setDefaultConnectionsEnabled(false); + performers[0].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[0].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + performers[1] = new ModelPerformer(); + performers[1].setExclusiveClass(0); + performers[1].setKeyFrom(12); + performers[1].setKeyTo(24); + performers[1].setVelFrom(20); + performers[1].setVelTo(90); + performers[1].setSelfNonExclusive(false); + performers[0].setDefaultConnectionsEnabled(true); + performers[1].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[1].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + instrument.add(performers); + ModelPerformer[] performers2 = instrument.getPerformers(); + for (int i = 0; i < performers2.length; i++) { + assertEquals(performers[i].getConnectionBlocks(), performers2[i].getConnectionBlocks()); + assertEquals(performers[i].getExclusiveClass(), performers2[i].getExclusiveClass()); + assertEquals(performers[i].getKeyFrom(), performers2[i].getKeyFrom()); + assertEquals(performers[i].getKeyTo(), performers2[i].getKeyTo()); + assertEquals(performers[i].getVelFrom(), performers2[i].getVelFrom()); + assertEquals(performers[i].getVelTo(), performers2[i].getVelTo()); + assertEquals(performers[i].getOscillators(), performers2[i].getOscillators()); + assertEquals(performers[i].isSelfNonExclusive(), performers2[i].isSelfNonExclusive()); + assertEquals(performers[i].isDefaultConnectionsEnabled(), performers2[i].isDefaultConnectionsEnabled()); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerArrayIntInt.java b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerArrayIntInt.java new file mode 100644 index 00000000000..c01c84923ea --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerArrayIntInt.java @@ -0,0 +1,89 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleInstrument add(ModelPerformer[],int,int) method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AddModelPerformerArrayIntInt { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + + SimpleInstrument instrument = new SimpleInstrument(); + + ModelPerformer[] performers = new ModelPerformer[2]; + + performers[0] = new ModelPerformer(); + performers[0].setExclusiveClass(1); + performers[0].setKeyFrom(36); + performers[0].setKeyTo(48); + performers[0].setVelFrom(16); + performers[0].setVelTo(80); + performers[0].setSelfNonExclusive(true); + performers[0].setDefaultConnectionsEnabled(false); + performers[0].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[0].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + performers[1] = new ModelPerformer(); + performers[1].setExclusiveClass(0); + performers[1].setKeyFrom(12); + performers[1].setKeyTo(24); + performers[1].setVelFrom(20); + performers[1].setVelTo(90); + performers[1].setSelfNonExclusive(false); + performers[0].setDefaultConnectionsEnabled(true); + performers[1].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[1].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + instrument.add(performers,18,40); + ModelPerformer[] performers2 = instrument.getPerformers(); + for (int i = 0; i < performers2.length; i++) { + assertEquals(performers[i].getConnectionBlocks(), performers2[i].getConnectionBlocks()); + assertEquals(performers[i].getExclusiveClass(), performers2[i].getExclusiveClass()); + if(performers[i].getKeyFrom() < 18) + assertEquals(18, performers2[i].getKeyFrom()); + else + assertEquals(performers[i].getKeyFrom(), performers2[i].getKeyFrom()); + if(performers[i].getKeyTo() > 40) + assertEquals(40, performers2[i].getKeyTo()); + else + assertEquals(performers[i].getKeyTo(), performers2[i].getKeyTo()); + assertEquals(performers[i].getVelFrom(), performers2[i].getVelFrom()); + assertEquals(performers[i].getVelTo(), performers2[i].getVelTo()); + assertEquals(performers[i].getOscillators(), performers2[i].getOscillators()); + assertEquals(performers[i].isSelfNonExclusive(), performers2[i].isSelfNonExclusive()); + assertEquals(performers[i].isDefaultConnectionsEnabled(), performers2[i].isDefaultConnectionsEnabled()); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerArrayIntIntIntInt.java b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerArrayIntIntIntInt.java new file mode 100644 index 00000000000..acbecc5ab57 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerArrayIntIntIntInt.java @@ -0,0 +1,95 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleInstrument add(ModelPerformer[],int,int,int,int) method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AddModelPerformerArrayIntIntIntInt { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + + SimpleInstrument instrument = new SimpleInstrument(); + + ModelPerformer[] performers = new ModelPerformer[2]; + + performers[0] = new ModelPerformer(); + performers[0].setExclusiveClass(1); + performers[0].setKeyFrom(36); + performers[0].setKeyTo(48); + performers[0].setVelFrom(16); + performers[0].setVelTo(80); + performers[0].setSelfNonExclusive(true); + performers[0].setDefaultConnectionsEnabled(false); + performers[0].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[0].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + performers[1] = new ModelPerformer(); + performers[1].setExclusiveClass(0); + performers[1].setKeyFrom(12); + performers[1].setKeyTo(24); + performers[1].setVelFrom(20); + performers[1].setVelTo(90); + performers[1].setSelfNonExclusive(false); + performers[0].setDefaultConnectionsEnabled(true); + performers[1].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[1].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + instrument.add(performers,18,40,20,75); + ModelPerformer[] performers2 = instrument.getPerformers(); + for (int i = 0; i < performers2.length; i++) { + assertEquals(performers[i].getConnectionBlocks(), performers2[i].getConnectionBlocks()); + assertEquals(performers[i].getExclusiveClass(), performers2[i].getExclusiveClass()); + if(performers[i].getKeyFrom() < 18) + assertEquals(18, performers2[i].getKeyFrom()); + else + assertEquals(performers[i].getKeyFrom(), performers2[i].getKeyFrom()); + if(performers[i].getKeyTo() > 40) + assertEquals(40, performers2[i].getKeyTo()); + else + assertEquals(performers[i].getKeyTo(), performers2[i].getKeyTo()); + if(performers[i].getVelFrom() < 20) + assertEquals(20, performers2[i].getVelFrom()); + else + assertEquals(performers[i].getVelFrom(), performers2[i].getVelFrom()); + if(performers[i].getVelTo() > 75) + assertEquals(75, performers2[i].getVelTo()); + else + assertEquals(performers[i].getVelTo(), performers2[i].getVelTo()); + assertEquals(performers[i].getOscillators(), performers2[i].getOscillators()); + assertEquals(performers[i].isSelfNonExclusive(), performers2[i].isSelfNonExclusive()); + assertEquals(performers[i].isDefaultConnectionsEnabled(), performers2[i].isDefaultConnectionsEnabled()); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerArrayIntIntIntIntInt.java b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerArrayIntIntIntIntInt.java new file mode 100644 index 00000000000..f74cc7b7fbb --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerArrayIntIntIntIntInt.java @@ -0,0 +1,95 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleInstrument add(ModelPerformer[],int,int,int,int,int) method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AddModelPerformerArrayIntIntIntIntInt { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + + SimpleInstrument instrument = new SimpleInstrument(); + + ModelPerformer[] performers = new ModelPerformer[2]; + + performers[0] = new ModelPerformer(); + performers[0].setExclusiveClass(1); + performers[0].setKeyFrom(36); + performers[0].setKeyTo(48); + performers[0].setVelFrom(16); + performers[0].setVelTo(80); + performers[0].setSelfNonExclusive(true); + performers[0].setDefaultConnectionsEnabled(false); + performers[0].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[0].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + performers[1] = new ModelPerformer(); + performers[1].setExclusiveClass(0); + performers[1].setKeyFrom(12); + performers[1].setKeyTo(24); + performers[1].setVelFrom(20); + performers[1].setVelTo(90); + performers[1].setSelfNonExclusive(false); + performers[0].setDefaultConnectionsEnabled(true); + performers[1].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[1].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + instrument.add(performers,18,40,20,75,12); + ModelPerformer[] performers2 = instrument.getPerformers(); + for (int i = 0; i < performers2.length; i++) { + assertEquals(performers[i].getConnectionBlocks(), performers2[i].getConnectionBlocks()); + assertEquals(12, performers2[i].getExclusiveClass()); + if(performers[i].getKeyFrom() < 18) + assertEquals(18, performers2[i].getKeyFrom()); + else + assertEquals(performers[i].getKeyFrom(), performers2[i].getKeyFrom()); + if(performers[i].getKeyTo() > 40) + assertEquals(40, performers2[i].getKeyTo()); + else + assertEquals(performers[i].getKeyTo(), performers2[i].getKeyTo()); + if(performers[i].getVelFrom() < 20) + assertEquals(20, performers2[i].getVelFrom()); + else + assertEquals(performers[i].getVelFrom(), performers2[i].getVelFrom()); + if(performers[i].getVelTo() > 75) + assertEquals(75, performers2[i].getVelTo()); + else + assertEquals(performers[i].getVelTo(), performers2[i].getVelTo()); + assertEquals(performers[i].getOscillators(), performers2[i].getOscillators()); + assertEquals(performers[i].isSelfNonExclusive(), performers2[i].isSelfNonExclusive()); + assertEquals(performers[i].isDefaultConnectionsEnabled(), performers2[i].isDefaultConnectionsEnabled()); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerIntInt.java b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerIntInt.java new file mode 100644 index 00000000000..6ba9a611782 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerIntInt.java @@ -0,0 +1,89 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleInstrument add(ModelPerformer,int,int) method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AddModelPerformerIntInt { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + + SimpleInstrument instrument = new SimpleInstrument(); + + ModelPerformer[] performers = new ModelPerformer[2]; + + performers[0] = new ModelPerformer(); + performers[0].setExclusiveClass(1); + performers[0].setKeyFrom(36); + performers[0].setKeyTo(48); + performers[0].setVelFrom(16); + performers[0].setVelTo(80); + performers[0].setSelfNonExclusive(true); + performers[0].setDefaultConnectionsEnabled(false); + performers[0].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[0].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + performers[1] = new ModelPerformer(); + performers[1].setExclusiveClass(0); + performers[1].setKeyFrom(12); + performers[1].setKeyTo(24); + performers[1].setVelFrom(20); + performers[1].setVelTo(90); + performers[1].setSelfNonExclusive(false); + performers[0].setDefaultConnectionsEnabled(true); + performers[1].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[1].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + instrument.add(performers[0],18,40); + ModelPerformer[] performers2 = instrument.getPerformers(); + for (int i = 0; i < performers2.length; i++) { + assertEquals(performers[i].getConnectionBlocks(), performers2[i].getConnectionBlocks()); + assertEquals(performers[i].getExclusiveClass(), performers2[i].getExclusiveClass()); + if(performers[i].getKeyFrom() < 18) + assertEquals(18, performers2[i].getKeyFrom()); + else + assertEquals(performers[i].getKeyFrom(), performers2[i].getKeyFrom()); + if(performers[i].getKeyTo() > 40) + assertEquals(40, performers2[i].getKeyTo()); + else + assertEquals(performers[i].getKeyTo(), performers2[i].getKeyTo()); + assertEquals(performers[i].getVelFrom(), performers2[i].getVelFrom()); + assertEquals(performers[i].getVelTo(), performers2[i].getVelTo()); + assertEquals(performers[i].getOscillators(), performers2[i].getOscillators()); + assertEquals(performers[i].isSelfNonExclusive(), performers2[i].isSelfNonExclusive()); + assertEquals(performers[i].isDefaultConnectionsEnabled(), performers2[i].isDefaultConnectionsEnabled()); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerIntIntIntInt.java b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerIntIntIntInt.java new file mode 100644 index 00000000000..a8f35587319 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerIntIntIntInt.java @@ -0,0 +1,95 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleInstrument add(ModelPerformer,int,int,int,int) method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AddModelPerformerIntIntIntInt { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + + SimpleInstrument instrument = new SimpleInstrument(); + + ModelPerformer[] performers = new ModelPerformer[2]; + + performers[0] = new ModelPerformer(); + performers[0].setExclusiveClass(1); + performers[0].setKeyFrom(36); + performers[0].setKeyTo(48); + performers[0].setVelFrom(16); + performers[0].setVelTo(80); + performers[0].setSelfNonExclusive(true); + performers[0].setDefaultConnectionsEnabled(false); + performers[0].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[0].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + performers[1] = new ModelPerformer(); + performers[1].setExclusiveClass(0); + performers[1].setKeyFrom(12); + performers[1].setKeyTo(24); + performers[1].setVelFrom(20); + performers[1].setVelTo(90); + performers[1].setSelfNonExclusive(false); + performers[0].setDefaultConnectionsEnabled(true); + performers[1].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[1].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + instrument.add(performers[0],18,40,20,75); + ModelPerformer[] performers2 = instrument.getPerformers(); + for (int i = 0; i < performers2.length; i++) { + assertEquals(performers[i].getConnectionBlocks(), performers2[i].getConnectionBlocks()); + assertEquals(performers[i].getExclusiveClass(), performers2[i].getExclusiveClass()); + if(performers[i].getKeyFrom() < 18) + assertEquals(18, performers2[i].getKeyFrom()); + else + assertEquals(performers[i].getKeyFrom(), performers2[i].getKeyFrom()); + if(performers[i].getKeyTo() > 40) + assertEquals(40, performers2[i].getKeyTo()); + else + assertEquals(performers[i].getKeyTo(), performers2[i].getKeyTo()); + if(performers[i].getVelFrom() < 20) + assertEquals(20, performers2[i].getVelFrom()); + else + assertEquals(performers[i].getVelFrom(), performers2[i].getVelFrom()); + if(performers[i].getVelTo() > 75) + assertEquals(75, performers2[i].getVelTo()); + else + assertEquals(performers[i].getVelTo(), performers2[i].getVelTo()); + assertEquals(performers[i].getOscillators(), performers2[i].getOscillators()); + assertEquals(performers[i].isSelfNonExclusive(), performers2[i].isSelfNonExclusive()); + assertEquals(performers[i].isDefaultConnectionsEnabled(), performers2[i].isDefaultConnectionsEnabled()); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerIntIntIntIntInt.java b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerIntIntIntIntInt.java new file mode 100644 index 00000000000..2651a382f7f --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/AddModelPerformerIntIntIntIntInt.java @@ -0,0 +1,95 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleInstrument add(ModelPerformer,int,int,int,int,int) method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AddModelPerformerIntIntIntIntInt { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + + SimpleInstrument instrument = new SimpleInstrument(); + + ModelPerformer[] performers = new ModelPerformer[2]; + + performers[0] = new ModelPerformer(); + performers[0].setExclusiveClass(1); + performers[0].setKeyFrom(36); + performers[0].setKeyTo(48); + performers[0].setVelFrom(16); + performers[0].setVelTo(80); + performers[0].setSelfNonExclusive(true); + performers[0].setDefaultConnectionsEnabled(false); + performers[0].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[0].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + performers[1] = new ModelPerformer(); + performers[1].setExclusiveClass(0); + performers[1].setKeyFrom(12); + performers[1].setKeyTo(24); + performers[1].setVelFrom(20); + performers[1].setVelTo(90); + performers[1].setSelfNonExclusive(false); + performers[0].setDefaultConnectionsEnabled(true); + performers[1].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[1].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + instrument.add(performers[0],18,40,20,75,12); + ModelPerformer[] performers2 = instrument.getPerformers(); + for (int i = 0; i < performers2.length; i++) { + assertEquals(performers[i].getConnectionBlocks(), performers2[i].getConnectionBlocks()); + assertEquals(12, performers2[i].getExclusiveClass()); + if(performers[i].getKeyFrom() < 18) + assertEquals(18, performers2[i].getKeyFrom()); + else + assertEquals(performers[i].getKeyFrom(), performers2[i].getKeyFrom()); + if(performers[i].getKeyTo() > 40) + assertEquals(40, performers2[i].getKeyTo()); + else + assertEquals(performers[i].getKeyTo(), performers2[i].getKeyTo()); + if(performers[i].getVelFrom() < 20) + assertEquals(20, performers2[i].getVelFrom()); + else + assertEquals(performers[i].getVelFrom(), performers2[i].getVelFrom()); + if(performers[i].getVelTo() > 75) + assertEquals(75, performers2[i].getVelTo()); + else + assertEquals(performers[i].getVelTo(), performers2[i].getVelTo()); + assertEquals(performers[i].getOscillators(), performers2[i].getOscillators()); + assertEquals(performers[i].isSelfNonExclusive(), performers2[i].isSelfNonExclusive()); + assertEquals(performers[i].isDefaultConnectionsEnabled(), performers2[i].isDefaultConnectionsEnabled()); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/Clear.java b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/Clear.java new file mode 100644 index 00000000000..30210155764 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/Clear.java @@ -0,0 +1,73 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleInstrument clear method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Clear { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + + SimpleInstrument instrument = new SimpleInstrument(); + + ModelPerformer[] performers = new ModelPerformer[2]; + + performers[0] = new ModelPerformer(); + performers[0].setExclusiveClass(1); + performers[0].setKeyFrom(36); + performers[0].setKeyTo(48); + performers[0].setVelFrom(16); + performers[0].setVelTo(80); + performers[0].setSelfNonExclusive(true); + performers[0].setDefaultConnectionsEnabled(false); + performers[0].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[0].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + performers[1] = new ModelPerformer(); + performers[1].setExclusiveClass(0); + performers[1].setKeyFrom(12); + performers[1].setKeyTo(24); + performers[1].setVelFrom(20); + performers[1].setVelTo(90); + performers[1].setSelfNonExclusive(false); + performers[0].setDefaultConnectionsEnabled(true); + performers[1].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[1].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + instrument.add(performers[0]); + instrument.clear(); + assertEquals(instrument.getPerformers().length, 0); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/SetName.java b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/SetName.java new file mode 100644 index 00000000000..721ec22543f --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/SetName.java @@ -0,0 +1,72 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleInstrument setName(String) method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetName { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + + SimpleInstrument instrument = new SimpleInstrument(); + + ModelPerformer[] performers = new ModelPerformer[2]; + + performers[0] = new ModelPerformer(); + performers[0].setExclusiveClass(1); + performers[0].setKeyFrom(36); + performers[0].setKeyTo(48); + performers[0].setVelFrom(16); + performers[0].setVelTo(80); + performers[0].setSelfNonExclusive(true); + performers[0].setDefaultConnectionsEnabled(false); + performers[0].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[0].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + performers[1] = new ModelPerformer(); + performers[1].setExclusiveClass(0); + performers[1].setKeyFrom(12); + performers[1].setKeyTo(24); + performers[1].setVelFrom(20); + performers[1].setVelTo(90); + performers[1].setSelfNonExclusive(false); + performers[0].setDefaultConnectionsEnabled(true); + performers[1].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[1].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + instrument.setName("hello"); + assertEquals(instrument.getName(), "hello"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/SetPatch.java b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/SetPatch.java new file mode 100644 index 00000000000..6ddf1406cba --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SimpleInstrument/SetPatch.java @@ -0,0 +1,75 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleInstrument setPatch(Patch) method */ + +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetPatch { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + + SimpleInstrument instrument = new SimpleInstrument(); + + ModelPerformer[] performers = new ModelPerformer[2]; + + performers[0] = new ModelPerformer(); + performers[0].setExclusiveClass(1); + performers[0].setKeyFrom(36); + performers[0].setKeyTo(48); + performers[0].setVelFrom(16); + performers[0].setVelTo(80); + performers[0].setSelfNonExclusive(true); + performers[0].setDefaultConnectionsEnabled(false); + performers[0].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[0].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + performers[1] = new ModelPerformer(); + performers[1].setExclusiveClass(0); + performers[1].setKeyFrom(12); + performers[1].setKeyTo(24); + performers[1].setVelFrom(20); + performers[1].setVelTo(90); + performers[1].setSelfNonExclusive(false); + performers[0].setDefaultConnectionsEnabled(true); + performers[1].getConnectionBlocks().add(new ModelConnectionBlock()); + performers[1].getOscillators().add(new ModelByteBufferWavetable(new ModelByteBuffer(new byte[] {1,2,3}))); + + Patch patch = new Patch(0,36); + instrument.setPatch(patch); + assertEquals(instrument.getPatch().getProgram(), patch.getProgram()); + assertEquals(instrument.getPatch().getBank(), patch.getBank()); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/AddInstrument.java b/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/AddInstrument.java new file mode 100644 index 00000000000..e980d931445 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/AddInstrument.java @@ -0,0 +1,51 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleSoundbank addInstrument method */ + +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AddInstrument { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + SimpleSoundbank soundbank = new SimpleSoundbank(); + SimpleInstrument ins = new SimpleInstrument(); + ins.setPatch(new Patch(3,7)); + soundbank.addInstrument(ins); + assertEquals(soundbank.getInstruments().length, 1); + assertEquals(soundbank.getInstruments()[0], ins); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/AddResource.java b/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/AddResource.java new file mode 100644 index 00000000000..5af64ff20ec --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/AddResource.java @@ -0,0 +1,52 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleSoundbank addResource method */ + +import javax.sound.midi.SoundbankResource; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AddResource { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + SimpleSoundbank soundbank = new SimpleSoundbank(); + SoundbankResource res = new SoundbankResource(soundbank, "test", null) { + public Object getData() { + return null; + }}; + soundbank.addResource(res); + assertEquals(soundbank.getResources().length, 1); + assertEquals(soundbank.getResources()[0], res); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/GetInstrument.java b/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/GetInstrument.java new file mode 100644 index 00000000000..2aeda8ccad9 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/GetInstrument.java @@ -0,0 +1,50 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleSoundbank getInstrument method */ + +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetInstrument { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + SimpleSoundbank soundbank = new SimpleSoundbank(); + SimpleInstrument ins = new SimpleInstrument(); + ins.setPatch(new Patch(3,7)); + soundbank.addInstrument(ins); + assertEquals(soundbank.getInstrument(new Patch(3,7)), ins); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/RemoveInstrument.java b/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/RemoveInstrument.java new file mode 100644 index 00000000000..b90a065b5cf --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/RemoveInstrument.java @@ -0,0 +1,58 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleSoundbank removeInstrument method */ + +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class RemoveInstrument { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean a) throws Exception + { + if(!a) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + SimpleSoundbank soundbank = new SimpleSoundbank(); + SimpleInstrument ins = new SimpleInstrument(); + ins.setPatch(new Patch(3,7)); + soundbank.addInstrument(ins); + soundbank.removeInstrument(ins); + assertEquals(soundbank.getInstruments().length, 0); + assertTrue(soundbank.getInstrument(new Patch(3,7)) == null); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/SetDescription.java b/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/SetDescription.java new file mode 100644 index 00000000000..0f20ea11010 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/SetDescription.java @@ -0,0 +1,47 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleSoundbank setDescription method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetDescription { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + SimpleSoundbank soundbank = new SimpleSoundbank(); + soundbank.setDescription("hello"); + assertEquals(soundbank.getDescription(), "hello"); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/SetName.java b/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/SetName.java new file mode 100644 index 00000000000..712749e12f3 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/SetName.java @@ -0,0 +1,47 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleSoundbank setName method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetName { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + SimpleSoundbank soundbank = new SimpleSoundbank(); + soundbank.setName("hello"); + assertEquals(soundbank.getName(), "hello"); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/SetVendor.java b/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/SetVendor.java new file mode 100644 index 00000000000..78cb57d26ce --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/SetVendor.java @@ -0,0 +1,47 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleSoundbank setVendor method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetVendor { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + SimpleSoundbank soundbank = new SimpleSoundbank(); + soundbank.setVendor("hello"); + assertEquals(soundbank.getVendor(), "hello"); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/SetVersion.java b/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/SetVersion.java new file mode 100644 index 00000000000..24be16fbf4f --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SimpleSoundbank/SetVersion.java @@ -0,0 +1,47 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SimpleSoundbank setVersion method */ + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SetVersion { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + public static void main(String[] args) throws Exception { + SimpleSoundbank soundbank = new SimpleSoundbank(); + soundbank.setVersion("hello"); + assertEquals(soundbank.getVersion(), "hello"); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftAudioBuffer/Array.java b/jdk/test/javax/sound/midi/Gervill/SoftAudioBuffer/Array.java new file mode 100644 index 00000000000..c400d645d95 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftAudioBuffer/Array.java @@ -0,0 +1,54 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftAudioBuffer array method */ + +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Array { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioFormat frm = new AudioFormat(8000, 8, 1, true, false); + SoftAudioBuffer buff = new SoftAudioBuffer(377, frm); + float[] ar = buff.array(); + assertEquals(ar.length, 377); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftAudioBuffer/Clear.java b/jdk/test/javax/sound/midi/Gervill/SoftAudioBuffer/Clear.java new file mode 100644 index 00000000000..c26518487e0 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftAudioBuffer/Clear.java @@ -0,0 +1,56 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftAudioBuffer clear method */ + +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Clear { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioFormat frm = new AudioFormat(8000, 8, 1, true, false); + SoftAudioBuffer buff = new SoftAudioBuffer(377, frm); + buff.array(); + assertTrue(!buff.isSilent()); + buff.clear(); + assertTrue(buff.isSilent()); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftAudioBuffer/Get.java b/jdk/test/javax/sound/midi/Gervill/SoftAudioBuffer/Get.java new file mode 100644 index 00000000000..4658f7d12a0 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftAudioBuffer/Get.java @@ -0,0 +1,68 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftAudioBuffer get method */ + +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Get { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioFormat frm = new AudioFormat(8000, 16, 1, true, false); + SoftAudioBuffer buff = new SoftAudioBuffer(100, frm); + float[] ar = buff.array(); + for (int i = 0; i < ar.length; i++) { + if(i % 2 == 0) + ar[i] = 1; + if(i % 2 == 0) + ar[i] = -0.5f; + } + + byte[] bbuff = new byte[ar.length*frm.getFrameSize()]; + buff.get(bbuff, 0); + float[] ar2 = new float[ar.length]; + AudioFloatConverter.getConverter(frm).toFloatArray(bbuff, ar2); + + for (int i = 0; i < ar2.length; i++) + if(Math.abs(ar[i] - ar2[i]) > 0.001) + throw new Exception("conversion failure!"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftAudioBuffer/NewSoftAudioBuffer.java b/jdk/test/javax/sound/midi/Gervill/SoftAudioBuffer/NewSoftAudioBuffer.java new file mode 100644 index 00000000000..191c4218076 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftAudioBuffer/NewSoftAudioBuffer.java @@ -0,0 +1,55 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftAudioBuffer constructor */ + +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewSoftAudioBuffer { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioFormat frm = new AudioFormat(8000, 8, 1, true, false); + SoftAudioBuffer buff = new SoftAudioBuffer(377, frm); + assertEquals(buff.getSize(), 377); + assertEquals(buff.getFormat(), frm); + assertTrue(buff.isSilent()); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftAudioSynthesizer/DummySourceDataLine.java b/jdk/test/javax/sound/midi/Gervill/SoftAudioSynthesizer/DummySourceDataLine.java new file mode 100644 index 00000000000..c9ea327c53b --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftAudioSynthesizer/DummySourceDataLine.java @@ -0,0 +1,232 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +import java.util.ArrayList; + +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.Control; +import javax.sound.sampled.DataLine; +import javax.sound.sampled.LineListener; +import javax.sound.sampled.LineUnavailableException; +import javax.sound.sampled.SourceDataLine; +import javax.sound.sampled.AudioFormat.Encoding; +import javax.sound.sampled.Control.Type; + +import com.sun.media.sound.AudioFloatConverter; + +/** + * This is a SourceDataLine simulator used for testing SoftSynthesizer + * without using real SourceDataLine / Audio Device. + * + * @author Karl Helgason + */ + +public class DummySourceDataLine implements SourceDataLine { + + private int bufferSize = -1; + + private AudioFormat format = new AudioFormat(44100.0f, 16, 2, true, false); + + private DataLine.Info sourceLineInfo; + + private boolean active = false; + + private long framepos = 0; + + private boolean opened = false; + + private int framesize = 0; + + public DummySourceDataLine() + { + ArrayList formats = new ArrayList(); + for (int channels = 1; channels <= 2; channels++) { + formats.add(new AudioFormat(Encoding.PCM_SIGNED, + AudioSystem.NOT_SPECIFIED, 8, channels, channels, + AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(Encoding.PCM_UNSIGNED, + AudioSystem.NOT_SPECIFIED, 8, channels, channels, + AudioSystem.NOT_SPECIFIED, false)); + for (int bits = 16; bits < 32; bits += 8) { + formats.add(new AudioFormat(Encoding.PCM_SIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(Encoding.PCM_UNSIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(Encoding.PCM_SIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, true)); + formats.add(new AudioFormat(Encoding.PCM_UNSIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, true)); + } + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 32, channels, channels * 4, + AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 32, channels, channels * 4, + AudioSystem.NOT_SPECIFIED, true)); + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 64, channels, channels * 8, + AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 64, channels, channels * 8, + AudioSystem.NOT_SPECIFIED, true)); + } + AudioFormat[] formats_array = formats.toArray(new AudioFormat[formats + .size()]); + sourceLineInfo = new DataLine.Info(SourceDataLine.class, + formats_array, AudioSystem.NOT_SPECIFIED, + AudioSystem.NOT_SPECIFIED); + + } + + public void open() throws LineUnavailableException { + open(format); + } + + public void open(AudioFormat format) throws LineUnavailableException { + if (bufferSize == -1) + bufferSize = ((int) (format.getFrameRate() / 2)) + * format.getFrameSize(); + open(format, bufferSize); + } + + public void open(AudioFormat format, int bufferSize) + throws LineUnavailableException { + this.format = format; + this.bufferSize = bufferSize; + this.framesize = format.getFrameSize(); + opened = true; + } + + public boolean isOpen() { + return opened; + } + + public int write(byte[] b, int off, int len) { + if (!isOpen()) + return 0; + if (len % framesize != 0) + throw new IllegalArgumentException( + "Number of bytes does not represent an integral number of sample frames."); + + + int flen = len / framesize; + framepos += flen; + + long time = (long) (flen * (1000.0 / (double) getFormat() + .getSampleRate())); + try { + Thread.sleep(time); + } catch (InterruptedException e) { + e.printStackTrace(); + return 0; + } + + return len; + } + + public int available() { + return 0; + } + + public void drain() { + } + + public void flush() { + } + + public int getBufferSize() { + return bufferSize; + } + + public AudioFormat getFormat() { + return format; + } + + public int getFramePosition() { + return (int) getLongFramePosition(); + } + + public float getLevel() { + return AudioSystem.NOT_SPECIFIED; + } + + public long getLongFramePosition() { + return framepos; + } + + public long getMicrosecondPosition() { + return (long) (getLongFramePosition() * (1000000.0 / (double) getFormat() + .getSampleRate())); + } + + public boolean isActive() { + return active; + } + + public boolean isRunning() { + return active; + } + + public void start() { + active = true; + } + + public void stop() { + active = false; + } + + public void close() { + stop(); + } + + public Control getControl(Type control) { + throw new IllegalArgumentException("Unsupported control type : " + + control); + } + + public Control[] getControls() { + return new Control[0]; + } + + public javax.sound.sampled.Line.Info getLineInfo() { + return sourceLineInfo; + } + + public boolean isControlSupported(Type control) { + return false; + } + + public void addLineListener(LineListener listener) { + } + + public void removeLineListener(LineListener listener) { + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftAudioSynthesizer/GetFormat.java b/jdk/test/javax/sound/midi/Gervill/SoftAudioSynthesizer/GetFormat.java new file mode 100644 index 00000000000..6dc24e9daf2 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftAudioSynthesizer/GetFormat.java @@ -0,0 +1,61 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftAudioSynthesizer getFormat method */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetFormat { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + AudioFormat defformat = synth.getFormat(); + assertTrue(defformat != null); + synth.openStream(null, null); + assertTrue(synth.getFormat().toString().equals(defformat.toString())); + synth.close(); + AudioFormat custformat = new AudioFormat(8000, 16, 1, true, false); + synth.openStream(custformat, null); + assertTrue(synth.getFormat().toString().equals(custformat.toString())); + synth.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftAudioSynthesizer/GetPropertyInfo.java b/jdk/test/javax/sound/midi/Gervill/SoftAudioSynthesizer/GetPropertyInfo.java new file mode 100644 index 00000000000..1aae1eb0767 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftAudioSynthesizer/GetPropertyInfo.java @@ -0,0 +1,53 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftAudioSynthesizer getPropertyInfo method */ + +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetPropertyInfo { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + AudioSynthesizerPropertyInfo[] info = synth.getPropertyInfo(null); + assertTrue(info != null); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftAudioSynthesizer/Open.java b/jdk/test/javax/sound/midi/Gervill/SoftAudioSynthesizer/Open.java new file mode 100644 index 00000000000..0df5862cc11 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftAudioSynthesizer/Open.java @@ -0,0 +1,54 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftAudioSynthesizer open method */ + +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Open { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + SourceDataLine line = new DummySourceDataLine(); //AudioSystem.getSourceDataLine(new AudioFormat(44100, 16, 2, true, false)); + synth.open(line, null); + synth.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftAudioSynthesizer/OpenStream.java b/jdk/test/javax/sound/midi/Gervill/SoftAudioSynthesizer/OpenStream.java new file mode 100644 index 00000000000..937f74afdb4 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftAudioSynthesizer/OpenStream.java @@ -0,0 +1,54 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftAudioSynthesizer openStream method */ + +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class OpenStream { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + assertTrue(synth.isOpen()); + synth.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftChannel/AllNotesOff.java b/jdk/test/javax/sound/midi/Gervill/SoftChannel/AllNotesOff.java new file mode 100644 index 00000000000..05813fe8ecb --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/AllNotesOff.java @@ -0,0 +1,64 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel allNotesOff method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AllNotesOff { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + channel.noteOn(60, 64); + soft.read(1); + VoiceStatus[] v = soft.synth.getVoiceStatus(); + assertEquals(v[0].note, 60); + assertEquals(v[0].active, true); + channel.allNotesOff(); + soft.read(1); + v = soft.synth.getVoiceStatus(); + assertEquals(v[0].active, false); + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftChannel/AllSoundOff.java b/jdk/test/javax/sound/midi/Gervill/SoftChannel/AllSoundOff.java new file mode 100644 index 00000000000..aa6fcaab5b4 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/AllSoundOff.java @@ -0,0 +1,64 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel allSoundOff method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class AllSoundOff { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + channel.noteOn(60, 64); + soft.read(1); + VoiceStatus[] v = soft.synth.getVoiceStatus(); + assertEquals(v[0].note, 60); + assertEquals(v[0].active, true); + channel.allSoundOff(); + soft.read(1); + v = soft.synth.getVoiceStatus(); + assertEquals(v[0].active, false); + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftChannel/ChannelPressure.java b/jdk/test/javax/sound/midi/Gervill/SoftChannel/ChannelPressure.java new file mode 100644 index 00000000000..5e8f00c4006 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/ChannelPressure.java @@ -0,0 +1,59 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel channelPressure method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ChannelPressure { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + channel.setChannelPressure(10); + assertEquals(channel.getChannelPressure(), 10); + channel.setChannelPressure(90); + assertEquals(channel.getChannelPressure(), 90); + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftChannel/Controller.java b/jdk/test/javax/sound/midi/Gervill/SoftChannel/Controller.java new file mode 100644 index 00000000000..dff142381f8 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/Controller.java @@ -0,0 +1,62 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel controller method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Controller { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + for (int i = 0; i < 128; i++) { + if(i == 0 || i == 32) continue; + channel.controlChange(i, 10); + assertEquals(channel.getController(i), 10); + channel.controlChange(i, 100); + assertEquals(channel.getController(i), 100); + } + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftChannel/LocalControl.java b/jdk/test/javax/sound/midi/Gervill/SoftChannel/LocalControl.java new file mode 100644 index 00000000000..074eb56800e --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/LocalControl.java @@ -0,0 +1,60 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel localControl method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class LocalControl { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + // Local control not supported + // because this is a software synthesizer + // localControl() should always return false + assertEquals(channel.localControl(true), false); + assertEquals(channel.localControl(false), false); + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftChannel/Mono.java b/jdk/test/javax/sound/midi/Gervill/SoftChannel/Mono.java new file mode 100644 index 00000000000..148a8652680 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/Mono.java @@ -0,0 +1,59 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel mono method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Mono { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + channel.setMono(true); + assertEquals(channel.getMono(), true); + channel.setMono(false); + assertEquals(channel.getMono(), false); + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftChannel/Mute.java b/jdk/test/javax/sound/midi/Gervill/SoftChannel/Mute.java new file mode 100644 index 00000000000..d66824ce7c5 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/Mute.java @@ -0,0 +1,59 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel mute method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Mute { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + channel.setMute(true); + assertEquals(channel.getMute(), true); + channel.setMute(false); + assertEquals(channel.getMute(), false); + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftChannel/NoteOff.java b/jdk/test/javax/sound/midi/Gervill/SoftChannel/NoteOff.java new file mode 100644 index 00000000000..839b568f14f --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/NoteOff.java @@ -0,0 +1,64 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel noteOff method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NoteOff { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + channel.noteOn(60, 64); + soft.read(1); + VoiceStatus[] v = soft.synth.getVoiceStatus(); + assertEquals(v[0].note, 60); + assertEquals(v[0].active, true); + channel.noteOff(60); + soft.read(1); + v = soft.synth.getVoiceStatus();; + assertEquals(v[0].active, false); + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftChannel/NoteOff2.java b/jdk/test/javax/sound/midi/Gervill/SoftChannel/NoteOff2.java new file mode 100644 index 00000000000..01f1cd15336 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/NoteOff2.java @@ -0,0 +1,64 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel noteOff method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NoteOff2 { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + channel.noteOn(60, 64); + soft.read(1); + VoiceStatus[] v = soft.synth.getVoiceStatus(); + assertEquals(v[0].note, 60); + assertEquals(v[0].active, true); + channel.noteOff(60); + soft.read(1); + v = soft.synth.getVoiceStatus();; + assertEquals(v[0].active, false); + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftChannel/NoteOn.java b/jdk/test/javax/sound/midi/Gervill/SoftChannel/NoteOn.java new file mode 100644 index 00000000000..810236e4523 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/NoteOn.java @@ -0,0 +1,64 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel noteOn method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NoteOn { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + channel.noteOn(60, 64); + soft.read(1); + VoiceStatus[] v = soft.synth.getVoiceStatus(); + assertEquals(v[0].note, 60); + assertEquals(v[0].active, true); + channel.noteOn(60, 0); + soft.read(1); + v = soft.synth.getVoiceStatus(); + assertEquals(v[0].active, false); + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftChannel/Omni.java b/jdk/test/javax/sound/midi/Gervill/SoftChannel/Omni.java new file mode 100644 index 00000000000..2801aa72786 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/Omni.java @@ -0,0 +1,61 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel omni method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Omni { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + channel.setOmni(true); + // Poly or Omni not supported by GM2 + // getOmni() should always return false + assertEquals(channel.getOmni(), false); + channel.setOmni(false); + assertEquals(channel.getOmni(), false); + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftChannel/PitchBend.java b/jdk/test/javax/sound/midi/Gervill/SoftChannel/PitchBend.java new file mode 100644 index 00000000000..64ab6cbe7e0 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/PitchBend.java @@ -0,0 +1,59 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel pitchBend method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class PitchBend { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + channel.setPitchBend(10); + assertEquals(channel.getPitchBend(), 10); + channel.setPitchBend(9000); + assertEquals(channel.getPitchBend(), 9000); + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftChannel/PolyPressure.java b/jdk/test/javax/sound/midi/Gervill/SoftChannel/PolyPressure.java new file mode 100644 index 00000000000..f69aab00876 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/PolyPressure.java @@ -0,0 +1,61 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel polyPressure method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class PolyPressure { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + for (int i = 0; i < 128; i++) { + channel.setPolyPressure(i, 10); + assertEquals(channel.getPolyPressure(i),10); + channel.setPolyPressure(i, 100); + assertEquals(channel.getPolyPressure(i),100); + } + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftChannel/ProgramChange.java b/jdk/test/javax/sound/midi/Gervill/SoftChannel/ProgramChange.java new file mode 100644 index 00000000000..c202e51dd68 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/ProgramChange.java @@ -0,0 +1,59 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel programChange method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ProgramChange { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + channel.programChange(36); + assertEquals(channel.getProgram(), 36); + channel.programChange(48); + assertEquals(channel.getProgram(), 48); + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftChannel/ResetAllControllers.java b/jdk/test/javax/sound/midi/Gervill/SoftChannel/ResetAllControllers.java new file mode 100644 index 00000000000..6fcd7743d8b --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/ResetAllControllers.java @@ -0,0 +1,132 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel resetAllControllers method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ResetAllControllers { + + public static boolean[] dontResetControls = new boolean[128]; + static { + for (int i = 0; i < dontResetControls.length; i++) + dontResetControls[i] = false; + + dontResetControls[0] = true; // Bank Select (MSB) + dontResetControls[32] = true; // Bank Select (LSB) + dontResetControls[7] = true; // Channel Volume (MSB) + dontResetControls[8] = true; // Balance (MSB) + dontResetControls[10] = true; // Pan (MSB) + dontResetControls[11] = true; // Expression (MSB) + dontResetControls[91] = true; // Effects 1 Depth (default: Reverb Send) + dontResetControls[92] = true; // Effects 2 Depth (default: Tremolo Depth) + dontResetControls[93] = true; // Effects 3 Depth (default: Chorus Send) + dontResetControls[94] = true; // Effects 4 Depth (default: Celeste [Detune] Depth) + dontResetControls[95] = true; // Effects 5 Depth (default: Phaser Depth) + dontResetControls[70] = true; // Sound Controller 1 (default: Sound Variation) + dontResetControls[71] = true; // Sound Controller 2 (default: Timbre / Harmonic Quality) + dontResetControls[72] = true; // Sound Controller 3 (default: Release Time) + dontResetControls[73] = true; // Sound Controller 4 (default: Attack Time) + dontResetControls[74] = true; // Sound Controller 5 (default: Brightness) + dontResetControls[75] = true; // Sound Controller 6 (GM2 default: Decay Time) + dontResetControls[76] = true; // Sound Controller 7 (GM2 default: Vibrato Rate) + dontResetControls[77] = true; // Sound Controller 8 (GM2 default: Vibrato Depth) + dontResetControls[78] = true; // Sound Controller 9 (GM2 default: Vibrato Delay) + dontResetControls[79] = true; // Sound Controller 10 (GM2 default: Undefined) + dontResetControls[120] = true; // All Sound Off + dontResetControls[121] = true; // Reset All Controllers + dontResetControls[122] = true; // Local Control On/Off + dontResetControls[123] = true; // All Notes Off + dontResetControls[124] = true; // Omni Mode Off + dontResetControls[125] = true; // Omni Mode On + dontResetControls[126] = true; // Poly Mode Off + dontResetControls[127] = true; // Poly Mode On + + dontResetControls[6] = true; // Data Entry (MSB) + dontResetControls[38] = true; // Data Entry (LSB) + dontResetControls[96] = true; // Data Increment + dontResetControls[97] = true; // Data Decrement + dontResetControls[98] = true; // Non-Registered Parameter Number (LSB) + dontResetControls[99] = true; // Non-Registered Parameter Number(MSB) + dontResetControls[100] = true; // RPN = Null + dontResetControls[101] = true; // RPN = Null + } + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + // First let all controls contain non-default values + for (int i = 0; i < 128; i++) + channel.setPolyPressure(i, 10); + channel.setChannelPressure(10); + channel.setPitchBend(2192); + for (int i = 0; i < 120; i++) + channel.controlChange(i, 1); + channel.resetAllControllers(); + + // Now check if resetAllControllers did what it was suppose to do + + for (int i = 0; i < 128; i++) + assertEquals(channel.getPolyPressure(i), 0); + assertEquals(channel.getChannelPressure(), 0); + assertEquals(channel.getPitchBend(),8192); + for (int i = 0; i < 120; i++) + if(!dontResetControls[i]) + assertEquals(channel.getController(i), 0); + assertEquals(channel.getController(71), 64); // Filter Resonance + assertEquals(channel.getController(72), 64); // Release Time + assertEquals(channel.getController(73), 64); // Attack Time + assertEquals(channel.getController(74), 64); // Brightness + assertEquals(channel.getController(75), 64); // Decay Time + assertEquals(channel.getController(76), 64); // Vibrato Rate + assertEquals(channel.getController(77), 64); // Vibrato Depth + assertEquals(channel.getController(78), 64); // Vibrato Delay + assertEquals(channel.getController(8), 64); // Balance + assertEquals(channel.getController(11), 127); // Expression + assertEquals(channel.getController(98), 127); // NRPN Null + assertEquals(channel.getController(99), 127); // NRPN Null + assertEquals(channel.getController(100), 127); // RPN = Null + assertEquals(channel.getController(101), 127); // RPN = Null + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftChannel/SoftTestUtils.java b/jdk/test/javax/sound/midi/Gervill/SoftChannel/SoftTestUtils.java new file mode 100644 index 00000000000..f29983983d2 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/SoftTestUtils.java @@ -0,0 +1,111 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +import java.io.IOException; + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SoftTestUtils { + + public AudioSynthesizer synth = new SoftSynthesizer(); + public AudioInputStream stream; + public byte[] tmpbuffer = new byte[1024]; + + public static SF2Soundbank createTestSoundBank() + { + SF2Soundbank sf2 = new SF2Soundbank(); + AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + float[] data = new float[44100+1000]; + float fr = 440/format.getSampleRate(); + for (int i = 0; i < data.length; i++) + data[i] = (float)Math.sin(i*fr*2*Math.PI); + byte[] bdata = new byte[data.length*format.getFrameSize()]; + AudioFloatConverter.getConverter(format).toByteArray(data, bdata); + SF2Sample sample = new SF2Sample(sf2); + sample.setName("Test Sample"); + sample.setData(bdata); + sample.setStartLoop(500); + sample.setEndLoop(data.length - 500); + sample.setSampleRate((long) format.getSampleRate()); + sample.setOriginalPitch(69); + sf2.addResource(sample); + SF2Layer layer = new SF2Layer(sf2); + layer.setName("Test Layer"); + sf2.addResource(layer); + SF2LayerRegion region = new SF2LayerRegion(); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.setSample(sample); + layer.getRegions().add(region); + SF2Instrument ins = new SF2Instrument(sf2); + ins.setName("Test Instrument"); + sf2.addInstrument(ins); + SF2InstrumentRegion insregion = new SF2InstrumentRegion(); + insregion.setLayer(layer); + ins.getRegions().add(insregion); + + return sf2; + } + + public SoftTestUtils() throws Exception { + stream = synth.openStream(null, null); + synth.unloadAllInstruments(synth.getDefaultSoundbank()); + synth.loadAllInstruments(createTestSoundBank()); + } + + public void close() throws Exception { + stream.close(); + stream = null; + synth.close(); + synth = null; + } + + public void read(double seconds) throws IOException + { + int bufflen = + stream.getFormat().getFrameSize() * + (int)(stream.getFormat().getFrameRate() * seconds); + while(bufflen != 0) + { + if(bufflen > 1024) + bufflen -= stream.read(tmpbuffer,0,1024); + else + bufflen -= stream.read(tmpbuffer,0, bufflen); + } + } + + public VoiceStatus findVoice(int channel, int note) { + VoiceStatus[] v = synth.getVoiceStatus(); + for (int k = 0; k < v.length; k++) + if(v[k].active) + if(v[k].channel == channel) + if(v[k].note == note) + return v[k]; + return null; + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftChannel/Solo.java b/jdk/test/javax/sound/midi/Gervill/SoftChannel/Solo.java new file mode 100644 index 00000000000..a575ac6b6c7 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftChannel/Solo.java @@ -0,0 +1,59 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftChannel solo method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Solo { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + + channel.setSolo(true); + assertEquals(channel.getSolo(), true); + channel.setSolo(false); + assertEquals(channel.getSolo(), false); + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftCubicResampler/Interpolate.java b/jdk/test/javax/sound/midi/Gervill/SoftCubicResampler/Interpolate.java new file mode 100644 index 00000000000..ed50cff4344 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftCubicResampler/Interpolate.java @@ -0,0 +1,113 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftCubicResampler interpolate method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Interpolate { + + private static float getResamplerTestValue(double i) + { + return (float)Math.sin(i / 10.0); + } + + private static void perfectInterpolation(float[] in_offset, float in_end, + float[] startpitch, float pitchstep, float[] out, int[] out_offset, + int out_end) { + + float pitch = startpitch[0]; + float ix = in_offset[0]; + int ox = out_offset[0]; + float ix_end = in_end; + int ox_end = out_end; + if (pitchstep == 0f) { + while (ix < ix_end && ox < ox_end) { + out[ox++] = getResamplerTestValue(ix); + ix += pitch; + } + } else { + while (ix < ix_end && ox < ox_end) { + out[ox++] = getResamplerTestValue(ix); + ix += pitch; + pitch += pitchstep; + } + } + in_offset[0] = ix; + out_offset[0] = ox; + startpitch[0] = pitch; + + } + + private static float testResampler(SoftAbstractResampler resampler, float p_pitch, float p_pitch2) + { + float[] testbuffer = new float[4096]; + float[] testbuffer2 = new float[1024]; + float[] testbuffer3 = new float[1024]; + for (int i = 0; i < testbuffer.length; i++) + testbuffer[i] = getResamplerTestValue(i); + int pads = resampler.getPadding(); + float pitchstep = (p_pitch2 - p_pitch)/1024f; + int[] out_offset2 = {0}; + int[] out_offset3 = {0}; + resampler.interpolate(testbuffer, new float[] {pads}, testbuffer.length - pads, new float[] {p_pitch}, pitchstep, testbuffer2, out_offset2, testbuffer2.length); + perfectInterpolation(new float[] {pads}, testbuffer.length - pads, new float[] {p_pitch}, pitchstep, testbuffer3, out_offset3, testbuffer3.length); + int out_off = out_offset2[0]; + if(out_offset3[0] < out_off) + out_off = out_offset3[0]; + float ac_error = 0; + int counter = 0; + for (int i = pads; i < out_off; i++) { + ac_error += Math.abs(testbuffer2[i] - testbuffer3[i]); + counter++; + } + return ac_error / ((float)counter); + } + + private static void fail(String error) throws Exception + { + throw new RuntimeException(error); + } + + public static void main(String[] args) throws Exception { + SoftCubicResampler resampler = new SoftCubicResampler(); + float max = testResampler(resampler, 0.3f, 0.3f); + if(max > 0.005) + fail("Interpolation failed, error="+max); + max = testResampler(resampler, 0.3f, 0.01f); + if(max > 0.005) + fail("Interpolation failed, error="+max); + max = testResampler(resampler, 1.0f, 0.00f); + if(max > 0.005) + fail("Interpolation failed, error="+max); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftLanczosResampler/Interpolate.java b/jdk/test/javax/sound/midi/Gervill/SoftLanczosResampler/Interpolate.java new file mode 100644 index 00000000000..664952dbbd2 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftLanczosResampler/Interpolate.java @@ -0,0 +1,113 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftLanczosResampler interpolate method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Interpolate { + + private static float getResamplerTestValue(double i) + { + return (float)Math.sin(i / 10.0); + } + + private static void perfectInterpolation(float[] in_offset, float in_end, + float[] startpitch, float pitchstep, float[] out, int[] out_offset, + int out_end) { + + float pitch = startpitch[0]; + float ix = in_offset[0]; + int ox = out_offset[0]; + float ix_end = in_end; + int ox_end = out_end; + if (pitchstep == 0f) { + while (ix < ix_end && ox < ox_end) { + out[ox++] = getResamplerTestValue(ix); + ix += pitch; + } + } else { + while (ix < ix_end && ox < ox_end) { + out[ox++] = getResamplerTestValue(ix); + ix += pitch; + pitch += pitchstep; + } + } + in_offset[0] = ix; + out_offset[0] = ox; + startpitch[0] = pitch; + + } + + private static float testResampler(SoftAbstractResampler resampler, float p_pitch, float p_pitch2) + { + float[] testbuffer = new float[4096]; + float[] testbuffer2 = new float[1024]; + float[] testbuffer3 = new float[1024]; + for (int i = 0; i < testbuffer.length; i++) + testbuffer[i] = getResamplerTestValue(i); + int pads = resampler.getPadding(); + float pitchstep = (p_pitch2 - p_pitch)/1024f; + int[] out_offset2 = {0}; + int[] out_offset3 = {0}; + resampler.interpolate(testbuffer, new float[] {pads}, testbuffer.length - pads, new float[] {p_pitch}, pitchstep, testbuffer2, out_offset2, testbuffer2.length); + perfectInterpolation(new float[] {pads}, testbuffer.length - pads, new float[] {p_pitch}, pitchstep, testbuffer3, out_offset3, testbuffer3.length); + int out_off = out_offset2[0]; + if(out_offset3[0] < out_off) + out_off = out_offset3[0]; + float ac_error = 0; + int counter = 0; + for (int i = pads; i < out_off; i++) { + ac_error += Math.abs(testbuffer2[i] - testbuffer3[i]); + counter++; + } + return ac_error / ((float)counter); + } + + private static void fail(String error) throws Exception + { + throw new RuntimeException(error); + } + + public static void main(String[] args) throws Exception { + SoftLanczosResampler resampler = new SoftLanczosResampler(); + float max = testResampler(resampler, 0.3f, 0.3f); + if(max > 0.01) + fail("Interpolation failed, error="+max); + max = testResampler(resampler, 0.3f, 0.01f); + if(max > 0.01) + fail("Interpolation failed, error="+max); + max = testResampler(resampler, 1.0f, 0.00f); + if(max > 0.01) + fail("Interpolation failed, error="+max); + } +} \ No newline at end of file diff --git a/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_mix.java b/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_mix.java new file mode 100644 index 00000000000..ed64ae24e4c --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_mix.java @@ -0,0 +1,96 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftLimiter processAudio method */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ProcessAudio_replace_mix { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + + SoftAudioBuffer in1 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer in2 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer out1 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer out2 = new SoftAudioBuffer(250, synth.getFormat()); + + float[] testdata1 = new float[in1.getSize()]; + float[] testdata2 = new float[in2.getSize()]; + float[] n1a = in1.array(); + float[] n2a = in2.array(); + float[] out1a = out1.array(); + float[] out2a = out2.array(); + for (int i = 0; i < n1a.length; i++) { + testdata1[i] = (float)Math.sin(i*0.3)*0.9f; + testdata2[i] = (float)Math.sin(i*0.4)*0.9f; + n1a[i] = testdata1[i]; + n2a[i] = testdata2[i]; + out1a[i] = 1; + out2a[i] = 1; + } + + SoftLimiter limiter = new SoftLimiter(); + limiter.init(44100, 147); + limiter.setMixMode(true); + limiter.setInput(0, in1); + limiter.setInput(1, in2); + limiter.setOutput(0, out1); + limiter.setOutput(1, out2); + limiter.processControlLogic(); + limiter.processAudio(); + limiter.processControlLogic(); + limiter.processAudio(); + // Limiter should delay audio by one buffer, + // and there should almost no different in output v.s. input + for (int i = 0; i < n1a.length; i++) { + if(Math.abs(out1a[i] - testdata1[i] - 1) > 0.00001) + throw new Exception("input != output"); + if(Math.abs(out2a[i] - testdata2[i] - 1) > 0.00001) + throw new Exception("input != output"); + } + + synth.close(); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_mix_mono.java b/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_mix_mono.java new file mode 100644 index 00000000000..2a78f5b1e1e --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_mix_mono.java @@ -0,0 +1,83 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftLimiter processAudio method */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ProcessAudio_replace_mix_mono { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftSynthesizer synth = new SoftSynthesizer(); + synth.openStream(new AudioFormat(44100, 16, 1, true, false), null); + + SoftAudioBuffer in1 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer out1 = new SoftAudioBuffer(250, synth.getFormat()); + + float[] testdata1 = new float[in1.getSize()]; + float[] n1a = in1.array(); + float[] out1a = out1.array(); + for (int i = 0; i < n1a.length; i++) { + testdata1[i] = (float)Math.sin(i*0.3)*0.9f; + n1a[i] = testdata1[i]; + out1a[i] = 1; + } + + SoftLimiter limiter = new SoftLimiter(); + limiter.init(44100, 147); + limiter.setMixMode(true); + limiter.setInput(0, in1); + limiter.setOutput(0, out1); + limiter.processControlLogic(); + limiter.processAudio(); + limiter.processControlLogic(); + limiter.processAudio(); + // Limiter should delay audio by one buffer, + // and there should almost no different in output v.s. input + for (int i = 0; i < n1a.length; i++) { + if(Math.abs(out1a[i] - testdata1[i] - 1) > 0.00001) + throw new Exception("input != output"); + } + + synth.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_mix_mono_overdrive.java b/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_mix_mono_overdrive.java new file mode 100644 index 00000000000..f99670d06f5 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_mix_mono_overdrive.java @@ -0,0 +1,84 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftLimiter processAudio method */ + + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ProcessAudio_replace_mix_mono_overdrive { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftSynthesizer synth = new SoftSynthesizer(); + synth.openStream(new AudioFormat(44100, 16, 1, true, false), null); + + SoftAudioBuffer in1 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer out1 = new SoftAudioBuffer(250, synth.getFormat()); + + float[] testdata1 = new float[in1.getSize()]; + float[] n1a = in1.array(); + float[] out1a = out1.array(); + for (int i = 0; i < n1a.length; i++) { + testdata1[i] = (float)Math.sin(i*0.3)*2.5f; + n1a[i] = testdata1[i]; + out1a[i] = 1; + } + + SoftLimiter limiter = new SoftLimiter(); + limiter.init(44100, 147); + limiter.setMixMode(true); + limiter.setInput(0, in1); + limiter.setOutput(0, out1); + limiter.processControlLogic(); + limiter.processAudio(); + limiter.processControlLogic(); + limiter.processAudio(); + // Limiter should delay audio by one buffer, + // and there should almost no different in output v.s. input + for (int i = 0; i < n1a.length; i++) { + if(Math.abs(out1a[i]-1) > 1.0) + throw new Exception("abs(output)>1"); + } + + synth.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_mix_overdrive.java b/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_mix_overdrive.java new file mode 100644 index 00000000000..1161c010c48 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_mix_overdrive.java @@ -0,0 +1,95 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftLimiter processAudio method */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ProcessAudio_replace_mix_overdrive { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + + SoftAudioBuffer in1 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer in2 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer out1 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer out2 = new SoftAudioBuffer(250, synth.getFormat()); + + float[] testdata1 = new float[in1.getSize()]; + float[] testdata2 = new float[in2.getSize()]; + float[] n1a = in1.array(); + float[] n2a = in2.array(); + float[] out1a = out1.array(); + float[] out2a = out2.array(); + for (int i = 0; i < n1a.length; i++) { + testdata1[i] = (float)Math.sin(i*0.3)*2.5f; + testdata2[i] = (float)Math.sin(i*0.4)*2.5f; + n1a[i] = testdata1[i]; + n2a[i] = testdata2[i]; + out1a[i] = 1; + out2a[i] = 1; + } + + SoftLimiter limiter = new SoftLimiter(); + limiter.init(44100, 147); + limiter.setMixMode(true); + limiter.setInput(0, in1); + limiter.setInput(1, in2); + limiter.setOutput(0, out1); + limiter.setOutput(1, out2); + limiter.processControlLogic(); + limiter.processAudio(); + limiter.processControlLogic(); + limiter.processAudio(); + // Limiter should delay audio by one buffer, + // and there should almost no different in output v.s. input + for (int i = 0; i < n1a.length; i++) { + if(Math.abs(out1a[i]-1) > 1.0) + throw new Exception("abs(output)>1"); + if(Math.abs(out2a[i]-1) > 1.0) + throw new Exception("abs(output)>1"); + } + + synth.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_normal.java b/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_normal.java new file mode 100644 index 00000000000..af3b145bf55 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_normal.java @@ -0,0 +1,95 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftLimiter processAudio method */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ProcessAudio_replace_normal { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + + SoftAudioBuffer in1 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer in2 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer out1 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer out2 = new SoftAudioBuffer(250, synth.getFormat()); + + float[] testdata1 = new float[in1.getSize()]; + float[] testdata2 = new float[in2.getSize()]; + float[] n1a = in1.array(); + float[] n2a = in2.array(); + float[] out1a = out1.array(); + float[] out2a = out2.array(); + for (int i = 0; i < n1a.length; i++) { + testdata1[i] = (float)Math.sin(i*0.3)*0.9f; + testdata2[i] = (float)Math.sin(i*0.4)*0.9f; + n1a[i] = testdata1[i]; + n2a[i] = testdata2[i]; + out1a[i] = 1; + out2a[i] = 1; + } + + SoftLimiter limiter = new SoftLimiter(); + limiter.init(44100, 147); + limiter.setMixMode(false); + limiter.setInput(0, in1); + limiter.setInput(1, in2); + limiter.setOutput(0, out1); + limiter.setOutput(1, out2); + limiter.processControlLogic(); + limiter.processAudio(); + limiter.processControlLogic(); + limiter.processAudio(); + // Limiter should delay audio by one buffer, + // and there should almost no different in output v.s. input + for (int i = 0; i < n1a.length; i++) { + if(Math.abs(out1a[i] - testdata1[i]) > 0.00001) + throw new Exception("input != output"); + if(Math.abs(out2a[i] - testdata2[i]) > 0.00001) + throw new Exception("input != output"); + } + + synth.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_normal_mono.java b/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_normal_mono.java new file mode 100644 index 00000000000..beb7db7d416 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_normal_mono.java @@ -0,0 +1,83 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftLimiter processAudio method */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ProcessAudio_replace_normal_mono { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftSynthesizer synth = new SoftSynthesizer(); + synth.openStream(new AudioFormat(44100, 16, 1, true, false), null); + + SoftAudioBuffer in1 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer out1 = new SoftAudioBuffer(250, synth.getFormat()); + + float[] testdata1 = new float[in1.getSize()]; + float[] n1a = in1.array(); + float[] out1a = out1.array(); + for (int i = 0; i < n1a.length; i++) { + testdata1[i] = (float)Math.sin(i*0.3)*0.9f; + n1a[i] = testdata1[i]; + out1a[i] = 1; + } + + SoftLimiter limiter = new SoftLimiter(); + limiter.init(44100, 147); + limiter.setMixMode(false); + limiter.setInput(0, in1); + limiter.setOutput(0, out1); + limiter.processControlLogic(); + limiter.processAudio(); + limiter.processControlLogic(); + limiter.processAudio(); + // Limiter should delay audio by one buffer, + // and there should almost no different in output v.s. input + for (int i = 0; i < n1a.length; i++) { + if(Math.abs(out1a[i] - testdata1[i]) > 0.00001) + throw new Exception("input != output"); + } + + synth.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_overdrive.java b/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_overdrive.java new file mode 100644 index 00000000000..8df2be7bb18 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_overdrive.java @@ -0,0 +1,95 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftLimiter processAudio method */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ProcessAudio_replace_overdrive { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + + SoftAudioBuffer in1 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer in2 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer out1 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer out2 = new SoftAudioBuffer(250, synth.getFormat()); + + float[] testdata1 = new float[in1.getSize()]; + float[] testdata2 = new float[in2.getSize()]; + float[] n1a = in1.array(); + float[] n2a = in2.array(); + float[] out1a = out1.array(); + float[] out2a = out2.array(); + for (int i = 0; i < n1a.length; i++) { + testdata1[i] = (float)Math.sin(i*0.3)*2.5f; + testdata2[i] = (float)Math.sin(i*0.4)*2.5f; + n1a[i] = testdata1[i]; + n2a[i] = testdata2[i]; + out1a[i] = 1; + out2a[i] = 1; + } + + SoftLimiter limiter = new SoftLimiter(); + limiter.init(44100, 147); + limiter.setMixMode(false); + limiter.setInput(0, in1); + limiter.setInput(1, in2); + limiter.setOutput(0, out1); + limiter.setOutput(1, out2); + limiter.processControlLogic(); + limiter.processAudio(); + limiter.processControlLogic(); + limiter.processAudio(); + // Limiter should delay audio by one buffer, + // and there should almost no different in output v.s. input + for (int i = 0; i < n1a.length; i++) { + if(Math.abs(out1a[i]) > 1.0) + throw new Exception("abs(output)>1"); + if(Math.abs(out2a[i]) > 1.0) + throw new Exception("abs(output)>1"); + } + + synth.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_overdrive_mono.java b/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_overdrive_mono.java new file mode 100644 index 00000000000..882bc48a4c7 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftLimiter/ProcessAudio_replace_overdrive_mono.java @@ -0,0 +1,83 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftLimiter processAudio method */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class ProcessAudio_replace_overdrive_mono { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftSynthesizer synth = new SoftSynthesizer(); + synth.openStream(new AudioFormat(44100, 16, 1, true, false), null); + + SoftAudioBuffer in1 = new SoftAudioBuffer(250, synth.getFormat()); + SoftAudioBuffer out1 = new SoftAudioBuffer(250, synth.getFormat()); + + float[] testdata1 = new float[in1.getSize()]; + float[] n1a = in1.array(); + float[] out1a = out1.array(); + for (int i = 0; i < n1a.length; i++) { + testdata1[i] = (float)Math.sin(i*0.3)*2.5f; + n1a[i] = testdata1[i]; + out1a[i] = 1; + } + + SoftLimiter limiter = new SoftLimiter(); + limiter.init(44100, 147); + limiter.setMixMode(false); + limiter.setInput(0, in1); + limiter.setOutput(0, out1); + limiter.processControlLogic(); + limiter.processAudio(); + limiter.processControlLogic(); + limiter.processAudio(); + // Limiter should delay audio by one buffer, + // and there should almost no different in output v.s. input + for (int i = 0; i < n1a.length; i++) { + if(Math.abs(out1a[i]) > 1.0) + throw new Exception("abs(output)>1"); + } + + synth.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftLinearResampler/Interpolate.java b/jdk/test/javax/sound/midi/Gervill/SoftLinearResampler/Interpolate.java new file mode 100644 index 00000000000..c75b007ea60 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftLinearResampler/Interpolate.java @@ -0,0 +1,113 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftLinearResampler interpolate method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Interpolate { + + private static float getResamplerTestValue(double i) + { + return (float)Math.sin(i / 10.0); + } + + private static void perfectInterpolation(float[] in_offset, float in_end, + float[] startpitch, float pitchstep, float[] out, int[] out_offset, + int out_end) { + + float pitch = startpitch[0]; + float ix = in_offset[0]; + int ox = out_offset[0]; + float ix_end = in_end; + int ox_end = out_end; + if (pitchstep == 0f) { + while (ix < ix_end && ox < ox_end) { + out[ox++] = getResamplerTestValue(ix); + ix += pitch; + } + } else { + while (ix < ix_end && ox < ox_end) { + out[ox++] = getResamplerTestValue(ix); + ix += pitch; + pitch += pitchstep; + } + } + in_offset[0] = ix; + out_offset[0] = ox; + startpitch[0] = pitch; + + } + + private static float testResampler(SoftAbstractResampler resampler, float p_pitch, float p_pitch2) + { + float[] testbuffer = new float[4096]; + float[] testbuffer2 = new float[1024]; + float[] testbuffer3 = new float[1024]; + for (int i = 0; i < testbuffer.length; i++) + testbuffer[i] = getResamplerTestValue(i); + int pads = resampler.getPadding(); + float pitchstep = (p_pitch2 - p_pitch)/1024f; + int[] out_offset2 = {0}; + int[] out_offset3 = {0}; + resampler.interpolate(testbuffer, new float[] {pads}, testbuffer.length - pads, new float[] {p_pitch}, pitchstep, testbuffer2, out_offset2, testbuffer2.length); + perfectInterpolation(new float[] {pads}, testbuffer.length - pads, new float[] {p_pitch}, pitchstep, testbuffer3, out_offset3, testbuffer3.length); + int out_off = out_offset2[0]; + if(out_offset3[0] < out_off) + out_off = out_offset3[0]; + float ac_error = 0; + int counter = 0; + for (int i = pads; i < out_off; i++) { + ac_error += Math.abs(testbuffer2[i] - testbuffer3[i]); + counter++; + } + return ac_error / ((float)counter); + } + + private static void fail(String error) throws Exception + { + throw new RuntimeException(error); + } + + public static void main(String[] args) throws Exception { + SoftLinearResampler resampler = new SoftLinearResampler(); + float max = testResampler(resampler, 0.3f, 0.3f); + if(max > 0.001) + fail("Interpolation failed, error="+max); + max = testResampler(resampler, 0.3f, 0.01f); + if(max > 0.001) + fail("Interpolation failed, error="+max); + max = testResampler(resampler, 1.0f, 0.00f); + if(max > 0.001) + fail("Interpolation failed, error="+max); + } +} \ No newline at end of file diff --git a/jdk/test/javax/sound/midi/Gervill/SoftLinearResampler2/Interpolate.java b/jdk/test/javax/sound/midi/Gervill/SoftLinearResampler2/Interpolate.java new file mode 100644 index 00000000000..c3822abd225 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftLinearResampler2/Interpolate.java @@ -0,0 +1,113 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftLinearResampler2 interpolate method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Interpolate { + + private static float getResamplerTestValue(double i) + { + return (float)Math.sin(i / 10.0); + } + + private static void perfectInterpolation(float[] in_offset, float in_end, + float[] startpitch, float pitchstep, float[] out, int[] out_offset, + int out_end) { + + float pitch = startpitch[0]; + float ix = in_offset[0]; + int ox = out_offset[0]; + float ix_end = in_end; + int ox_end = out_end; + if (pitchstep == 0f) { + while (ix < ix_end && ox < ox_end) { + out[ox++] = getResamplerTestValue(ix); + ix += pitch; + } + } else { + while (ix < ix_end && ox < ox_end) { + out[ox++] = getResamplerTestValue(ix); + ix += pitch; + pitch += pitchstep; + } + } + in_offset[0] = ix; + out_offset[0] = ox; + startpitch[0] = pitch; + + } + + private static float testResampler(SoftAbstractResampler resampler, float p_pitch, float p_pitch2) + { + float[] testbuffer = new float[4096]; + float[] testbuffer2 = new float[1024]; + float[] testbuffer3 = new float[1024]; + for (int i = 0; i < testbuffer.length; i++) + testbuffer[i] = getResamplerTestValue(i); + int pads = resampler.getPadding(); + float pitchstep = (p_pitch2 - p_pitch)/1024f; + int[] out_offset2 = {0}; + int[] out_offset3 = {0}; + resampler.interpolate(testbuffer, new float[] {pads}, testbuffer.length - pads, new float[] {p_pitch}, pitchstep, testbuffer2, out_offset2, testbuffer2.length); + perfectInterpolation(new float[] {pads}, testbuffer.length - pads, new float[] {p_pitch}, pitchstep, testbuffer3, out_offset3, testbuffer3.length); + int out_off = out_offset2[0]; + if(out_offset3[0] < out_off) + out_off = out_offset3[0]; + float ac_error = 0; + int counter = 0; + for (int i = pads; i < out_off; i++) { + ac_error += Math.abs(testbuffer2[i] - testbuffer3[i]); + counter++; + } + return ac_error / ((float)counter); + } + + private static void fail(String error) throws Exception + { + throw new RuntimeException(error); + } + + public static void main(String[] args) throws Exception { + SoftLinearResampler2 resampler = new SoftLinearResampler2(); + float max = testResampler(resampler, 0.3f, 0.3f); + if(max > 0.2) + fail("Interpolation failed, error="+max); + max = testResampler(resampler, 0.3f, 0.01f); + if(max > 0.2) + fail("Interpolation failed, error="+max); + max = testResampler(resampler, 1.0f, 0.00f); + if(max > 0.2) + fail("Interpolation failed, error="+max); + } +} \ No newline at end of file diff --git a/jdk/test/javax/sound/midi/Gervill/SoftPointResampler/Interpolate.java b/jdk/test/javax/sound/midi/Gervill/SoftPointResampler/Interpolate.java new file mode 100644 index 00000000000..743469ab869 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftPointResampler/Interpolate.java @@ -0,0 +1,113 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftPointResampler interpolate method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Interpolate { + + private static float getResamplerTestValue(double i) + { + return (float)Math.sin(i / 10.0); + } + + private static void perfectInterpolation(float[] in_offset, float in_end, + float[] startpitch, float pitchstep, float[] out, int[] out_offset, + int out_end) { + + float pitch = startpitch[0]; + float ix = in_offset[0]; + int ox = out_offset[0]; + float ix_end = in_end; + int ox_end = out_end; + if (pitchstep == 0f) { + while (ix < ix_end && ox < ox_end) { + out[ox++] = getResamplerTestValue(ix); + ix += pitch; + } + } else { + while (ix < ix_end && ox < ox_end) { + out[ox++] = getResamplerTestValue(ix); + ix += pitch; + pitch += pitchstep; + } + } + in_offset[0] = ix; + out_offset[0] = ox; + startpitch[0] = pitch; + + } + + private static float testResampler(SoftAbstractResampler resampler, float p_pitch, float p_pitch2) + { + float[] testbuffer = new float[4096]; + float[] testbuffer2 = new float[1024]; + float[] testbuffer3 = new float[1024]; + for (int i = 0; i < testbuffer.length; i++) + testbuffer[i] = getResamplerTestValue(i); + int pads = resampler.getPadding(); + float pitchstep = (p_pitch2 - p_pitch)/1024f; + int[] out_offset2 = {0}; + int[] out_offset3 = {0}; + resampler.interpolate(testbuffer, new float[] {pads}, testbuffer.length - pads, new float[] {p_pitch}, pitchstep, testbuffer2, out_offset2, testbuffer2.length); + perfectInterpolation(new float[] {pads}, testbuffer.length - pads, new float[] {p_pitch}, pitchstep, testbuffer3, out_offset3, testbuffer3.length); + int out_off = out_offset2[0]; + if(out_offset3[0] < out_off) + out_off = out_offset3[0]; + float ac_error = 0; + int counter = 0; + for (int i = pads; i < out_off; i++) { + ac_error += Math.abs(testbuffer2[i] - testbuffer3[i]); + counter++; + } + return ac_error / ((float)counter); + } + + private static void fail(String error) throws Exception + { + throw new RuntimeException(error); + } + + public static void main(String[] args) throws Exception { + SoftPointResampler resampler = new SoftPointResampler(); + float max = testResampler(resampler, 0.3f, 0.3f); + if(max > 0.2) + fail("Interpolation failed, error="+max); + max = testResampler(resampler, 0.3f, 0.01f); + if(max > 0.2) + fail("Interpolation failed, error="+max); + max = testResampler(resampler, 1.0f, 0.00f); + if(max > 0.2) + fail("Interpolation failed, error="+max); + } +} \ No newline at end of file diff --git a/jdk/test/javax/sound/midi/Gervill/SoftProvider/GetDevice.java b/jdk/test/javax/sound/midi/Gervill/SoftProvider/GetDevice.java new file mode 100644 index 00000000000..74ba903b64b --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftProvider/GetDevice.java @@ -0,0 +1,70 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftProvider getDevice method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetDevice { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + + private static class FakeInfo extends Info { + public FakeInfo() { + super("a", "b", "c", "d"); + } + } + + public static void main(String[] args) throws Exception { + SoftProvider provider = new SoftProvider(); + Info[] infos = provider.getDeviceInfo(); + assertTrue(infos.length > 0); + for (int i = 0; i < infos.length; i++) { + assertTrue(infos[i] != null); + MidiDevice d = provider.getDevice(infos[i]); + assertTrue(d instanceof SoftSynthesizer); + } + assertTrue(provider.getDevice(new FakeInfo()) == null); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Close.java b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Close.java new file mode 100644 index 00000000000..2347918e492 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Close.java @@ -0,0 +1,59 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver close method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Close { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + assertEquals(soft.synth.getReceivers().size(), 1); + receiver.close(); + assertEquals(soft.synth.getReceivers().size(), 0); + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_ActiveSense.java b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_ActiveSense.java new file mode 100644 index 00000000000..bee35b3763a --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_ActiveSense.java @@ -0,0 +1,82 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_ActiveSense { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void sendActiveSens(Receiver r) throws Exception + { + ShortMessage smsg = new ShortMessage(); + smsg.setMessage(ShortMessage.ACTIVE_SENSING); + r.send(smsg, -1); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + sendActiveSens(receiver); + + // 1. Check if notes are keept active + // if send active sens every 200-300 msec + + sendActiveSens(receiver); + channel.noteOn(60, 64); + assertTrue(soft.findVoice(0,60) != null); + for (int i = 0; i < 10; i++) { + soft.read(0.2); // read 200 msec + sendActiveSens(receiver); + assertTrue(soft.findVoice(0,60) != null); + } + // 2. Now we stop send active sense message + // and the note should be killed off + soft.read(2); + assertTrue(soft.findVoice(0,60) == null); + + + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_AllNotesOff.java b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_AllNotesOff.java new file mode 100644 index 00000000000..39a42d6d537 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_AllNotesOff.java @@ -0,0 +1,64 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_AllNotesOff { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + channel.noteOn(60, 64); + soft.read(1); + assertTrue(soft.findVoice(0,60) != null); + ShortMessage smsg = new ShortMessage(); + smsg.setMessage(ShortMessage.CONTROL_CHANGE,0, 123,0); + receiver.send(smsg, -1); + soft.read(1); + assertTrue(soft.findVoice(0,60) == null); + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_AllSoundOff.java b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_AllSoundOff.java new file mode 100644 index 00000000000..bfb236cdaf1 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_AllSoundOff.java @@ -0,0 +1,64 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_AllSoundOff { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + channel.noteOn(60, 64); + soft.read(1); + assertTrue(soft.findVoice(0,60) != null); + ShortMessage smsg = new ShortMessage(); + smsg.setMessage(ShortMessage.CONTROL_CHANGE,0, 120,0); + receiver.send(smsg, -1); + soft.read(1); + assertTrue(soft.findVoice(0,60) == null); + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_ChannelPressure.java b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_ChannelPressure.java new file mode 100644 index 00000000000..62d4378d1a8 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_ChannelPressure.java @@ -0,0 +1,63 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_ChannelPressure { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + ShortMessage smsg = new ShortMessage(); + smsg.setMessage(ShortMessage.CHANNEL_PRESSURE,0, 10,0); + receiver.send(smsg, -1); + assertEquals(channel.getChannelPressure(), 10); + smsg.setMessage(ShortMessage.CHANNEL_PRESSURE,0, 90,0); + receiver.send(smsg, -1); + assertEquals(channel.getChannelPressure(), 90); + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_Controller.java b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_Controller.java new file mode 100644 index 00000000000..ff4ef6f87be --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_Controller.java @@ -0,0 +1,66 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_Controller { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + ShortMessage smsg = new ShortMessage(); + for (int i = 0; i < 128; i++) { + if(i == 0 || i == 32) continue; + smsg.setMessage(ShortMessage.CONTROL_CHANGE,0, i,10); + receiver.send(smsg, -1); + assertEquals(channel.getController(i), 10); + smsg.setMessage(ShortMessage.CONTROL_CHANGE,0, i,100); + receiver.send(smsg, -1); + assertEquals(channel.getController(i), 100); + } + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_Mono.java b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_Mono.java new file mode 100644 index 00000000000..ab07878c0e5 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_Mono.java @@ -0,0 +1,75 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_Mono { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + ShortMessage smsg = new ShortMessage(); + smsg.setMessage(ShortMessage.CONTROL_CHANGE,0, 126,100); + receiver.send(smsg, -1); + assertEquals(channel.getMono(), false); + smsg.setMessage(ShortMessage.CONTROL_CHANGE,0, 126,1); + receiver.send(smsg, -1); + assertEquals(channel.getMono(), true); + smsg.setMessage(ShortMessage.CONTROL_CHANGE,0, 127,0); + receiver.send(smsg, -1); + assertEquals(channel.getMono(), false); + + // Check if send mono triggers AllNotesOff + channel.noteOn(60, 64); + soft.read(1); + assertTrue(soft.findVoice(0,60) != null); + smsg.setMessage(ShortMessage.CONTROL_CHANGE,0, 127,0); + receiver.send(smsg, -1); + soft.read(1); + assertTrue(soft.findVoice(0,60) == null); + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_NoteOff.java b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_NoteOff.java new file mode 100644 index 00000000000..02685037561 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_NoteOff.java @@ -0,0 +1,65 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_NoteOff { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + ShortMessage smsg = new ShortMessage(); + smsg.setMessage(ShortMessage.NOTE_ON,0, 60, 64); + receiver.send(smsg, -1); + soft.read(1); + assertTrue(soft.findVoice(0,60) != null); + smsg.setMessage(ShortMessage.NOTE_OFF,0, 60, 0); + receiver.send(smsg, -1); + soft.read(1); + assertTrue(soft.findVoice(0,60) == null); + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_NoteOn.java b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_NoteOn.java new file mode 100644 index 00000000000..d701833ada0 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_NoteOn.java @@ -0,0 +1,65 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_NoteOn { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + ShortMessage smsg = new ShortMessage(); + smsg.setMessage(ShortMessage.NOTE_ON,0, 60, 64); + receiver.send(smsg, -1); + soft.read(1); + assertTrue(soft.findVoice(0,60) != null); + smsg.setMessage(ShortMessage.NOTE_ON,0, 60, 0); + receiver.send(smsg, -1); + soft.read(1); + assertTrue(soft.findVoice(0,60) == null); + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_NoteOn_AllChannels.java b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_NoteOn_AllChannels.java new file mode 100644 index 00000000000..1e9a4099ae7 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_NoteOn_AllChannels.java @@ -0,0 +1,71 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_NoteOn_AllChannels { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + for (int i = 0; i < 15; i++) { + if(i == 9) i++; + ShortMessage smsg = new ShortMessage(); + smsg.setMessage(ShortMessage.NOTE_ON,i, 60, 64); + receiver.send(smsg, -1); + soft.read(1); + VoiceStatus voice = soft.findVoice(i,60); + assertTrue(voice != null); + smsg.setMessage(ShortMessage.NOTE_ON,i, 60, 0); + receiver.send(smsg, -1); + soft.read(1); + voice = soft.findVoice(i,60); + assertTrue(voice == null); + soft.read(1); + } + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_NoteOn_Delayed.java b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_NoteOn_Delayed.java new file mode 100644 index 00000000000..a64c673b068 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_NoteOn_Delayed.java @@ -0,0 +1,67 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_NoteOn_Delayed { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + ShortMessage smsg = new ShortMessage(); + smsg.setMessage(ShortMessage.NOTE_ON,0, 60, 64); + receiver.send(smsg, 2000000); // Delay sending note for 2 sec + soft.read(1); + assertTrue(soft.findVoice(0,60) == null); + soft.read(2); + assertTrue(soft.findVoice(0,60) != null); + smsg.setMessage(ShortMessage.NOTE_ON,0, 60, 0); + receiver.send(smsg, -1); + soft.read(1); + assertTrue(soft.findVoice(0,60) == null); + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_NoteOn_Multiple.java b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_NoteOn_Multiple.java new file mode 100644 index 00000000000..183ae5f679f --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_NoteOn_Multiple.java @@ -0,0 +1,76 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_NoteOn_Multiple { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + ShortMessage smsg = new ShortMessage(); + smsg.setMessage(ShortMessage.NOTE_ON,0, 60, 64); + receiver.send(smsg, -1); + smsg.setMessage(ShortMessage.NOTE_ON,0, 61, 64); + receiver.send(smsg, -1); + smsg.setMessage(ShortMessage.NOTE_ON,0, 62, 64); + receiver.send(smsg, -1); + soft.read(1); + assertTrue(soft.findVoice(0,60) != null); + assertTrue(soft.findVoice(0,61) != null); + assertTrue(soft.findVoice(0,62) != null); + + smsg.setMessage(ShortMessage.NOTE_ON,0, 60, 0); + receiver.send(smsg, -1); + smsg.setMessage(ShortMessage.NOTE_ON,0, 61, 0); + receiver.send(smsg, -1); + soft.read(1); + assertTrue(soft.findVoice(0,60) == null); + assertTrue(soft.findVoice(0,61) == null); + assertTrue(soft.findVoice(0,62) != null); + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_Omni.java b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_Omni.java new file mode 100644 index 00000000000..a3cd1b29f42 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_Omni.java @@ -0,0 +1,74 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_Omni { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + ShortMessage smsg = new ShortMessage(); + smsg.setMessage(ShortMessage.CONTROL_CHANGE,0, 125,0); + receiver.send(smsg, -1); + // Poly or Omni not supported by GM2 + // getOmni() should always return false + assertEquals(channel.getOmni(), false); + smsg.setMessage(ShortMessage.CONTROL_CHANGE,0, 124,0); + receiver.send(smsg, -1); + assertEquals(channel.getOmni(), false); + + // Check if send omni triggers AllNotesOff + channel.noteOn(60, 64); + soft.read(1); + assertTrue(soft.findVoice(0,60) != null); + smsg.setMessage(ShortMessage.CONTROL_CHANGE,0, 124,0); + receiver.send(smsg, -1); + soft.read(1); + assertTrue(soft.findVoice(0,60) == null); + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_PitchBend.java b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_PitchBend.java new file mode 100644 index 00000000000..097b9bbe2f4 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_PitchBend.java @@ -0,0 +1,63 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_PitchBend { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + ShortMessage smsg = new ShortMessage(); + smsg.setMessage(ShortMessage.PITCH_BEND,0, 10,0); + receiver.send(smsg, -1); + assertEquals(channel.getPitchBend(), 10); + smsg.setMessage(ShortMessage.PITCH_BEND,0, 9000%128,9000/128); + receiver.send(smsg, -1); + assertEquals(channel.getPitchBend(), 9000); + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_PolyPressure.java b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_PolyPressure.java new file mode 100644 index 00000000000..decd2d21555 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_PolyPressure.java @@ -0,0 +1,65 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_PolyPressure { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + ShortMessage smsg = new ShortMessage(); + for (int i = 0; i < 128; i++) { + smsg.setMessage(ShortMessage.POLY_PRESSURE,0, i, 10); + receiver.send(smsg, -1); + assertEquals(channel.getPolyPressure(i),10); + smsg.setMessage(ShortMessage.POLY_PRESSURE,0, i, 100); + receiver.send(smsg, -1); + assertEquals(channel.getPolyPressure(i),100); + } + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_ProgramChange.java b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_ProgramChange.java new file mode 100644 index 00000000000..a8b33e95749 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_ProgramChange.java @@ -0,0 +1,63 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_ProgramChange { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + ShortMessage smsg = new ShortMessage(); + smsg.setMessage(ShortMessage.PROGRAM_CHANGE,0, 36,0); + receiver.send(smsg, -1); + assertEquals(channel.getProgram(), 36); + smsg.setMessage(ShortMessage.PROGRAM_CHANGE,0, 48,0); + receiver.send(smsg, -1); + assertEquals(channel.getProgram(), 48); + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_ResetAllControllers.java b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_ResetAllControllers.java new file mode 100644 index 00000000000..62f6e2e8c61 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/Send_ResetAllControllers.java @@ -0,0 +1,136 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftReceiver send method */ + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Send_ResetAllControllers { + + public static boolean[] dontResetControls = new boolean[128]; + static { + for (int i = 0; i < dontResetControls.length; i++) + dontResetControls[i] = false; + + dontResetControls[0] = true; // Bank Select (MSB) + dontResetControls[32] = true; // Bank Select (LSB) + dontResetControls[7] = true; // Channel Volume (MSB) + dontResetControls[8] = true; // Balance (MSB) + dontResetControls[10] = true; // Pan (MSB) + dontResetControls[11] = true; // Expression (MSB) + dontResetControls[91] = true; // Effects 1 Depth (default: Reverb Send) + dontResetControls[92] = true; // Effects 2 Depth (default: Tremolo Depth) + dontResetControls[93] = true; // Effects 3 Depth (default: Chorus Send) + dontResetControls[94] = true; // Effects 4 Depth (default: Celeste [Detune] Depth) + dontResetControls[95] = true; // Effects 5 Depth (default: Phaser Depth) + dontResetControls[70] = true; // Sound Controller 1 (default: Sound Variation) + dontResetControls[71] = true; // Sound Controller 2 (default: Timbre / Harmonic Quality) + dontResetControls[72] = true; // Sound Controller 3 (default: Release Time) + dontResetControls[73] = true; // Sound Controller 4 (default: Attack Time) + dontResetControls[74] = true; // Sound Controller 5 (default: Brightness) + dontResetControls[75] = true; // Sound Controller 6 (GM2 default: Decay Time) + dontResetControls[76] = true; // Sound Controller 7 (GM2 default: Vibrato Rate) + dontResetControls[77] = true; // Sound Controller 8 (GM2 default: Vibrato Depth) + dontResetControls[78] = true; // Sound Controller 9 (GM2 default: Vibrato Delay) + dontResetControls[79] = true; // Sound Controller 10 (GM2 default: Undefined) + dontResetControls[120] = true; // All Sound Off + dontResetControls[121] = true; // Reset All Controllers + dontResetControls[122] = true; // Local Control On/Off + dontResetControls[123] = true; // All Notes Off + dontResetControls[124] = true; // Omni Mode Off + dontResetControls[125] = true; // Omni Mode On + dontResetControls[126] = true; // Poly Mode Off + dontResetControls[127] = true; // Poly Mode On + + dontResetControls[6] = true; // Data Entry (MSB) + dontResetControls[38] = true; // Data Entry (LSB) + dontResetControls[96] = true; // Data Increment + dontResetControls[97] = true; // Data Decrement + dontResetControls[98] = true; // Non-Registered Parameter Number (LSB) + dontResetControls[99] = true; // Non-Registered Parameter Number(MSB) + dontResetControls[100] = true; // RPN = Null + dontResetControls[101] = true; // RPN = Null + } + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTestUtils soft = new SoftTestUtils(); + MidiChannel channel = soft.synth.getChannels()[0]; + Receiver receiver = soft.synth.getReceiver(); + + // First let all controls contain non-default values + for (int i = 0; i < 128; i++) + channel.setPolyPressure(i, 10); + channel.setChannelPressure(10); + channel.setPitchBend(2192); + for (int i = 0; i < 120; i++) + channel.controlChange(i, 1); + + ShortMessage smsg = new ShortMessage(); + smsg.setMessage(ShortMessage.CONTROL_CHANGE,0, 121,0); + receiver.send(smsg, -1); + + // Now check if resetAllControllers did what it was suppose to do + + for (int i = 0; i < 128; i++) + assertEquals(channel.getPolyPressure(i), 0); + assertEquals(channel.getChannelPressure(), 0); + assertEquals(channel.getPitchBend(),8192); + for (int i = 0; i < 120; i++) + if(!dontResetControls[i]) + assertEquals(channel.getController(i), 0); + assertEquals(channel.getController(71), 64); // Filter Resonance + assertEquals(channel.getController(72), 64); // Release Time + assertEquals(channel.getController(73), 64); // Attack Time + assertEquals(channel.getController(74), 64); // Brightness + assertEquals(channel.getController(75), 64); // Decay Time + assertEquals(channel.getController(76), 64); // Vibrato Rate + assertEquals(channel.getController(77), 64); // Vibrato Depth + assertEquals(channel.getController(78), 64); // Vibrato Delay + assertEquals(channel.getController(8), 64); // Balance + assertEquals(channel.getController(11), 127); // Expression + assertEquals(channel.getController(98), 127); // NRPN Null + assertEquals(channel.getController(99), 127); // NRPN Null + assertEquals(channel.getController(100), 127); // RPN = Null + assertEquals(channel.getController(101), 127); // RPN = Null + + soft.close(); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftReceiver/SoftTestUtils.java b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/SoftTestUtils.java new file mode 100644 index 00000000000..f29983983d2 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftReceiver/SoftTestUtils.java @@ -0,0 +1,111 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +import java.io.IOException; + +import javax.sound.midi.*; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class SoftTestUtils { + + public AudioSynthesizer synth = new SoftSynthesizer(); + public AudioInputStream stream; + public byte[] tmpbuffer = new byte[1024]; + + public static SF2Soundbank createTestSoundBank() + { + SF2Soundbank sf2 = new SF2Soundbank(); + AudioFormat format = new AudioFormat(44100, 16, 1, true, false); + float[] data = new float[44100+1000]; + float fr = 440/format.getSampleRate(); + for (int i = 0; i < data.length; i++) + data[i] = (float)Math.sin(i*fr*2*Math.PI); + byte[] bdata = new byte[data.length*format.getFrameSize()]; + AudioFloatConverter.getConverter(format).toByteArray(data, bdata); + SF2Sample sample = new SF2Sample(sf2); + sample.setName("Test Sample"); + sample.setData(bdata); + sample.setStartLoop(500); + sample.setEndLoop(data.length - 500); + sample.setSampleRate((long) format.getSampleRate()); + sample.setOriginalPitch(69); + sf2.addResource(sample); + SF2Layer layer = new SF2Layer(sf2); + layer.setName("Test Layer"); + sf2.addResource(layer); + SF2LayerRegion region = new SF2LayerRegion(); + region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1); + region.setSample(sample); + layer.getRegions().add(region); + SF2Instrument ins = new SF2Instrument(sf2); + ins.setName("Test Instrument"); + sf2.addInstrument(ins); + SF2InstrumentRegion insregion = new SF2InstrumentRegion(); + insregion.setLayer(layer); + ins.getRegions().add(insregion); + + return sf2; + } + + public SoftTestUtils() throws Exception { + stream = synth.openStream(null, null); + synth.unloadAllInstruments(synth.getDefaultSoundbank()); + synth.loadAllInstruments(createTestSoundBank()); + } + + public void close() throws Exception { + stream.close(); + stream = null; + synth.close(); + synth = null; + } + + public void read(double seconds) throws IOException + { + int bufflen = + stream.getFormat().getFrameSize() * + (int)(stream.getFormat().getFrameRate() * seconds); + while(bufflen != 0) + { + if(bufflen > 1024) + bufflen -= stream.read(tmpbuffer,0,1024); + else + bufflen -= stream.read(tmpbuffer,0, bufflen); + } + } + + public VoiceStatus findVoice(int channel, int note) { + VoiceStatus[] v = synth.getVoiceStatus(); + for (int k = 0; k < v.length; k++) + if(v[k].active) + if(v[k].channel == channel) + if(v[k].note == note) + return v[k]; + return null; + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSincResampler/Interpolate.java b/jdk/test/javax/sound/midi/Gervill/SoftSincResampler/Interpolate.java new file mode 100644 index 00000000000..b5ca59784e2 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSincResampler/Interpolate.java @@ -0,0 +1,113 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSincResampler interpolate method */ + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Interpolate { + + private static float getResamplerTestValue(double i) + { + return (float)Math.sin(i / 10.0); + } + + private static void perfectInterpolation(float[] in_offset, float in_end, + float[] startpitch, float pitchstep, float[] out, int[] out_offset, + int out_end) { + + float pitch = startpitch[0]; + float ix = in_offset[0]; + int ox = out_offset[0]; + float ix_end = in_end; + int ox_end = out_end; + if (pitchstep == 0f) { + while (ix < ix_end && ox < ox_end) { + out[ox++] = getResamplerTestValue(ix); + ix += pitch; + } + } else { + while (ix < ix_end && ox < ox_end) { + out[ox++] = getResamplerTestValue(ix); + ix += pitch; + pitch += pitchstep; + } + } + in_offset[0] = ix; + out_offset[0] = ox; + startpitch[0] = pitch; + + } + + private static float testResampler(SoftAbstractResampler resampler, float p_pitch, float p_pitch2) + { + float[] testbuffer = new float[4096]; + float[] testbuffer2 = new float[1024]; + float[] testbuffer3 = new float[1024]; + for (int i = 0; i < testbuffer.length; i++) + testbuffer[i] = getResamplerTestValue(i); + int pads = resampler.getPadding(); + float pitchstep = (p_pitch2 - p_pitch)/1024f; + int[] out_offset2 = {0}; + int[] out_offset3 = {0}; + resampler.interpolate(testbuffer, new float[] {pads}, testbuffer.length - pads, new float[] {p_pitch}, pitchstep, testbuffer2, out_offset2, testbuffer2.length); + perfectInterpolation(new float[] {pads}, testbuffer.length - pads, new float[] {p_pitch}, pitchstep, testbuffer3, out_offset3, testbuffer3.length); + int out_off = out_offset2[0]; + if(out_offset3[0] < out_off) + out_off = out_offset3[0]; + float ac_error = 0; + int counter = 0; + for (int i = pads; i < out_off; i++) { + ac_error += Math.abs(testbuffer2[i] - testbuffer3[i]); + counter++; + } + return ac_error / ((float)counter); + } + + private static void fail(String error) throws Exception + { + throw new RuntimeException(error); + } + + public static void main(String[] args) throws Exception { + SoftSincResampler resampler = new SoftSincResampler(); + float max = testResampler(resampler, 0.3f, 0.3f); + if(max > 0.0001) + fail("Interpolation failed, error="+max); + max = testResampler(resampler, 0.3f, 0.01f); + if(max > 0.0001) + fail("Interpolation failed, error="+max); + max = testResampler(resampler, 1.0f, 0.00f); + if(max > 0.0001) + fail("Interpolation failed, error="+max); + } +} \ No newline at end of file diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/Close.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/Close.java new file mode 100644 index 00000000000..a36ee01791a --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/Close.java @@ -0,0 +1,58 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer close method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class Close { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + synth.close(); + assertTrue(!synth.isOpen()); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/DummySourceDataLine.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/DummySourceDataLine.java new file mode 100644 index 00000000000..c9ea327c53b --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/DummySourceDataLine.java @@ -0,0 +1,232 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +import java.util.ArrayList; + +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.Control; +import javax.sound.sampled.DataLine; +import javax.sound.sampled.LineListener; +import javax.sound.sampled.LineUnavailableException; +import javax.sound.sampled.SourceDataLine; +import javax.sound.sampled.AudioFormat.Encoding; +import javax.sound.sampled.Control.Type; + +import com.sun.media.sound.AudioFloatConverter; + +/** + * This is a SourceDataLine simulator used for testing SoftSynthesizer + * without using real SourceDataLine / Audio Device. + * + * @author Karl Helgason + */ + +public class DummySourceDataLine implements SourceDataLine { + + private int bufferSize = -1; + + private AudioFormat format = new AudioFormat(44100.0f, 16, 2, true, false); + + private DataLine.Info sourceLineInfo; + + private boolean active = false; + + private long framepos = 0; + + private boolean opened = false; + + private int framesize = 0; + + public DummySourceDataLine() + { + ArrayList formats = new ArrayList(); + for (int channels = 1; channels <= 2; channels++) { + formats.add(new AudioFormat(Encoding.PCM_SIGNED, + AudioSystem.NOT_SPECIFIED, 8, channels, channels, + AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(Encoding.PCM_UNSIGNED, + AudioSystem.NOT_SPECIFIED, 8, channels, channels, + AudioSystem.NOT_SPECIFIED, false)); + for (int bits = 16; bits < 32; bits += 8) { + formats.add(new AudioFormat(Encoding.PCM_SIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(Encoding.PCM_UNSIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(Encoding.PCM_SIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, true)); + formats.add(new AudioFormat(Encoding.PCM_UNSIGNED, + AudioSystem.NOT_SPECIFIED, bits, channels, channels + * bits / 8, AudioSystem.NOT_SPECIFIED, true)); + } + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 32, channels, channels * 4, + AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 32, channels, channels * 4, + AudioSystem.NOT_SPECIFIED, true)); + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 64, channels, channels * 8, + AudioSystem.NOT_SPECIFIED, false)); + formats.add(new AudioFormat(AudioFloatConverter.PCM_FLOAT, + AudioSystem.NOT_SPECIFIED, 64, channels, channels * 8, + AudioSystem.NOT_SPECIFIED, true)); + } + AudioFormat[] formats_array = formats.toArray(new AudioFormat[formats + .size()]); + sourceLineInfo = new DataLine.Info(SourceDataLine.class, + formats_array, AudioSystem.NOT_SPECIFIED, + AudioSystem.NOT_SPECIFIED); + + } + + public void open() throws LineUnavailableException { + open(format); + } + + public void open(AudioFormat format) throws LineUnavailableException { + if (bufferSize == -1) + bufferSize = ((int) (format.getFrameRate() / 2)) + * format.getFrameSize(); + open(format, bufferSize); + } + + public void open(AudioFormat format, int bufferSize) + throws LineUnavailableException { + this.format = format; + this.bufferSize = bufferSize; + this.framesize = format.getFrameSize(); + opened = true; + } + + public boolean isOpen() { + return opened; + } + + public int write(byte[] b, int off, int len) { + if (!isOpen()) + return 0; + if (len % framesize != 0) + throw new IllegalArgumentException( + "Number of bytes does not represent an integral number of sample frames."); + + + int flen = len / framesize; + framepos += flen; + + long time = (long) (flen * (1000.0 / (double) getFormat() + .getSampleRate())); + try { + Thread.sleep(time); + } catch (InterruptedException e) { + e.printStackTrace(); + return 0; + } + + return len; + } + + public int available() { + return 0; + } + + public void drain() { + } + + public void flush() { + } + + public int getBufferSize() { + return bufferSize; + } + + public AudioFormat getFormat() { + return format; + } + + public int getFramePosition() { + return (int) getLongFramePosition(); + } + + public float getLevel() { + return AudioSystem.NOT_SPECIFIED; + } + + public long getLongFramePosition() { + return framepos; + } + + public long getMicrosecondPosition() { + return (long) (getLongFramePosition() * (1000000.0 / (double) getFormat() + .getSampleRate())); + } + + public boolean isActive() { + return active; + } + + public boolean isRunning() { + return active; + } + + public void start() { + active = true; + } + + public void stop() { + active = false; + } + + public void close() { + stop(); + } + + public Control getControl(Type control) { + throw new IllegalArgumentException("Unsupported control type : " + + control); + } + + public Control[] getControls() { + return new Control[0]; + } + + public javax.sound.sampled.Line.Info getLineInfo() { + return sourceLineInfo; + } + + public boolean isControlSupported(Type control) { + return false; + } + + public void addLineListener(LineListener listener) { + } + + public void removeLineListener(LineListener listener) { + } + +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetAvailableInstruments.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetAvailableInstruments.java new file mode 100644 index 00000000000..3711e6bfd02 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetAvailableInstruments.java @@ -0,0 +1,63 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getAvailableInstruments method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetAvailableInstruments { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + Soundbank defsbk = synth.getDefaultSoundbank(); + if(defsbk != null) + { + assertTrue(defsbk.getInstruments().length == synth.getAvailableInstruments().length); + } + synth.close(); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetChannels.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetChannels.java new file mode 100644 index 00000000000..15191c824eb --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetChannels.java @@ -0,0 +1,64 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getChannels method */ + +import javax.sound.midi.MidiChannel; +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetChannels { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + assertTrue(synth.getChannels() != null); + assertTrue(synth.getChannels().length == 16); + MidiChannel[] channels = synth.getChannels(); + for (int i = 0; i < channels.length; i++) { + assertTrue(channels[i] != null); + } + synth.close(); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetDefaultSoundbank.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetDefaultSoundbank.java new file mode 100644 index 00000000000..f78bd5b620d --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetDefaultSoundbank.java @@ -0,0 +1,58 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getDefaultSoundbank method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetDefaultSoundbank { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + assertTrue(synth.getDefaultSoundbank() != null); + synth.close(); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetDeviceInfo.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetDeviceInfo.java new file mode 100644 index 00000000000..1b8fbf84d9d --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetDeviceInfo.java @@ -0,0 +1,56 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getDeviceInfo method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetDeviceInfo { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + assertTrue(synth.getDeviceInfo() != null); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetLatency.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetLatency.java new file mode 100644 index 00000000000..4d9a76514af --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetLatency.java @@ -0,0 +1,58 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getLatency method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetLatency { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.open(new DummySourceDataLine(), null); + assertTrue(synth.getLatency() != -1); + synth.close(); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetLoadedInstruments.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetLoadedInstruments.java new file mode 100644 index 00000000000..7902595aeca --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetLoadedInstruments.java @@ -0,0 +1,65 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getLoadedInstruments method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetLoadedInstruments { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + Soundbank defsbk = synth.getDefaultSoundbank(); + if(defsbk != null) + { + synth.unloadAllInstruments(defsbk); + synth.loadAllInstruments(defsbk); + assertTrue(synth.getLoadedInstruments().length != 0); + } + synth.close(); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetMaxPolyphony.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetMaxPolyphony.java new file mode 100644 index 00000000000..95d034c1d5a --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetMaxPolyphony.java @@ -0,0 +1,58 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getMaxPolyphony method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetMaxPolyphony { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + assertTrue(synth.getMaxPolyphony() != -1); + synth.close(); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetMaxReceivers.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetMaxReceivers.java new file mode 100644 index 00000000000..0b5e2f4f069 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetMaxReceivers.java @@ -0,0 +1,56 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getMaxReceivers method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetMaxReceivers { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + assertTrue(synth.getMaxReceivers() == -1); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetMaxTransmitters.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetMaxTransmitters.java new file mode 100644 index 00000000000..0cfeb784b53 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetMaxTransmitters.java @@ -0,0 +1,56 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getMaxTransmitters method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetMaxTransmitters { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + assertTrue(synth.getMaxTransmitters() == 0); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetMicrosecondPosition.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetMicrosecondPosition.java new file mode 100644 index 00000000000..080ab599380 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetMicrosecondPosition.java @@ -0,0 +1,64 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getMicrosecondPosition method */ + +import java.io.IOException; + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetMicrosecondPosition { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + AudioInputStream stream = synth.openStream(null, null); + assertTrue(synth.getMicrosecondPosition() == 0); + AudioFormat format = stream.getFormat(); + byte[] buff = new byte[((int)format.getFrameRate())*format.getFrameSize()];; + stream.read(buff); + assertTrue(Math.abs(synth.getMicrosecondPosition()-1000000) < 10000); + synth.close(); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetReceiver.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetReceiver.java new file mode 100644 index 00000000000..88ba59bb3b6 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetReceiver.java @@ -0,0 +1,63 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getReceiver method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.midi.Receiver; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetReceiver { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.open(new DummySourceDataLine(), null); + Receiver recv = synth.getReceiver(); + assertTrue(recv != null); + Receiver recv2 = synth.getReceiver(); + assertTrue(recv2 != null); + assertTrue(recv2 != recv); + synth.close(); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetReceiver2.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetReceiver2.java new file mode 100644 index 00000000000..012de3fb21a --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetReceiver2.java @@ -0,0 +1,62 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getReceiver method */ + +import javax.sound.midi.Receiver; +import javax.sound.midi.ShortMessage; + +import com.sun.media.sound.AudioSynthesizer; +import com.sun.media.sound.SoftSynthesizer; + +public class GetReceiver2 { + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + Receiver recv = synth.getReceiver(); + assertTrue(recv != null); + ShortMessage sm = new ShortMessage(); + sm.setMessage(ShortMessage.NOTE_OFF, 0, 64, 64); + synth.open(new DummySourceDataLine(), null); + recv.send(sm, -1); + synth.close(); + try + { + recv.send(sm, -1); + throw new RuntimeException("Exception not thrown!"); + } + catch(Exception e) + { + // Just checking if exception is thrown + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetReceivers.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetReceivers.java new file mode 100644 index 00000000000..b7937039a3e --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetReceivers.java @@ -0,0 +1,63 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getReceivers method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.midi.Receiver; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetReceivers { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.open(new DummySourceDataLine(), null); + assertTrue(synth.getReceivers().size() == 0); + Receiver recv = synth.getReceiver(); + assertTrue(synth.getReceivers().size() == 1); + recv.close(); + assertTrue(synth.getReceivers().size() == 0); + synth.close(); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetTransmitter.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetTransmitter.java new file mode 100644 index 00000000000..d65ec380963 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetTransmitter.java @@ -0,0 +1,63 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getTransmitter method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetTransmitter { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.open(new DummySourceDataLine(), null); + try + { + synth.getTransmitter(); + throw new Exception("MidiUnavailableException not thrown!"); + } catch (MidiUnavailableException e) { + } + synth.close(); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetTransmitters.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetTransmitters.java new file mode 100644 index 00000000000..ac6addc6b35 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetTransmitters.java @@ -0,0 +1,58 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getTransmitters method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetTransmitters { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.open(new DummySourceDataLine(), null); + assertTrue(synth.getTransmitters().size() == 0); + synth.close(); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetVoiceStatus.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetVoiceStatus.java new file mode 100644 index 00000000000..327e29342c0 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/GetVoiceStatus.java @@ -0,0 +1,61 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer getVoiceStatus method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.midi.VoiceStatus; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class GetVoiceStatus { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + VoiceStatus[] v = synth.getVoiceStatus(); + assertTrue(v != null); + assertTrue(synth.getChannels().length != synth.getMaxPolyphony()); + synth.close(); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/ImplicitOpenClose.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/ImplicitOpenClose.java new file mode 100644 index 00000000000..15379d5601c --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/ImplicitOpenClose.java @@ -0,0 +1,105 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer implicit open/close using getReceiver. */ + +import java.lang.reflect.Field; + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiSystem; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.midi.Receiver; +import javax.sound.midi.Synthesizer; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class ImplicitOpenClose { + + public static void main(String[] args) throws Exception { + Field f = SoftSynthesizer.class.getDeclaredField("testline"); + f.setAccessible(true); + f.set(null, new DummySourceDataLine()); + + Synthesizer synth = new SoftSynthesizer(); + + ReferenceCountingDevice rcd = (ReferenceCountingDevice)synth; + + // Test single open/close cycle + + Receiver recv = rcd.getReceiverReferenceCounting(); + if(!synth.isOpen()) + throw new Exception("Synthesizer not open!"); + recv.close(); + if(synth.isOpen()) + throw new Exception("Synthesizer not closed!"); + + // Test using 2 receiver cycle + + Receiver recv1 = rcd.getReceiverReferenceCounting(); + if(!synth.isOpen()) + throw new Exception("Synthesizer not open!"); + Receiver recv2 = rcd.getReceiverReferenceCounting(); + if(!synth.isOpen()) + throw new Exception("Synthesizer not open!"); + + recv2.close(); + if(!synth.isOpen()) + throw new Exception("Synthesizer was closed!"); + recv1.close(); + if(synth.isOpen()) + throw new Exception("Synthesizer not closed!"); + + // Test for explicit,implicit conflict + + synth.open(); + Receiver recv3 = rcd.getReceiverReferenceCounting(); + if(!synth.isOpen()) + throw new Exception("Synthesizer not open!"); + recv3.close(); + if(!synth.isOpen()) + throw new Exception("Synthesizer was closed!"); + synth.close(); + if(synth.isOpen()) + throw new Exception("Synthesizer not closed!"); + + // Test for implicit,explicit conflict + + recv3 = rcd.getReceiverReferenceCounting(); + synth.open(); + if(!synth.isOpen()) + throw new Exception("Synthesizer not open!"); + recv3.close(); + if(!synth.isOpen()) + throw new Exception("Synthesizer was closed!"); + synth.close(); + if(synth.isOpen()) + throw new Exception("Synthesizer not closed!"); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/IsOpen.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/IsOpen.java new file mode 100644 index 00000000000..27c5559a02a --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/IsOpen.java @@ -0,0 +1,59 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer isOpen method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class IsOpen { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + assertTrue(synth.isOpen()); + synth.close(); + assertTrue(!synth.isOpen()); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/IsSoundbankSupported.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/IsSoundbankSupported.java new file mode 100644 index 00000000000..0a8879c532c --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/IsSoundbankSupported.java @@ -0,0 +1,95 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer isSoundbankSupported method */ + +import javax.sound.midi.Instrument; +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; +import javax.sound.midi.SoundbankResource; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class IsSoundbankSupported { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + SimpleSoundbank sbk = new SimpleSoundbank(); + SimpleInstrument ins = new SimpleInstrument(); + sbk.addInstrument(ins); + assertTrue(synth.isSoundbankSupported(sbk)); + Soundbank dummysbk = new Soundbank() + { + public String getName() { + return null; + } + public String getVersion() { + return null; + } + public String getVendor() { + return null; + } + public String getDescription() { + return null; + } + public SoundbankResource[] getResources() { + return null; + } + public Instrument[] getInstruments() { + Instrument ins = new Instrument(null, null, null, null) + { + public Object getData() { + return null; + } + }; + return new Instrument[] {ins}; + } + public Instrument getInstrument(Patch patch) { + return null; + } + }; + assertTrue(!synth.isSoundbankSupported(dummysbk)); + synth.close(); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/LoadAllInstruments.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/LoadAllInstruments.java new file mode 100644 index 00000000000..c97b8a1ce8d --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/LoadAllInstruments.java @@ -0,0 +1,73 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer loadAllInstruments method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class LoadAllInstruments { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + Soundbank defsbk = synth.getDefaultSoundbank(); + if(defsbk != null) + { + assertTrue(synth.getLoadedInstruments().length == 0); + synth.unloadAllInstruments(defsbk); + SimpleSoundbank sbk = new SimpleSoundbank(); + SimpleInstrument ins = new SimpleInstrument(); + ins.setPatch(new Patch(0,1)); + sbk.addInstrument(ins); + SimpleInstrument ins2 = new SimpleInstrument(); + ins2.setPatch(new Patch(0,2)); + sbk.addInstrument(ins2); + synth.loadAllInstruments(sbk); + assertTrue(synth.getLoadedInstruments().length == 2); + } + synth.close(); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/LoadInstrument.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/LoadInstrument.java new file mode 100644 index 00000000000..2a2db707cb6 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/LoadInstrument.java @@ -0,0 +1,73 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer loadAllInstrument method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class LoadInstrument { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + Soundbank defsbk = synth.getDefaultSoundbank(); + if(defsbk != null) + { + assertTrue(synth.getLoadedInstruments().length == 0); + synth.unloadAllInstruments(defsbk); + SimpleSoundbank sbk = new SimpleSoundbank(); + SimpleInstrument ins = new SimpleInstrument(); + ins.setPatch(new Patch(0,1)); + sbk.addInstrument(ins); + SimpleInstrument ins2 = new SimpleInstrument(); + ins2.setPatch(new Patch(0,2)); + sbk.addInstrument(ins2); + synth.loadInstrument(ins2); + assertTrue(synth.getLoadedInstruments().length == 1); + } + synth.close(); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/LoadInstruments.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/LoadInstruments.java new file mode 100644 index 00000000000..bfdeb3eb7cd --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/LoadInstruments.java @@ -0,0 +1,73 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer loadAllInstruments method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class LoadInstruments { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + Soundbank defsbk = synth.getDefaultSoundbank(); + if(defsbk != null) + { + assertTrue(synth.getLoadedInstruments().length == 0); + synth.unloadAllInstruments(defsbk); + SimpleSoundbank sbk = new SimpleSoundbank(); + SimpleInstrument ins = new SimpleInstrument(); + ins.setPatch(new Patch(0,1)); + sbk.addInstrument(ins); + SimpleInstrument ins2 = new SimpleInstrument(); + ins2.setPatch(new Patch(0,2)); + sbk.addInstrument(ins2); + synth.loadInstruments(sbk, new Patch[] {ins2.getPatch()}); + assertTrue(synth.getLoadedInstruments().length == 1); + } + synth.close(); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/Open.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/Open.java new file mode 100644 index 00000000000..332fd8bcd4c --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/Open.java @@ -0,0 +1,64 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer open method */ + +import java.lang.reflect.Field; + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class Open { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + Field f = SoftSynthesizer.class.getDeclaredField("testline"); + f.setAccessible(true); + f.set(null, new DummySourceDataLine()); + + AudioSynthesizer synth = new SoftSynthesizer(); + synth.open(); + assertTrue(synth.isOpen()); + synth.close(); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/OpenStream.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/OpenStream.java new file mode 100644 index 00000000000..5defef66791 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/OpenStream.java @@ -0,0 +1,58 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer openStream method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class OpenStream { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + assertTrue(synth.isOpen()); + synth.close(); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/RemapInstrument.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/RemapInstrument.java new file mode 100644 index 00000000000..6c21fe1f5d2 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/RemapInstrument.java @@ -0,0 +1,76 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer remapInstrument method */ + +import javax.sound.midi.Instrument; +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class RemapInstrument { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + Soundbank defsbk = synth.getDefaultSoundbank(); + if(defsbk != null) + { + Instrument ins0 = defsbk.getInstrument(new Patch(0,0)); + Instrument ins10 = defsbk.getInstrument(new Patch(0,10)); + assertTrue(synth.remapInstrument(ins0, ins10)); + Instrument[] loaded = synth.getLoadedInstruments(); + for (int i = 0; i < loaded.length; i++) { + if(loaded[i].getPatch().getBank() == 0) + if(loaded[i].getPatch().getProgram() == 10) + { + assertEquals(loaded[i].getName(), ins0.getName()); + break; + } + } + + } + synth.close(); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/TestRender1.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/TestRender1.java new file mode 100644 index 00000000000..56a2ef8caf2 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/TestRender1.java @@ -0,0 +1,214 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer simple note rendering in many settings */ + +import java.io.File; +import java.io.FileInputStream; +import java.io.BufferedInputStream; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.HashMap; +import java.util.Map; + +import javax.sound.sampled.*; +import javax.sound.midi.*; + +import com.sun.media.sound.*; + +public class TestRender1 { + + public static double send(Sequence seq, Receiver recv) { + float divtype = seq.getDivisionType(); + assert (seq.getDivisionType() == Sequence.PPQ); + Track[] tracks = seq.getTracks(); + int[] trackspos = new int[tracks.length]; + int mpq = 60000000 / 100; + int seqres = seq.getResolution(); + long lasttick = 0; + long curtime = 0; + while (true) { + MidiEvent selevent = null; + int seltrack = -1; + for (int i = 0; i < tracks.length; i++) { + int trackpos = trackspos[i]; + Track track = tracks[i]; + if (trackpos < track.size()) { + MidiEvent event = track.get(trackpos); + if (selevent == null + || event.getTick() < selevent.getTick()) { + selevent = event; + seltrack = i; + } + } + } + if (seltrack == -1) + break; + trackspos[seltrack]++; + long tick = selevent.getTick(); + if (divtype == Sequence.PPQ) + curtime += ((tick - lasttick) * mpq) / seqres; + else + curtime = (long) ((tick * 1000000.0 * divtype) / seqres); + lasttick = tick; + MidiMessage msg = selevent.getMessage(); + if (msg instanceof MetaMessage) { + if (divtype == Sequence.PPQ) + if (((MetaMessage) msg).getType() == 0x51) { + byte[] data = ((MetaMessage) msg).getData(); + mpq = ((data[0] & 0xff) << 16) + | ((data[1] & 0xff) << 8) | (data[2] & 0xff); + } + } else { + if (recv != null) + recv.send(msg, curtime); + } + } + + return curtime / 1000000.0; + } + + public static void test(AudioFormat format, Map info) + throws Exception { + OutputStream nullout = new OutputStream() { + public void write(int b) throws IOException { + } + + public void write(byte[] b, int off, int len) throws IOException { + } + + public void write(byte[] b) throws IOException { + } + }; + render(nullout, format, info); + } + + public static void render(OutputStream os, AudioFormat format, + Map info) throws Exception { + AudioSynthesizer synth = (AudioSynthesizer) new SoftSynthesizer(); + AudioInputStream stream = synth.openStream(format, info); + Receiver recv = synth.getReceiver(); + Soundbank defsbk = synth.getDefaultSoundbank(); + if (defsbk != null) + synth.unloadAllInstruments(defsbk); + synth.loadAllInstruments(soundbank); + + double totalTime = 5; + send(sequence, recv); + + long len = (long) (stream.getFormat().getFrameRate() * (totalTime + 4)); + stream = new AudioInputStream(stream, stream.getFormat(), len); + + long t = System.currentTimeMillis(); + AudioSystem.write(stream, AudioFileFormat.Type.WAVE, os); + t = System.currentTimeMillis() - t; + stream.close(); + } + + + static Soundbank soundbank; + + static Sequence sequence; + + public static InputStream getInputStream(String filename) throws IOException + { + File file = new File(System.getProperty("test.src", "."), filename); + FileInputStream fis = new FileInputStream(file); + return new BufferedInputStream(fis); + } + + public static void main(String[] args) throws Exception { + + InputStream sb = getInputStream("ding.sf2"); + soundbank = MidiSystem.getSoundbank(sb); + sb.close(); + + InputStream si = getInputStream("expresso.mid"); + sequence = MidiSystem.getSequence(si); + si.close(); + + AudioFormat format; + Map info = new HashMap(); + { + format = new AudioFormat(22050, 16, 2, true, false); + test(format, info); + format = new AudioFormat(44100, 16, 2, true, false); + test(format, info); + } + { + format = new AudioFormat(44100, 8, 2, true, false); + test(format, info); + format = new AudioFormat(44100, 16, 2, true, false); + test(format, info); + format = new AudioFormat(44100, 24, 2, true, false); + test(format, info); + } + { + format = new AudioFormat(44100, 16, 1, true, false); + test(format, info); + format = new AudioFormat(44100, 16, 2, true, false); + test(format, info); + } + { + format = new AudioFormat(44100, 16, 2, true, false); + + info.clear(); + info.put("control rate", 100f); + test(format, info); + info.clear(); + info.put("control rate", 147f); + test(format, info); + + } + { + format = new AudioFormat(44100, 16, 2, true, false); + + info.clear(); + info.put("interpolation", "point"); + test(format, info); + info.clear(); + info.put("interpolation", "linear"); + test(format, info); + info.clear(); + info.put("interpolation", "cubic"); + test(format, info); + } + { + format = new AudioFormat(44100, 16, 2, true, false); + info.clear(); + info.put("max polyphony", 4); + test(format, info); + info.clear(); + info.put("max polyphony", 16); + test(format, info); + info.clear(); + + } + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/UnloadAllInstruments.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/UnloadAllInstruments.java new file mode 100644 index 00000000000..e3ded2e8265 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/UnloadAllInstruments.java @@ -0,0 +1,69 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer unloadAllInstruments method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class UnloadAllInstruments { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + Soundbank defsbk = synth.getDefaultSoundbank(); + if(defsbk != null) + { + assertTrue(synth.getLoadedInstruments().length == 0); + synth.unloadAllInstruments(defsbk); + assertTrue(synth.getAvailableInstruments().length == 0); + synth.loadAllInstruments(defsbk); + assertTrue(synth.getLoadedInstruments().length != 0); + synth.unloadAllInstruments(defsbk); + assertTrue(synth.getLoadedInstruments().length == 0); + } + synth.close(); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/UnloadInstrument.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/UnloadInstrument.java new file mode 100644 index 00000000000..06fc326b722 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/UnloadInstrument.java @@ -0,0 +1,75 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer unloadInstrument method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class UnloadInstrument { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + Soundbank defsbk = synth.getDefaultSoundbank(); + if(defsbk != null) + { + assertTrue(synth.getLoadedInstruments().length == 0); + synth.unloadAllInstruments(defsbk); + SimpleSoundbank sbk = new SimpleSoundbank(); + SimpleInstrument ins = new SimpleInstrument(); + ins.setPatch(new Patch(0,1)); + sbk.addInstrument(ins); + SimpleInstrument ins2 = new SimpleInstrument(); + ins2.setPatch(new Patch(0,2)); + sbk.addInstrument(ins2); + synth.loadInstrument(ins2); + assertTrue(synth.getLoadedInstruments().length == 1); + synth.unloadInstrument(ins2); + assertTrue(synth.getLoadedInstruments().length == 0); + } + synth.close(); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/UnloadInstruments.java b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/UnloadInstruments.java new file mode 100644 index 00000000000..01f23f27c20 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/UnloadInstruments.java @@ -0,0 +1,75 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftSynthesizer unloadInstruments method */ + +import javax.sound.midi.MidiDevice; +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.midi.Soundbank; +import javax.sound.sampled.*; +import javax.sound.midi.MidiDevice.Info; + +import com.sun.media.sound.*; + +public class UnloadInstruments { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + AudioSynthesizer synth = new SoftSynthesizer(); + synth.openStream(null, null); + Soundbank defsbk = synth.getDefaultSoundbank(); + if(defsbk != null) + { + assertTrue(synth.getLoadedInstruments().length == 0); + synth.unloadAllInstruments(defsbk); + SimpleSoundbank sbk = new SimpleSoundbank(); + SimpleInstrument ins = new SimpleInstrument(); + ins.setPatch(new Patch(0,1)); + sbk.addInstrument(ins); + SimpleInstrument ins2 = new SimpleInstrument(); + ins2.setPatch(new Patch(0,2)); + sbk.addInstrument(ins2); + synth.loadInstrument(ins2); + assertTrue(synth.getLoadedInstruments().length == 1); + synth.unloadInstruments(sbk, new Patch[] {ins2.getPatch()}); + assertTrue(synth.getLoadedInstruments().length == 0); + } + synth.close(); + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/ding.sf2 b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/ding.sf2 new file mode 100644 index 00000000000..86327f056a4 Binary files /dev/null and b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/ding.sf2 differ diff --git a/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/expresso.mid b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/expresso.mid new file mode 100644 index 00000000000..816d0e03393 Binary files /dev/null and b/jdk/test/javax/sound/midi/Gervill/SoftSynthesizer/expresso.mid differ diff --git a/jdk/test/javax/sound/midi/Gervill/SoftTuning/GetName.java b/jdk/test/javax/sound/midi/Gervill/SoftTuning/GetName.java new file mode 100644 index 00000000000..d869b49956c --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftTuning/GetName.java @@ -0,0 +1,54 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftTuning getName method */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetName { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTuning tuning = new SoftTuning(); + tuning.setName("custom"); + assertEquals(tuning.getName(), "custom"); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftTuning/GetTuning.java b/jdk/test/javax/sound/midi/Gervill/SoftTuning/GetTuning.java new file mode 100644 index 00000000000..f3187d0333e --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftTuning/GetTuning.java @@ -0,0 +1,56 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftTuning getTuning method */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetTuning { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTuning tuning = new SoftTuning(); + double[] tunings = tuning.getTuning(); + for (int i = 0; i < tunings.length; i++) { + assertTrue(Math.abs(tunings[i]-i*100) < 0.00001); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftTuning/GetTuningInt.java b/jdk/test/javax/sound/midi/Gervill/SoftTuning/GetTuningInt.java new file mode 100644 index 00000000000..2b9fbf7f2e1 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftTuning/GetTuningInt.java @@ -0,0 +1,53 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftTuning getTuning(int) method */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class GetTuningInt { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTuning tuning = new SoftTuning(); + assertTrue(Math.abs(tuning.getTuning(36)-3600) < 0.00001); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load1.java b/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load1.java new file mode 100644 index 00000000000..3ba88574166 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load1.java @@ -0,0 +1,101 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftTuning load method */ + +import java.io.UnsupportedEncodingException; + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Load1 { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + // http://www.midi.org/about-midi/tuning.shtml + // 0x01 BULK TUNING DUMP + SoftTuning tuning = new SoftTuning(); + byte[] name; + name = "Testing123 ".getBytes("ascii"); + + int[] msg = new int[24+3*128]; + int[] head = {0xf0,0x7e,0x7f,0x08,0x01,0x00}; + int ox = 0; + for (int i = 0; i < head.length; i++) + msg[ox++] = head[i]; + for (int i = 0; i < name.length; i++) + msg[ox++] = name[i]; + for (int i = 0; i < 128; i++) { + msg[ox++] = i; + msg[ox++] = 64; + msg[ox++] = 0; + } + + // Calc checksum + int x = msg[1] & 0xFF; // 7E + x = x ^ (msg[2] & 0xFF); // + x = x ^ (msg[4] & 0xFF); // nn + x = x ^ (msg[5] & 0xFF); // tt + for (int i = 22; i < msg.length - 2; i++) + x = x ^ (msg[i] & 0xFF); + msg[ox++] = (x & 127); + + msg[ox++] = 0xf7; + byte[] bmsg = new byte[msg.length]; + for (int i = 0; i < bmsg.length; i++) + bmsg[i] = (byte)msg[i]; + + tuning.load(bmsg); + assertEquals(tuning.getName(), "Testing123 "); + double[] tunings = tuning.getTuning(); + for (int i = 0; i < tunings.length; i++) + assertTrue(Math.abs(tunings[i]-(i*100 + 50)) < 0.00001); + + // Check if tuning fails if checksum is wrong + /* + msg[msg.length - 2] += 10; + for (int i = 0; i < bmsg.length; i++) + bmsg[i] = (byte)msg[i]; + tuning = new SoftTuning(); + tuning.load(bmsg); + assertTrue(!tuning.getName().equals("Testing123 ")); + */ + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load2.java b/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load2.java new file mode 100644 index 00000000000..e3c614b1538 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load2.java @@ -0,0 +1,71 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftTuning load method */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Load2 { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + // http://www.midi.org/about-midi/tuning.shtml + // 0x02 SINGLE NOTE TUNING CHANGE (REAL-TIME) + SoftTuning tuning = new SoftTuning(); + int[] msg = {0xf0,0x7f,0x7f,0x08,0x02,0x10,0x02, + 36,36,64,0, + 40,70,0,0, + 0xf7}; + byte[] bmsg = new byte[msg.length]; + for (int i = 0; i < bmsg.length; i++) + bmsg[i] = (byte)msg[i]; + tuning.load(bmsg); + double[] tunings = tuning.getTuning(); + for (int i = 0; i < tunings.length; i++) { + if(i == 36) + assertTrue(Math.abs(tunings[i]-3650)< 0.00001); + else if(i == 40) + assertTrue(Math.abs(tunings[i]-7000) < 0.00001); + else + assertTrue(Math.abs(tunings[i]-i*100) < 0.00001); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load4.java b/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load4.java new file mode 100644 index 00000000000..158e56990fc --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load4.java @@ -0,0 +1,104 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftTuning load method */ + +import java.io.UnsupportedEncodingException; + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Load4 { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + // http://www.midi.org/about-midi/tuning_extens.shtml + // 0x04 KEY-BASED TUNING DUMP + SoftTuning tuning = new SoftTuning(); + byte[] name; + name = "Testing123 ".getBytes("ascii"); + + int[] msg = new int[25+3*128]; + int[] head = {0xf0,0x7e,0x7f,0x08,0x04,0x00,0x00}; + int ox = 0; + for (int i = 0; i < head.length; i++) + msg[ox++] = head[i]; + for (int i = 0; i < name.length; i++) + msg[ox++] = name[i]; + for (int i = 0; i < 128; i++) { + msg[ox++] = i; + msg[ox++] = 64; + msg[ox++] = 0; + } + + // Calc checksum + int x = msg[1] & 0xFF; + for (int i = 2; i < msg.length - 2; i++) + x = x ^ (msg[i] & 0xFF); + msg[ox++] = (x & 127); + + msg[ox++] = 0xf7; + byte[] bmsg = new byte[msg.length]; + for (int i = 0; i < bmsg.length; i++) + bmsg[i] = (byte)msg[i]; + + tuning.load(bmsg); + assertEquals(tuning.getName(), "Testing123 "); + double[] tunings = tuning.getTuning(); + for (int i = 0; i < tunings.length; i++) + assertTrue(Math.abs(tunings[i]-(i*100 + 50)) < 0.00001); + + // Check if tuning fails if checksum is wrong + msg[msg.length - 2] += 10; + for (int i = 0; i < bmsg.length; i++) + bmsg[i] = (byte)msg[i]; + tuning = new SoftTuning(); + tuning.load(bmsg); + assertTrue(!tuning.getName().equals("Testing123 ")); + + // Check if tuning fails if checksum is wrong + msg[msg.length - 2] += 10; + for (int i = 0; i < bmsg.length; i++) + bmsg[i] = (byte)msg[i]; + tuning = new SoftTuning(); + tuning.load(bmsg); + assertTrue(!tuning.getName().equals("Testing123 ")); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load5.java b/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load5.java new file mode 100644 index 00000000000..1469086e01a --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load5.java @@ -0,0 +1,87 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftTuning load method */ + +import java.io.UnsupportedEncodingException; + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Load5 { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + // http://www.midi.org/about-midi/tuning_extens.shtml + // 0x05 SCALE/OCTAVE TUNING DUMP, 1 byte format + SoftTuning tuning = new SoftTuning(); + + byte[] name; + name = "Testing123 ".getBytes("ascii"); + int[] msg = {0xf0,0x7e,0x7f,0x08,0x05,0,0, + name[0],name[1],name[2],name[3],name[4],name[5],name[6], + name[7],name[8],name[9],name[10],name[11],name[12],name[13], + name[14],name[15], + 5,10,15,20,25,30,35,40,45,50,51,52,0, + 0xf7}; + // Calc checksum + int x = msg[1] & 0xFF; + for (int i = 2; i < msg.length - 2; i++) + x = x ^ (msg[i] & 0xFF); + msg[msg.length-2] = (x & 127); + + int[] oct = {5,10,15,20,25,30,35,40,45,50,51,52}; + byte[] bmsg = new byte[msg.length]; + for (int i = 0; i < bmsg.length; i++) + bmsg[i] = (byte)msg[i]; + tuning.load(bmsg); + double[] tunings = tuning.getTuning(); + for (int i = 0; i < tunings.length; i++) + assertTrue(Math.abs(tunings[i]-(i*100 + (oct[i%12]-64))) < 0.00001); + + // Check if tuning fails if checksum is wrong + msg[msg.length - 2] += 10; + for (int i = 0; i < bmsg.length; i++) + bmsg[i] = (byte)msg[i]; + tuning = new SoftTuning(); + tuning.load(bmsg); + assertTrue(!tuning.getName().equals("Testing123 ")); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load6.java b/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load6.java new file mode 100644 index 00000000000..147ddc39e16 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load6.java @@ -0,0 +1,91 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftTuning load method */ + +import java.io.UnsupportedEncodingException; + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Load6 { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + // http://www.midi.org/about-midi/tuning_extens.shtml + // 0x06 SCALE/OCTAVE TUNING DUMP, 2 byte format + SoftTuning tuning = new SoftTuning(); + + byte[] name; + name = "Testing123 ".getBytes("ascii"); + int[] msg = {0xf0,0x7e,0x7f,0x08,0x06,0,0, + name[0],name[1],name[2],name[3],name[4],name[5],name[6], + name[7],name[8],name[9],name[10],name[11],name[12],name[13], + name[14],name[15], + 5,10,15,20,25,30,35,40,45,50,51,52, + 5,10,15,20,25,30,35,40,45,50,51,52, + 0,0xf7}; + // Calc checksum + int x = msg[1] & 0xFF; + for (int i = 2; i < msg.length - 2; i++) + x = x ^ (msg[i] & 0xFF); + msg[msg.length-2] = (x & 127); + + int[] oct = {5,10,15,20,25,30,35,40,45,50,51,52,5,10,15,20,25,30,35,40,45,50,51,52}; + byte[] bmsg = new byte[msg.length]; + for (int i = 0; i < bmsg.length; i++) + bmsg[i] = (byte)msg[i]; + tuning.load(bmsg); + double[] tunings = tuning.getTuning(); + for (int i = 0; i < tunings.length; i++) + { + double c = (oct[(i%12)*2]*128 + oct[(i%12)*2+1] -8192)*(100.0/8192.0); + assertTrue(Math.abs(tunings[i]-(i*100 + (c))) < 0.00001); + } + + // Check if tuning fails if checksum is wrong + msg[msg.length - 2] += 10; + for (int i = 0; i < bmsg.length; i++) + bmsg[i] = (byte)msg[i]; + tuning = new SoftTuning(); + tuning.load(bmsg); + assertTrue(!tuning.getName().equals("Testing123 ")); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load7.java b/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load7.java new file mode 100644 index 00000000000..41e8e6467fc --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load7.java @@ -0,0 +1,72 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftTuning load method */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Load7 { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + // http://www.midi.org/about-midi/tuning_extens.shtml + // 0x07 SINGLE NOTE TUNING CHANGE (NON REAL-TIME) (BANK) + SoftTuning tuning = new SoftTuning(); + int[] msg = {0xf0,0x7f,0x7f,0x08,0x07,0x00,0x00,0x02, + 36,36,64,0, + 40,70,0,0, + 0xf7}; + byte[] bmsg = new byte[msg.length]; + for (int i = 0; i < bmsg.length; i++) + bmsg[i] = (byte)msg[i]; + tuning.load(bmsg); + double[] tunings = tuning.getTuning(); + for (int i = 0; i < tunings.length; i++) { + if(i == 36) + assertTrue(Math.abs(tunings[i]-3650)< 0.00001); + else if(i == 40) + assertTrue(Math.abs(tunings[i]-7000) < 0.00001); + else + assertTrue(Math.abs(tunings[i]-i*100) < 0.00001); + } + + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load8.java b/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load8.java new file mode 100644 index 00000000000..60f8205163e --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load8.java @@ -0,0 +1,65 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftTuning load method */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Load8 { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + // http://www.midi.org/about-midi/tuning-scale.shtml + // 0x08 scale/octave tuning 1-byte form (Non Real-Time/REAL-TIME) + SoftTuning tuning = new SoftTuning(); + int[] msg = {0xf0,0x7f,0x7f,0x08,0x08,0x03,0x7f,0x7f, + 5,10,15,20,25,30,35,40,45,50,51,52, + 0xf7}; + int[] oct = {5,10,15,20,25,30,35,40,45,50,51,52}; + byte[] bmsg = new byte[msg.length]; + for (int i = 0; i < bmsg.length; i++) + bmsg[i] = (byte)msg[i]; + tuning.load(bmsg); + double[] tunings = tuning.getTuning(); + for (int i = 0; i < tunings.length; i++) + assertTrue(Math.abs(tunings[i]-(i*100 + (oct[i%12]-64))) < 0.00001); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load9.java b/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load9.java new file mode 100644 index 00000000000..4dc0c2837cf --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftTuning/Load9.java @@ -0,0 +1,69 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftTuning load method */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class Load9 { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + // http://www.midi.org/about-midi/tuning-scale.shtml + // 0x09 scale/octave tuning 2-byte form (Non Real-Time/REAL-TIME) + SoftTuning tuning = new SoftTuning(); + int[] msg = {0xf0,0x7f,0x7f,0x08,0x09,0x03,0x7f,0x7f, + 5,10,15,20,25,30,35,40,45,50,51,52, + 5,10,15,20,25,30,35,40,45,50,51,52, + 0xf7}; + int[] oct = {5,10,15,20,25,30,35,40,45,50,51,52,5,10,15,20,25,30,35,40,45,50,51,52}; + byte[] bmsg = new byte[msg.length]; + for (int i = 0; i < bmsg.length; i++) + bmsg[i] = (byte)msg[i]; + tuning.load(bmsg); + double[] tunings = tuning.getTuning(); + for (int i = 0; i < tunings.length; i++) + { + double c = (oct[(i%12)*2]*128 + oct[(i%12)*2+1] -8192)*(100.0/8192.0); + assertTrue(Math.abs(tunings[i]-(i*100 + (c))) < 0.00001); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftTuning/NewSoftTuning.java b/jdk/test/javax/sound/midi/Gervill/SoftTuning/NewSoftTuning.java new file mode 100644 index 00000000000..5fada28e6be --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftTuning/NewSoftTuning.java @@ -0,0 +1,56 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftTuning constructor */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewSoftTuning { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTuning tuning = new SoftTuning(); + double[] tunings = tuning.getTuning(); + for (int i = 0; i < tunings.length; i++) { + assertTrue(Math.abs(tunings[i]-i*100) < 0.00001); + } + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftTuning/NewSoftTuningByteArray.java b/jdk/test/javax/sound/midi/Gervill/SoftTuning/NewSoftTuningByteArray.java new file mode 100644 index 00000000000..d61f503e777 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftTuning/NewSoftTuningByteArray.java @@ -0,0 +1,63 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftTuning constructor */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewSoftTuningByteArray { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + // RealTime: Scale/Octave tuning in 1-byte format + int[] msg = {0xf0,0x7f,0x7f,0x08,0x08,0x03,0x7f,0x7f, + 5,10,15,20,25,30,35,40,45,50,51,52, + 0xf7}; + int[] oct = {5,10,15,20,25,30,35,40,45,50,51,52}; + byte[] bmsg = new byte[msg.length]; + for (int i = 0; i < bmsg.length; i++) + bmsg[i] = (byte)msg[i]; + SoftTuning tuning = new SoftTuning(bmsg); + double[] tunings = tuning.getTuning(); + for (int i = 0; i < tunings.length; i++) + assertTrue(Math.abs(tunings[i]-(i*100 + (oct[i%12]-64))) < 0.00001); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftTuning/NewSoftTuningPatch.java b/jdk/test/javax/sound/midi/Gervill/SoftTuning/NewSoftTuningPatch.java new file mode 100644 index 00000000000..ee7cced0e76 --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftTuning/NewSoftTuningPatch.java @@ -0,0 +1,54 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftTuning constructor */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewSoftTuningPatch { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + SoftTuning tuning = new SoftTuning(new Patch(8,32)); + assertEquals(tuning.getPatch().getProgram(), 32); + assertEquals(tuning.getPatch().getBank(), 8); + } +} diff --git a/jdk/test/javax/sound/midi/Gervill/SoftTuning/NewSoftTuningPatchByteArray.java b/jdk/test/javax/sound/midi/Gervill/SoftTuning/NewSoftTuningPatchByteArray.java new file mode 100644 index 00000000000..20faf9d914d --- /dev/null +++ b/jdk/test/javax/sound/midi/Gervill/SoftTuning/NewSoftTuningPatchByteArray.java @@ -0,0 +1,65 @@ +/* + * Copyright 2007 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + @summary Test SoftTuning constructor */ + +import javax.sound.midi.MidiUnavailableException; +import javax.sound.midi.Patch; +import javax.sound.sampled.*; + +import com.sun.media.sound.*; + +public class NewSoftTuningPatchByteArray { + + private static void assertEquals(Object a, Object b) throws Exception + { + if(!a.equals(b)) + throw new RuntimeException("assertEquals fails!"); + } + + private static void assertTrue(boolean value) throws Exception + { + if(!value) + throw new RuntimeException("assertTrue fails!"); + } + + public static void main(String[] args) throws Exception { + // RealTime: Scale/Octave tuning in 1-byte format + int[] msg = {0xf0,0x7f,0x7f,0x08,0x08,0x03,0x7f,0x7f, + 5,10,15,20,25,30,35,40,45,50,51,52, + 0xf7}; + int[] oct = {5,10,15,20,25,30,35,40,45,50,51,52}; + byte[] bmsg = new byte[msg.length]; + for (int i = 0; i < bmsg.length; i++) + bmsg[i] = (byte)msg[i]; + SoftTuning tuning = new SoftTuning(new Patch(8,32),bmsg); + double[] tunings = tuning.getTuning(); + for (int i = 0; i < tunings.length; i++) + assertTrue(Math.abs(tunings[i]-(i*100 + (oct[i%12]-64))) < 0.00001); + assertEquals(tuning.getPatch().getProgram(), 32); + assertEquals(tuning.getPatch().getBank(), 8); + } +} diff --git a/jdk/test/javax/swing/JColorChooser/Test4222508.html b/jdk/test/javax/swing/JColorChooser/Test4222508.html new file mode 100644 index 00000000000..4614fb7de47 --- /dev/null +++ b/jdk/test/javax/swing/JColorChooser/Test4222508.html @@ -0,0 +1,9 @@ + + +Use the check box above the color chooser to disable it. +You could not choose a color using by the disable color chooser. + + + + + diff --git a/jdk/test/javax/swing/JColorChooser/Test4222508.java b/jdk/test/javax/swing/JColorChooser/Test4222508.java new file mode 100644 index 00000000000..85b83572568 --- /dev/null +++ b/jdk/test/javax/swing/JColorChooser/Test4222508.java @@ -0,0 +1,56 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4222508 + * @summary Tests the color chooser disabling + * @author Sergey Malenkov + * @run applet/manual=yesno Test4222508.html + */ + +import java.awt.BorderLayout; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import javax.swing.JApplet; +import javax.swing.JCheckBox; +import javax.swing.JColorChooser; + +public final class Test4222508 extends JApplet implements ItemListener { + + private JCheckBox checkbox; + private JColorChooser chooser; + + @Override + public void init() { + this.chooser = new JColorChooser(); + this.checkbox = new JCheckBox("Enable the color chooser below", true); + this.checkbox.addItemListener(this); + add(BorderLayout.NORTH, this.checkbox); + add(BorderLayout.CENTER, this.chooser); + } + + public void itemStateChanged(ItemEvent event) { + this.chooser.setEnabled(this.checkbox.isSelected()); + } +} diff --git a/jdk/test/javax/swing/JFileChooser/6698013/bug6698013.html b/jdk/test/javax/swing/JFileChooser/6698013/bug6698013.html new file mode 100644 index 00000000000..8de6fdd0792 --- /dev/null +++ b/jdk/test/javax/swing/JFileChooser/6698013/bug6698013.html @@ -0,0 +1,8 @@ + + + +1. Go into 'subdir' folder via double click +2. Return to parent directory +3. Go into 'subdir' folder: select 'subdir' folder and press the 'Open' button + + diff --git a/jdk/test/javax/swing/JFileChooser/6698013/bug6698013.java b/jdk/test/javax/swing/JFileChooser/6698013/bug6698013.java new file mode 100644 index 00000000000..ede1533746d --- /dev/null +++ b/jdk/test/javax/swing/JFileChooser/6698013/bug6698013.java @@ -0,0 +1,174 @@ +/* @test %W% %E% + @bug 6698013 + @summary JFileChooser can no longer navigate non-local file systems. + @author Pavel Porvatov + @run applet/manual=done bug6698013.html +*/ + +import javax.swing.*; +import javax.swing.filechooser.FileSystemView; +import java.io.File; + +public class bug6698013 extends JApplet { + + final static VirtualFile root = new VirtualFile("testdir", true); + + final static VirtualFile rootFile = new VirtualFile("testdir/test.txt", false); + + final static VirtualFile subdir = new VirtualFile("testdir/subdir", true); + + final static VirtualFile subdirFile = new VirtualFile("testdir/subdir/subtest.txt", false); + + public static void main(String[] args) { + JFileChooser chooser = new JFileChooser(new VirtualFileSystemView()); + chooser.setCurrentDirectory(root); + chooser.showSaveDialog(null); + } + + public void init() { + JFileChooser chooser = new JFileChooser(new VirtualFileSystemView()); + chooser.setCurrentDirectory(root); + chooser.showSaveDialog(null); + } +} + +class VirtualFileSystemView extends FileSystemView { + + public boolean isRoot(File dir) { + return bug6698013.root.equals(dir); + } + + public File createNewFolder(File dir) { + return null; + } + + public File[] getRoots() { + return new File[]{bug6698013.root}; + } + + public boolean isDrive(File dir) { + return false; + } + + public boolean isFloppyDrive(File dir) { + return false; + } + + public File getParentDirectory(File dir) { + if (dir == null) { + return null; + } + + return new VirtualFile(dir.getPath(), true).getParentFile(); + } + + public File[] getFiles(File dir, boolean hide_hidden) { + if (dir.equals(bug6698013.root)) { + return new File[]{bug6698013.rootFile, bug6698013.subdir}; + } + + if (dir.equals(bug6698013.subdir)) { + return new File[]{bug6698013.subdirFile}; + } + + return null; + } + + public File getHomeDirectory() { + return bug6698013.root; + } + + public File getDefaultDirectory() { + return getHomeDirectory(); + } + + public String getSystemDisplayName(File file) { + return file.getName(); + } + + public Boolean isTraversable(File file) { + return Boolean.valueOf(file.isDirectory()); + } +} + +/** + * A Virtual File. Contains a path and a directory flag that + * represents the location of a virtual file to be contained in the + * Virtual FileSystemView. + */ +class VirtualFile extends File { + + private static final long serialVersionUID = 0L; + + private String path; + + private boolean directory; + + public VirtualFile(String path, boolean directory) { + super(path); + this.path = path; + this.directory = directory; + } + + public File getParentFile() { + int index = path.lastIndexOf('/'); + + if (index == -1) { + return null; + } + + return new VirtualFile(path.substring(0, index), true); + } + + public File getCanonicalFile() { + return this; + } + + public String getParent() { + File parent_file = getParentFile(); + + return parent_file == null ? null : parent_file.getPath(); + } + + public String getName() { + int index = path.lastIndexOf('/'); + + return index == -1 ? path : path.substring(index + 1); + } + + public String getPath() { + return path; + } + + public String getAbsolutePath() { + return path; + } + + public String getCanonicalPath() { + return path; + } + + public String toString() { + return path; + } + + public boolean equals(Object obj) { + return obj instanceof VirtualFile && path.equals(obj.toString()); + } + + public int hashCode() { + return path.hashCode(); + } + + public boolean canWrite() { + return true; + } + + public boolean isDirectory() { + return directory; + } + + public boolean exists() { + return true; + } +} diff --git a/jdk/test/javax/swing/JSlider/6794836/bug6794836.java b/jdk/test/javax/swing/JSlider/6794836/bug6794836.java new file mode 100644 index 00000000000..d59deaeb8e4 --- /dev/null +++ b/jdk/test/javax/swing/JSlider/6794836/bug6794836.java @@ -0,0 +1,80 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + * @bug 6794836 + * @summary BasicSliderUI throws NullPointerExc when JSlider maximum is Integer.MAX_VALUE + * @author Pavel Porvatov + * @run main bug6794836 + */ + +import javax.swing.*; +import javax.swing.plaf.basic.BasicSliderUI; +import java.lang.reflect.Method; +import java.util.Hashtable; + +public class bug6794836 { + public static void main(String[] args) throws Exception { + new bug6794836().run(); + } + + public void run() throws Exception { + JSlider slider = new JSlider(0, Integer.MAX_VALUE); + + slider.setPaintLabels(true); + + JLabel minLabel = new JLabel("Min"); + JLabel maxLabel = new JLabel("Max"); + + Hashtable labelTable = new Hashtable(); + + labelTable.put(Integer.MIN_VALUE, minLabel); + labelTable.put(Integer.MAX_VALUE, maxLabel); + + slider.setLabelTable(labelTable); + + BasicSliderUI ui = (BasicSliderUI) slider.getUI(); + + if (invokeMethod("getHighestValueLabel", ui) != maxLabel) { + fail("invalid getHighestValueLabel result"); + } + + if (invokeMethod("getLowestValueLabel", ui) != minLabel) { + fail("invalid getLowestValueLabel result"); + } + + System.out.println("The bug6794836 test passed"); + } + + private static Object invokeMethod(String name, BasicSliderUI ui) throws Exception { + Method method = BasicSliderUI.class.getDeclaredMethod(name, null); + + method.setAccessible(true); + + return method.invoke(ui, null); + } + + private static void fail(String s) { + throw new RuntimeException("Test failed: " + s); + } +} diff --git a/jdk/test/sun/security/krb5/DnsFallback.java b/jdk/test/sun/security/krb5/DnsFallback.java index 95fbf3b165b..54aa8301eff 100644 --- a/jdk/test/sun/security/krb5/DnsFallback.java +++ b/jdk/test/sun/security/krb5/DnsFallback.java @@ -1,5 +1,5 @@ /* - * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2008-2009 Sun Microsystems, Inc. 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 @@ -23,7 +23,8 @@ /* * @test * @bug 6673164 - * @summary dns_fallback parse error + * @bug 6552334 + * @summary fix dns_fallback parse error, and use dns by default */ import sun.security.krb5.*; @@ -31,6 +32,8 @@ import java.io.*; public class DnsFallback { public static void main(String[] args) throws Exception { + + // for 6673164 check("true", "true", true); check("false", "true", false); check("true", "false", true); @@ -39,6 +42,9 @@ public class DnsFallback { check("false", null, false); check(null, "true", true); check(null, "false", false); + + // for 6552334 + check(null, null, true); } static void check(String realm, String fallback, boolean output) throws Exception { diff --git a/jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/B6216082.java b/jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/B6216082.java index e5f28779cca..1a7ac9a4f5c 100644 --- a/jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/B6216082.java +++ b/jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/B6216082.java @@ -136,6 +136,7 @@ public class B6216082 { server.getLocalPort(), "/"); HttpURLConnection uc = (HttpURLConnection)url.openConnection(); System.out.println(uc.getResponseCode()); + uc.disconnect(); } catch (IOException e) { e.printStackTrace(); } finally { diff --git a/jdk/test/sun/text/resources/LocaleData b/jdk/test/sun/text/resources/LocaleData index f885bbeb2db..7b0ada3c594 100644 --- a/jdk/test/sun/text/resources/LocaleData +++ b/jdk/test/sun/text/resources/LocaleData @@ -5518,3 +5518,11 @@ FormatData/is_IS/NumberPatterns/1=#,##0. \u00A4;-#,##0. \u00A4 FormatData/sv/AmPmMarkers/0=fm FormatData/sv/AmPmMarkers/1=em +# JE, GG, IM (6544471) +LocaleNames//JE=Jersey +LocaleNames//GG=Guernsey +LocaleNames//IM=Isle Of Man + +# BL, MF (6627549) +LocaleNames//BL=Saint Barth\u00e9lemy +LocaleNames//MF=Saint Martin diff --git a/langtools/.hgtags b/langtools/.hgtags index 93b7a70f518..e2051a0b816 100644 --- a/langtools/.hgtags +++ b/langtools/.hgtags @@ -18,3 +18,8 @@ eaf608c64fecf70f955dc9f29f94c055b183aeec jdk7-b30 ded6b40f558e8d19b3c17715b3d67ee001606645 jdk7-b41 5e5567c2db56a931cf07768218c20903d9828b5f jdk7-b42 e2f8f6daee9decd5721d598dacf4d0b5915651df jdk7-b43 +28f0b10d6c1afc106465c13b8c663a6afa4fb1a1 jdk7-b44 +30db5e0aaf83fe262d9a7227d3fc3e451cd5d459 jdk7-b45 +be546a6c08e3c31fba2edcae1de43ae3515d2e59 jdk7-b46 +2b8f6bab23926aa32b9cf7e4c540b9d1ce74b7d5 jdk7-b47 +c53007f34195f69223bdd4125ec6c0740f7d6736 jdk7-b48 diff --git a/langtools/make/README b/langtools/make/README index 466426d8ad6..bc8873178ef 100644 --- a/langtools/make/README +++ b/langtools/make/README @@ -15,7 +15,7 @@ that expect to be able to build this workspace with GNU Make. System Requirements: Ant: version 1.6.5 or later - NetBeans: version 5.0 or later (optional) + NetBeans: version 6.0 or later (optional) JDK: currently version 1.5.0, although 1.6.0 is recommended OS: any system supporting the above tools diff --git a/langtools/make/build.properties b/langtools/make/build.properties index 38fd0f4705d..6e792bb106d 100644 --- a/langtools/make/build.properties +++ b/langtools/make/build.properties @@ -66,7 +66,7 @@ javac.no.jdk.warnings = -XDignore.symbol.file=true # set the following to -version to verify the versions of javac being used javac.version.opt = # in time, there should be no exceptions to -Xlint:all -javac.lint.opts = -Xlint:all,-deprecation,-fallthrough,-serial,-unchecked,-cast +javac.lint.opts = -Xlint:all -Werror # options for the task for javac javadoc.jls3.url=http://java.sun.com/docs/books/jls/ diff --git a/langtools/make/build.xml b/langtools/make/build.xml index 79bd060dd69..770f3dd040c 100644 --- a/langtools/make/build.xml +++ b/langtools/make/build.xml @@ -392,6 +392,7 @@ + @@ -433,6 +434,7 @@ + @@ -471,6 +473,7 @@ + @@ -493,6 +496,7 @@ destdir="@{gensrc.dir}" includes="**/*.properties"/> - - + diff --git a/langtools/make/netbeans/README b/langtools/make/netbeans/README index 7208e598e6a..58cfec07cee 100644 --- a/langtools/make/netbeans/README +++ b/langtools/make/netbeans/README @@ -1,28 +1,39 @@ -Working on the "langtools" workspace using NetBeans. +Using NetBeans to work on the langtools repository. -This directory (make/netbeans) contains NetBeans projects that -allow you to work on the various tools using the NetBeans IDE. +Netbeans 6.0 or later is recommended. -NetBeans 5.0 or later is required and sufficient to use these -projects. This is different from other projects in OpenJDK, -which requires version 6.0 or later. +The "langtools" project in this directory allows you to +edit, run, test and debug the tools in the OpenJDK langtools +repository. -The following projects are provided: +The repository contains a number of tools: + apt, javac, javadoc and its doclets, javah and javap. -compiler: for working on the compiler, javac -javadoc: for working on the documentation tool, javadoc -doclets: for working on the standard doclets used by the - documentation tool, javadoc -javah: for working on the C header tool, javah -javap: for working on the disassembler, javap -apt: for working on the annotation processing tool, apt. - Note that this is just provided for completeness; - the tool has been superceded by new features in javac, - and work on apt itself is discouraged. +Build Properties. -However, any tool can be worked on from any project; the only difference -between these projects is the behavior of the standard NetBeans actions, -so that "Build" in the compiler project will build the compiler, etc. +To build this repository, you must set some properties for Ant. +You can set these properties in a number of ways: +- Set the properties in the Properties panel under Tool> Options> Ant. + Properties set this way will apply globally to all the langtools + repositories you may be working on. +- Create a file build.properties in the root directory of a + langtools repository, and set the properties in that file. + These properties will be specific to that repository. +To build the repository, at a minimum you must set the "boot.java.home" +property. To run the tools, you must also set "target.java.home". To +run the regression tests, you must set "jtreg.home". + +By default, the build and test targets will build and test all +of these tools. The run and debug targets will prompt you for the +name of a tool to execute. + +As an alternative, you can focus on a single tool. When you do +this, you will still see all the source code for all the tools, +but the various Ant targets will now be focussed on the selected tool. +To focus on a tool, bring up the context menu on the "langtools" +project (i.e. right-click on the project) and select "Select Tool". +This brings up a dialog which allows you to specify which tool you +wish to work on, and the arguments to use if and when you run it. diff --git a/langtools/make/netbeans/apt/README b/langtools/make/netbeans/apt/README deleted file mode 100644 index 6fa70ee080e..00000000000 --- a/langtools/make/netbeans/apt/README +++ /dev/null @@ -1,15 +0,0 @@ -"apt" project README. - -This project is for working on the annotation processing tool (apt) -in the OpenJDK langtools component. - -The tool was provided in Java 1.5, but has been superceded by new -features in the compiler (javac) in Java 6. apt itself is now -deprecated, and any further devlopment on it is strongly discouraged. - -The main class for the tool is com.sun.tools.apt.Main. - -NetBeans 5.0 or later is required and sufficient to use this -project, and others in the OpenJDK langtools component. -This is different from other projects in OpenJDK, which -require version 6.0 or later. diff --git a/langtools/make/netbeans/apt/build.xml b/langtools/make/netbeans/apt/build.xml deleted file mode 100644 index 6b4a72e3a4a..00000000000 --- a/langtools/make/netbeans/apt/build.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/langtools/make/netbeans/apt/nbproject/project.xml b/langtools/make/netbeans/apt/nbproject/project.xml deleted file mode 100644 index 6987228768f..00000000000 --- a/langtools/make/netbeans/apt/nbproject/project.xml +++ /dev/null @@ -1,108 +0,0 @@ - - - - - -]> - - org.netbeans.modules.ant.freeform - - - - apt - - ../../.. - - - - - ${root} - - - - java - ${root}/src/share/classes - - - - tests - ${root}/test - - - - build - ${root}/make - - - - &standard-ide-actions-no-javadoc; - - - folder - ${root}/build/classes - build - - - - - - ${root}/src/share/classes - - - - ${root}/test - - - - ${root}/make - - - - README - - - - &standard-context-menu-items-no-javadoc; - - - - - - - ${root}/src/share/classes - ${root}/build/classes - 1.5 - - - - diff --git a/langtools/make/netbeans/common/shared.xml b/langtools/make/netbeans/common/shared.xml deleted file mode 100644 index 015a08c8b77..00000000000 --- a/langtools/make/netbeans/common/shared.xml +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - - - - - - - - - - - - Must set property 'includes' - - - - - - - - - - - - - Must set property 'run.classname' - - - - - - - - Some tests failed; see report for details. - - - - - - - - - - - - - Must set property 'debug.classname' - - - - - - - - Must set property 'jtreg.tests' - - - - - - - - Must set property 'class' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/langtools/make/netbeans/common/standard-context-menu-items-no-javadoc.ent b/langtools/make/netbeans/common/standard-context-menu-items-no-javadoc.ent deleted file mode 100644 index c40ee69c213..00000000000 --- a/langtools/make/netbeans/common/standard-context-menu-items-no-javadoc.ent +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/langtools/make/netbeans/common/standard-ide-actions-no-javadoc.ent b/langtools/make/netbeans/common/standard-ide-actions-no-javadoc.ent deleted file mode 100644 index 912daf729a8..00000000000 --- a/langtools/make/netbeans/common/standard-ide-actions-no-javadoc.ent +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - build - - - - clean - - - - clean - build - - - - compile-single - ${root}/src/share/classes - - includes - ${root}/src/share/classes - \.java$ - relative-path - - , - - - - - - run - - - - run-single - - run.classname - ${root}/src/share/classes - \.java$ - java-name - - - - - - - - - - jtreg - - jtreg.tests - ${root}/test - \.(java|sh)$ - relative-path - - , - - - - - - jtreg - - - - debug-nb - - - - debug-single-nb - - debug.classname - ${root}/src/share/classes - \.java$ - java-name - - - - - - - - - - debug-jtreg-nb - - jtreg.tests - ${root}/test - \.(java|sh)$ - relative-path - - - - - - - - debug-fix - ${root}/src/share/classes - - class - ${root}/src/share/classes - \.java$ - relative-path-noext - - - - - - - - -javadoc-nb - diff --git a/langtools/make/netbeans/compiler/README b/langtools/make/netbeans/compiler/README deleted file mode 100644 index 9dc7ff11888..00000000000 --- a/langtools/make/netbeans/compiler/README +++ /dev/null @@ -1,11 +0,0 @@ -"compiler" project README. - -This project is for working on the compiler tool (javac) -in the OpenJDK langtools component. - -The main class for the tool is com.sun.tools.javac.Main. - -NetBeans 5.0 or later is required and sufficient to use this -project, and others in the OpenJDK langtools component. -This is different from other projects in OpenJDK, which -require version 6.0 or later. diff --git a/langtools/make/netbeans/compiler/build.xml b/langtools/make/netbeans/compiler/build.xml deleted file mode 100644 index 1c1df801a52..00000000000 --- a/langtools/make/netbeans/compiler/build.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/langtools/make/netbeans/compiler/nbproject/project.xml b/langtools/make/netbeans/compiler/nbproject/project.xml deleted file mode 100644 index ac52705ef99..00000000000 --- a/langtools/make/netbeans/compiler/nbproject/project.xml +++ /dev/null @@ -1,108 +0,0 @@ - - - - - -]> - - org.netbeans.modules.ant.freeform - - - - compiler - - ../../.. - - - - - ${root} - - - - java - ${root}/src/share/classes - - - - tests - ${root}/test - - - - build - ${root}/make - - - - &standard-ide-actions; - - - folder - ${root}/build/classes - build - - - - - - ${root}/src/share/classes - - - - ${root}/test - - - - ${root}/make - - - - README - - - - &standard-context-menu-items; - - - - - - - ${root}/src/share/classes - ${root}/build/classes - 1.5 - - - - diff --git a/langtools/make/netbeans/doclets/README b/langtools/make/netbeans/doclets/README deleted file mode 100644 index eb7e61b6524..00000000000 --- a/langtools/make/netbeans/doclets/README +++ /dev/null @@ -1,16 +0,0 @@ -"doclets" project README. - -This project is for working on the standard doclets used by -the documentation tool (javadoc) in the OpenJDK langtools component. - -The doclets are invoked as part of the documentation tool (javadoc). -Using this project, you can also browse javadoc and any tools in langtools. -If you build the doclets, javadoc will be built automatically as well, -if necessary. - -The doclets are found in com.sun.tools.doclets. - -NetBeans 5.0 or later is required and sufficient to use this -project, and others in the OpenJDK langtools component. -This is different from other projects in OpenJDK, which -require version 6.0 or later. diff --git a/langtools/make/netbeans/doclets/build.xml b/langtools/make/netbeans/doclets/build.xml deleted file mode 100644 index a390161c14d..00000000000 --- a/langtools/make/netbeans/doclets/build.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/langtools/make/netbeans/doclets/nbproject/project.xml b/langtools/make/netbeans/doclets/nbproject/project.xml deleted file mode 100644 index f0fa2f45d74..00000000000 --- a/langtools/make/netbeans/doclets/nbproject/project.xml +++ /dev/null @@ -1,108 +0,0 @@ - - - - - -]> - - org.netbeans.modules.ant.freeform - - - - doclets - - ../../.. - - - - - ${root} - - - - java - ${root}/src/share/classes - - - - tests - ${root}/test - - - - build - ${root}/make - - - - &standard-ide-actions-no-javadoc; - - - folder - ${root}/build/classes - build - - - - - - ${root}/src/share/classes - - - - ${root}/test - - - - ${root}/make - - - - README - - - - &standard-context-menu-items-no-javadoc; - - - - - - - ${root}/src/share/classes - ${root}/build/classes - 1.5 - - - - diff --git a/langtools/make/netbeans/javadoc/README b/langtools/make/netbeans/javadoc/README deleted file mode 100644 index e0027ccb397..00000000000 --- a/langtools/make/netbeans/javadoc/README +++ /dev/null @@ -1,16 +0,0 @@ -"javadoc" project README. - -This project is for working on the documentation tool (javadoc) -in the OpenJDK langtools component. - -javadoc is built on top of the compiler (javac). Using this -project, you can also browse javac and any tools in langtools. -If you build javadoc, javac will be built automatically as well, -if necessary. - -The main class for the tool is com.sun.tools.javadoc.Main. - -NetBeans 5.0 or later is required and sufficient to use this -project, and others in the OpenJDK langtools component. -This is different from other projects in OpenJDK, which -require version 6.0 or later. diff --git a/langtools/make/netbeans/javadoc/build.xml b/langtools/make/netbeans/javadoc/build.xml deleted file mode 100644 index ba565a6bc58..00000000000 --- a/langtools/make/netbeans/javadoc/build.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/langtools/make/netbeans/javah/README b/langtools/make/netbeans/javah/README deleted file mode 100644 index 6e94fb1f68d..00000000000 --- a/langtools/make/netbeans/javah/README +++ /dev/null @@ -1,21 +0,0 @@ -"javah" project README. - -This project is for working on the native header tool (javah) -in the OpenJDK langtools component. - -javah is built on top of the documentation tool (javadoc). Using this -project, you can also browse javadoc and any other tools in langtools. -If you build javah, javadoc will be built automatically as well, -if necessary. - -javah is in the process of being converted so that it runs directly on -top of the compiler, javac, using the annotation processing API, -instead of on top of the documentation tool, javadoc, using the -Doclet API. - -The main class for the tool is com.sun.tools.javah.Main. - -NetBeans 5.0 or later is required and sufficient to use this -project, and others in the OpenJDK langtools component. -This is different from other projects in OpenJDK, which -require version 6.0 or later. diff --git a/langtools/make/netbeans/javah/build.xml b/langtools/make/netbeans/javah/build.xml deleted file mode 100644 index 578cd1458a9..00000000000 --- a/langtools/make/netbeans/javah/build.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/langtools/make/netbeans/javah/nbproject/project.xml b/langtools/make/netbeans/javah/nbproject/project.xml deleted file mode 100644 index d4db76f39be..00000000000 --- a/langtools/make/netbeans/javah/nbproject/project.xml +++ /dev/null @@ -1,108 +0,0 @@ - - - - - -]> - - org.netbeans.modules.ant.freeform - - - - javah - - ../../.. - - - - - ${root} - - - - java - ${root}/src/share/classes - - - - tests - ${root}/test - - - - build - ${root}/make - - - - &standard-ide-actions-no-javadoc; - - - folder - ${root}/build/classes - build - - - - - - ${root}/src/share/classes - - - - ${root}/test - - - - ${root}/make - - - - README - - - - &standard-context-menu-items-no-javadoc; - - - - - - - ${root}/src/share/classes - ${root}/build/classes - 1.5 - - - - diff --git a/langtools/make/netbeans/javap/README b/langtools/make/netbeans/javap/README deleted file mode 100644 index fb08ece3ee7..00000000000 --- a/langtools/make/netbeans/javap/README +++ /dev/null @@ -1,11 +0,0 @@ -"javap" project README. - -This project is for working on the disassembler tool (javap) -in the OpenJDK langtools component. - -The main class for the tool is sun.tools.javap.Main. - -NetBeans 5.0 or later is required and sufficient to use this -project, and others in the OpenJDK langtools component. -This is different from other projects in OpenJDK, which -require version 6.0 or later. diff --git a/langtools/make/netbeans/javap/build.xml b/langtools/make/netbeans/javap/build.xml deleted file mode 100644 index 818a933d5e4..00000000000 --- a/langtools/make/netbeans/javap/build.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/langtools/make/netbeans/javap/nbproject/project.xml b/langtools/make/netbeans/javap/nbproject/project.xml deleted file mode 100644 index 692e6726cf8..00000000000 --- a/langtools/make/netbeans/javap/nbproject/project.xml +++ /dev/null @@ -1,108 +0,0 @@ - - - - - -]> - - org.netbeans.modules.ant.freeform - - - - javap - - ../../.. - - - - - ${root} - - - - java - ${root}/src/share/classes - - - - tests - ${root}/test - - - - build - ${root}/make - - - - &standard-ide-actions-no-javadoc; - - - folder - ${root}/build/classes - build - - - - - - ${root}/src/share/classes - - - - ${root}/test - - - - ${root}/make - - - - README - - - - &standard-context-menu-items-no-javadoc; - - - - - - - ${root}/src/share/classes - ${root}/build/classes - 1.5 - - - - diff --git a/langtools/make/netbeans/langtools/build.xml b/langtools/make/netbeans/langtools/build.xml new file mode 100644 index 00000000000..8f2b95f3031 --- /dev/null +++ b/langtools/make/netbeans/langtools/build.xml @@ -0,0 +1,279 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set property 'includes' + + + + + + + + + + + + + + Must set property 'run.classname' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Some tests failed; see report for details. + + + + + + + + + + + + + Must set property 'debug.classname' + + + + + + + Must set property 'jtreg.tests' + + + + + + + + Must set property 'class' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/langtools/make/netbeans/javadoc/nbproject/project.xml b/langtools/make/netbeans/langtools/nbproject/project.xml similarity index 94% rename from langtools/make/netbeans/javadoc/nbproject/project.xml rename to langtools/make/netbeans/langtools/nbproject/project.xml index 61ebeb3b7af..e7509600556 100644 --- a/langtools/make/netbeans/javadoc/nbproject/project.xml +++ b/langtools/make/netbeans/langtools/nbproject/project.xml @@ -1,6 +1,6 @@ - + + ]> org.netbeans.modules.ant.freeform - javadoc + langtools ../../.. diff --git a/langtools/make/netbeans/common/standard-context-menu-items.ent b/langtools/make/netbeans/langtools/nbproject/standard-context-menu-items.ent similarity index 95% rename from langtools/make/netbeans/common/standard-context-menu-items.ent rename to langtools/make/netbeans/langtools/nbproject/standard-context-menu-items.ent index f6e1a96bb84..ab0568a009d 100644 --- a/langtools/make/netbeans/common/standard-context-menu-items.ent +++ b/langtools/make/netbeans/langtools/nbproject/standard-context-menu-items.ent @@ -1,6 +1,6 @@ + + + + diff --git a/langtools/make/netbeans/common/standard-ide-actions.ent b/langtools/make/netbeans/langtools/nbproject/standard-ide-actions.ent similarity index 92% rename from langtools/make/netbeans/common/standard-ide-actions.ent rename to langtools/make/netbeans/langtools/nbproject/standard-ide-actions.ent index 912daf729a8..3081fdfcdf0 100644 --- a/langtools/make/netbeans/common/standard-ide-actions.ent +++ b/langtools/make/netbeans/langtools/nbproject/standard-ide-actions.ent @@ -108,11 +108,11 @@ - debug-nb + debug - debug-single-nb + debug-single debug.classname ${root}/src/share/classes @@ -130,7 +130,7 @@ --> - debug-jtreg-nb + debug-jtreg jtreg.tests ${root}/test @@ -157,5 +157,17 @@ - -javadoc-nb + javadoc + + + + select-tool + + + + test-select-tool-1 + + + + test-select-tool-2 diff --git a/langtools/make/tools/SelectTool/SelectToolTask.java b/langtools/make/tools/SelectTool/SelectToolTask.java new file mode 100644 index 00000000000..0646c306e8a --- /dev/null +++ b/langtools/make/tools/SelectTool/SelectToolTask.java @@ -0,0 +1,284 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.Reader; +import java.io.Writer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Properties; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JDialog; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JTextField; + +import javax.swing.SwingUtilities; +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.Task; + +/** + * Task to allow the user to control langtools tools built when using NetBeans. + * + * There are two primary modes. + * 1) Property mode. In this mode, property names are provided to get values + * that may be specified by the user, either directly in a GUI dialog, or + * read from a properties file. If the GUI dialog is invoked, values may + * optionally be set for future use. + * 2) Setup mode. In this mode, no property names are provided, and the GUI + * is invoked to allow the user to set or reset values for use in property mode. + */ +public class SelectToolTask extends Task { + /** + * Set the location of the private properties file used to keep the retain + * user preferences for this repository. + */ + public void setPropertyFile(File propertyFile) { + this.propertyFile = propertyFile; + } + + /** + * Set the name of the property which will be set to the name of the + * selected tool, if any. If no tool is selected, the property will + * remain unset. + */ + public void setToolProperty(String toolProperty) { + this.toolProperty = toolProperty; + } + + /** + * Set the name of the property which will be set to the execution args of the + * selected tool, if any. The args default to an empty string. + */ + public void setArgsProperty(String argsProperty) { + this.argsProperty = argsProperty; + } + + /** + * Specify whether or not to pop up a dialog if the user has not specified + * a default value for a property. + */ + public void setAskIfUnset(boolean askIfUnset) { + this.askIfUnset = askIfUnset; + } + + @Override + public void execute() { + Project p = getProject(); + + Properties props = readProperties(propertyFile); + toolName = props.getProperty("tool.name"); + if (toolName != null) { + toolArgs = props.getProperty(toolName + ".args", ""); + } + + if (toolProperty == null || + askIfUnset && (toolName == null + || (argsProperty != null && toolArgs == null))) { + showGUI(props); + } + + // finally, return required values, if any + if (toolProperty != null && !(toolName == null || toolName.equals(""))) { + p.setProperty(toolProperty, toolName); + + if (argsProperty != null && toolArgs != null) + p.setProperty(argsProperty, toolArgs); + } + } + + void showGUI(Properties fileProps) { + Properties guiProps = new Properties(fileProps); + JOptionPane p = createPane(guiProps); + p.createDialog("Select Tool").setVisible(true); + + toolName = (String) toolChoice.getSelectedItem(); + toolArgs = argsField.getText(); + + if (defaultCheck.isSelected()) { + if (toolName.equals("")) { + fileProps.remove("tool.name"); + } else { + fileProps.put("tool.name", toolName); + fileProps.put(toolName + ".args", toolArgs); + } + writeProperties(propertyFile, fileProps); + } + } + + JOptionPane createPane(final Properties props) { + JPanel body = new JPanel(new GridBagLayout()); + GridBagConstraints lc = new GridBagConstraints(); + lc.insets.right = 10; + lc.insets.bottom = 3; + GridBagConstraints fc = new GridBagConstraints(); + fc.anchor = GridBagConstraints.WEST; + fc.gridx = 1; + fc.gridwidth = GridBagConstraints.REMAINDER; + fc.insets.bottom = 3; + + JLabel toolLabel = new JLabel("Tool:"); + body.add(toolLabel, lc); + String[] toolChoices = { "apt", "javac", "javadoc", "javah", "javap" }; + if (true || toolProperty == null) { + // include empty value in setup mode + List l = new ArrayList(Arrays.asList(toolChoices)); + l.add(0, ""); + toolChoices = l.toArray(new String[l.size()]); + } + toolChoice = new JComboBox(toolChoices); + if (toolName != null) + toolChoice.setSelectedItem(toolName); + toolChoice.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + String tn = (String) e.getItem(); + argsField.setText(getDefaultArgsForTool(props, tn)); + if (toolProperty != null) + okButton.setEnabled(!tn.equals("")); + } + }); + body.add(toolChoice, fc); + + argsField = new JTextField(getDefaultArgsForTool(props, toolName), 40); + if (toolProperty == null || argsProperty != null) { + JLabel argsLabel = new JLabel("Args:"); + body.add(argsLabel, lc); + body.add(argsField, fc); + argsField.addFocusListener(new FocusListener() { + public void focusGained(FocusEvent e) { + } + public void focusLost(FocusEvent e) { + String toolName = (String) toolChoice.getSelectedItem(); + if (toolName.length() > 0) + props.put(toolName + ".args", argsField.getText()); + } + }); + } + + defaultCheck = new JCheckBox("Set as default"); + if (toolProperty == null) + defaultCheck.setSelected(true); + else + body.add(defaultCheck, fc); + + final JOptionPane p = new JOptionPane(body); + okButton = new JButton("OK"); + okButton.setEnabled(toolProperty == null || (toolName != null && !toolName.equals(""))); + okButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + JDialog d = (JDialog) SwingUtilities.getAncestorOfClass(JDialog.class, p); + d.setVisible(false); + } + }); + p.setOptions(new Object[] { okButton }); + + return p; + } + + Properties readProperties(File file) { + Properties p = new Properties(); + if (file != null && file.exists()) { + Reader in = null; + try { + in = new BufferedReader(new FileReader(file)); + p.load(in); + in.close(); + } catch (IOException e) { + throw new BuildException("error reading property file", e); + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + throw new BuildException("cannot close property file", e); + } + } + } + } + return p; + } + + void writeProperties(File file, Properties p) { + if (file != null) { + Writer out = null; + try { + File dir = file.getParentFile(); + if (dir != null && !dir.exists()) + dir.mkdirs(); + out = new BufferedWriter(new FileWriter(file)); + p.store(out, "langtools properties"); + out.close(); + } catch (IOException e) { + throw new BuildException("error writing property file", e); + } finally { + if (out != null) { + try { + out.close(); + } catch (IOException e) { + throw new BuildException("cannot close property file", e); + } + } + } + } + } + + String getDefaultArgsForTool(Properties props, String tn) { + return (tn == null || tn.equals("")) ? "" : props.getProperty(tn + ".args", ""); + } + + // Ant task parameters + private boolean askIfUnset; + private String toolProperty; + private String argsProperty; + private File propertyFile; + + // GUI components + private JComboBox toolChoice; + private JTextField argsField; + private JCheckBox defaultCheck; + private JButton okButton; + + // Result values for the client + private String toolName; + private String toolArgs; +} diff --git a/langtools/src/share/classes/com/sun/tools/apt/comp/AnnotationProcessingError.java b/langtools/src/share/classes/com/sun/tools/apt/comp/AnnotationProcessingError.java index 582b21c2ee9..f14dc60e6e3 100644 --- a/langtools/src/share/classes/com/sun/tools/apt/comp/AnnotationProcessingError.java +++ b/langtools/src/share/classes/com/sun/tools/apt/comp/AnnotationProcessingError.java @@ -26,6 +26,7 @@ package com.sun.tools.apt.comp; public class AnnotationProcessingError extends Error { + private static final long serialVersionUID = 3279196183341719287L; AnnotationProcessingError(Throwable cause) { super(cause); } diff --git a/langtools/src/share/classes/com/sun/tools/apt/comp/Apt.java b/langtools/src/share/classes/com/sun/tools/apt/comp/Apt.java index abd09f5bf9e..d01887b6888 100644 --- a/langtools/src/share/classes/com/sun/tools/apt/comp/Apt.java +++ b/langtools/src/share/classes/com/sun/tools/apt/comp/Apt.java @@ -316,8 +316,13 @@ public class Apt extends ListBuffer> { } providers = list.iterator(); - } else - providers = sun.misc.Service.providers(AnnotationProcessorFactory.class, aptCL); + } else { + @SuppressWarnings("unchecked") + Iterator iter = + sun.misc.Service.providers(AnnotationProcessorFactory.class, aptCL); + providers = iter; + + } } java.util.Map> factoryToAnnotation = diff --git a/langtools/src/share/classes/com/sun/tools/apt/comp/UsageMessageNeededException.java b/langtools/src/share/classes/com/sun/tools/apt/comp/UsageMessageNeededException.java index cbbbf8675cf..64a83ddb2c4 100644 --- a/langtools/src/share/classes/com/sun/tools/apt/comp/UsageMessageNeededException.java +++ b/langtools/src/share/classes/com/sun/tools/apt/comp/UsageMessageNeededException.java @@ -26,4 +26,6 @@ package com.sun.tools.apt.comp; -public class UsageMessageNeededException extends RuntimeException {} +public class UsageMessageNeededException extends RuntimeException { + private static final long serialVersionUID = -3265159608992825840L; +} diff --git a/langtools/src/share/classes/com/sun/tools/apt/main/JavaCompiler.java b/langtools/src/share/classes/com/sun/tools/apt/main/JavaCompiler.java index 4b632d2d4ee..433a7dedf51 100644 --- a/langtools/src/share/classes/com/sun/tools/apt/main/JavaCompiler.java +++ b/langtools/src/share/classes/com/sun/tools/apt/main/JavaCompiler.java @@ -233,6 +233,7 @@ public class JavaCompiler extends com.sun.tools.javac.main.JavaCompiler { ListBuffer classes = new ListBuffer(); try { + JavacFileManager fm = (JavacFileManager)fileManager; //parse all files ListBuffer trees = new ListBuffer(); for (List l = filenames; l.nonEmpty(); l = l.tail) { @@ -250,7 +251,8 @@ public class JavaCompiler extends com.sun.tools.javac.main.JavaCompiler { continue; } } - trees.append(parse(l.head)); + JavaFileObject fo = fm.getJavaFileObjectsFromStrings(List.of(l.head)).iterator().next(); + trees.append(parse(fo)); } //enter symbols for all files diff --git a/langtools/src/share/classes/com/sun/tools/apt/mirror/apt/RoundCompleteEventImpl.java b/langtools/src/share/classes/com/sun/tools/apt/mirror/apt/RoundCompleteEventImpl.java index ae3a2258e6b..403ea6ffb51 100644 --- a/langtools/src/share/classes/com/sun/tools/apt/mirror/apt/RoundCompleteEventImpl.java +++ b/langtools/src/share/classes/com/sun/tools/apt/mirror/apt/RoundCompleteEventImpl.java @@ -30,6 +30,8 @@ import com.sun.mirror.apt.RoundCompleteEvent; import com.sun.mirror.apt.RoundState; public class RoundCompleteEventImpl extends RoundCompleteEvent { + private static final long serialVersionUID = 7067621446720784300L; + public RoundCompleteEventImpl(AnnotationProcessorEnvironment source, RoundState rs) { super(source, rs); diff --git a/langtools/src/share/classes/com/sun/tools/apt/mirror/declaration/AnnotationProxyMaker.java b/langtools/src/share/classes/com/sun/tools/apt/mirror/declaration/AnnotationProxyMaker.java index 64727fda4c1..9505eb2230d 100644 --- a/langtools/src/share/classes/com/sun/tools/apt/mirror/declaration/AnnotationProxyMaker.java +++ b/langtools/src/share/classes/com/sun/tools/apt/mirror/declaration/AnnotationProxyMaker.java @@ -252,6 +252,7 @@ class AnnotationProxyMaker { */ private void typeMismatch(final Method method, final Attribute attr) { value = new ExceptionProxy() { + private static final long serialVersionUID = 8473323277815075163L; public String toString() { return ""; // eg: @Anno(value=) } @@ -270,6 +271,7 @@ class AnnotationProxyMaker { * type. */ private static class MirroredTypeExceptionProxy extends ExceptionProxy { + private static final long serialVersionUID = 6662035281599933545L; private MirroredTypeException ex; @@ -311,6 +313,7 @@ class AnnotationProxyMaker { * types. */ private static class MirroredTypesExceptionProxy extends ExceptionProxy { + private static final long serialVersionUID = -6670822532616693951L; private MirroredTypesException ex; diff --git a/langtools/src/share/classes/com/sun/tools/apt/mirror/type/TypeVariableImpl.java b/langtools/src/share/classes/com/sun/tools/apt/mirror/type/TypeVariableImpl.java index f96e01e0cd8..3d6a9fcaa80 100644 --- a/langtools/src/share/classes/com/sun/tools/apt/mirror/type/TypeVariableImpl.java +++ b/langtools/src/share/classes/com/sun/tools/apt/mirror/type/TypeVariableImpl.java @@ -64,7 +64,7 @@ public class TypeVariableImpl extends TypeMirrorImpl implements TypeVariable { * {@inheritDoc} */ public TypeParameterDeclaration getDeclaration() { - TypeSymbol sym = (TypeSymbol) type.tsym; + TypeSymbol sym = type.tsym; return env.declMaker.getTypeParameterDeclaration(sym); } diff --git a/langtools/src/share/classes/com/sun/tools/classfile/Annotation.java b/langtools/src/share/classes/com/sun/tools/classfile/Annotation.java index 9138132c636..37423cacc67 100644 --- a/langtools/src/share/classes/com/sun/tools/classfile/Annotation.java +++ b/langtools/src/share/classes/com/sun/tools/classfile/Annotation.java @@ -37,6 +37,7 @@ import java.io.IOException; */ public class Annotation { static class InvalidAnnotation extends AttributeException { + private static final long serialVersionUID = -4620480740735772708L; InvalidAnnotation(String msg) { super(msg); } diff --git a/langtools/src/share/classes/com/sun/tools/classfile/AttributeException.java b/langtools/src/share/classes/com/sun/tools/classfile/AttributeException.java index ee3decd947a..55d23f9c63b 100644 --- a/langtools/src/share/classes/com/sun/tools/classfile/AttributeException.java +++ b/langtools/src/share/classes/com/sun/tools/classfile/AttributeException.java @@ -32,6 +32,7 @@ package com.sun.tools.classfile; * deletion without notice. */ public class AttributeException extends Exception { + private static final long serialVersionUID = -4231486387714867770L; AttributeException() { } AttributeException(String msg) { diff --git a/langtools/src/share/classes/com/sun/tools/classfile/Code_attribute.java b/langtools/src/share/classes/com/sun/tools/classfile/Code_attribute.java index c3d8dff0fdf..ce99e119ade 100644 --- a/langtools/src/share/classes/com/sun/tools/classfile/Code_attribute.java +++ b/langtools/src/share/classes/com/sun/tools/classfile/Code_attribute.java @@ -37,6 +37,7 @@ import java.io.IOException; */ public class Code_attribute extends Attribute { public class InvalidIndex extends AttributeException { + private static final long serialVersionUID = -8904527774589382802L; InvalidIndex(int index) { this.index = index; } diff --git a/langtools/src/share/classes/com/sun/tools/classfile/ConstantPool.java b/langtools/src/share/classes/com/sun/tools/classfile/ConstantPool.java index f6a0bda55b0..b9acd9640d9 100644 --- a/langtools/src/share/classes/com/sun/tools/classfile/ConstantPool.java +++ b/langtools/src/share/classes/com/sun/tools/classfile/ConstantPool.java @@ -38,6 +38,7 @@ import java.io.IOException; public class ConstantPool { public class InvalidIndex extends ConstantPoolException { + private static final long serialVersionUID = -4350294289300939730L; InvalidIndex(int index) { super(index); } @@ -50,6 +51,7 @@ public class ConstantPool { } public class UnexpectedEntry extends ConstantPoolException { + private static final long serialVersionUID = 6986335935377933211L; UnexpectedEntry(int index, int expected_tag, int found_tag) { super(index); this.expected_tag = expected_tag; @@ -67,6 +69,7 @@ public class ConstantPool { } public class InvalidEntry extends ConstantPoolException { + private static final long serialVersionUID = 1000087545585204447L; InvalidEntry(int index, int tag) { super(index); this.tag = tag; @@ -82,6 +85,7 @@ public class ConstantPool { } public class EntryNotFound extends ConstantPoolException { + private static final long serialVersionUID = 2885537606468581850L; EntryNotFound(Object value) { super(-1); this.value = value; diff --git a/langtools/src/share/classes/com/sun/tools/classfile/ConstantPoolException.java b/langtools/src/share/classes/com/sun/tools/classfile/ConstantPoolException.java index 03a89b9d080..31d3473e6ca 100644 --- a/langtools/src/share/classes/com/sun/tools/classfile/ConstantPoolException.java +++ b/langtools/src/share/classes/com/sun/tools/classfile/ConstantPoolException.java @@ -33,6 +33,7 @@ package com.sun.tools.classfile; * deletion without notice. */ public class ConstantPoolException extends Exception { + private static final long serialVersionUID = -2324397349644754565L; ConstantPoolException(int index) { this.index = index; } diff --git a/langtools/src/share/classes/com/sun/tools/classfile/Descriptor.java b/langtools/src/share/classes/com/sun/tools/classfile/Descriptor.java index 510fe09f4a7..e446955399f 100644 --- a/langtools/src/share/classes/com/sun/tools/classfile/Descriptor.java +++ b/langtools/src/share/classes/com/sun/tools/classfile/Descriptor.java @@ -38,6 +38,7 @@ import java.io.IOException; */ public class Descriptor { public class InvalidDescriptor extends DescriptorException { + private static final long serialVersionUID = 1L; InvalidDescriptor(String desc) { this.desc = desc; this.index = -1; diff --git a/langtools/src/share/classes/com/sun/tools/classfile/DescriptorException.java b/langtools/src/share/classes/com/sun/tools/classfile/DescriptorException.java index 97d0538c74c..fad9a2ff361 100644 --- a/langtools/src/share/classes/com/sun/tools/classfile/DescriptorException.java +++ b/langtools/src/share/classes/com/sun/tools/classfile/DescriptorException.java @@ -33,4 +33,5 @@ package com.sun.tools.classfile; * deletion without notice. */ public class DescriptorException extends Exception { + private static final long serialVersionUID = 2411890273788901032L; } diff --git a/langtools/src/share/classes/com/sun/tools/classfile/StackMapTable_attribute.java b/langtools/src/share/classes/com/sun/tools/classfile/StackMapTable_attribute.java index 4f4fd93bf27..26a9b6f9736 100644 --- a/langtools/src/share/classes/com/sun/tools/classfile/StackMapTable_attribute.java +++ b/langtools/src/share/classes/com/sun/tools/classfile/StackMapTable_attribute.java @@ -37,6 +37,7 @@ import java.io.IOException; */ public class StackMapTable_attribute extends Attribute { static class InvalidStackMap extends AttributeException { + private static final long serialVersionUID = -5659038410855089780L; InvalidStackMap(String msg) { super(msg); } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java index 524bd2472a3..70d487da2ba 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java @@ -493,4 +493,14 @@ public class ConfigurationImpl extends Configuration { public Comparator getMemberComparator() { return null; } + + /** + * {@inheritDoc} + */ + public Locale getLocale() { + if (root instanceof com.sun.tools.javadoc.RootDocImpl) + return ((com.sun.tools.javadoc.RootDocImpl)root).getLocale(); + else + return Locale.getDefault(); + } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java index 630ed3669c4..d7e7ee1696e 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java @@ -119,7 +119,7 @@ public class PackageIndexWriter extends AbstractPackageIndexWriter { */ protected void generateIndex() { for (int i = 0; i < groupList.size(); i++) { - String groupname = (String)groupList.get(i); + String groupname = groupList.get(i); List list = groupPackageMap.get(groupname); if (list != null && list.size() > 0) { printIndexContents(list.toArray(new PackageDoc[list.size()]), diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocWriter.java index 8644af9a22f..d4cdd39b1ce 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocWriter.java @@ -25,12 +25,11 @@ package com.sun.tools.doclets.formats.html.markup; -import com.sun.tools.doclets.internal.toolkit.*; - -import com.sun.javadoc.*; import java.io.*; import java.util.*; -import com.sun.tools.doclets.internal.toolkit.util.*; + +import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; /** @@ -56,8 +55,9 @@ public abstract class HtmlDocWriter extends HtmlWriter { super(configuration, null, configuration.destDirName + filename, configuration.docencoding); + // use File to normalize file separators configuration.message.notice("doclet.Generating_0", - configuration.destDirName + filename); + new File(configuration.destDirName, filename)); } public HtmlDocWriter(Configuration configuration, @@ -65,10 +65,10 @@ public abstract class HtmlDocWriter extends HtmlWriter { super(configuration, configuration.destDirName + path, filename, configuration.docencoding); + // use File to normalize file separators configuration.message.notice("doclet.Generating_0", - configuration.destDirName + - ((path.length() > 0)? - path + File.separator: "") + filename); + new File(configuration.destDirName, + ((path.length() > 0)? path + File.separator: "") + filename)); } /** diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java index 21fb7e642b0..cdafe1be907 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java @@ -85,7 +85,7 @@ public class HtmlWriter extends PrintWriter { * Print <HTML> tag. Add a newline character at the end. */ public void html() { - println(""); + println(""); } /** diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Configuration.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Configuration.java index 11b37b34498..eb8960f4c65 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Configuration.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Configuration.java @@ -706,6 +706,11 @@ public abstract class Configuration { new FileInputStream(new File(builderXMLPath)); } + /** + * Return the Locale for this document. + */ + public abstract Locale getLocale(); + /** * Return the comparator that will be used to sort member documentation. * To no do any sorting, return null. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/SerializedFormBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/SerializedFormBuilder.java index 7f025b6ff5b..636db90d02a 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/SerializedFormBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/SerializedFormBuilder.java @@ -402,7 +402,7 @@ public class SerializedFormBuilder extends AbstractBuilder { public void buildFieldSerializationOverview(ClassDoc classDoc) { if (classDoc.definesSerializableFields()) { FieldDoc serialPersistentField = - (FieldDoc)((Util.asList(classDoc.serializableFields()).get(0))); + Util.asList(classDoc.serializableFields()).get(0); String comment = serialPersistentField.commentText(); if (comment.length() > 0) { fieldWriter.writeHeader( diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocletAbortException.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocletAbortException.java index 906cc011705..c08965e5b7d 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocletAbortException.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocletAbortException.java @@ -26,6 +26,7 @@ package com.sun.tools.doclets.internal.toolkit.util; public class DocletAbortException extends RuntimeException { + private static final long serialVersionUID = -9131058909576418984L; public DocletAbortException() { } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MessageRetriever.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MessageRetriever.java index 4055b914822..9f0b6417d6c 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MessageRetriever.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MessageRetriever.java @@ -80,47 +80,15 @@ public class MessageRetriever { this.resourcelocation = resourcelocation; } - /** - * get and format message string from resource - * - * @param key selects message from resource - */ - public String getText(String key) { - return getText(key, (String)null); - } - /** * Get and format message string from resource * * @param key selects message from resource - * @param a1 Argument, to be repalced in the message. - */ - public String getText(String key, String a1) { - return getText(key, a1, null); - } - - /** - * Get and format message string from resource - * - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - * @param a2 second argument to be replaced in the message. - */ - public String getText(String key, String a1, String a2) { - return getText(key, a1, a2, null); - } - - /** - * Get and format message string from resource - * - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - * @param a2 second argument to be replaced in the message. - * @param a3 third argument to be replaced in the message. + * @param args arguments to be replaced in the message. * @throws MissingResourceException when the key does not * exist in the properties file. */ - public String getText(String key, String a1, String a2, String a3) throws MissingResourceException { + public String getText(String key, Object... args) throws MissingResourceException { if (messageRB == null) { try { messageRB = ResourceBundle.getBundle(resourcelocation); @@ -130,7 +98,7 @@ public class MessageRetriever { } } String message = messageRB.getString(key); - return MessageFormat.format(message, a1, a2, a3); + return MessageFormat.format(message, args); } /** @@ -195,87 +163,20 @@ public class MessageRetriever { * * @param pos the position of the source * @param key selects message from resource + * @param args arguments to be replaced in the message. */ - public void error(SourcePosition pos, String key) { - printError(pos, getText(key)); + public void error(SourcePosition pos, String key, Object... args) { + printError(pos, getText(key, args)); } /** * Print error message, increment error count. * * @param key selects message from resource + * @param args arguments to be replaced in the message. */ - public void error(String key) { - printError(getText(key)); - } - - /** - * Print error message, increment error count. - * - * @param pos the position of the source - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - */ - public void error(SourcePosition pos, String key, String a1) { - printError(pos, getText(key, a1)); - } - - /** - * Print error message, increment error count. - * - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - */ - public void error(String key, String a1) { - printError(getText(key, a1)); - } - - /** - * Print error message, increment error count. - * - * @param pos the position of the source - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - * @param a2 second argument to be replaced in the message. - */ - public void error(SourcePosition pos, String key, String a1, String a2) { - printError(pos, getText(key, a1, a2)); - } - - /** - * Print error message, increment error count. - * - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - * @param a2 second argument to be replaced in the message. - */ - public void error(String key, String a1, String a2) { - printError(getText(key, a1, a2)); - } - - /** - * Print error message, increment error count. - * - * @param pos the position of the source - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - * @param a2 second argument to be replaced in the message. - * @param a3 third argument to be replaced in the message. - */ - public void error(SourcePosition pos, String key, String a1, String a2, String a3) { - printError(pos, getText(key, a1, a2, a3)); - } - - /** - * Print error message, increment error count. - * - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - * @param a2 second argument to be replaced in the message. - * @param a3 third argument to be replaced in the message. - */ - public void error(String key, String a1, String a2, String a3) { - printError(getText(key, a1, a2, a3)); + public void error(String key, Object... args) { + printError(getText(key, args)); } /** @@ -283,87 +184,20 @@ public class MessageRetriever { * * @param pos the position of the source * @param key selects message from resource + * @param args arguments to be replaced in the message. */ - public void warning(SourcePosition pos, String key) { - printWarning(pos, getText(key)); + public void warning(SourcePosition pos, String key, Object... args) { + printWarning(pos, getText(key, args)); } /** * Print warning message, increment warning count. * * @param key selects message from resource + * @param args arguments to be replaced in the message. */ - public void warning(String key) { - printWarning(getText(key)); - } - - /** - * Print warning message, increment warning count. - * - * @param pos the position of the source - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - */ - public void warning(SourcePosition pos, String key, String a1) { - printWarning(pos, getText(key, a1)); - } - - /** - * Print warning message, increment warning count. - * - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - */ - public void warning(String key, String a1) { - printWarning(getText(key, a1)); - } - - /** - * Print warning message, increment warning count. - * - * @param pos the position of the source - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - * @param a2 second argument to be replaced in the message. - */ - public void warning(SourcePosition pos, String key, String a1, String a2) { - printWarning(pos, getText(key, a1, a2)); - } - - /** - * Print warning message, increment warning count. - * - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - * @param a2 second argument to be replaced in the message. - */ - public void warning(String key, String a1, String a2) { - printWarning(getText(key, a1, a2)); - } - - /** - * Print warning message, increment warning count. - * - * @param pos the position of the source - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - * @param a2 second argument to be replaced in the message. - * @param a3 third argument to be replaced in the message. - */ - public void warning(SourcePosition pos, String key, String a1, String a2, String a3) { - printWarning(pos, getText(key, a1, a2, a3)); - } - - /** - * Print warning message, increment warning count. - * - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - * @param a2 second argument to be replaced in the message. - * @param a3 third argument to be replaced in the message. - */ - public void warning(String key, String a1, String a2, String a3) { - printWarning(getText(key, a1, a2, a3)); + public void warning(String key, Object... args) { + printWarning(getText(key, args)); } /** @@ -371,85 +205,19 @@ public class MessageRetriever { * * @param pos the position of the source * @param key selects message from resource + * @param args arguments to be replaced in the message. */ - public void notice(SourcePosition pos, String key) { - printNotice(pos, getText(key)); + public void notice(SourcePosition pos, String key, Object... args) { + printNotice(pos, getText(key, args)); } /** * Print a message. * * @param key selects message from resource + * @param args arguments to be replaced in the message. */ - public void notice(String key) { - printNotice(getText(key)); - } - - /** - * Print a message. - * @param pos the position of the source - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - */ - public void notice(SourcePosition pos, String key, String a1) { - printNotice(pos, getText(key, a1)); - } - - /** - * Print a message. - * - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - */ - public void notice(String key, String a1) { - printNotice(getText(key, a1)); - } - - /** - * Print a message. - * - * @param pos the position of the source - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - * @param a2 second argument to be replaced in the message. - */ - public void notice(SourcePosition pos, String key, String a1, String a2) { - printNotice(pos, getText(key, a1, a2)); - } - - /** - * Print a message. - * - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - * @param a2 second argument to be replaced in the message. - */ - public void notice(String key, String a1, String a2) { - printNotice(getText(key, a1, a2)); - } - - /** - * Print a message. - * - * @param pos the position of the source - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - * @param a2 second argument to be replaced in the message. - * @param a3 third argument to be replaced in the message. - */ - public void notice(SourcePosition pos, String key, String a1, String a2, String a3) { - printNotice(pos, getText(key, a1, a2, a3)); - } - - /** - * Print a message. - * - * @param key selects message from resource - * @param a1 first argument to be replaced in the message. - * @param a2 second argument to be replaced in the message. - * @param a3 third argument to be replaced in the message. - */ - public void notice(String key, String a1, String a2, String a3) { - printNotice(getText(key, a1, a2, a3)); + public void notice(String key, Object... args) { + printNotice(getText(key, args)); } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/SourceToHTMLConverter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/SourceToHTMLConverter.java index 67a82e8a3b3..3de2951e062 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/SourceToHTMLConverter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/SourceToHTMLConverter.java @@ -25,10 +25,12 @@ package com.sun.tools.doclets.internal.toolkit.util; -import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.javadoc.*; import java.io.*; import java.util.*; +import javax.tools.FileObject; + +import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; /** * Converts Java Source Code to HTML. @@ -123,16 +125,27 @@ public class SourceToHTMLConverter { if (cd == null || outputdir == null) { return; } - File file; - SourcePosition sp = cd.position(); - if (sp == null || (file = sp.file()) == null) { - return; - } try { + SourcePosition sp = cd.position(); + if (sp == null) + return; + Reader r; + // temp hack until we can update SourcePosition API. + if (sp instanceof com.sun.tools.javadoc.SourcePositionImpl) { + FileObject fo = ((com.sun.tools.javadoc.SourcePositionImpl) sp).fileObject(); + if (fo == null) + return; + r = fo.openReader(true); + } else { + File file = sp.file(); + if (file == null) + return; + r = new FileReader(file); + } + LineNumberReader reader = new LineNumberReader(r); int lineno = 1; String line; StringBuffer output = new StringBuffer(); - LineNumberReader reader = new LineNumberReader(new FileReader(file)); try { while ((line = reader.readLine()) != null) { output.append(formatLine(line, configuration.sourcetab, lineno)); @@ -142,7 +155,7 @@ public class SourceToHTMLConverter { reader.close(); } output = addLineNumbers(output.toString()); - output.insert(0, getHeader()); + output.insert(0, getHeader(configuration)); output.append(getFooter()); writeToFile(output.toString(), outputdir, cd.name(), configuration); } catch (Exception e){ @@ -192,10 +205,11 @@ public class SourceToHTMLConverter { /** * Get the header. + * @param configuration the Doclet configuration * @return the header to the output file */ - protected static String getHeader() { - StringBuffer result = new StringBuffer("" + DocletConstants.NL); + protected static String getHeader(Configuration configuration) { + StringBuffer result = new StringBuffer("" + DocletConstants.NL); result.append("" + DocletConstants.NL); result.append("
        " + DocletConstants.NL);
                 return result.toString();
        diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java
        index 9b7b668b6c0..1d5eb19c22e 100644
        --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java
        +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java
        @@ -25,10 +25,11 @@
         
         package com.sun.tools.doclets.internal.toolkit.util;
         
        +import java.io.*;
        +import java.util.*;
        +
         import com.sun.javadoc.*;
         import com.sun.tools.doclets.internal.toolkit.*;
        -import java.util.*;
        -import java.io.*;
         
         /**
          * Utilities Class for Doclets.
        @@ -579,7 +580,7 @@ public class Util {
              * @param docencoding Encoding to be used for this file.
              * @exception IOException Exception raised by the FileWriter is passed on
              * to next level.
        -     * @exception UnSupportedEncodingException Exception raised by the
        +     * @exception UnsupportedEncodingException Exception raised by the
              * OutputStreamWriter is passed on to next level.
              * @return Writer Writer for the file getting generated.
              * @see java.io.FileOutputStream
        @@ -598,9 +599,7 @@ public class Util {
                     fos = new FileOutputStream(filename);
                 }
                 if (docencoding == null) {
        -            OutputStreamWriter oswriter = new OutputStreamWriter(fos);
        -            docencoding = oswriter.getEncoding();
        -            return oswriter;
        +            return new OutputStreamWriter(fos);
                 } else {
                     return new OutputStreamWriter(fos, docencoding);
                 }
        diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Types.java b/langtools/src/share/classes/com/sun/tools/javac/code/Types.java
        index 2a1de89d886..cc9c8100069 100644
        --- a/langtools/src/share/classes/com/sun/tools/javac/code/Types.java
        +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Types.java
        @@ -709,12 +709,31 @@ public class Types {
                 case UNDETVAR:
                     if (s.tag == WILDCARD) {
                         UndetVar undetvar = (UndetVar)t;
        -                undetvar.inst = glb(upperBound(s), undetvar.inst);
        -                // We should check instantiated type against any of the
        -                // undetvar's lower bounds.
        -                for (Type t2 : undetvar.lobounds) {
        -                    if (!isSubtype(t2, undetvar.inst))
        -                        return false;
        +                WildcardType wt = (WildcardType)s;
        +                switch(wt.kind) {
        +                    case UNBOUND: //similar to ? extends Object
        +                    case EXTENDS: {
        +                        Type bound = upperBound(s);
        +                        // We should check the new upper bound against any of the
        +                        // undetvar's lower bounds.
        +                        for (Type t2 : undetvar.lobounds) {
        +                            if (!isSubtype(t2, bound))
        +                                return false;
        +                        }
        +                        undetvar.hibounds = undetvar.hibounds.prepend(bound);
        +                        break;
        +                    }
        +                    case SUPER: {
        +                        Type bound = lowerBound(s);
        +                        // We should check the new lower bound against any of the
        +                        // undetvar's lower bounds.
        +                        for (Type t2 : undetvar.hibounds) {
        +                            if (!isSubtype(bound, t2))
        +                                return false;
        +                        }
        +                        undetvar.lobounds = undetvar.lobounds.prepend(bound);
        +                        break;
        +                    }
                         }
                         return true;
                     } else {
        @@ -930,12 +949,16 @@ public class Types {
                         }
         
                         if (t.isCompound()) {
        +                    Warner oldWarner = warnStack.head;
        +                    warnStack.head = Warner.noWarnings;
                             if (!visit(supertype(t), s))
                                 return false;
                             for (Type intf : interfaces(t)) {
                                 if (!visit(intf, s))
                                     return false;
                             }
        +                    if (warnStack.head.unchecked == true)
        +                        oldWarner.warnUnchecked();
                             return true;
                         }
         
        @@ -2108,9 +2131,6 @@ public class Types {
                                           List to) {
                 if (tvars.isEmpty())
                     return tvars;
        -        if (tvars.tail.isEmpty())
        -            // fast common case
        -            return List.of(substBound((TypeVar)tvars.head, from, to));
                 ListBuffer newBoundsBuf = lb();
                 boolean changed = false;
                 // calculate new bounds
        @@ -2150,8 +2170,14 @@ public class Types {
                 Type bound1 = subst(t.bound, from, to);
                 if (bound1 == t.bound)
                     return t;
        -        else
        -            return new TypeVar(t.tsym, bound1, syms.botType);
        +        else {
        +            // create new type variable without bounds
        +            TypeVar tv = new TypeVar(t.tsym, null, syms.botType);
        +            // the new bound should use the new type variable in place
        +            // of the old
        +            tv.bound = subst(bound1, List.of(t), List.of(tv));
        +            return tv;
        +        }
             }
             // 
         
        @@ -2825,6 +2851,16 @@ public class Types {
             // 
         
             // 
        +    public Type glb(List ts) {
        +        Type t1 = ts.head;
        +        for (Type t2 : ts.tail) {
        +            if (t1.isErroneous())
        +                return t1;
        +            t1 = glb(t1, t2);
        +        }
        +        return t1;
        +    }
        +    //where
             public Type glb(Type t, Type s) {
                 if (s == null)
                     return t;
        diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java
        index cfd47e6fb4a..9e0b2582b91 100644
        --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java
        +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java
        @@ -154,33 +154,15 @@ public class Infer {
                         that.inst = syms.objectType;
                     else if (that.hibounds.tail.isEmpty())
                         that.inst = that.hibounds.head;
        -            else {
        -                for (List bs = that.hibounds;
        -                     bs.nonEmpty() && that.inst == null;
        -                     bs = bs.tail) {
        -                    // System.out.println("hibounds = " + that.hibounds);//DEBUG
        -                    if (isSubClass(bs.head, that.hibounds))
        -                        that.inst = types.fromUnknownFun.apply(bs.head);
        -                }
        -                if (that.inst == null) {
        -                    int classCount = 0, interfaceCount = 0;
        -                    for (Type t : that.hibounds) {
        -                        if (t.tag == CLASS) {
        -                            if (t.isInterface())
        -                                interfaceCount++;
        -                            else
        -                                classCount++;
        -                        }
        -                    }
        -                    if ((that.hibounds.size() == classCount + interfaceCount) && classCount == 1)
        -                        that.inst = types.makeCompoundType(that.hibounds);
        -                }
        -                if (that.inst == null || !types.isSubtypeUnchecked(that.inst, that.hibounds, warn))
        -                    throw ambiguousNoInstanceException
        -                        .setMessage("no.unique.maximal.instance.exists",
        -                                    that.qtype, that.hibounds);
        -            }
        +            else
        +                that.inst = types.glb(that.hibounds);
                 }
        +        if (that.inst == null ||
        +            that.inst.isErroneous() ||
        +            !types.isSubtypeUnchecked(that.inst, that.hibounds, warn))
        +            throw ambiguousNoInstanceException
        +                .setMessage("no.unique.maximal.instance.exists",
        +                            that.qtype, that.hibounds);
             }
             //where
                 private boolean isSubClass(Type t, final List ts) {
        diff --git a/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java b/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java
        index 3f4911bb06c..8130dfc183e 100644
        --- a/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java
        +++ b/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java
        @@ -371,6 +371,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter {
                                 context.get(DiagnosticListener.class) != null;
                 devVerbose    = options.get("dev") != null;
                 processPcks   = options.get("process.packages") != null;
        +        werror        = options.get("-Werror")        != null;
         
                 verboseCompilePolicy = options.get("verboseCompilePolicy") != null;
         
        @@ -434,6 +435,10 @@ public class JavaCompiler implements ClassReader.SourceCompleter {
              */
             protected boolean processPcks;
         
        +    /** Switch: treat warnings as errors
        +     */
        +    protected boolean werror;
        +
             /** Switch: is annotation processing requested explitly via
              * CompilationTask.setProcessors?
              */
        @@ -471,6 +476,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter {
                 private int value;
             };
             protected class CompileStates extends HashMap,CompileState> {
        +        private static final long serialVersionUID = 1812267524140424433L;
                 boolean isDone(Env env, CompileState cs) {
                     CompileState ecs = get(env);
                     return ecs != null && ecs.isDone(cs);
        @@ -489,7 +495,11 @@ public class JavaCompiler implements ClassReader.SourceCompleter {
             public int errorCount() {
                 if (delegateCompiler != null && delegateCompiler != this)
                     return delegateCompiler.errorCount();
        -        else
        +        else {
        +            if (werror && log.nerrors == 0 && log.nwarnings > 0) {
        +                log.error("warnings.and.werror");
        +            }
        +        }
                     return log.nerrors;
             }
         
        diff --git a/langtools/src/share/classes/com/sun/tools/javac/main/Main.java b/langtools/src/share/classes/com/sun/tools/javac/main/Main.java
        index e8165090b4e..19f9f6e0e99 100644
        --- a/langtools/src/share/classes/com/sun/tools/javac/main/Main.java
        +++ b/langtools/src/share/classes/com/sun/tools/javac/main/Main.java
        @@ -338,13 +338,13 @@ public class Main {
                         return EXIT_CMDERR;
                     }
         
        -            List filenames;
        +            List files;
                     try {
        -                filenames = processArgs(CommandLine.parse(args));
        -                if (filenames == null) {
        +                files = processArgs(CommandLine.parse(args));
        +                if (files == null) {
                             // null signals an error in options, abort
                             return EXIT_CMDERR;
        -                } else if (filenames.isEmpty() && fileObjects.isEmpty() && classnames.isEmpty()) {
        +                } else if (files.isEmpty() && fileObjects.isEmpty() && classnames.isEmpty()) {
                             // it is allowed to compile nothing if just asking for help or version info
                             if (options.get("-help") != null
                                 || options.get("-X") != null
        @@ -380,12 +380,14 @@ public class Main {
                     comp = JavaCompiler.instance(context);
                     if (comp == null) return EXIT_SYSERR;
         
        -            if (!filenames.isEmpty()) {
        +            Log log = Log.instance(context);
        +
        +            if (!files.isEmpty()) {
                         // add filenames to fileObjects
                         comp = JavaCompiler.instance(context);
                         List otherFiles = List.nil();
                         JavacFileManager dfm = (JavacFileManager)fileManager;
        -                for (JavaFileObject fo : dfm.getJavaFileObjectsFromFiles(filenames))
        +                for (JavaFileObject fo : dfm.getJavaFileObjectsFromFiles(files))
                             otherFiles = otherFiles.prepend(fo);
                         for (JavaFileObject fo : otherFiles)
                             fileObjects = fileObjects.prepend(fo);
        @@ -394,8 +396,17 @@ public class Main {
                                  classnames.toList(),
                                  processors);
         
        -            if (comp.errorCount() != 0 ||
        -                options.get("-Werror") != null && comp.warningCount() != 0)
        +            if (log.expectDiagKeys != null) {
        +                if (log.expectDiagKeys.size() == 0) {
        +                    Log.printLines(log.noticeWriter, "all expected diagnostics found");
        +                    return EXIT_OK;
        +                } else {
        +                    Log.printLines(log.noticeWriter, "expected diagnostic keys not found: " + log.expectDiagKeys);
        +                    return EXIT_ERROR;
        +                }
        +            }
        +
        +            if (comp.errorCount() != 0)
                         return EXIT_ERROR;
                 } catch (IOException ex) {
                     ioMessage(ex);
        diff --git a/langtools/src/share/classes/com/sun/tools/javac/main/RecognizedOptions.java b/langtools/src/share/classes/com/sun/tools/javac/main/RecognizedOptions.java
        index 7a2f2c72a06..980d6779674 100644
        --- a/langtools/src/share/classes/com/sun/tools/javac/main/RecognizedOptions.java
        +++ b/langtools/src/share/classes/com/sun/tools/javac/main/RecognizedOptions.java
        @@ -449,7 +449,7 @@ public class RecognizedOptions {
                 },
         
                 // treat warnings as errors
        -        new HiddenOption(WERROR),
        +        new Option(WERROR,                                      "opt.Werror"),
         
                 // use complex inference from context in the position of a method call argument
                 new HiddenOption(COMPLEXINFERENCE),
        diff --git a/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java b/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java
        index ef48f23984f..a1bd2da6e55 100644
        --- a/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java
        +++ b/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java
        @@ -863,13 +863,13 @@ public class JavacParser implements Parser {
                                 accept(GT);
                                 t = F.at(pos1).TypeApply(t, args.toList());
                                 checkGenerics();
        -                        t = bracketsOpt(toP(t));
                                 while (S.token() == DOT) {
                                     S.nextToken();
                                     mode = TYPE;
                                     t = toP(F.at(S.pos()).Select(t, ident()));
                                     t = typeArgumentsOpt(t);
                                 }
        +                        t = bracketsOpt(toP(t));
                             } else if ((mode & EXPR) != 0) {
                                 mode = EXPR;
                                 t = F.at(pos1).Binary(op, t, term2Rest(t1, TreeInfo.shiftPrec));
        diff --git a/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties b/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties
        index 0ea7064f462..a7e75fa5f1e 100644
        --- a/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties
        +++ b/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties
        @@ -346,6 +346,9 @@ compiler.err.pkg.annotations.sb.in.package-info.java=\
         compiler.err.pkg.clashes.with.class.of.same.name=\
             package {0} clashes with class of same name
         
        +compiler.err.warnings.and.werror=\
        +    warnings found and -Werror specified
        +
         # Errors related to annotation processing
         
         compiler.err.proc.cant.access=\
        diff --git a/langtools/src/share/classes/com/sun/tools/javac/resources/javac.properties b/langtools/src/share/classes/com/sun/tools/javac/resources/javac.properties
        index e0d6d45aa62..4ef8a779c57 100644
        --- a/langtools/src/share/classes/com/sun/tools/javac/resources/javac.properties
        +++ b/langtools/src/share/classes/com/sun/tools/javac/resources/javac.properties
        @@ -69,6 +69,8 @@ javac.opt.target=\
             Generate class files for specific VM version
         javac.opt.source=\
             Provide source compatibility with specified release
        +javac.opt.Werror=\
        +    Terminate compilation if warnings occur
         javac.opt.A=\
             Options to pass to annotation processors
         javac.opt.implicit=\
        diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/BasicDiagnosticFormatter.java b/langtools/src/share/classes/com/sun/tools/javac/util/BasicDiagnosticFormatter.java
        index 345e2628c96..02102452cd2 100644
        --- a/langtools/src/share/classes/com/sun/tools/javac/util/BasicDiagnosticFormatter.java
        +++ b/langtools/src/share/classes/com/sun/tools/javac/util/BasicDiagnosticFormatter.java
        @@ -61,6 +61,7 @@ public class BasicDiagnosticFormatter extends AbstractDiagnosticFormatter {
              * @param opts list of command-line options
              * @param msgs JavacMessages object used for i18n
              */
        +    @SuppressWarnings("fallthrough")
             BasicDiagnosticFormatter(Options opts, JavacMessages msgs) {
                 super(msgs, opts, true);
                 initAvailableFormats();
        diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/Log.java b/langtools/src/share/classes/com/sun/tools/javac/util/Log.java
        index e9d21f712d3..e7359a3c283 100644
        --- a/langtools/src/share/classes/com/sun/tools/javac/util/Log.java
        +++ b/langtools/src/share/classes/com/sun/tools/javac/util/Log.java
        @@ -26,6 +26,7 @@
         package com.sun.tools.javac.util;
         
         import java.io.*;
        +import java.util.Arrays;
         import java.util.HashSet;
         import java.util.Map;
         import java.util.Set;
        @@ -96,6 +97,11 @@ public class Log extends AbstractLog {
              */
             private DiagnosticFormatter diagFormatter;
         
        +    /**
        +     * Keys for expected diagnostics
        +     */
        +    public Set expectDiagKeys;
        +
             /**
              * JavacMessages object used for localization
              */
        @@ -123,9 +129,13 @@ public class Log extends AbstractLog {
                 this.diagFormatter = rawDiagnostics ? new RawDiagnosticFormatter(options) :
                                                       new BasicDiagnosticFormatter(options, messages);
                 @SuppressWarnings("unchecked") // FIXME
        -        DiagnosticListener diagListener =
        +        DiagnosticListener dl =
                     context.get(DiagnosticListener.class);
        -        this.diagListener = diagListener;
        +        this.diagListener = dl;
        +
        +        String ek = options.get("expectKeys");
        +        if (ek != null)
        +            expectDiagKeys = new HashSet(Arrays.asList(ek.split(", *")));
             }
             // where
                 private int getIntOption(Options options, String optionName, int defaultValue) {
        @@ -291,6 +301,9 @@ public class Log extends AbstractLog {
              * reported so far, the diagnostic may be handed off to writeDiagnostic.
              */
             public void report(JCDiagnostic diagnostic) {
        +        if (expectDiagKeys != null)
        +            expectDiagKeys.remove(diagnostic.getCode());
        +
                 switch (diagnostic.getType()) {
                 case FRAGMENT:
                     throw new IllegalArgumentException();
        diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java
        index 18328a05396..e3f065650d1 100644
        --- a/langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java
        +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java
        @@ -25,42 +25,48 @@
         
         package com.sun.tools.javadoc;
         
        +import java.io.File;
        +import java.io.IOException;
        +import java.lang.reflect.Modifier;
        +import java.net.URI;
        +import java.util.HashSet;
        +import java.util.Set;
        +import javax.tools.FileObject;
        +import javax.tools.JavaFileManager.Location;
        +import javax.tools.StandardJavaFileManager;
        +import javax.tools.StandardLocation;
        +
         import com.sun.javadoc.*;
         
         import static com.sun.javadoc.LanguageVersion.*;
         
        -import com.sun.tools.javac.util.List;
        -import com.sun.tools.javac.util.ListBuffer;
        -import com.sun.tools.javac.util.Name;
        -import com.sun.tools.javac.util.Position;
        -
         import com.sun.tools.javac.code.Flags;
         import com.sun.tools.javac.code.Kinds;
        -import com.sun.tools.javac.code.TypeTags;
        -import com.sun.tools.javac.code.Type;
        -import com.sun.tools.javac.code.Type.ClassType;
         import com.sun.tools.javac.code.Scope;
         import com.sun.tools.javac.code.Symbol;
         import com.sun.tools.javac.code.Symbol.*;
        +import com.sun.tools.javac.code.Type;
        +import com.sun.tools.javac.code.Type.ClassType;
        +import com.sun.tools.javac.code.TypeTags;
         
         import com.sun.tools.javac.comp.AttrContext;
         import com.sun.tools.javac.comp.Env;
         
         import com.sun.tools.javac.tree.JCTree;
        +import com.sun.tools.javac.tree.JCTree.JCClassDecl;
         import com.sun.tools.javac.tree.JCTree.JCFieldAccess;
         import com.sun.tools.javac.tree.JCTree.JCImport;
        -import com.sun.tools.javac.tree.JCTree.JCClassDecl;
         import com.sun.tools.javac.tree.TreeInfo;
         
        +import com.sun.tools.javac.util.List;
        +import com.sun.tools.javac.util.ListBuffer;
        +import com.sun.tools.javac.util.Name;
         import com.sun.tools.javac.util.Names;
        +import com.sun.tools.javac.util.Position;
        +
         import static com.sun.tools.javac.code.Flags.*;
         import static com.sun.tools.javac.code.Kinds.*;
         
        -import java.io.File;
        -import java.util.Set;
        -import java.util.HashSet;
        -import java.lang.reflect.Modifier;
        -
         /**
          * Represents a java class and provides access to information
          * about the class, the class' comment and tags, and the
        @@ -271,16 +277,41 @@ public class ClassDocImpl extends ProgramElementDocImpl implements ClassDoc {
              */
             public PackageDoc containingPackage() {
                 PackageDocImpl p = env.getPackageDoc(tsym.packge());
        -        SourcePosition po = position();
        -        if (po != null && p.setDocPath == false && p.zipDocPath == null) {
        -            //Set the package path if possible
        -            File packageDir = po.file().getParentFile();
        -            if (packageDir != null
        -                && (new File(packageDir, "package.html")).exists()) {
        -                p.setDocPath(packageDir.getPath());
        -            } else {
        -                p.setDocPath(null);
        +        if (p.setDocPath == false) {
        +            FileObject docPath;
        +            try {
        +                Location location = env.fileManager.hasLocation(StandardLocation.SOURCE_PATH)
        +                    ? StandardLocation.SOURCE_PATH : StandardLocation.CLASS_PATH;
        +
        +                docPath = env.fileManager.getFileForInput(
        +                        location, p.qualifiedName(), "package.html");
        +            } catch (IOException e) {
        +                docPath = null;
                     }
        +
        +            if (docPath == null) {
        +                // fall back on older semantics of looking in same directory as
        +                // source file for this class
        +                SourcePosition po = position();
        +                if (env.fileManager instanceof StandardJavaFileManager &&
        +                        po instanceof SourcePositionImpl) {
        +                    URI uri = ((SourcePositionImpl) po).filename.toUri();
        +                    if ("file".equals(uri.getScheme())) {
        +                        File f = new File(uri.getPath());
        +                        File dir = f.getParentFile();
        +                        if (dir != null) {
        +                            File pf = new File(dir, "package.html");
        +                            if (pf.exists()) {
        +                                StandardJavaFileManager sfm = (StandardJavaFileManager) env.fileManager;
        +                                docPath = sfm.getJavaFileObjects(pf).iterator().next();
        +                            }
        +                        }
        +
        +                    }
        +                }
        +            }
        +
        +            p.setDocPath(docPath);
                 }
                 return p;
             }
        @@ -1251,7 +1282,7 @@ public class ClassDocImpl extends ProgramElementDocImpl implements ClassDoc {
              */
             public SourcePosition position() {
                 if (tsym.sourcefile == null) return null;
        -        return SourcePositionImpl.make(tsym.sourcefile.toString(),
        +        return SourcePositionImpl.make(tsym.sourcefile,
                                                (tree==null) ? Position.NOPOS : tree.pos,
                                                lineMap);
             }
        diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/Comment.java b/langtools/src/share/classes/com/sun/tools/javadoc/Comment.java
        index af4322e9a3c..6ce71e30600 100644
        --- a/langtools/src/share/classes/com/sun/tools/javadoc/Comment.java
        +++ b/langtools/src/share/classes/com/sun/tools/javadoc/Comment.java
        @@ -74,6 +74,7 @@ class Comment {
                  * the tag text.
                  * 
        */ + @SuppressWarnings("fallthrough") class CommentStringParser { /** * The entry point to the comment string parser diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/DocEnv.java b/langtools/src/share/classes/com/sun/tools/javadoc/DocEnv.java index d8ddd701be7..aeb39bf2758 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/DocEnv.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/DocEnv.java @@ -25,8 +25,9 @@ package com.sun.tools.javadoc; -import java.util.*; import java.lang.reflect.Modifier; +import java.util.*; +import javax.tools.JavaFileManager; import com.sun.javadoc.*; @@ -40,7 +41,6 @@ import com.sun.tools.javac.util.Context; import com.sun.tools.javac.util.Names; import com.sun.tools.javac.util.Position; - /** * Holds the environment for a run of javadoc. * Holds only the information needed throughout the @@ -103,6 +103,7 @@ public class DocEnv { Check chk; Types types; + JavaFileManager fileManager; /** Allow documenting from class files? */ boolean docClasses = false; @@ -133,6 +134,7 @@ public class DocEnv { externalizableSym = reader.enterClass(names.fromString("java.io.Externalizable")); chk = Check.instance(context); types = Types.instance(context); + fileManager = context.get(JavaFileManager.class); // Default. Should normally be reset with setLocale. this.doclocale = new DocLocale(this, "", breakiterator); diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/DocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/DocImpl.java index 3d3f7c62998..636f9e85211 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/DocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/DocImpl.java @@ -25,11 +25,13 @@ package com.sun.tools.javadoc; -import com.sun.javadoc.*; - import java.io.InputStream; import java.io.IOException; import java.text.CollationKey; +import javax.tools.FileObject; + +import com.sun.javadoc.*; + import com.sun.tools.javac.util.Position; /** @@ -43,7 +45,7 @@ import com.sun.tools.javac.util.Position; * @author Atul M Dambalkar * @author Neal Gafter (rewrite) */ -abstract class DocImpl implements Doc, Comparable { +public abstract class DocImpl implements Doc, Comparable { /** * Doc environment @@ -163,7 +165,7 @@ abstract class DocImpl implements Doc, Comparable { /** * Utility for subclasses which read HTML documentation files. */ - String readHTMLDocumentation(InputStream input, String filename) throws IOException { + String readHTMLDocumentation(InputStream input, FileObject filename) throws IOException { int filesize = input.available(); byte[] filecontents = new byte[filesize]; input.read(filecontents, 0, filesize); diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java b/langtools/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java index 698b3cfe965..34397953a58 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java @@ -83,7 +83,7 @@ public class DocletInvoker { cpString = appendPath(docletPath, cpString); URL[] urls = pathToURLs(cpString); if (docletParentClassLoader == null) - appClassLoader = new URLClassLoader(urls); + appClassLoader = new URLClassLoader(urls, getDelegationClassLoader(docletClassName)); else appClassLoader = new URLClassLoader(urls, docletParentClassLoader); @@ -98,6 +98,57 @@ public class DocletInvoker { docletClass = dc; } + /* + * Returns the delegation class loader to use when creating + * appClassLoader (used to load the doclet). The context class + * loader is the best choice, but legacy behavior was to use the + * default delegation class loader (aka system class loader). + * + * Here we favor using the context class loader. To ensure + * compatibility with existing apps, we revert to legacy + * behavior if either or both of the following conditions hold: + * + * 1) the doclet is loadable from the system class loader but not + * from the context class loader, + * + * 2) this.getClass() is loadable from the system class loader but not + * from the context class loader. + */ + private ClassLoader getDelegationClassLoader(String docletClassName) { + ClassLoader ctxCL = Thread.currentThread().getContextClassLoader(); + ClassLoader sysCL = ClassLoader.getSystemClassLoader(); + if (sysCL == null) + return ctxCL; + if (ctxCL == null) + return sysCL; + + // Condition 1. + try { + sysCL.loadClass(docletClassName); + try { + ctxCL.loadClass(docletClassName); + } catch (ClassNotFoundException e) { + return sysCL; + } + } catch (ClassNotFoundException e) { + } + + // Condition 2. + try { + if (getClass() == sysCL.loadClass(getClass().getName())) { + try { + if (getClass() != ctxCL.loadClass(getClass().getName())) + return sysCL; + } catch (ClassNotFoundException e) { + return sysCL; + } + } + } catch (ClassNotFoundException e) { + } + + return ctxCL; + } + /** * Generate documentation here. Return true on success. */ @@ -231,6 +282,8 @@ public class DocletInvoker { docletClassName, methodName); throw new DocletInvokeException(); } + ClassLoader savedCCL = + Thread.currentThread().getContextClassLoader(); try { Thread.currentThread().setContextClassLoader(appClassLoader); return meth.invoke(null , params); @@ -256,6 +309,8 @@ public class DocletInvoker { exc.getTargetException().printStackTrace(); } throw new DocletInvokeException(); + } finally { + Thread.currentThread().setContextClassLoader(savedCCL); } } diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/ExecutableMemberDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/ExecutableMemberDocImpl.java index 4162db4b1c1..7647ac03211 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/ExecutableMemberDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ExecutableMemberDocImpl.java @@ -25,20 +25,18 @@ package com.sun.tools.javadoc; +import java.lang.reflect.Modifier; +import java.text.CollationKey; + import com.sun.javadoc.*; +import com.sun.tools.javac.code.Flags; +import com.sun.tools.javac.code.Symbol.*; +import com.sun.tools.javac.code.Type; +import com.sun.tools.javac.tree.JCTree.JCMethodDecl; import com.sun.tools.javac.util.List; import com.sun.tools.javac.util.ListBuffer; import com.sun.tools.javac.util.Position; -import com.sun.tools.javac.code.Flags; -import com.sun.tools.javac.code.Type; -import com.sun.tools.javac.code.Symbol; -import com.sun.tools.javac.code.Symbol.*; -import com.sun.tools.javac.tree.JCTree.JCMethodDecl; - -import java.text.CollationKey; - -import java.lang.reflect.Modifier; /** * Represents a method or constructor of a java class. @@ -267,7 +265,7 @@ public abstract class ExecutableMemberDocImpl */ public SourcePosition position() { if (sym.enclClass().sourcefile == null) return null; - return SourcePositionImpl.make(sym.enclClass().sourcefile.toString(), + return SourcePositionImpl.make(sym.enclClass().sourcefile, (tree==null) ? 0 : tree.pos, lineMap); } diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/FieldDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/FieldDocImpl.java index 4e7fe4a196e..4da1e1b819b 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/FieldDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/FieldDocImpl.java @@ -25,6 +25,8 @@ package com.sun.tools.javadoc; +import java.lang.reflect.Modifier; + import com.sun.javadoc.*; import static com.sun.javadoc.LanguageVersion.*; @@ -38,9 +40,6 @@ import com.sun.tools.javac.tree.JCTree.JCVariableDecl; import com.sun.tools.javac.util.Position; -import java.lang.reflect.Modifier; - - /** * Represents a field in a java class. * @@ -260,7 +259,7 @@ public class FieldDocImpl extends MemberDocImpl implements FieldDoc { */ public SourcePosition position() { if (sym.enclClass().sourcefile == null) return null; - return SourcePositionImpl.make(sym.enclClass().sourcefile.toString(), + return SourcePositionImpl.make(sym.enclClass().sourcefile, (tree==null) ? 0 : tree.pos, lineMap); } diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocClassReader.java b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocClassReader.java index 12303e042e6..dbda1435c3b 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocClassReader.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocClassReader.java @@ -25,18 +25,13 @@ package com.sun.tools.javadoc; -import com.sun.tools.javac.code.Symbol.PackageSymbol; -import com.sun.tools.javac.file.JavacFileManager; -import com.sun.tools.javac.file.ZipArchive.ZipFileObject; -import com.sun.tools.javac.file.Old199; -import com.sun.tools.javac.file.ZipFileIndexArchive; -import com.sun.tools.javac.jvm.ClassReader; -import com.sun.tools.javac.util.Context; - -import java.io.File; import java.util.EnumSet; import javax.tools.JavaFileObject; +import com.sun.tools.javac.code.Symbol.PackageSymbol; +import com.sun.tools.javac.jvm.ClassReader; +import com.sun.tools.javac.util.Context; + /** Javadoc uses an extended class reader that records package.html entries * @author Neal Gafter */ @@ -82,32 +77,7 @@ class JavadocClassReader extends ClassReader { */ @Override protected void extraFileActions(PackageSymbol pack, JavaFileObject fo) { - CharSequence fileName = Old199.getName(fo); - if (docenv != null && fileName.equals("package.html")) { - if (fo instanceof ZipFileObject) { - ZipFileObject zfo = (ZipFileObject) fo; - String zipName = zfo.getZipName(); - String entryName = zfo.getZipEntryName(); - int lastSep = entryName.lastIndexOf("/"); - String classPathName = entryName.substring(0, lastSep + 1); - docenv.getPackageDoc(pack).setDocPath(zipName, classPathName); - } - else if (fo instanceof ZipFileIndexArchive.ZipFileIndexFileObject) { - ZipFileIndexArchive.ZipFileIndexFileObject zfo = (ZipFileIndexArchive.ZipFileIndexFileObject) fo; - String zipName = zfo.getZipName(); - String entryName = zfo.getZipEntryName(); - if (File.separatorChar != '/') { - entryName = entryName.replace(File.separatorChar, '/'); - } - - int lastSep = entryName.lastIndexOf("/"); - String classPathName = entryName.substring(0, lastSep + 1); - docenv.getPackageDoc(pack).setDocPath(zipName, classPathName); - } - else { - File fileDir = new File(Old199.getPath(fo)).getParentFile(); - docenv.getPackageDoc(pack).setDocPath(fileDir.getAbsolutePath()); - } - } + if (fo.isNameCompatible("package", JavaFileObject.Kind.HTML)) + docenv.getPackageDoc(pack).setDocPath(fo); } } diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocTool.java b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocTool.java index 30c4c74e56c..2cb3ab3288d 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocTool.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocTool.java @@ -25,17 +25,29 @@ package com.sun.tools.javadoc; -import java.io.*; - +import java.io.File; +import java.io.IOException; import java.util.Collection; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import javax.tools.JavaFileManager.Location; +import javax.tools.JavaFileObject; +import javax.tools.StandardJavaFileManager; +import javax.tools.StandardLocation; -import com.sun.tools.javac.code.Symbol.*; -import com.sun.tools.javac.comp.*; -import com.sun.tools.javac.file.Paths; +import com.sun.tools.javac.code.Symbol.CompletionFailure; +import com.sun.tools.javac.comp.Annotate; import com.sun.tools.javac.parser.DocCommentScanner; -import com.sun.tools.javac.tree.*; -import com.sun.tools.javac.tree.JCTree.*; -import com.sun.tools.javac.util.*; +import com.sun.tools.javac.tree.JCTree; +import com.sun.tools.javac.tree.JCTree.JCClassDecl; +import com.sun.tools.javac.tree.JCTree.JCCompilationUnit; +import com.sun.tools.javac.util.Abort; +import com.sun.tools.javac.util.Context; +import com.sun.tools.javac.util.List; +import com.sun.tools.javac.util.ListBuffer; +import com.sun.tools.javac.util.Position; /** @@ -53,7 +65,6 @@ public class JavadocTool extends com.sun.tools.javac.main.JavaCompiler { final JavadocClassReader reader; final JavadocEnter enter; final Annotate annotate; - private final Paths paths; /** * Construct a new JavaCompiler processor, using appropriately @@ -66,7 +77,6 @@ public class JavadocTool extends com.sun.tools.javac.main.JavaCompiler { reader = JavadocClassReader.instance0(context); enter = JavadocEnter.instance0(context); annotate = Annotate.instance(context); - paths = Paths.instance(context); } /** @@ -120,7 +130,7 @@ public class JavadocTool extends com.sun.tools.javac.main.JavaCompiler { boolean quiet) throws IOException { docenv = DocEnv.instance(context); docenv.showAccess = filter; - docenv.quiet = quiet; + docenv.quiet = quiet; docenv.breakiterator = breakiterator; docenv.setLocale(doclocale); docenv.setEncoding(encoding); @@ -133,12 +143,14 @@ public class JavadocTool extends com.sun.tools.javac.main.JavaCompiler { ListBuffer packTrees = new ListBuffer(); try { + StandardJavaFileManager fm = (StandardJavaFileManager) docenv.fileManager; for (List it = javaNames; it.nonEmpty(); it = it.tail) { String name = it.head; if (!docClasses && name.endsWith(".java") && new File(name).exists()) { + JavaFileObject fo = fm.getJavaFileObjects(name).iterator().next(); docenv.notice("main.Loading_source_file", name); - JCCompilationUnit tree = parse(name); - classTrees.append(tree); + JCCompilationUnit tree = parse(fo); + classTrees.append(tree); } else if (isValidPackageName(name)) { names = names.append(name); } else if (name.endsWith(".java")) { @@ -151,12 +163,14 @@ public class JavadocTool extends com.sun.tools.javac.main.JavaCompiler { if (!docClasses) { // Recursively search given subpackages. If any packages //are found, add them to the list. - searchSubPackages(subPackages, names, excludedPackages); + Map> packageFiles = + searchSubPackages(subPackages, names, excludedPackages); // Parse the packages for (List packs = names.toList(); packs.nonEmpty(); packs = packs.tail) { // Parse sources ostensibly belonging to package. - parsePackageClasses(packs.head, packTrees, excludedPackages); + String packageName = packs.head; + parsePackageClasses(packageName, packageFiles.get(packageName), packTrees, excludedPackages); } if (messager.nerrors() != 0) return null; @@ -167,7 +181,8 @@ public class JavadocTool extends com.sun.tools.javac.main.JavaCompiler { } } catch (Abort ex) {} - if (messager.nerrors() != 0) return null; + if (messager.nerrors() != 0) + return null; if (docClasses) return new RootDocImpl(docenv, javaNames, options); @@ -185,66 +200,129 @@ public class JavadocTool extends com.sun.tools.javac.main.JavaCompiler { return isValidClassName(s); } - - private final static char pathSep = File.pathSeparatorChar; - /** * search all directories in path for subdirectory name. Add all * .java files found in such a directory to args. */ private void parsePackageClasses(String name, - ListBuffer trees, - List excludedPackages) - throws IOException { + Iterable files, + ListBuffer trees, + List excludedPackages) + throws IOException { if (excludedPackages.contains(name)) { return; } + boolean hasFiles = false; docenv.notice("main.Loading_source_files_for_package", name); - name = name.replace('.', File.separatorChar); - for (File pathname : paths.sourceSearchPath()) { - File f = new File(pathname, name); - String names[] = f.list(); - // if names not null, then found directory with source files - if (names != null) { - String dir = f.getAbsolutePath(); - if (!dir.endsWith(File.separator)) - dir = dir + File.separator; - for (int j = 0; j < names.length; j++) { - if (isValidJavaSourceFile(names[j])) { - String fn = dir + names[j]; - // messager.notice("main.Loading_source_file", fn); - trees.append(parse(fn)); - hasFiles = true; - } + + if (files == null) { + Location location = docenv.fileManager.hasLocation(StandardLocation.SOURCE_PATH) + ? StandardLocation.SOURCE_PATH : StandardLocation.CLASS_PATH; + ListBuffer lb = new ListBuffer(); + for (JavaFileObject fo: docenv.fileManager.list( + location, name, EnumSet.of(JavaFileObject.Kind.SOURCE), false)) { + String binaryName = docenv.fileManager.inferBinaryName(location, fo); + String simpleName = getSimpleName(binaryName); + if (isValidClassName(simpleName)) { + lb.append(fo); } } + files = lb.toList(); } - if (!hasFiles) + + for (JavaFileObject fo : files) { + // messager.notice("main.Loading_source_file", fn); + trees.append(parse(fo)); + hasFiles = true; + } + + if (!hasFiles) { messager.warning(null, "main.no_source_files_for_package", - name.replace(File.separatorChar, '.')); + name.replace(File.separatorChar, '.')); + } } /** * Recursively search all directories in path for subdirectory name. * Add all packages found in such a directory to packages list. */ - private void searchSubPackages(List subPackages, - ListBuffer packages, - List excludedPackages) { - // FIXME: This search path is bogus. - // Only the effective source path should be searched for sources. - // Only the effective class path should be searched for classes. - // Should the bootclasspath/extdirs also be searched for classes? - java.util.List pathnames = new java.util.ArrayList(); - if (paths.sourcePath() != null) - for (File elt : paths.sourcePath()) - pathnames.add(elt); - for (File elt : paths.userClassPath()) - pathnames.add(elt); + private Map> searchSubPackages( + List subPackages, + ListBuffer packages, + List excludedPackages) + throws IOException { + Map> packageFiles = + new HashMap>(); - for (String subPackage : subPackages) - searchSubPackage(subPackage, packages, excludedPackages, pathnames); + Map includedPackages = new HashMap(); + includedPackages.put("", true); + for (String p: excludedPackages) + includedPackages.put(p, false); + + if (docenv.fileManager.hasLocation(StandardLocation.SOURCE_PATH)) { + searchSubPackages(subPackages, + includedPackages, + packages, packageFiles, + StandardLocation.SOURCE_PATH, + EnumSet.of(JavaFileObject.Kind.SOURCE)); + searchSubPackages(subPackages, + includedPackages, + packages, packageFiles, + StandardLocation.CLASS_PATH, + EnumSet.of(JavaFileObject.Kind.CLASS)); + } else { + searchSubPackages(subPackages, + includedPackages, + packages, packageFiles, + StandardLocation.CLASS_PATH, + EnumSet.of(JavaFileObject.Kind.SOURCE, JavaFileObject.Kind.CLASS)); + } + return packageFiles; + } + + private void searchSubPackages(List subPackages, + Map includedPackages, + ListBuffer packages, + Map> packageFiles, + StandardLocation location, Set kinds) + throws IOException { + for (String subPackage: subPackages) { + if (!isIncluded(subPackage, includedPackages)) + continue; + + for (JavaFileObject fo: docenv.fileManager.list(location, subPackage, kinds, true)) { + String binaryName = docenv.fileManager.inferBinaryName(location, fo); + String packageName = getPackageName(binaryName); + String simpleName = getSimpleName(binaryName); + if (isIncluded(packageName, includedPackages) && isValidClassName(simpleName)) { + List list = packageFiles.get(packageName); + list = (list == null ? List.of(fo) : list.prepend(fo)); + packageFiles.put(packageName, list); + if (!packages.contains(packageName)) + packages.add(packageName); + } + } + } + } + + private String getPackageName(String name) { + int lastDot = name.lastIndexOf("."); + return (lastDot == -1 ? "" : name.substring(0, lastDot)); + } + + private String getSimpleName(String name) { + int lastDot = name.lastIndexOf("."); + return (lastDot == -1 ? name : name.substring(lastDot + 1)); + } + + private boolean isIncluded(String packageName, Map includedPackages) { + Boolean b = includedPackages.get(packageName); + if (b == null) { + b = isIncluded(getPackageName(packageName), includedPackages); + includedPackages.put(packageName, b); + } + return b; } /** diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/Messager.java b/langtools/src/share/classes/com/sun/tools/javadoc/Messager.java index 1933862a5c7..4419fc2ea18 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/Messager.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/Messager.java @@ -111,6 +111,7 @@ public class Messager extends Log implements DocErrorReporter { * @param warnWriter Stream for warnings * @param noticeWriter Stream for other messages */ + @SuppressWarnings("deprecation") protected Messager(Context context, String programName, PrintWriter errWriter, diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/PackageDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/PackageDocImpl.java index 426123eba25..97e1b09b66e 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/PackageDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/PackageDocImpl.java @@ -25,30 +25,23 @@ package com.sun.tools.javadoc; -import com.sun.javadoc.*; - -import java.io.File; import java.io.InputStream; -import java.io.FileInputStream; import java.io.IOException; -import java.util.zip.ZipFile; -import java.util.zip.ZipEntry; +import javax.tools.FileObject; + +import com.sun.javadoc.*; import com.sun.tools.javac.code.Attribute; import com.sun.tools.javac.code.Scope; import com.sun.tools.javac.code.Symbol.ClassSymbol; import com.sun.tools.javac.code.Symbol.PackageSymbol; -import com.sun.tools.javac.comp.AttrContext; -import com.sun.tools.javac.comp.Env; import com.sun.tools.javac.tree.JCTree; +import com.sun.tools.javac.tree.JCTree.JCCompilationUnit; import com.sun.tools.javac.util.List; import com.sun.tools.javac.util.ListBuffer; import com.sun.tools.javac.util.Name; import com.sun.tools.javac.util.Position; -import com.sun.tools.javac.tree.JCTree.JCCompilationUnit; - - /** * Represents a java package. Provides access to information * about the package, the package's comment and tags, and the @@ -63,14 +56,10 @@ import com.sun.tools.javac.tree.JCTree.JCCompilationUnit; public class PackageDocImpl extends DocImpl implements PackageDoc { - private static final String PACKAGE_HTML_FILE_NAME = "package.html"; - protected PackageSymbol sym; private JCCompilationUnit tree = null; // for source position - public String docPath = null; - public String zipDocPath = null; - public String zipDocEntry = null; + public FileObject docPath = null; private boolean foundDoc; // found a doc comment in either // package.html or package-info.java @@ -108,30 +97,16 @@ public class PackageDocImpl extends DocImpl implements PackageDoc { * Do lazy initialization of "documentation" string. */ String documentation() { - if (documentation != null) return documentation; - if (zipDocPath != null) { - try { - ZipFile f = new ZipFile(zipDocPath); - ZipEntry entry = f.getEntry(zipDocEntry); - if (entry != null) { - InputStream s = f.getInputStream(entry); - return (documentation = readHTMLDocumentation(s, - zipDocPath + File.separatorChar + zipDocEntry)); - } - } catch (IOException exc) { - documentation = ""; - env.error(null, "javadoc.File_Read_Error", - zipDocPath + File.separatorChar + zipDocEntry); - } - } + if (documentation != null) + return documentation; if (docPath != null) { // read from file try { - InputStream s = new FileInputStream(docPath); + InputStream s = docPath.openInputStream(); documentation = readHTMLDocumentation(s, docPath); } catch (IOException exc) { documentation = ""; - env.error(null, "javadoc.File_Read_Error", docPath); + env.error(null, "javadoc.File_Read_Error", docPath.getName()); } } else { // no doc file to be had @@ -363,24 +338,12 @@ public class PackageDocImpl extends DocImpl implements PackageDoc { /** * set doc path for an unzipped directory */ - public void setDocPath(String path) { + public void setDocPath(FileObject path) { setDocPath = true; if (path == null) return; - String newDocPath = path + File.separatorChar + PACKAGE_HTML_FILE_NAME; - if (!newDocPath.equals(docPath)) { - docPath = newDocPath; - checkDoc(); - } - } - - /** - * set the doc path for zipped directory - */ - public void setDocPath(String path, String entry) { - if (!path.equals(zipDocPath)) { - zipDocPath = path; - zipDocEntry = entry + PACKAGE_HTML_FILE_NAME; + if (!path.equals(docPath)) { + docPath = path; checkDoc(); } } @@ -409,7 +372,7 @@ public class PackageDocImpl extends DocImpl implements PackageDoc { */ public SourcePosition position() { return (tree != null) - ? SourcePositionImpl.make(tree.sourcefile + "", tree.pos, tree.lineMap) + ? SourcePositionImpl.make(tree.sourcefile, tree.pos, tree.lineMap) : SourcePositionImpl.make(docPath, Position.NOPOS, null); } } diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/RootDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/RootDocImpl.java index 8595151cc32..e39f0b3e1d4 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/RootDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/RootDocImpl.java @@ -26,13 +26,13 @@ package com.sun.tools.javadoc; import java.io.IOException; -import java.io.FileInputStream; -import java.io.File; +import java.util.Locale; +import javax.tools.JavaFileObject; +import javax.tools.StandardJavaFileManager; import com.sun.javadoc.*; import com.sun.tools.javac.tree.JCTree.JCClassDecl; -import com.sun.tools.javac.code.Symbol; import com.sun.tools.javac.util.List; import com.sun.tools.javac.util.ListBuffer; import com.sun.tools.javac.util.Position; @@ -307,10 +307,13 @@ public class RootDocImpl extends DocImpl implements RootDoc { * Return the path of the overview file and null if it does not exist. * @return the path of the overview file and null if it does not exist. */ - private String getOverviewPath() { + private JavaFileObject getOverviewPath() { for (String[] opt : options) { if (opt[0].equals("-overview")) { - return opt[1]; + if (env.fileManager instanceof StandardJavaFileManager) { + StandardJavaFileManager fm = (StandardJavaFileManager) env.fileManager; + return fm.getJavaFileObjects(opt[1]).iterator().next(); + } } } return null; @@ -322,7 +325,7 @@ public class RootDocImpl extends DocImpl implements RootDoc { protected String documentation() { if (documentation == null) { int cnt = options.length(); - String overviewPath = getOverviewPath(); + JavaFileObject overviewPath = getOverviewPath(); if (overviewPath == null) { // no doc file to be had documentation = ""; @@ -330,11 +333,11 @@ public class RootDocImpl extends DocImpl implements RootDoc { // read from file try { documentation = readHTMLDocumentation( - new FileInputStream(overviewPath), + overviewPath.openInputStream(), overviewPath); } catch (IOException exc) { documentation = ""; - env.error(null, "javadoc.File_Read_Error", overviewPath); + env.error(null, "javadoc.File_Read_Error", overviewPath.getName()); } } } @@ -346,9 +349,16 @@ public class RootDocImpl extends DocImpl implements RootDoc { * no position is available. */ public SourcePosition position() { - String path; + JavaFileObject path; return ((path = getOverviewPath()) == null) ? null : SourcePositionImpl.make(path, Position.NOPOS, null); } + + /** + * Return the locale provided by the user or the default locale value. + */ + public Locale getLocale() { + return env.doclocale.locale; + } } diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/SourcePositionImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/SourcePositionImpl.java index 2225dd5337f..0e666b83f6d 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/SourcePositionImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/SourcePositionImpl.java @@ -25,11 +25,12 @@ package com.sun.tools.javadoc; +import java.io.File; +import javax.tools.FileObject; + import com.sun.javadoc.SourcePosition; import com.sun.tools.javac.util.Position; -import java.io.File; - /** * A source position: filename, line number, and column number. * @@ -37,15 +38,21 @@ import java.io.File; * @author Neal M Gafter * @author Michael Van De Vanter (position representation changed to char offsets) */ -class SourcePositionImpl implements SourcePosition { - String filename; +public class SourcePositionImpl implements SourcePosition { + FileObject filename; int position; Position.LineMap lineMap; /** The source file. Returns null if no file information is * available. */ public File file() { - return (filename == null) ? null : new File(filename); + return (filename == null) ? null : new File(filename.getName()); + } + + /** The source file. Returns null if no file information is + * available. */ + public FileObject fileObject() { + return filename; } /** The line in the source file. The first line is numbered 1; @@ -71,7 +78,7 @@ class SourcePositionImpl implements SourcePosition { } } - private SourcePositionImpl(String file, int position, + private SourcePositionImpl(FileObject file, int position, Position.LineMap lineMap) { super(); this.filename = file; @@ -79,16 +86,27 @@ class SourcePositionImpl implements SourcePosition { this.lineMap = lineMap; } - public static SourcePosition make(String file, int pos, + public static SourcePosition make(FileObject file, int pos, Position.LineMap lineMap) { if (file == null) return null; return new SourcePositionImpl(file, pos, lineMap); } public String toString() { + // Backwards compatibility hack. ZipFileObjects use the format + // zipfile(zipentry) but javadoc has been using zipfile/zipentry + String fn = filename.toString(); + if (fn.endsWith(")")) { + int paren = fn.lastIndexOf("("); + if (paren != -1) + fn = fn.substring(0, paren) + + File.separatorChar + + fn.substring(paren + 1, fn.length() - 1); + } + if (position == Position.NOPOS) - return filename; + return fn; else - return filename + ":" + line(); + return fn + ":" + line(); } } diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java b/langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java index 9e1a00ef3fd..ec1bb1e8002 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java @@ -51,6 +51,7 @@ public class TypeMaker { * @param errToClassDoc if true, ERROR type results in a ClassDoc; * false preserves legacy behavior */ + @SuppressWarnings("fallthrough") public static com.sun.javadoc.Type getType(DocEnv env, Type t, boolean errToClassDoc) { if (env.legacyDoclet) { diff --git a/langtools/src/share/classes/com/sun/tools/javah/Gen.java b/langtools/src/share/classes/com/sun/tools/javah/Gen.java index 3ab6f961299..1f0bb5ebd83 100644 --- a/langtools/src/share/classes/com/sun/tools/javah/Gen.java +++ b/langtools/src/share/classes/com/sun/tools/javah/Gen.java @@ -342,6 +342,6 @@ public abstract class Gen { fields.addAll(Arrays.asList(cd.fields())); } - return (FieldDoc[]) fields.toArray(new FieldDoc[fields.size()]); + return fields.toArray(new FieldDoc[fields.size()]); } } diff --git a/langtools/src/share/classes/com/sun/tools/javap/InternalError.java b/langtools/src/share/classes/com/sun/tools/javap/InternalError.java index 5397e7d267d..cc3903e0f1b 100644 --- a/langtools/src/share/classes/com/sun/tools/javap/InternalError.java +++ b/langtools/src/share/classes/com/sun/tools/javap/InternalError.java @@ -32,6 +32,7 @@ package com.sun.tools.javap; * deletion without notice. */ public class InternalError extends Error { + private static final long serialVersionUID = 8114054446416187030L; InternalError(Throwable t, Object... args) { super("Internal error", t); this.args = args; diff --git a/langtools/src/share/classes/javax/lang/model/UnknownEntityException.java b/langtools/src/share/classes/javax/lang/model/UnknownEntityException.java new file mode 100644 index 00000000000..6151927f51f --- /dev/null +++ b/langtools/src/share/classes/javax/lang/model/UnknownEntityException.java @@ -0,0 +1,57 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package javax.lang.model; + +/** + * Superclass of exceptions which indicate that an unknown kind of + * entity was encountered. This situation can occur if the language + * evolves and new kinds of constructs are introduced. Subclasses of + * this exception may be thrown by visitors to indicate that the + * visitor was created for a prior version of the language. + * + *

        A common superclass for those exceptions allows a single catch + * block to have code handling them uniformly. + * + * @author Joseph D. Darcy + * @see javax.lang.model.element.UnknownElementException + * @see javax.lang.model.element.UnknownAnnotationValueException + * @see javax.lang.model.type.UnknownTypeException + * @since 1.7 + */ +public class UnknownEntityException extends RuntimeException { + + private static final long serialVersionUID = 269L; + + /** + * Creates a new {@code UnknownEntityException} with the specified + * detail message. + * + * @param message the detail message + */ + protected UnknownEntityException(String message) { + super(message); + } +} diff --git a/langtools/src/share/classes/javax/lang/model/element/UnknownAnnotationValueException.java b/langtools/src/share/classes/javax/lang/model/element/UnknownAnnotationValueException.java index d77f9e84b78..fa2a47882ea 100644 --- a/langtools/src/share/classes/javax/lang/model/element/UnknownAnnotationValueException.java +++ b/langtools/src/share/classes/javax/lang/model/element/UnknownAnnotationValueException.java @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2009 Sun Microsystems, Inc. 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 @@ -25,6 +25,8 @@ package javax.lang.model.element; +import javax.lang.model.UnknownEntityException; + /** * Indicates that an unknown kind of annotation value was encountered. * This can occur if the language evolves and new kinds of annotation @@ -39,7 +41,7 @@ package javax.lang.model.element; * @see AnnotationValueVisitor#visitUnknown * @since 1.6 */ -public class UnknownAnnotationValueException extends RuntimeException { +public class UnknownAnnotationValueException extends UnknownEntityException { private static final long serialVersionUID = 269L; diff --git a/langtools/src/share/classes/javax/lang/model/element/UnknownElementException.java b/langtools/src/share/classes/javax/lang/model/element/UnknownElementException.java index 8206248478b..911a411e5d8 100644 --- a/langtools/src/share/classes/javax/lang/model/element/UnknownElementException.java +++ b/langtools/src/share/classes/javax/lang/model/element/UnknownElementException.java @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2009 Sun Microsystems, Inc. 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 @@ -25,6 +25,8 @@ package javax.lang.model.element; +import javax.lang.model.UnknownEntityException; + /** * Indicates that an unknown kind of element was encountered. This * can occur if the language evolves and new kinds of elements are @@ -38,7 +40,7 @@ package javax.lang.model.element; * @see ElementVisitor#visitUnknown * @since 1.6 */ -public class UnknownElementException extends RuntimeException { +public class UnknownElementException extends UnknownEntityException { private static final long serialVersionUID = 269L; diff --git a/langtools/src/share/classes/javax/lang/model/type/MirroredTypeException.java b/langtools/src/share/classes/javax/lang/model/type/MirroredTypeException.java index bf5904b8a61..db729c59550 100644 --- a/langtools/src/share/classes/javax/lang/model/type/MirroredTypeException.java +++ b/langtools/src/share/classes/javax/lang/model/type/MirroredTypeException.java @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2009 Sun Microsystems, Inc. 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 @@ -25,7 +25,8 @@ package javax.lang.model.type; - +import java.io.ObjectInputStream; +import java.io.IOException; import java.lang.annotation.Annotation; import javax.lang.model.element.Element; @@ -67,4 +68,13 @@ public class MirroredTypeException extends RuntimeException { public TypeMirror getTypeMirror() { return type; } + + /** + * Explicitly set all transient fields. + */ + private void readObject(ObjectInputStream s) + throws IOException, ClassNotFoundException { + s.defaultReadObject(); + type = null; + } } diff --git a/langtools/src/share/classes/javax/lang/model/type/MirroredTypesException.java b/langtools/src/share/classes/javax/lang/model/type/MirroredTypesException.java index 4ed0383d5ea..54efe41a7c9 100644 --- a/langtools/src/share/classes/javax/lang/model/type/MirroredTypesException.java +++ b/langtools/src/share/classes/javax/lang/model/type/MirroredTypesException.java @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2009 Sun Microsystems, Inc. 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 @@ -25,12 +25,12 @@ package javax.lang.model.type; - import java.lang.annotation.Annotation; import java.util.ArrayList; import java.util.List; import java.util.Collections; - +import java.io.ObjectInputStream; +import java.io.IOException; import javax.lang.model.element.Element; @@ -49,8 +49,7 @@ public class MirroredTypesException extends RuntimeException { private static final long serialVersionUID = 269; - // Should this be non-final for a custum readObject method? - private final transient List types; // cannot be serialized + private transient List types; // cannot be serialized /** * Constructs a new MirroredTypesException for the specified types. @@ -58,7 +57,9 @@ public class MirroredTypesException extends RuntimeException { * @param types the types being accessed */ public MirroredTypesException(List types) { - super("Attempt to access Class objects for TypeMirrors " + types); + super("Attempt to access Class objects for TypeMirrors " + + (types = // defensive copy + new ArrayList(types)).toString() ); this.types = Collections.unmodifiableList(types); } @@ -72,4 +73,13 @@ public class MirroredTypesException extends RuntimeException { public List getTypeMirrors() { return types; } + + /** + * Explicitly set all transient fields. + */ + private void readObject(ObjectInputStream s) + throws IOException, ClassNotFoundException { + s.defaultReadObject(); + types = null; + } } diff --git a/langtools/src/share/classes/javax/lang/model/type/UnknownTypeException.java b/langtools/src/share/classes/javax/lang/model/type/UnknownTypeException.java index e4049cf0156..cbca20ce709 100644 --- a/langtools/src/share/classes/javax/lang/model/type/UnknownTypeException.java +++ b/langtools/src/share/classes/javax/lang/model/type/UnknownTypeException.java @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2009 Sun Microsystems, Inc. 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 @@ -25,6 +25,8 @@ package javax.lang.model.type; +import javax.lang.model.UnknownEntityException; + /** * Indicates that an unknown kind of type was encountered. This can * occur if the language evolves and new kinds of types are added to @@ -38,7 +40,7 @@ package javax.lang.model.type; * @see TypeVisitor#visitUnknown * @since 1.6 */ -public class UnknownTypeException extends RuntimeException { +public class UnknownTypeException extends UnknownEntityException { private static final long serialVersionUID = 269L; diff --git a/langtools/src/share/classes/sun/tools/javap/JavapPrinter.java b/langtools/src/share/classes/sun/tools/javap/JavapPrinter.java index a587ddc5d15..af5978aec26 100644 --- a/langtools/src/share/classes/sun/tools/javap/JavapPrinter.java +++ b/langtools/src/share/classes/sun/tools/javap/JavapPrinter.java @@ -719,6 +719,7 @@ public class JavapPrinter { /** * Print constant pool entry information. */ + @SuppressWarnings("fallthrough") public int PrintlnConstantEntry(int cpx) { int size=1; byte tag=0; @@ -757,6 +758,7 @@ public class JavapPrinter { case CONSTANT_LONG: case CONSTANT_DOUBLE: size=2; + // fall through default: out.println(str+";"); } diff --git a/langtools/test/com/sun/javadoc/testHtmlTag/TestHtmlTag.java b/langtools/test/com/sun/javadoc/testHtmlTag/TestHtmlTag.java new file mode 100644 index 00000000000..4588d070b7e --- /dev/null +++ b/langtools/test/com/sun/javadoc/testHtmlTag/TestHtmlTag.java @@ -0,0 +1,93 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6786682 + * @summary This test verifies the use of lang attribute by . + * @author Bhavesh Patel + * @library ../lib/ + * @build JavadocTester + * @build TestHtmlTag + * @run main TestHtmlTag + */ + +import java.util.Locale; + +public class TestHtmlTag extends JavadocTester { + + private static final String BUG_ID = "6786682"; + private static final String[][] TEST1 = { + {BUG_ID + FS + "pkg1" + FS + "C1.html", ""}, + {BUG_ID + FS + "pkg1" + FS + "package-summary.html", ""}}; + private static final String[][] NEGATED_TEST1 = { + {BUG_ID + FS + "pkg1" + FS + "C1.html", ""}}; + private static final String[][] TEST2 = { + {BUG_ID + FS + "pkg2" + FS + "C2.html", ""}, + {BUG_ID + FS + "pkg2" + FS + "package-summary.html", ""}}; + private static final String[][] NEGATED_TEST2 = { + {BUG_ID + FS + "pkg2" + FS + "C2.html", ""}}; + private static final String[][] TEST3 = { + {BUG_ID + FS + "pkg1" + FS + "C1.html", ""}, + {BUG_ID + FS + "pkg1" + FS + "package-summary.html", ""}}; + private static final String[][] NEGATED_TEST3 = { + {BUG_ID + FS + "pkg1" + FS + "C1.html", ""}}; + + private static final String[] ARGS1 = + new String[] { + "-d", BUG_ID, "-sourcepath", SRC_DIR, "pkg1"}; + private static final String[] ARGS2 = + new String[] { + "-locale", "ja", "-d", BUG_ID, "-sourcepath", SRC_DIR, "pkg2"}; + private static final String[] ARGS3 = + new String[] { + "-locale", "en_US", "-d", BUG_ID, "-sourcepath", SRC_DIR, "pkg1"}; + + /** + * The entry point of the test. + * @param args the array of command line arguments. + */ + public static void main(String[] args) { + TestHtmlTag tester = new TestHtmlTag(); + run(tester, ARGS1, TEST1, NEGATED_TEST1); + run(tester, ARGS2, TEST2, NEGATED_TEST2); + run(tester, ARGS3, TEST3, NEGATED_TEST3); + tester.printSummary(); + } + + /** + * {@inheritDoc} + */ + public String getBugId() { + return BUG_ID; + } + + /** + * {@inheritDoc} + */ + public String getBugName() { + return getClass().getName(); + } +} diff --git a/langtools/test/com/sun/javadoc/testHtmlTag/pkg1/C1.java b/langtools/test/com/sun/javadoc/testHtmlTag/pkg1/C1.java new file mode 100644 index 00000000000..5fb4bc8a30e --- /dev/null +++ b/langtools/test/com/sun/javadoc/testHtmlTag/pkg1/C1.java @@ -0,0 +1,33 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package pkg1; + +public class C1 { + + public void method(int param1, int param2) { + + } +} diff --git a/langtools/test/com/sun/javadoc/testHtmlTag/pkg2/C2.java b/langtools/test/com/sun/javadoc/testHtmlTag/pkg2/C2.java new file mode 100644 index 00000000000..2bd9d323be8 --- /dev/null +++ b/langtools/test/com/sun/javadoc/testHtmlTag/pkg2/C2.java @@ -0,0 +1,31 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package pkg2; + +/** + * Comments: Class 2 + */ +public class C2 {} diff --git a/langtools/test/tools/javac/6304921/T6304921.out b/langtools/test/tools/javac/6304921/T6304921.out index 27b869deaef..d69e1bd9aba 100644 --- a/langtools/test/tools/javac/6304921/T6304921.out +++ b/langtools/test/tools/javac/6304921/T6304921.out @@ -7,12 +7,7 @@ found : java.util.ArrayList required: java.util.List List list = new ArrayList(); ^ -T6304921.java:445/445/453: warning: [fallthrough] possible fall-through into case - default: - ^ -T6304921.java:522/613/614: warning: [finally] finally clause cannot complete normally - } - ^ +error: warnings found and -Werror specified T6304921.java:727/733/737: cannot find symbol symbol : variable orr location: class java.lang.System @@ -21,5 +16,5 @@ location: class java.lang.System T6304921.java:812/816/822: operator + cannot be applied to int,boolean return 123 + true; // bad binary expression ^ -2 errors -4 warnings +3 errors +2 warnings diff --git a/langtools/test/tools/javac/6758789/T6758789b.out b/langtools/test/tools/javac/6758789/T6758789b.out index 2ff12ec5e28..eae65eb4422 100644 --- a/langtools/test/tools/javac/6758789/T6758789b.out +++ b/langtools/test/tools/javac/6758789/T6758789b.out @@ -1,3 +1,5 @@ T6758789b.java:39:11: compiler.warn.prob.found.req: (- compiler.misc.unchecked.assign), T6758789a.Foo, T6758789a.Foo T6758789b.java:39:10: compiler.warn.unchecked.meth.invocation.applied: kindname.method, m, T6758789a.Foo, T6758789a.Foo, kindname.class, T6758789a +- compiler.err.warnings.and.werror +1 error 2 warnings diff --git a/langtools/test/tools/javac/T6241723.out b/langtools/test/tools/javac/T6241723.out index 32eabe43656..2391e4394b8 100644 --- a/langtools/test/tools/javac/T6241723.out +++ b/langtools/test/tools/javac/T6241723.out @@ -2,4 +2,6 @@ T6241723.java:21:5: compiler.warn.has.been.deprecated: A1, unnamed package T6241723.java:23:7: compiler.warn.has.been.deprecated: A2.A21, A2 T6241723.java:26:5: compiler.warn.has.been.deprecated: Z1, unnamed package T6241723.java:28:7: compiler.warn.has.been.deprecated: Z2.Z21, Z2 +- compiler.err.warnings.and.werror +1 error 4 warnings diff --git a/langtools/test/tools/javac/T6595666.java b/langtools/test/tools/javac/T6595666.java new file mode 100644 index 00000000000..009d4a32059 --- /dev/null +++ b/langtools/test/tools/javac/T6595666.java @@ -0,0 +1,68 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6595666 + * @summary fix -Werror + */ + +import java.io.*; +import java.util.*; + +public class T6595666 { + void m() { + // the following line must create warnings with -Xlint, because of unchecked conversion + List list = new ArrayList(); + } + + public static void main(String... args) throws Exception { + File testSrc = new File(System.getProperty("test.src", ".")); + + String basename = T6595666.class.getName(); + File srcFile = new File(testSrc, basename+".java"); + File classFile = new File(basename+".class"); + classFile.delete(); + if (classFile.exists()) + throw new Exception("setup error, can't delete " + classFile); + + compile(1, "-d", ".", "-Xlint", "-Werror", srcFile.getPath()); + if (classFile.exists()) + throw new Exception("failed: found " + classFile); + + compile(0, "-d", ".", "-Xlint", srcFile.getPath()); + if (!classFile.exists()) + throw new Exception("failed: " + classFile + " not found"); + } + + private static void compile(int rc, String... args) throws Exception { + System.err.println("compile: " + Arrays.asList(args)); + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + int rc2 = com.sun.tools.javac.Main.compile(args, pw); + pw.close(); + System.err.println(sw); + if (rc != rc2) + throw new Exception("bad exit code; expected " + rc + ", found " + rc2); + } +} diff --git a/langtools/test/tools/javac/T6794959.java b/langtools/test/tools/javac/T6794959.java new file mode 100644 index 00000000000..d2ca623c9c1 --- /dev/null +++ b/langtools/test/tools/javac/T6794959.java @@ -0,0 +1,36 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6794959 + * @summary add new switch -XDexpectKeys=key,key,... + * @compile T6794959.java + * @compile/fail -XDfailcomplete=java.lang.String T6794959.java + * @compile -XDfailcomplete=java.lang.String -XDexpectKeys=compiler.err.cant.resolve.location T6794959.java + * @compile/fail -XDexpectKeys=compiler.err.cant.resolve.location T6794959.java + */ + +class T6794959 { + String s; +} diff --git a/langtools/test/tools/javac/cast/6557182/T6557182.java b/langtools/test/tools/javac/cast/6557182/T6557182.java new file mode 100644 index 00000000000..56bbe702f5e --- /dev/null +++ b/langtools/test/tools/javac/cast/6557182/T6557182.java @@ -0,0 +1,41 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @author Maurizio Cimadamore + * @bug 6557182 + * @summary Unchecked warning *and* inconvertible types + * @compile/fail/ref=T6557182.out -XDrawDiagnostics -Xlint:unchecked T6557182.java + */ + +class T6557182 { + + > void test1(T t) { + Comparable ci = (Comparable) t; + } + + > void test2(T t) { + Comparable ci = (Comparable) t; + } +} diff --git a/langtools/test/tools/javac/cast/6557182/T6557182.out b/langtools/test/tools/javac/cast/6557182/T6557182.out new file mode 100644 index 00000000000..9ebe10e9c9f --- /dev/null +++ b/langtools/test/tools/javac/cast/6557182/T6557182.out @@ -0,0 +1,4 @@ +T6557182.java:35:56: compiler.err.prob.found.req: (- compiler.misc.inconvertible.types), T, java.lang.Comparable +T6557182.java:39:56: compiler.warn.prob.found.req: (- compiler.misc.unchecked.cast.to.type), T, java.lang.Comparable +1 error +1 warning diff --git a/langtools/test/tools/javac/cast/6795580/T6795580.java b/langtools/test/tools/javac/cast/6795580/T6795580.java new file mode 100644 index 00000000000..9539e32e0df --- /dev/null +++ b/langtools/test/tools/javac/cast/6795580/T6795580.java @@ -0,0 +1,80 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @author Maurizio Cimadamore + * @bug 6795580 + * @summary parser confused by square brackets in qualified generic cast + * @compile/fail/ref=T6795580.out -XDrawDiagnostics T6795580.java + */ + +class T6795580 { + class Outer { + class Inner {} + } + + void cast1(Outer.Inner[] p) { + Object o = (Outer.Inner[])p; + } + + void cast2(Outer.Inner[] p) { + Object o = (Outer.Inner[])p; + } + + void cast3(Outer.Inner[] p) { + Object o = (Outer.Inner[])p; + } + + void cast4(Outer.Inner[] p) { + Object o = (Outer.Inner[])p; + } + + void cast5(Outer.Inner[] p) { + Object o = (Outer.Inner[])p; + } + + void cast6(Outer.Inner[] p) { + Object o = (Outer.Inner[])p; + } + + void cast7(Outer.Inner[] p) { + Object o = (Outer.Inner[])p; + } + + void cast8(Outer.Inner[] p) { + Object o = (Outer.Inner[])p; + } + + void cast9(Outer.Inner[] p) { + Object o = (Outer.Inner[])p; + } + + void cast10(Outer.Inner[] p) { + Object o = (Outer.Inner[])p; + } + + void cast11(Outer.Inner[] p) { + Object o = (Outer.Inner[])p; + } +} \ No newline at end of file diff --git a/langtools/test/tools/javac/cast/6795580/T6795580.out b/langtools/test/tools/javac/cast/6795580/T6795580.out new file mode 100644 index 00000000000..f754e1dc2c5 --- /dev/null +++ b/langtools/test/tools/javac/cast/6795580/T6795580.out @@ -0,0 +1,8 @@ +T6795580.java:54:57: compiler.err.prob.found.req: (- compiler.misc.inconvertible.types), T6795580.Outer.Inner[], T6795580.Outer.Inner[] +T6795580.java:58:60: compiler.err.prob.found.req: (- compiler.misc.inconvertible.types), T6795580.Outer.Inner[], T6795580.Outer.Inner[] +T6795580.java:62:67: compiler.err.prob.found.req: (- compiler.misc.inconvertible.types), T6795580.Outer.Inner[], T6795580.Outer.Inner[] +T6795580.java:66:59: compiler.err.prob.found.req: (- compiler.misc.inconvertible.types), T6795580.Outer.Inner[], T6795580.Outer.Inner[] +T6795580.java:70:62: compiler.err.prob.found.req: (- compiler.misc.inconvertible.types), T6795580.Outer.Inner[], T6795580.Outer.Inner[] +T6795580.java:74:57: compiler.err.prob.found.req: (- compiler.misc.inconvertible.types), T6795580.Outer.Inner[], T6795580.Outer.Inner[] +T6795580.java:78:60: compiler.err.prob.found.req: (- compiler.misc.inconvertible.types), T6795580.Outer.Inner[], T6795580.Outer.Inner[] +7 errors diff --git a/langtools/test/tools/javac/depDocComment/DeprecatedDocComment.out b/langtools/test/tools/javac/depDocComment/DeprecatedDocComment.out index e3cb33f72f8..2b3f2b6b267 100644 --- a/langtools/test/tools/javac/depDocComment/DeprecatedDocComment.out +++ b/langtools/test/tools/javac/depDocComment/DeprecatedDocComment.out @@ -1,4 +1,6 @@ DeprecatedDocComment.java:27:28: compiler.warn.has.been.deprecated: deprecatedTest1(), DeprecatedDocComment2 DeprecatedDocComment.java:31:28: compiler.warn.has.been.deprecated: deprecatedTest5(), DeprecatedDocComment2 DeprecatedDocComment.java:32:28: compiler.warn.has.been.deprecated: deprecatedTest6(), DeprecatedDocComment2 +- compiler.err.warnings.and.werror +1 error 3 warnings diff --git a/langtools/test/tools/javac/generics/6729401/T6729401.java b/langtools/test/tools/javac/generics/6729401/T6729401.java new file mode 100644 index 00000000000..dc7be410bfc --- /dev/null +++ b/langtools/test/tools/javac/generics/6729401/T6729401.java @@ -0,0 +1,46 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6729401 + * + * @summary Compiler error when using F-bounded generics with free type variables + * @author Maurizio Cimadamore + * @compile T6729401.java + * + */ + +class T6729401 { + + interface I { + > void m(I x); + } + + ,Y extends I> void test(I x, I y) { + x.m(y); + x.m(y); + y.m(x); + y.m(x); + } +} diff --git a/langtools/test/tools/javac/generics/inference/6315770/T6315770.java b/langtools/test/tools/javac/generics/inference/6315770/T6315770.java new file mode 100644 index 00000000000..2bee9a14a8f --- /dev/null +++ b/langtools/test/tools/javac/generics/inference/6315770/T6315770.java @@ -0,0 +1,42 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/** + * @test + * @bug 6315770 + * @summary javac inference allows creation of strange types: Integer & Runnable + * @author Maurizio Cimadamore + * + * @compile/fail/ref=T6315770.out T6315770.java -XDrawDiagnostics + */ + +class T6315770 { + T6315770 m() { + return null; + } + void test() { + T6315770 c1 = m(); + T6315770 c2 = m(); + T6315770 c3 = m(); + } +} diff --git a/langtools/test/tools/javac/generics/inference/6315770/T6315770.out b/langtools/test/tools/javac/generics/inference/6315770/T6315770.out new file mode 100644 index 00000000000..8dc60f97d6d --- /dev/null +++ b/langtools/test/tools/javac/generics/inference/6315770/T6315770.out @@ -0,0 +1,3 @@ +T6315770.java:39:42: compiler.err.undetermined.type.1: T6315770, (- compiler.misc.no.unique.maximal.instance.exists: T, java.lang.String,java.lang.Integer,java.lang.Runnable) +T6315770.java:40:40: compiler.err.prob.found.req: (- compiler.misc.incompatible.types.1: (- compiler.misc.no.conforming.instance.exists: T, T6315770, T6315770)), T6315770, T6315770 +2 errors diff --git a/langtools/test/tools/javac/processing/model/TestExceptions.java b/langtools/test/tools/javac/processing/model/TestExceptions.java new file mode 100644 index 00000000000..0d746886b1b --- /dev/null +++ b/langtools/test/tools/javac/processing/model/TestExceptions.java @@ -0,0 +1,55 @@ +/* + * Copyright 2009 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6794071 + * @summary Test that exceptions have a proper parent class + * @author Joseph D. Darcy + */ + +import javax.lang.model.UnknownEntityException; +import javax.lang.model.element.*; +import javax.lang.model.type.*; + +/* + * Verify UnknownFooExceptions can be caught with a common parent + * exception. + */ +public class TestExceptions { + public static void main(String... args) { + RuntimeException[] exceptions = { + new UnknownElementException((Element)null, (Object)null), + new UnknownAnnotationValueException((AnnotationValue) null, (Object) null), + new UnknownTypeException((TypeMirror)null, (Object)null) + }; + + for(RuntimeException exception : exceptions) { + try { + throw exception; + } catch (UnknownEntityException uee) { + ; + } + } + } +} diff --git a/langtools/test/tools/javac/processing/model/testgetallmembers/Main.java b/langtools/test/tools/javac/processing/model/testgetallmembers/Main.java index c77ac09d2a2..e783d29264f 100644 --- a/langtools/test/tools/javac/processing/model/testgetallmembers/Main.java +++ b/langtools/test/tools/javac/processing/model/testgetallmembers/Main.java @@ -23,7 +23,7 @@ /** * @test - * @bug 6374357 6308351 + * @bug 6374357 6308351 6707027 * @summary PackageElement.getEnclosedElements() throws ClassReader$BadClassFileException * @author Peter von der Ah\u00e9 * @run main/othervm -Xmx256m Main @@ -118,7 +118,7 @@ public class Main { packages.size(), classes, nestedClasses); if (classes < 9000) throw new AssertionError("Too few classes in PLATFORM_CLASS_PATH ;-)"); - if (packages.size() < 545) + if (packages.size() < 530) throw new AssertionError("Too few packages in PLATFORM_CLASS_PATH ;-)"); if (nestedClasses < 3000) throw new AssertionError("Too few nested classes in PLATFORM_CLASS_PATH ;-)"); diff --git a/langtools/test/tools/javadoc/6176978/T6176978.java b/langtools/test/tools/javadoc/6176978/T6176978.java new file mode 100644 index 00000000000..892271a8e3c --- /dev/null +++ b/langtools/test/tools/javadoc/6176978/T6176978.java @@ -0,0 +1,80 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6176978 + * @summary current Javadoc's invocation and extension (Doclet) mechanisms are problematic + * @build T6176978 + * @run main T6176978 + */ + +import java.io.*; +import java.net.*; + +public class T6176978 +{ + public static void main(String[] args) throws Exception { + // create and use a temp dir that will not be on jtreg's + // default class path + File tmpDir = new File("tmp"); + tmpDir.mkdirs(); + + File testSrc = new File(System.getProperty("test.src", ".")); + String[] javac_args = { + "-d", + "tmp", + new File(testSrc, "X.java").getPath() + }; + + int rc = com.sun.tools.javac.Main.compile(javac_args); + if (rc != 0) + throw new Error("javac exit code: " + rc); + + String[] jdoc_args = { + "-doclet", + "X", + new File(testSrc, "T6176978.java").getPath() + }; + + rc = com.sun.tools.javadoc.Main.execute(jdoc_args); + if (rc == 0) + throw new Error("javadoc unexpectedly succeeded"); + + + + Thread currThread = Thread.currentThread(); + ClassLoader saveClassLoader = currThread.getContextClassLoader(); + URLClassLoader urlCL = new URLClassLoader(new URL[] { tmpDir.toURL() }); + currThread.setContextClassLoader(urlCL); + + try { + rc = com.sun.tools.javadoc.Main.execute(jdoc_args); + if (rc != 0) + throw new Error("javadoc exit: " + rc); + } + finally { + currThread.setContextClassLoader(saveClassLoader); + } + } +} diff --git a/langtools/test/tools/javadoc/6176978/X.java b/langtools/test/tools/javadoc/6176978/X.java new file mode 100644 index 00000000000..2eb5bf4335b --- /dev/null +++ b/langtools/test/tools/javadoc/6176978/X.java @@ -0,0 +1,31 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +import com.sun.javadoc.*; + +public class X { + public static boolean start(RootDoc root) { + System.out.println("X.start"); + return true; + } +}