From dc00f42dd7ff59143869e17010ed435db009ae12 Mon Sep 17 00:00:00 2001 From: Merov Linden Date: Thu, 31 Mar 2011 23:00:50 -0700 Subject: STORM-746 : Code formatting and clean up, add comments, no functional changes --- indra/llkdu/llimagej2ckdu.cpp | 404 +++++++++++++++++++++--------------------- indra/llkdu/llkdumem.cpp | 22 +-- indra/llkdu/llkdumem.h | 44 ++--- 3 files changed, 237 insertions(+), 233 deletions(-) diff --git a/indra/llkdu/llimagej2ckdu.cpp b/indra/llkdu/llimagej2ckdu.cpp index 10ea5685e8..61b16c80e6 100644 --- a/indra/llkdu/llimagej2ckdu.cpp +++ b/indra/llkdu/llimagej2ckdu.cpp @@ -34,35 +34,35 @@ class kdc_flow_control { -public: // Member functions - kdc_flow_control(kdu_image_in_base *img_in, kdu_codestream codestream); - ~kdc_flow_control(); - bool advance_components(); - void process_components(); +public: + kdc_flow_control(kdu_image_in_base *img_in, kdu_codestream codestream); + ~kdc_flow_control(); + bool advance_components(); + void process_components(); + +private: -private: // Data - - struct kdc_component_flow_control { - public: // Data - kdu_image_in_base *reader; - int vert_subsampling; - int ratio_counter; /* Initialized to 0, decremented by `count_delta'; + struct kdc_component_flow_control { + public: + kdu_image_in_base *reader; + int vert_subsampling; + int ratio_counter; /* Initialized to 0, decremented by `count_delta'; when < 0, a new line must be processed, after which it is incremented by `vert_subsampling'. */ - int initial_lines; - int remaining_lines; - kdu_line_buf *line; - }; - - kdu_codestream codestream; - kdu_dims valid_tile_indices; - kdu_coords tile_idx; - kdu_tile tile; - int num_components; - kdc_component_flow_control *components; - int count_delta; // Holds the minimum of the `vert_subsampling' fields - kdu_multi_analysis engine; - kdu_long max_buffer_memory; + int initial_lines; + int remaining_lines; + kdu_line_buf *line; + }; + + kdu_codestream codestream; + kdu_dims valid_tile_indices; + kdu_coords tile_idx; + kdu_tile tile; + int num_components; + kdc_component_flow_control *components; + int count_delta; // Holds the minimum of the `vert_subsampling' fields + kdu_multi_analysis engine; + kdu_long max_buffer_memory; }; // @@ -72,7 +72,8 @@ void set_default_colour_weights(kdu_params *siz); const char* engineInfoLLImageJ2CKDU() { - return "KDU v6.4.1"; + std::string version = llformat("KDU %s", KDU_CORE_VERSION); + return version.c_str(); } LLImageJ2CKDU* createLLImageJ2CKDU() @@ -113,8 +114,8 @@ public: kdu_tile_comp mComps[4]; kdu_line_buf mLines[4]; kdu_pull_ifc mEngines[4]; - bool mReversible[4]; // Some components may be reversible and others not. - int mBitDepths[4]; // Original bit-depth may be quite different from 8. + bool mReversible[4]; // Some components may be reversible and others not + int mBitDepths[4]; // Original bit-depth may be quite different from 8 kdu_tile mTile; kdu_byte *mBuf; @@ -153,7 +154,7 @@ class LLKDUMessageError : public kdu_message public: /*virtual*/ void put_text(const char *s); /*virtual*/ void put_text(const kdu_uint16 *s); - /*virtual*/ void flush(bool end_of_message=false); + /*virtual*/ void flush(bool end_of_message = false); static LLKDUMessageError sDefaultMessage; }; @@ -179,7 +180,7 @@ void LLKDUMessageError::put_text(const kdu_uint16 *s) void LLKDUMessageError::flush(bool end_of_message) { - if( end_of_message ) + if (end_of_message) { throw "KDU throwing an exception"; } @@ -210,7 +211,7 @@ void transfer_bytes(kdu_byte *dest, kdu_line_buf &src, int gap, int precision); void LLImageJ2CKDU::setupCodeStream(LLImageJ2C &base, BOOL keep_codestream, ECodeStreamMode mode) { S32 data_size = base.getDataSize(); - S32 max_bytes = base.getMaxBytes() ? base.getMaxBytes() : data_size; + S32 max_bytes = (base.getMaxBytes() ? base.getMaxBytes() : data_size); // // Initialization @@ -247,21 +248,21 @@ void LLImageJ2CKDU::setupCodeStream(LLImageJ2C &base, BOOL keep_codestream, ECod // Set the maximum number of bytes to use from the codestream mCodeStreamp->set_max_bytes(max_bytes); - // If you want to flip or rotate the image for some reason, change + // If you want to flip or rotate the image for some reason, change // the resolution, or identify a restricted region of interest, this is // the place to do it. You may use "kdu_codestream::change_appearance" // and "kdu_codestream::apply_input_restrictions" for this purpose. - // If you wish to truncate the code-stream prior to decompression, you + // If you wish to truncate the code-stream prior to decompression, you // may use "kdu_codestream::set_max_bytes". - // If you wish to retain all compressed data so that the material + // If you wish to retain all compressed data so that the material // can be decompressed multiple times, possibly with different appearance // parameters, you should call "kdu_codestream::set_persistent" here. - // There are a variety of other features which must be enabled at + // There are a variety of other features which must be enabled at // this point if you want to take advantage of them. See the // descriptions appearing with the "kdu_codestream" interface functions // in "kdu_compressed.h" for an itemized account of these capabilities. - switch( mode ) + switch (mode) { case MODE_FAST: mCodeStreamp->set_fast(); @@ -343,7 +344,7 @@ BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco kdu_dims dims; mCodeStreamp->get_dims(0,dims); S32 channels = base.getComponents() - first_channel; - if( channels > max_channel_count ) + if (channels > max_channel_count) { channels = max_channel_count; } @@ -426,7 +427,7 @@ BOOL LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco // canvas coordinate system. Comparing the two tells // us where the current tile is in the buffer. S32 channels = base.getComponents() - first_channel; - if( channels > max_channel_count ) + if (channels > max_channel_count) { channels = max_channel_count; } @@ -452,14 +453,14 @@ BOOL LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco return FALSE; } } - catch( const char* msg ) + catch (const char* msg) { base.setLastError(ll_safe_string(msg)); base.decodeFailed(); cleanupCodeStream(); return TRUE; // done } - catch( ... ) + catch (...) { base.setLastError( "Unknown J2C error" ); base.decodeFailed(); @@ -482,28 +483,17 @@ BOOL LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time, BOOL reversible) { - // Collect simple arguments. - bool transpose, vflip, hflip; - bool allow_rate_prediction, mem, quiet, no_weights; - int cpu_iterations; - std::ostream *record_stream; - - transpose = false; - record_stream = NULL; - allow_rate_prediction = true; - no_weights = false; - cpu_iterations = -1; - mem = false; - quiet = false; - vflip = true; - hflip = false; + // Declare and set simple arguments + bool transpose = false; + bool vflip = true; + bool hflip = false; try { - // Set up input image files. + // Set up input image files siz_params siz; - // Should set rate someplace here. + // Should set rate someplace here LLKDUMemIn mem_in(raw_image.getData(), raw_image.getDataSize(), raw_image.getWidth(), @@ -521,12 +511,12 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co siz.set(Sprecision,0,0,8); // Image samples have original bit-depth of 8 siz.set(Ssigned,0,0,false); // Image samples are originally unsigned - kdu_params *siz_ref = &siz; siz_ref->finalize(); - siz_params transformed_siz; // Use this one to construct code-strea + kdu_params *siz_ref = &siz; + siz_ref->finalize(); + siz_params transformed_siz; // Use this one to construct code-stream transformed_siz.copy_from(&siz,-1,-1,-1,0,transpose,false,false); - // Construct the `kdu_codestream' object and parse all remaining arguments. - + // Construct the `kdu_codestream' object and parse all remaining arguments U32 max_output_size = base.getWidth()*base.getHeight()*base.getComponents(); if (max_output_size < 1000) { @@ -538,8 +528,7 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co LLKDUMemTarget output(output_buffer, output_size, base.getWidth()*base.getHeight()*base.getComponents()); if (output_size > max_output_size) { - llerrs << llformat("LLImageJ2C::encode output_size(%d) > max_output_size(%d)", - output_size,max_output_size) << llendl; + llerrs << llformat("LLImageJ2C::encode output_size(%d) > max_output_size(%d)", output_size,max_output_size) << llendl; } kdu_codestream codestream; @@ -558,15 +547,18 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co kdu_long layer_bytes[64]; U32 max_bytes = 0; - if ((num_components >= 3) && !no_weights) + if (num_components >= 3) { + // Note that we always use YCC and not YUV + // *TODO: Verify this doesn't screws up reversible textures (like sculpties) as YCC is not reversible but YUV is... set_default_colour_weights(codestream.access_siz()); } if (reversible) { - // If we're doing reversible, assume we're not using quality layers. + // If we're doing reversible (i.e. lossless compression), assumes we're not using quality layers. // Yes, I know this is incorrect! + // *TODO: Indeed, this is incorrect and unecessary... Try using the regular layer setting... codestream.access_siz()->parse_string("Creversible=yes"); codestream.access_siz()->parse_string("Clayers=1"); num_layer_specs = 1; @@ -577,6 +569,7 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co // Rate is the argument passed into the LLImageJ2C which // specifies the target compression rate. The default is 8:1. // Possibly if max_bytes < 500, we should just use the default setting? + // *TODO: mRate is actually always 8:1 in the viewer. Test different values. Also force to reversible for small (< 500 bytes) textures. if (base.mRate != 0.f) { max_bytes = (U32)(base.mRate*base.getWidth()*base.getHeight()*base.getComponents()); @@ -617,42 +610,39 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co codestream.access_siz()->parse_string(layer_string.c_str()); } } + + // *TODO : Add precinct specification here + //std::string precincts_string = llformat("Cprecincts={128,128}"); + //codestream.access_siz()->parse_string(precincts_string.c_str()); + codestream.access_siz()->finalize_all(); - if (cpu_iterations >= 0) - { - codestream.collect_timing_stats(cpu_iterations); - } codestream.change_appearance(transpose,vflip,hflip); // Now we are ready for sample data processing. - kdc_flow_control *tile = new kdc_flow_control(&mem_in,codestream); - bool done = false; - while (!done) - { - // Process line by line - done = true; - if (tile->advance_components()) - { - done = false; - tile->process_components(); - } - } + kdc_flow_control *tile = new kdc_flow_control(&mem_in,codestream); + bool done = false; + while (!done) + { + // Process line by line + if (tile->advance_components()) + { + tile->process_components(); + } + else + { + done = true; + } + } // Produce the compressed output - codestream.flush(layer_bytes,num_layer_specs); + codestream.flush(layer_bytes,num_layer_specs); // Cleanup - delete tile; - + delete tile; codestream.destroy(); - if (record_stream != NULL) - { - delete record_stream; - } // Now that we're done encoding, create the new data buffer for the compressed // image and stick it there. - base.copyData(output_buffer, output_size); base.updateData(); // set width, height delete[] output_buffer; @@ -674,19 +664,19 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co BOOL LLImageJ2CKDU::getMetadata(LLImageJ2C &base) { // *FIX: kdu calls our callback function if there's an error, and - // then bombs. To regain control, we throw an exception, and + // then bombs. To regain control, we throw an exception, and // catch it here. try { setupCodeStream(base, FALSE, MODE_FAST); return TRUE; } - catch( const char* msg ) + catch (const char* msg) { base.setLastError(ll_safe_string(msg)); return FALSE; } - catch( ... ) + catch (...) { base.setLastError( "Unknown J2C error" ); return FALSE; @@ -699,37 +689,49 @@ void set_default_colour_weights(kdu_params *siz) assert(cod != NULL); bool can_use_ycc = true; - bool rev0=false; - int depth0=0, sub_x0=1, sub_y0=1; - for (int c=0; c < 3; c++) + bool rev0 = false; + int depth0 = 0, sub_x0 = 1, sub_y0 = 1; + for (int c = 0; c < 3; c++) { - int depth=0; siz->get(Sprecision,c,0,depth); - int sub_y=1; siz->get(Ssampling,c,0,sub_y); - int sub_x=1; siz->get(Ssampling,c,1,sub_x); + int depth = 0; siz->get(Sprecision,c,0,depth); + int sub_y = 1; siz->get(Ssampling,c,0,sub_y); + int sub_x = 1; siz->get(Ssampling,c,1,sub_x); kdu_params *coc = cod->access_relation(-1,c); - bool rev=false; coc->get(Creversible,0,0,rev); + bool rev = false; coc->get(Creversible,0,0,rev); if (c == 0) - { rev0=rev; depth0=depth; sub_x0=sub_x; sub_y0=sub_y; } - else if ((rev != rev0) || (depth != depth0) || - (sub_x != sub_x0) || (sub_y != sub_y0)) + { + rev0 = rev; depth0 = depth; sub_x0 = sub_x; sub_y0 = sub_y; + } + else if ((rev != rev0) || (depth != depth0) || + (sub_x != sub_x0) || (sub_y != sub_y0)) + { can_use_ycc = false; + } } if (!can_use_ycc) + { return; + } bool use_ycc; if (!cod->get(Cycc,0,0,use_ycc)) + { cod->set(Cycc,0,0,use_ycc=true); + } if (!use_ycc) + { return; + } float weight; - if (cod->get(Clev_weights,0,0,weight) || - cod->get(Cband_weights,0,0,weight)) - return; // Weights already specified explicitly. + if (cod->get(Clev_weights,0,0,weight) || cod->get(Cband_weights,0,0,weight)) + { + // Weights already specified explicitly -> nothing to do + return; + } - /* These example weights are adapted from numbers generated by Marcus Nadenau - at EPFL, for a viewing distance of 15 cm and a display resolution of - 300 DPI. */ + // These example weights are adapted from numbers generated by Marcus Nadenau + // at EPFL, for a viewing distance of 15 cm and a display resolution of + // 300 DPI. cod->parse_string("Cband_weights:C0=" "{0.0901},{0.2758},{0.2758}," @@ -775,7 +777,7 @@ all necessary level shifting, type conversion, rounding and truncation. */ val += 128; if (val & ((-1)<<8)) { - val = (val<0)?0:255; + val = (val < 0 ? 0 : 255); } *dest = (kdu_byte) val; } @@ -793,7 +795,7 @@ all necessary level shifting, type conversion, rounding and truncation. */ val += 128; if (val & ((-1)<<8)) { - val = (val<0)?0:255; + val = (val < 0 ? 0 : 255); } *dest = (kdu_byte) val; } @@ -816,7 +818,7 @@ all necessary level shifting, type conversion, rounding and truncation. */ val += 128; if (val & ((-1)<<8)) { - val = (val<0)?0:255; + val = (val < 0 ? 0 : 255); } *dest = (kdu_byte) val; } @@ -835,7 +837,7 @@ all necessary level shifting, type conversion, rounding and truncation. */ val += 128; if (val & ((-1)<<8)) { - val = (val<0)?0:(256-(1<codestream = codestream; - codestream.get_valid_tiles(valid_tile_indices); - tile_idx = valid_tile_indices.pos; - tile = codestream.open_tile(tile_idx,NULL); - - // Set up the individual components - num_components = codestream.get_num_components(true); - components = new kdc_component_flow_control[num_components]; - count_delta = 0; - kdc_component_flow_control *comp = components; - for (n = 0; n < num_components; n++, comp++) - { - comp->line = NULL; - comp->reader = img_in; - kdu_coords subsampling; - codestream.get_subsampling(n,subsampling,true); - kdu_dims dims; - codestream.get_tile_dims(tile_idx,n,dims,true); - comp->vert_subsampling = subsampling.y; - if ((n == 0) || (comp->vert_subsampling < count_delta)) - { - count_delta = comp->vert_subsampling; - } - comp->ratio_counter = 0; - comp->remaining_lines = comp->initial_lines = dims.size.y; - } - assert(num_components >= 0); - - tile.set_components_of_interest(num_components); - max_buffer_memory = engine.create(codestream,tile,false,NULL,false,1,NULL,NULL,false); + int n; + + this->codestream = codestream; + codestream.get_valid_tiles(valid_tile_indices); + tile_idx = valid_tile_indices.pos; + tile = codestream.open_tile(tile_idx,NULL); + + // Set up the individual components + num_components = codestream.get_num_components(true); + components = new kdc_component_flow_control[num_components]; + count_delta = 0; + kdc_component_flow_control *comp = components; + for (n = 0; n < num_components; n++, comp++) + { + comp->line = NULL; + comp->reader = img_in; + kdu_coords subsampling; + codestream.get_subsampling(n,subsampling,true); + kdu_dims dims; + codestream.get_tile_dims(tile_idx,n,dims,true); + comp->vert_subsampling = subsampling.y; + if ((n == 0) || (comp->vert_subsampling < count_delta)) + { + count_delta = comp->vert_subsampling; + } + comp->ratio_counter = 0; + comp->remaining_lines = comp->initial_lines = dims.size.y; + } + assert(num_components >= 0); + + tile.set_components_of_interest(num_components); + max_buffer_memory = engine.create(codestream,tile,false,NULL,false,1,NULL,NULL,false); } kdc_flow_control::~kdc_flow_control() { - if (components != NULL) - delete[] components; - if (engine.exists()) - engine.destroy(); + if (components != NULL) + { + delete[] components; + } + if (engine.exists()) + { + engine.destroy(); + } } bool kdc_flow_control::advance_components() { - bool found_line = false; - while (!found_line) - { - bool all_done = true; - kdc_component_flow_control *comp = components; - for (int n = 0; n < num_components; n++, comp++) - { - assert(comp->ratio_counter >= 0); - if (comp->remaining_lines > 0) - { - all_done = false; - comp->ratio_counter -= count_delta; - if (comp->ratio_counter < 0) - { - found_line = true; - comp->line = engine.exchange_line(n,NULL,NULL); - assert(comp->line != NULL); + bool found_line = false; + while (!found_line) + { + bool all_done = true; + kdc_component_flow_control *comp = components; + for (int n = 0; n < num_components; n++, comp++) + { + assert(comp->ratio_counter >= 0); + if (comp->remaining_lines > 0) + { + all_done = false; + comp->ratio_counter -= count_delta; + if (comp->ratio_counter < 0) + { + found_line = true; + comp->line = engine.exchange_line(n,NULL,NULL); + assert(comp->line != NULL); if (comp->line->get_width()) { comp->reader->get(n,*(comp->line),0); } - } - } - } - if (all_done) - { - return false; - } - } - return true; + } + } + } + if (all_done) + { + return false; + } + } + return true; } void kdc_flow_control::process_components() { - kdc_component_flow_control *comp = components; - for (int n = 0; n < num_components; n++, comp++) - { - if (comp->ratio_counter < 0) - { - comp->ratio_counter += comp->vert_subsampling; - assert(comp->ratio_counter >= 0); - assert(comp->remaining_lines > 0); - comp->remaining_lines--; - assert(comp->line != NULL); - engine.exchange_line(n,comp->line,NULL); - comp->line = NULL; - } - } + kdc_component_flow_control *comp = components; + for (int n = 0; n < num_components; n++, comp++) + { + if (comp->ratio_counter < 0) + { + comp->ratio_counter += comp->vert_subsampling; + assert(comp->ratio_counter >= 0); + assert(comp->remaining_lines > 0); + comp->remaining_lines--; + assert(comp->line != NULL); + engine.exchange_line(n,comp->line,NULL); + comp->line = NULL; + } + } } diff --git a/indra/llkdu/llkdumem.cpp b/indra/llkdu/llkdumem.cpp index 1f549cbbe0..0347475559 100644 --- a/indra/llkdu/llkdumem.cpp +++ b/indra/llkdu/llkdumem.cpp @@ -47,12 +47,12 @@ LLKDUMemIn::LLKDUMemIn(const U8 *data, num_components = in_num_components; alignment_bytes = 0; - for (n=0; n<3; ++n) + for (n = 0; n < 3; ++n) { precision[n] = 0; } - for (n=0; n < num_components; ++n) + for (n = 0; n < num_components; ++n) { siz->set(Sdims,n,0,rows); siz->set(Sdims,n,1,cols); @@ -80,12 +80,12 @@ LLKDUMemIn::~LLKDUMemIn() } image_line_buf *tmp; while ((tmp=incomplete_lines) != NULL) - { + { incomplete_lines = tmp->next; delete tmp; } while ((tmp=free_lines) != NULL) - { + { free_lines = tmp->next; delete tmp; } @@ -98,16 +98,16 @@ bool LLKDUMemIn::get(int comp_idx, kdu_line_buf &line, int x_tnum) assert((idx >= 0) && (idx < num_components)); x_tnum = x_tnum*num_components+idx; image_line_buf *scan, *prev=NULL; - for (scan=incomplete_lines; scan != NULL; prev=scan, scan=scan->next) - { + for (scan = incomplete_lines; scan != NULL; prev = scan, scan = scan->next) + { assert(scan->next_x_tnum >= x_tnum); if (scan->next_x_tnum == x_tnum) { break; } - } + } if (scan == NULL) - { // Need to read a new image line. + { // Need to read a new image line. assert(x_tnum == 0); // Must consume in very specific order. if (num_unread_rows == 0) { @@ -134,7 +134,7 @@ bool LLKDUMemIn::get(int comp_idx, kdu_line_buf &line, int x_tnum) num_unread_rows--; scan->accessed_samples = 0; scan->next_x_tnum = 0; - } + } assert((cols-scan->accessed_samples) >= line.get_width()); @@ -161,7 +161,7 @@ bool LLKDUMemIn::get(int comp_idx, kdu_line_buf &line, int x_tnum) } } else - { + { kdu_sample16 *dp = line.get_buf16(); if (line.is_absolute()) { // 16-bit absolute integers @@ -177,7 +177,7 @@ bool LLKDUMemIn::get(int comp_idx, kdu_line_buf &line, int x_tnum) dp->ival = (((kdu_int16)(*sp)) - 128) << (KDU_FIX_POINT-8); } } - } + } scan->next_x_tnum++; if (idx == (num_components-1)) diff --git a/indra/llkdu/llkdumem.h b/indra/llkdu/llkdumem.h index 7064de4408..9d923fc367 100644 --- a/indra/llkdu/llkdumem.h +++ b/indra/llkdu/llkdumem.h @@ -39,7 +39,7 @@ class LLKDUMemSource: public kdu_compressed_source { -public: // Member functions +public: LLKDUMemSource(U8 *input_buffer, U32 size) { mData = input_buffer; @@ -47,11 +47,11 @@ public: // Member functions mCurPos = 0; } - ~LLKDUMemSource() + ~LLKDUMemSource() { } - int read(kdu_byte *buf, int num_bytes) + int read(kdu_byte *buf, int num_bytes) { U32 num_out; num_out = num_bytes; @@ -70,7 +70,7 @@ public: // Member functions mCurPos = 0; } -private: // Data +private: U8 *mData; U32 mSize; U32 mCurPos; @@ -78,7 +78,7 @@ private: // Data class LLKDUMemTarget: public kdu_compressed_target { -public: // Member functions +public: LLKDUMemTarget(U8 *output_buffer, U32 &output_size, const U32 buffer_size) { mData = output_buffer; @@ -87,11 +87,11 @@ public: // Member functions mOutputSize = &output_size; } - ~LLKDUMemTarget() - { + ~LLKDUMemTarget() + { } - bool write(const kdu_byte *buf, int num_bytes) + bool write(const kdu_byte *buf, int num_bytes) { U32 num_out; num_out = num_bytes; @@ -108,7 +108,7 @@ public: // Member functions return true; } -private: // Data +private: U8 *mData; U32 mSize; U32 mCurPos; @@ -117,27 +117,27 @@ private: // Data class LLKDUMemIn : public kdu_image_in_base { -public: // Member functions - LLKDUMemIn(const U8 *data, +public: + LLKDUMemIn(const U8 *data, const U32 size, const U16 rows, const U16 cols, U8 in_num_components, siz_params *siz); - ~LLKDUMemIn(); + ~LLKDUMemIn(); - bool get(int comp_idx, kdu_line_buf &line, int x_tnum); + bool get(int comp_idx, kdu_line_buf &line, int x_tnum); -private: // Data +private: const U8 *mData; - int first_comp_idx; - int num_components; - int rows, cols; - int alignment_bytes; // Number of 0's at end of each line. - int precision[3]; - image_line_buf *incomplete_lines; // Each "sample" represents a full pixel - image_line_buf *free_lines; - int num_unread_rows; + int first_comp_idx; + int num_components; + int rows, cols; + int alignment_bytes; // Number of 0's at end of each line. + int precision[3]; + image_line_buf *incomplete_lines; // Each "sample" represents a full pixel + image_line_buf *free_lines; + int num_unread_rows; U32 mCurPos; U32 mDataSize; -- cgit v1.2.3 From 83ec0cd62f70888c90671ea91cd056ecb6095bc1 Mon Sep 17 00:00:00 2001 From: Merov Linden Date: Mon, 4 Apr 2011 18:37:32 -0700 Subject: STORM-746 : add new arguments for precincts and blocks on output, region and level on input, add code for input loading restriction --- .../llimage_libtest/llimage_libtest.cpp | 126 +++++++++++++++++++-- indra/llimage/llimagej2c.cpp | 7 ++ indra/llimage/llimagej2c.h | 2 + indra/llimagej2coj/llimagej2coj.cpp | 5 + indra/llimagej2coj/llimagej2coj.h | 1 + indra/llkdu/llimagej2ckdu.cpp | 38 ++++--- indra/llkdu/llimagej2ckdu.h | 3 +- 7 files changed, 161 insertions(+), 21 deletions(-) diff --git a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp index 365f5f758c..10d6ffb685 100644 --- a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp +++ b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp @@ -53,12 +53,28 @@ static const char USAGE[] = "\n" " -o, --output OR \n" " List of image files to create (assumes same order as for input files)\n" " OR 3 letters file type extension to convert each input file into.\n" +" -r, --region \n" +" Crop region on the input file in pixel.\n" +" Only used for j2c images. Default is no region cropping.\n" +" -d, --discard_level \n" +" Discard level max used on input. 0 is high resolution. Max discard level is 5.\n" +" This allows the input image to be clamped in resolution when loading.\n" +" Only valid for j2c images. Default is no discard.\n" +" -p, --precincts \n" +" Dimension of precincts in pixels. Precincts are assumed square and identical for\n" +" all levels. Note that this oprion also uses PLT and tile markers, \n" +" as well as RPCL order. Power of 2 must be used.\n" +" Only valid for output j2c images. Default is no precincts used.\n" +" -b, --blocks \n" +" Dimension of coding blocks in pixels. Blocks are assumed square. Power of 2 must\n" +" be used. Blocks must be smaller than precincts.\n" +" Only valid for output j2c images. Default is 64.\n" " -log, --logmetrics \n" " Log performance data for . Results in .slp\n" " Note: so far, only ImageCompressionTester has been tested.\n" -" -r, --analyzeperformance\n" +" -a, --analyzeperformance\n" " Create a report comparing _baseline.slp with current .slp\n" -" Results in _report.csv" +" Results in _report.csv\n" " -s, --image-stats\n" " Output stats for each input and output image.\n" "\n"; @@ -110,10 +126,11 @@ void output_image_stats(LLPointer image, const std::string &fi } // Load an image from file and return a raw (decompressed) instance of its data -LLPointer load_image(const std::string &src_filename, bool output_stats) +LLPointer load_image(const std::string &src_filename, bool output_stats, bool use_discard_level, int discard_level, bool use_region, int* region) { LLPointer image = create_image(src_filename); - + + // This just load the image file stream into a buffer. No decoding done. if (!image->load(src_filename)) { return NULL; @@ -131,6 +148,17 @@ LLPointer load_image(const std::string &src_filename, bool output_st } LLPointer raw_image = new LLImageRaw; + + // Set the image restriction on load in the case of a j2c image + if ((image->getCodec() == IMG_CODEC_J2C) && (use_discard_level || use_region)) + { + int discard = (use_discard_level ? discard_level : -1); + int* reg = (use_region ? region : NULL); + // That method doesn't exist (and likely, doesn't make sense) for any other image file format + // hence the required cryptic cast. + ((LLImageJ2C*)(image.get()))->initDecode(*raw_image, discard, reg); + } + if (!image->decode(raw_image, 0.0f)) { return NULL; @@ -280,8 +308,17 @@ int main(int argc, char** argv) // List of input and output files std::list input_filenames; std::list output_filenames; + // Other optional parsed arguments bool analyze_performance = false; bool image_stats = false; + bool use_region = false; + int region[4]; + bool use_discard_level = false; + int discard_level = 0; + bool use_precincts = false; + int precincts_size; + bool use_blocks = false; + int blocks_size; // Init whatever is necessary ll_init_apr(); @@ -323,6 +360,81 @@ int main(int argc, char** argv) file_name = argv[arg+1]; // Next argument and loop over } } + else if ((!strcmp(argv[arg], "--region") || !strcmp(argv[arg], "-r")) && arg < argc-1) + { + std::string value_str = argv[arg+1]; + int index = 0; + while (value_str[0] != '-') // if arg starts with '-', it's the next option + { + int value = atoi(value_str.c_str()); + region[index++] = value; + arg += 1; // Definitely skip that arg now we know it's a number + if ((arg + 1) == argc) // Break out of the loop if we reach the end of the arg list + break; + if (index == 4) // Break out of the loop if we captured 4 values already + break; + value_str = argv[arg+1]; // Next argument and loop over + } + if (index == 4) + { + use_region = true; + } + else + { + std::cout << "--region arguments invalid" << std::endl; + } + } + else if (!strcmp(argv[arg], "--discard_level") || !strcmp(argv[arg], "-d")) + { + std::string value_str; + if ((arg + 1) < argc) + { + value_str = argv[arg+1]; + } + if (((arg + 1) >= argc) || (value_str[0] == '-')) + { + std::cout << "No valid --discard_level argument given, discard_level ignored" << std::endl; + } + else + { + use_discard_level = true; + discard_level = atoi(value_str.c_str()); + } + } + else if (!strcmp(argv[arg], "--precincts") || !strcmp(argv[arg], "-p")) + { + std::string value_str; + if ((arg + 1) < argc) + { + value_str = argv[arg+1]; + } + if (((arg + 1) >= argc) || (value_str[0] == '-')) + { + std::cout << "No valid --precincts argument given, precincts ignored" << std::endl; + } + else + { + use_precincts = true; + precincts_size = atoi(value_str.c_str()); + } + } + else if (!strcmp(argv[arg], "--blocks") || !strcmp(argv[arg], "-b")) + { + std::string value_str; + if ((arg + 1) < argc) + { + value_str = argv[arg+1]; + } + if (((arg + 1) >= argc) || (value_str[0] == '-')) + { + std::cout << "No valid --blocks argument given, blocks ignored" << std::endl; + } + else + { + use_blocks = true; + blocks_size = atoi(value_str.c_str()); + } + } else if (!strcmp(argv[arg], "--logmetrics") || !strcmp(argv[arg], "-log")) { // '--logmetrics' needs to be specified with a named test metric argument @@ -346,7 +458,7 @@ int main(int argc, char** argv) break; } } - else if (!strcmp(argv[arg], "--analyzeperformance") || !strcmp(argv[arg], "-r")) + else if (!strcmp(argv[arg], "--analyzeperformance") || !strcmp(argv[arg], "-a")) { analyze_performance = true; } @@ -364,7 +476,7 @@ int main(int argc, char** argv) } if (analyze_performance && !LLFastTimer::sMetricLog) { - std::cout << "Cannot create perf report if no perf gathered (i.e. use argument -log with -r) -> exit" << std::endl; + std::cout << "Cannot create perf report if no perf gathered (i.e. use argument -log with -a) -> exit" << std::endl; return 0; } @@ -385,7 +497,7 @@ int main(int argc, char** argv) for (; in_file != in_end; ++in_file) { // Load file - LLPointer raw_image = load_image(*in_file, image_stats); + LLPointer raw_image = load_image(*in_file, image_stats, use_discard_level, discard_level, use_region, region); if (!raw_image) { std::cout << "Error: Image " << *in_file << " could not be loaded" << std::endl; diff --git a/indra/llimage/llimagej2c.cpp b/indra/llimage/llimagej2c.cpp index 80fec7f8a0..6b49f3de88 100644 --- a/indra/llimage/llimagej2c.cpp +++ b/indra/llimage/llimagej2c.cpp @@ -139,6 +139,10 @@ BOOL LLImageJ2C::updateData() return res; } +BOOL LLImageJ2C::initDecode(LLImageRaw &raw_image, int discard_level, int* region) +{ + return mImpl->initDecode(*this,raw_image,discard_level,region); +} BOOL LLImageJ2C::decode(LLImageRaw *raw_imagep, F32 decode_time) { @@ -251,6 +255,9 @@ S32 LLImageJ2C::calcHeaderSizeJ2C() //static S32 LLImageJ2C::calcDataSizeJ2C(S32 w, S32 h, S32 comp, S32 discard_level, F32 rate) { + // Note: this only provides an *estimate* of the size in bytes of an image level + // *TODO: find a way to read the true size (when available) and convey the fact + // that the result is an estimate in the other cases if (rate <= 0.f) rate = .125f; while (discard_level > 0) { diff --git a/indra/llimage/llimagej2c.h b/indra/llimage/llimagej2c.h index dd5bec8b2e..7af1c13921 100644 --- a/indra/llimage/llimagej2c.h +++ b/indra/llimage/llimagej2c.h @@ -56,6 +56,7 @@ public: /*virtual*/ void resetLastError(); /*virtual*/ void setLastError(const std::string& message, const std::string& filename = std::string()); + BOOL initDecode(LLImageRaw &raw_image, int discard_level, int* region); // Encode with comment text BOOL encode(const LLImageRaw *raw_imagep, const char* comment_text, F32 encode_time=0.0); @@ -117,6 +118,7 @@ protected: virtual BOOL decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count) = 0; virtual BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0, BOOL reversible=FALSE) = 0; + virtual BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL) = 0; friend class LLImageJ2C; }; diff --git a/indra/llimagej2coj/llimagej2coj.cpp b/indra/llimagej2coj/llimagej2coj.cpp index 13b12c0928..11c826e41a 100644 --- a/indra/llimagej2coj/llimagej2coj.cpp +++ b/indra/llimagej2coj/llimagej2coj.cpp @@ -107,6 +107,11 @@ LLImageJ2COJ::~LLImageJ2COJ() { } +BOOL LLImageJ2COJ::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level, int* region) +{ + // No specific implementaion for this method in the OpenJpeg case + return FALSE; +} BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count) { diff --git a/indra/llimagej2coj/llimagej2coj.h b/indra/llimagej2coj/llimagej2coj.h index 9476665ccb..d5f2f7a2d1 100644 --- a/indra/llimagej2coj/llimagej2coj.h +++ b/indra/llimagej2coj/llimagej2coj.h @@ -39,6 +39,7 @@ protected: /*virtual*/ BOOL decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count); /*virtual*/ BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0, BOOL reversible = FALSE); + /*virtual*/ BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL); }; #endif diff --git a/indra/llkdu/llimagej2ckdu.cpp b/indra/llkdu/llimagej2ckdu.cpp index 61b16c80e6..e51cfee6eb 100644 --- a/indra/llkdu/llimagej2ckdu.cpp +++ b/indra/llkdu/llimagej2ckdu.cpp @@ -106,7 +106,11 @@ const char* fallbackEngineInfoLLImageJ2CImpl() class LLKDUDecodeState { public: + LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap); + ~LLKDUDecodeState(); + BOOL processTileDecode(F32 decode_time, BOOL limit_time = TRUE); +private: S32 mNumComponents; BOOL mUseYCC; kdu_dims mDims; @@ -116,20 +120,10 @@ public: kdu_pull_ifc mEngines[4]; bool mReversible[4]; // Some components may be reversible and others not int mBitDepths[4]; // Original bit-depth may be quite different from 8 - + kdu_tile mTile; kdu_byte *mBuf; S32 mRowGap; - - LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap); - ~LLKDUDecodeState(); - BOOL processTileDecode(F32 decode_time, BOOL limit_time = TRUE); - -public: - int *AssignLayerBytes(siz_params *siz, int &num_specs); - - void setupCodeStream(BOOL keep_codestream, LLImageJ2CKDU::ECodeStreamMode mode); - BOOL initDecode(LLImageRaw &raw_image, F32 decode_time, LLImageJ2CKDU::ECodeStreamMode mode, S32 first_channel, S32 max_channel_count ); }; void ll_kdu_error( void ) @@ -327,7 +321,12 @@ void LLImageJ2CKDU::cleanupCodeStream() mTileIndicesp = NULL; } -BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count ) +BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level, int* region) +{ + return initDecode(base,raw_image,0.0f,MODE_FAST,0,4,discard_level,region); +} + +BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count, int discard_level, int* region) { base.resetLastError(); @@ -340,7 +339,20 @@ BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco mRawImagep = &raw_image; mCodeStreamp->change_appearance(false, true, false); - mCodeStreamp->apply_input_restrictions(first_channel,max_channel_count,base.getRawDiscardLevel(),0,NULL); + + // Apply loading discard level and cropping if required + kdu_dims* region_kdu = NULL; + if (region != NULL) + { + region_kdu = new kdu_dims; + region_kdu->pos.x = region[0]; + region_kdu->pos.y = region[1]; + region_kdu->size.x = region[2] - region[0]; + region_kdu->size.y = region[3] - region[1]; + } + int discard = (discard_level != -1 ? discard_level : base.getRawDiscardLevel()); + + mCodeStreamp->apply_input_restrictions( first_channel, max_channel_count, discard, 0, region_kdu); kdu_dims dims; mCodeStreamp->get_dims(0,dims); S32 channels = base.getComponents() - first_channel; diff --git a/indra/llkdu/llimagej2ckdu.h b/indra/llkdu/llimagej2ckdu.h index 5628f69eeb..8231004f2c 100644 --- a/indra/llkdu/llimagej2ckdu.h +++ b/indra/llkdu/llimagej2ckdu.h @@ -58,11 +58,12 @@ protected: /*virtual*/ BOOL decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count); /*virtual*/ BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0, BOOL reversible=FALSE); + /*virtual*/ BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL); private: + BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count, int discard_level = -1, int* region = NULL); void setupCodeStream(LLImageJ2C &base, BOOL keep_codestream, ECodeStreamMode mode); void cleanupCodeStream(); - BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count ); // Encode variable LLKDUMemSource *mInputp; -- cgit v1.2.3 From e752e918283acf95c1ed33d92a7bf34bbca83071 Mon Sep 17 00:00:00 2001 From: Merov Linden Date: Mon, 4 Apr 2011 23:49:40 -0700 Subject: STORM-746 : add precincts and blocks arguments taken into account in j2c output --- .../llimage_libtest/llimage_libtest.cpp | 50 +++++++++++----------- indra/llimage/llimagej2c.cpp | 5 +++ indra/llimage/llimagej2c.h | 2 + indra/llimagej2coj/llimagej2coj.cpp | 8 +++- indra/llimagej2coj/llimagej2coj.h | 1 + indra/llkdu/llimagej2ckdu.cpp | 34 +++++++++++++-- indra/llkdu/llimagej2ckdu.h | 3 ++ 7 files changed, 74 insertions(+), 29 deletions(-) diff --git a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp index 10d6ffb685..31d3e18877 100644 --- a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp +++ b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp @@ -126,7 +126,7 @@ void output_image_stats(LLPointer image, const std::string &fi } // Load an image from file and return a raw (decompressed) instance of its data -LLPointer load_image(const std::string &src_filename, bool output_stats, bool use_discard_level, int discard_level, bool use_region, int* region) +LLPointer load_image(const std::string &src_filename, int discard_level, int* region, bool output_stats) { LLPointer image = create_image(src_filename); @@ -150,13 +150,11 @@ LLPointer load_image(const std::string &src_filename, bool output_st LLPointer raw_image = new LLImageRaw; // Set the image restriction on load in the case of a j2c image - if ((image->getCodec() == IMG_CODEC_J2C) && (use_discard_level || use_region)) + if ((image->getCodec() == IMG_CODEC_J2C) && ((discard_level != -1) || (region != NULL))) { - int discard = (use_discard_level ? discard_level : -1); - int* reg = (use_region ? region : NULL); // That method doesn't exist (and likely, doesn't make sense) for any other image file format // hence the required cryptic cast. - ((LLImageJ2C*)(image.get()))->initDecode(*raw_image, discard, reg); + ((LLImageJ2C*)(image.get()))->initDecode(*raw_image, discard_level, region); } if (!image->decode(raw_image, 0.0f)) @@ -168,10 +166,18 @@ LLPointer load_image(const std::string &src_filename, bool output_st } // Save a raw image instance into a file -bool save_image(const std::string &dest_filename, LLPointer raw_image, bool output_stats) +bool save_image(const std::string &dest_filename, LLPointer raw_image, int blocks_size, int precincts_size, bool output_stats) { LLPointer image = create_image(dest_filename); + // Set the image restriction on load in the case of a j2c image + if ((image->getCodec() == IMG_CODEC_J2C) && ((blocks_size != -1) || (precincts_size != -1))) + { + // That method doesn't exist (and likely, doesn't make sense) for any other image file format + // hence the required cryptic cast. + ((LLImageJ2C*)(image.get()))->initEncode(*raw_image, blocks_size, precincts_size); + } + if (!image->encode(raw_image, 0.0f)) { return false; @@ -311,14 +317,10 @@ int main(int argc, char** argv) // Other optional parsed arguments bool analyze_performance = false; bool image_stats = false; - bool use_region = false; - int region[4]; - bool use_discard_level = false; - int discard_level = 0; - bool use_precincts = false; - int precincts_size; - bool use_blocks = false; - int blocks_size; + int* region = NULL; + int discard_level = -1; + int precincts_size = -1; + int blocks_size = -1; // Init whatever is necessary ll_init_apr(); @@ -364,6 +366,7 @@ int main(int argc, char** argv) { std::string value_str = argv[arg+1]; int index = 0; + region = new int[4]; while (value_str[0] != '-') // if arg starts with '-', it's the next option { int value = atoi(value_str.c_str()); @@ -375,13 +378,11 @@ int main(int argc, char** argv) break; value_str = argv[arg+1]; // Next argument and loop over } - if (index == 4) - { - use_region = true; - } - else + if (index != 4) { std::cout << "--region arguments invalid" << std::endl; + delete [] region; + region = NULL; } } else if (!strcmp(argv[arg], "--discard_level") || !strcmp(argv[arg], "-d")) @@ -397,8 +398,9 @@ int main(int argc, char** argv) } else { - use_discard_level = true; discard_level = atoi(value_str.c_str()); + // Clamp to the values accepted by the viewer + discard_level = llclamp(discard_level,0,5); } } else if (!strcmp(argv[arg], "--precincts") || !strcmp(argv[arg], "-p")) @@ -414,8 +416,8 @@ int main(int argc, char** argv) } else { - use_precincts = true; precincts_size = atoi(value_str.c_str()); + // *TODO: make sure precincts_size is a power of 2 } } else if (!strcmp(argv[arg], "--blocks") || !strcmp(argv[arg], "-b")) @@ -431,8 +433,8 @@ int main(int argc, char** argv) } else { - use_blocks = true; blocks_size = atoi(value_str.c_str()); + // *TODO: make sure blocks_size is a power of 2 } } else if (!strcmp(argv[arg], "--logmetrics") || !strcmp(argv[arg], "-log")) @@ -497,7 +499,7 @@ int main(int argc, char** argv) for (; in_file != in_end; ++in_file) { // Load file - LLPointer raw_image = load_image(*in_file, image_stats, use_discard_level, discard_level, use_region, region); + LLPointer raw_image = load_image(*in_file, discard_level, region, image_stats); if (!raw_image) { std::cout << "Error: Image " << *in_file << " could not be loaded" << std::endl; @@ -507,7 +509,7 @@ int main(int argc, char** argv) // Save file if (out_file != out_end) { - if (!save_image(*out_file, raw_image, image_stats)) + if (!save_image(*out_file, raw_image, blocks_size, precincts_size, image_stats)) { std::cout << "Error: Image " << *out_file << " could not be saved" << std::endl; } diff --git a/indra/llimage/llimagej2c.cpp b/indra/llimage/llimagej2c.cpp index 6b49f3de88..a90df0f1c1 100644 --- a/indra/llimage/llimagej2c.cpp +++ b/indra/llimage/llimagej2c.cpp @@ -144,6 +144,11 @@ BOOL LLImageJ2C::initDecode(LLImageRaw &raw_image, int discard_level, int* regio return mImpl->initDecode(*this,raw_image,discard_level,region); } +BOOL LLImageJ2C::initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size) +{ + return mImpl->initEncode(*this,raw_image,blocks_size,precincts_size); +} + BOOL LLImageJ2C::decode(LLImageRaw *raw_imagep, F32 decode_time) { return decodeChannels(raw_imagep, decode_time, 0, 4); diff --git a/indra/llimage/llimagej2c.h b/indra/llimage/llimagej2c.h index 7af1c13921..6bba81aab5 100644 --- a/indra/llimage/llimagej2c.h +++ b/indra/llimage/llimagej2c.h @@ -57,6 +57,7 @@ public: /*virtual*/ void setLastError(const std::string& message, const std::string& filename = std::string()); BOOL initDecode(LLImageRaw &raw_image, int discard_level, int* region); + BOOL initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size); // Encode with comment text BOOL encode(const LLImageRaw *raw_imagep, const char* comment_text, F32 encode_time=0.0); @@ -119,6 +120,7 @@ protected: virtual BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0, BOOL reversible=FALSE) = 0; virtual BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL) = 0; + virtual BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1) = 0; friend class LLImageJ2C; }; diff --git a/indra/llimagej2coj/llimagej2coj.cpp b/indra/llimagej2coj/llimagej2coj.cpp index 11c826e41a..8288fa1f5c 100644 --- a/indra/llimagej2coj/llimagej2coj.cpp +++ b/indra/llimagej2coj/llimagej2coj.cpp @@ -109,7 +109,13 @@ LLImageJ2COJ::~LLImageJ2COJ() BOOL LLImageJ2COJ::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level, int* region) { - // No specific implementaion for this method in the OpenJpeg case + // No specific implementation for this method in the OpenJpeg case + return FALSE; +} + +BOOL LLImageJ2COJ::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size) +{ + // No specific implementation for this method in the OpenJpeg case return FALSE; } diff --git a/indra/llimagej2coj/llimagej2coj.h b/indra/llimagej2coj/llimagej2coj.h index d5f2f7a2d1..9c7cc09fcb 100644 --- a/indra/llimagej2coj/llimagej2coj.h +++ b/indra/llimagej2coj/llimagej2coj.h @@ -40,6 +40,7 @@ protected: /*virtual*/ BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0, BOOL reversible = FALSE); /*virtual*/ BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL); + /*virtual*/ BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1); }; #endif diff --git a/indra/llkdu/llimagej2ckdu.cpp b/indra/llkdu/llimagej2ckdu.cpp index e51cfee6eb..8d2ed8f8c4 100644 --- a/indra/llkdu/llimagej2ckdu.cpp +++ b/indra/llkdu/llimagej2ckdu.cpp @@ -190,7 +190,9 @@ mCodeStreamp(NULL), mTPosp(NULL), mTileIndicesp(NULL), mRawImagep(NULL), -mDecodeState(NULL) +mDecodeState(NULL), +mBlocksSize(-1), +mPrecinctsSize(-1) { } @@ -326,6 +328,13 @@ BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int disc return initDecode(base,raw_image,0.0f,MODE_FAST,0,4,discard_level,region); } +BOOL LLImageJ2CKDU::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size) +{ + mBlocksSize = blocks_size; + mPrecinctsSize = precincts_size; + return TRUE; +} + BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count, int discard_level, int* region) { base.resetLastError(); @@ -623,9 +632,26 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co } } - // *TODO : Add precinct specification here - //std::string precincts_string = llformat("Cprecincts={128,128}"); - //codestream.access_siz()->parse_string(precincts_string.c_str()); + // Set up data ordering, markers, etc... if precincts or blocks specified + if ((mBlocksSize != -1) || (mPrecinctsSize != -1)) + { + if (mPrecinctsSize != -1) + { + std::string precincts_string = llformat("Cprecincts={%d,%d}",mPrecinctsSize,mPrecinctsSize); + codestream.access_siz()->parse_string(precincts_string.c_str()); + } + if (mBlocksSize != -1) + { + std::string blocks_string = llformat("Cblk={%d,%d}",mBlocksSize,mBlocksSize); + codestream.access_siz()->parse_string(blocks_string.c_str()); + } + std::string ordering_string = llformat("Corder=RPCL"); + codestream.access_siz()->parse_string(ordering_string.c_str()); + std::string PLT_string = llformat("ORGgen_plt=yes"); + codestream.access_siz()->parse_string(PLT_string.c_str()); + std::string Parts_string = llformat("ORGtparts=R"); + codestream.access_siz()->parse_string(Parts_string.c_str()); + } codestream.access_siz()->finalize_all(); codestream.change_appearance(transpose,vflip,hflip); diff --git a/indra/llkdu/llimagej2ckdu.h b/indra/llkdu/llimagej2ckdu.h index 8231004f2c..9fce58b762 100644 --- a/indra/llkdu/llimagej2ckdu.h +++ b/indra/llkdu/llimagej2ckdu.h @@ -59,6 +59,7 @@ protected: /*virtual*/ BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0, BOOL reversible=FALSE); /*virtual*/ BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL); + /*virtual*/ BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1); private: BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count, int discard_level = -1, int* region = NULL); @@ -70,6 +71,8 @@ private: kdu_codestream *mCodeStreamp; kdu_coords *mTPosp; // tile position kdu_dims *mTileIndicesp; + int mBlocksSize; + int mPrecinctsSize; // Temporary variables for in-progress decodes... LLImageRaw *mRawImagep; -- cgit v1.2.3 From 379e2e138d801ebf7f13d29512f76298aacf3dc5 Mon Sep 17 00:00:00 2001 From: Merov Linden Date: Thu, 7 Apr 2011 16:41:57 -0700 Subject: STORM-746 : Fix bug in performance report output --- .../llimage_libtest/llimage_libtest.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp index 31d3e18877..1466e44324 100644 --- a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp +++ b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp @@ -521,25 +521,25 @@ int main(int argc, char** argv) } } - // Stop the perf gathering system if needed - if (LLFastTimer::sMetricLog) - { - LLMetricPerformanceTesterBasic::deleteTester(LLFastTimer::sLogName); - sAllDone = true; - } - // Output perf data if requested by user if (analyze_performance) { - std::cout << "Analyzing performance" << std::endl; - std::string baseline_name = LLFastTimer::sLogName + "_baseline.slp"; std::string current_name = LLFastTimer::sLogName + ".slp"; std::string report_name = LLFastTimer::sLogName + "_report.csv"; + std::cout << "Analyzing performance, check report in : " << report_name << std::endl; + LLMetricPerformanceTesterBasic::doAnalysisMetrics(baseline_name, current_name, report_name); } + // Stop the perf gathering system if needed + if (LLFastTimer::sMetricLog) + { + LLMetricPerformanceTesterBasic::deleteTester(LLFastTimer::sLogName); + sAllDone = true; + } + // Cleanup and exit LLImage::cleanupClass(); if (fast_timer_log_thread) -- cgit v1.2.3 From cd363e8c87e176776f5db8fbaf60c264eabdaa3b Mon Sep 17 00:00:00 2001 From: Merov Linden Date: Thu, 7 Apr 2011 17:26:10 -0700 Subject: STORM-746 : Clean up typos in comments --- .../integration_tests/llimage_libtest/llimage_libtest.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp index 1466e44324..feb63e161d 100644 --- a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp +++ b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp @@ -54,20 +54,21 @@ static const char USAGE[] = "\n" " List of image files to create (assumes same order as for input files)\n" " OR 3 letters file type extension to convert each input file into.\n" " -r, --region \n" -" Crop region on the input file in pixel.\n" +" Crop region applied to the input files in pixels.\n" " Only used for j2c images. Default is no region cropping.\n" " -d, --discard_level \n" -" Discard level max used on input. 0 is high resolution. Max discard level is 5.\n" +" Discard level max used on input. 0 is highest resolution. Max discard level is 5.\n" " This allows the input image to be clamped in resolution when loading.\n" " Only valid for j2c images. Default is no discard.\n" " -p, --precincts \n" " Dimension of precincts in pixels. Precincts are assumed square and identical for\n" -" all levels. Note that this oprion also uses PLT and tile markers, \n" -" as well as RPCL order. Power of 2 must be used.\n" +" all levels. Note that this option also add PLT and tile markers to the codestream, \n" +" and uses RPCL order. Power of 2 must be used.\n" " Only valid for output j2c images. Default is no precincts used.\n" " -b, --blocks \n" " Dimension of coding blocks in pixels. Blocks are assumed square. Power of 2 must\n" -" be used. Blocks must be smaller than precincts.\n" +" be used. Blocks must be smaller than precincts. Like precincts, this option adds\n" +" PLT, tile markers and uses RPCL.\n" " Only valid for output j2c images. Default is 64.\n" " -log, --logmetrics \n" " Log performance data for . Results in .slp\n" @@ -130,7 +131,7 @@ LLPointer load_image(const std::string &src_filename, int discard_le { LLPointer image = create_image(src_filename); - // This just load the image file stream into a buffer. No decoding done. + // This just loads the image file stream into a buffer. No decoding done. if (!image->load(src_filename)) { return NULL; @@ -170,7 +171,7 @@ bool save_image(const std::string &dest_filename, LLPointer raw_imag { LLPointer image = create_image(dest_filename); - // Set the image restriction on load in the case of a j2c image + // Set the image codestream parameters on output in the case of a j2c image if ((image->getCodec() == IMG_CODEC_J2C) && ((blocks_size != -1) || (precincts_size != -1))) { // That method doesn't exist (and likely, doesn't make sense) for any other image file format -- cgit v1.2.3 From c4f03ca949c25b6fd5794ebada5c5e65154a33c0 Mon Sep 17 00:00:00 2001 From: Paul ProductEngine Date: Fri, 8 Apr 2011 19:21:21 +0300 Subject: STORM-595 FIXED (The presentation of IM sessions in message well depends on method that was used for opening IM window) - Added the callback with the timer on control name "ThrottleBandwidthKBPS" changes. Now message is sending to the simulator in 0.3 sec after LAST variable change. --- indra/newview/llfloaterpreference.cpp | 64 ++++++++++++++++++++++++++++++++++- indra/newview/llfloaterpreference.h | 5 +++ indra/newview/llviewercontrol.cpp | 7 ---- 3 files changed, 68 insertions(+), 8 deletions(-) diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index ffbb0efad3..87d8fca69f 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -43,6 +43,7 @@ #include "llcombobox.h" #include "llcommandhandler.h" #include "lldirpicker.h" +#include "lleventtimer.h" #include "llfeaturemanager.h" #include "llfocusmgr.h" //#include "llfirstuse.h" @@ -73,6 +74,7 @@ #include "llviewerwindow.h" #include "llviewermessage.h" #include "llviewershadermgr.h" +#include "llviewerthrottle.h" #include "llvotree.h" #include "llvosky.h" @@ -1534,10 +1536,56 @@ void LLFloaterPreference::setCacheLocation(const LLStringExplicit& location) cache_location_editor->setToolTip(location); } +//------------------------------Updater--------------------------------------- + +static bool handleBandwidthChanged(const LLSD& newvalue) +{ + gViewerThrottle.setMaxBandwidth((F32) newvalue.asReal()); + return true; +} + +class LLPanelPreference::Updater : public LLEventTimer +{ + +public: + + typedef boost::function callback_t; + + Updater(callback_t cb, F32 period) + :LLEventTimer(period), + mCallback(cb) + { + mEventTimer.stop(); + } + + virtual ~Updater(){} + + void update(const LLSD& new_value) + { + mNewValue = new_value; + mEventTimer.start(); + } + +protected: + + BOOL tick() + { + mCallback(mNewValue); + mEventTimer.stop(); + + return FALSE; + } + +private: + + LLSD mNewValue; + callback_t mCallback; +}; //---------------------------------------------------------------------------- static LLRegisterPanelClassWrapper t_places("panel_preference"); LLPanelPreference::LLPanelPreference() -: LLPanel() +: LLPanel(), + mBandWidthUpdater(NULL) { mCommitCallbackRegistrar.add("Pref.setControlFalse", boost::bind(&LLPanelPreference::setControlFalse,this, _2)); mCommitCallbackRegistrar.add("Pref.updateMediaAutoPlayCheckbox", boost::bind(&LLPanelPreference::updateMediaAutoPlayCheckbox, this, _1)); @@ -1607,10 +1655,24 @@ BOOL LLPanelPreference::postBuild() } } + //////////////////////PanelSetup /////////////////// + if (hasChild("max_bandwidth")) + { + mBandWidthUpdater = new LLPanelPreference::Updater(boost::bind(&handleBandwidthChanged, _1), 0.3); + gSavedSettings.getControl("ThrottleBandwidthKBPS")->getSignal()->connect(boost::bind(&LLPanelPreference::Updater::update, mBandWidthUpdater, _2)); + } + apply(); return true; } +LLPanelPreference::~LLPanelPreference() +{ + if (mBandWidthUpdater) + { + delete mBandWidthUpdater; + } +} void LLPanelPreference::apply() { // no-op diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index 46014804ec..2ccb0292c7 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -184,6 +184,8 @@ public: LLPanelPreference(); /*virtual*/ BOOL postBuild(); + virtual ~LLPanelPreference(); + virtual void apply(); virtual void cancel(); void setControlFalse(const LLSD& user_data); @@ -197,6 +199,7 @@ public: // cancel() can restore them. virtual void saveSettings(); + class Updater; private: //for "Only friends and groups can call or IM me" static void showFriendsOnlyWarning(LLUICtrl*, const LLSD&); @@ -208,6 +211,8 @@ private: typedef std::map string_color_map_t; string_color_map_t mSavedColors; + + Updater* mBandWidthUpdater; }; class LLPanelPreferenceGraphics : public LLPanelPreference diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index ffe607f912..06c1520314 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -239,12 +239,6 @@ static bool handleVideoMemoryChanged(const LLSD& newvalue) return true; } -static bool handleBandwidthChanged(const LLSD& newvalue) -{ - gViewerThrottle.setMaxBandwidth((F32) newvalue.asReal()); - return true; -} - static bool handleChatFontSizeChanged(const LLSD& newvalue) { if(gConsole) @@ -562,7 +556,6 @@ void settings_setup_listeners() gSavedSettings.getControl("RenderTerrainLODFactor")->getSignal()->connect(boost::bind(&handleTerrainLODChanged, _2)); gSavedSettings.getControl("RenderTreeLODFactor")->getSignal()->connect(boost::bind(&handleTreeLODChanged, _2)); gSavedSettings.getControl("RenderFlexTimeFactor")->getSignal()->connect(boost::bind(&handleFlexLODChanged, _2)); - gSavedSettings.getControl("ThrottleBandwidthKBPS")->getSignal()->connect(boost::bind(&handleBandwidthChanged, _2)); gSavedSettings.getControl("RenderGamma")->getSignal()->connect(boost::bind(&handleGammaChanged, _2)); gSavedSettings.getControl("RenderFogRatio")->getSignal()->connect(boost::bind(&handleFogRatioChanged, _2)); gSavedSettings.getControl("RenderMaxPartCount")->getSignal()->connect(boost::bind(&handleMaxPartCountChanged, _2)); -- cgit v1.2.3 From 0f785cef5751b0cf9428592ee9ddc9c991aaf7ec Mon Sep 17 00:00:00 2001 From: Seth ProductEngine Date: Mon, 11 Apr 2011 22:38:03 +0300 Subject: STORM-1145 FIXED displaying favorites list at login screen when user name is typed like "firstname.lastname" or "firstname_lastname" or user name consists of a single word. Restoring the fix for STORM-842 (changeset ccfd9a2e3b3c) lost during merging (changeset 5618715b7b2d). --- indra/newview/llpanellogin.cpp | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 7820ac3ecd..979d96ca0d 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -81,6 +81,9 @@ const S32 MAX_PASSWORD = 16; LLPanelLogin *LLPanelLogin::sInstance = NULL; BOOL LLPanelLogin::sCapslockDidNotification = FALSE; +// Helper for converting a user name into the canonical "Firstname Lastname" form. +// For new accounts without a last name "Resident" is added as a last name. +static std::string canonicalize_username(const std::string& name); class LLLoginRefreshHandler : public LLCommandHandler { @@ -302,7 +305,14 @@ void LLPanelLogin::addFavoritesToStartLocation() for (LLSD::map_const_iterator iter = fav_llsd.beginMap(); iter != fav_llsd.endMap(); ++iter) { - if(iter->first != getChild("username_combo")->getSimple()) continue; + std::string user_defined_name = getChild("username_combo")->getSimple(); + + // The account name in stored_favorites.xml has Resident last name even if user has + // a single word account name, so it can be compared case-insensitive with the + // user defined "firstname lastname". + S32 res = LLStringUtil::compareInsensitive(canonicalize_username(user_defined_name), iter->first); + if (res != 0) continue; + combo->addSeparator(); LLSD user_llsd = iter->second; for (LLSD::array_const_iterator iter1 = user_llsd.beginArray(); @@ -1186,3 +1196,28 @@ void LLPanelLogin::onModeChangeConfirm(const LLSD& original_value, const LLSD& n break; } } + +std::string canonicalize_username(const std::string& name) +{ + std::string cname = name; + LLStringUtil::trim(cname); + + // determine if the username is a first/last form or not. + size_t separator_index = cname.find_first_of(" ._"); + std::string first = cname.substr(0, separator_index); + std::string last; + if (separator_index != cname.npos) + { + last = cname.substr(separator_index+1, cname.npos); + LLStringUtil::trim(last); + } + else + { + // ...on Linden grids, single username users as considered to have + // last name "Resident" + last = "Resident"; + } + + // Username in traditional "firstname lastname" form. + return first + ' ' + last; +} -- cgit v1.2.3 From 73cfc64bee057d0f76ab2ca574681dd3fc18e7a8 Mon Sep 17 00:00:00 2001 From: Seth ProductEngine Date: Tue, 12 Apr 2011 02:09:37 +0300 Subject: STORM-1145 ADDITIONAL FIX Fixed removing the record of user favorites available at login location menu when user switches off this feature. User favorite locations record is removed from the settings file each time when user exits the viewer with "ShowFavoritesOnLogin" setting off and his name is found on the record. --- indra/newview/llfloaterpreference.cpp | 36 +---------------------------------- indra/newview/llfloaterpreference.h | 4 ---- indra/newview/llviewerinventory.cpp | 29 ++++++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 39 deletions(-) diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 1a9d0af9af..c72cf13745 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -286,8 +286,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key) mOriginalIMViaEmail(false), mLanguageChanged(false), mAvatarDataInitialized(false), - mDoubleClickActionDirty(false), - mFavoritesRecordMayExist(false) + mDoubleClickActionDirty(false) { //Build Floater is now Called from LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); @@ -565,34 +564,6 @@ void LLFloaterPreference::apply() updateDoubleClickSettings(); mDoubleClickActionDirty = false; } - - if (mFavoritesRecordMayExist && !gSavedPerAccountSettings.getBOOL("ShowFavoritesOnLogin")) - { - removeFavoritesRecordOfUser(); - } -} - -void LLFloaterPreference::removeFavoritesRecordOfUser() -{ - mFavoritesRecordMayExist = false; - std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml"); - LLSD fav_llsd; - llifstream file; - file.open(filename); - if (!file.is_open()) return; - LLSDSerialize::fromXML(fav_llsd, file); - - LLAvatarName av_name; - LLAvatarNameCache::get( gAgentID, &av_name ); - if (fav_llsd.has(av_name.getLegacyName())) - { - fav_llsd.erase(av_name.getLegacyName()); - } - - llofstream out_file; - out_file.open(filename); - LLSDSerialize::toPrettyXML(fav_llsd, out_file); - } void LLFloaterPreference::cancel() @@ -678,11 +649,6 @@ void LLFloaterPreference::onOpen(const LLSD& key) getChildView("maturity_desired_combobox")->setVisible( false); } - if (LLStartUp::getStartupState() == STATE_STARTED) - { - mFavoritesRecordMayExist = gSavedPerAccountSettings.getBOOL("ShowFavoritesOnLogin"); - } - // Forget previous language changes. mLanguageChanged = false; diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index 5d5e066ec5..4d8a2489be 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -159,8 +159,6 @@ public: void buildPopupLists(); static void refreshSkin(void* data); - // Remove record of current user's favorites from file on disk. - void removeFavoritesRecordOfUser(); private: static std::string sSkin; // set true if state of double-click action checkbox or radio-group was changed by user @@ -172,8 +170,6 @@ private: bool mAvatarDataInitialized; bool mOriginalHideOnlineStatus; - // Record of current user's favorites may be stored in file on disk. - bool mFavoritesRecordMayExist; std::string mDirectoryVisibility; LLAvatarData mAvatarProperties; diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 519514d99c..42750f8b3f 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -1450,6 +1450,9 @@ private: void saveFavoritesSLURLs(); + // Remove record of current user's favorites from file on disk. + void removeFavoritesRecordOfUser(); + void onLandmarkLoaded(const LLUUID& asset_id, LLLandmark* landmark); void storeFavoriteSLURL(const LLUUID& asset_id, std::string& slurl); @@ -1534,6 +1537,10 @@ void LLFavoritesOrderStorage::destroyClass() { LLFavoritesOrderStorage::instance().saveFavoritesSLURLs(); } + else + { + LLFavoritesOrderStorage::instance().removeFavoritesRecordOfUser(); + } } void LLFavoritesOrderStorage::load() @@ -1602,6 +1609,28 @@ void LLFavoritesOrderStorage::saveFavoritesSLURLs() LLSDSerialize::toPrettyXML(fav_llsd, file); } +void LLFavoritesOrderStorage::removeFavoritesRecordOfUser() +{ + std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml"); + LLSD fav_llsd; + llifstream file; + file.open(filename); + if (!file.is_open()) return; + LLSDSerialize::fromXML(fav_llsd, file); + + LLAvatarName av_name; + LLAvatarNameCache::get( gAgentID, &av_name ); + if (fav_llsd.has(av_name.getLegacyName())) + { + fav_llsd.erase(av_name.getLegacyName()); + } + + llofstream out_file; + out_file.open(filename); + LLSDSerialize::toPrettyXML(fav_llsd, out_file); + +} + void LLFavoritesOrderStorage::onLandmarkLoaded(const LLUUID& asset_id, LLLandmark* landmark) { if (!landmark) return; -- cgit v1.2.3 From 505e5e403d6439f29d60861553656d01522cb241 Mon Sep 17 00:00:00 2001 From: Merov Linden Date: Tue, 12 Apr 2011 16:06:24 -0700 Subject: EXP-681 : Add MEDIA_EVENT_NAVIGATE_ERROR_PAGE case in LLMediaPluginTest so to pass build on Mac --- indra/test_apps/llplugintest/llmediaplugintest.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/indra/test_apps/llplugintest/llmediaplugintest.cpp b/indra/test_apps/llplugintest/llmediaplugintest.cpp index e9d4d99753..ee65e0aa87 100644 --- a/indra/test_apps/llplugintest/llmediaplugintest.cpp +++ b/indra/test_apps/llplugintest/llmediaplugintest.cpp @@ -2154,6 +2154,10 @@ void LLMediaPluginTest::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent e } break; + case MEDIA_EVENT_NAVIGATE_ERROR_PAGE: + std::cerr << "Media event: MEDIA_EVENT_NAVIGATE_ERROR_PAGE, uri is: " << self->getClickURL() << std::endl; + break; + case MEDIA_EVENT_CLICK_LINK_HREF: { std::cerr << "Media event: MEDIA_EVENT_CLICK_LINK_HREF, uri is " << self->getClickURL() << ", target is " << self->getClickTarget() << std::endl; -- cgit v1.2.3 From c797cf6500a79f361ddfbaec589d64178efafcff Mon Sep 17 00:00:00 2001 From: Paul ProductEngine Date: Wed, 13 Apr 2011 19:50:51 +0300 Subject: STORM-1136 FIXED LLDateUtil class defines March having 21 days, causing wrong avatar age calculation - Applied patch which fixes typo in enum. --- indra/newview/lldateutil.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/lldateutil.cpp b/indra/newview/lldateutil.cpp index fcc73a07bc..18ae6107e7 100644 --- a/indra/newview/lldateutil.cpp +++ b/indra/newview/lldateutil.cpp @@ -32,9 +32,9 @@ #include "llui.h" static S32 DAYS_PER_MONTH_NOLEAP[] = - { 31, 28, 21, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; static S32 DAYS_PER_MONTH_LEAP[] = - { 31, 29, 21, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; static S32 days_from_month(S32 year, S32 month) { -- cgit v1.2.3 From 435117e8121f09bf43c80900fed13856a3a85825 Mon Sep 17 00:00:00 2001 From: Loren Shih Date: Wed, 13 Apr 2011 15:13:10 -0400 Subject: SH-1329 FIXED Physics are "twitchy" for high-FPS machines Fixed bug that was messing up time slices for physics. --- indra/newview/llphysicsmotion.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 67bb139a5e..4f6b155fa0 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -451,7 +451,14 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) // const F32 time_delta = time - mLastTime; - if (time_delta > 3.0 || time_delta <= 0.01) + + // Don't update too frequently, to avoid precision errors from small time slices. + if (time_delta <= .01) + { + return FALSE; + } + + if (time_delta > 3.0) { mLastTime = time; return FALSE; -- cgit v1.2.3 From cf5b96bdededdac0dd00e88ce045ab6f32878869 Mon Sep 17 00:00:00 2001 From: Loren Shih Date: Wed, 13 Apr 2011 15:21:16 -0400 Subject: SH-1365 FIXED Avatar Physics don't behave well for less than 100% max effect This change looks more complicated than it actually is. I basically turned max effect into a scaling parameter, versus a clamping parameter. Piece of cake, just moved some code around and made minor logic changes. --- indra/newview/llphysicsmotion.cpp | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 4f6b155fa0..de4ce52351 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -127,7 +127,8 @@ protected: return mCharacter->getVisualParamWeight(param_name.c_str()); } void setParamValue(LLViewerVisualParam *param, - const F32 new_value_local); + const F32 new_value_local, + F32 behavior_maxeffect); F32 toLocal(const LLVector3 &world); F32 calculateVelocity_local(const F32 time_delta); @@ -485,9 +486,6 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) F32 behavior_maxeffect = getParamValue("MaxEffect"); if (physics_test) behavior_maxeffect = 1.0f; - // Maximum effect is [0,1] range. - const F32 min_val = 0.5f-behavior_maxeffect/2.0; - const F32 max_val = 0.5f+behavior_maxeffect/2.0; // mPositon_local should be in normalized 0,1 range already. Just making sure... F32 position_current_local = llclamp(mPosition_local, @@ -585,12 +583,12 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) position_new_local = position_user_local; // Zero out the velocity if the param is being pushed beyond its limits. - if ((position_new_local < min_val && velocity_new_local < 0) || - (position_new_local > max_val && velocity_new_local > 0)) + if ((position_new_local < 0 && velocity_new_local < 0) || + (position_new_local > 1 && velocity_new_local > 0)) { velocity_new_local = 0; } - + // Check for NaN values. A NaN value is detected if the variables doesn't equal itself. // If NaN, then reset everything. if ((mPosition_local != mPosition_local) || @@ -608,8 +606,8 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) } const F32 position_new_local_clamped = llclamp(position_new_local, - min_val, - max_val); + 0.0f, + 1.0f); LLDriverParam *driver_param = dynamic_cast(mParamDriver); llassert_always(driver_param); @@ -630,7 +628,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) { LLDrivenEntry &entry = (*iter); LLViewerVisualParam *driven_param = entry.mParam; - setParamValue(driven_param,position_new_local_clamped); + setParamValue(driven_param,position_new_local_clamped, behavior_maxeffect); } } @@ -712,12 +710,19 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) // Range of new_value_local is assumed to be [0 , 1] normalized. void LLPhysicsMotion::setParamValue(LLViewerVisualParam *param, - F32 new_value_normalized) + F32 new_value_normalized, + F32 behavior_maxeffect) { const F32 value_min_local = param->getMinWeight(); const F32 value_max_local = param->getMaxWeight(); + const F32 min_val = 0.5f-behavior_maxeffect/2.0; + const F32 max_val = 0.5f+behavior_maxeffect/2.0; - const F32 new_value_local = value_min_local + (value_max_local-value_min_local) * new_value_normalized; + // Scale from [0,1] to [min_val,max_val] + const F32 new_value_rescaled = min_val + (max_val-min_val) * new_value_normalized; + + // Scale from [0,1] to [value_min_local,value_max_local] + const F32 new_value_local = value_min_local + (value_max_local-value_min_local) * new_value_rescaled; mCharacter->setVisualParamWeight(param, new_value_local, -- cgit v1.2.3 From 172bca783f94489fbf3ec68dfdc5f7851910b337 Mon Sep 17 00:00:00 2001 From: Loren Shih Date: Wed, 13 Apr 2011 15:23:11 -0400 Subject: SH-1364 FIXED Avatar Physics are not updating smoothly even for high-performance machines. "high" graphics settings now give 100% updates, versus 90%. Changed a simple constant that was acting as a threshold for when physics should be updated (the constant was set way too high, meaning that updates were being skipped). --- indra/newview/featuretable.txt | 2 +- indra/newview/llphysicsmotion.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt index 15ad330418..af2d951bf7 100644 --- a/indra/newview/featuretable.txt +++ b/indra/newview/featuretable.txt @@ -132,7 +132,7 @@ list High RenderAnisotropic 1 1 RenderAvatarCloth 1 0 RenderAvatarLODFactor 1 1.0 -RenderAvatarPhysicsLODFactor 1 0.9 +RenderAvatarPhysicsLODFactor 1 1.0 RenderAvatarVP 1 1 RenderFarClip 1 128 RenderFlexTimeFactor 1 1.0 diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index de4ce52351..09c9e75f2a 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -656,7 +656,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) if ((pixel_area > area_for_this_setting) || is_self) { const F32 position_diff_local = llabs(mPositionLastUpdate_local-position_new_local_clamped); - const F32 min_delta = (1.01f-lod_factor)*0.4f; + const F32 min_delta = (1.0001f-lod_factor)*0.4f; if (llabs(position_diff_local) > min_delta) { update_visuals = TRUE; -- cgit v1.2.3 From 759d72a46c5d487e6881426f90c54c6ae2da4847 Mon Sep 17 00:00:00 2001 From: Merov Linden Date: Wed, 13 Apr 2011 14:05:31 -0700 Subject: EXP-669 : Refactor code to use correct LLImageFormatted methods to load images of all formats, reviewed by richard --- .../llimage_libtest/llimage_libtest.cpp | 27 +---- indra/llimage/llimage.cpp | 23 +--- indra/newview/llfloaterimagepreview.cpp | 119 +++++---------------- indra/newview/llviewermenufile.cpp | 55 +--------- indra/newview/llviewertexturelist.cpp | 110 +++++-------------- 5 files changed, 59 insertions(+), 275 deletions(-) diff --git a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp index 365f5f758c..03a79532c8 100644 --- a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp +++ b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp @@ -69,31 +69,8 @@ static bool sAllDone = false; // Create an empty formatted image instance of the correct type from the filename LLPointer create_image(const std::string &filename) { - std::string exten = gDirUtilp->getExtension(filename); - U32 codec = LLImageBase::getCodecFromExtension(exten); - - LLPointer image; - switch (codec) - { - case IMG_CODEC_BMP: - image = new LLImageBMP(); - break; - case IMG_CODEC_TGA: - image = new LLImageTGA(); - break; - case IMG_CODEC_JPEG: - image = new LLImageJPEG(); - break; - case IMG_CODEC_J2C: - image = new LLImageJ2C(); - break; - case IMG_CODEC_PNG: - image = new LLImagePNG(); - break; - default: - return NULL; - } - + std::string exten = gDirUtilp->getExtension(filename); + LLPointer image = LLImageFormatted::createFromExtension(exten); return image; } diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp index 39211bf7fa..f0d15d9607 100644 --- a/indra/llimage/llimage.cpp +++ b/indra/llimage/llimage.cpp @@ -1254,28 +1254,7 @@ bool LLImageRaw::createFromFile(const std::string &filename, bool j2c_lowest_mip return false; } - LLPointer image; - switch(codec) - { - //case IMG_CODEC_RGB: - case IMG_CODEC_BMP: - image = new LLImageBMP(); - break; - case IMG_CODEC_TGA: - image = new LLImageTGA(); - break; - case IMG_CODEC_JPEG: - image = new LLImageJPEG(); - break; - case IMG_CODEC_J2C: - image = new LLImageJ2C(); - break; - case IMG_CODEC_DXT: - image = new LLImageDXT(); - break; - default: - return false; - } + LLPointer image = LLImageFormatted::createFromType(codec); llassert(image.notNull()); U8 *buffer = image->allocateData(length); diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp index c7fbdd5745..d76e7885bc 100644 --- a/indra/newview/llfloaterimagepreview.cpp +++ b/indra/newview/llfloaterimagepreview.cpp @@ -325,122 +325,51 @@ void LLFloaterImagePreview::draw() bool LLFloaterImagePreview::loadImage(const std::string& src_filename) { std::string exten = gDirUtilp->getExtension(src_filename); - - U32 codec = IMG_CODEC_INVALID; - std::string temp_str; - if( exten == "bmp") - { - codec = IMG_CODEC_BMP; - } - else if( exten == "tga") - { - codec = IMG_CODEC_TGA; - } - else if( exten == "jpg" || exten == "jpeg") - { - codec = IMG_CODEC_JPEG; - } - else if( exten == "png" ) - { - codec = IMG_CODEC_PNG; - } + U32 codec = LLImageBase::getCodecFromExtension(exten); LLImageDimensionsInfo image_info; - if(!image_info.load(src_filename,codec)) + if (!image_info.load(src_filename,codec)) { mImageLoadError = image_info.getLastError(); return false; } S32 max_width = gSavedSettings.getS32("max_texture_dimension_X"); - S32 max_heigh = gSavedSettings.getS32("max_texture_dimension_Y"); + S32 max_height = gSavedSettings.getS32("max_texture_dimension_Y"); - if(image_info.getWidth() > max_width|| image_info.getHeight() > max_heigh) + if ((image_info.getWidth() > max_width) || (image_info.getHeight() > max_height)) { LLStringUtil::format_map_t args; args["WIDTH"] = llformat("%d", max_width); - args["HEIGHT"] = llformat("%d", max_heigh); + args["HEIGHT"] = llformat("%d", max_height); mImageLoadError = LLTrans::getString("texture_load_dimensions_error", args); return false; } - + // Load the image + LLPointer image = LLImageFormatted::createFromType(codec); + if (image.isNull()) + { + return false; + } + if (!image->load(src_filename)) + { + return false; + } + // Decompress or expand it in a raw image structure LLPointer raw_image = new LLImageRaw; - - switch (codec) + if (!image->decode(raw_image, 0.0f)) { - case IMG_CODEC_BMP: - { - LLPointer bmp_image = new LLImageBMP; - - if (!bmp_image->load(src_filename)) - { - return false; - } - - if (!bmp_image->decode(raw_image, 0.0f)) - { - return false; - } - } - break; - case IMG_CODEC_TGA: - { - LLPointer tga_image = new LLImageTGA; - - if (!tga_image->load(src_filename)) - { - return false; - } - - if (!tga_image->decode(raw_image)) - { - return false; - } - - if( (tga_image->getComponents() != 3) && - (tga_image->getComponents() != 4) ) - { - tga_image->setLastError( "Image files with less than 3 or more than 4 components are not supported." ); - return false; - } - } - break; - case IMG_CODEC_JPEG: - { - LLPointer jpeg_image = new LLImageJPEG; - - if (!jpeg_image->load(src_filename)) - { - return false; - } - - if (!jpeg_image->decode(raw_image, 0.0f)) - { - return false; - } - } - break; - case IMG_CODEC_PNG: - { - LLPointer png_image = new LLImagePNG; - - if (!png_image->load(src_filename)) - { - return false; - } - - if (!png_image->decode(raw_image, 0.0f)) - { - return false; - } - } - break; - default: return false; } - + // Check the image constraints + if ((image->getComponents() != 3) && (image->getComponents() != 4)) + { + image->setLastError("Image files with less than 3 or more than 4 components are not supported."); + return false; + } + raw_image->biasedScaleToPowerOfTwo(1024); mRawImagep = raw_image; diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index fda291f3c1..2cf8dbec89 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -493,6 +493,7 @@ void upload_new_resource(const std::string& src_filename, std::string name, LLSD args; std::string exten = gDirUtilp->getExtension(src_filename); + U32 codec = LLImageBase::getCodecFromExtension(exten); LLAssetType::EType asset_type = LLAssetType::AT_NONE; std::string error_message; @@ -510,66 +511,20 @@ void upload_new_resource(const std::string& src_filename, std::string name, upload_error(error_message, "NoFileExtension", filename, args); return; } - else if( exten == "bmp") + else if (codec != IMG_CODEC_INVALID) { + // It's an image file, the upload procedure is the same for all asset_type = LLAssetType::AT_TEXTURE; - if (!LLViewerTextureList::createUploadFile(src_filename, - filename, - IMG_CODEC_BMP )) + if (!LLViewerTextureList::createUploadFile(src_filename, filename, codec )) { error_message = llformat( "Problem with file %s:\n\n%s\n", - src_filename.c_str(), LLImage::getLastError().c_str()); + src_filename.c_str(), LLImage::getLastError().c_str()); args["FILE"] = src_filename; args["ERROR"] = LLImage::getLastError(); upload_error(error_message, "ProblemWithFile", filename, args); return; } } - else if( exten == "tga") - { - asset_type = LLAssetType::AT_TEXTURE; - if (!LLViewerTextureList::createUploadFile(src_filename, - filename, - IMG_CODEC_TGA )) - { - error_message = llformat("Problem with file %s:\n\n%s\n", - src_filename.c_str(), LLImage::getLastError().c_str()); - args["FILE"] = src_filename; - args["ERROR"] = LLImage::getLastError(); - upload_error(error_message, "ProblemWithFile", filename, args); - return; - } - } - else if( exten == "jpg" || exten == "jpeg") - { - asset_type = LLAssetType::AT_TEXTURE; - if (!LLViewerTextureList::createUploadFile(src_filename, - filename, - IMG_CODEC_JPEG )) - { - error_message = llformat("Problem with file %s:\n\n%s\n", - src_filename.c_str(), LLImage::getLastError().c_str()); - args["FILE"] = src_filename; - args["ERROR"] = LLImage::getLastError(); - upload_error(error_message, "ProblemWithFile", filename, args); - return; - } - } - else if( exten == "png") - { - asset_type = LLAssetType::AT_TEXTURE; - if (!LLViewerTextureList::createUploadFile(src_filename, - filename, - IMG_CODEC_PNG )) - { - error_message = llformat("Problem with file %s:\n\n%s\n", - src_filename.c_str(), LLImage::getLastError().c_str()); - args["FILE"] = src_filename; - args["ERROR"] = LLImage::getLastError(); - upload_error(error_message, "ProblemWithFile", filename, args); - return; - } - } else if(exten == "wav") { asset_type = LLAssetType::AT_SOUND; // tag it as audio diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 06f6ff23c2..5afed721ac 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -927,99 +927,43 @@ void LLViewerTextureList::decodeAllImages(F32 max_time) BOOL LLViewerTextureList::createUploadFile(const std::string& filename, const std::string& out_filename, const U8 codec) -{ - // First, load the image. +{ + // Load the image + LLPointer image = LLImageFormatted::createFromType(codec); + if (image.isNull()) + { + return FALSE; + } + if (!image->load(filename)) + { + return FALSE; + } + // Decompress or expand it in a raw image structure LLPointer raw_image = new LLImageRaw; - - switch (codec) + if (!image->decode(raw_image, 0.0f)) { - case IMG_CODEC_BMP: - { - LLPointer bmp_image = new LLImageBMP; - - if (!bmp_image->load(filename)) - { - return FALSE; - } - - if (!bmp_image->decode(raw_image, 0.0f)) - { - return FALSE; - } - } - break; - case IMG_CODEC_TGA: - { - LLPointer tga_image = new LLImageTGA; - - if (!tga_image->load(filename)) - { - return FALSE; - } - - if (!tga_image->decode(raw_image)) - { - return FALSE; - } - - if( (tga_image->getComponents() != 3) && - (tga_image->getComponents() != 4) ) - { - tga_image->setLastError( "Image files with less than 3 or more than 4 components are not supported." ); - return FALSE; - } - } - break; - case IMG_CODEC_JPEG: - { - LLPointer jpeg_image = new LLImageJPEG; - - if (!jpeg_image->load(filename)) - { - return FALSE; - } - - if (!jpeg_image->decode(raw_image, 0.0f)) - { - return FALSE; - } - } - break; - case IMG_CODEC_PNG: - { - LLPointer png_image = new LLImagePNG; - - if (!png_image->load(filename)) - { - return FALSE; - } - - if (!png_image->decode(raw_image, 0.0f)) - { - return FALSE; - } - } - break; - default: - return FALSE; + return FALSE; } - - LLPointer compressedImage = convertToUploadFile(raw_image); - - if( !compressedImage->save(out_filename) ) + // Check the image constraints + if ((image->getComponents() != 3) && (image->getComponents() != 4)) { - llinfos << "Couldn't create output file " << out_filename << llendl; + image->setLastError("Image files with less than 3 or more than 4 components are not supported."); return FALSE; } - - // test to see if the encode and save worked. + // Convert to j2c (JPEG2000) and save the file locally + LLPointer compressedImage = convertToUploadFile(raw_image); + if (!compressedImage->save(out_filename)) + { + llinfos << "Couldn't create output file : " << out_filename << llendl; + return FALSE; + } + // Test to see if the encode and save worked LLPointer integrity_test = new LLImageJ2C; - if( !integrity_test->loadAndValidate( out_filename ) ) + if (!integrity_test->loadAndValidate( out_filename )) { - llinfos << "Image: " << out_filename << " is corrupt." << llendl; + llinfos << "Image file : " << out_filename << " is corrupt" << llendl; return FALSE; } - return TRUE; } -- cgit v1.2.3 From 7577ec25a066c5bb9b39978e32b8da084b1916d7 Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine Date: Thu, 14 Apr 2011 00:52:40 +0300 Subject: STORM-1095 FIX Chat preferences > font size should increase size of input text in the chat box. Submitting on behalf of Jonathan Yap. --- doc/contributions.txt | 2 ++ indra/newview/llfloaterpreference.cpp | 2 ++ indra/newview/llnearbychatbar.cpp | 14 ++++++++++++++ indra/newview/llnearbychatbar.h | 1 + indra/newview/llviewerchat.cpp | 14 ++++++++++++++ indra/newview/llviewerchat.h | 6 ++++++ 6 files changed, 39 insertions(+) diff --git a/doc/contributions.txt b/doc/contributions.txt index e7db8c0ded..9e189d6c75 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -424,6 +424,7 @@ Jonathan Yap STORM-1094 STORM-1077 STORM-953 + STORM-1095 Kage Pixel VWR-11 Ken March @@ -660,6 +661,7 @@ Robin Cornelius STORM-422 STORM-960 STORM-1019 + STORM-1095 VWR-2488 VWR-9557 VWR-10579 diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 1a9d0af9af..10a8585920 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -412,6 +412,8 @@ BOOL LLFloaterPreference::postBuild() gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&LLNearbyChat::processChatHistoryStyleUpdate, _2)); + gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&LLViewerChat::signalChatFontChanged)); + gSavedSettings.getControl("ChatBubbleOpacity")->getSignal()->connect(boost::bind(&LLFloaterPreference::onNameTagOpacityChange, this, _2)); LLTabContainer* tabcontainer = getChild("pref core"); diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp index 162e465fef..d3fd959152 100644 --- a/indra/newview/llnearbychatbar.cpp +++ b/indra/newview/llnearbychatbar.cpp @@ -47,6 +47,7 @@ #include "llwindow.h" #include "llviewerwindow.h" #include "llrootview.h" +#include "llviewerchat.h" S32 LLNearbyChatBar::sLastSpecialChatChannel = 0; @@ -433,13 +434,26 @@ BOOL LLNearbyChatBar::postBuild() mChatBox->setPassDelete(TRUE); mChatBox->setReplaceNewlinesWithSpaces(FALSE); mChatBox->setEnableLineHistory(TRUE); + mChatBox->setFont(LLViewerChat::getChatFont()); mOutputMonitor = getChild("chat_zone_indicator"); mOutputMonitor->setVisible(FALSE); + // Register for font change notifications + LLViewerChat::setFontChangedCallback(boost::bind(&LLNearbyChatBar::onChatFontChange, this, _1)); + return TRUE; } +void LLNearbyChatBar::onChatFontChange(LLFontGL* fontp) +{ + // Update things with the new font whohoo + if (mChatBox) + { + mChatBox->setFont(fontp); + } +} + //static LLNearbyChatBar* LLNearbyChatBar::getInstance() { diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h index 96ab45071b..efddec942f 100644 --- a/indra/newview/llnearbychatbar.h +++ b/indra/newview/llnearbychatbar.h @@ -127,6 +127,7 @@ protected: void sendChat( EChatType type ); void onChatBoxCommit(); + void onChatFontChange(LLFontGL* fontp); static LLWString stripChannelNumber(const LLWString &mesg, S32* channel); EChatType processChatTypeTriggers(EChatType type, std::string &str); diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp index 286b16bab2..f5484ff010 100644 --- a/indra/newview/llviewerchat.cpp +++ b/indra/newview/llviewerchat.cpp @@ -36,6 +36,7 @@ #include "llinstantmessage.h" //SYSTEM_FROM // LLViewerChat +LLViewerChat::font_change_signal_t LLViewerChat::sChatFontChangedSignal; //static void LLViewerChat::getChatColor(const LLChat& chat, LLColor4& r_color) @@ -256,3 +257,16 @@ std::string LLViewerChat::getObjectImSLURL(const LLChat& chat, const LLSD& args) return url; } + +//static +boost::signals2::connection LLViewerChat::setFontChangedCallback(const font_change_signal_t::slot_type& cb) +{ + return sChatFontChangedSignal.connect(cb); +} + +//static +void LLViewerChat::signalChatFontChanged() +{ + // Notify all observers that our font has changed + sChatFontChangedSignal(getChatFont()); +} diff --git a/indra/newview/llviewerchat.h b/indra/newview/llviewerchat.h index 0f15d29f04..c05caf0a95 100644 --- a/indra/newview/llviewerchat.h +++ b/indra/newview/llviewerchat.h @@ -35,6 +35,8 @@ class LLViewerChat { public: + typedef boost::signals2::signal font_change_signal_t; + static void getChatColor(const LLChat& chat, LLColor4& r_color); static void getChatColor(const LLChat& chat, std::string& r_color_name, F32& r_color_alpha); static LLFontGL* getChatFont(); @@ -42,8 +44,12 @@ public: static void formatChatMsg(const LLChat& chat, std::string& formated_msg); static std::string getSenderSLURL(const LLChat& chat, const LLSD& args); + static boost::signals2::connection setFontChangedCallback(const font_change_signal_t::slot_type& cb); + static void signalChatFontChanged(); + private: static std::string getObjectImSLURL(const LLChat& chat, const LLSD& args); + static font_change_signal_t sChatFontChangedSignal; }; -- cgit v1.2.3 From 8c5207c55597913b17a30f2a8c47c3e8d72d473e Mon Sep 17 00:00:00 2001 From: Paul ProductEngine Date: Thu, 14 Apr 2011 15:38:07 +0300 Subject: Fixed win build --- indra/newview/llfloaterpreference.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index dd7f637a30..ae902f6b94 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -111,6 +111,7 @@ const F32 MAX_USER_FAR_CLIP = 512.f; const F32 MIN_USER_FAR_CLIP = 64.f; +const F32 BANDWIDTH_UPDATER_TIMEOUT = 0.5f; //control value for middle mouse as talk2push button const static std::string MIDDLE_MOUSE_CV = "MiddleMouse"; @@ -1682,7 +1683,7 @@ BOOL LLPanelPreference::postBuild() //////////////////////PanelSetup /////////////////// if (hasChild("max_bandwidth")) { - mBandWidthUpdater = new LLPanelPreference::Updater(boost::bind(&handleBandwidthChanged, _1), 0.3); + mBandWidthUpdater = new LLPanelPreference::Updater(boost::bind(&handleBandwidthChanged, _1), BANDWIDTH_UPDATER_TIMEOUT); gSavedSettings.getControl("ThrottleBandwidthKBPS")->getSignal()->connect(boost::bind(&LLPanelPreference::Updater::update, mBandWidthUpdater, _2)); } -- cgit v1.2.3 From 8785c7077633e8cfe46f4aea2d861bfa813d79b7 Mon Sep 17 00:00:00 2001 From: Paul ProductEngine Date: Thu, 14 Apr 2011 18:09:49 +0300 Subject: STORM-898 Filter settings do not reset after unchecking 'Since Logoff' checkbox - Corrected logic in inventory filter. Calculation of whether filter is more or less restrictive depending on time parameters was wrong. --- indra/newview/llinventoryfilter.cpp | 10 ++++++++-- indra/newview/llpanelmaininventory.cpp | 22 +--------------------- 2 files changed, 9 insertions(+), 23 deletions(-) diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index e22363c2f6..dee15a1efd 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -510,9 +510,15 @@ void LLInventoryFilter::setHoursAgo(U32 hours) { if (mFilterOps.mHoursAgo != hours) { + bool are_date_limits_valid = mFilterOps.mMinDate == time_min() && mFilterOps.mMaxDate == time_max(); + + bool is_increasing = hours > mFilterOps.mHoursAgo; + bool is_increasing_from_zero = is_increasing && !mFilterOps.mHoursAgo; + // *NOTE: need to cache last filter time, in case filter goes stale - BOOL less_restrictive = (mFilterOps.mMinDate == time_min() && mFilterOps.mMaxDate == time_max() && hours > mFilterOps.mHoursAgo); - BOOL more_restrictive = (mFilterOps.mMinDate == time_min() && mFilterOps.mMaxDate == time_max() && hours <= mFilterOps.mHoursAgo); + BOOL less_restrictive = (are_date_limits_valid && ((is_increasing && mFilterOps.mHoursAgo)) || !hours); + BOOL more_restrictive = (are_date_limits_valid && (!is_increasing && hours) || is_increasing_from_zero); + mFilterOps.mHoursAgo = hours; mFilterOps.mMinDate = time_min(); mFilterOps.mMaxDate = time_max(); diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 0c3f2f3e31..90617b7dc7 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -81,7 +81,6 @@ public: BOOL getCheckSinceLogoff(); static void onTimeAgo(LLUICtrl*, void *); - static void onCheckSinceLogoff(LLUICtrl*, void *); static void onCloseBtn(void* user_data); static void selectAllTypes(void* user_data); static void selectNoTypes(void* user_data); @@ -619,20 +618,6 @@ LLFloaterInventoryFinder::LLFloaterInventoryFinder(LLPanelMainInventory* invento updateElementsFromFilter(); } - -void LLFloaterInventoryFinder::onCheckSinceLogoff(LLUICtrl *ctrl, void *user_data) -{ - LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data; - if (!self) return; - - bool since_logoff= self->getChild("check_since_logoff")->getValue(); - - if (!since_logoff && - !( self->mSpinSinceDays->get() || self->mSpinSinceHours->get() ) ) - { - self->mSpinSinceHours->set(1.0f); - } -} BOOL LLFloaterInventoryFinder::postBuild() { const LLRect& viewrect = mPanelMainInventory->getRect(); @@ -647,9 +632,6 @@ BOOL LLFloaterInventoryFinder::postBuild() mSpinSinceDays = getChild("spin_days_ago"); childSetCommitCallback("spin_days_ago", onTimeAgo, this); - // mCheckSinceLogoff = getChild("check_since_logoff"); - childSetCommitCallback("check_since_logoff", onCheckSinceLogoff, this); - childSetAction("Close", onCloseBtn, this); updateElementsFromFilter(); @@ -660,12 +642,10 @@ void LLFloaterInventoryFinder::onTimeAgo(LLUICtrl *ctrl, void *user_data) LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data; if (!self) return; - bool since_logoff=true; if ( self->mSpinSinceDays->get() || self->mSpinSinceHours->get() ) { - since_logoff = false; + self->getChild("check_since_logoff")->setValue(false); } - self->getChild("check_since_logoff")->setValue(since_logoff); } void LLFloaterInventoryFinder::changeFilter(LLInventoryFilter* filter) -- cgit v1.2.3 From 40077972dd96298e24fa663a3bef78e951c5d20d Mon Sep 17 00:00:00 2001 From: seth_productengine Date: Thu, 14 Apr 2011 18:42:25 +0300 Subject: STORM-1111 FIXED Disabled re-loging the nearby chat history to file upon processing the chat style update. --- indra/newview/llnearbychat.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp index 572eeb8fc7..03ebc344f1 100644 --- a/indra/newview/llnearbychat.cpp +++ b/indra/newview/llnearbychat.cpp @@ -250,9 +250,13 @@ void LLNearbyChat::getAllowedRect(LLRect& rect) void LLNearbyChat::updateChatHistoryStyle() { mChatHistory->clear(); + + LLSD do_not_log; + do_not_log["do_not_log"] = true; for(std::vector::iterator it = mMessageArchive.begin();it!=mMessageArchive.end();++it) { - addMessage(*it,false); + // Update the messages without re-writing them to a log file. + addMessage(*it,false, do_not_log); } } -- cgit v1.2.3 From 89db32944b1767f3d6805b72f75390327df43560 Mon Sep 17 00:00:00 2001 From: Paul ProductEngine Date: Thu, 14 Apr 2011 19:24:39 +0300 Subject: STORM-891 FIXED [HARDCODED] - ALL LANGS - Message showing up after setting your home is in English (French viewer) - Added translation of the hardcoded string to the strings.xml --- indra/newview/llviewermessage.cpp | 6 +++++- indra/newview/skins/default/xui/en/strings.xml | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 9641a0901c..d0fdae1e1b 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -5523,7 +5523,11 @@ void process_alert_core(const std::string& message, BOOL modal) { LLSD args; std::string new_msg =LLNotifications::instance().getGlobalString(message); - args["MESSAGE"] = new_msg; + + std::string localized_msg; + bool is_message_localized = LLTrans::findString(localized_msg, new_msg); + + args["MESSAGE"] = is_message_localized ? localized_msg : new_msg; LLNotificationsUtil::add("SystemMessageTip", args); } } diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 27295150c5..b0ede60fa0 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -3214,6 +3214,8 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. The session initialization is timed out + Home position set. + http://secondlife.com/landing/voicemorphing -- cgit v1.2.3 From 8c7d9bbd064c605b756ebf4752eaefad25ee6f4f Mon Sep 17 00:00:00 2001 From: Merov Linden Date: Thu, 14 Apr 2011 09:28:34 -0700 Subject: EXP-663 : Fix memory leak introduced in precincts handling --- indra/llkdu/llimagej2ckdu.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/indra/llkdu/llimagej2ckdu.cpp b/indra/llkdu/llimagej2ckdu.cpp index 8d2ed8f8c4..5b2c045841 100644 --- a/indra/llkdu/llimagej2ckdu.cpp +++ b/indra/llkdu/llimagej2ckdu.cpp @@ -361,17 +361,23 @@ BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco } int discard = (discard_level != -1 ? discard_level : base.getRawDiscardLevel()); + // Apply loading restrictions mCodeStreamp->apply_input_restrictions( first_channel, max_channel_count, discard, 0, region_kdu); + + // Clean-up + if (region_kdu) + { + delete region_kdu; + region_kdu = NULL; + } + // Resize raw_image according to the image to be decoded kdu_dims dims; mCodeStreamp->get_dims(0,dims); S32 channels = base.getComponents() - first_channel; - if (channels > max_channel_count) - { - channels = max_channel_count; - } + channels = llmin(channels,max_channel_count); raw_image.resize(dims.size.x, dims.size.y, channels); + // llinfos << "Resizing raw_image to " << dims.size.x << ":" << dims.size.y << llendl; - // llinfos << "Resizing to " << dims.size.x << ":" << dims.size.y << llendl; if (!mTileIndicesp) { mTileIndicesp = new kdu_dims; -- cgit v1.2.3 From b85eb8ce332083adcfe2fe704b78f82695d0e512 Mon Sep 17 00:00:00 2001 From: Loren Shih Date: Thu, 14 Apr 2011 14:47:05 -0400 Subject: VWR-25453 FIXED Avatar Physics Spring Needs a Higher Limit Tripled spring limit for all params. Very safe change. --- indra/newview/character/avatar_lad.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index f8460e059d..ec162e3608 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -11916,7 +11916,7 @@ render_pass="bump"> edit_group="physics_breasts_updown" value_default=".1" value_min="0" - value_max="1"> + value_max="3"> edit_group="physics_breasts_inout" value_default=".1" value_min="0" - value_max="1"> + value_max="3"> edit_group="physics_belly_updown" value_default=".1" value_min="0" - value_max="1"> + value_max="3"> edit_group="physics_butt_updown" value_default=".1" value_min="0" - value_max="1"> + value_max="3"> edit_group="physics_butt_leftright" value_default=".1" value_min="0" - value_max="1"> + value_max="3"> edit_group="physics_breasts_leftright" value_default=".1" value_min="0" - value_max="1"> + value_max="3"> Date: Thu, 14 Apr 2011 16:21:49 -0400 Subject: VWR-25445 FIXED breasts... accordions are presented in Edit Physics floater for male avatars Accordions are selectively hidden based on gender. --- indra/newview/llpaneleditwearable.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index cb8fbd66b5..b73d97e4c4 100644 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -1133,7 +1133,7 @@ void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show, BOOL dis LLScrollingPanelList *panel_list = getChild(scrolling_panel); LLAccordionCtrlTab *tab = getChild(accordion_tab); - + if (!panel_list) { llwarns << "could not get scrolling panel list: " << scrolling_panel << llendl; @@ -1145,7 +1145,18 @@ void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show, BOOL dis llwarns << "could not get llaccordionctrltab from UI with name: " << accordion_tab << llendl; continue; } - + + // Don't show female subparts if you're not female, etc. + if (!(gAgentAvatarp->getSex() & subpart_entry->mSex)) + { + tab->setVisible(FALSE); + continue; + } + else + { + tab->setVisible(TRUE); + } + // what edit group do we want to extract params for? const std::string edit_group = subpart_entry->mEditGroup; -- cgit v1.2.3 From a1340acb3ceba0e975b844ef85a0603cb7d8ef37 Mon Sep 17 00:00:00 2001 From: "Debi King (Dessie)" Date: Thu, 14 Apr 2011 16:56:50 -0400 Subject: Updated release-viewer.jira to DRTVWR-46 for v2.6.3 Release --- BuildParams | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BuildParams b/BuildParams index 73ac74e610..6b4bdd0fd3 100644 --- a/BuildParams +++ b/BuildParams @@ -66,7 +66,7 @@ viewer-pre-release.viewer_channel = "Second Life Release" viewer-pre-release.login_channel = "Second Life Release" viewer-pre-release.build_debug_release_separately = true viewer-pre-release.build_viewer_update_version_manager = true -viewer-pre-release.release-viewer.jira = DRTVWR-44 +viewer-pre-release.release-viewer.jira = DRTVWR-46 # ======================================= # brad -- cgit v1.2.3 From d75e8db4d05462c5624bd1295befaf7339478f5a Mon Sep 17 00:00:00 2001 From: Aaron Stone Date: Thu, 14 Apr 2011 16:55:26 -0700 Subject: VWR-25521 Add a Develop menu toggle item for HTTP Inventory. --- indra/newview/skins/default/xui/en/menu_viewer.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 51610c0ae0..a5115b0faa 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -3113,6 +3113,16 @@ function="ToggleControl" parameter="ImagePipelineUseHTTP" /> + + + + -- cgit v1.2.3 From 38a0dbf04f24fc22f504485cdcd1efb274fc9a46 Mon Sep 17 00:00:00 2001 From: Paul ProductEngine Date: Fri, 15 Apr 2011 18:50:03 +0300 Subject: STORM-1039 FIXED Bad iterator access in llavatarnamecache.cpp:564 - Replaced 'while' loop by 'for' - Deleted unnecessary 'cur' iterator --- indra/llmessage/llavatarnamecache.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 767001b633..33e6709983 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -553,12 +553,10 @@ void LLAvatarNameCache::eraseUnrefreshed() if (!sLastExpireCheck || sLastExpireCheck < max_unrefreshed) { sLastExpireCheck = now; - cache_t::iterator it = sCache.begin(); - while (it != sCache.end()) + + for (cache_t::iterator it = sCache.begin(); it != sCache.end(); ++it) { - cache_t::iterator cur = it; - ++it; - const LLAvatarName& av_name = cur->second; + const LLAvatarName& av_name = it->second; if (av_name.mExpires < max_unrefreshed) { const LLUUID& agent_id = it->first; @@ -566,7 +564,7 @@ void LLAvatarNameCache::eraseUnrefreshed() << " user '" << av_name.mUsername << "' " << "expired " << now - av_name.mExpires << " secs ago" << LL_ENDL; - sCache.erase(cur); + sCache.erase(it); } } LL_INFOS("AvNameCache") << sCache.size() << " cached avatar names" << LL_ENDL; -- cgit v1.2.3 From dab937ef5b18547ecdaf0abb7a0e86ba0fa0ad0e Mon Sep 17 00:00:00 2001 From: brad kittenbrink Date: Fri, 15 Apr 2011 16:45:19 -0700 Subject: FIX: STORM-1141. Win7: 2.6.3 Beta1 crashes on startup if locale differs from English. Force LLTextureCache::purgeAllTextures to get called in addition to normal cache purging. --- indra/newview/llappviewer.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index cfb5853cfd..4985524f00 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -3500,10 +3500,10 @@ bool LLAppViewer::initCache() LLAppViewer::getTextureCache()->setReadOnly(read_only) ; LLVOCache::getInstance()->setReadOnly(read_only); - BOOL texture_cache_mismatch = FALSE ; + bool texture_cache_mismatch = false; if (gSavedSettings.getS32("LocalCacheVersion") != LLAppViewer::getTextureCacheVersion()) { - texture_cache_mismatch = TRUE ; + texture_cache_mismatch = true; if(!read_only) { gSavedSettings.setS32("LocalCacheVersion", LLAppViewer::getTextureCacheVersion()); @@ -3517,7 +3517,9 @@ bool LLAppViewer::initCache() gSavedSettings.getBOOL("PurgeCacheOnNextStartup")) { gSavedSettings.setBOOL("PurgeCacheOnNextStartup", false); - mPurgeCache = true; + mPurgeCache = true; + // STORM-1141 force purgeAllTextures to get called to prevent a crash here. -brad + texture_cache_mismatch = true; } // We have moved the location of the cache directory over time. -- cgit v1.2.3 From 6f6cebbf5dc37b36c9875b2620259541f5f60aca Mon Sep 17 00:00:00 2001 From: Merov Linden Date: Fri, 15 Apr 2011 17:53:16 -0700 Subject: EXP-672, EXP-673 : Fix bug in encoding small textures (16x16 and under) --- .../llimage_libtest/llimage_libtest.cpp | 23 ++++++++++++++++------ indra/llkdu/llimagej2ckdu.cpp | 23 +++++++++------------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp index 0151016862..60ddf63b21 100644 --- a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp +++ b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp @@ -70,6 +70,9 @@ static const char USAGE[] = "\n" " be used. Blocks must be smaller than precincts. Like precincts, this option adds\n" " PLT, tile markers and uses RPCL.\n" " Only valid for output j2c images. Default is 64.\n" +" -rev, --reversible\n" +" Set the compression to be lossless (reversible in j2c parlance).\n" +" Only valid for output j2c images.\n" " -log, --logmetrics \n" " Log performance data for . Results in .slp\n" " Note: so far, only ImageCompressionTester has been tested.\n" @@ -144,16 +147,20 @@ LLPointer load_image(const std::string &src_filename, int discard_le } // Save a raw image instance into a file -bool save_image(const std::string &dest_filename, LLPointer raw_image, int blocks_size, int precincts_size, bool output_stats) +bool save_image(const std::string &dest_filename, LLPointer raw_image, int blocks_size, int precincts_size, bool reversible, bool output_stats) { LLPointer image = create_image(dest_filename); // Set the image codestream parameters on output in the case of a j2c image - if ((image->getCodec() == IMG_CODEC_J2C) && ((blocks_size != -1) || (precincts_size != -1))) + if (image->getCodec() == IMG_CODEC_J2C) { // That method doesn't exist (and likely, doesn't make sense) for any other image file format // hence the required cryptic cast. - ((LLImageJ2C*)(image.get()))->initEncode(*raw_image, blocks_size, precincts_size); + if ((blocks_size != -1) || (precincts_size != -1)) + { + ((LLImageJ2C*)(image.get()))->initEncode(*raw_image, blocks_size, precincts_size); + } + ((LLImageJ2C*)(image.get()))->setReversible(reversible); } if (!image->encode(raw_image, 0.0f)) @@ -299,6 +306,7 @@ int main(int argc, char** argv) int discard_level = -1; int precincts_size = -1; int blocks_size = -1; + bool reversible = false; // Init whatever is necessary ll_init_apr(); @@ -415,6 +423,10 @@ int main(int argc, char** argv) // *TODO: make sure blocks_size is a power of 2 } } + else if (!strcmp(argv[arg], "--reversible") || !strcmp(argv[arg], "-rev")) + { + reversible = true; + } else if (!strcmp(argv[arg], "--logmetrics") || !strcmp(argv[arg], "-log")) { // '--logmetrics' needs to be specified with a named test metric argument @@ -474,7 +486,7 @@ int main(int argc, char** argv) std::list::iterator out_file = output_filenames.begin(); std::list::iterator in_end = input_filenames.end(); std::list::iterator out_end = output_filenames.end(); - for (; in_file != in_end; ++in_file) + for (; in_file != in_end; ++in_file, ++out_file) { // Load file LLPointer raw_image = load_image(*in_file, discard_level, region, image_stats); @@ -487,7 +499,7 @@ int main(int argc, char** argv) // Save file if (out_file != out_end) { - if (!save_image(*out_file, raw_image, blocks_size, precincts_size, image_stats)) + if (!save_image(*out_file, raw_image, blocks_size, precincts_size, reversible, image_stats)) { std::cout << "Error: Image " << *out_file << " could not be saved" << std::endl; } @@ -495,7 +507,6 @@ int main(int argc, char** argv) { std::cout << *in_file << " -> " << *out_file << std::endl; } - ++out_file; } } diff --git a/indra/llkdu/llimagej2ckdu.cpp b/indra/llkdu/llimagej2ckdu.cpp index 5b2c045841..ae456a48be 100644 --- a/indra/llkdu/llimagej2ckdu.cpp +++ b/indra/llkdu/llimagej2ckdu.cpp @@ -545,18 +545,10 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co // Construct the `kdu_codestream' object and parse all remaining arguments U32 max_output_size = base.getWidth()*base.getHeight()*base.getComponents(); - if (max_output_size < 1000) - { - max_output_size = 1000; - } + max_output_size = (max_output_size < 1000 ? 1000 : max_output_size); U8 *output_buffer = new U8[max_output_size]; - - U32 output_size = max_output_size; // gets modified - LLKDUMemTarget output(output_buffer, output_size, base.getWidth()*base.getHeight()*base.getComponents()); - if (output_size > max_output_size) - { - llerrs << llformat("LLImageJ2C::encode output_size(%d) > max_output_size(%d)", output_size,max_output_size) << llendl; - } + U32 output_size = 0; // Address updated by LLKDUMemTarget to give the final compressed buffer size + LLKDUMemTarget output(output_buffer, output_size, max_output_size); kdu_codestream codestream; codestream.create(&transformed_siz,&output); @@ -583,10 +575,13 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co if (reversible) { - // If we're doing reversible (i.e. lossless compression), assumes we're not using quality layers. - // Yes, I know this is incorrect! - // *TODO: Indeed, this is incorrect and unecessary... Try using the regular layer setting... codestream.access_siz()->parse_string("Creversible=yes"); + // *TODO: we should use yuv in reversible mode and one level since those images are small. + // Don't turn this on now though as both create problems on decoding for the moment + //codestream.access_siz()->parse_string("Clevels=1"); + //codestream.access_siz()->parse_string("Cycc=no"); + // If we're doing reversible (i.e. lossless compression), assumes we're not using quality layers. + // *TODO: this is incorrect and unecessary. Try using the regular layer setting. codestream.access_siz()->parse_string("Clayers=1"); num_layer_specs = 1; layer_bytes[0] = 0; -- cgit v1.2.3 From 09594214f5eb7c41f69d2db7b735f05fd59140b1 Mon Sep 17 00:00:00 2001 From: Leyla Farazha Date: Fri, 15 Apr 2011 18:11:04 -0700 Subject: EXP-679 As a linden executive, I would like to evaluate the success of basic mode against various metrics --- indra/newview/lllogininstance.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index abcd8588dc..36c5d12897 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -558,6 +558,18 @@ void LLLoginInstance::constructAuthParams(LLPointer user_credentia requested_options.append("buddy-list"); requested_options.append("newuser-config"); requested_options.append("ui-config"); + + //send this info to login.cgi for stats gathering + //since viewerstats isn't reliable enough + if (gSavedSettings.getString("SessionSettingsFile").empty()) + { + requested_options.append("advanced-mode"); + } + else + { + requested_options.append("basic-mode"); + } + #endif requested_options.append("max-agent-groups"); requested_options.append("map-server-url"); -- cgit v1.2.3 From 27285f112ac50cf698f0c9b212b0884867be52f8 Mon Sep 17 00:00:00 2001 From: Siana Gearz Date: Sun, 17 Apr 2011 08:04:02 -0400 Subject: STORM-1088: fix loading of winmm.dll --- doc/contributions.txt | 1 + indra/media_plugins/winmmshim/forwarding_api.cpp | 173 +++++++++++++++++++++++ indra/media_plugins/winmmshim/forwarding_api.h | 1 + indra/media_plugins/winmmshim/winmm_shim.cpp | 17 ++- 4 files changed, 189 insertions(+), 3 deletions(-) diff --git a/doc/contributions.txt b/doc/contributions.txt index 71c54e8624..c92450acd2 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -703,6 +703,7 @@ Shawn Kaufmat SNOW-240 Siana Gearz STORM-960 + STORM-1088 SignpostMarv Martin VWR-153 VWR-154 diff --git a/indra/media_plugins/winmmshim/forwarding_api.cpp b/indra/media_plugins/winmmshim/forwarding_api.cpp index eff7e20451..495e08942b 100644 --- a/indra/media_plugins/winmmshim/forwarding_api.cpp +++ b/indra/media_plugins/winmmshim/forwarding_api.cpp @@ -389,90 +389,105 @@ void init_function_pointers(HMODULE winmm_handle) extern "C" { LRESULT WINAPI CloseDriver( HDRVR hDriver, LPARAM lParam1, LPARAM lParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"CloseDriver\n"); return CloseDriver_orig( hDriver, lParam1, lParam2); } HDRVR WINAPI OpenDriver( LPCWSTR szDriverName, LPCWSTR szSectionName, LPARAM lParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"OpenDriver\n"); return OpenDriver_orig( szDriverName, szSectionName, lParam2); } LRESULT WINAPI SendDriverMessage( HDRVR hDriver, UINT message, LPARAM lParam1, LPARAM lParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"SendDriverMessage\n"); return SendDriverMessage_orig( hDriver, message, lParam1, lParam2); } HMODULE WINAPI DrvGetModuleHandle( HDRVR hDriver) { + ll_winmm_shim_initialize(); //OutputDebugString(L"DrvGetModuleHandle\n"); return DrvGetModuleHandle_orig( hDriver); } HMODULE WINAPI GetDriverModuleHandle( HDRVR hDriver) { + ll_winmm_shim_initialize(); //OutputDebugString(L"GetDriverModuleHandle\n"); return GetDriverModuleHandle_orig( hDriver); } LRESULT WINAPI DefDriverProc( DWORD_PTR dwDriverIdentifier, HDRVR hdrvr, UINT uMsg, LPARAM lParam1, LPARAM lParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"DefDriverProc\n"); return DefDriverProc_orig( dwDriverIdentifier, hdrvr, uMsg, lParam1, lParam2); } BOOL WINAPI DriverCallback( DWORD dwCallBack, DWORD dwFlags, HDRVR hdrvr, DWORD msg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"DriverCallback\n"); return DriverCallback_orig(dwCallBack, dwFlags, hdrvr, msg, dwUser, dwParam1, dwParam2); } UINT WINAPI mmsystemGetVersion(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmsystemGetVersion\n"); return mmsystemGetVersion_orig(); } BOOL WINAPI sndPlaySoundA( LPCSTR pszSound, UINT fuSound) { + ll_winmm_shim_initialize(); //OutputDebugString(L"sndPlaySoundA\n"); return sndPlaySoundA_orig( pszSound, fuSound); } BOOL WINAPI sndPlaySoundW( LPCWSTR pszSound, UINT fuSound) { + ll_winmm_shim_initialize(); //OutputDebugString(L"sndPlaySoundW\n"); return sndPlaySoundW_orig( pszSound, fuSound); } BOOL WINAPI PlaySoundA( LPCSTR pszSound, HMODULE hmod, DWORD fdwSound) { + ll_winmm_shim_initialize(); //OutputDebugString(L"PlaySoundA\n"); return PlaySoundA_orig( pszSound, hmod, fdwSound); } BOOL WINAPI PlaySoundW( LPCWSTR pszSound, HMODULE hmod, DWORD fdwSound) { + ll_winmm_shim_initialize(); //OutputDebugString(L"PlaySoundW\n"); return PlaySoundW_orig( pszSound, hmod, fdwSound); } UINT WINAPI waveOutGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetNumDevs\n"); return waveOutGetNumDevs_orig(); } MMRESULT WINAPI waveOutGetDevCapsA( UINT_PTR uDeviceID, LPWAVEOUTCAPSA pwoc, UINT cbwoc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetDevCapsA\n"); return waveOutGetDevCapsA_orig( uDeviceID, pwoc, cbwoc); } MMRESULT WINAPI waveOutGetDevCapsW( UINT_PTR uDeviceID, LPWAVEOUTCAPSW pwoc, UINT cbwoc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetDevCapsW\n"); return waveOutGetDevCapsW_orig( uDeviceID, pwoc, cbwoc); } @@ -480,24 +495,28 @@ extern "C" { MMRESULT WINAPI waveOutGetVolume( HWAVEOUT hwo, LPDWORD pdwVolume) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetVolume\n"); return waveOutGetVolume_orig( hwo, pdwVolume); } MMRESULT WINAPI waveOutSetVolume( HWAVEOUT hwo, DWORD dwVolume) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutSetVolume\n"); return waveOutSetVolume_orig( hwo, dwVolume); } MMRESULT WINAPI waveOutGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetErrorTextA\n"); return waveOutGetErrorTextA_orig( mmrError, pszText, cchText); } MMRESULT WINAPI waveOutGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetErrorTextW\n"); return waveOutGetErrorTextW_orig( mmrError, pszText, cchText); } @@ -516,12 +535,14 @@ extern "C" { MMRESULT WINAPI waveOutPrepareHeader( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutPrepareHeader\n"); return waveOutPrepareHeader_orig( hwo, pwh, cbwh); } MMRESULT WINAPI waveOutUnprepareHeader( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutUnprepareHeader\n"); return waveOutUnprepareHeader_orig( hwo, pwh, cbwh); } @@ -535,834 +556,973 @@ extern "C" { MMRESULT WINAPI waveOutPause( HWAVEOUT hwo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutPause\n"); return waveOutPause_orig( hwo); } MMRESULT WINAPI waveOutRestart( HWAVEOUT hwo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutRestart\n"); return waveOutRestart_orig( hwo); } MMRESULT WINAPI waveOutReset( HWAVEOUT hwo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutReset\n"); return waveOutReset_orig( hwo); } MMRESULT WINAPI waveOutBreakLoop( HWAVEOUT hwo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutBreakLoop\n"); return waveOutBreakLoop_orig( hwo); } MMRESULT WINAPI waveOutGetPosition( HWAVEOUT hwo, LPMMTIME pmmt, UINT cbmmt) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetPosition\n"); return waveOutGetPosition_orig( hwo, pmmt, cbmmt); } MMRESULT WINAPI waveOutGetPitch( HWAVEOUT hwo, LPDWORD pdwPitch) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetPitch\n"); return waveOutGetPitch_orig( hwo, pdwPitch); } MMRESULT WINAPI waveOutSetPitch( HWAVEOUT hwo, DWORD dwPitch) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutSetPitch\n"); return waveOutSetPitch_orig( hwo, dwPitch); } MMRESULT WINAPI waveOutGetPlaybackRate( HWAVEOUT hwo, LPDWORD pdwRate) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetPlaybackRate\n"); return waveOutGetPlaybackRate_orig( hwo, pdwRate); } MMRESULT WINAPI waveOutSetPlaybackRate( HWAVEOUT hwo, DWORD dwRate) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutSetPlaybackRate\n"); return waveOutSetPlaybackRate_orig( hwo, dwRate); } MMRESULT WINAPI waveOutGetID( HWAVEOUT hwo, LPUINT puDeviceID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetID\n"); return waveOutGetID_orig( hwo, puDeviceID); } MMRESULT WINAPI waveOutMessage( HWAVEOUT hwo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutMessage\n"); return waveOutMessage_orig( hwo, uMsg, dw1, dw2); } UINT WINAPI waveInGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetNumDevs\n"); return waveInGetNumDevs_orig(); } MMRESULT WINAPI waveInGetDevCapsA( UINT_PTR uDeviceID, LPWAVEINCAPSA pwic, UINT cbwic) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetDevCapsA\n"); return waveInGetDevCapsA_orig( uDeviceID, pwic, cbwic); } MMRESULT WINAPI waveInGetDevCapsW( UINT_PTR uDeviceID, LPWAVEINCAPSW pwic, UINT cbwic) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetDevCapsW\n"); return waveInGetDevCapsW_orig( uDeviceID, pwic, cbwic); } MMRESULT WINAPI waveInGetErrorTextA(MMRESULT mmrError, LPSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetErrorTextA\n"); return waveInGetErrorTextA_orig(mmrError, pszText, cchText); } MMRESULT WINAPI waveInGetErrorTextW(MMRESULT mmrError, LPWSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetErrorTextW\n"); return waveInGetErrorTextW_orig(mmrError, pszText, cchText); } MMRESULT WINAPI waveInOpen( LPHWAVEIN phwi, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInOpen\n"); return waveInOpen_orig(phwi, uDeviceID, pwfx, dwCallback, dwInstance, fdwOpen); } MMRESULT WINAPI waveInClose( HWAVEIN hwi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInClose\n"); return waveInClose_orig( hwi); } MMRESULT WINAPI waveInPrepareHeader( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInPrepareHeader\n"); return waveInPrepareHeader_orig( hwi, pwh, cbwh); } MMRESULT WINAPI waveInUnprepareHeader( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInUnprepareHeader\n"); return waveInUnprepareHeader_orig( hwi, pwh, cbwh); } MMRESULT WINAPI waveInAddBuffer( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInAddBuffer\n"); return waveInAddBuffer_orig( hwi, pwh, cbwh); } MMRESULT WINAPI waveInStart( HWAVEIN hwi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInStart\n"); return waveInStart_orig( hwi); } MMRESULT WINAPI waveInStop( HWAVEIN hwi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInStop\n"); return waveInStop_orig(hwi); } MMRESULT WINAPI waveInReset( HWAVEIN hwi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInReset\n"); return waveInReset_orig(hwi); } MMRESULT WINAPI waveInGetPosition( HWAVEIN hwi, LPMMTIME pmmt, UINT cbmmt) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetPosition\n"); return waveInGetPosition_orig( hwi, pmmt, cbmmt); } MMRESULT WINAPI waveInGetID( HWAVEIN hwi, LPUINT puDeviceID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetID\n"); return waveInGetID_orig( hwi, puDeviceID); } MMRESULT WINAPI waveInMessage( HWAVEIN hwi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInMessage\n"); return waveInMessage_orig( hwi, uMsg, dw1, dw2); } UINT WINAPI midiOutGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetNumDevs\n"); return midiOutGetNumDevs_orig(); } MMRESULT WINAPI midiStreamOpen( LPHMIDISTRM phms, LPUINT puDeviceID, DWORD cMidi, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamOpen\n"); return midiStreamOpen_orig( phms, puDeviceID, cMidi, dwCallback, dwInstance, fdwOpen); } MMRESULT WINAPI midiStreamClose( HMIDISTRM hms) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamClose\n"); return midiStreamClose_orig( hms); } MMRESULT WINAPI midiStreamProperty( HMIDISTRM hms, LPBYTE lppropdata, DWORD dwProperty) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamProperty\n"); return midiStreamProperty_orig( hms, lppropdata, dwProperty); } MMRESULT WINAPI midiStreamPosition( HMIDISTRM hms, LPMMTIME lpmmt, UINT cbmmt) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamPosition\n"); return midiStreamPosition_orig( hms, lpmmt, cbmmt); } MMRESULT WINAPI midiStreamOut( HMIDISTRM hms, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamOut\n"); return midiStreamOut_orig( hms, pmh, cbmh); } MMRESULT WINAPI midiStreamPause( HMIDISTRM hms) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamPause\n"); return midiStreamPause_orig( hms); } MMRESULT WINAPI midiStreamRestart( HMIDISTRM hms) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamRestart\n"); return midiStreamRestart_orig( hms); } MMRESULT WINAPI midiStreamStop( HMIDISTRM hms) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamStop\n"); return midiStreamStop_orig( hms); } MMRESULT WINAPI midiConnect( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiConnect\n"); return midiConnect_orig( hmi, hmo, pReserved); } MMRESULT WINAPI midiDisconnect( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiDisconnect\n"); return midiDisconnect_orig( hmi, hmo, pReserved); } MMRESULT WINAPI midiOutGetDevCapsA( UINT_PTR uDeviceID, LPMIDIOUTCAPSA pmoc, UINT cbmoc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetDevCapsA\n"); return midiOutGetDevCapsA_orig( uDeviceID, pmoc, cbmoc); } MMRESULT WINAPI midiOutGetDevCapsW( UINT_PTR uDeviceID, LPMIDIOUTCAPSW pmoc, UINT cbmoc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetDevCapsW\n"); return midiOutGetDevCapsW_orig( uDeviceID, pmoc, cbmoc); } MMRESULT WINAPI midiOutGetVolume( HMIDIOUT hmo, LPDWORD pdwVolume) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetVolume\n"); return midiOutGetVolume_orig( hmo, pdwVolume); } MMRESULT WINAPI midiOutSetVolume( HMIDIOUT hmo, DWORD dwVolume) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutSetVolume\n"); return midiOutSetVolume_orig( hmo, dwVolume); } MMRESULT WINAPI midiOutGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetErrorTextA\n"); return midiOutGetErrorTextA_orig( mmrError, pszText, cchText); } MMRESULT WINAPI midiOutGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetErrorTextW\n"); return midiOutGetErrorTextW_orig( mmrError, pszText, cchText); } MMRESULT WINAPI midiOutOpen( LPHMIDIOUT phmo, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutOpen\n"); return midiOutOpen_orig(phmo, uDeviceID, dwCallback, dwInstance, fdwOpen); } MMRESULT WINAPI midiOutClose( HMIDIOUT hmo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutClose\n"); return midiOutClose_orig( hmo); } MMRESULT WINAPI midiOutPrepareHeader( HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutPrepareHeader\n"); return midiOutPrepareHeader_orig( hmo, pmh, cbmh); } MMRESULT WINAPI midiOutUnprepareHeader(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutUnprepareHeader\n"); return midiOutUnprepareHeader_orig(hmo, pmh, cbmh); } MMRESULT WINAPI midiOutShortMsg( HMIDIOUT hmo, DWORD dwMsg) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutShortMsg\n"); return midiOutShortMsg_orig( hmo, dwMsg); } MMRESULT WINAPI midiOutLongMsg(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutLongMsg\n"); return midiOutLongMsg_orig(hmo, pmh, cbmh); } MMRESULT WINAPI midiOutReset( HMIDIOUT hmo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutReset\n"); return midiOutReset_orig( hmo); } MMRESULT WINAPI midiOutCachePatches( HMIDIOUT hmo, UINT uBank, LPWORD pwpa, UINT fuCache) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutCachePatches\n"); return midiOutCachePatches_orig( hmo, uBank, pwpa, fuCache); } MMRESULT WINAPI midiOutCacheDrumPatches( HMIDIOUT hmo, UINT uPatch, LPWORD pwkya, UINT fuCache) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutCacheDrumPatches\n"); return midiOutCacheDrumPatches_orig( hmo, uPatch, pwkya, fuCache); } MMRESULT WINAPI midiOutGetID( HMIDIOUT hmo, LPUINT puDeviceID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetID\n"); return midiOutGetID_orig( hmo, puDeviceID); } MMRESULT WINAPI midiOutMessage( HMIDIOUT hmo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutMessage\n"); return midiOutMessage_orig( hmo, uMsg, dw1, dw2); } UINT WINAPI midiInGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInGetNumDevs\n"); return midiInGetNumDevs_orig(); } MMRESULT WINAPI midiInGetDevCapsA( UINT_PTR uDeviceID, LPMIDIINCAPSA pmic, UINT cbmic) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInGetDevCapsA\n"); return midiInGetDevCapsA_orig( uDeviceID, pmic, cbmic); } MMRESULT WINAPI midiInGetDevCapsW( UINT_PTR uDeviceID, LPMIDIINCAPSW pmic, UINT cbmic) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInGetDevCapsW\n"); return midiInGetDevCapsW_orig( uDeviceID, pmic, cbmic); } MMRESULT WINAPI midiInGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInGetErrorTextA\n"); return midiInGetErrorTextA_orig( mmrError, pszText, cchText); } MMRESULT WINAPI midiInGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInGetErrorTextW\n"); return midiInGetErrorTextW_orig( mmrError, pszText, cchText); } MMRESULT WINAPI midiInOpen( LPHMIDIIN phmi, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInOpen\n"); return midiInOpen_orig(phmi, uDeviceID, dwCallback, dwInstance, fdwOpen); } MMRESULT WINAPI midiInClose( HMIDIIN hmi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInClose\n"); return midiInClose_orig( hmi); } MMRESULT WINAPI midiInPrepareHeader( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInPrepareHeader\n"); return midiInPrepareHeader_orig( hmi, pmh, cbmh); } MMRESULT WINAPI midiInUnprepareHeader( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInUnprepareHeader\n"); return midiInUnprepareHeader_orig( hmi, pmh, cbmh); } MMRESULT WINAPI midiInAddBuffer( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInAddBuffer\n"); return midiInAddBuffer_orig( hmi, pmh, cbmh); } MMRESULT WINAPI midiInStart( HMIDIIN hmi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInStart\n"); return midiInStart_orig( hmi); } MMRESULT WINAPI midiInStop( HMIDIIN hmi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInStop\n"); return midiInStop_orig(hmi); } MMRESULT WINAPI midiInReset( HMIDIIN hmi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInReset\n"); return midiInReset_orig( hmi); } MMRESULT WINAPI midiInGetID( HMIDIIN hmi, LPUINT puDeviceID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInGetID\n"); return midiInGetID_orig( hmi, puDeviceID); } MMRESULT WINAPI midiInMessage( HMIDIIN hmi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInMessage\n"); return midiInMessage_orig( hmi, uMsg, dw1, dw2); } UINT WINAPI auxGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"auxGetNumDevs\n"); return auxGetNumDevs_orig(); } MMRESULT WINAPI auxGetDevCapsA( UINT_PTR uDeviceID, LPAUXCAPSA pac, UINT cbac) { + ll_winmm_shim_initialize(); //OutputDebugString(L"auxGetDevCapsA\n"); return auxGetDevCapsA_orig( uDeviceID, pac, cbac); } MMRESULT WINAPI auxGetDevCapsW( UINT_PTR uDeviceID, LPAUXCAPSW pac, UINT cbac) { + ll_winmm_shim_initialize(); //OutputDebugString(L"auxGetDevCapsW\n"); return auxGetDevCapsW_orig( uDeviceID, pac, cbac); } MMRESULT WINAPI auxSetVolume( UINT uDeviceID, DWORD dwVolume) { + ll_winmm_shim_initialize(); //OutputDebugString(L"auxSetVolume\n"); return auxSetVolume_orig( uDeviceID, dwVolume); } MMRESULT WINAPI auxGetVolume( UINT uDeviceID, LPDWORD pdwVolume) { + ll_winmm_shim_initialize(); //OutputDebugString(L"auxGetVolume\n"); return auxGetVolume_orig( uDeviceID, pdwVolume); } MMRESULT WINAPI auxOutMessage( UINT uDeviceID, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"auxOutMessage\n"); return auxOutMessage_orig( uDeviceID, uMsg, dw1, dw2); } UINT WINAPI mixerGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetNumDevs\n"); return mixerGetNumDevs_orig(); } MMRESULT WINAPI mixerGetDevCapsA( UINT_PTR uMxId, LPMIXERCAPSA pmxcaps, UINT cbmxcaps) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetDevCapsA\n"); return mixerGetDevCapsA_orig( uMxId, pmxcaps, cbmxcaps); } MMRESULT WINAPI mixerGetDevCapsW( UINT_PTR uMxId, LPMIXERCAPSW pmxcaps, UINT cbmxcaps) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetDevCapsW\n"); return mixerGetDevCapsW_orig( uMxId, pmxcaps, cbmxcaps); } MMRESULT WINAPI mixerOpen( LPHMIXER phmx, UINT uMxId, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerOpen\n"); return mixerOpen_orig( phmx, uMxId, dwCallback, dwInstance, fdwOpen); } MMRESULT WINAPI mixerClose( HMIXER hmx) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerClose\n"); return mixerClose_orig( hmx); } DWORD WINAPI mixerMessage( HMIXER hmx, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerMessage\n"); return mixerMessage_orig( hmx, uMsg, dwParam1, dwParam2); } MMRESULT WINAPI mixerGetLineInfoA( HMIXEROBJ hmxobj, LPMIXERLINEA pmxl, DWORD fdwInfo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetLineInfoA\n"); return mixerGetLineInfoA_orig( hmxobj, pmxl, fdwInfo); } MMRESULT WINAPI mixerGetLineInfoW( HMIXEROBJ hmxobj, LPMIXERLINEW pmxl, DWORD fdwInfo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetLineInfoW\n"); return mixerGetLineInfoW_orig( hmxobj, pmxl, fdwInfo); } MMRESULT WINAPI mixerGetID( HMIXEROBJ hmxobj, UINT FAR *puMxId, DWORD fdwId) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetID\n"); return mixerGetID_orig( hmxobj, puMxId, fdwId); } MMRESULT WINAPI mixerGetLineControlsA( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSA pmxlc, DWORD fdwControls) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetLineControlsA\n"); return mixerGetLineControlsA_orig( hmxobj, pmxlc, fdwControls); } MMRESULT WINAPI mixerGetLineControlsW( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSW pmxlc, DWORD fdwControls) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetLineControlsW\n"); return mixerGetLineControlsW_orig( hmxobj, pmxlc, fdwControls); } MMRESULT WINAPI mixerGetControlDetailsA( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetControlDetailsA\n"); return mixerGetControlDetailsA_orig( hmxobj, pmxcd, fdwDetails); } MMRESULT WINAPI mixerGetControlDetailsW( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetControlDetailsW\n"); return mixerGetControlDetailsW_orig( hmxobj, pmxcd, fdwDetails); } MMRESULT WINAPI mixerSetControlDetails( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerSetControlDetails\n"); return mixerSetControlDetails_orig( hmxobj, pmxcd, fdwDetails); } DWORD WINAPI mmGetCurrentTask(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmGetCurrentTask\n"); return mmGetCurrentTask_orig(); } void WINAPI mmTaskBlock(DWORD val) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmTaskBlock\n"); return mmTaskBlock_orig(val); } UINT WINAPI mmTaskCreate(LPTASKCALLBACK a, HANDLE* b, DWORD_PTR c) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmTaskCreate\n"); return mmTaskCreate_orig(a, b, c); } BOOL WINAPI mmTaskSignal(DWORD a) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmTaskSignal\n"); return mmTaskSignal_orig(a); } VOID WINAPI mmTaskYield() { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmTaskYield\n"); mmTaskYield_orig(); } MMRESULT WINAPI timeGetSystemTime( LPMMTIME pmmt, UINT cbmmt) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeGetSystemTime\n"); return timeGetSystemTime_orig( pmmt, cbmmt); } DWORD WINAPI timeGetTime(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeGetTime\n"); return timeGetTime_orig(); } MMRESULT WINAPI timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK fptc, DWORD_PTR dwUser, UINT fuEvent) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeSetEvent\n"); return timeSetEvent_orig(uDelay, uResolution, fptc, dwUser, fuEvent); } MMRESULT WINAPI timeKillEvent( UINT uTimerID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeKillEvent\n"); return timeKillEvent_orig( uTimerID); } MMRESULT WINAPI timeGetDevCaps( LPTIMECAPS ptc, UINT cbtc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeGetDevCaps\n"); return timeGetDevCaps_orig( ptc, cbtc); } MMRESULT WINAPI timeBeginPeriod( UINT uPeriod) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeBeginPeriod\n"); return timeBeginPeriod_orig( uPeriod); } MMRESULT WINAPI timeEndPeriod( UINT uPeriod) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeEndPeriod\n"); return timeEndPeriod_orig( uPeriod); } UINT WINAPI joyGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyGetNumDevs\n"); return joyGetNumDevs_orig(); } MMRESULT WINAPI joyConfigChanged(DWORD dwFlags) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyConfigChanged\n"); return joyConfigChanged_orig(dwFlags); } MMRESULT WINAPI joyGetDevCapsA( UINT_PTR uJoyID, LPJOYCAPSA pjc, UINT cbjc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyGetDevCapsA\n"); return joyGetDevCapsA_orig( uJoyID, pjc, cbjc); } MMRESULT WINAPI joyGetDevCapsW( UINT_PTR uJoyID, LPJOYCAPSW pjc, UINT cbjc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyGetDevCapsW\n"); return joyGetDevCapsW_orig( uJoyID, pjc, cbjc); } MMRESULT WINAPI joyGetPos( UINT uJoyID, LPJOYINFO pji) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyGetPos\n"); return joyGetPos_orig( uJoyID, pji); } MMRESULT WINAPI joyGetPosEx( UINT uJoyID, LPJOYINFOEX pji) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyGetPosEx\n"); return joyGetPosEx_orig( uJoyID, pji); } MMRESULT WINAPI joyGetThreshold( UINT uJoyID, LPUINT puThreshold) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyGetThreshold\n"); return joyGetThreshold_orig( uJoyID, puThreshold); } MMRESULT WINAPI joyReleaseCapture( UINT uJoyID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyReleaseCapture\n"); return joyReleaseCapture_orig( uJoyID); } MMRESULT WINAPI joySetCapture( HWND hwnd, UINT uJoyID, UINT uPeriod, BOOL fChanged) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joySetCapture\n"); return joySetCapture_orig(hwnd, uJoyID, uPeriod, fChanged); } MMRESULT WINAPI joySetThreshold( UINT uJoyID, UINT uThreshold) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joySetThreshold\n"); return joySetThreshold_orig( uJoyID, uThreshold); } BOOL WINAPI mciDriverNotify(HWND hwndCallback, UINT uDeviceID, UINT uStatus) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciDriverNotify\n"); return mciDriverNotify_orig(hwndCallback, uDeviceID, uStatus); } UINT WINAPI mciDriverYield(UINT uDeviceID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciDriverYield\n"); return mciDriverYield_orig(uDeviceID); } FOURCC WINAPI mmioStringToFOURCCA( LPCSTR sz, UINT uFlags) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioStringToFOURCCA\n"); return mmioStringToFOURCCA_orig( sz, uFlags); } FOURCC WINAPI mmioStringToFOURCCW( LPCWSTR sz, UINT uFlags) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioStringToFOURCCW\n"); return mmioStringToFOURCCW_orig( sz, uFlags); } LPMMIOPROC WINAPI mmioInstallIOProcA( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioInstallIOProcA\n"); return mmioInstallIOProcA_orig( fccIOProc, pIOProc, dwFlags); } LPMMIOPROC WINAPI mmioInstallIOProcW( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioInstallIOProcW\n"); return mmioInstallIOProcW_orig( fccIOProc, pIOProc, dwFlags); } HMMIO WINAPI mmioOpenA( LPSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioOpenA\n"); return mmioOpenA_orig( pszFileName, pmmioinfo, fdwOpen); } HMMIO WINAPI mmioOpenW( LPWSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioOpenW\n"); return mmioOpenW_orig( pszFileName, pmmioinfo, fdwOpen); } MMRESULT WINAPI mmioRenameA( LPCSTR pszFileName, LPCSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioRenameA\n"); return mmioRenameA_orig( pszFileName, pszNewFileName, pmmioinfo, fdwRename); } MMRESULT WINAPI mmioRenameW( LPCWSTR pszFileName, LPCWSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioRenameW\n"); return mmioRenameW_orig( pszFileName, pszNewFileName, pmmioinfo, fdwRename); } MMRESULT WINAPI mmioClose( HMMIO hmmio, UINT fuClose) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioClose\n"); return mmioClose_orig( hmmio, fuClose); } LONG WINAPI mmioRead( HMMIO hmmio, HPSTR pch, LONG cch) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioRead\n"); return mmioRead_orig( hmmio, pch, cch); } LONG WINAPI mmioWrite( HMMIO hmmio, const char _huge* pch, LONG cch) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioWrite\n"); return mmioWrite_orig( hmmio, pch, cch); } LONG WINAPI mmioSeek( HMMIO hmmio, LONG lOffset, int iOrigin) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioSeek\n"); return mmioSeek_orig(hmmio, lOffset, iOrigin); } MMRESULT WINAPI mmioGetInfo( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuInfo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioGetInfo\n"); return mmioGetInfo_orig( hmmio, pmmioinfo, fuInfo); } MMRESULT WINAPI mmioSetInfo( HMMIO hmmio, LPCMMIOINFO pmmioinfo, UINT fuInfo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioSetInfo\n"); return mmioSetInfo_orig( hmmio, pmmioinfo, fuInfo); } MMRESULT WINAPI mmioSetBuffer( HMMIO hmmio, LPSTR pchBuffer, LONG cchBuffer, UINT fuBuffer) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioSetBuffer\n"); return mmioSetBuffer_orig(hmmio, pchBuffer, cchBuffer, fuBuffer); } MMRESULT WINAPI mmioFlush( HMMIO hmmio, UINT fuFlush) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioFlush\n"); return mmioFlush_orig( hmmio, fuFlush); } MMRESULT WINAPI mmioAdvance( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuAdvance) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioAdvance\n"); return mmioAdvance_orig( hmmio, pmmioinfo, fuAdvance); } LRESULT WINAPI mmioSendMessage( HMMIO hmmio, UINT uMsg, LPARAM lParam1, LPARAM lParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioSendMessage\n"); return mmioSendMessage_orig(hmmio, uMsg, lParam1, lParam2); } MMRESULT WINAPI mmioDescend( HMMIO hmmio, LPMMCKINFO pmmcki, const MMCKINFO FAR* pmmckiParent, UINT fuDescend) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioDescend\n"); return mmioDescend_orig(hmmio, pmmcki, pmmckiParent, fuDescend); } MMRESULT WINAPI mmioAscend( HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuAscend) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioAscend\n"); return mmioAscend_orig( hmmio, pmmcki, fuAscend); } MMRESULT WINAPI mmioCreateChunk(HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuCreate) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioCreateChunk\n"); return mmioCreateChunk_orig(hmmio, pmmcki, fuCreate); } MCIERROR WINAPI mciSendCommandA( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciSendCommandA\n"); return mciSendCommandA_orig( mciId, uMsg, dwParam1, dwParam2); } MCIERROR WINAPI mciSendCommandW( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciSendCommandW\n"); return mciSendCommandW_orig( mciId, uMsg, dwParam1, dwParam2); } MCIERROR WINAPI mciSendStringA( LPCSTR lpstrCommand, LPSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciSendStringA\n"); return mciSendStringA_orig( lpstrCommand, lpstrReturnString, uReturnLength, hwndCallback); } MCIERROR WINAPI mciSendStringW( LPCWSTR lpstrCommand, LPWSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciSendStringW\n"); return mciSendStringW_orig( lpstrCommand, lpstrReturnString, uReturnLength, hwndCallback); } @@ -1375,72 +1535,84 @@ extern "C" { MCIDEVICEID WINAPI mciGetDeviceIDW( LPCWSTR pszDevice) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetDeviceIDW\n"); return mciGetDeviceIDW_orig( pszDevice); } MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDA( DWORD dwElementID, LPCSTR lpstrType ) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetDeviceIDFromElementIDA\n"); return mciGetDeviceIDFromElementIDA_orig( dwElementID, lpstrType ); } MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDW( DWORD dwElementID, LPCWSTR lpstrType ) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetDeviceIDFromElementIDW\n"); return mciGetDeviceIDFromElementIDW_orig( dwElementID, lpstrType ); } DWORD_PTR WINAPI mciGetDriverData(UINT uDeviceID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetDriverData\n"); return mciGetDriverData_orig(uDeviceID); } BOOL WINAPI mciGetErrorStringA( MCIERROR mcierr, LPSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetErrorStringA\n"); return mciGetErrorStringA_orig( mcierr, pszText, cchText); } BOOL WINAPI mciGetErrorStringW( MCIERROR mcierr, LPWSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetErrorStringW\n"); return mciGetErrorStringW_orig( mcierr, pszText, cchText); } BOOL WINAPI mciSetDriverData(UINT uDeviceID, DWORD_PTR dwData) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciSetDriverData_type\n"); return mciSetDriverData_orig( uDeviceID, dwData ); } BOOL WINAPI mciSetYieldProc( MCIDEVICEID mciId, YIELDPROC fpYieldProc, DWORD dwYieldData) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciSetYieldProc\n"); return mciSetYieldProc_orig(mciId, fpYieldProc, dwYieldData); } BOOL WINAPI mciFreeCommandResource(UINT uTable) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciFreeCommandResource\n"); return mciFreeCommandResource_orig(uTable); } HTASK WINAPI mciGetCreatorTask( MCIDEVICEID mciId) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetCreatorTask\n"); return mciGetCreatorTask_orig( mciId); } YIELDPROC WINAPI mciGetYieldProc( MCIDEVICEID mciId, LPDWORD pdwYieldData) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetYieldProc\n"); return mciGetYieldProc_orig( mciId, pdwYieldData); } UINT WINAPI mciLoadCommandResource(HINSTANCE hInstance, LPCWSTR lpResName, UINT uType) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciLoadCommandResource"); return mciLoadCommandResource_orig(hInstance, lpResName, uType); } @@ -1448,6 +1620,7 @@ extern "C" { BOOL WINAPI mciExecute(LPCSTR pszCommand) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciExecute\n"); return mciExecute_orig(pszCommand); } diff --git a/indra/media_plugins/winmmshim/forwarding_api.h b/indra/media_plugins/winmmshim/forwarding_api.h index 89a6b347f3..076a08f769 100644 --- a/indra/media_plugins/winmmshim/forwarding_api.h +++ b/indra/media_plugins/winmmshim/forwarding_api.h @@ -30,6 +30,7 @@ #include void init_function_pointers(HMODULE winmm_handle); +void ll_winmm_shim_initialize(); typedef VOID (*LPTASKCALLBACK)(DWORD_PTR dwInst); diff --git a/indra/media_plugins/winmmshim/winmm_shim.cpp b/indra/media_plugins/winmmshim/winmm_shim.cpp index 9563a3b664..6ba95e565e 100644 --- a/indra/media_plugins/winmmshim/winmm_shim.cpp +++ b/indra/media_plugins/winmmshim/winmm_shim.cpp @@ -32,14 +32,21 @@ using std::wstring; static float sVolumeLevel = 1.f; static bool sMute = false; +static CRITICAL_SECTION sCriticalSection; BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { + InitializeCriticalSectionAndSpinCount(&sCriticalSection, 0x00000400); + return TRUE; +} + +void ll_winmm_shim_initialize(){ static bool initialized = false; // do this only once + EnterCriticalSection(&sCriticalSection); if (!initialized) { // bind to original winmm.dll TCHAR system_path[MAX_PATH]; @@ -54,13 +61,14 @@ BOOL APIENTRY DllMain( HMODULE hModule, { // we have a dll, let's get out pointers! initialized = true; init_function_pointers(winmm_handle); - return true; + ::OutputDebugStringA("WINMM_SHIM.DLL: real winmm.dll initialized successfully\n"); + return; } // failed to initialize real winmm.dll - return false; + ::OutputDebugStringA("WINMM_SHIM.DLL: Failed to initialize real winmm.dll\n"); } - return true; + LeaveCriticalSection(&sCriticalSection); } @@ -79,6 +87,7 @@ extern "C" MMRESULT WINAPI waveOutOpen( LPHWAVEOUT phwo, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) { + ll_winmm_shim_initialize(); if (pwfx->wFormatTag != WAVE_FORMAT_PCM || (pwfx->wBitsPerSample != 8 && pwfx->wBitsPerSample != 16)) { // uncompressed 8 and 16 bit sound are the only types we support @@ -97,6 +106,7 @@ extern "C" MMRESULT WINAPI waveOutClose( HWAVEOUT hwo) { + ll_winmm_shim_initialize(); wave_out_map_t::iterator found_it = sWaveOuts.find(hwo); if (found_it != sWaveOuts.end()) { // forget what we know about this handle @@ -108,6 +118,7 @@ extern "C" MMRESULT WINAPI waveOutWrite( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh) { + ll_winmm_shim_initialize(); MMRESULT result = MMSYSERR_NOERROR; if (sMute) -- cgit v1.2.3 From 26b15973af5f5725e544866a7884bdbe0827c495 Mon Sep 17 00:00:00 2001 From: Siana Gearz Date: Sun, 17 Apr 2011 08:04:02 -0400 Subject: STORM-1088: fix loading of winmm.dll --- doc/contributions.txt | 1 + indra/media_plugins/winmmshim/forwarding_api.cpp | 173 +++++++++++++++++++++++ indra/media_plugins/winmmshim/forwarding_api.h | 1 + indra/media_plugins/winmmshim/winmm_shim.cpp | 17 ++- 4 files changed, 189 insertions(+), 3 deletions(-) diff --git a/doc/contributions.txt b/doc/contributions.txt index 71c54e8624..c92450acd2 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -703,6 +703,7 @@ Shawn Kaufmat SNOW-240 Siana Gearz STORM-960 + STORM-1088 SignpostMarv Martin VWR-153 VWR-154 diff --git a/indra/media_plugins/winmmshim/forwarding_api.cpp b/indra/media_plugins/winmmshim/forwarding_api.cpp index eff7e20451..495e08942b 100644 --- a/indra/media_plugins/winmmshim/forwarding_api.cpp +++ b/indra/media_plugins/winmmshim/forwarding_api.cpp @@ -389,90 +389,105 @@ void init_function_pointers(HMODULE winmm_handle) extern "C" { LRESULT WINAPI CloseDriver( HDRVR hDriver, LPARAM lParam1, LPARAM lParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"CloseDriver\n"); return CloseDriver_orig( hDriver, lParam1, lParam2); } HDRVR WINAPI OpenDriver( LPCWSTR szDriverName, LPCWSTR szSectionName, LPARAM lParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"OpenDriver\n"); return OpenDriver_orig( szDriverName, szSectionName, lParam2); } LRESULT WINAPI SendDriverMessage( HDRVR hDriver, UINT message, LPARAM lParam1, LPARAM lParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"SendDriverMessage\n"); return SendDriverMessage_orig( hDriver, message, lParam1, lParam2); } HMODULE WINAPI DrvGetModuleHandle( HDRVR hDriver) { + ll_winmm_shim_initialize(); //OutputDebugString(L"DrvGetModuleHandle\n"); return DrvGetModuleHandle_orig( hDriver); } HMODULE WINAPI GetDriverModuleHandle( HDRVR hDriver) { + ll_winmm_shim_initialize(); //OutputDebugString(L"GetDriverModuleHandle\n"); return GetDriverModuleHandle_orig( hDriver); } LRESULT WINAPI DefDriverProc( DWORD_PTR dwDriverIdentifier, HDRVR hdrvr, UINT uMsg, LPARAM lParam1, LPARAM lParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"DefDriverProc\n"); return DefDriverProc_orig( dwDriverIdentifier, hdrvr, uMsg, lParam1, lParam2); } BOOL WINAPI DriverCallback( DWORD dwCallBack, DWORD dwFlags, HDRVR hdrvr, DWORD msg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"DriverCallback\n"); return DriverCallback_orig(dwCallBack, dwFlags, hdrvr, msg, dwUser, dwParam1, dwParam2); } UINT WINAPI mmsystemGetVersion(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmsystemGetVersion\n"); return mmsystemGetVersion_orig(); } BOOL WINAPI sndPlaySoundA( LPCSTR pszSound, UINT fuSound) { + ll_winmm_shim_initialize(); //OutputDebugString(L"sndPlaySoundA\n"); return sndPlaySoundA_orig( pszSound, fuSound); } BOOL WINAPI sndPlaySoundW( LPCWSTR pszSound, UINT fuSound) { + ll_winmm_shim_initialize(); //OutputDebugString(L"sndPlaySoundW\n"); return sndPlaySoundW_orig( pszSound, fuSound); } BOOL WINAPI PlaySoundA( LPCSTR pszSound, HMODULE hmod, DWORD fdwSound) { + ll_winmm_shim_initialize(); //OutputDebugString(L"PlaySoundA\n"); return PlaySoundA_orig( pszSound, hmod, fdwSound); } BOOL WINAPI PlaySoundW( LPCWSTR pszSound, HMODULE hmod, DWORD fdwSound) { + ll_winmm_shim_initialize(); //OutputDebugString(L"PlaySoundW\n"); return PlaySoundW_orig( pszSound, hmod, fdwSound); } UINT WINAPI waveOutGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetNumDevs\n"); return waveOutGetNumDevs_orig(); } MMRESULT WINAPI waveOutGetDevCapsA( UINT_PTR uDeviceID, LPWAVEOUTCAPSA pwoc, UINT cbwoc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetDevCapsA\n"); return waveOutGetDevCapsA_orig( uDeviceID, pwoc, cbwoc); } MMRESULT WINAPI waveOutGetDevCapsW( UINT_PTR uDeviceID, LPWAVEOUTCAPSW pwoc, UINT cbwoc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetDevCapsW\n"); return waveOutGetDevCapsW_orig( uDeviceID, pwoc, cbwoc); } @@ -480,24 +495,28 @@ extern "C" { MMRESULT WINAPI waveOutGetVolume( HWAVEOUT hwo, LPDWORD pdwVolume) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetVolume\n"); return waveOutGetVolume_orig( hwo, pdwVolume); } MMRESULT WINAPI waveOutSetVolume( HWAVEOUT hwo, DWORD dwVolume) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutSetVolume\n"); return waveOutSetVolume_orig( hwo, dwVolume); } MMRESULT WINAPI waveOutGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetErrorTextA\n"); return waveOutGetErrorTextA_orig( mmrError, pszText, cchText); } MMRESULT WINAPI waveOutGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetErrorTextW\n"); return waveOutGetErrorTextW_orig( mmrError, pszText, cchText); } @@ -516,12 +535,14 @@ extern "C" { MMRESULT WINAPI waveOutPrepareHeader( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutPrepareHeader\n"); return waveOutPrepareHeader_orig( hwo, pwh, cbwh); } MMRESULT WINAPI waveOutUnprepareHeader( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutUnprepareHeader\n"); return waveOutUnprepareHeader_orig( hwo, pwh, cbwh); } @@ -535,834 +556,973 @@ extern "C" { MMRESULT WINAPI waveOutPause( HWAVEOUT hwo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutPause\n"); return waveOutPause_orig( hwo); } MMRESULT WINAPI waveOutRestart( HWAVEOUT hwo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutRestart\n"); return waveOutRestart_orig( hwo); } MMRESULT WINAPI waveOutReset( HWAVEOUT hwo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutReset\n"); return waveOutReset_orig( hwo); } MMRESULT WINAPI waveOutBreakLoop( HWAVEOUT hwo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutBreakLoop\n"); return waveOutBreakLoop_orig( hwo); } MMRESULT WINAPI waveOutGetPosition( HWAVEOUT hwo, LPMMTIME pmmt, UINT cbmmt) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetPosition\n"); return waveOutGetPosition_orig( hwo, pmmt, cbmmt); } MMRESULT WINAPI waveOutGetPitch( HWAVEOUT hwo, LPDWORD pdwPitch) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetPitch\n"); return waveOutGetPitch_orig( hwo, pdwPitch); } MMRESULT WINAPI waveOutSetPitch( HWAVEOUT hwo, DWORD dwPitch) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutSetPitch\n"); return waveOutSetPitch_orig( hwo, dwPitch); } MMRESULT WINAPI waveOutGetPlaybackRate( HWAVEOUT hwo, LPDWORD pdwRate) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetPlaybackRate\n"); return waveOutGetPlaybackRate_orig( hwo, pdwRate); } MMRESULT WINAPI waveOutSetPlaybackRate( HWAVEOUT hwo, DWORD dwRate) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutSetPlaybackRate\n"); return waveOutSetPlaybackRate_orig( hwo, dwRate); } MMRESULT WINAPI waveOutGetID( HWAVEOUT hwo, LPUINT puDeviceID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutGetID\n"); return waveOutGetID_orig( hwo, puDeviceID); } MMRESULT WINAPI waveOutMessage( HWAVEOUT hwo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveOutMessage\n"); return waveOutMessage_orig( hwo, uMsg, dw1, dw2); } UINT WINAPI waveInGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetNumDevs\n"); return waveInGetNumDevs_orig(); } MMRESULT WINAPI waveInGetDevCapsA( UINT_PTR uDeviceID, LPWAVEINCAPSA pwic, UINT cbwic) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetDevCapsA\n"); return waveInGetDevCapsA_orig( uDeviceID, pwic, cbwic); } MMRESULT WINAPI waveInGetDevCapsW( UINT_PTR uDeviceID, LPWAVEINCAPSW pwic, UINT cbwic) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetDevCapsW\n"); return waveInGetDevCapsW_orig( uDeviceID, pwic, cbwic); } MMRESULT WINAPI waveInGetErrorTextA(MMRESULT mmrError, LPSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetErrorTextA\n"); return waveInGetErrorTextA_orig(mmrError, pszText, cchText); } MMRESULT WINAPI waveInGetErrorTextW(MMRESULT mmrError, LPWSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetErrorTextW\n"); return waveInGetErrorTextW_orig(mmrError, pszText, cchText); } MMRESULT WINAPI waveInOpen( LPHWAVEIN phwi, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInOpen\n"); return waveInOpen_orig(phwi, uDeviceID, pwfx, dwCallback, dwInstance, fdwOpen); } MMRESULT WINAPI waveInClose( HWAVEIN hwi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInClose\n"); return waveInClose_orig( hwi); } MMRESULT WINAPI waveInPrepareHeader( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInPrepareHeader\n"); return waveInPrepareHeader_orig( hwi, pwh, cbwh); } MMRESULT WINAPI waveInUnprepareHeader( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInUnprepareHeader\n"); return waveInUnprepareHeader_orig( hwi, pwh, cbwh); } MMRESULT WINAPI waveInAddBuffer( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInAddBuffer\n"); return waveInAddBuffer_orig( hwi, pwh, cbwh); } MMRESULT WINAPI waveInStart( HWAVEIN hwi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInStart\n"); return waveInStart_orig( hwi); } MMRESULT WINAPI waveInStop( HWAVEIN hwi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInStop\n"); return waveInStop_orig(hwi); } MMRESULT WINAPI waveInReset( HWAVEIN hwi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInReset\n"); return waveInReset_orig(hwi); } MMRESULT WINAPI waveInGetPosition( HWAVEIN hwi, LPMMTIME pmmt, UINT cbmmt) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetPosition\n"); return waveInGetPosition_orig( hwi, pmmt, cbmmt); } MMRESULT WINAPI waveInGetID( HWAVEIN hwi, LPUINT puDeviceID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInGetID\n"); return waveInGetID_orig( hwi, puDeviceID); } MMRESULT WINAPI waveInMessage( HWAVEIN hwi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"waveInMessage\n"); return waveInMessage_orig( hwi, uMsg, dw1, dw2); } UINT WINAPI midiOutGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetNumDevs\n"); return midiOutGetNumDevs_orig(); } MMRESULT WINAPI midiStreamOpen( LPHMIDISTRM phms, LPUINT puDeviceID, DWORD cMidi, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamOpen\n"); return midiStreamOpen_orig( phms, puDeviceID, cMidi, dwCallback, dwInstance, fdwOpen); } MMRESULT WINAPI midiStreamClose( HMIDISTRM hms) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamClose\n"); return midiStreamClose_orig( hms); } MMRESULT WINAPI midiStreamProperty( HMIDISTRM hms, LPBYTE lppropdata, DWORD dwProperty) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamProperty\n"); return midiStreamProperty_orig( hms, lppropdata, dwProperty); } MMRESULT WINAPI midiStreamPosition( HMIDISTRM hms, LPMMTIME lpmmt, UINT cbmmt) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamPosition\n"); return midiStreamPosition_orig( hms, lpmmt, cbmmt); } MMRESULT WINAPI midiStreamOut( HMIDISTRM hms, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamOut\n"); return midiStreamOut_orig( hms, pmh, cbmh); } MMRESULT WINAPI midiStreamPause( HMIDISTRM hms) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamPause\n"); return midiStreamPause_orig( hms); } MMRESULT WINAPI midiStreamRestart( HMIDISTRM hms) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamRestart\n"); return midiStreamRestart_orig( hms); } MMRESULT WINAPI midiStreamStop( HMIDISTRM hms) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiStreamStop\n"); return midiStreamStop_orig( hms); } MMRESULT WINAPI midiConnect( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiConnect\n"); return midiConnect_orig( hmi, hmo, pReserved); } MMRESULT WINAPI midiDisconnect( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiDisconnect\n"); return midiDisconnect_orig( hmi, hmo, pReserved); } MMRESULT WINAPI midiOutGetDevCapsA( UINT_PTR uDeviceID, LPMIDIOUTCAPSA pmoc, UINT cbmoc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetDevCapsA\n"); return midiOutGetDevCapsA_orig( uDeviceID, pmoc, cbmoc); } MMRESULT WINAPI midiOutGetDevCapsW( UINT_PTR uDeviceID, LPMIDIOUTCAPSW pmoc, UINT cbmoc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetDevCapsW\n"); return midiOutGetDevCapsW_orig( uDeviceID, pmoc, cbmoc); } MMRESULT WINAPI midiOutGetVolume( HMIDIOUT hmo, LPDWORD pdwVolume) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetVolume\n"); return midiOutGetVolume_orig( hmo, pdwVolume); } MMRESULT WINAPI midiOutSetVolume( HMIDIOUT hmo, DWORD dwVolume) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutSetVolume\n"); return midiOutSetVolume_orig( hmo, dwVolume); } MMRESULT WINAPI midiOutGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetErrorTextA\n"); return midiOutGetErrorTextA_orig( mmrError, pszText, cchText); } MMRESULT WINAPI midiOutGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetErrorTextW\n"); return midiOutGetErrorTextW_orig( mmrError, pszText, cchText); } MMRESULT WINAPI midiOutOpen( LPHMIDIOUT phmo, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutOpen\n"); return midiOutOpen_orig(phmo, uDeviceID, dwCallback, dwInstance, fdwOpen); } MMRESULT WINAPI midiOutClose( HMIDIOUT hmo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutClose\n"); return midiOutClose_orig( hmo); } MMRESULT WINAPI midiOutPrepareHeader( HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutPrepareHeader\n"); return midiOutPrepareHeader_orig( hmo, pmh, cbmh); } MMRESULT WINAPI midiOutUnprepareHeader(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutUnprepareHeader\n"); return midiOutUnprepareHeader_orig(hmo, pmh, cbmh); } MMRESULT WINAPI midiOutShortMsg( HMIDIOUT hmo, DWORD dwMsg) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutShortMsg\n"); return midiOutShortMsg_orig( hmo, dwMsg); } MMRESULT WINAPI midiOutLongMsg(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutLongMsg\n"); return midiOutLongMsg_orig(hmo, pmh, cbmh); } MMRESULT WINAPI midiOutReset( HMIDIOUT hmo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutReset\n"); return midiOutReset_orig( hmo); } MMRESULT WINAPI midiOutCachePatches( HMIDIOUT hmo, UINT uBank, LPWORD pwpa, UINT fuCache) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutCachePatches\n"); return midiOutCachePatches_orig( hmo, uBank, pwpa, fuCache); } MMRESULT WINAPI midiOutCacheDrumPatches( HMIDIOUT hmo, UINT uPatch, LPWORD pwkya, UINT fuCache) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutCacheDrumPatches\n"); return midiOutCacheDrumPatches_orig( hmo, uPatch, pwkya, fuCache); } MMRESULT WINAPI midiOutGetID( HMIDIOUT hmo, LPUINT puDeviceID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutGetID\n"); return midiOutGetID_orig( hmo, puDeviceID); } MMRESULT WINAPI midiOutMessage( HMIDIOUT hmo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiOutMessage\n"); return midiOutMessage_orig( hmo, uMsg, dw1, dw2); } UINT WINAPI midiInGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInGetNumDevs\n"); return midiInGetNumDevs_orig(); } MMRESULT WINAPI midiInGetDevCapsA( UINT_PTR uDeviceID, LPMIDIINCAPSA pmic, UINT cbmic) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInGetDevCapsA\n"); return midiInGetDevCapsA_orig( uDeviceID, pmic, cbmic); } MMRESULT WINAPI midiInGetDevCapsW( UINT_PTR uDeviceID, LPMIDIINCAPSW pmic, UINT cbmic) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInGetDevCapsW\n"); return midiInGetDevCapsW_orig( uDeviceID, pmic, cbmic); } MMRESULT WINAPI midiInGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInGetErrorTextA\n"); return midiInGetErrorTextA_orig( mmrError, pszText, cchText); } MMRESULT WINAPI midiInGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInGetErrorTextW\n"); return midiInGetErrorTextW_orig( mmrError, pszText, cchText); } MMRESULT WINAPI midiInOpen( LPHMIDIIN phmi, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInOpen\n"); return midiInOpen_orig(phmi, uDeviceID, dwCallback, dwInstance, fdwOpen); } MMRESULT WINAPI midiInClose( HMIDIIN hmi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInClose\n"); return midiInClose_orig( hmi); } MMRESULT WINAPI midiInPrepareHeader( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInPrepareHeader\n"); return midiInPrepareHeader_orig( hmi, pmh, cbmh); } MMRESULT WINAPI midiInUnprepareHeader( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInUnprepareHeader\n"); return midiInUnprepareHeader_orig( hmi, pmh, cbmh); } MMRESULT WINAPI midiInAddBuffer( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInAddBuffer\n"); return midiInAddBuffer_orig( hmi, pmh, cbmh); } MMRESULT WINAPI midiInStart( HMIDIIN hmi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInStart\n"); return midiInStart_orig( hmi); } MMRESULT WINAPI midiInStop( HMIDIIN hmi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInStop\n"); return midiInStop_orig(hmi); } MMRESULT WINAPI midiInReset( HMIDIIN hmi) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInReset\n"); return midiInReset_orig( hmi); } MMRESULT WINAPI midiInGetID( HMIDIIN hmi, LPUINT puDeviceID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInGetID\n"); return midiInGetID_orig( hmi, puDeviceID); } MMRESULT WINAPI midiInMessage( HMIDIIN hmi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"midiInMessage\n"); return midiInMessage_orig( hmi, uMsg, dw1, dw2); } UINT WINAPI auxGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"auxGetNumDevs\n"); return auxGetNumDevs_orig(); } MMRESULT WINAPI auxGetDevCapsA( UINT_PTR uDeviceID, LPAUXCAPSA pac, UINT cbac) { + ll_winmm_shim_initialize(); //OutputDebugString(L"auxGetDevCapsA\n"); return auxGetDevCapsA_orig( uDeviceID, pac, cbac); } MMRESULT WINAPI auxGetDevCapsW( UINT_PTR uDeviceID, LPAUXCAPSW pac, UINT cbac) { + ll_winmm_shim_initialize(); //OutputDebugString(L"auxGetDevCapsW\n"); return auxGetDevCapsW_orig( uDeviceID, pac, cbac); } MMRESULT WINAPI auxSetVolume( UINT uDeviceID, DWORD dwVolume) { + ll_winmm_shim_initialize(); //OutputDebugString(L"auxSetVolume\n"); return auxSetVolume_orig( uDeviceID, dwVolume); } MMRESULT WINAPI auxGetVolume( UINT uDeviceID, LPDWORD pdwVolume) { + ll_winmm_shim_initialize(); //OutputDebugString(L"auxGetVolume\n"); return auxGetVolume_orig( uDeviceID, pdwVolume); } MMRESULT WINAPI auxOutMessage( UINT uDeviceID, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"auxOutMessage\n"); return auxOutMessage_orig( uDeviceID, uMsg, dw1, dw2); } UINT WINAPI mixerGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetNumDevs\n"); return mixerGetNumDevs_orig(); } MMRESULT WINAPI mixerGetDevCapsA( UINT_PTR uMxId, LPMIXERCAPSA pmxcaps, UINT cbmxcaps) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetDevCapsA\n"); return mixerGetDevCapsA_orig( uMxId, pmxcaps, cbmxcaps); } MMRESULT WINAPI mixerGetDevCapsW( UINT_PTR uMxId, LPMIXERCAPSW pmxcaps, UINT cbmxcaps) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetDevCapsW\n"); return mixerGetDevCapsW_orig( uMxId, pmxcaps, cbmxcaps); } MMRESULT WINAPI mixerOpen( LPHMIXER phmx, UINT uMxId, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerOpen\n"); return mixerOpen_orig( phmx, uMxId, dwCallback, dwInstance, fdwOpen); } MMRESULT WINAPI mixerClose( HMIXER hmx) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerClose\n"); return mixerClose_orig( hmx); } DWORD WINAPI mixerMessage( HMIXER hmx, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerMessage\n"); return mixerMessage_orig( hmx, uMsg, dwParam1, dwParam2); } MMRESULT WINAPI mixerGetLineInfoA( HMIXEROBJ hmxobj, LPMIXERLINEA pmxl, DWORD fdwInfo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetLineInfoA\n"); return mixerGetLineInfoA_orig( hmxobj, pmxl, fdwInfo); } MMRESULT WINAPI mixerGetLineInfoW( HMIXEROBJ hmxobj, LPMIXERLINEW pmxl, DWORD fdwInfo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetLineInfoW\n"); return mixerGetLineInfoW_orig( hmxobj, pmxl, fdwInfo); } MMRESULT WINAPI mixerGetID( HMIXEROBJ hmxobj, UINT FAR *puMxId, DWORD fdwId) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetID\n"); return mixerGetID_orig( hmxobj, puMxId, fdwId); } MMRESULT WINAPI mixerGetLineControlsA( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSA pmxlc, DWORD fdwControls) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetLineControlsA\n"); return mixerGetLineControlsA_orig( hmxobj, pmxlc, fdwControls); } MMRESULT WINAPI mixerGetLineControlsW( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSW pmxlc, DWORD fdwControls) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetLineControlsW\n"); return mixerGetLineControlsW_orig( hmxobj, pmxlc, fdwControls); } MMRESULT WINAPI mixerGetControlDetailsA( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetControlDetailsA\n"); return mixerGetControlDetailsA_orig( hmxobj, pmxcd, fdwDetails); } MMRESULT WINAPI mixerGetControlDetailsW( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerGetControlDetailsW\n"); return mixerGetControlDetailsW_orig( hmxobj, pmxcd, fdwDetails); } MMRESULT WINAPI mixerSetControlDetails( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mixerSetControlDetails\n"); return mixerSetControlDetails_orig( hmxobj, pmxcd, fdwDetails); } DWORD WINAPI mmGetCurrentTask(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmGetCurrentTask\n"); return mmGetCurrentTask_orig(); } void WINAPI mmTaskBlock(DWORD val) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmTaskBlock\n"); return mmTaskBlock_orig(val); } UINT WINAPI mmTaskCreate(LPTASKCALLBACK a, HANDLE* b, DWORD_PTR c) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmTaskCreate\n"); return mmTaskCreate_orig(a, b, c); } BOOL WINAPI mmTaskSignal(DWORD a) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmTaskSignal\n"); return mmTaskSignal_orig(a); } VOID WINAPI mmTaskYield() { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmTaskYield\n"); mmTaskYield_orig(); } MMRESULT WINAPI timeGetSystemTime( LPMMTIME pmmt, UINT cbmmt) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeGetSystemTime\n"); return timeGetSystemTime_orig( pmmt, cbmmt); } DWORD WINAPI timeGetTime(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeGetTime\n"); return timeGetTime_orig(); } MMRESULT WINAPI timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK fptc, DWORD_PTR dwUser, UINT fuEvent) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeSetEvent\n"); return timeSetEvent_orig(uDelay, uResolution, fptc, dwUser, fuEvent); } MMRESULT WINAPI timeKillEvent( UINT uTimerID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeKillEvent\n"); return timeKillEvent_orig( uTimerID); } MMRESULT WINAPI timeGetDevCaps( LPTIMECAPS ptc, UINT cbtc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeGetDevCaps\n"); return timeGetDevCaps_orig( ptc, cbtc); } MMRESULT WINAPI timeBeginPeriod( UINT uPeriod) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeBeginPeriod\n"); return timeBeginPeriod_orig( uPeriod); } MMRESULT WINAPI timeEndPeriod( UINT uPeriod) { + ll_winmm_shim_initialize(); //OutputDebugString(L"timeEndPeriod\n"); return timeEndPeriod_orig( uPeriod); } UINT WINAPI joyGetNumDevs(void) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyGetNumDevs\n"); return joyGetNumDevs_orig(); } MMRESULT WINAPI joyConfigChanged(DWORD dwFlags) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyConfigChanged\n"); return joyConfigChanged_orig(dwFlags); } MMRESULT WINAPI joyGetDevCapsA( UINT_PTR uJoyID, LPJOYCAPSA pjc, UINT cbjc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyGetDevCapsA\n"); return joyGetDevCapsA_orig( uJoyID, pjc, cbjc); } MMRESULT WINAPI joyGetDevCapsW( UINT_PTR uJoyID, LPJOYCAPSW pjc, UINT cbjc) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyGetDevCapsW\n"); return joyGetDevCapsW_orig( uJoyID, pjc, cbjc); } MMRESULT WINAPI joyGetPos( UINT uJoyID, LPJOYINFO pji) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyGetPos\n"); return joyGetPos_orig( uJoyID, pji); } MMRESULT WINAPI joyGetPosEx( UINT uJoyID, LPJOYINFOEX pji) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyGetPosEx\n"); return joyGetPosEx_orig( uJoyID, pji); } MMRESULT WINAPI joyGetThreshold( UINT uJoyID, LPUINT puThreshold) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyGetThreshold\n"); return joyGetThreshold_orig( uJoyID, puThreshold); } MMRESULT WINAPI joyReleaseCapture( UINT uJoyID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joyReleaseCapture\n"); return joyReleaseCapture_orig( uJoyID); } MMRESULT WINAPI joySetCapture( HWND hwnd, UINT uJoyID, UINT uPeriod, BOOL fChanged) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joySetCapture\n"); return joySetCapture_orig(hwnd, uJoyID, uPeriod, fChanged); } MMRESULT WINAPI joySetThreshold( UINT uJoyID, UINT uThreshold) { + ll_winmm_shim_initialize(); //OutputDebugString(L"joySetThreshold\n"); return joySetThreshold_orig( uJoyID, uThreshold); } BOOL WINAPI mciDriverNotify(HWND hwndCallback, UINT uDeviceID, UINT uStatus) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciDriverNotify\n"); return mciDriverNotify_orig(hwndCallback, uDeviceID, uStatus); } UINT WINAPI mciDriverYield(UINT uDeviceID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciDriverYield\n"); return mciDriverYield_orig(uDeviceID); } FOURCC WINAPI mmioStringToFOURCCA( LPCSTR sz, UINT uFlags) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioStringToFOURCCA\n"); return mmioStringToFOURCCA_orig( sz, uFlags); } FOURCC WINAPI mmioStringToFOURCCW( LPCWSTR sz, UINT uFlags) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioStringToFOURCCW\n"); return mmioStringToFOURCCW_orig( sz, uFlags); } LPMMIOPROC WINAPI mmioInstallIOProcA( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioInstallIOProcA\n"); return mmioInstallIOProcA_orig( fccIOProc, pIOProc, dwFlags); } LPMMIOPROC WINAPI mmioInstallIOProcW( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioInstallIOProcW\n"); return mmioInstallIOProcW_orig( fccIOProc, pIOProc, dwFlags); } HMMIO WINAPI mmioOpenA( LPSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioOpenA\n"); return mmioOpenA_orig( pszFileName, pmmioinfo, fdwOpen); } HMMIO WINAPI mmioOpenW( LPWSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioOpenW\n"); return mmioOpenW_orig( pszFileName, pmmioinfo, fdwOpen); } MMRESULT WINAPI mmioRenameA( LPCSTR pszFileName, LPCSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioRenameA\n"); return mmioRenameA_orig( pszFileName, pszNewFileName, pmmioinfo, fdwRename); } MMRESULT WINAPI mmioRenameW( LPCWSTR pszFileName, LPCWSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioRenameW\n"); return mmioRenameW_orig( pszFileName, pszNewFileName, pmmioinfo, fdwRename); } MMRESULT WINAPI mmioClose( HMMIO hmmio, UINT fuClose) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioClose\n"); return mmioClose_orig( hmmio, fuClose); } LONG WINAPI mmioRead( HMMIO hmmio, HPSTR pch, LONG cch) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioRead\n"); return mmioRead_orig( hmmio, pch, cch); } LONG WINAPI mmioWrite( HMMIO hmmio, const char _huge* pch, LONG cch) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioWrite\n"); return mmioWrite_orig( hmmio, pch, cch); } LONG WINAPI mmioSeek( HMMIO hmmio, LONG lOffset, int iOrigin) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioSeek\n"); return mmioSeek_orig(hmmio, lOffset, iOrigin); } MMRESULT WINAPI mmioGetInfo( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuInfo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioGetInfo\n"); return mmioGetInfo_orig( hmmio, pmmioinfo, fuInfo); } MMRESULT WINAPI mmioSetInfo( HMMIO hmmio, LPCMMIOINFO pmmioinfo, UINT fuInfo) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioSetInfo\n"); return mmioSetInfo_orig( hmmio, pmmioinfo, fuInfo); } MMRESULT WINAPI mmioSetBuffer( HMMIO hmmio, LPSTR pchBuffer, LONG cchBuffer, UINT fuBuffer) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioSetBuffer\n"); return mmioSetBuffer_orig(hmmio, pchBuffer, cchBuffer, fuBuffer); } MMRESULT WINAPI mmioFlush( HMMIO hmmio, UINT fuFlush) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioFlush\n"); return mmioFlush_orig( hmmio, fuFlush); } MMRESULT WINAPI mmioAdvance( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuAdvance) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioAdvance\n"); return mmioAdvance_orig( hmmio, pmmioinfo, fuAdvance); } LRESULT WINAPI mmioSendMessage( HMMIO hmmio, UINT uMsg, LPARAM lParam1, LPARAM lParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioSendMessage\n"); return mmioSendMessage_orig(hmmio, uMsg, lParam1, lParam2); } MMRESULT WINAPI mmioDescend( HMMIO hmmio, LPMMCKINFO pmmcki, const MMCKINFO FAR* pmmckiParent, UINT fuDescend) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioDescend\n"); return mmioDescend_orig(hmmio, pmmcki, pmmckiParent, fuDescend); } MMRESULT WINAPI mmioAscend( HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuAscend) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioAscend\n"); return mmioAscend_orig( hmmio, pmmcki, fuAscend); } MMRESULT WINAPI mmioCreateChunk(HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuCreate) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mmioCreateChunk\n"); return mmioCreateChunk_orig(hmmio, pmmcki, fuCreate); } MCIERROR WINAPI mciSendCommandA( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciSendCommandA\n"); return mciSendCommandA_orig( mciId, uMsg, dwParam1, dwParam2); } MCIERROR WINAPI mciSendCommandW( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciSendCommandW\n"); return mciSendCommandW_orig( mciId, uMsg, dwParam1, dwParam2); } MCIERROR WINAPI mciSendStringA( LPCSTR lpstrCommand, LPSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciSendStringA\n"); return mciSendStringA_orig( lpstrCommand, lpstrReturnString, uReturnLength, hwndCallback); } MCIERROR WINAPI mciSendStringW( LPCWSTR lpstrCommand, LPWSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciSendStringW\n"); return mciSendStringW_orig( lpstrCommand, lpstrReturnString, uReturnLength, hwndCallback); } @@ -1375,72 +1535,84 @@ extern "C" { MCIDEVICEID WINAPI mciGetDeviceIDW( LPCWSTR pszDevice) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetDeviceIDW\n"); return mciGetDeviceIDW_orig( pszDevice); } MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDA( DWORD dwElementID, LPCSTR lpstrType ) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetDeviceIDFromElementIDA\n"); return mciGetDeviceIDFromElementIDA_orig( dwElementID, lpstrType ); } MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDW( DWORD dwElementID, LPCWSTR lpstrType ) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetDeviceIDFromElementIDW\n"); return mciGetDeviceIDFromElementIDW_orig( dwElementID, lpstrType ); } DWORD_PTR WINAPI mciGetDriverData(UINT uDeviceID) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetDriverData\n"); return mciGetDriverData_orig(uDeviceID); } BOOL WINAPI mciGetErrorStringA( MCIERROR mcierr, LPSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetErrorStringA\n"); return mciGetErrorStringA_orig( mcierr, pszText, cchText); } BOOL WINAPI mciGetErrorStringW( MCIERROR mcierr, LPWSTR pszText, UINT cchText) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetErrorStringW\n"); return mciGetErrorStringW_orig( mcierr, pszText, cchText); } BOOL WINAPI mciSetDriverData(UINT uDeviceID, DWORD_PTR dwData) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciSetDriverData_type\n"); return mciSetDriverData_orig( uDeviceID, dwData ); } BOOL WINAPI mciSetYieldProc( MCIDEVICEID mciId, YIELDPROC fpYieldProc, DWORD dwYieldData) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciSetYieldProc\n"); return mciSetYieldProc_orig(mciId, fpYieldProc, dwYieldData); } BOOL WINAPI mciFreeCommandResource(UINT uTable) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciFreeCommandResource\n"); return mciFreeCommandResource_orig(uTable); } HTASK WINAPI mciGetCreatorTask( MCIDEVICEID mciId) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetCreatorTask\n"); return mciGetCreatorTask_orig( mciId); } YIELDPROC WINAPI mciGetYieldProc( MCIDEVICEID mciId, LPDWORD pdwYieldData) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciGetYieldProc\n"); return mciGetYieldProc_orig( mciId, pdwYieldData); } UINT WINAPI mciLoadCommandResource(HINSTANCE hInstance, LPCWSTR lpResName, UINT uType) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciLoadCommandResource"); return mciLoadCommandResource_orig(hInstance, lpResName, uType); } @@ -1448,6 +1620,7 @@ extern "C" { BOOL WINAPI mciExecute(LPCSTR pszCommand) { + ll_winmm_shim_initialize(); //OutputDebugString(L"mciExecute\n"); return mciExecute_orig(pszCommand); } diff --git a/indra/media_plugins/winmmshim/forwarding_api.h b/indra/media_plugins/winmmshim/forwarding_api.h index 89a6b347f3..076a08f769 100644 --- a/indra/media_plugins/winmmshim/forwarding_api.h +++ b/indra/media_plugins/winmmshim/forwarding_api.h @@ -30,6 +30,7 @@ #include void init_function_pointers(HMODULE winmm_handle); +void ll_winmm_shim_initialize(); typedef VOID (*LPTASKCALLBACK)(DWORD_PTR dwInst); diff --git a/indra/media_plugins/winmmshim/winmm_shim.cpp b/indra/media_plugins/winmmshim/winmm_shim.cpp index 9563a3b664..6ba95e565e 100644 --- a/indra/media_plugins/winmmshim/winmm_shim.cpp +++ b/indra/media_plugins/winmmshim/winmm_shim.cpp @@ -32,14 +32,21 @@ using std::wstring; static float sVolumeLevel = 1.f; static bool sMute = false; +static CRITICAL_SECTION sCriticalSection; BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { + InitializeCriticalSectionAndSpinCount(&sCriticalSection, 0x00000400); + return TRUE; +} + +void ll_winmm_shim_initialize(){ static bool initialized = false; // do this only once + EnterCriticalSection(&sCriticalSection); if (!initialized) { // bind to original winmm.dll TCHAR system_path[MAX_PATH]; @@ -54,13 +61,14 @@ BOOL APIENTRY DllMain( HMODULE hModule, { // we have a dll, let's get out pointers! initialized = true; init_function_pointers(winmm_handle); - return true; + ::OutputDebugStringA("WINMM_SHIM.DLL: real winmm.dll initialized successfully\n"); + return; } // failed to initialize real winmm.dll - return false; + ::OutputDebugStringA("WINMM_SHIM.DLL: Failed to initialize real winmm.dll\n"); } - return true; + LeaveCriticalSection(&sCriticalSection); } @@ -79,6 +87,7 @@ extern "C" MMRESULT WINAPI waveOutOpen( LPHWAVEOUT phwo, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) { + ll_winmm_shim_initialize(); if (pwfx->wFormatTag != WAVE_FORMAT_PCM || (pwfx->wBitsPerSample != 8 && pwfx->wBitsPerSample != 16)) { // uncompressed 8 and 16 bit sound are the only types we support @@ -97,6 +106,7 @@ extern "C" MMRESULT WINAPI waveOutClose( HWAVEOUT hwo) { + ll_winmm_shim_initialize(); wave_out_map_t::iterator found_it = sWaveOuts.find(hwo); if (found_it != sWaveOuts.end()) { // forget what we know about this handle @@ -108,6 +118,7 @@ extern "C" MMRESULT WINAPI waveOutWrite( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh) { + ll_winmm_shim_initialize(); MMRESULT result = MMSYSERR_NOERROR; if (sMute) -- cgit v1.2.3 From 796a94fc6e8162e4e809bb0c0eff97596ef4904d Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Sun, 17 Apr 2011 09:07:01 -0400 Subject: correct build parameters for Oz viewer beta review build --- BuildParams | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/BuildParams b/BuildParams index deaea5e047..7062327f66 100644 --- a/BuildParams +++ b/BuildParams @@ -157,10 +157,11 @@ media.build_viewer_update_version_manager = false oz-viewer-devreview.build_debug_release_separately = true viewer-devreview.build_debug_release_separately = true oz_viewer-poreview.build_debug_release_separately = true -oz-project-1.build_debug_release_separately = true -oz-project-2.build_debug_release_separately = true +oz_project-1.build_debug_release_separately = true +oz_project-2.build_debug_release_separately = true oz-project-3.build_debug_release_separately = true +oz_viewer-beta-review.build_debug_release_separately = true # ======================================== # enus # ======================================== -- cgit v1.2.3 From d1ba34a8ad7031c6e8362c8136366cf24d512d1f Mon Sep 17 00:00:00 2001 From: Siana Gearz Date: Sun, 17 Apr 2011 11:25:00 -0400 Subject: STORM-1088: corrected fix loading of winmm.dll --- indra/media_plugins/winmmshim/winmm_shim.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/indra/media_plugins/winmmshim/winmm_shim.cpp b/indra/media_plugins/winmmshim/winmm_shim.cpp index 6ba95e565e..47a1e5c018 100644 --- a/indra/media_plugins/winmmshim/winmm_shim.cpp +++ b/indra/media_plugins/winmmshim/winmm_shim.cpp @@ -39,7 +39,7 @@ BOOL APIENTRY DllMain( HMODULE hModule, LPVOID lpReserved ) { - InitializeCriticalSectionAndSpinCount(&sCriticalSection, 0x00000400); + InitializeCriticalSection(&sCriticalSection); return TRUE; } @@ -62,11 +62,12 @@ void ll_winmm_shim_initialize(){ initialized = true; init_function_pointers(winmm_handle); ::OutputDebugStringA("WINMM_SHIM.DLL: real winmm.dll initialized successfully\n"); - return; } - - // failed to initialize real winmm.dll - ::OutputDebugStringA("WINMM_SHIM.DLL: Failed to initialize real winmm.dll\n"); + else + { + // failed to initialize real winmm.dll + ::OutputDebugStringA("WINMM_SHIM.DLL: Failed to initialize real winmm.dll\n"); + } } LeaveCriticalSection(&sCriticalSection); } -- cgit v1.2.3 From da8f6c675e9a58d4b808aa0ba2917e767106d7a0 Mon Sep 17 00:00:00 2001 From: Siana Gearz Date: Sun, 17 Apr 2011 11:25:00 -0400 Subject: STORM-1088: corrected fix loading of winmm.dll --- indra/media_plugins/winmmshim/winmm_shim.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/indra/media_plugins/winmmshim/winmm_shim.cpp b/indra/media_plugins/winmmshim/winmm_shim.cpp index 6ba95e565e..47a1e5c018 100644 --- a/indra/media_plugins/winmmshim/winmm_shim.cpp +++ b/indra/media_plugins/winmmshim/winmm_shim.cpp @@ -39,7 +39,7 @@ BOOL APIENTRY DllMain( HMODULE hModule, LPVOID lpReserved ) { - InitializeCriticalSectionAndSpinCount(&sCriticalSection, 0x00000400); + InitializeCriticalSection(&sCriticalSection); return TRUE; } @@ -62,11 +62,12 @@ void ll_winmm_shim_initialize(){ initialized = true; init_function_pointers(winmm_handle); ::OutputDebugStringA("WINMM_SHIM.DLL: real winmm.dll initialized successfully\n"); - return; } - - // failed to initialize real winmm.dll - ::OutputDebugStringA("WINMM_SHIM.DLL: Failed to initialize real winmm.dll\n"); + else + { + // failed to initialize real winmm.dll + ::OutputDebugStringA("WINMM_SHIM.DLL: Failed to initialize real winmm.dll\n"); + } } LeaveCriticalSection(&sCriticalSection); } -- cgit v1.2.3 From d534c8009f2573400a21c19b00691536fc3cc23f Mon Sep 17 00:00:00 2001 From: "Debi King (Dessie)" Date: Mon, 18 Apr 2011 09:53:19 -0400 Subject: Added tag DRTVWR-48_2.6.3-beta2, 2.6.3-beta2 for changeset 0630e977504a --- .hgtags | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.hgtags b/.hgtags index 2cc1d48575..04dc75d2cb 100644 --- a/.hgtags +++ b/.hgtags @@ -97,3 +97,5 @@ d1203046bb653b763f835b04d184646949d8dd5c 2.6.2-beta1 ec32f1045e7c2644015245df3a9933620aa194b8 2.6.3-start d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc DRTVWR-47_2.6.3-beta1 d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc 2.6.3-beta1 +0630e977504af5ea320c58d33cae4e1ddee793e9 DRTVWR-48_2.6.3-beta2 +0630e977504af5ea320c58d33cae4e1ddee793e9 2.6.3-beta2 -- cgit v1.2.3 From 8d2943c5ddd08ce7a40d42325206f882c99f497a Mon Sep 17 00:00:00 2001 From: Leslie Linden Date: Mon, 18 Apr 2011 14:08:29 -0700 Subject: Fixed debug information format for mac to allow breakpoints to work under Xcode. --- indra/cmake/Variables.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake index 77dd34d122..b6710300bb 100644 --- a/indra/cmake/Variables.cmake +++ b/indra/cmake/Variables.cmake @@ -102,7 +102,7 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") set(CMAKE_OSX_DEPLOYMENT_TARGET 10.5) set(CMAKE_OSX_SYSROOT /Developer/SDKs/MacOSX10.5.sdk) set(CMAKE_XCODE_ATTRIBUTE_GCC_VERSION "4.2") - set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT "DWARF with dSYM File") + set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT dwarf-with-dsym) # NOTE: To attempt an i386/PPC Universal build, add this on the configure line: # -DCMAKE_OSX_ARCHITECTURES:STRING='i386;ppc' -- cgit v1.2.3 From 2411a107e717816629817a9f2fe85d3c7cb254ab Mon Sep 17 00:00:00 2001 From: Leyla Farazha Date: Mon, 18 Apr 2011 14:22:23 -0700 Subject: EXP-628 Inventory floater may be opened by SLApp EXP-630 My appearance floater may be opened by SLApp EXP-633 Search floater can be opened by SLApps --- indra/newview/app_settings/settings.xml | 33 ++++++++++++++++ indra/newview/app_settings/settings_minimal.xml | 33 ++++++++++++++++ indra/newview/llappearancemgr.cpp | 6 +++ indra/newview/llfloatersearch.cpp | 7 ++++ indra/newview/llviewerinventory.cpp | 6 +++ .../newview/skins/default/xui/en/notifications.xml | 44 +++++++++++++++++++++- 6 files changed, 128 insertions(+), 1 deletion(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index b602362cd0..f2a0e5ac19 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -12585,6 +12585,39 @@ Boolean Value 1 + + EnableInventory + + Comment + Enable opening inventory from web link + Persist + 1 + Type + Boolean + Value + 1 + + EnableSearch + + Comment + Enable opening search from web link + Persist + 1 + Type + Boolean + Value + 1 + + EnableAppearance + + Comment + Enable opening appearance from web link + Persist + 1 + Type + Boolean + Value + 1 SearchFromAddressBar diff --git a/indra/newview/app_settings/settings_minimal.xml b/indra/newview/app_settings/settings_minimal.xml index 490da2c9d4..bc97ec00e9 100644 --- a/indra/newview/app_settings/settings_minimal.xml +++ b/indra/newview/app_settings/settings_minimal.xml @@ -303,6 +303,39 @@ Value 0 + EnableInventory + + Comment + Enable opening inventory from web link + Persist + 1 + Type + Boolean + Value + 0 + + EnableSearch + + Comment + Enable opening search from web link + Persist + 1 + Type + Boolean + Value + 0 + + EnableAppearance + + Comment + Enable opening appearance from web link + Persist + 1 + Type + Boolean + Value + 0 + DoubleClickShowWorldMap Comment diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 1cf552e42c..f9e850899a 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -110,6 +110,12 @@ public: { // support secondlife:///app/appearance/show, but for now we just // make all secondlife:///app/appearance SLapps behave this way + if (!LLUI::sSettingGroups["config"]->getBOOL("EnableAppearance")) + { + LLNotificationsUtil::add("NoAppearance", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit")); + return true; + } + LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD()); return true; } diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp index 2041fac8d8..d5806e375c 100644 --- a/indra/newview/llfloatersearch.cpp +++ b/indra/newview/llfloatersearch.cpp @@ -31,6 +31,7 @@ #include "llfloaterreg.h" #include "llfloatersearch.h" #include "llmediactrl.h" +#include "llnotificationsutil.h" #include "lllogininstance.h" #include "lluri.h" #include "llagent.h" @@ -46,6 +47,12 @@ public: LLSearchHandler() : LLCommandHandler("search", UNTRUSTED_THROTTLE) { } bool handle(const LLSD& tokens, const LLSD& query_map, LLMediaCtrl* web) { + if (!LLUI::sSettingGroups["config"]->getBOOL("EnableSearch")) + { + LLNotificationsUtil::add("NoSearch", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit")); + return true; + } + const size_t parts = tokens.size(); // get the (optional) category for the search diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 519514d99c..68011ebf07 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -183,6 +183,12 @@ public: return false; } + if (!LLUI::sSettingGroups["config"]->getBOOL("EnableInventory")) + { + LLNotificationsUtil::add("NoInventory", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit")); + return true; + } + // support secondlife:///app/inventory/show if (params[0].asString() == "show") { diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 8f5a95a504..cd25a2a8dd 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -7213,7 +7213,49 @@ The site at '<nolink>[HOST_NAME]</nolink>' in realm ' yestext="Quit" notext="Don't Quit"/> - + + + fail + confirm + Viewing inventory is only available in Advanced mode. Would you like to logout and change modes? + + + + + fail + confirm + The appearance editor is only available in Advanced mode. Would you like to logout and change modes? + + + + + fail + confirm + Search is only available in Advanced mode. Would you like to logout and change modes? + + + - Your CPU speed does not meet the minimum requirements. -- cgit v1.2.3 From 64d20b8b745c184464c2a2f0795aeff0124ea3c5 Mon Sep 17 00:00:00 2001 From: Leslie Linden Date: Tue, 19 Apr 2011 11:13:36 -0700 Subject: EXP-631 FIX -- REGRESSION - Clicking people button in Basic mode does not toggle the People panel to close EXP-640 FIX -- [PUBLIC] Ctrl+I doesn't close side tray LLSideTray::hidePanel now checks if the parent is the side tray or if it is a child to a detached tab to determine what panel to attempt to close. Reviewed by Leyla --- indra/newview/llsidetray.cpp | 99 ++++++++++++++++++++++++++++---------------- indra/newview/llsidetray.h | 2 +- 2 files changed, 64 insertions(+), 37 deletions(-) diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 4f18ee1da2..e4c2293938 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -1192,6 +1192,38 @@ void LLSideTray::reshape(S32 width, S32 height, BOOL called_from_parent) arrange(); } +// This is just LLView::findChildView specialized to restrict the search to LLPanels. +// Optimization for EXT-4068 to avoid searching down to the individual item level +// when inventories are large. +LLPanel *findChildPanel(LLPanel *panel, const std::string& name, bool recurse) +{ + for (LLView::child_list_const_iter_t child_it = panel->beginChild(); + child_it != panel->endChild(); ++child_it) + { + LLPanel *child_panel = dynamic_cast(*child_it); + if (!child_panel) + continue; + if (child_panel->getName() == name) + return child_panel; + } + if (recurse) + { + for (LLView::child_list_const_iter_t child_it = panel->beginChild(); + child_it != panel->endChild(); ++child_it) + { + LLPanel *child_panel = dynamic_cast(*child_it); + if (!child_panel) + continue; + LLPanel *found_panel = findChildPanel(child_panel,name,recurse); + if (found_panel) + { + return found_panel; + } + } + } + return NULL; +} + /** * Activate tab with "panel_name" panel * if no such tab - return false, otherwise true. @@ -1221,23 +1253,50 @@ LLPanel* LLSideTray::showPanel (const std::string& panel_name, const LLSD& para return new_panel; } -void LLSideTray::hidePanel(const std::string& panel_name) +bool LLSideTray::hidePanel(const std::string& panel_name) { + bool panelHidden = false; + LLPanel* panelp = getPanel(panel_name); + if (panelp) { - if(isTabAttached(panel_name)) + LLView* parentp = panelp->getParent(); + + // Collapse the side bar if the panel or the panel's parent is an attached tab + if (isTabAttached(panel_name) || (parentp && isTabAttached(parentp->getName()))) { collapseSideBar(); + panelHidden = true; } else { - LLFloaterReg::hideInstance("side_bar_tab", panel_name); + panelHidden = LLFloaterReg::hideInstance("side_bar_tab", panel_name); + + if (!panelHidden) + { + // Look up the panel in the list of detached tabs. + for (child_vector_const_iter_t child_it = mDetachedTabs.begin(); child_it != mDetachedTabs.end(); ++child_it) + { + LLPanel *detached_panel = dynamic_cast(*child_it); + + if (detached_panel) + { + // Hide this detached panel if it is a parent of our panel + if (findChildPanel(detached_panel, panel_name, true) != NULL) + { + panelHidden = LLFloaterReg::hideInstance("side_bar_tab", detached_panel->getName()); + break; + } + } + } + } } } + + return panelHidden; } - void LLSideTray::togglePanel(LLPanel* &sub_panel, const std::string& panel_name, const LLSD& params) { if(!sub_panel) @@ -1255,38 +1314,6 @@ void LLSideTray::togglePanel(LLPanel* &sub_panel, const std::string& panel_name, } } -// This is just LLView::findChildView specialized to restrict the search to LLPanels. -// Optimization for EXT-4068 to avoid searching down to the individual item level -// when inventories are large. -LLPanel *findChildPanel(LLPanel *panel, const std::string& name, bool recurse) -{ - for (LLView::child_list_const_iter_t child_it = panel->beginChild(); - child_it != panel->endChild(); ++child_it) - { - LLPanel *child_panel = dynamic_cast(*child_it); - if (!child_panel) - continue; - if (child_panel->getName() == name) - return child_panel; - } - if (recurse) - { - for (LLView::child_list_const_iter_t child_it = panel->beginChild(); - child_it != panel->endChild(); ++child_it) - { - LLPanel *child_panel = dynamic_cast(*child_it); - if (!child_panel) - continue; - LLPanel *found_panel = findChildPanel(child_panel,name,recurse); - if (found_panel) - { - return found_panel; - } - } - } - return NULL; -} - LLPanel* LLSideTray::getPanel(const std::string& panel_name) { // Look up the panel in the list of detached tabs. diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h index 1dddd9e9bc..46765bfbcc 100644 --- a/indra/newview/llsidetray.h +++ b/indra/newview/llsidetray.h @@ -104,7 +104,7 @@ public: */ LLPanel* showPanel (const std::string& panel_name, const LLSD& params = LLSD()); - void hidePanel (const std::string& panel_name); + bool hidePanel (const std::string& panel_name); /** * Toggling Side Tray tab which contains "sub_panel" child of "panel_name" panel. -- cgit v1.2.3 From 3f37b76a4a00f0696ea5a3881810bd04eccbba18 Mon Sep 17 00:00:00 2001 From: Leyla Farazha Date: Tue, 19 Apr 2011 13:48:51 -0700 Subject: fixing destination tooltip --- indra/newview/skins/minimal/xui/en/panel_bottomtray.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml index 0145de8be9..a250f95e4f 100644 --- a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml @@ -163,7 +163,7 @@ layout="topleft" left="0" name="destination_btn" - tool_tip="Shows people window" + tool_tip="Shows destinations window" top="5" is_toggle="true" use_ellipses="true" -- cgit v1.2.3 From f9cda66629d372fd3453e6244a381c1f60661931 Mon Sep 17 00:00:00 2001 From: Merov Linden Date: Tue, 19 Apr 2011 14:00:37 -0700 Subject: EXP-728 : Fix crash when taking large unconstrained snapshots + code cleanup --- indra/newview/llviewerwindow.cpp | 154 +++++++++++++++++++-------------------- 1 file changed, 76 insertions(+), 78 deletions(-) diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 8ce15c7dfc..a6404058b0 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -3967,7 +3967,9 @@ BOOL LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 p return rawSnapshot(raw, preview_width, preview_height, FALSE, FALSE, show_ui, do_rebuild, type); } -// Saves the image from the screen to the specified filename and path. +// Saves the image from the screen to a raw image +// Since the required size might be bigger than the available screen, this method rerenders the scene in parts (called subimages) and copy +// the results over to the final raw image. BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, BOOL keep_window_aspect, BOOL is_texture, BOOL show_ui, BOOL do_rebuild, ESnapshotType type, S32 max_size) { @@ -3985,8 +3987,6 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei // Hide all the UI widgets first and draw a frame BOOL prev_draw_ui = gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI) ? TRUE : FALSE; - show_ui = show_ui ? TRUE : FALSE; - if ( prev_draw_ui != show_ui) { LLPipeline::toggleRenderDebugFeature((void*)LLPipeline::RENDER_DEBUG_FEATURE_UI); @@ -4006,55 +4006,49 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei // from window LLRect window_rect = show_ui ? getWindowRectRaw() : getWorldViewRectRaw(); - S32 snapshot_width = window_rect.getWidth(); + S32 snapshot_width = window_rect.getWidth(); S32 snapshot_height = window_rect.getHeight(); // SNAPSHOT - S32 window_width = snapshot_width; + S32 window_width = snapshot_width; S32 window_height = snapshot_height; + // Note: Scaling of the UI is currently *not* supported so we limit the output size if UI is requested if (show_ui) { - image_width = llmin(image_width, window_width); + // If the user wants the UI, limit the output size to the available screen size + image_width = llmin(image_width, window_width); image_height = llmin(image_height, window_height); } F32 scale_factor = 1.0f ; - if(!keep_window_aspect) //image cropping - { + if (!keep_window_aspect || (image_width > window_width) || (image_height > window_height)) + { + // if image cropping or need to enlarge the scene, compute a scale_factor F32 ratio = llmin( (F32)window_width / image_width , (F32)window_height / image_height) ; - snapshot_width = (S32)(ratio * image_width) ; + snapshot_width = (S32)(ratio * image_width) ; snapshot_height = (S32)(ratio * image_height) ; scale_factor = llmax(1.0f, 1.0f / ratio) ; } - else //the scene(window) proportion needs to be maintained. - { - if(image_width > window_width || image_height > window_height) //need to enlarge the scene - { - F32 ratio = llmin( (F32)window_width / image_width , (F32)window_height / image_height) ; - snapshot_width = (S32)(ratio * image_width) ; - snapshot_height = (S32)(ratio * image_height) ; - scale_factor = llmax(1.0f, 1.0f / ratio) ; - } - } if (show_ui && scale_factor > 1.f) { + // Note: we should never get there... llwarns << "over scaling UI not supported." << llendl; } - S32 buffer_x_offset = llfloor(((window_width - snapshot_width) * scale_factor) / 2.f); + S32 buffer_x_offset = llfloor(((window_width - snapshot_width) * scale_factor) / 2.f); S32 buffer_y_offset = llfloor(((window_height - snapshot_height) * scale_factor) / 2.f); - S32 image_buffer_x = llfloor(snapshot_width*scale_factor) ; - S32 image_buffer_y = llfloor(snapshot_height *scale_factor) ; + S32 image_buffer_x = llfloor(snapshot_width * scale_factor) ; + S32 image_buffer_y = llfloor(snapshot_height * scale_factor) ; - if(image_buffer_x > max_size || image_buffer_y > max_size) //boundary check to avoid memory overflow + if ((image_buffer_x > max_size) || (image_buffer_y > max_size)) // boundary check to avoid memory overflow { scale_factor *= llmin((F32)max_size / image_buffer_x, (F32)max_size / image_buffer_y) ; - image_buffer_x = llfloor(snapshot_width*scale_factor) ; - image_buffer_y = llfloor(snapshot_height *scale_factor) ; + image_buffer_x = llfloor(snapshot_width * scale_factor) ; + image_buffer_y = llfloor(snapshot_height * scale_factor) ; } - if(image_buffer_x > 0 && image_buffer_y > 0) + if ((image_buffer_x > 0) && (image_buffer_y > 0)) { raw->resize(image_buffer_x, image_buffer_y, 3); } @@ -4062,7 +4056,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei { return FALSE ; } - if(raw->isBufferInvalid()) + if (raw->isBufferInvalid()) { return FALSE ; } @@ -4070,6 +4064,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei BOOL high_res = scale_factor >= 2.f; // Font scaling is slow, only do so if rez is much higher if (high_res && show_ui) { + // Note: we should never get there... llwarns << "High res UI snapshot not supported. " << llendl; /*send_agent_pause(); //rescale fonts @@ -4084,6 +4079,8 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei gObjectList.generatePickList(*LLViewerCamera::getInstance()); + // Subimages are in fact partial rendering of the final view. This happens when the final view is bigger than the screen. + // In most common cases, scale_factor is 1 and there's no more than 1 iteration on x and y for (int subimage_y = 0; subimage_y < scale_factor; ++subimage_y) { S32 subimage_y_offset = llclamp(buffer_y_offset - (subimage_y * window_height), 0, window_height);; @@ -4097,69 +4094,70 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei gDisplaySwapBuffers = FALSE; gDepthDirty = TRUE; - const U32 subfield = subimage_x+(subimage_y*llceil(scale_factor)); - - if (LLPipeline::sRenderDeferred) - { - display(do_rebuild, scale_factor, subfield, TRUE); - } - else - { - display(do_rebuild, scale_factor, subfield, TRUE); - // Required for showing the GUI in snapshots and performing bloom composite overlay - // Call even if show_ui is FALSE - render_ui(scale_factor, subfield); - } - S32 subimage_x_offset = llclamp(buffer_x_offset - (subimage_x * window_width), 0, window_width); // handle fractional rows U32 read_width = llmax(0, (window_width - subimage_x_offset) - llmax(0, (window_width * (subimage_x + 1)) - (buffer_x_offset + raw->getWidth()))); - for(U32 out_y = 0; out_y < read_height ; out_y++) + + // Skip rendering and sampling altogether if either width or height is degenerated to 0 (common in cropping cases) + if (read_width && read_height) { - S32 output_buffer_offset = ( - (out_y * (raw->getWidth())) // ...plus iterated y... - + (window_width * subimage_x) // ...plus subimage start in x... - + (raw->getWidth() * window_height * subimage_y) // ...plus subimage start in y... - - output_buffer_offset_x // ...minus buffer padding x... - - (output_buffer_offset_y * (raw->getWidth())) // ...minus buffer padding y... - ) * raw->getComponents(); + const U32 subfield = subimage_x+(subimage_y*llceil(scale_factor)); + display(do_rebuild, scale_factor, subfield, TRUE); - // Ping the wathdog thread every 100 lines to keep us alive (arbitrary number, feel free to change) - if (out_y % 100 == 0) + if (!LLPipeline::sRenderDeferred) { - LLAppViewer::instance()->pingMainloopTimeout("LLViewerWindow::rawSnapshot"); + // Required for showing the GUI in snapshots and performing bloom composite overlay + // Call even if show_ui is FALSE + render_ui(scale_factor, subfield); } - if (type == SNAPSHOT_TYPE_COLOR) + for (U32 out_y = 0; out_y < read_height ; out_y++) { - glReadPixels( - subimage_x_offset, out_y + subimage_y_offset, - read_width, 1, - GL_RGB, GL_UNSIGNED_BYTE, - raw->getData() + output_buffer_offset - ); - } - else // SNAPSHOT_TYPE_DEPTH - { - LLPointer depth_line_buffer = new LLImageRaw(read_width, 1, sizeof(GL_FLOAT)); // need to store floating point values - glReadPixels( - subimage_x_offset, out_y + subimage_y_offset, - read_width, 1, - GL_DEPTH_COMPONENT, GL_FLOAT, - depth_line_buffer->getData()// current output pixel is beginning of buffer... - ); - - for (S32 i = 0; i < (S32)read_width; i++) + S32 output_buffer_offset = ( + (out_y * (raw->getWidth())) // ...plus iterated y... + + (window_width * subimage_x) // ...plus subimage start in x... + + (raw->getWidth() * window_height * subimage_y) // ...plus subimage start in y... + - output_buffer_offset_x // ...minus buffer padding x... + - (output_buffer_offset_y * (raw->getWidth())) // ...minus buffer padding y... + ) * raw->getComponents(); + + // Ping the watchdog thread every 100 lines to keep us alive (arbitrary number, feel free to change) + if (out_y % 100 == 0) { - F32 depth_float = *(F32*)(depth_line_buffer->getData() + (i * sizeof(F32))); - - F32 linear_depth_float = 1.f / (depth_conversion_factor_1 - (depth_float * depth_conversion_factor_2)); - U8 depth_byte = F32_to_U8(linear_depth_float, LLViewerCamera::getInstance()->getNear(), LLViewerCamera::getInstance()->getFar()); - //write converted scanline out to result image - for(S32 j = 0; j < raw->getComponents(); j++) + LLAppViewer::instance()->pingMainloopTimeout("LLViewerWindow::rawSnapshot"); + } + + if (type == SNAPSHOT_TYPE_COLOR) + { + glReadPixels( + subimage_x_offset, out_y + subimage_y_offset, + read_width, 1, + GL_RGB, GL_UNSIGNED_BYTE, + raw->getData() + output_buffer_offset + ); + } + else // SNAPSHOT_TYPE_DEPTH + { + LLPointer depth_line_buffer = new LLImageRaw(read_width, 1, sizeof(GL_FLOAT)); // need to store floating point values + glReadPixels( + subimage_x_offset, out_y + subimage_y_offset, + read_width, 1, + GL_DEPTH_COMPONENT, GL_FLOAT, + depth_line_buffer->getData()// current output pixel is beginning of buffer... + ); + + for (S32 i = 0; i < (S32)read_width; i++) { - *(raw->getData() + output_buffer_offset + (i * raw->getComponents()) + j) = depth_byte; + F32 depth_float = *(F32*)(depth_line_buffer->getData() + (i * sizeof(F32))); + + F32 linear_depth_float = 1.f / (depth_conversion_factor_1 - (depth_float * depth_conversion_factor_2)); + U8 depth_byte = F32_to_U8(linear_depth_float, LLViewerCamera::getInstance()->getNear(), LLViewerCamera::getInstance()->getFar()); + // write converted scanline out to result image + for (S32 j = 0; j < raw->getComponents(); j++) + { + *(raw->getData() + output_buffer_offset + (i * raw->getComponents()) + j) = depth_byte; + } } } } -- cgit v1.2.3 From 2147889a2e6acbcf233692d17a0b638a0e8eaec7 Mon Sep 17 00:00:00 2001 From: seth_productengine Date: Wed, 20 Apr 2011 01:17:41 +0300 Subject: STORM-320 FIXED navigation with arrow keys through the text with enabled word-wrapping. --- indra/llui/lltextbase.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 82269282ef..fd7bb699f8 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -2022,11 +2022,10 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round, pos = segment_line_start + offset; break; } - else if (hit_past_end_of_line && segmentp->getEnd() > line_iter->mDocIndexEnd - 1) + else if (hit_past_end_of_line && segmentp->getEnd() >= line_iter->mDocIndexEnd) { // segment wraps to next line, so just set doc pos to the end of the line - // segment wraps to next line, so just set doc pos to start of next line (represented by mDocIndexEnd) - pos = llmin(getLength(), line_iter->mDocIndexEnd); + pos = llclamp(line_iter->mDocIndexEnd - 1, 0, getLength()); break; } start_x += text_width; -- cgit v1.2.3 From 609523d6f7c9b656eada861084bf49f0c5e77e19 Mon Sep 17 00:00:00 2001 From: Leyla Farazha Date: Tue, 19 Apr 2011 15:35:31 -0700 Subject: EXP-635 Action buttons missing on IM floater --- .../minimal/xui/en/panel_im_control_panel.xml | 64 ++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml index 53def54aca..c3f46f11e0 100644 --- a/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml +++ b/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml @@ -23,5 +23,69 @@ orientation="vertical" top_pad="5" width="145"> + + - - - + + + - - - - - - + + + + + diff --git a/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml index 5730adab8a..39d1a90850 100644 --- a/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml +++ b/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml @@ -42,5 +42,40 @@ show_speaking_indicator="false" width="147" /> + + - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file -- cgit v1.2.3 From 9c6dd947bd94a863d3c3d6e6bd38fa7d06bfc924 Mon Sep 17 00:00:00 2001 From: Loren Shih Date: Thu, 21 Apr 2011 19:49:03 -0400 Subject: SH-1381 Avatar Physics behavior is tightly tied to viewer framerate Changed physics algorithm to perform integration over several steps if framerate is slow. Fixed a fundamental issue in the algorithm where timestep wasn't being used to calculate velocity changes. Had to change around some parameter ranges since the physics are calculated slightly differently now. --- indra/newview/character/avatar_lad.xml | 72 +++++++++++++------------- indra/newview/llphysicsmotion.cpp | 94 ++++++++++++++++------------------ 2 files changed, 79 insertions(+), 87 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index ec162e3608..ce15c4b8f7 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -4352,8 +4352,8 @@ wearable="shape" edit_group="driven" value_default="0" - value_min="-1.5" - value_max="1.5"> + value_min="-1.25" + value_max="1.25"> @@ -11875,7 +11875,7 @@ render_pass="bump"> edit_group="physics_advanced" value_default="0" value_min="0" - value_max=".1"> + value_max="30"> @@ -11887,9 +11887,9 @@ render_pass="bump"> label="Breast Physics Drag" wearable="physics" edit_group="physics_advanced" - value_default=".15" + value_default="1" value_min="0" - value_max=".5"> + value_max="10"> @@ -11914,9 +11914,9 @@ render_pass="bump"> label="Breast Physics UpDown Spring" wearable="physics" edit_group="physics_breasts_updown" - value_default=".1" + value_default="10" value_min="0" - value_max="3"> + value_max="100"> label="Breast Physics UpDown Damping" wearable="physics" edit_group="physics_breasts_updown" - value_default=".05" + value_default=".2" value_min="0" - value_max=".1" - camera_elevation=".3" - camera_distance=".8"> + value_max="1"> @@ -11969,9 +11967,9 @@ render_pass="bump"> label="Breast Physics InOut Spring" wearable="physics" edit_group="physics_breasts_inout" - value_default=".1" + value_default="10" value_min="0" - value_max="3"> + value_max="100"> label="Breast Physics InOut Damping" wearable="physics" edit_group="physics_breasts_inout" - value_default=".05" + value_default=".2" value_min="0" - value_max=".1"> + value_max="1"> @@ -12022,7 +12020,7 @@ render_pass="bump"> edit_group="physics_advanced" value_default="0" value_min="0" - value_max=".1"> + value_max="30"> label="Belly Physics Drag" wearable="physics" edit_group="physics_advanced" - value_default=".15" + value_default="1" value_min="0" - value_max=".5"> + value_max="10"> label="Belly Physics UpDown Spring" wearable="physics" edit_group="physics_belly_updown" - value_default=".1" + value_default="10" value_min="0" - value_max="3"> + value_max="100"> label="Belly Physics UpDown Damping" wearable="physics" edit_group="physics_belly_updown" - value_default=".05" + value_default=".2" value_min="0" - value_max=".1"> + value_max="1"> @@ -12107,7 +12105,7 @@ render_pass="bump"> edit_group="physics_advanced" value_default="0" value_min="0" - value_max=".1"> + value_max="30"> label="Butt Physics Drag" wearable="physics" edit_group="physics_advanced" - value_default=".15" + value_default="1" value_min="0" - value_max=".5"> + value_max="10"> @@ -12142,9 +12140,9 @@ render_pass="bump"> label="Butt Physics UpDown Spring" wearable="physics" edit_group="physics_butt_updown" - value_default=".1" + value_default="10" value_min="0" - value_max="3"> + value_max="100"> label="Butt Physics UpDown Damping" wearable="physics" edit_group="physics_butt_updown" - value_default=".05" + value_default=".2" value_min="0" - value_max=".1"> + value_max="1"> @@ -12191,9 +12189,9 @@ render_pass="bump"> label="Butt Physics LeftRight Spring" wearable="physics" edit_group="physics_butt_leftright" - value_default=".1" + value_default="10" value_min="0" - value_max="3"> + value_max="100"> label="Butt Physics LeftRight Damping" wearable="physics" edit_group="physics_butt_leftright" - value_default=".05" + value_default=".2" value_min="0" - value_max=".1"> + value_max="1"> @@ -12242,9 +12240,9 @@ render_pass="bump"> label="Breast Physics LeftRight Spring" wearable="physics" edit_group="physics_breasts_leftright" - value_default=".1" + value_default="10" value_min="0" - value_max="3"> + value_max="100"> label="Breast Physics LeftRight Damping" wearable="physics" edit_group="physics_breasts_leftright" - value_default=".05" + value_default=".2" value_min="0" - value_max=".1"> + value_max="1"> diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index e4335d968f..7c199085c0 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -126,9 +126,8 @@ protected: F32 behavior_maxeffect); F32 toLocal(const LLVector3 &world); - F32 calculateVelocity_local(const F32 time_delta); - F32 calculateAcceleration_local(F32 velocity_local, - const F32 time_delta); + F32 calculateVelocity_local(); + F32 calculateAcceleration_local(F32 velocity_local); private: const std::string mParamDriverName; const std::string mParamControllerName; @@ -379,19 +378,20 @@ F32 LLPhysicsMotion::toLocal(const LLVector3 &world) return world * dir_world; } -F32 LLPhysicsMotion::calculateVelocity_local(const F32 time_delta) +F32 LLPhysicsMotion::calculateVelocity_local() { + const F32 world_to_model_scale = 10.0f; LLJoint *joint = mJointState->getJoint(); const LLVector3 position_world = joint->getWorldPosition(); const LLQuaternion rotation_world = joint->getWorldRotation(); const LLVector3 last_position_world = mPosition_world; - const LLVector3 velocity_world = (position_world-last_position_world) / time_delta; + const LLVector3 positionchange_world = (position_world-last_position_world) * world_to_model_scale; + const LLVector3 velocity_world = positionchange_world; const F32 velocity_local = toLocal(velocity_world); return velocity_local; } -F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local, - const F32 time_delta) +F32 LLPhysicsMotion::calculateAcceleration_local(const F32 velocity_local) { // const F32 smoothing = getParamValue("Smoothing"); static const F32 smoothing = 3.0f; // Removed smoothing param since it's probably not necessary @@ -483,7 +483,31 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) if (physics_test) behavior_maxeffect = 1.0f; - BOOL update_visuals = FALSE; + // Normalize the param position to be from [0,1]. + // We have to use normalized values because there may be more than one driven param, + // and each of these driven params may have its own range. + // This means we'll do all our calculations in normalized [0,1] local coordinates. + const F32 position_user_local = (mParamDriver->getWeight() - mParamDriver->getMinWeight()) / (mParamDriver->getMaxWeight() - mParamDriver->getMinWeight()); + + // + // End parameters and settings + //////////////////////////////////////////////////////////////////////////////// + + + //////////////////////////////////////////////////////////////////////////////// + // Calculate velocity and acceleration in parameter space. + // + + //const F32 velocity_joint_local = calculateVelocity_local(time_iteration_step); + const F32 velocity_joint_local = calculateVelocity_local(); + const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local); + + // + // End velocity and acceleration + //////////////////////////////////////////////////////////////////////////////// + + BOOL update_visuals = FALSE; + // Break up the physics into a bunch of iterations so that differing framerates will show // roughly the same behavior. for (F32 time_iteration = 0; time_iteration <= time_delta; time_iteration += TIME_ITERATION_STEP) @@ -491,46 +515,20 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) F32 time_iteration_step = TIME_ITERATION_STEP; if (time_iteration + TIME_ITERATION_STEP > time_delta) { - time_iteration_step = time_delta; + time_iteration_step = time_delta-time_iteration; } - // mPositon_local should be in normalized 0,1 range already. Just making sure... - F32 position_current_local = llclamp(mPosition_local, - 0.0f, - 1.0f); - - // Normalize the param position to be from [0,1]. - // We have to use normalized values because there may be more than one driven param, - // and each of these driven params may have its own range. - // This means we'll do all our calculations in normalized [0,1] local coordinates. - F32 position_user_local = mParamDriver->getWeight(); - position_user_local = (position_user_local - mParamDriver->getMinWeight()) / (mParamDriver->getMaxWeight() - mParamDriver->getMinWeight()); - + const F32 position_current_local = llclamp(mPosition_local, + 0.0f, + 1.0f); // If the effect is turned off then don't process unless we need one more update // to set the position to the default (i.e. user) position. if ((behavior_maxeffect == 0) && (position_current_local == position_user_local)) { - return FALSE; + return update_visuals; } - // - // End parameters and settings - //////////////////////////////////////////////////////////////////////////////// - - - //////////////////////////////////////////////////////////////////////////////// - // Calculate velocity and acceleration in parameter space. - // - - const F32 velocity_joint_local = calculateVelocity_local(time_iteration_step); - const F32 acceleration_joint_local = calculateAcceleration_local(velocity_joint_local, time_iteration_step); - - // - // End velocity and acceleration - //////////////////////////////////////////////////////////////////////////////// - - //////////////////////////////////////////////////////////////////////////////// // Calculate the total force // @@ -547,7 +545,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) // Gravity always points downward in world space. // F = mg const LLVector3 gravity_world(0,0,1); - const F32 force_gravity = behavior_gain * (toLocal(gravity_world) * behavior_gravity * behavior_mass); + const F32 force_gravity = (toLocal(gravity_world) * behavior_gravity * behavior_mass); // Damping is a restoring force that opposes the current velocity. // F = -kv @@ -575,10 +573,10 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) // Calculate the new acceleration based on the net force. // a = F/m const F32 acceleration_new_local = force_net / behavior_mass; - static const F32 max_acceleration = 10.0f; // magic number, used to be customizable. - F32 velocity_new_local = mVelocity_local + acceleration_new_local; + static const F32 max_velocity = 100.0f; // magic number, used to be customizable. + F32 velocity_new_local = mVelocity_local + acceleration_new_local*time_iteration_step; velocity_new_local = llclamp(velocity_new_local, - -max_acceleration, max_acceleration); + -max_velocity, max_velocity); // Temporary debugging setting to cause all avatars to move, for profiling purposes. if (physics_test) @@ -604,8 +602,6 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) (position_new_local != position_new_local)) { position_new_local = 0; - position_current_local = 0; - position_user_local = 0; mVelocity_local = 0; mVelocityJoint_local = 0; mAccelerationJoint_local = 0; @@ -674,16 +670,14 @@ BOOL LLPhysicsMotion::onUpdate(F32 time) // End update visual params //////////////////////////////////////////////////////////////////////////////// - mVelocityJoint_local = velocity_joint_local; - mVelocity_local = velocity_new_local; mAccelerationJoint_local = acceleration_joint_local; mPosition_local = position_new_local; - - mPosition_world = joint->getWorldPosition(); - } mLastTime = time; + mPosition_world = joint->getWorldPosition(); + mVelocityJoint_local = velocity_joint_local; + /* // Write out debugging info into a spreadsheet. -- cgit v1.2.3 From af6f2c8b2291a3ac43de899b8520a89e5ecc2657 Mon Sep 17 00:00:00 2001 From: Loren Shih Date: Thu, 21 Apr 2011 20:30:38 -0400 Subject: SH-1381 FIXED Avatar Physics behavior is tightly tied to viewer framerate Changed range of gain; previous range was too small. --- indra/newview/llphysicsmotion.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 7c199085c0..6851e7bb1a 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -380,7 +380,7 @@ F32 LLPhysicsMotion::toLocal(const LLVector3 &world) F32 LLPhysicsMotion::calculateVelocity_local() { - const F32 world_to_model_scale = 10.0f; + const F32 world_to_model_scale = 100.0f; LLJoint *joint = mJointState->getJoint(); const LLVector3 position_world = joint->getWorldPosition(); const LLQuaternion rotation_world = joint->getWorldRotation(); -- cgit v1.2.3 From 8c4555d54fc7c8686ffd139425f4c346576cac50 Mon Sep 17 00:00:00 2001 From: Richard Linden Date: Thu, 21 Apr 2011 18:04:38 -0700 Subject: Backed out changeset: e7b38729ad6d --- indra/newview/app_settings/settings_minimal.xml | 8 +- .../skins/default/xui/en/panel_bottomtray.xml | 1060 ++++++++++---------- .../minimal/xui/en/panel_adhoc_control_panel.xml | 35 - .../skins/minimal/xui/en/panel_bottomtray.xml | 38 - .../minimal/xui/en/panel_im_control_panel.xml | 33 - 5 files changed, 534 insertions(+), 640 deletions(-) diff --git a/indra/newview/app_settings/settings_minimal.xml b/indra/newview/app_settings/settings_minimal.xml index 60aecb279c..bc97ec00e9 100644 --- a/indra/newview/app_settings/settings_minimal.xml +++ b/indra/newview/app_settings/settings_minimal.xml @@ -52,7 +52,7 @@ Type Boolean Value - 1 + 0 HelpURLFormat @@ -124,7 +124,7 @@ Type Boolean Value - 0 + 1 VoiceDisableMic @@ -133,7 +133,7 @@ Type Boolean Value - 0 + 1 ScriptsCanShowUI @@ -290,7 +290,7 @@ Type Boolean Value - 1 + 0 EnableAvatarShare diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index c57f09c32f..c8882fd02c 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -1,530 +1,530 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml index 39d1a90850..5730adab8a 100644 --- a/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml +++ b/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml @@ -42,40 +42,5 @@ show_speaking_indicator="false" width="147" /> - -