jidctint.c 180 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240
  1. /*
  2. * jidctint.c
  3. *
  4. * Copyright (C) 1991-1998, Thomas G. Lane.
  5. * Modification developed 2002-2018 by Guido Vollbeding.
  6. * This file is part of the Independent JPEG Group's software.
  7. * For conditions of distribution and use, see the accompanying README file.
  8. *
  9. * This file contains a slow-but-accurate integer implementation of the
  10. * inverse DCT (Discrete Cosine Transform). In the IJG code, this routine
  11. * must also perform dequantization of the input coefficients.
  12. *
  13. * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT
  14. * on each row (or vice versa, but it's more convenient to emit a row at
  15. * a time). Direct algorithms are also available, but they are much more
  16. * complex and seem not to be any faster when reduced to code.
  17. *
  18. * This implementation is based on an algorithm described in
  19. * C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT
  20. * Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics,
  21. * Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991.
  22. * The primary algorithm described there uses 11 multiplies and 29 adds.
  23. * We use their alternate method with 12 multiplies and 32 adds.
  24. * The advantage of this method is that no data path contains more than one
  25. * multiplication; this allows a very simple and accurate implementation in
  26. * scaled fixed-point arithmetic, with a minimal number of shifts.
  27. *
  28. * We also provide IDCT routines with various output sample block sizes for
  29. * direct resolution reduction or enlargement and for direct resolving the
  30. * common 2x1 and 1x2 subsampling cases without additional resampling: NxN
  31. * (N=1...16), 2NxN, and Nx2N (N=1...8) pixels for one 8x8 input DCT block.
  32. *
  33. * For N<8 we simply take the corresponding low-frequency coefficients of
  34. * the 8x8 input DCT block and apply an NxN point IDCT on the sub-block
  35. * to yield the downscaled outputs.
  36. * This can be seen as direct low-pass downsampling from the DCT domain
  37. * point of view rather than the usual spatial domain point of view,
  38. * yielding significant computational savings and results at least
  39. * as good as common bilinear (averaging) spatial downsampling.
  40. *
  41. * For N>8 we apply a partial NxN IDCT on the 8 input coefficients as
  42. * lower frequencies and higher frequencies assumed to be zero.
  43. * It turns out that the computational effort is similar to the 8x8 IDCT
  44. * regarding the output size.
  45. * Furthermore, the scaling and descaling is the same for all IDCT sizes.
  46. *
  47. * CAUTION: We rely on the FIX() macro except for the N=1,2,4,8 cases
  48. * since there would be too many additional constants to pre-calculate.
  49. */
  50. #define JPEG_INTERNALS
  51. #include "jinclude.h"
  52. #include "jpeglib.h"
  53. #include "jdct.h" /* Private declarations for DCT subsystem */
  54. #ifdef DCT_ISLOW_SUPPORTED
  55. /*
  56. * This module is specialized to the case DCTSIZE = 8.
  57. */
  58. #if DCTSIZE != 8
  59. Sorry, this code only copes with 8x8 DCT blocks. /* deliberate syntax err */
  60. #endif
  61. /*
  62. * The poop on this scaling stuff is as follows:
  63. *
  64. * Each 1-D IDCT step produces outputs which are a factor of sqrt(N)
  65. * larger than the true IDCT outputs. The final outputs are therefore
  66. * a factor of N larger than desired; since N=8 this can be cured by
  67. * a simple right shift at the end of the algorithm. The advantage of
  68. * this arrangement is that we save two multiplications per 1-D IDCT,
  69. * because the y0 and y4 inputs need not be divided by sqrt(N).
  70. *
  71. * We have to do addition and subtraction of the integer inputs, which
  72. * is no problem, and multiplication by fractional constants, which is
  73. * a problem to do in integer arithmetic. We multiply all the constants
  74. * by CONST_SCALE and convert them to integer constants (thus retaining
  75. * CONST_BITS bits of precision in the constants). After doing a
  76. * multiplication we have to divide the product by CONST_SCALE, with proper
  77. * rounding, to produce the correct output. This division can be done
  78. * cheaply as a right shift of CONST_BITS bits. We postpone shifting
  79. * as long as possible so that partial sums can be added together with
  80. * full fractional precision.
  81. *
  82. * The outputs of the first pass are scaled up by PASS1_BITS bits so that
  83. * they are represented to better-than-integral precision. These outputs
  84. * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word
  85. * with the recommended scaling. (To scale up 12-bit sample data further, an
  86. * intermediate INT32 array would be needed.)
  87. *
  88. * To avoid overflow of the 32-bit intermediate results in pass 2, we must
  89. * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26. Error analysis
  90. * shows that the values given below are the most effective.
  91. */
  92. #if BITS_IN_JSAMPLE == 8
  93. #define CONST_BITS 13
  94. #define PASS1_BITS 2
  95. #else
  96. #define CONST_BITS 13
  97. #define PASS1_BITS 1 /* lose a little precision to avoid overflow */
  98. #endif
  99. /* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
  100. * causing a lot of useless floating-point operations at run time.
  101. * To get around this we use the following pre-calculated constants.
  102. * If you change CONST_BITS you may want to add appropriate values.
  103. * (With a reasonable C compiler, you can just rely on the FIX() macro...)
  104. */
  105. #if CONST_BITS == 13
  106. #define FIX_0_298631336 ((INT32) 2446) /* FIX(0.298631336) */
  107. #define FIX_0_390180644 ((INT32) 3196) /* FIX(0.390180644) */
  108. #define FIX_0_541196100 ((INT32) 4433) /* FIX(0.541196100) */
  109. #define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */
  110. #define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */
  111. #define FIX_1_175875602 ((INT32) 9633) /* FIX(1.175875602) */
  112. #define FIX_1_501321110 ((INT32) 12299) /* FIX(1.501321110) */
  113. #define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */
  114. #define FIX_1_961570560 ((INT32) 16069) /* FIX(1.961570560) */
  115. #define FIX_2_053119869 ((INT32) 16819) /* FIX(2.053119869) */
  116. #define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */
  117. #define FIX_3_072711026 ((INT32) 25172) /* FIX(3.072711026) */
  118. #else
  119. #define FIX_0_298631336 FIX(0.298631336)
  120. #define FIX_0_390180644 FIX(0.390180644)
  121. #define FIX_0_541196100 FIX(0.541196100)
  122. #define FIX_0_765366865 FIX(0.765366865)
  123. #define FIX_0_899976223 FIX(0.899976223)
  124. #define FIX_1_175875602 FIX(1.175875602)
  125. #define FIX_1_501321110 FIX(1.501321110)
  126. #define FIX_1_847759065 FIX(1.847759065)
  127. #define FIX_1_961570560 FIX(1.961570560)
  128. #define FIX_2_053119869 FIX(2.053119869)
  129. #define FIX_2_562915447 FIX(2.562915447)
  130. #define FIX_3_072711026 FIX(3.072711026)
  131. #endif
  132. /* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.
  133. * For 8-bit samples with the recommended scaling, all the variable
  134. * and constant values involved are no more than 16 bits wide, so a
  135. * 16x16->32 bit multiply can be used instead of a full 32x32 multiply.
  136. * For 12-bit samples, a full 32-bit multiplication will be needed.
  137. */
  138. #if BITS_IN_JSAMPLE == 8
  139. #define MULTIPLY(var,const) MULTIPLY16C16(var,const)
  140. #else
  141. #define MULTIPLY(var,const) ((var) * (const))
  142. #endif
  143. /* Dequantize a coefficient by multiplying it by the multiplier-table
  144. * entry; produce an int result. In this module, both inputs and result
  145. * are 16 bits or less, so either int or short multiply will work.
  146. */
  147. #define DEQUANTIZE(coef,quantval) (((ISLOW_MULT_TYPE) (coef)) * (quantval))
  148. /*
  149. * Perform dequantization and inverse DCT on one block of coefficients.
  150. *
  151. * Optimized algorithm with 12 multiplications in the 1-D kernel.
  152. * cK represents sqrt(2) * cos(K*pi/16).
  153. */
  154. GLOBAL(void)
  155. jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  156. JCOEFPTR coef_block,
  157. JSAMPARRAY output_buf, JDIMENSION output_col)
  158. {
  159. INT32 tmp0, tmp1, tmp2, tmp3;
  160. INT32 tmp10, tmp11, tmp12, tmp13;
  161. INT32 z1, z2, z3;
  162. JCOEFPTR inptr;
  163. ISLOW_MULT_TYPE * quantptr;
  164. int * wsptr;
  165. JSAMPROW outptr;
  166. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  167. int ctr;
  168. int workspace[DCTSIZE2]; /* buffers data between passes */
  169. SHIFT_TEMPS
  170. /* Pass 1: process columns from input, store into work array.
  171. * Note results are scaled up by sqrt(8) compared to a true IDCT;
  172. * furthermore, we scale the results by 2**PASS1_BITS.
  173. */
  174. inptr = coef_block;
  175. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  176. wsptr = workspace;
  177. for (ctr = DCTSIZE; ctr > 0; ctr--) {
  178. /* Due to quantization, we will usually find that many of the input
  179. * coefficients are zero, especially the AC terms. We can exploit this
  180. * by short-circuiting the IDCT calculation for any column in which all
  181. * the AC terms are zero. In that case each output is equal to the
  182. * DC coefficient (with scale factor as needed).
  183. * With typical images and quantization tables, half or more of the
  184. * column DCT calculations can be simplified this way.
  185. */
  186. if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
  187. inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&
  188. inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&
  189. inptr[DCTSIZE*7] == 0) {
  190. /* AC terms all zero */
  191. int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;
  192. wsptr[DCTSIZE*0] = dcval;
  193. wsptr[DCTSIZE*1] = dcval;
  194. wsptr[DCTSIZE*2] = dcval;
  195. wsptr[DCTSIZE*3] = dcval;
  196. wsptr[DCTSIZE*4] = dcval;
  197. wsptr[DCTSIZE*5] = dcval;
  198. wsptr[DCTSIZE*6] = dcval;
  199. wsptr[DCTSIZE*7] = dcval;
  200. inptr++; /* advance pointers to next column */
  201. quantptr++;
  202. wsptr++;
  203. continue;
  204. }
  205. /* Even part: reverse the even part of the forward DCT.
  206. * The rotator is c(-6).
  207. */
  208. z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  209. z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  210. z2 <<= CONST_BITS;
  211. z3 <<= CONST_BITS;
  212. /* Add fudge factor here for final descale. */
  213. z2 += ONE << (CONST_BITS-PASS1_BITS-1);
  214. tmp0 = z2 + z3;
  215. tmp1 = z2 - z3;
  216. z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  217. z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  218. z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
  219. tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
  220. tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
  221. tmp10 = tmp0 + tmp2;
  222. tmp13 = tmp0 - tmp2;
  223. tmp11 = tmp1 + tmp3;
  224. tmp12 = tmp1 - tmp3;
  225. /* Odd part per figure 8; the matrix is unitary and hence its
  226. * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
  227. */
  228. tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
  229. tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  230. tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  231. tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  232. z2 = tmp0 + tmp2;
  233. z3 = tmp1 + tmp3;
  234. z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* c3 */
  235. z2 = MULTIPLY(z2, - FIX_1_961570560); /* -c3-c5 */
  236. z3 = MULTIPLY(z3, - FIX_0_390180644); /* -c3+c5 */
  237. z2 += z1;
  238. z3 += z1;
  239. z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
  240. tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* -c1+c3+c5-c7 */
  241. tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* c1+c3-c5-c7 */
  242. tmp0 += z1 + z2;
  243. tmp3 += z1 + z3;
  244. z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
  245. tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* c1+c3-c5+c7 */
  246. tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* c1+c3+c5-c7 */
  247. tmp1 += z1 + z3;
  248. tmp2 += z1 + z2;
  249. /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
  250. wsptr[DCTSIZE*0] = (int) RIGHT_SHIFT(tmp10 + tmp3, CONST_BITS-PASS1_BITS);
  251. wsptr[DCTSIZE*7] = (int) RIGHT_SHIFT(tmp10 - tmp3, CONST_BITS-PASS1_BITS);
  252. wsptr[DCTSIZE*1] = (int) RIGHT_SHIFT(tmp11 + tmp2, CONST_BITS-PASS1_BITS);
  253. wsptr[DCTSIZE*6] = (int) RIGHT_SHIFT(tmp11 - tmp2, CONST_BITS-PASS1_BITS);
  254. wsptr[DCTSIZE*2] = (int) RIGHT_SHIFT(tmp12 + tmp1, CONST_BITS-PASS1_BITS);
  255. wsptr[DCTSIZE*5] = (int) RIGHT_SHIFT(tmp12 - tmp1, CONST_BITS-PASS1_BITS);
  256. wsptr[DCTSIZE*3] = (int) RIGHT_SHIFT(tmp13 + tmp0, CONST_BITS-PASS1_BITS);
  257. wsptr[DCTSIZE*4] = (int) RIGHT_SHIFT(tmp13 - tmp0, CONST_BITS-PASS1_BITS);
  258. inptr++; /* advance pointers to next column */
  259. quantptr++;
  260. wsptr++;
  261. }
  262. /* Pass 2: process rows from work array, store into output array.
  263. * Note that we must descale the results by a factor of 8 == 2**3,
  264. * and also undo the PASS1_BITS scaling.
  265. */
  266. wsptr = workspace;
  267. for (ctr = 0; ctr < DCTSIZE; ctr++) {
  268. outptr = output_buf[ctr] + output_col;
  269. /* Add range center and fudge factor for final descale and range-limit. */
  270. z2 = (INT32) wsptr[0] +
  271. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  272. (ONE << (PASS1_BITS+2)));
  273. /* Rows of zeroes can be exploited in the same way as we did with columns.
  274. * However, the column calculation has created many nonzero AC terms, so
  275. * the simplification applies less often (typically 5% to 10% of the time).
  276. * On machines with very fast multiplication, it's possible that the
  277. * test takes more time than it's worth. In that case this section
  278. * may be commented out.
  279. */
  280. #ifndef NO_ZERO_ROW_TEST
  281. if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 &&
  282. wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {
  283. /* AC terms all zero */
  284. JSAMPLE dcval = range_limit[(int) RIGHT_SHIFT(z2, PASS1_BITS+3)
  285. & RANGE_MASK];
  286. outptr[0] = dcval;
  287. outptr[1] = dcval;
  288. outptr[2] = dcval;
  289. outptr[3] = dcval;
  290. outptr[4] = dcval;
  291. outptr[5] = dcval;
  292. outptr[6] = dcval;
  293. outptr[7] = dcval;
  294. wsptr += DCTSIZE; /* advance pointer to next row */
  295. continue;
  296. }
  297. #endif
  298. /* Even part: reverse the even part of the forward DCT.
  299. * The rotator is c(-6).
  300. */
  301. z3 = (INT32) wsptr[4];
  302. tmp0 = (z2 + z3) << CONST_BITS;
  303. tmp1 = (z2 - z3) << CONST_BITS;
  304. z2 = (INT32) wsptr[2];
  305. z3 = (INT32) wsptr[6];
  306. z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
  307. tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
  308. tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
  309. tmp10 = tmp0 + tmp2;
  310. tmp13 = tmp0 - tmp2;
  311. tmp11 = tmp1 + tmp3;
  312. tmp12 = tmp1 - tmp3;
  313. /* Odd part per figure 8; the matrix is unitary and hence its
  314. * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
  315. */
  316. tmp0 = (INT32) wsptr[7];
  317. tmp1 = (INT32) wsptr[5];
  318. tmp2 = (INT32) wsptr[3];
  319. tmp3 = (INT32) wsptr[1];
  320. z2 = tmp0 + tmp2;
  321. z3 = tmp1 + tmp3;
  322. z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* c3 */
  323. z2 = MULTIPLY(z2, - FIX_1_961570560); /* -c3-c5 */
  324. z3 = MULTIPLY(z3, - FIX_0_390180644); /* -c3+c5 */
  325. z2 += z1;
  326. z3 += z1;
  327. z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
  328. tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* -c1+c3+c5-c7 */
  329. tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* c1+c3-c5-c7 */
  330. tmp0 += z1 + z2;
  331. tmp3 += z1 + z3;
  332. z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
  333. tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* c1+c3-c5+c7 */
  334. tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* c1+c3+c5-c7 */
  335. tmp1 += z1 + z3;
  336. tmp2 += z1 + z2;
  337. /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
  338. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp3,
  339. CONST_BITS+PASS1_BITS+3)
  340. & RANGE_MASK];
  341. outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp3,
  342. CONST_BITS+PASS1_BITS+3)
  343. & RANGE_MASK];
  344. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp2,
  345. CONST_BITS+PASS1_BITS+3)
  346. & RANGE_MASK];
  347. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp2,
  348. CONST_BITS+PASS1_BITS+3)
  349. & RANGE_MASK];
  350. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp1,
  351. CONST_BITS+PASS1_BITS+3)
  352. & RANGE_MASK];
  353. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp1,
  354. CONST_BITS+PASS1_BITS+3)
  355. & RANGE_MASK];
  356. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13 + tmp0,
  357. CONST_BITS+PASS1_BITS+3)
  358. & RANGE_MASK];
  359. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp0,
  360. CONST_BITS+PASS1_BITS+3)
  361. & RANGE_MASK];
  362. wsptr += DCTSIZE; /* advance pointer to next row */
  363. }
  364. }
  365. #ifdef IDCT_SCALING_SUPPORTED
  366. /*
  367. * Perform dequantization and inverse DCT on one block of coefficients,
  368. * producing a reduced-size 7x7 output block.
  369. *
  370. * Optimized algorithm with 12 multiplications in the 1-D kernel.
  371. * cK represents sqrt(2) * cos(K*pi/14).
  372. */
  373. GLOBAL(void)
  374. jpeg_idct_7x7 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  375. JCOEFPTR coef_block,
  376. JSAMPARRAY output_buf, JDIMENSION output_col)
  377. {
  378. INT32 tmp0, tmp1, tmp2, tmp10, tmp11, tmp12, tmp13;
  379. INT32 z1, z2, z3;
  380. JCOEFPTR inptr;
  381. ISLOW_MULT_TYPE * quantptr;
  382. int * wsptr;
  383. JSAMPROW outptr;
  384. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  385. int ctr;
  386. int workspace[7*7]; /* buffers data between passes */
  387. SHIFT_TEMPS
  388. /* Pass 1: process columns from input, store into work array. */
  389. inptr = coef_block;
  390. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  391. wsptr = workspace;
  392. for (ctr = 0; ctr < 7; ctr++, inptr++, quantptr++, wsptr++) {
  393. /* Even part */
  394. tmp13 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  395. tmp13 <<= CONST_BITS;
  396. /* Add fudge factor here for final descale. */
  397. tmp13 += ONE << (CONST_BITS-PASS1_BITS-1);
  398. z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  399. z2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  400. z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  401. tmp10 = MULTIPLY(z2 - z3, FIX(0.881747734)); /* c4 */
  402. tmp12 = MULTIPLY(z1 - z2, FIX(0.314692123)); /* c6 */
  403. tmp11 = tmp10 + tmp12 + tmp13 - MULTIPLY(z2, FIX(1.841218003)); /* c2+c4-c6 */
  404. tmp0 = z1 + z3;
  405. z2 -= tmp0;
  406. tmp0 = MULTIPLY(tmp0, FIX(1.274162392)) + tmp13; /* c2 */
  407. tmp10 += tmp0 - MULTIPLY(z3, FIX(0.077722536)); /* c2-c4-c6 */
  408. tmp12 += tmp0 - MULTIPLY(z1, FIX(2.470602249)); /* c2+c4+c6 */
  409. tmp13 += MULTIPLY(z2, FIX(1.414213562)); /* c0 */
  410. /* Odd part */
  411. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  412. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  413. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  414. tmp1 = MULTIPLY(z1 + z2, FIX(0.935414347)); /* (c3+c1-c5)/2 */
  415. tmp2 = MULTIPLY(z1 - z2, FIX(0.170262339)); /* (c3+c5-c1)/2 */
  416. tmp0 = tmp1 - tmp2;
  417. tmp1 += tmp2;
  418. tmp2 = MULTIPLY(z2 + z3, - FIX(1.378756276)); /* -c1 */
  419. tmp1 += tmp2;
  420. z2 = MULTIPLY(z1 + z3, FIX(0.613604268)); /* c5 */
  421. tmp0 += z2;
  422. tmp2 += z2 + MULTIPLY(z3, FIX(1.870828693)); /* c3+c1-c5 */
  423. /* Final output stage */
  424. wsptr[7*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS);
  425. wsptr[7*6] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS);
  426. wsptr[7*1] = (int) RIGHT_SHIFT(tmp11 + tmp1, CONST_BITS-PASS1_BITS);
  427. wsptr[7*5] = (int) RIGHT_SHIFT(tmp11 - tmp1, CONST_BITS-PASS1_BITS);
  428. wsptr[7*2] = (int) RIGHT_SHIFT(tmp12 + tmp2, CONST_BITS-PASS1_BITS);
  429. wsptr[7*4] = (int) RIGHT_SHIFT(tmp12 - tmp2, CONST_BITS-PASS1_BITS);
  430. wsptr[7*3] = (int) RIGHT_SHIFT(tmp13, CONST_BITS-PASS1_BITS);
  431. }
  432. /* Pass 2: process 7 rows from work array, store into output array. */
  433. wsptr = workspace;
  434. for (ctr = 0; ctr < 7; ctr++) {
  435. outptr = output_buf[ctr] + output_col;
  436. /* Even part */
  437. /* Add range center and fudge factor for final descale and range-limit. */
  438. tmp13 = (INT32) wsptr[0] +
  439. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  440. (ONE << (PASS1_BITS+2)));
  441. tmp13 <<= CONST_BITS;
  442. z1 = (INT32) wsptr[2];
  443. z2 = (INT32) wsptr[4];
  444. z3 = (INT32) wsptr[6];
  445. tmp10 = MULTIPLY(z2 - z3, FIX(0.881747734)); /* c4 */
  446. tmp12 = MULTIPLY(z1 - z2, FIX(0.314692123)); /* c6 */
  447. tmp11 = tmp10 + tmp12 + tmp13 - MULTIPLY(z2, FIX(1.841218003)); /* c2+c4-c6 */
  448. tmp0 = z1 + z3;
  449. z2 -= tmp0;
  450. tmp0 = MULTIPLY(tmp0, FIX(1.274162392)) + tmp13; /* c2 */
  451. tmp10 += tmp0 - MULTIPLY(z3, FIX(0.077722536)); /* c2-c4-c6 */
  452. tmp12 += tmp0 - MULTIPLY(z1, FIX(2.470602249)); /* c2+c4+c6 */
  453. tmp13 += MULTIPLY(z2, FIX(1.414213562)); /* c0 */
  454. /* Odd part */
  455. z1 = (INT32) wsptr[1];
  456. z2 = (INT32) wsptr[3];
  457. z3 = (INT32) wsptr[5];
  458. tmp1 = MULTIPLY(z1 + z2, FIX(0.935414347)); /* (c3+c1-c5)/2 */
  459. tmp2 = MULTIPLY(z1 - z2, FIX(0.170262339)); /* (c3+c5-c1)/2 */
  460. tmp0 = tmp1 - tmp2;
  461. tmp1 += tmp2;
  462. tmp2 = MULTIPLY(z2 + z3, - FIX(1.378756276)); /* -c1 */
  463. tmp1 += tmp2;
  464. z2 = MULTIPLY(z1 + z3, FIX(0.613604268)); /* c5 */
  465. tmp0 += z2;
  466. tmp2 += z2 + MULTIPLY(z3, FIX(1.870828693)); /* c3+c1-c5 */
  467. /* Final output stage */
  468. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0,
  469. CONST_BITS+PASS1_BITS+3)
  470. & RANGE_MASK];
  471. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0,
  472. CONST_BITS+PASS1_BITS+3)
  473. & RANGE_MASK];
  474. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1,
  475. CONST_BITS+PASS1_BITS+3)
  476. & RANGE_MASK];
  477. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1,
  478. CONST_BITS+PASS1_BITS+3)
  479. & RANGE_MASK];
  480. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2,
  481. CONST_BITS+PASS1_BITS+3)
  482. & RANGE_MASK];
  483. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2,
  484. CONST_BITS+PASS1_BITS+3)
  485. & RANGE_MASK];
  486. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13,
  487. CONST_BITS+PASS1_BITS+3)
  488. & RANGE_MASK];
  489. wsptr += 7; /* advance pointer to next row */
  490. }
  491. }
  492. /*
  493. * Perform dequantization and inverse DCT on one block of coefficients,
  494. * producing a reduced-size 6x6 output block.
  495. *
  496. * Optimized algorithm with 3 multiplications in the 1-D kernel.
  497. * cK represents sqrt(2) * cos(K*pi/12).
  498. */
  499. GLOBAL(void)
  500. jpeg_idct_6x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  501. JCOEFPTR coef_block,
  502. JSAMPARRAY output_buf, JDIMENSION output_col)
  503. {
  504. INT32 tmp0, tmp1, tmp2, tmp10, tmp11, tmp12;
  505. INT32 z1, z2, z3;
  506. JCOEFPTR inptr;
  507. ISLOW_MULT_TYPE * quantptr;
  508. int * wsptr;
  509. JSAMPROW outptr;
  510. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  511. int ctr;
  512. int workspace[6*6]; /* buffers data between passes */
  513. SHIFT_TEMPS
  514. /* Pass 1: process columns from input, store into work array. */
  515. inptr = coef_block;
  516. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  517. wsptr = workspace;
  518. for (ctr = 0; ctr < 6; ctr++, inptr++, quantptr++, wsptr++) {
  519. /* Even part */
  520. tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  521. tmp0 <<= CONST_BITS;
  522. /* Add fudge factor here for final descale. */
  523. tmp0 += ONE << (CONST_BITS-PASS1_BITS-1);
  524. tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  525. tmp10 = MULTIPLY(tmp2, FIX(0.707106781)); /* c4 */
  526. tmp1 = tmp0 + tmp10;
  527. tmp11 = RIGHT_SHIFT(tmp0 - tmp10 - tmp10, CONST_BITS-PASS1_BITS);
  528. tmp10 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  529. tmp0 = MULTIPLY(tmp10, FIX(1.224744871)); /* c2 */
  530. tmp10 = tmp1 + tmp0;
  531. tmp12 = tmp1 - tmp0;
  532. /* Odd part */
  533. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  534. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  535. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  536. tmp1 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */
  537. tmp0 = tmp1 + ((z1 + z2) << CONST_BITS);
  538. tmp2 = tmp1 + ((z3 - z2) << CONST_BITS);
  539. tmp1 = (z1 - z2 - z3) << PASS1_BITS;
  540. /* Final output stage */
  541. wsptr[6*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS);
  542. wsptr[6*5] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS);
  543. wsptr[6*1] = (int) (tmp11 + tmp1);
  544. wsptr[6*4] = (int) (tmp11 - tmp1);
  545. wsptr[6*2] = (int) RIGHT_SHIFT(tmp12 + tmp2, CONST_BITS-PASS1_BITS);
  546. wsptr[6*3] = (int) RIGHT_SHIFT(tmp12 - tmp2, CONST_BITS-PASS1_BITS);
  547. }
  548. /* Pass 2: process 6 rows from work array, store into output array. */
  549. wsptr = workspace;
  550. for (ctr = 0; ctr < 6; ctr++) {
  551. outptr = output_buf[ctr] + output_col;
  552. /* Even part */
  553. /* Add range center and fudge factor for final descale and range-limit. */
  554. tmp0 = (INT32) wsptr[0] +
  555. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  556. (ONE << (PASS1_BITS+2)));
  557. tmp0 <<= CONST_BITS;
  558. tmp2 = (INT32) wsptr[4];
  559. tmp10 = MULTIPLY(tmp2, FIX(0.707106781)); /* c4 */
  560. tmp1 = tmp0 + tmp10;
  561. tmp11 = tmp0 - tmp10 - tmp10;
  562. tmp10 = (INT32) wsptr[2];
  563. tmp0 = MULTIPLY(tmp10, FIX(1.224744871)); /* c2 */
  564. tmp10 = tmp1 + tmp0;
  565. tmp12 = tmp1 - tmp0;
  566. /* Odd part */
  567. z1 = (INT32) wsptr[1];
  568. z2 = (INT32) wsptr[3];
  569. z3 = (INT32) wsptr[5];
  570. tmp1 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */
  571. tmp0 = tmp1 + ((z1 + z2) << CONST_BITS);
  572. tmp2 = tmp1 + ((z3 - z2) << CONST_BITS);
  573. tmp1 = (z1 - z2 - z3) << CONST_BITS;
  574. /* Final output stage */
  575. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0,
  576. CONST_BITS+PASS1_BITS+3)
  577. & RANGE_MASK];
  578. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0,
  579. CONST_BITS+PASS1_BITS+3)
  580. & RANGE_MASK];
  581. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1,
  582. CONST_BITS+PASS1_BITS+3)
  583. & RANGE_MASK];
  584. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1,
  585. CONST_BITS+PASS1_BITS+3)
  586. & RANGE_MASK];
  587. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2,
  588. CONST_BITS+PASS1_BITS+3)
  589. & RANGE_MASK];
  590. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2,
  591. CONST_BITS+PASS1_BITS+3)
  592. & RANGE_MASK];
  593. wsptr += 6; /* advance pointer to next row */
  594. }
  595. }
  596. /*
  597. * Perform dequantization and inverse DCT on one block of coefficients,
  598. * producing a reduced-size 5x5 output block.
  599. *
  600. * Optimized algorithm with 5 multiplications in the 1-D kernel.
  601. * cK represents sqrt(2) * cos(K*pi/10).
  602. */
  603. GLOBAL(void)
  604. jpeg_idct_5x5 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  605. JCOEFPTR coef_block,
  606. JSAMPARRAY output_buf, JDIMENSION output_col)
  607. {
  608. INT32 tmp0, tmp1, tmp10, tmp11, tmp12;
  609. INT32 z1, z2, z3;
  610. JCOEFPTR inptr;
  611. ISLOW_MULT_TYPE * quantptr;
  612. int * wsptr;
  613. JSAMPROW outptr;
  614. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  615. int ctr;
  616. int workspace[5*5]; /* buffers data between passes */
  617. SHIFT_TEMPS
  618. /* Pass 1: process columns from input, store into work array. */
  619. inptr = coef_block;
  620. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  621. wsptr = workspace;
  622. for (ctr = 0; ctr < 5; ctr++, inptr++, quantptr++, wsptr++) {
  623. /* Even part */
  624. tmp12 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  625. tmp12 <<= CONST_BITS;
  626. /* Add fudge factor here for final descale. */
  627. tmp12 += ONE << (CONST_BITS-PASS1_BITS-1);
  628. tmp0 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  629. tmp1 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  630. z1 = MULTIPLY(tmp0 + tmp1, FIX(0.790569415)); /* (c2+c4)/2 */
  631. z2 = MULTIPLY(tmp0 - tmp1, FIX(0.353553391)); /* (c2-c4)/2 */
  632. z3 = tmp12 + z2;
  633. tmp10 = z3 + z1;
  634. tmp11 = z3 - z1;
  635. tmp12 -= z2 << 2;
  636. /* Odd part */
  637. z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  638. z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  639. z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c3 */
  640. tmp0 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c1-c3 */
  641. tmp1 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c1+c3 */
  642. /* Final output stage */
  643. wsptr[5*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS);
  644. wsptr[5*4] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS);
  645. wsptr[5*1] = (int) RIGHT_SHIFT(tmp11 + tmp1, CONST_BITS-PASS1_BITS);
  646. wsptr[5*3] = (int) RIGHT_SHIFT(tmp11 - tmp1, CONST_BITS-PASS1_BITS);
  647. wsptr[5*2] = (int) RIGHT_SHIFT(tmp12, CONST_BITS-PASS1_BITS);
  648. }
  649. /* Pass 2: process 5 rows from work array, store into output array. */
  650. wsptr = workspace;
  651. for (ctr = 0; ctr < 5; ctr++) {
  652. outptr = output_buf[ctr] + output_col;
  653. /* Even part */
  654. /* Add range center and fudge factor for final descale and range-limit. */
  655. tmp12 = (INT32) wsptr[0] +
  656. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  657. (ONE << (PASS1_BITS+2)));
  658. tmp12 <<= CONST_BITS;
  659. tmp0 = (INT32) wsptr[2];
  660. tmp1 = (INT32) wsptr[4];
  661. z1 = MULTIPLY(tmp0 + tmp1, FIX(0.790569415)); /* (c2+c4)/2 */
  662. z2 = MULTIPLY(tmp0 - tmp1, FIX(0.353553391)); /* (c2-c4)/2 */
  663. z3 = tmp12 + z2;
  664. tmp10 = z3 + z1;
  665. tmp11 = z3 - z1;
  666. tmp12 -= z2 << 2;
  667. /* Odd part */
  668. z2 = (INT32) wsptr[1];
  669. z3 = (INT32) wsptr[3];
  670. z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c3 */
  671. tmp0 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c1-c3 */
  672. tmp1 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c1+c3 */
  673. /* Final output stage */
  674. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0,
  675. CONST_BITS+PASS1_BITS+3)
  676. & RANGE_MASK];
  677. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0,
  678. CONST_BITS+PASS1_BITS+3)
  679. & RANGE_MASK];
  680. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1,
  681. CONST_BITS+PASS1_BITS+3)
  682. & RANGE_MASK];
  683. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1,
  684. CONST_BITS+PASS1_BITS+3)
  685. & RANGE_MASK];
  686. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12,
  687. CONST_BITS+PASS1_BITS+3)
  688. & RANGE_MASK];
  689. wsptr += 5; /* advance pointer to next row */
  690. }
  691. }
  692. /*
  693. * Perform dequantization and inverse DCT on one block of coefficients,
  694. * producing a reduced-size 4x4 output block.
  695. *
  696. * Optimized algorithm with 3 multiplications in the 1-D kernel.
  697. * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT].
  698. */
  699. GLOBAL(void)
  700. jpeg_idct_4x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  701. JCOEFPTR coef_block,
  702. JSAMPARRAY output_buf, JDIMENSION output_col)
  703. {
  704. INT32 tmp0, tmp2, tmp10, tmp12;
  705. INT32 z1, z2, z3;
  706. JCOEFPTR inptr;
  707. ISLOW_MULT_TYPE * quantptr;
  708. int * wsptr;
  709. JSAMPROW outptr;
  710. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  711. int ctr;
  712. int workspace[4*4]; /* buffers data between passes */
  713. SHIFT_TEMPS
  714. /* Pass 1: process columns from input, store into work array. */
  715. inptr = coef_block;
  716. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  717. wsptr = workspace;
  718. for (ctr = 0; ctr < 4; ctr++, inptr++, quantptr++, wsptr++) {
  719. /* Even part */
  720. tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  721. tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  722. tmp10 = (tmp0 + tmp2) << PASS1_BITS;
  723. tmp12 = (tmp0 - tmp2) << PASS1_BITS;
  724. /* Odd part */
  725. /* Same rotation as in the even part of the 8x8 LL&M IDCT */
  726. z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  727. z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  728. z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
  729. /* Add fudge factor here for final descale. */
  730. z1 += ONE << (CONST_BITS-PASS1_BITS-1);
  731. tmp0 = RIGHT_SHIFT(z1 + MULTIPLY(z2, FIX_0_765366865), /* c2-c6 */
  732. CONST_BITS-PASS1_BITS);
  733. tmp2 = RIGHT_SHIFT(z1 - MULTIPLY(z3, FIX_1_847759065), /* c2+c6 */
  734. CONST_BITS-PASS1_BITS);
  735. /* Final output stage */
  736. wsptr[4*0] = (int) (tmp10 + tmp0);
  737. wsptr[4*3] = (int) (tmp10 - tmp0);
  738. wsptr[4*1] = (int) (tmp12 + tmp2);
  739. wsptr[4*2] = (int) (tmp12 - tmp2);
  740. }
  741. /* Pass 2: process 4 rows from work array, store into output array. */
  742. wsptr = workspace;
  743. for (ctr = 0; ctr < 4; ctr++) {
  744. outptr = output_buf[ctr] + output_col;
  745. /* Even part */
  746. /* Add range center and fudge factor for final descale and range-limit. */
  747. tmp0 = (INT32) wsptr[0] +
  748. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  749. (ONE << (PASS1_BITS+2)));
  750. tmp2 = (INT32) wsptr[2];
  751. tmp10 = (tmp0 + tmp2) << CONST_BITS;
  752. tmp12 = (tmp0 - tmp2) << CONST_BITS;
  753. /* Odd part */
  754. /* Same rotation as in the even part of the 8x8 LL&M IDCT */
  755. z2 = (INT32) wsptr[1];
  756. z3 = (INT32) wsptr[3];
  757. z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
  758. tmp0 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
  759. tmp2 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
  760. /* Final output stage */
  761. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0,
  762. CONST_BITS+PASS1_BITS+3)
  763. & RANGE_MASK];
  764. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0,
  765. CONST_BITS+PASS1_BITS+3)
  766. & RANGE_MASK];
  767. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2,
  768. CONST_BITS+PASS1_BITS+3)
  769. & RANGE_MASK];
  770. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2,
  771. CONST_BITS+PASS1_BITS+3)
  772. & RANGE_MASK];
  773. wsptr += 4; /* advance pointer to next row */
  774. }
  775. }
  776. /*
  777. * Perform dequantization and inverse DCT on one block of coefficients,
  778. * producing a reduced-size 3x3 output block.
  779. *
  780. * Optimized algorithm with 2 multiplications in the 1-D kernel.
  781. * cK represents sqrt(2) * cos(K*pi/6).
  782. */
  783. GLOBAL(void)
  784. jpeg_idct_3x3 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  785. JCOEFPTR coef_block,
  786. JSAMPARRAY output_buf, JDIMENSION output_col)
  787. {
  788. INT32 tmp0, tmp2, tmp10, tmp12;
  789. JCOEFPTR inptr;
  790. ISLOW_MULT_TYPE * quantptr;
  791. int * wsptr;
  792. JSAMPROW outptr;
  793. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  794. int ctr;
  795. int workspace[3*3]; /* buffers data between passes */
  796. SHIFT_TEMPS
  797. /* Pass 1: process columns from input, store into work array. */
  798. inptr = coef_block;
  799. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  800. wsptr = workspace;
  801. for (ctr = 0; ctr < 3; ctr++, inptr++, quantptr++, wsptr++) {
  802. /* Even part */
  803. tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  804. tmp0 <<= CONST_BITS;
  805. /* Add fudge factor here for final descale. */
  806. tmp0 += ONE << (CONST_BITS-PASS1_BITS-1);
  807. tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  808. tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */
  809. tmp10 = tmp0 + tmp12;
  810. tmp2 = tmp0 - tmp12 - tmp12;
  811. /* Odd part */
  812. tmp12 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  813. tmp0 = MULTIPLY(tmp12, FIX(1.224744871)); /* c1 */
  814. /* Final output stage */
  815. wsptr[3*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS);
  816. wsptr[3*2] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS);
  817. wsptr[3*1] = (int) RIGHT_SHIFT(tmp2, CONST_BITS-PASS1_BITS);
  818. }
  819. /* Pass 2: process 3 rows from work array, store into output array. */
  820. wsptr = workspace;
  821. for (ctr = 0; ctr < 3; ctr++) {
  822. outptr = output_buf[ctr] + output_col;
  823. /* Even part */
  824. /* Add range center and fudge factor for final descale and range-limit. */
  825. tmp0 = (INT32) wsptr[0] +
  826. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  827. (ONE << (PASS1_BITS+2)));
  828. tmp0 <<= CONST_BITS;
  829. tmp2 = (INT32) wsptr[2];
  830. tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */
  831. tmp10 = tmp0 + tmp12;
  832. tmp2 = tmp0 - tmp12 - tmp12;
  833. /* Odd part */
  834. tmp12 = (INT32) wsptr[1];
  835. tmp0 = MULTIPLY(tmp12, FIX(1.224744871)); /* c1 */
  836. /* Final output stage */
  837. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0,
  838. CONST_BITS+PASS1_BITS+3)
  839. & RANGE_MASK];
  840. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0,
  841. CONST_BITS+PASS1_BITS+3)
  842. & RANGE_MASK];
  843. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp2,
  844. CONST_BITS+PASS1_BITS+3)
  845. & RANGE_MASK];
  846. wsptr += 3; /* advance pointer to next row */
  847. }
  848. }
  849. /*
  850. * Perform dequantization and inverse DCT on one block of coefficients,
  851. * producing a reduced-size 2x2 output block.
  852. *
  853. * Multiplication-less algorithm.
  854. */
  855. GLOBAL(void)
  856. jpeg_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  857. JCOEFPTR coef_block,
  858. JSAMPARRAY output_buf, JDIMENSION output_col)
  859. {
  860. DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5;
  861. ISLOW_MULT_TYPE * quantptr;
  862. JSAMPROW outptr;
  863. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  864. ISHIFT_TEMPS
  865. /* Pass 1: process columns from input. */
  866. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  867. /* Column 0 */
  868. tmp4 = DEQUANTIZE(coef_block[DCTSIZE*0], quantptr[DCTSIZE*0]);
  869. tmp5 = DEQUANTIZE(coef_block[DCTSIZE*1], quantptr[DCTSIZE*1]);
  870. /* Add range center and fudge factor for final descale and range-limit. */
  871. tmp4 += (((DCTELEM) RANGE_CENTER) << 3) + (1 << 2);
  872. tmp0 = tmp4 + tmp5;
  873. tmp2 = tmp4 - tmp5;
  874. /* Column 1 */
  875. tmp4 = DEQUANTIZE(coef_block[DCTSIZE*0+1], quantptr[DCTSIZE*0+1]);
  876. tmp5 = DEQUANTIZE(coef_block[DCTSIZE*1+1], quantptr[DCTSIZE*1+1]);
  877. tmp1 = tmp4 + tmp5;
  878. tmp3 = tmp4 - tmp5;
  879. /* Pass 2: process 2 rows, store into output array. */
  880. /* Row 0 */
  881. outptr = output_buf[0] + output_col;
  882. outptr[0] = range_limit[(int) IRIGHT_SHIFT(tmp0 + tmp1, 3) & RANGE_MASK];
  883. outptr[1] = range_limit[(int) IRIGHT_SHIFT(tmp0 - tmp1, 3) & RANGE_MASK];
  884. /* Row 1 */
  885. outptr = output_buf[1] + output_col;
  886. outptr[0] = range_limit[(int) IRIGHT_SHIFT(tmp2 + tmp3, 3) & RANGE_MASK];
  887. outptr[1] = range_limit[(int) IRIGHT_SHIFT(tmp2 - tmp3, 3) & RANGE_MASK];
  888. }
  889. /*
  890. * Perform dequantization and inverse DCT on one block of coefficients,
  891. * producing a reduced-size 1x1 output block.
  892. *
  893. * We hardly need an inverse DCT routine for this: just take the
  894. * average pixel value, which is one-eighth of the DC coefficient.
  895. */
  896. GLOBAL(void)
  897. jpeg_idct_1x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  898. JCOEFPTR coef_block,
  899. JSAMPARRAY output_buf, JDIMENSION output_col)
  900. {
  901. DCTELEM dcval;
  902. ISLOW_MULT_TYPE * quantptr;
  903. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  904. ISHIFT_TEMPS
  905. /* 1x1 is trivial: just take the DC coefficient divided by 8. */
  906. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  907. dcval = DEQUANTIZE(coef_block[0], quantptr[0]);
  908. /* Add range center and fudge factor for descale and range-limit. */
  909. dcval += (((DCTELEM) RANGE_CENTER) << 3) + (1 << 2);
  910. output_buf[0][output_col] =
  911. range_limit[(int) IRIGHT_SHIFT(dcval, 3) & RANGE_MASK];
  912. }
  913. /*
  914. * Perform dequantization and inverse DCT on one block of coefficients,
  915. * producing a 9x9 output block.
  916. *
  917. * Optimized algorithm with 10 multiplications in the 1-D kernel.
  918. * cK represents sqrt(2) * cos(K*pi/18).
  919. */
  920. GLOBAL(void)
  921. jpeg_idct_9x9 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  922. JCOEFPTR coef_block,
  923. JSAMPARRAY output_buf, JDIMENSION output_col)
  924. {
  925. INT32 tmp0, tmp1, tmp2, tmp3, tmp10, tmp11, tmp12, tmp13, tmp14;
  926. INT32 z1, z2, z3, z4;
  927. JCOEFPTR inptr;
  928. ISLOW_MULT_TYPE * quantptr;
  929. int * wsptr;
  930. JSAMPROW outptr;
  931. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  932. int ctr;
  933. int workspace[8*9]; /* buffers data between passes */
  934. SHIFT_TEMPS
  935. /* Pass 1: process columns from input, store into work array. */
  936. inptr = coef_block;
  937. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  938. wsptr = workspace;
  939. for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {
  940. /* Even part */
  941. tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  942. tmp0 <<= CONST_BITS;
  943. /* Add fudge factor here for final descale. */
  944. tmp0 += ONE << (CONST_BITS-PASS1_BITS-1);
  945. z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  946. z2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  947. z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  948. tmp3 = MULTIPLY(z3, FIX(0.707106781)); /* c6 */
  949. tmp1 = tmp0 + tmp3;
  950. tmp2 = tmp0 - tmp3 - tmp3;
  951. tmp0 = MULTIPLY(z1 - z2, FIX(0.707106781)); /* c6 */
  952. tmp11 = tmp2 + tmp0;
  953. tmp14 = tmp2 - tmp0 - tmp0;
  954. tmp0 = MULTIPLY(z1 + z2, FIX(1.328926049)); /* c2 */
  955. tmp2 = MULTIPLY(z1, FIX(1.083350441)); /* c4 */
  956. tmp3 = MULTIPLY(z2, FIX(0.245575608)); /* c8 */
  957. tmp10 = tmp1 + tmp0 - tmp3;
  958. tmp12 = tmp1 - tmp0 + tmp2;
  959. tmp13 = tmp1 - tmp2 + tmp3;
  960. /* Odd part */
  961. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  962. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  963. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  964. z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
  965. z2 = MULTIPLY(z2, - FIX(1.224744871)); /* -c3 */
  966. tmp2 = MULTIPLY(z1 + z3, FIX(0.909038955)); /* c5 */
  967. tmp3 = MULTIPLY(z1 + z4, FIX(0.483689525)); /* c7 */
  968. tmp0 = tmp2 + tmp3 - z2;
  969. tmp1 = MULTIPLY(z3 - z4, FIX(1.392728481)); /* c1 */
  970. tmp2 += z2 - tmp1;
  971. tmp3 += z2 + tmp1;
  972. tmp1 = MULTIPLY(z1 - z3 - z4, FIX(1.224744871)); /* c3 */
  973. /* Final output stage */
  974. wsptr[8*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS);
  975. wsptr[8*8] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS);
  976. wsptr[8*1] = (int) RIGHT_SHIFT(tmp11 + tmp1, CONST_BITS-PASS1_BITS);
  977. wsptr[8*7] = (int) RIGHT_SHIFT(tmp11 - tmp1, CONST_BITS-PASS1_BITS);
  978. wsptr[8*2] = (int) RIGHT_SHIFT(tmp12 + tmp2, CONST_BITS-PASS1_BITS);
  979. wsptr[8*6] = (int) RIGHT_SHIFT(tmp12 - tmp2, CONST_BITS-PASS1_BITS);
  980. wsptr[8*3] = (int) RIGHT_SHIFT(tmp13 + tmp3, CONST_BITS-PASS1_BITS);
  981. wsptr[8*5] = (int) RIGHT_SHIFT(tmp13 - tmp3, CONST_BITS-PASS1_BITS);
  982. wsptr[8*4] = (int) RIGHT_SHIFT(tmp14, CONST_BITS-PASS1_BITS);
  983. }
  984. /* Pass 2: process 9 rows from work array, store into output array. */
  985. wsptr = workspace;
  986. for (ctr = 0; ctr < 9; ctr++) {
  987. outptr = output_buf[ctr] + output_col;
  988. /* Even part */
  989. /* Add range center and fudge factor for final descale and range-limit. */
  990. tmp0 = (INT32) wsptr[0] +
  991. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  992. (ONE << (PASS1_BITS+2)));
  993. tmp0 <<= CONST_BITS;
  994. z1 = (INT32) wsptr[2];
  995. z2 = (INT32) wsptr[4];
  996. z3 = (INT32) wsptr[6];
  997. tmp3 = MULTIPLY(z3, FIX(0.707106781)); /* c6 */
  998. tmp1 = tmp0 + tmp3;
  999. tmp2 = tmp0 - tmp3 - tmp3;
  1000. tmp0 = MULTIPLY(z1 - z2, FIX(0.707106781)); /* c6 */
  1001. tmp11 = tmp2 + tmp0;
  1002. tmp14 = tmp2 - tmp0 - tmp0;
  1003. tmp0 = MULTIPLY(z1 + z2, FIX(1.328926049)); /* c2 */
  1004. tmp2 = MULTIPLY(z1, FIX(1.083350441)); /* c4 */
  1005. tmp3 = MULTIPLY(z2, FIX(0.245575608)); /* c8 */
  1006. tmp10 = tmp1 + tmp0 - tmp3;
  1007. tmp12 = tmp1 - tmp0 + tmp2;
  1008. tmp13 = tmp1 - tmp2 + tmp3;
  1009. /* Odd part */
  1010. z1 = (INT32) wsptr[1];
  1011. z2 = (INT32) wsptr[3];
  1012. z3 = (INT32) wsptr[5];
  1013. z4 = (INT32) wsptr[7];
  1014. z2 = MULTIPLY(z2, - FIX(1.224744871)); /* -c3 */
  1015. tmp2 = MULTIPLY(z1 + z3, FIX(0.909038955)); /* c5 */
  1016. tmp3 = MULTIPLY(z1 + z4, FIX(0.483689525)); /* c7 */
  1017. tmp0 = tmp2 + tmp3 - z2;
  1018. tmp1 = MULTIPLY(z3 - z4, FIX(1.392728481)); /* c1 */
  1019. tmp2 += z2 - tmp1;
  1020. tmp3 += z2 + tmp1;
  1021. tmp1 = MULTIPLY(z1 - z3 - z4, FIX(1.224744871)); /* c3 */
  1022. /* Final output stage */
  1023. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0,
  1024. CONST_BITS+PASS1_BITS+3)
  1025. & RANGE_MASK];
  1026. outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0,
  1027. CONST_BITS+PASS1_BITS+3)
  1028. & RANGE_MASK];
  1029. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1,
  1030. CONST_BITS+PASS1_BITS+3)
  1031. & RANGE_MASK];
  1032. outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1,
  1033. CONST_BITS+PASS1_BITS+3)
  1034. & RANGE_MASK];
  1035. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2,
  1036. CONST_BITS+PASS1_BITS+3)
  1037. & RANGE_MASK];
  1038. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2,
  1039. CONST_BITS+PASS1_BITS+3)
  1040. & RANGE_MASK];
  1041. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13 + tmp3,
  1042. CONST_BITS+PASS1_BITS+3)
  1043. & RANGE_MASK];
  1044. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp3,
  1045. CONST_BITS+PASS1_BITS+3)
  1046. & RANGE_MASK];
  1047. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp14,
  1048. CONST_BITS+PASS1_BITS+3)
  1049. & RANGE_MASK];
  1050. wsptr += 8; /* advance pointer to next row */
  1051. }
  1052. }
  1053. /*
  1054. * Perform dequantization and inverse DCT on one block of coefficients,
  1055. * producing a 10x10 output block.
  1056. *
  1057. * Optimized algorithm with 12 multiplications in the 1-D kernel.
  1058. * cK represents sqrt(2) * cos(K*pi/20).
  1059. */
  1060. GLOBAL(void)
  1061. jpeg_idct_10x10 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  1062. JCOEFPTR coef_block,
  1063. JSAMPARRAY output_buf, JDIMENSION output_col)
  1064. {
  1065. INT32 tmp10, tmp11, tmp12, tmp13, tmp14;
  1066. INT32 tmp20, tmp21, tmp22, tmp23, tmp24;
  1067. INT32 z1, z2, z3, z4, z5;
  1068. JCOEFPTR inptr;
  1069. ISLOW_MULT_TYPE * quantptr;
  1070. int * wsptr;
  1071. JSAMPROW outptr;
  1072. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  1073. int ctr;
  1074. int workspace[8*10]; /* buffers data between passes */
  1075. SHIFT_TEMPS
  1076. /* Pass 1: process columns from input, store into work array. */
  1077. inptr = coef_block;
  1078. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  1079. wsptr = workspace;
  1080. for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {
  1081. /* Even part */
  1082. z3 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  1083. z3 <<= CONST_BITS;
  1084. /* Add fudge factor here for final descale. */
  1085. z3 += ONE << (CONST_BITS-PASS1_BITS-1);
  1086. z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  1087. z1 = MULTIPLY(z4, FIX(1.144122806)); /* c4 */
  1088. z2 = MULTIPLY(z4, FIX(0.437016024)); /* c8 */
  1089. tmp10 = z3 + z1;
  1090. tmp11 = z3 - z2;
  1091. tmp22 = RIGHT_SHIFT(z3 - ((z1 - z2) << 1), /* c0 = (c4-c8)*2 */
  1092. CONST_BITS-PASS1_BITS);
  1093. z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  1094. z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  1095. z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c6 */
  1096. tmp12 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c2-c6 */
  1097. tmp13 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c2+c6 */
  1098. tmp20 = tmp10 + tmp12;
  1099. tmp24 = tmp10 - tmp12;
  1100. tmp21 = tmp11 + tmp13;
  1101. tmp23 = tmp11 - tmp13;
  1102. /* Odd part */
  1103. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  1104. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  1105. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  1106. z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
  1107. tmp11 = z2 + z4;
  1108. tmp13 = z2 - z4;
  1109. tmp12 = MULTIPLY(tmp13, FIX(0.309016994)); /* (c3-c7)/2 */
  1110. z5 = z3 << CONST_BITS;
  1111. z2 = MULTIPLY(tmp11, FIX(0.951056516)); /* (c3+c7)/2 */
  1112. z4 = z5 + tmp12;
  1113. tmp10 = MULTIPLY(z1, FIX(1.396802247)) + z2 + z4; /* c1 */
  1114. tmp14 = MULTIPLY(z1, FIX(0.221231742)) - z2 + z4; /* c9 */
  1115. z2 = MULTIPLY(tmp11, FIX(0.587785252)); /* (c1-c9)/2 */
  1116. z4 = z5 - tmp12 - (tmp13 << (CONST_BITS - 1));
  1117. tmp12 = (z1 - tmp13 - z3) << PASS1_BITS;
  1118. tmp11 = MULTIPLY(z1, FIX(1.260073511)) - z2 - z4; /* c3 */
  1119. tmp13 = MULTIPLY(z1, FIX(0.642039522)) - z2 + z4; /* c7 */
  1120. /* Final output stage */
  1121. wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);
  1122. wsptr[8*9] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);
  1123. wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS);
  1124. wsptr[8*8] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS);
  1125. wsptr[8*2] = (int) (tmp22 + tmp12);
  1126. wsptr[8*7] = (int) (tmp22 - tmp12);
  1127. wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS);
  1128. wsptr[8*6] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS);
  1129. wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS);
  1130. wsptr[8*5] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS);
  1131. }
  1132. /* Pass 2: process 10 rows from work array, store into output array. */
  1133. wsptr = workspace;
  1134. for (ctr = 0; ctr < 10; ctr++) {
  1135. outptr = output_buf[ctr] + output_col;
  1136. /* Even part */
  1137. /* Add range center and fudge factor for final descale and range-limit. */
  1138. z3 = (INT32) wsptr[0] +
  1139. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  1140. (ONE << (PASS1_BITS+2)));
  1141. z3 <<= CONST_BITS;
  1142. z4 = (INT32) wsptr[4];
  1143. z1 = MULTIPLY(z4, FIX(1.144122806)); /* c4 */
  1144. z2 = MULTIPLY(z4, FIX(0.437016024)); /* c8 */
  1145. tmp10 = z3 + z1;
  1146. tmp11 = z3 - z2;
  1147. tmp22 = z3 - ((z1 - z2) << 1); /* c0 = (c4-c8)*2 */
  1148. z2 = (INT32) wsptr[2];
  1149. z3 = (INT32) wsptr[6];
  1150. z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c6 */
  1151. tmp12 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c2-c6 */
  1152. tmp13 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c2+c6 */
  1153. tmp20 = tmp10 + tmp12;
  1154. tmp24 = tmp10 - tmp12;
  1155. tmp21 = tmp11 + tmp13;
  1156. tmp23 = tmp11 - tmp13;
  1157. /* Odd part */
  1158. z1 = (INT32) wsptr[1];
  1159. z2 = (INT32) wsptr[3];
  1160. z3 = (INT32) wsptr[5];
  1161. z3 <<= CONST_BITS;
  1162. z4 = (INT32) wsptr[7];
  1163. tmp11 = z2 + z4;
  1164. tmp13 = z2 - z4;
  1165. tmp12 = MULTIPLY(tmp13, FIX(0.309016994)); /* (c3-c7)/2 */
  1166. z2 = MULTIPLY(tmp11, FIX(0.951056516)); /* (c3+c7)/2 */
  1167. z4 = z3 + tmp12;
  1168. tmp10 = MULTIPLY(z1, FIX(1.396802247)) + z2 + z4; /* c1 */
  1169. tmp14 = MULTIPLY(z1, FIX(0.221231742)) - z2 + z4; /* c9 */
  1170. z2 = MULTIPLY(tmp11, FIX(0.587785252)); /* (c1-c9)/2 */
  1171. z4 = z3 - tmp12 - (tmp13 << (CONST_BITS - 1));
  1172. tmp12 = ((z1 - tmp13) << CONST_BITS) - z3;
  1173. tmp11 = MULTIPLY(z1, FIX(1.260073511)) - z2 - z4; /* c3 */
  1174. tmp13 = MULTIPLY(z1, FIX(0.642039522)) - z2 + z4; /* c7 */
  1175. /* Final output stage */
  1176. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,
  1177. CONST_BITS+PASS1_BITS+3)
  1178. & RANGE_MASK];
  1179. outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,
  1180. CONST_BITS+PASS1_BITS+3)
  1181. & RANGE_MASK];
  1182. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,
  1183. CONST_BITS+PASS1_BITS+3)
  1184. & RANGE_MASK];
  1185. outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,
  1186. CONST_BITS+PASS1_BITS+3)
  1187. & RANGE_MASK];
  1188. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,
  1189. CONST_BITS+PASS1_BITS+3)
  1190. & RANGE_MASK];
  1191. outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,
  1192. CONST_BITS+PASS1_BITS+3)
  1193. & RANGE_MASK];
  1194. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13,
  1195. CONST_BITS+PASS1_BITS+3)
  1196. & RANGE_MASK];
  1197. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13,
  1198. CONST_BITS+PASS1_BITS+3)
  1199. & RANGE_MASK];
  1200. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14,
  1201. CONST_BITS+PASS1_BITS+3)
  1202. & RANGE_MASK];
  1203. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14,
  1204. CONST_BITS+PASS1_BITS+3)
  1205. & RANGE_MASK];
  1206. wsptr += 8; /* advance pointer to next row */
  1207. }
  1208. }
  1209. /*
  1210. * Perform dequantization and inverse DCT on one block of coefficients,
  1211. * producing an 11x11 output block.
  1212. *
  1213. * Optimized algorithm with 24 multiplications in the 1-D kernel.
  1214. * cK represents sqrt(2) * cos(K*pi/22).
  1215. */
  1216. GLOBAL(void)
  1217. jpeg_idct_11x11 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  1218. JCOEFPTR coef_block,
  1219. JSAMPARRAY output_buf, JDIMENSION output_col)
  1220. {
  1221. INT32 tmp10, tmp11, tmp12, tmp13, tmp14;
  1222. INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25;
  1223. INT32 z1, z2, z3, z4;
  1224. JCOEFPTR inptr;
  1225. ISLOW_MULT_TYPE * quantptr;
  1226. int * wsptr;
  1227. JSAMPROW outptr;
  1228. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  1229. int ctr;
  1230. int workspace[8*11]; /* buffers data between passes */
  1231. SHIFT_TEMPS
  1232. /* Pass 1: process columns from input, store into work array. */
  1233. inptr = coef_block;
  1234. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  1235. wsptr = workspace;
  1236. for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {
  1237. /* Even part */
  1238. tmp10 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  1239. tmp10 <<= CONST_BITS;
  1240. /* Add fudge factor here for final descale. */
  1241. tmp10 += ONE << (CONST_BITS-PASS1_BITS-1);
  1242. z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  1243. z2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  1244. z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  1245. tmp20 = MULTIPLY(z2 - z3, FIX(2.546640132)); /* c2+c4 */
  1246. tmp23 = MULTIPLY(z2 - z1, FIX(0.430815045)); /* c2-c6 */
  1247. z4 = z1 + z3;
  1248. tmp24 = MULTIPLY(z4, - FIX(1.155664402)); /* -(c2-c10) */
  1249. z4 -= z2;
  1250. tmp25 = tmp10 + MULTIPLY(z4, FIX(1.356927976)); /* c2 */
  1251. tmp21 = tmp20 + tmp23 + tmp25 -
  1252. MULTIPLY(z2, FIX(1.821790775)); /* c2+c4+c10-c6 */
  1253. tmp20 += tmp25 + MULTIPLY(z3, FIX(2.115825087)); /* c4+c6 */
  1254. tmp23 += tmp25 - MULTIPLY(z1, FIX(1.513598477)); /* c6+c8 */
  1255. tmp24 += tmp25;
  1256. tmp22 = tmp24 - MULTIPLY(z3, FIX(0.788749120)); /* c8+c10 */
  1257. tmp24 += MULTIPLY(z2, FIX(1.944413522)) - /* c2+c8 */
  1258. MULTIPLY(z1, FIX(1.390975730)); /* c4+c10 */
  1259. tmp25 = tmp10 - MULTIPLY(z4, FIX(1.414213562)); /* c0 */
  1260. /* Odd part */
  1261. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  1262. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  1263. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  1264. z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
  1265. tmp11 = z1 + z2;
  1266. tmp14 = MULTIPLY(tmp11 + z3 + z4, FIX(0.398430003)); /* c9 */
  1267. tmp11 = MULTIPLY(tmp11, FIX(0.887983902)); /* c3-c9 */
  1268. tmp12 = MULTIPLY(z1 + z3, FIX(0.670361295)); /* c5-c9 */
  1269. tmp13 = tmp14 + MULTIPLY(z1 + z4, FIX(0.366151574)); /* c7-c9 */
  1270. tmp10 = tmp11 + tmp12 + tmp13 -
  1271. MULTIPLY(z1, FIX(0.923107866)); /* c7+c5+c3-c1-2*c9 */
  1272. z1 = tmp14 - MULTIPLY(z2 + z3, FIX(1.163011579)); /* c7+c9 */
  1273. tmp11 += z1 + MULTIPLY(z2, FIX(2.073276588)); /* c1+c7+3*c9-c3 */
  1274. tmp12 += z1 - MULTIPLY(z3, FIX(1.192193623)); /* c3+c5-c7-c9 */
  1275. z1 = MULTIPLY(z2 + z4, - FIX(1.798248910)); /* -(c1+c9) */
  1276. tmp11 += z1;
  1277. tmp13 += z1 + MULTIPLY(z4, FIX(2.102458632)); /* c1+c5+c9-c7 */
  1278. tmp14 += MULTIPLY(z2, - FIX(1.467221301)) + /* -(c5+c9) */
  1279. MULTIPLY(z3, FIX(1.001388905)) - /* c1-c9 */
  1280. MULTIPLY(z4, FIX(1.684843907)); /* c3+c9 */
  1281. /* Final output stage */
  1282. wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);
  1283. wsptr[8*10] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);
  1284. wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS);
  1285. wsptr[8*9] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS);
  1286. wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS);
  1287. wsptr[8*8] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS);
  1288. wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS);
  1289. wsptr[8*7] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS);
  1290. wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS);
  1291. wsptr[8*6] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS);
  1292. wsptr[8*5] = (int) RIGHT_SHIFT(tmp25, CONST_BITS-PASS1_BITS);
  1293. }
  1294. /* Pass 2: process 11 rows from work array, store into output array. */
  1295. wsptr = workspace;
  1296. for (ctr = 0; ctr < 11; ctr++) {
  1297. outptr = output_buf[ctr] + output_col;
  1298. /* Even part */
  1299. /* Add range center and fudge factor for final descale and range-limit. */
  1300. tmp10 = (INT32) wsptr[0] +
  1301. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  1302. (ONE << (PASS1_BITS+2)));
  1303. tmp10 <<= CONST_BITS;
  1304. z1 = (INT32) wsptr[2];
  1305. z2 = (INT32) wsptr[4];
  1306. z3 = (INT32) wsptr[6];
  1307. tmp20 = MULTIPLY(z2 - z3, FIX(2.546640132)); /* c2+c4 */
  1308. tmp23 = MULTIPLY(z2 - z1, FIX(0.430815045)); /* c2-c6 */
  1309. z4 = z1 + z3;
  1310. tmp24 = MULTIPLY(z4, - FIX(1.155664402)); /* -(c2-c10) */
  1311. z4 -= z2;
  1312. tmp25 = tmp10 + MULTIPLY(z4, FIX(1.356927976)); /* c2 */
  1313. tmp21 = tmp20 + tmp23 + tmp25 -
  1314. MULTIPLY(z2, FIX(1.821790775)); /* c2+c4+c10-c6 */
  1315. tmp20 += tmp25 + MULTIPLY(z3, FIX(2.115825087)); /* c4+c6 */
  1316. tmp23 += tmp25 - MULTIPLY(z1, FIX(1.513598477)); /* c6+c8 */
  1317. tmp24 += tmp25;
  1318. tmp22 = tmp24 - MULTIPLY(z3, FIX(0.788749120)); /* c8+c10 */
  1319. tmp24 += MULTIPLY(z2, FIX(1.944413522)) - /* c2+c8 */
  1320. MULTIPLY(z1, FIX(1.390975730)); /* c4+c10 */
  1321. tmp25 = tmp10 - MULTIPLY(z4, FIX(1.414213562)); /* c0 */
  1322. /* Odd part */
  1323. z1 = (INT32) wsptr[1];
  1324. z2 = (INT32) wsptr[3];
  1325. z3 = (INT32) wsptr[5];
  1326. z4 = (INT32) wsptr[7];
  1327. tmp11 = z1 + z2;
  1328. tmp14 = MULTIPLY(tmp11 + z3 + z4, FIX(0.398430003)); /* c9 */
  1329. tmp11 = MULTIPLY(tmp11, FIX(0.887983902)); /* c3-c9 */
  1330. tmp12 = MULTIPLY(z1 + z3, FIX(0.670361295)); /* c5-c9 */
  1331. tmp13 = tmp14 + MULTIPLY(z1 + z4, FIX(0.366151574)); /* c7-c9 */
  1332. tmp10 = tmp11 + tmp12 + tmp13 -
  1333. MULTIPLY(z1, FIX(0.923107866)); /* c7+c5+c3-c1-2*c9 */
  1334. z1 = tmp14 - MULTIPLY(z2 + z3, FIX(1.163011579)); /* c7+c9 */
  1335. tmp11 += z1 + MULTIPLY(z2, FIX(2.073276588)); /* c1+c7+3*c9-c3 */
  1336. tmp12 += z1 - MULTIPLY(z3, FIX(1.192193623)); /* c3+c5-c7-c9 */
  1337. z1 = MULTIPLY(z2 + z4, - FIX(1.798248910)); /* -(c1+c9) */
  1338. tmp11 += z1;
  1339. tmp13 += z1 + MULTIPLY(z4, FIX(2.102458632)); /* c1+c5+c9-c7 */
  1340. tmp14 += MULTIPLY(z2, - FIX(1.467221301)) + /* -(c5+c9) */
  1341. MULTIPLY(z3, FIX(1.001388905)) - /* c1-c9 */
  1342. MULTIPLY(z4, FIX(1.684843907)); /* c3+c9 */
  1343. /* Final output stage */
  1344. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,
  1345. CONST_BITS+PASS1_BITS+3)
  1346. & RANGE_MASK];
  1347. outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,
  1348. CONST_BITS+PASS1_BITS+3)
  1349. & RANGE_MASK];
  1350. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,
  1351. CONST_BITS+PASS1_BITS+3)
  1352. & RANGE_MASK];
  1353. outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,
  1354. CONST_BITS+PASS1_BITS+3)
  1355. & RANGE_MASK];
  1356. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,
  1357. CONST_BITS+PASS1_BITS+3)
  1358. & RANGE_MASK];
  1359. outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,
  1360. CONST_BITS+PASS1_BITS+3)
  1361. & RANGE_MASK];
  1362. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13,
  1363. CONST_BITS+PASS1_BITS+3)
  1364. & RANGE_MASK];
  1365. outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13,
  1366. CONST_BITS+PASS1_BITS+3)
  1367. & RANGE_MASK];
  1368. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14,
  1369. CONST_BITS+PASS1_BITS+3)
  1370. & RANGE_MASK];
  1371. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14,
  1372. CONST_BITS+PASS1_BITS+3)
  1373. & RANGE_MASK];
  1374. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25,
  1375. CONST_BITS+PASS1_BITS+3)
  1376. & RANGE_MASK];
  1377. wsptr += 8; /* advance pointer to next row */
  1378. }
  1379. }
  1380. /*
  1381. * Perform dequantization and inverse DCT on one block of coefficients,
  1382. * producing a 12x12 output block.
  1383. *
  1384. * Optimized algorithm with 15 multiplications in the 1-D kernel.
  1385. * cK represents sqrt(2) * cos(K*pi/24).
  1386. */
  1387. GLOBAL(void)
  1388. jpeg_idct_12x12 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  1389. JCOEFPTR coef_block,
  1390. JSAMPARRAY output_buf, JDIMENSION output_col)
  1391. {
  1392. INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15;
  1393. INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25;
  1394. INT32 z1, z2, z3, z4;
  1395. JCOEFPTR inptr;
  1396. ISLOW_MULT_TYPE * quantptr;
  1397. int * wsptr;
  1398. JSAMPROW outptr;
  1399. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  1400. int ctr;
  1401. int workspace[8*12]; /* buffers data between passes */
  1402. SHIFT_TEMPS
  1403. /* Pass 1: process columns from input, store into work array. */
  1404. inptr = coef_block;
  1405. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  1406. wsptr = workspace;
  1407. for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {
  1408. /* Even part */
  1409. z3 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  1410. z3 <<= CONST_BITS;
  1411. /* Add fudge factor here for final descale. */
  1412. z3 += ONE << (CONST_BITS-PASS1_BITS-1);
  1413. z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  1414. z4 = MULTIPLY(z4, FIX(1.224744871)); /* c4 */
  1415. tmp10 = z3 + z4;
  1416. tmp11 = z3 - z4;
  1417. z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  1418. z4 = MULTIPLY(z1, FIX(1.366025404)); /* c2 */
  1419. z1 <<= CONST_BITS;
  1420. z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  1421. z2 <<= CONST_BITS;
  1422. tmp12 = z1 - z2;
  1423. tmp21 = z3 + tmp12;
  1424. tmp24 = z3 - tmp12;
  1425. tmp12 = z4 + z2;
  1426. tmp20 = tmp10 + tmp12;
  1427. tmp25 = tmp10 - tmp12;
  1428. tmp12 = z4 - z1 - z2;
  1429. tmp22 = tmp11 + tmp12;
  1430. tmp23 = tmp11 - tmp12;
  1431. /* Odd part */
  1432. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  1433. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  1434. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  1435. z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
  1436. tmp11 = MULTIPLY(z2, FIX(1.306562965)); /* c3 */
  1437. tmp14 = MULTIPLY(z2, - FIX_0_541196100); /* -c9 */
  1438. tmp10 = z1 + z3;
  1439. tmp15 = MULTIPLY(tmp10 + z4, FIX(0.860918669)); /* c7 */
  1440. tmp12 = tmp15 + MULTIPLY(tmp10, FIX(0.261052384)); /* c5-c7 */
  1441. tmp10 = tmp12 + tmp11 + MULTIPLY(z1, FIX(0.280143716)); /* c1-c5 */
  1442. tmp13 = MULTIPLY(z3 + z4, - FIX(1.045510580)); /* -(c7+c11) */
  1443. tmp12 += tmp13 + tmp14 - MULTIPLY(z3, FIX(1.478575242)); /* c1+c5-c7-c11 */
  1444. tmp13 += tmp15 - tmp11 + MULTIPLY(z4, FIX(1.586706681)); /* c1+c11 */
  1445. tmp15 += tmp14 - MULTIPLY(z1, FIX(0.676326758)) - /* c7-c11 */
  1446. MULTIPLY(z4, FIX(1.982889723)); /* c5+c7 */
  1447. z1 -= z4;
  1448. z2 -= z3;
  1449. z3 = MULTIPLY(z1 + z2, FIX_0_541196100); /* c9 */
  1450. tmp11 = z3 + MULTIPLY(z1, FIX_0_765366865); /* c3-c9 */
  1451. tmp14 = z3 - MULTIPLY(z2, FIX_1_847759065); /* c3+c9 */
  1452. /* Final output stage */
  1453. wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);
  1454. wsptr[8*11] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);
  1455. wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS);
  1456. wsptr[8*10] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS);
  1457. wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS);
  1458. wsptr[8*9] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS);
  1459. wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS);
  1460. wsptr[8*8] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS);
  1461. wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS);
  1462. wsptr[8*7] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS);
  1463. wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS);
  1464. wsptr[8*6] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS);
  1465. }
  1466. /* Pass 2: process 12 rows from work array, store into output array. */
  1467. wsptr = workspace;
  1468. for (ctr = 0; ctr < 12; ctr++) {
  1469. outptr = output_buf[ctr] + output_col;
  1470. /* Even part */
  1471. /* Add range center and fudge factor for final descale and range-limit. */
  1472. z3 = (INT32) wsptr[0] +
  1473. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  1474. (ONE << (PASS1_BITS+2)));
  1475. z3 <<= CONST_BITS;
  1476. z4 = (INT32) wsptr[4];
  1477. z4 = MULTIPLY(z4, FIX(1.224744871)); /* c4 */
  1478. tmp10 = z3 + z4;
  1479. tmp11 = z3 - z4;
  1480. z1 = (INT32) wsptr[2];
  1481. z4 = MULTIPLY(z1, FIX(1.366025404)); /* c2 */
  1482. z1 <<= CONST_BITS;
  1483. z2 = (INT32) wsptr[6];
  1484. z2 <<= CONST_BITS;
  1485. tmp12 = z1 - z2;
  1486. tmp21 = z3 + tmp12;
  1487. tmp24 = z3 - tmp12;
  1488. tmp12 = z4 + z2;
  1489. tmp20 = tmp10 + tmp12;
  1490. tmp25 = tmp10 - tmp12;
  1491. tmp12 = z4 - z1 - z2;
  1492. tmp22 = tmp11 + tmp12;
  1493. tmp23 = tmp11 - tmp12;
  1494. /* Odd part */
  1495. z1 = (INT32) wsptr[1];
  1496. z2 = (INT32) wsptr[3];
  1497. z3 = (INT32) wsptr[5];
  1498. z4 = (INT32) wsptr[7];
  1499. tmp11 = MULTIPLY(z2, FIX(1.306562965)); /* c3 */
  1500. tmp14 = MULTIPLY(z2, - FIX_0_541196100); /* -c9 */
  1501. tmp10 = z1 + z3;
  1502. tmp15 = MULTIPLY(tmp10 + z4, FIX(0.860918669)); /* c7 */
  1503. tmp12 = tmp15 + MULTIPLY(tmp10, FIX(0.261052384)); /* c5-c7 */
  1504. tmp10 = tmp12 + tmp11 + MULTIPLY(z1, FIX(0.280143716)); /* c1-c5 */
  1505. tmp13 = MULTIPLY(z3 + z4, - FIX(1.045510580)); /* -(c7+c11) */
  1506. tmp12 += tmp13 + tmp14 - MULTIPLY(z3, FIX(1.478575242)); /* c1+c5-c7-c11 */
  1507. tmp13 += tmp15 - tmp11 + MULTIPLY(z4, FIX(1.586706681)); /* c1+c11 */
  1508. tmp15 += tmp14 - MULTIPLY(z1, FIX(0.676326758)) - /* c7-c11 */
  1509. MULTIPLY(z4, FIX(1.982889723)); /* c5+c7 */
  1510. z1 -= z4;
  1511. z2 -= z3;
  1512. z3 = MULTIPLY(z1 + z2, FIX_0_541196100); /* c9 */
  1513. tmp11 = z3 + MULTIPLY(z1, FIX_0_765366865); /* c3-c9 */
  1514. tmp14 = z3 - MULTIPLY(z2, FIX_1_847759065); /* c3+c9 */
  1515. /* Final output stage */
  1516. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,
  1517. CONST_BITS+PASS1_BITS+3)
  1518. & RANGE_MASK];
  1519. outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,
  1520. CONST_BITS+PASS1_BITS+3)
  1521. & RANGE_MASK];
  1522. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,
  1523. CONST_BITS+PASS1_BITS+3)
  1524. & RANGE_MASK];
  1525. outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,
  1526. CONST_BITS+PASS1_BITS+3)
  1527. & RANGE_MASK];
  1528. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,
  1529. CONST_BITS+PASS1_BITS+3)
  1530. & RANGE_MASK];
  1531. outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,
  1532. CONST_BITS+PASS1_BITS+3)
  1533. & RANGE_MASK];
  1534. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13,
  1535. CONST_BITS+PASS1_BITS+3)
  1536. & RANGE_MASK];
  1537. outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13,
  1538. CONST_BITS+PASS1_BITS+3)
  1539. & RANGE_MASK];
  1540. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14,
  1541. CONST_BITS+PASS1_BITS+3)
  1542. & RANGE_MASK];
  1543. outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14,
  1544. CONST_BITS+PASS1_BITS+3)
  1545. & RANGE_MASK];
  1546. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15,
  1547. CONST_BITS+PASS1_BITS+3)
  1548. & RANGE_MASK];
  1549. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15,
  1550. CONST_BITS+PASS1_BITS+3)
  1551. & RANGE_MASK];
  1552. wsptr += 8; /* advance pointer to next row */
  1553. }
  1554. }
  1555. /*
  1556. * Perform dequantization and inverse DCT on one block of coefficients,
  1557. * producing a 13x13 output block.
  1558. *
  1559. * Optimized algorithm with 29 multiplications in the 1-D kernel.
  1560. * cK represents sqrt(2) * cos(K*pi/26).
  1561. */
  1562. GLOBAL(void)
  1563. jpeg_idct_13x13 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  1564. JCOEFPTR coef_block,
  1565. JSAMPARRAY output_buf, JDIMENSION output_col)
  1566. {
  1567. INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15;
  1568. INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26;
  1569. INT32 z1, z2, z3, z4;
  1570. JCOEFPTR inptr;
  1571. ISLOW_MULT_TYPE * quantptr;
  1572. int * wsptr;
  1573. JSAMPROW outptr;
  1574. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  1575. int ctr;
  1576. int workspace[8*13]; /* buffers data between passes */
  1577. SHIFT_TEMPS
  1578. /* Pass 1: process columns from input, store into work array. */
  1579. inptr = coef_block;
  1580. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  1581. wsptr = workspace;
  1582. for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {
  1583. /* Even part */
  1584. z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  1585. z1 <<= CONST_BITS;
  1586. /* Add fudge factor here for final descale. */
  1587. z1 += ONE << (CONST_BITS-PASS1_BITS-1);
  1588. z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  1589. z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  1590. z4 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  1591. tmp10 = z3 + z4;
  1592. tmp11 = z3 - z4;
  1593. tmp12 = MULTIPLY(tmp10, FIX(1.155388986)); /* (c4+c6)/2 */
  1594. tmp13 = MULTIPLY(tmp11, FIX(0.096834934)) + z1; /* (c4-c6)/2 */
  1595. tmp20 = MULTIPLY(z2, FIX(1.373119086)) + tmp12 + tmp13; /* c2 */
  1596. tmp22 = MULTIPLY(z2, FIX(0.501487041)) - tmp12 + tmp13; /* c10 */
  1597. tmp12 = MULTIPLY(tmp10, FIX(0.316450131)); /* (c8-c12)/2 */
  1598. tmp13 = MULTIPLY(tmp11, FIX(0.486914739)) + z1; /* (c8+c12)/2 */
  1599. tmp21 = MULTIPLY(z2, FIX(1.058554052)) - tmp12 + tmp13; /* c6 */
  1600. tmp25 = MULTIPLY(z2, - FIX(1.252223920)) + tmp12 + tmp13; /* c4 */
  1601. tmp12 = MULTIPLY(tmp10, FIX(0.435816023)); /* (c2-c10)/2 */
  1602. tmp13 = MULTIPLY(tmp11, FIX(0.937303064)) - z1; /* (c2+c10)/2 */
  1603. tmp23 = MULTIPLY(z2, - FIX(0.170464608)) - tmp12 - tmp13; /* c12 */
  1604. tmp24 = MULTIPLY(z2, - FIX(0.803364869)) + tmp12 - tmp13; /* c8 */
  1605. tmp26 = MULTIPLY(tmp11 - z2, FIX(1.414213562)) + z1; /* c0 */
  1606. /* Odd part */
  1607. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  1608. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  1609. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  1610. z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
  1611. tmp11 = MULTIPLY(z1 + z2, FIX(1.322312651)); /* c3 */
  1612. tmp12 = MULTIPLY(z1 + z3, FIX(1.163874945)); /* c5 */
  1613. tmp15 = z1 + z4;
  1614. tmp13 = MULTIPLY(tmp15, FIX(0.937797057)); /* c7 */
  1615. tmp10 = tmp11 + tmp12 + tmp13 -
  1616. MULTIPLY(z1, FIX(2.020082300)); /* c7+c5+c3-c1 */
  1617. tmp14 = MULTIPLY(z2 + z3, - FIX(0.338443458)); /* -c11 */
  1618. tmp11 += tmp14 + MULTIPLY(z2, FIX(0.837223564)); /* c5+c9+c11-c3 */
  1619. tmp12 += tmp14 - MULTIPLY(z3, FIX(1.572116027)); /* c1+c5-c9-c11 */
  1620. tmp14 = MULTIPLY(z2 + z4, - FIX(1.163874945)); /* -c5 */
  1621. tmp11 += tmp14;
  1622. tmp13 += tmp14 + MULTIPLY(z4, FIX(2.205608352)); /* c3+c5+c9-c7 */
  1623. tmp14 = MULTIPLY(z3 + z4, - FIX(0.657217813)); /* -c9 */
  1624. tmp12 += tmp14;
  1625. tmp13 += tmp14;
  1626. tmp15 = MULTIPLY(tmp15, FIX(0.338443458)); /* c11 */
  1627. tmp14 = tmp15 + MULTIPLY(z1, FIX(0.318774355)) - /* c9-c11 */
  1628. MULTIPLY(z2, FIX(0.466105296)); /* c1-c7 */
  1629. z1 = MULTIPLY(z3 - z2, FIX(0.937797057)); /* c7 */
  1630. tmp14 += z1;
  1631. tmp15 += z1 + MULTIPLY(z3, FIX(0.384515595)) - /* c3-c7 */
  1632. MULTIPLY(z4, FIX(1.742345811)); /* c1+c11 */
  1633. /* Final output stage */
  1634. wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);
  1635. wsptr[8*12] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);
  1636. wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS);
  1637. wsptr[8*11] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS);
  1638. wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS);
  1639. wsptr[8*10] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS);
  1640. wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS);
  1641. wsptr[8*9] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS);
  1642. wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS);
  1643. wsptr[8*8] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS);
  1644. wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS);
  1645. wsptr[8*7] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS);
  1646. wsptr[8*6] = (int) RIGHT_SHIFT(tmp26, CONST_BITS-PASS1_BITS);
  1647. }
  1648. /* Pass 2: process 13 rows from work array, store into output array. */
  1649. wsptr = workspace;
  1650. for (ctr = 0; ctr < 13; ctr++) {
  1651. outptr = output_buf[ctr] + output_col;
  1652. /* Even part */
  1653. /* Add range center and fudge factor for final descale and range-limit. */
  1654. z1 = (INT32) wsptr[0] +
  1655. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  1656. (ONE << (PASS1_BITS+2)));
  1657. z1 <<= CONST_BITS;
  1658. z2 = (INT32) wsptr[2];
  1659. z3 = (INT32) wsptr[4];
  1660. z4 = (INT32) wsptr[6];
  1661. tmp10 = z3 + z4;
  1662. tmp11 = z3 - z4;
  1663. tmp12 = MULTIPLY(tmp10, FIX(1.155388986)); /* (c4+c6)/2 */
  1664. tmp13 = MULTIPLY(tmp11, FIX(0.096834934)) + z1; /* (c4-c6)/2 */
  1665. tmp20 = MULTIPLY(z2, FIX(1.373119086)) + tmp12 + tmp13; /* c2 */
  1666. tmp22 = MULTIPLY(z2, FIX(0.501487041)) - tmp12 + tmp13; /* c10 */
  1667. tmp12 = MULTIPLY(tmp10, FIX(0.316450131)); /* (c8-c12)/2 */
  1668. tmp13 = MULTIPLY(tmp11, FIX(0.486914739)) + z1; /* (c8+c12)/2 */
  1669. tmp21 = MULTIPLY(z2, FIX(1.058554052)) - tmp12 + tmp13; /* c6 */
  1670. tmp25 = MULTIPLY(z2, - FIX(1.252223920)) + tmp12 + tmp13; /* c4 */
  1671. tmp12 = MULTIPLY(tmp10, FIX(0.435816023)); /* (c2-c10)/2 */
  1672. tmp13 = MULTIPLY(tmp11, FIX(0.937303064)) - z1; /* (c2+c10)/2 */
  1673. tmp23 = MULTIPLY(z2, - FIX(0.170464608)) - tmp12 - tmp13; /* c12 */
  1674. tmp24 = MULTIPLY(z2, - FIX(0.803364869)) + tmp12 - tmp13; /* c8 */
  1675. tmp26 = MULTIPLY(tmp11 - z2, FIX(1.414213562)) + z1; /* c0 */
  1676. /* Odd part */
  1677. z1 = (INT32) wsptr[1];
  1678. z2 = (INT32) wsptr[3];
  1679. z3 = (INT32) wsptr[5];
  1680. z4 = (INT32) wsptr[7];
  1681. tmp11 = MULTIPLY(z1 + z2, FIX(1.322312651)); /* c3 */
  1682. tmp12 = MULTIPLY(z1 + z3, FIX(1.163874945)); /* c5 */
  1683. tmp15 = z1 + z4;
  1684. tmp13 = MULTIPLY(tmp15, FIX(0.937797057)); /* c7 */
  1685. tmp10 = tmp11 + tmp12 + tmp13 -
  1686. MULTIPLY(z1, FIX(2.020082300)); /* c7+c5+c3-c1 */
  1687. tmp14 = MULTIPLY(z2 + z3, - FIX(0.338443458)); /* -c11 */
  1688. tmp11 += tmp14 + MULTIPLY(z2, FIX(0.837223564)); /* c5+c9+c11-c3 */
  1689. tmp12 += tmp14 - MULTIPLY(z3, FIX(1.572116027)); /* c1+c5-c9-c11 */
  1690. tmp14 = MULTIPLY(z2 + z4, - FIX(1.163874945)); /* -c5 */
  1691. tmp11 += tmp14;
  1692. tmp13 += tmp14 + MULTIPLY(z4, FIX(2.205608352)); /* c3+c5+c9-c7 */
  1693. tmp14 = MULTIPLY(z3 + z4, - FIX(0.657217813)); /* -c9 */
  1694. tmp12 += tmp14;
  1695. tmp13 += tmp14;
  1696. tmp15 = MULTIPLY(tmp15, FIX(0.338443458)); /* c11 */
  1697. tmp14 = tmp15 + MULTIPLY(z1, FIX(0.318774355)) - /* c9-c11 */
  1698. MULTIPLY(z2, FIX(0.466105296)); /* c1-c7 */
  1699. z1 = MULTIPLY(z3 - z2, FIX(0.937797057)); /* c7 */
  1700. tmp14 += z1;
  1701. tmp15 += z1 + MULTIPLY(z3, FIX(0.384515595)) - /* c3-c7 */
  1702. MULTIPLY(z4, FIX(1.742345811)); /* c1+c11 */
  1703. /* Final output stage */
  1704. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,
  1705. CONST_BITS+PASS1_BITS+3)
  1706. & RANGE_MASK];
  1707. outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,
  1708. CONST_BITS+PASS1_BITS+3)
  1709. & RANGE_MASK];
  1710. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,
  1711. CONST_BITS+PASS1_BITS+3)
  1712. & RANGE_MASK];
  1713. outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,
  1714. CONST_BITS+PASS1_BITS+3)
  1715. & RANGE_MASK];
  1716. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,
  1717. CONST_BITS+PASS1_BITS+3)
  1718. & RANGE_MASK];
  1719. outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,
  1720. CONST_BITS+PASS1_BITS+3)
  1721. & RANGE_MASK];
  1722. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13,
  1723. CONST_BITS+PASS1_BITS+3)
  1724. & RANGE_MASK];
  1725. outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13,
  1726. CONST_BITS+PASS1_BITS+3)
  1727. & RANGE_MASK];
  1728. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14,
  1729. CONST_BITS+PASS1_BITS+3)
  1730. & RANGE_MASK];
  1731. outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14,
  1732. CONST_BITS+PASS1_BITS+3)
  1733. & RANGE_MASK];
  1734. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15,
  1735. CONST_BITS+PASS1_BITS+3)
  1736. & RANGE_MASK];
  1737. outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15,
  1738. CONST_BITS+PASS1_BITS+3)
  1739. & RANGE_MASK];
  1740. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26,
  1741. CONST_BITS+PASS1_BITS+3)
  1742. & RANGE_MASK];
  1743. wsptr += 8; /* advance pointer to next row */
  1744. }
  1745. }
  1746. /*
  1747. * Perform dequantization and inverse DCT on one block of coefficients,
  1748. * producing a 14x14 output block.
  1749. *
  1750. * Optimized algorithm with 20 multiplications in the 1-D kernel.
  1751. * cK represents sqrt(2) * cos(K*pi/28).
  1752. */
  1753. GLOBAL(void)
  1754. jpeg_idct_14x14 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  1755. JCOEFPTR coef_block,
  1756. JSAMPARRAY output_buf, JDIMENSION output_col)
  1757. {
  1758. INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16;
  1759. INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26;
  1760. INT32 z1, z2, z3, z4;
  1761. JCOEFPTR inptr;
  1762. ISLOW_MULT_TYPE * quantptr;
  1763. int * wsptr;
  1764. JSAMPROW outptr;
  1765. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  1766. int ctr;
  1767. int workspace[8*14]; /* buffers data between passes */
  1768. SHIFT_TEMPS
  1769. /* Pass 1: process columns from input, store into work array. */
  1770. inptr = coef_block;
  1771. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  1772. wsptr = workspace;
  1773. for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {
  1774. /* Even part */
  1775. z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  1776. z1 <<= CONST_BITS;
  1777. /* Add fudge factor here for final descale. */
  1778. z1 += ONE << (CONST_BITS-PASS1_BITS-1);
  1779. z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  1780. z2 = MULTIPLY(z4, FIX(1.274162392)); /* c4 */
  1781. z3 = MULTIPLY(z4, FIX(0.314692123)); /* c12 */
  1782. z4 = MULTIPLY(z4, FIX(0.881747734)); /* c8 */
  1783. tmp10 = z1 + z2;
  1784. tmp11 = z1 + z3;
  1785. tmp12 = z1 - z4;
  1786. tmp23 = RIGHT_SHIFT(z1 - ((z2 + z3 - z4) << 1), /* c0 = (c4+c12-c8)*2 */
  1787. CONST_BITS-PASS1_BITS);
  1788. z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  1789. z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  1790. z3 = MULTIPLY(z1 + z2, FIX(1.105676686)); /* c6 */
  1791. tmp13 = z3 + MULTIPLY(z1, FIX(0.273079590)); /* c2-c6 */
  1792. tmp14 = z3 - MULTIPLY(z2, FIX(1.719280954)); /* c6+c10 */
  1793. tmp15 = MULTIPLY(z1, FIX(0.613604268)) - /* c10 */
  1794. MULTIPLY(z2, FIX(1.378756276)); /* c2 */
  1795. tmp20 = tmp10 + tmp13;
  1796. tmp26 = tmp10 - tmp13;
  1797. tmp21 = tmp11 + tmp14;
  1798. tmp25 = tmp11 - tmp14;
  1799. tmp22 = tmp12 + tmp15;
  1800. tmp24 = tmp12 - tmp15;
  1801. /* Odd part */
  1802. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  1803. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  1804. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  1805. z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
  1806. tmp13 = z4 << CONST_BITS;
  1807. tmp14 = z1 + z3;
  1808. tmp11 = MULTIPLY(z1 + z2, FIX(1.334852607)); /* c3 */
  1809. tmp12 = MULTIPLY(tmp14, FIX(1.197448846)); /* c5 */
  1810. tmp10 = tmp11 + tmp12 + tmp13 - MULTIPLY(z1, FIX(1.126980169)); /* c3+c5-c1 */
  1811. tmp14 = MULTIPLY(tmp14, FIX(0.752406978)); /* c9 */
  1812. tmp16 = tmp14 - MULTIPLY(z1, FIX(1.061150426)); /* c9+c11-c13 */
  1813. z1 -= z2;
  1814. tmp15 = MULTIPLY(z1, FIX(0.467085129)) - tmp13; /* c11 */
  1815. tmp16 += tmp15;
  1816. z1 += z4;
  1817. z4 = MULTIPLY(z2 + z3, - FIX(0.158341681)) - tmp13; /* -c13 */
  1818. tmp11 += z4 - MULTIPLY(z2, FIX(0.424103948)); /* c3-c9-c13 */
  1819. tmp12 += z4 - MULTIPLY(z3, FIX(2.373959773)); /* c3+c5-c13 */
  1820. z4 = MULTIPLY(z3 - z2, FIX(1.405321284)); /* c1 */
  1821. tmp14 += z4 + tmp13 - MULTIPLY(z3, FIX(1.6906431334)); /* c1+c9-c11 */
  1822. tmp15 += z4 + MULTIPLY(z2, FIX(0.674957567)); /* c1+c11-c5 */
  1823. tmp13 = (z1 - z3) << PASS1_BITS;
  1824. /* Final output stage */
  1825. wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);
  1826. wsptr[8*13] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);
  1827. wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS);
  1828. wsptr[8*12] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS);
  1829. wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS);
  1830. wsptr[8*11] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS);
  1831. wsptr[8*3] = (int) (tmp23 + tmp13);
  1832. wsptr[8*10] = (int) (tmp23 - tmp13);
  1833. wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS);
  1834. wsptr[8*9] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS);
  1835. wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS);
  1836. wsptr[8*8] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS);
  1837. wsptr[8*6] = (int) RIGHT_SHIFT(tmp26 + tmp16, CONST_BITS-PASS1_BITS);
  1838. wsptr[8*7] = (int) RIGHT_SHIFT(tmp26 - tmp16, CONST_BITS-PASS1_BITS);
  1839. }
  1840. /* Pass 2: process 14 rows from work array, store into output array. */
  1841. wsptr = workspace;
  1842. for (ctr = 0; ctr < 14; ctr++) {
  1843. outptr = output_buf[ctr] + output_col;
  1844. /* Even part */
  1845. /* Add range center and fudge factor for final descale and range-limit. */
  1846. z1 = (INT32) wsptr[0] +
  1847. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  1848. (ONE << (PASS1_BITS+2)));
  1849. z1 <<= CONST_BITS;
  1850. z4 = (INT32) wsptr[4];
  1851. z2 = MULTIPLY(z4, FIX(1.274162392)); /* c4 */
  1852. z3 = MULTIPLY(z4, FIX(0.314692123)); /* c12 */
  1853. z4 = MULTIPLY(z4, FIX(0.881747734)); /* c8 */
  1854. tmp10 = z1 + z2;
  1855. tmp11 = z1 + z3;
  1856. tmp12 = z1 - z4;
  1857. tmp23 = z1 - ((z2 + z3 - z4) << 1); /* c0 = (c4+c12-c8)*2 */
  1858. z1 = (INT32) wsptr[2];
  1859. z2 = (INT32) wsptr[6];
  1860. z3 = MULTIPLY(z1 + z2, FIX(1.105676686)); /* c6 */
  1861. tmp13 = z3 + MULTIPLY(z1, FIX(0.273079590)); /* c2-c6 */
  1862. tmp14 = z3 - MULTIPLY(z2, FIX(1.719280954)); /* c6+c10 */
  1863. tmp15 = MULTIPLY(z1, FIX(0.613604268)) - /* c10 */
  1864. MULTIPLY(z2, FIX(1.378756276)); /* c2 */
  1865. tmp20 = tmp10 + tmp13;
  1866. tmp26 = tmp10 - tmp13;
  1867. tmp21 = tmp11 + tmp14;
  1868. tmp25 = tmp11 - tmp14;
  1869. tmp22 = tmp12 + tmp15;
  1870. tmp24 = tmp12 - tmp15;
  1871. /* Odd part */
  1872. z1 = (INT32) wsptr[1];
  1873. z2 = (INT32) wsptr[3];
  1874. z3 = (INT32) wsptr[5];
  1875. z4 = (INT32) wsptr[7];
  1876. z4 <<= CONST_BITS;
  1877. tmp14 = z1 + z3;
  1878. tmp11 = MULTIPLY(z1 + z2, FIX(1.334852607)); /* c3 */
  1879. tmp12 = MULTIPLY(tmp14, FIX(1.197448846)); /* c5 */
  1880. tmp10 = tmp11 + tmp12 + z4 - MULTIPLY(z1, FIX(1.126980169)); /* c3+c5-c1 */
  1881. tmp14 = MULTIPLY(tmp14, FIX(0.752406978)); /* c9 */
  1882. tmp16 = tmp14 - MULTIPLY(z1, FIX(1.061150426)); /* c9+c11-c13 */
  1883. z1 -= z2;
  1884. tmp15 = MULTIPLY(z1, FIX(0.467085129)) - z4; /* c11 */
  1885. tmp16 += tmp15;
  1886. tmp13 = MULTIPLY(z2 + z3, - FIX(0.158341681)) - z4; /* -c13 */
  1887. tmp11 += tmp13 - MULTIPLY(z2, FIX(0.424103948)); /* c3-c9-c13 */
  1888. tmp12 += tmp13 - MULTIPLY(z3, FIX(2.373959773)); /* c3+c5-c13 */
  1889. tmp13 = MULTIPLY(z3 - z2, FIX(1.405321284)); /* c1 */
  1890. tmp14 += tmp13 + z4 - MULTIPLY(z3, FIX(1.6906431334)); /* c1+c9-c11 */
  1891. tmp15 += tmp13 + MULTIPLY(z2, FIX(0.674957567)); /* c1+c11-c5 */
  1892. tmp13 = ((z1 - z3) << CONST_BITS) + z4;
  1893. /* Final output stage */
  1894. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,
  1895. CONST_BITS+PASS1_BITS+3)
  1896. & RANGE_MASK];
  1897. outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,
  1898. CONST_BITS+PASS1_BITS+3)
  1899. & RANGE_MASK];
  1900. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,
  1901. CONST_BITS+PASS1_BITS+3)
  1902. & RANGE_MASK];
  1903. outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,
  1904. CONST_BITS+PASS1_BITS+3)
  1905. & RANGE_MASK];
  1906. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,
  1907. CONST_BITS+PASS1_BITS+3)
  1908. & RANGE_MASK];
  1909. outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,
  1910. CONST_BITS+PASS1_BITS+3)
  1911. & RANGE_MASK];
  1912. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13,
  1913. CONST_BITS+PASS1_BITS+3)
  1914. & RANGE_MASK];
  1915. outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13,
  1916. CONST_BITS+PASS1_BITS+3)
  1917. & RANGE_MASK];
  1918. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14,
  1919. CONST_BITS+PASS1_BITS+3)
  1920. & RANGE_MASK];
  1921. outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14,
  1922. CONST_BITS+PASS1_BITS+3)
  1923. & RANGE_MASK];
  1924. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15,
  1925. CONST_BITS+PASS1_BITS+3)
  1926. & RANGE_MASK];
  1927. outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15,
  1928. CONST_BITS+PASS1_BITS+3)
  1929. & RANGE_MASK];
  1930. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp16,
  1931. CONST_BITS+PASS1_BITS+3)
  1932. & RANGE_MASK];
  1933. outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp16,
  1934. CONST_BITS+PASS1_BITS+3)
  1935. & RANGE_MASK];
  1936. wsptr += 8; /* advance pointer to next row */
  1937. }
  1938. }
  1939. /*
  1940. * Perform dequantization and inverse DCT on one block of coefficients,
  1941. * producing a 15x15 output block.
  1942. *
  1943. * Optimized algorithm with 22 multiplications in the 1-D kernel.
  1944. * cK represents sqrt(2) * cos(K*pi/30).
  1945. */
  1946. GLOBAL(void)
  1947. jpeg_idct_15x15 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  1948. JCOEFPTR coef_block,
  1949. JSAMPARRAY output_buf, JDIMENSION output_col)
  1950. {
  1951. INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16;
  1952. INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27;
  1953. INT32 z1, z2, z3, z4;
  1954. JCOEFPTR inptr;
  1955. ISLOW_MULT_TYPE * quantptr;
  1956. int * wsptr;
  1957. JSAMPROW outptr;
  1958. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  1959. int ctr;
  1960. int workspace[8*15]; /* buffers data between passes */
  1961. SHIFT_TEMPS
  1962. /* Pass 1: process columns from input, store into work array. */
  1963. inptr = coef_block;
  1964. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  1965. wsptr = workspace;
  1966. for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {
  1967. /* Even part */
  1968. z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  1969. z1 <<= CONST_BITS;
  1970. /* Add fudge factor here for final descale. */
  1971. z1 += ONE << (CONST_BITS-PASS1_BITS-1);
  1972. z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  1973. z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  1974. z4 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  1975. tmp10 = MULTIPLY(z4, FIX(0.437016024)); /* c12 */
  1976. tmp11 = MULTIPLY(z4, FIX(1.144122806)); /* c6 */
  1977. tmp12 = z1 - tmp10;
  1978. tmp13 = z1 + tmp11;
  1979. z1 -= (tmp11 - tmp10) << 1; /* c0 = (c6-c12)*2 */
  1980. z4 = z2 - z3;
  1981. z3 += z2;
  1982. tmp10 = MULTIPLY(z3, FIX(1.337628990)); /* (c2+c4)/2 */
  1983. tmp11 = MULTIPLY(z4, FIX(0.045680613)); /* (c2-c4)/2 */
  1984. z2 = MULTIPLY(z2, FIX(1.439773946)); /* c4+c14 */
  1985. tmp20 = tmp13 + tmp10 + tmp11;
  1986. tmp23 = tmp12 - tmp10 + tmp11 + z2;
  1987. tmp10 = MULTIPLY(z3, FIX(0.547059574)); /* (c8+c14)/2 */
  1988. tmp11 = MULTIPLY(z4, FIX(0.399234004)); /* (c8-c14)/2 */
  1989. tmp25 = tmp13 - tmp10 - tmp11;
  1990. tmp26 = tmp12 + tmp10 - tmp11 - z2;
  1991. tmp10 = MULTIPLY(z3, FIX(0.790569415)); /* (c6+c12)/2 */
  1992. tmp11 = MULTIPLY(z4, FIX(0.353553391)); /* (c6-c12)/2 */
  1993. tmp21 = tmp12 + tmp10 + tmp11;
  1994. tmp24 = tmp13 - tmp10 + tmp11;
  1995. tmp11 += tmp11;
  1996. tmp22 = z1 + tmp11; /* c10 = c6-c12 */
  1997. tmp27 = z1 - tmp11 - tmp11; /* c0 = (c6-c12)*2 */
  1998. /* Odd part */
  1999. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  2000. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  2001. z4 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  2002. z3 = MULTIPLY(z4, FIX(1.224744871)); /* c5 */
  2003. z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
  2004. tmp13 = z2 - z4;
  2005. tmp15 = MULTIPLY(z1 + tmp13, FIX(0.831253876)); /* c9 */
  2006. tmp11 = tmp15 + MULTIPLY(z1, FIX(0.513743148)); /* c3-c9 */
  2007. tmp14 = tmp15 - MULTIPLY(tmp13, FIX(2.176250899)); /* c3+c9 */
  2008. tmp13 = MULTIPLY(z2, - FIX(0.831253876)); /* -c9 */
  2009. tmp15 = MULTIPLY(z2, - FIX(1.344997024)); /* -c3 */
  2010. z2 = z1 - z4;
  2011. tmp12 = z3 + MULTIPLY(z2, FIX(1.406466353)); /* c1 */
  2012. tmp10 = tmp12 + MULTIPLY(z4, FIX(2.457431844)) - tmp15; /* c1+c7 */
  2013. tmp16 = tmp12 - MULTIPLY(z1, FIX(1.112434820)) + tmp13; /* c1-c13 */
  2014. tmp12 = MULTIPLY(z2, FIX(1.224744871)) - z3; /* c5 */
  2015. z2 = MULTIPLY(z1 + z4, FIX(0.575212477)); /* c11 */
  2016. tmp13 += z2 + MULTIPLY(z1, FIX(0.475753014)) - z3; /* c7-c11 */
  2017. tmp15 += z2 - MULTIPLY(z4, FIX(0.869244010)) + z3; /* c11+c13 */
  2018. /* Final output stage */
  2019. wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);
  2020. wsptr[8*14] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);
  2021. wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS);
  2022. wsptr[8*13] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS);
  2023. wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS);
  2024. wsptr[8*12] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS);
  2025. wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS);
  2026. wsptr[8*11] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS);
  2027. wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS);
  2028. wsptr[8*10] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS);
  2029. wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS);
  2030. wsptr[8*9] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS);
  2031. wsptr[8*6] = (int) RIGHT_SHIFT(tmp26 + tmp16, CONST_BITS-PASS1_BITS);
  2032. wsptr[8*8] = (int) RIGHT_SHIFT(tmp26 - tmp16, CONST_BITS-PASS1_BITS);
  2033. wsptr[8*7] = (int) RIGHT_SHIFT(tmp27, CONST_BITS-PASS1_BITS);
  2034. }
  2035. /* Pass 2: process 15 rows from work array, store into output array. */
  2036. wsptr = workspace;
  2037. for (ctr = 0; ctr < 15; ctr++) {
  2038. outptr = output_buf[ctr] + output_col;
  2039. /* Even part */
  2040. /* Add range center and fudge factor for final descale and range-limit. */
  2041. z1 = (INT32) wsptr[0] +
  2042. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  2043. (ONE << (PASS1_BITS+2)));
  2044. z1 <<= CONST_BITS;
  2045. z2 = (INT32) wsptr[2];
  2046. z3 = (INT32) wsptr[4];
  2047. z4 = (INT32) wsptr[6];
  2048. tmp10 = MULTIPLY(z4, FIX(0.437016024)); /* c12 */
  2049. tmp11 = MULTIPLY(z4, FIX(1.144122806)); /* c6 */
  2050. tmp12 = z1 - tmp10;
  2051. tmp13 = z1 + tmp11;
  2052. z1 -= (tmp11 - tmp10) << 1; /* c0 = (c6-c12)*2 */
  2053. z4 = z2 - z3;
  2054. z3 += z2;
  2055. tmp10 = MULTIPLY(z3, FIX(1.337628990)); /* (c2+c4)/2 */
  2056. tmp11 = MULTIPLY(z4, FIX(0.045680613)); /* (c2-c4)/2 */
  2057. z2 = MULTIPLY(z2, FIX(1.439773946)); /* c4+c14 */
  2058. tmp20 = tmp13 + tmp10 + tmp11;
  2059. tmp23 = tmp12 - tmp10 + tmp11 + z2;
  2060. tmp10 = MULTIPLY(z3, FIX(0.547059574)); /* (c8+c14)/2 */
  2061. tmp11 = MULTIPLY(z4, FIX(0.399234004)); /* (c8-c14)/2 */
  2062. tmp25 = tmp13 - tmp10 - tmp11;
  2063. tmp26 = tmp12 + tmp10 - tmp11 - z2;
  2064. tmp10 = MULTIPLY(z3, FIX(0.790569415)); /* (c6+c12)/2 */
  2065. tmp11 = MULTIPLY(z4, FIX(0.353553391)); /* (c6-c12)/2 */
  2066. tmp21 = tmp12 + tmp10 + tmp11;
  2067. tmp24 = tmp13 - tmp10 + tmp11;
  2068. tmp11 += tmp11;
  2069. tmp22 = z1 + tmp11; /* c10 = c6-c12 */
  2070. tmp27 = z1 - tmp11 - tmp11; /* c0 = (c6-c12)*2 */
  2071. /* Odd part */
  2072. z1 = (INT32) wsptr[1];
  2073. z2 = (INT32) wsptr[3];
  2074. z4 = (INT32) wsptr[5];
  2075. z3 = MULTIPLY(z4, FIX(1.224744871)); /* c5 */
  2076. z4 = (INT32) wsptr[7];
  2077. tmp13 = z2 - z4;
  2078. tmp15 = MULTIPLY(z1 + tmp13, FIX(0.831253876)); /* c9 */
  2079. tmp11 = tmp15 + MULTIPLY(z1, FIX(0.513743148)); /* c3-c9 */
  2080. tmp14 = tmp15 - MULTIPLY(tmp13, FIX(2.176250899)); /* c3+c9 */
  2081. tmp13 = MULTIPLY(z2, - FIX(0.831253876)); /* -c9 */
  2082. tmp15 = MULTIPLY(z2, - FIX(1.344997024)); /* -c3 */
  2083. z2 = z1 - z4;
  2084. tmp12 = z3 + MULTIPLY(z2, FIX(1.406466353)); /* c1 */
  2085. tmp10 = tmp12 + MULTIPLY(z4, FIX(2.457431844)) - tmp15; /* c1+c7 */
  2086. tmp16 = tmp12 - MULTIPLY(z1, FIX(1.112434820)) + tmp13; /* c1-c13 */
  2087. tmp12 = MULTIPLY(z2, FIX(1.224744871)) - z3; /* c5 */
  2088. z2 = MULTIPLY(z1 + z4, FIX(0.575212477)); /* c11 */
  2089. tmp13 += z2 + MULTIPLY(z1, FIX(0.475753014)) - z3; /* c7-c11 */
  2090. tmp15 += z2 - MULTIPLY(z4, FIX(0.869244010)) + z3; /* c11+c13 */
  2091. /* Final output stage */
  2092. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,
  2093. CONST_BITS+PASS1_BITS+3)
  2094. & RANGE_MASK];
  2095. outptr[14] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,
  2096. CONST_BITS+PASS1_BITS+3)
  2097. & RANGE_MASK];
  2098. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,
  2099. CONST_BITS+PASS1_BITS+3)
  2100. & RANGE_MASK];
  2101. outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,
  2102. CONST_BITS+PASS1_BITS+3)
  2103. & RANGE_MASK];
  2104. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,
  2105. CONST_BITS+PASS1_BITS+3)
  2106. & RANGE_MASK];
  2107. outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,
  2108. CONST_BITS+PASS1_BITS+3)
  2109. & RANGE_MASK];
  2110. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13,
  2111. CONST_BITS+PASS1_BITS+3)
  2112. & RANGE_MASK];
  2113. outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13,
  2114. CONST_BITS+PASS1_BITS+3)
  2115. & RANGE_MASK];
  2116. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14,
  2117. CONST_BITS+PASS1_BITS+3)
  2118. & RANGE_MASK];
  2119. outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14,
  2120. CONST_BITS+PASS1_BITS+3)
  2121. & RANGE_MASK];
  2122. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15,
  2123. CONST_BITS+PASS1_BITS+3)
  2124. & RANGE_MASK];
  2125. outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15,
  2126. CONST_BITS+PASS1_BITS+3)
  2127. & RANGE_MASK];
  2128. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp16,
  2129. CONST_BITS+PASS1_BITS+3)
  2130. & RANGE_MASK];
  2131. outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp16,
  2132. CONST_BITS+PASS1_BITS+3)
  2133. & RANGE_MASK];
  2134. outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp27,
  2135. CONST_BITS+PASS1_BITS+3)
  2136. & RANGE_MASK];
  2137. wsptr += 8; /* advance pointer to next row */
  2138. }
  2139. }
  2140. /*
  2141. * Perform dequantization and inverse DCT on one block of coefficients,
  2142. * producing a 16x16 output block.
  2143. *
  2144. * Optimized algorithm with 28 multiplications in the 1-D kernel.
  2145. * cK represents sqrt(2) * cos(K*pi/32).
  2146. */
  2147. GLOBAL(void)
  2148. jpeg_idct_16x16 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  2149. JCOEFPTR coef_block,
  2150. JSAMPARRAY output_buf, JDIMENSION output_col)
  2151. {
  2152. INT32 tmp0, tmp1, tmp2, tmp3, tmp10, tmp11, tmp12, tmp13;
  2153. INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27;
  2154. INT32 z1, z2, z3, z4;
  2155. JCOEFPTR inptr;
  2156. ISLOW_MULT_TYPE * quantptr;
  2157. int * wsptr;
  2158. JSAMPROW outptr;
  2159. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  2160. int ctr;
  2161. int workspace[8*16]; /* buffers data between passes */
  2162. SHIFT_TEMPS
  2163. /* Pass 1: process columns from input, store into work array. */
  2164. inptr = coef_block;
  2165. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  2166. wsptr = workspace;
  2167. for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {
  2168. /* Even part */
  2169. tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  2170. tmp0 <<= CONST_BITS;
  2171. /* Add fudge factor here for final descale. */
  2172. tmp0 += ONE << (CONST_BITS-PASS1_BITS-1);
  2173. z1 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  2174. tmp1 = MULTIPLY(z1, FIX(1.306562965)); /* c4[16] = c2[8] */
  2175. tmp2 = MULTIPLY(z1, FIX_0_541196100); /* c12[16] = c6[8] */
  2176. tmp10 = tmp0 + tmp1;
  2177. tmp11 = tmp0 - tmp1;
  2178. tmp12 = tmp0 + tmp2;
  2179. tmp13 = tmp0 - tmp2;
  2180. z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  2181. z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  2182. z3 = z1 - z2;
  2183. z4 = MULTIPLY(z3, FIX(0.275899379)); /* c14[16] = c7[8] */
  2184. z3 = MULTIPLY(z3, FIX(1.387039845)); /* c2[16] = c1[8] */
  2185. tmp0 = z3 + MULTIPLY(z2, FIX_2_562915447); /* (c6+c2)[16] = (c3+c1)[8] */
  2186. tmp1 = z4 + MULTIPLY(z1, FIX_0_899976223); /* (c6-c14)[16] = (c3-c7)[8] */
  2187. tmp2 = z3 - MULTIPLY(z1, FIX(0.601344887)); /* (c2-c10)[16] = (c1-c5)[8] */
  2188. tmp3 = z4 - MULTIPLY(z2, FIX(0.509795579)); /* (c10-c14)[16] = (c5-c7)[8] */
  2189. tmp20 = tmp10 + tmp0;
  2190. tmp27 = tmp10 - tmp0;
  2191. tmp21 = tmp12 + tmp1;
  2192. tmp26 = tmp12 - tmp1;
  2193. tmp22 = tmp13 + tmp2;
  2194. tmp25 = tmp13 - tmp2;
  2195. tmp23 = tmp11 + tmp3;
  2196. tmp24 = tmp11 - tmp3;
  2197. /* Odd part */
  2198. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  2199. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  2200. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  2201. z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
  2202. tmp11 = z1 + z3;
  2203. tmp1 = MULTIPLY(z1 + z2, FIX(1.353318001)); /* c3 */
  2204. tmp2 = MULTIPLY(tmp11, FIX(1.247225013)); /* c5 */
  2205. tmp3 = MULTIPLY(z1 + z4, FIX(1.093201867)); /* c7 */
  2206. tmp10 = MULTIPLY(z1 - z4, FIX(0.897167586)); /* c9 */
  2207. tmp11 = MULTIPLY(tmp11, FIX(0.666655658)); /* c11 */
  2208. tmp12 = MULTIPLY(z1 - z2, FIX(0.410524528)); /* c13 */
  2209. tmp0 = tmp1 + tmp2 + tmp3 -
  2210. MULTIPLY(z1, FIX(2.286341144)); /* c7+c5+c3-c1 */
  2211. tmp13 = tmp10 + tmp11 + tmp12 -
  2212. MULTIPLY(z1, FIX(1.835730603)); /* c9+c11+c13-c15 */
  2213. z1 = MULTIPLY(z2 + z3, FIX(0.138617169)); /* c15 */
  2214. tmp1 += z1 + MULTIPLY(z2, FIX(0.071888074)); /* c9+c11-c3-c15 */
  2215. tmp2 += z1 - MULTIPLY(z3, FIX(1.125726048)); /* c5+c7+c15-c3 */
  2216. z1 = MULTIPLY(z3 - z2, FIX(1.407403738)); /* c1 */
  2217. tmp11 += z1 - MULTIPLY(z3, FIX(0.766367282)); /* c1+c11-c9-c13 */
  2218. tmp12 += z1 + MULTIPLY(z2, FIX(1.971951411)); /* c1+c5+c13-c7 */
  2219. z2 += z4;
  2220. z1 = MULTIPLY(z2, - FIX(0.666655658)); /* -c11 */
  2221. tmp1 += z1;
  2222. tmp3 += z1 + MULTIPLY(z4, FIX(1.065388962)); /* c3+c11+c15-c7 */
  2223. z2 = MULTIPLY(z2, - FIX(1.247225013)); /* -c5 */
  2224. tmp10 += z2 + MULTIPLY(z4, FIX(3.141271809)); /* c1+c5+c9-c13 */
  2225. tmp12 += z2;
  2226. z2 = MULTIPLY(z3 + z4, - FIX(1.353318001)); /* -c3 */
  2227. tmp2 += z2;
  2228. tmp3 += z2;
  2229. z2 = MULTIPLY(z4 - z3, FIX(0.410524528)); /* c13 */
  2230. tmp10 += z2;
  2231. tmp11 += z2;
  2232. /* Final output stage */
  2233. wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp0, CONST_BITS-PASS1_BITS);
  2234. wsptr[8*15] = (int) RIGHT_SHIFT(tmp20 - tmp0, CONST_BITS-PASS1_BITS);
  2235. wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp1, CONST_BITS-PASS1_BITS);
  2236. wsptr[8*14] = (int) RIGHT_SHIFT(tmp21 - tmp1, CONST_BITS-PASS1_BITS);
  2237. wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp2, CONST_BITS-PASS1_BITS);
  2238. wsptr[8*13] = (int) RIGHT_SHIFT(tmp22 - tmp2, CONST_BITS-PASS1_BITS);
  2239. wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp3, CONST_BITS-PASS1_BITS);
  2240. wsptr[8*12] = (int) RIGHT_SHIFT(tmp23 - tmp3, CONST_BITS-PASS1_BITS);
  2241. wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp10, CONST_BITS-PASS1_BITS);
  2242. wsptr[8*11] = (int) RIGHT_SHIFT(tmp24 - tmp10, CONST_BITS-PASS1_BITS);
  2243. wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp11, CONST_BITS-PASS1_BITS);
  2244. wsptr[8*10] = (int) RIGHT_SHIFT(tmp25 - tmp11, CONST_BITS-PASS1_BITS);
  2245. wsptr[8*6] = (int) RIGHT_SHIFT(tmp26 + tmp12, CONST_BITS-PASS1_BITS);
  2246. wsptr[8*9] = (int) RIGHT_SHIFT(tmp26 - tmp12, CONST_BITS-PASS1_BITS);
  2247. wsptr[8*7] = (int) RIGHT_SHIFT(tmp27 + tmp13, CONST_BITS-PASS1_BITS);
  2248. wsptr[8*8] = (int) RIGHT_SHIFT(tmp27 - tmp13, CONST_BITS-PASS1_BITS);
  2249. }
  2250. /* Pass 2: process 16 rows from work array, store into output array. */
  2251. wsptr = workspace;
  2252. for (ctr = 0; ctr < 16; ctr++) {
  2253. outptr = output_buf[ctr] + output_col;
  2254. /* Even part */
  2255. /* Add range center and fudge factor for final descale and range-limit. */
  2256. tmp0 = (INT32) wsptr[0] +
  2257. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  2258. (ONE << (PASS1_BITS+2)));
  2259. tmp0 <<= CONST_BITS;
  2260. z1 = (INT32) wsptr[4];
  2261. tmp1 = MULTIPLY(z1, FIX(1.306562965)); /* c4[16] = c2[8] */
  2262. tmp2 = MULTIPLY(z1, FIX_0_541196100); /* c12[16] = c6[8] */
  2263. tmp10 = tmp0 + tmp1;
  2264. tmp11 = tmp0 - tmp1;
  2265. tmp12 = tmp0 + tmp2;
  2266. tmp13 = tmp0 - tmp2;
  2267. z1 = (INT32) wsptr[2];
  2268. z2 = (INT32) wsptr[6];
  2269. z3 = z1 - z2;
  2270. z4 = MULTIPLY(z3, FIX(0.275899379)); /* c14[16] = c7[8] */
  2271. z3 = MULTIPLY(z3, FIX(1.387039845)); /* c2[16] = c1[8] */
  2272. tmp0 = z3 + MULTIPLY(z2, FIX_2_562915447); /* (c6+c2)[16] = (c3+c1)[8] */
  2273. tmp1 = z4 + MULTIPLY(z1, FIX_0_899976223); /* (c6-c14)[16] = (c3-c7)[8] */
  2274. tmp2 = z3 - MULTIPLY(z1, FIX(0.601344887)); /* (c2-c10)[16] = (c1-c5)[8] */
  2275. tmp3 = z4 - MULTIPLY(z2, FIX(0.509795579)); /* (c10-c14)[16] = (c5-c7)[8] */
  2276. tmp20 = tmp10 + tmp0;
  2277. tmp27 = tmp10 - tmp0;
  2278. tmp21 = tmp12 + tmp1;
  2279. tmp26 = tmp12 - tmp1;
  2280. tmp22 = tmp13 + tmp2;
  2281. tmp25 = tmp13 - tmp2;
  2282. tmp23 = tmp11 + tmp3;
  2283. tmp24 = tmp11 - tmp3;
  2284. /* Odd part */
  2285. z1 = (INT32) wsptr[1];
  2286. z2 = (INT32) wsptr[3];
  2287. z3 = (INT32) wsptr[5];
  2288. z4 = (INT32) wsptr[7];
  2289. tmp11 = z1 + z3;
  2290. tmp1 = MULTIPLY(z1 + z2, FIX(1.353318001)); /* c3 */
  2291. tmp2 = MULTIPLY(tmp11, FIX(1.247225013)); /* c5 */
  2292. tmp3 = MULTIPLY(z1 + z4, FIX(1.093201867)); /* c7 */
  2293. tmp10 = MULTIPLY(z1 - z4, FIX(0.897167586)); /* c9 */
  2294. tmp11 = MULTIPLY(tmp11, FIX(0.666655658)); /* c11 */
  2295. tmp12 = MULTIPLY(z1 - z2, FIX(0.410524528)); /* c13 */
  2296. tmp0 = tmp1 + tmp2 + tmp3 -
  2297. MULTIPLY(z1, FIX(2.286341144)); /* c7+c5+c3-c1 */
  2298. tmp13 = tmp10 + tmp11 + tmp12 -
  2299. MULTIPLY(z1, FIX(1.835730603)); /* c9+c11+c13-c15 */
  2300. z1 = MULTIPLY(z2 + z3, FIX(0.138617169)); /* c15 */
  2301. tmp1 += z1 + MULTIPLY(z2, FIX(0.071888074)); /* c9+c11-c3-c15 */
  2302. tmp2 += z1 - MULTIPLY(z3, FIX(1.125726048)); /* c5+c7+c15-c3 */
  2303. z1 = MULTIPLY(z3 - z2, FIX(1.407403738)); /* c1 */
  2304. tmp11 += z1 - MULTIPLY(z3, FIX(0.766367282)); /* c1+c11-c9-c13 */
  2305. tmp12 += z1 + MULTIPLY(z2, FIX(1.971951411)); /* c1+c5+c13-c7 */
  2306. z2 += z4;
  2307. z1 = MULTIPLY(z2, - FIX(0.666655658)); /* -c11 */
  2308. tmp1 += z1;
  2309. tmp3 += z1 + MULTIPLY(z4, FIX(1.065388962)); /* c3+c11+c15-c7 */
  2310. z2 = MULTIPLY(z2, - FIX(1.247225013)); /* -c5 */
  2311. tmp10 += z2 + MULTIPLY(z4, FIX(3.141271809)); /* c1+c5+c9-c13 */
  2312. tmp12 += z2;
  2313. z2 = MULTIPLY(z3 + z4, - FIX(1.353318001)); /* -c3 */
  2314. tmp2 += z2;
  2315. tmp3 += z2;
  2316. z2 = MULTIPLY(z4 - z3, FIX(0.410524528)); /* c13 */
  2317. tmp10 += z2;
  2318. tmp11 += z2;
  2319. /* Final output stage */
  2320. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp0,
  2321. CONST_BITS+PASS1_BITS+3)
  2322. & RANGE_MASK];
  2323. outptr[15] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp0,
  2324. CONST_BITS+PASS1_BITS+3)
  2325. & RANGE_MASK];
  2326. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp1,
  2327. CONST_BITS+PASS1_BITS+3)
  2328. & RANGE_MASK];
  2329. outptr[14] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp1,
  2330. CONST_BITS+PASS1_BITS+3)
  2331. & RANGE_MASK];
  2332. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp2,
  2333. CONST_BITS+PASS1_BITS+3)
  2334. & RANGE_MASK];
  2335. outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp2,
  2336. CONST_BITS+PASS1_BITS+3)
  2337. & RANGE_MASK];
  2338. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp3,
  2339. CONST_BITS+PASS1_BITS+3)
  2340. & RANGE_MASK];
  2341. outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp3,
  2342. CONST_BITS+PASS1_BITS+3)
  2343. & RANGE_MASK];
  2344. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp10,
  2345. CONST_BITS+PASS1_BITS+3)
  2346. & RANGE_MASK];
  2347. outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp10,
  2348. CONST_BITS+PASS1_BITS+3)
  2349. & RANGE_MASK];
  2350. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp11,
  2351. CONST_BITS+PASS1_BITS+3)
  2352. & RANGE_MASK];
  2353. outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp11,
  2354. CONST_BITS+PASS1_BITS+3)
  2355. & RANGE_MASK];
  2356. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp12,
  2357. CONST_BITS+PASS1_BITS+3)
  2358. & RANGE_MASK];
  2359. outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp12,
  2360. CONST_BITS+PASS1_BITS+3)
  2361. & RANGE_MASK];
  2362. outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp27 + tmp13,
  2363. CONST_BITS+PASS1_BITS+3)
  2364. & RANGE_MASK];
  2365. outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp27 - tmp13,
  2366. CONST_BITS+PASS1_BITS+3)
  2367. & RANGE_MASK];
  2368. wsptr += 8; /* advance pointer to next row */
  2369. }
  2370. }
  2371. /*
  2372. * Perform dequantization and inverse DCT on one block of coefficients,
  2373. * producing a 16x8 output block.
  2374. *
  2375. * 8-point IDCT in pass 1 (columns), 16-point in pass 2 (rows).
  2376. */
  2377. GLOBAL(void)
  2378. jpeg_idct_16x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  2379. JCOEFPTR coef_block,
  2380. JSAMPARRAY output_buf, JDIMENSION output_col)
  2381. {
  2382. INT32 tmp0, tmp1, tmp2, tmp3, tmp10, tmp11, tmp12, tmp13;
  2383. INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27;
  2384. INT32 z1, z2, z3, z4;
  2385. JCOEFPTR inptr;
  2386. ISLOW_MULT_TYPE * quantptr;
  2387. int * wsptr;
  2388. JSAMPROW outptr;
  2389. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  2390. int ctr;
  2391. int workspace[8*8]; /* buffers data between passes */
  2392. SHIFT_TEMPS
  2393. /* Pass 1: process columns from input, store into work array.
  2394. * Note results are scaled up by sqrt(8) compared to a true IDCT;
  2395. * furthermore, we scale the results by 2**PASS1_BITS.
  2396. * 8-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
  2397. */
  2398. inptr = coef_block;
  2399. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  2400. wsptr = workspace;
  2401. for (ctr = DCTSIZE; ctr > 0; ctr--) {
  2402. /* Due to quantization, we will usually find that many of the input
  2403. * coefficients are zero, especially the AC terms. We can exploit this
  2404. * by short-circuiting the IDCT calculation for any column in which all
  2405. * the AC terms are zero. In that case each output is equal to the
  2406. * DC coefficient (with scale factor as needed).
  2407. * With typical images and quantization tables, half or more of the
  2408. * column DCT calculations can be simplified this way.
  2409. */
  2410. if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
  2411. inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&
  2412. inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&
  2413. inptr[DCTSIZE*7] == 0) {
  2414. /* AC terms all zero */
  2415. int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;
  2416. wsptr[DCTSIZE*0] = dcval;
  2417. wsptr[DCTSIZE*1] = dcval;
  2418. wsptr[DCTSIZE*2] = dcval;
  2419. wsptr[DCTSIZE*3] = dcval;
  2420. wsptr[DCTSIZE*4] = dcval;
  2421. wsptr[DCTSIZE*5] = dcval;
  2422. wsptr[DCTSIZE*6] = dcval;
  2423. wsptr[DCTSIZE*7] = dcval;
  2424. inptr++; /* advance pointers to next column */
  2425. quantptr++;
  2426. wsptr++;
  2427. continue;
  2428. }
  2429. /* Even part: reverse the even part of the forward DCT.
  2430. * The rotator is c(-6).
  2431. */
  2432. z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  2433. z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  2434. z2 <<= CONST_BITS;
  2435. z3 <<= CONST_BITS;
  2436. /* Add fudge factor here for final descale. */
  2437. z2 += ONE << (CONST_BITS-PASS1_BITS-1);
  2438. tmp0 = z2 + z3;
  2439. tmp1 = z2 - z3;
  2440. z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  2441. z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  2442. z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
  2443. tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
  2444. tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
  2445. tmp10 = tmp0 + tmp2;
  2446. tmp13 = tmp0 - tmp2;
  2447. tmp11 = tmp1 + tmp3;
  2448. tmp12 = tmp1 - tmp3;
  2449. /* Odd part per figure 8; the matrix is unitary and hence its
  2450. * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
  2451. */
  2452. tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
  2453. tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  2454. tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  2455. tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  2456. z2 = tmp0 + tmp2;
  2457. z3 = tmp1 + tmp3;
  2458. z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* c3 */
  2459. z2 = MULTIPLY(z2, - FIX_1_961570560); /* -c3-c5 */
  2460. z3 = MULTIPLY(z3, - FIX_0_390180644); /* -c3+c5 */
  2461. z2 += z1;
  2462. z3 += z1;
  2463. z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
  2464. tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* -c1+c3+c5-c7 */
  2465. tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* c1+c3-c5-c7 */
  2466. tmp0 += z1 + z2;
  2467. tmp3 += z1 + z3;
  2468. z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
  2469. tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* c1+c3-c5+c7 */
  2470. tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* c1+c3+c5-c7 */
  2471. tmp1 += z1 + z3;
  2472. tmp2 += z1 + z2;
  2473. /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
  2474. wsptr[DCTSIZE*0] = (int) RIGHT_SHIFT(tmp10 + tmp3, CONST_BITS-PASS1_BITS);
  2475. wsptr[DCTSIZE*7] = (int) RIGHT_SHIFT(tmp10 - tmp3, CONST_BITS-PASS1_BITS);
  2476. wsptr[DCTSIZE*1] = (int) RIGHT_SHIFT(tmp11 + tmp2, CONST_BITS-PASS1_BITS);
  2477. wsptr[DCTSIZE*6] = (int) RIGHT_SHIFT(tmp11 - tmp2, CONST_BITS-PASS1_BITS);
  2478. wsptr[DCTSIZE*2] = (int) RIGHT_SHIFT(tmp12 + tmp1, CONST_BITS-PASS1_BITS);
  2479. wsptr[DCTSIZE*5] = (int) RIGHT_SHIFT(tmp12 - tmp1, CONST_BITS-PASS1_BITS);
  2480. wsptr[DCTSIZE*3] = (int) RIGHT_SHIFT(tmp13 + tmp0, CONST_BITS-PASS1_BITS);
  2481. wsptr[DCTSIZE*4] = (int) RIGHT_SHIFT(tmp13 - tmp0, CONST_BITS-PASS1_BITS);
  2482. inptr++; /* advance pointers to next column */
  2483. quantptr++;
  2484. wsptr++;
  2485. }
  2486. /* Pass 2: process 8 rows from work array, store into output array.
  2487. * 16-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/32).
  2488. */
  2489. wsptr = workspace;
  2490. for (ctr = 0; ctr < 8; ctr++) {
  2491. outptr = output_buf[ctr] + output_col;
  2492. /* Even part */
  2493. /* Add range center and fudge factor for final descale and range-limit. */
  2494. tmp0 = (INT32) wsptr[0] +
  2495. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  2496. (ONE << (PASS1_BITS+2)));
  2497. tmp0 <<= CONST_BITS;
  2498. z1 = (INT32) wsptr[4];
  2499. tmp1 = MULTIPLY(z1, FIX(1.306562965)); /* c4[16] = c2[8] */
  2500. tmp2 = MULTIPLY(z1, FIX_0_541196100); /* c12[16] = c6[8] */
  2501. tmp10 = tmp0 + tmp1;
  2502. tmp11 = tmp0 - tmp1;
  2503. tmp12 = tmp0 + tmp2;
  2504. tmp13 = tmp0 - tmp2;
  2505. z1 = (INT32) wsptr[2];
  2506. z2 = (INT32) wsptr[6];
  2507. z3 = z1 - z2;
  2508. z4 = MULTIPLY(z3, FIX(0.275899379)); /* c14[16] = c7[8] */
  2509. z3 = MULTIPLY(z3, FIX(1.387039845)); /* c2[16] = c1[8] */
  2510. tmp0 = z3 + MULTIPLY(z2, FIX_2_562915447); /* (c6+c2)[16] = (c3+c1)[8] */
  2511. tmp1 = z4 + MULTIPLY(z1, FIX_0_899976223); /* (c6-c14)[16] = (c3-c7)[8] */
  2512. tmp2 = z3 - MULTIPLY(z1, FIX(0.601344887)); /* (c2-c10)[16] = (c1-c5)[8] */
  2513. tmp3 = z4 - MULTIPLY(z2, FIX(0.509795579)); /* (c10-c14)[16] = (c5-c7)[8] */
  2514. tmp20 = tmp10 + tmp0;
  2515. tmp27 = tmp10 - tmp0;
  2516. tmp21 = tmp12 + tmp1;
  2517. tmp26 = tmp12 - tmp1;
  2518. tmp22 = tmp13 + tmp2;
  2519. tmp25 = tmp13 - tmp2;
  2520. tmp23 = tmp11 + tmp3;
  2521. tmp24 = tmp11 - tmp3;
  2522. /* Odd part */
  2523. z1 = (INT32) wsptr[1];
  2524. z2 = (INT32) wsptr[3];
  2525. z3 = (INT32) wsptr[5];
  2526. z4 = (INT32) wsptr[7];
  2527. tmp11 = z1 + z3;
  2528. tmp1 = MULTIPLY(z1 + z2, FIX(1.353318001)); /* c3 */
  2529. tmp2 = MULTIPLY(tmp11, FIX(1.247225013)); /* c5 */
  2530. tmp3 = MULTIPLY(z1 + z4, FIX(1.093201867)); /* c7 */
  2531. tmp10 = MULTIPLY(z1 - z4, FIX(0.897167586)); /* c9 */
  2532. tmp11 = MULTIPLY(tmp11, FIX(0.666655658)); /* c11 */
  2533. tmp12 = MULTIPLY(z1 - z2, FIX(0.410524528)); /* c13 */
  2534. tmp0 = tmp1 + tmp2 + tmp3 -
  2535. MULTIPLY(z1, FIX(2.286341144)); /* c7+c5+c3-c1 */
  2536. tmp13 = tmp10 + tmp11 + tmp12 -
  2537. MULTIPLY(z1, FIX(1.835730603)); /* c9+c11+c13-c15 */
  2538. z1 = MULTIPLY(z2 + z3, FIX(0.138617169)); /* c15 */
  2539. tmp1 += z1 + MULTIPLY(z2, FIX(0.071888074)); /* c9+c11-c3-c15 */
  2540. tmp2 += z1 - MULTIPLY(z3, FIX(1.125726048)); /* c5+c7+c15-c3 */
  2541. z1 = MULTIPLY(z3 - z2, FIX(1.407403738)); /* c1 */
  2542. tmp11 += z1 - MULTIPLY(z3, FIX(0.766367282)); /* c1+c11-c9-c13 */
  2543. tmp12 += z1 + MULTIPLY(z2, FIX(1.971951411)); /* c1+c5+c13-c7 */
  2544. z2 += z4;
  2545. z1 = MULTIPLY(z2, - FIX(0.666655658)); /* -c11 */
  2546. tmp1 += z1;
  2547. tmp3 += z1 + MULTIPLY(z4, FIX(1.065388962)); /* c3+c11+c15-c7 */
  2548. z2 = MULTIPLY(z2, - FIX(1.247225013)); /* -c5 */
  2549. tmp10 += z2 + MULTIPLY(z4, FIX(3.141271809)); /* c1+c5+c9-c13 */
  2550. tmp12 += z2;
  2551. z2 = MULTIPLY(z3 + z4, - FIX(1.353318001)); /* -c3 */
  2552. tmp2 += z2;
  2553. tmp3 += z2;
  2554. z2 = MULTIPLY(z4 - z3, FIX(0.410524528)); /* c13 */
  2555. tmp10 += z2;
  2556. tmp11 += z2;
  2557. /* Final output stage */
  2558. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp0,
  2559. CONST_BITS+PASS1_BITS+3)
  2560. & RANGE_MASK];
  2561. outptr[15] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp0,
  2562. CONST_BITS+PASS1_BITS+3)
  2563. & RANGE_MASK];
  2564. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp1,
  2565. CONST_BITS+PASS1_BITS+3)
  2566. & RANGE_MASK];
  2567. outptr[14] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp1,
  2568. CONST_BITS+PASS1_BITS+3)
  2569. & RANGE_MASK];
  2570. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp2,
  2571. CONST_BITS+PASS1_BITS+3)
  2572. & RANGE_MASK];
  2573. outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp2,
  2574. CONST_BITS+PASS1_BITS+3)
  2575. & RANGE_MASK];
  2576. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp3,
  2577. CONST_BITS+PASS1_BITS+3)
  2578. & RANGE_MASK];
  2579. outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp3,
  2580. CONST_BITS+PASS1_BITS+3)
  2581. & RANGE_MASK];
  2582. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp10,
  2583. CONST_BITS+PASS1_BITS+3)
  2584. & RANGE_MASK];
  2585. outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp10,
  2586. CONST_BITS+PASS1_BITS+3)
  2587. & RANGE_MASK];
  2588. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp11,
  2589. CONST_BITS+PASS1_BITS+3)
  2590. & RANGE_MASK];
  2591. outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp11,
  2592. CONST_BITS+PASS1_BITS+3)
  2593. & RANGE_MASK];
  2594. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp12,
  2595. CONST_BITS+PASS1_BITS+3)
  2596. & RANGE_MASK];
  2597. outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp12,
  2598. CONST_BITS+PASS1_BITS+3)
  2599. & RANGE_MASK];
  2600. outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp27 + tmp13,
  2601. CONST_BITS+PASS1_BITS+3)
  2602. & RANGE_MASK];
  2603. outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp27 - tmp13,
  2604. CONST_BITS+PASS1_BITS+3)
  2605. & RANGE_MASK];
  2606. wsptr += 8; /* advance pointer to next row */
  2607. }
  2608. }
  2609. /*
  2610. * Perform dequantization and inverse DCT on one block of coefficients,
  2611. * producing a 14x7 output block.
  2612. *
  2613. * 7-point IDCT in pass 1 (columns), 14-point in pass 2 (rows).
  2614. */
  2615. GLOBAL(void)
  2616. jpeg_idct_14x7 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  2617. JCOEFPTR coef_block,
  2618. JSAMPARRAY output_buf, JDIMENSION output_col)
  2619. {
  2620. INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16;
  2621. INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26;
  2622. INT32 z1, z2, z3, z4;
  2623. JCOEFPTR inptr;
  2624. ISLOW_MULT_TYPE * quantptr;
  2625. int * wsptr;
  2626. JSAMPROW outptr;
  2627. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  2628. int ctr;
  2629. int workspace[8*7]; /* buffers data between passes */
  2630. SHIFT_TEMPS
  2631. /* Pass 1: process columns from input, store into work array.
  2632. * 7-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/14).
  2633. */
  2634. inptr = coef_block;
  2635. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  2636. wsptr = workspace;
  2637. for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {
  2638. /* Even part */
  2639. tmp23 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  2640. tmp23 <<= CONST_BITS;
  2641. /* Add fudge factor here for final descale. */
  2642. tmp23 += ONE << (CONST_BITS-PASS1_BITS-1);
  2643. z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  2644. z2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  2645. z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  2646. tmp20 = MULTIPLY(z2 - z3, FIX(0.881747734)); /* c4 */
  2647. tmp22 = MULTIPLY(z1 - z2, FIX(0.314692123)); /* c6 */
  2648. tmp21 = tmp20 + tmp22 + tmp23 - MULTIPLY(z2, FIX(1.841218003)); /* c2+c4-c6 */
  2649. tmp10 = z1 + z3;
  2650. z2 -= tmp10;
  2651. tmp10 = MULTIPLY(tmp10, FIX(1.274162392)) + tmp23; /* c2 */
  2652. tmp20 += tmp10 - MULTIPLY(z3, FIX(0.077722536)); /* c2-c4-c6 */
  2653. tmp22 += tmp10 - MULTIPLY(z1, FIX(2.470602249)); /* c2+c4+c6 */
  2654. tmp23 += MULTIPLY(z2, FIX(1.414213562)); /* c0 */
  2655. /* Odd part */
  2656. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  2657. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  2658. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  2659. tmp11 = MULTIPLY(z1 + z2, FIX(0.935414347)); /* (c3+c1-c5)/2 */
  2660. tmp12 = MULTIPLY(z1 - z2, FIX(0.170262339)); /* (c3+c5-c1)/2 */
  2661. tmp10 = tmp11 - tmp12;
  2662. tmp11 += tmp12;
  2663. tmp12 = MULTIPLY(z2 + z3, - FIX(1.378756276)); /* -c1 */
  2664. tmp11 += tmp12;
  2665. z2 = MULTIPLY(z1 + z3, FIX(0.613604268)); /* c5 */
  2666. tmp10 += z2;
  2667. tmp12 += z2 + MULTIPLY(z3, FIX(1.870828693)); /* c3+c1-c5 */
  2668. /* Final output stage */
  2669. wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);
  2670. wsptr[8*6] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);
  2671. wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS);
  2672. wsptr[8*5] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS);
  2673. wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS);
  2674. wsptr[8*4] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS);
  2675. wsptr[8*3] = (int) RIGHT_SHIFT(tmp23, CONST_BITS-PASS1_BITS);
  2676. }
  2677. /* Pass 2: process 7 rows from work array, store into output array.
  2678. * 14-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/28).
  2679. */
  2680. wsptr = workspace;
  2681. for (ctr = 0; ctr < 7; ctr++) {
  2682. outptr = output_buf[ctr] + output_col;
  2683. /* Even part */
  2684. /* Add range center and fudge factor for final descale and range-limit. */
  2685. z1 = (INT32) wsptr[0] +
  2686. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  2687. (ONE << (PASS1_BITS+2)));
  2688. z1 <<= CONST_BITS;
  2689. z4 = (INT32) wsptr[4];
  2690. z2 = MULTIPLY(z4, FIX(1.274162392)); /* c4 */
  2691. z3 = MULTIPLY(z4, FIX(0.314692123)); /* c12 */
  2692. z4 = MULTIPLY(z4, FIX(0.881747734)); /* c8 */
  2693. tmp10 = z1 + z2;
  2694. tmp11 = z1 + z3;
  2695. tmp12 = z1 - z4;
  2696. tmp23 = z1 - ((z2 + z3 - z4) << 1); /* c0 = (c4+c12-c8)*2 */
  2697. z1 = (INT32) wsptr[2];
  2698. z2 = (INT32) wsptr[6];
  2699. z3 = MULTIPLY(z1 + z2, FIX(1.105676686)); /* c6 */
  2700. tmp13 = z3 + MULTIPLY(z1, FIX(0.273079590)); /* c2-c6 */
  2701. tmp14 = z3 - MULTIPLY(z2, FIX(1.719280954)); /* c6+c10 */
  2702. tmp15 = MULTIPLY(z1, FIX(0.613604268)) - /* c10 */
  2703. MULTIPLY(z2, FIX(1.378756276)); /* c2 */
  2704. tmp20 = tmp10 + tmp13;
  2705. tmp26 = tmp10 - tmp13;
  2706. tmp21 = tmp11 + tmp14;
  2707. tmp25 = tmp11 - tmp14;
  2708. tmp22 = tmp12 + tmp15;
  2709. tmp24 = tmp12 - tmp15;
  2710. /* Odd part */
  2711. z1 = (INT32) wsptr[1];
  2712. z2 = (INT32) wsptr[3];
  2713. z3 = (INT32) wsptr[5];
  2714. z4 = (INT32) wsptr[7];
  2715. z4 <<= CONST_BITS;
  2716. tmp14 = z1 + z3;
  2717. tmp11 = MULTIPLY(z1 + z2, FIX(1.334852607)); /* c3 */
  2718. tmp12 = MULTIPLY(tmp14, FIX(1.197448846)); /* c5 */
  2719. tmp10 = tmp11 + tmp12 + z4 - MULTIPLY(z1, FIX(1.126980169)); /* c3+c5-c1 */
  2720. tmp14 = MULTIPLY(tmp14, FIX(0.752406978)); /* c9 */
  2721. tmp16 = tmp14 - MULTIPLY(z1, FIX(1.061150426)); /* c9+c11-c13 */
  2722. z1 -= z2;
  2723. tmp15 = MULTIPLY(z1, FIX(0.467085129)) - z4; /* c11 */
  2724. tmp16 += tmp15;
  2725. tmp13 = MULTIPLY(z2 + z3, - FIX(0.158341681)) - z4; /* -c13 */
  2726. tmp11 += tmp13 - MULTIPLY(z2, FIX(0.424103948)); /* c3-c9-c13 */
  2727. tmp12 += tmp13 - MULTIPLY(z3, FIX(2.373959773)); /* c3+c5-c13 */
  2728. tmp13 = MULTIPLY(z3 - z2, FIX(1.405321284)); /* c1 */
  2729. tmp14 += tmp13 + z4 - MULTIPLY(z3, FIX(1.6906431334)); /* c1+c9-c11 */
  2730. tmp15 += tmp13 + MULTIPLY(z2, FIX(0.674957567)); /* c1+c11-c5 */
  2731. tmp13 = ((z1 - z3) << CONST_BITS) + z4;
  2732. /* Final output stage */
  2733. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,
  2734. CONST_BITS+PASS1_BITS+3)
  2735. & RANGE_MASK];
  2736. outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,
  2737. CONST_BITS+PASS1_BITS+3)
  2738. & RANGE_MASK];
  2739. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,
  2740. CONST_BITS+PASS1_BITS+3)
  2741. & RANGE_MASK];
  2742. outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,
  2743. CONST_BITS+PASS1_BITS+3)
  2744. & RANGE_MASK];
  2745. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,
  2746. CONST_BITS+PASS1_BITS+3)
  2747. & RANGE_MASK];
  2748. outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,
  2749. CONST_BITS+PASS1_BITS+3)
  2750. & RANGE_MASK];
  2751. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13,
  2752. CONST_BITS+PASS1_BITS+3)
  2753. & RANGE_MASK];
  2754. outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13,
  2755. CONST_BITS+PASS1_BITS+3)
  2756. & RANGE_MASK];
  2757. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14,
  2758. CONST_BITS+PASS1_BITS+3)
  2759. & RANGE_MASK];
  2760. outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14,
  2761. CONST_BITS+PASS1_BITS+3)
  2762. & RANGE_MASK];
  2763. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15,
  2764. CONST_BITS+PASS1_BITS+3)
  2765. & RANGE_MASK];
  2766. outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15,
  2767. CONST_BITS+PASS1_BITS+3)
  2768. & RANGE_MASK];
  2769. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp16,
  2770. CONST_BITS+PASS1_BITS+3)
  2771. & RANGE_MASK];
  2772. outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp16,
  2773. CONST_BITS+PASS1_BITS+3)
  2774. & RANGE_MASK];
  2775. wsptr += 8; /* advance pointer to next row */
  2776. }
  2777. }
  2778. /*
  2779. * Perform dequantization and inverse DCT on one block of coefficients,
  2780. * producing a 12x6 output block.
  2781. *
  2782. * 6-point IDCT in pass 1 (columns), 12-point in pass 2 (rows).
  2783. */
  2784. GLOBAL(void)
  2785. jpeg_idct_12x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  2786. JCOEFPTR coef_block,
  2787. JSAMPARRAY output_buf, JDIMENSION output_col)
  2788. {
  2789. INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15;
  2790. INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25;
  2791. INT32 z1, z2, z3, z4;
  2792. JCOEFPTR inptr;
  2793. ISLOW_MULT_TYPE * quantptr;
  2794. int * wsptr;
  2795. JSAMPROW outptr;
  2796. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  2797. int ctr;
  2798. int workspace[8*6]; /* buffers data between passes */
  2799. SHIFT_TEMPS
  2800. /* Pass 1: process columns from input, store into work array.
  2801. * 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12).
  2802. */
  2803. inptr = coef_block;
  2804. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  2805. wsptr = workspace;
  2806. for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {
  2807. /* Even part */
  2808. tmp10 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  2809. tmp10 <<= CONST_BITS;
  2810. /* Add fudge factor here for final descale. */
  2811. tmp10 += ONE << (CONST_BITS-PASS1_BITS-1);
  2812. tmp12 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  2813. tmp20 = MULTIPLY(tmp12, FIX(0.707106781)); /* c4 */
  2814. tmp11 = tmp10 + tmp20;
  2815. tmp21 = RIGHT_SHIFT(tmp10 - tmp20 - tmp20, CONST_BITS-PASS1_BITS);
  2816. tmp20 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  2817. tmp10 = MULTIPLY(tmp20, FIX(1.224744871)); /* c2 */
  2818. tmp20 = tmp11 + tmp10;
  2819. tmp22 = tmp11 - tmp10;
  2820. /* Odd part */
  2821. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  2822. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  2823. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  2824. tmp11 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */
  2825. tmp10 = tmp11 + ((z1 + z2) << CONST_BITS);
  2826. tmp12 = tmp11 + ((z3 - z2) << CONST_BITS);
  2827. tmp11 = (z1 - z2 - z3) << PASS1_BITS;
  2828. /* Final output stage */
  2829. wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);
  2830. wsptr[8*5] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);
  2831. wsptr[8*1] = (int) (tmp21 + tmp11);
  2832. wsptr[8*4] = (int) (tmp21 - tmp11);
  2833. wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS);
  2834. wsptr[8*3] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS);
  2835. }
  2836. /* Pass 2: process 6 rows from work array, store into output array.
  2837. * 12-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/24).
  2838. */
  2839. wsptr = workspace;
  2840. for (ctr = 0; ctr < 6; ctr++) {
  2841. outptr = output_buf[ctr] + output_col;
  2842. /* Even part */
  2843. /* Add range center and fudge factor for final descale and range-limit. */
  2844. z3 = (INT32) wsptr[0] +
  2845. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  2846. (ONE << (PASS1_BITS+2)));
  2847. z3 <<= CONST_BITS;
  2848. z4 = (INT32) wsptr[4];
  2849. z4 = MULTIPLY(z4, FIX(1.224744871)); /* c4 */
  2850. tmp10 = z3 + z4;
  2851. tmp11 = z3 - z4;
  2852. z1 = (INT32) wsptr[2];
  2853. z4 = MULTIPLY(z1, FIX(1.366025404)); /* c2 */
  2854. z1 <<= CONST_BITS;
  2855. z2 = (INT32) wsptr[6];
  2856. z2 <<= CONST_BITS;
  2857. tmp12 = z1 - z2;
  2858. tmp21 = z3 + tmp12;
  2859. tmp24 = z3 - tmp12;
  2860. tmp12 = z4 + z2;
  2861. tmp20 = tmp10 + tmp12;
  2862. tmp25 = tmp10 - tmp12;
  2863. tmp12 = z4 - z1 - z2;
  2864. tmp22 = tmp11 + tmp12;
  2865. tmp23 = tmp11 - tmp12;
  2866. /* Odd part */
  2867. z1 = (INT32) wsptr[1];
  2868. z2 = (INT32) wsptr[3];
  2869. z3 = (INT32) wsptr[5];
  2870. z4 = (INT32) wsptr[7];
  2871. tmp11 = MULTIPLY(z2, FIX(1.306562965)); /* c3 */
  2872. tmp14 = MULTIPLY(z2, - FIX_0_541196100); /* -c9 */
  2873. tmp10 = z1 + z3;
  2874. tmp15 = MULTIPLY(tmp10 + z4, FIX(0.860918669)); /* c7 */
  2875. tmp12 = tmp15 + MULTIPLY(tmp10, FIX(0.261052384)); /* c5-c7 */
  2876. tmp10 = tmp12 + tmp11 + MULTIPLY(z1, FIX(0.280143716)); /* c1-c5 */
  2877. tmp13 = MULTIPLY(z3 + z4, - FIX(1.045510580)); /* -(c7+c11) */
  2878. tmp12 += tmp13 + tmp14 - MULTIPLY(z3, FIX(1.478575242)); /* c1+c5-c7-c11 */
  2879. tmp13 += tmp15 - tmp11 + MULTIPLY(z4, FIX(1.586706681)); /* c1+c11 */
  2880. tmp15 += tmp14 - MULTIPLY(z1, FIX(0.676326758)) - /* c7-c11 */
  2881. MULTIPLY(z4, FIX(1.982889723)); /* c5+c7 */
  2882. z1 -= z4;
  2883. z2 -= z3;
  2884. z3 = MULTIPLY(z1 + z2, FIX_0_541196100); /* c9 */
  2885. tmp11 = z3 + MULTIPLY(z1, FIX_0_765366865); /* c3-c9 */
  2886. tmp14 = z3 - MULTIPLY(z2, FIX_1_847759065); /* c3+c9 */
  2887. /* Final output stage */
  2888. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,
  2889. CONST_BITS+PASS1_BITS+3)
  2890. & RANGE_MASK];
  2891. outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,
  2892. CONST_BITS+PASS1_BITS+3)
  2893. & RANGE_MASK];
  2894. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,
  2895. CONST_BITS+PASS1_BITS+3)
  2896. & RANGE_MASK];
  2897. outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,
  2898. CONST_BITS+PASS1_BITS+3)
  2899. & RANGE_MASK];
  2900. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,
  2901. CONST_BITS+PASS1_BITS+3)
  2902. & RANGE_MASK];
  2903. outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,
  2904. CONST_BITS+PASS1_BITS+3)
  2905. & RANGE_MASK];
  2906. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13,
  2907. CONST_BITS+PASS1_BITS+3)
  2908. & RANGE_MASK];
  2909. outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13,
  2910. CONST_BITS+PASS1_BITS+3)
  2911. & RANGE_MASK];
  2912. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14,
  2913. CONST_BITS+PASS1_BITS+3)
  2914. & RANGE_MASK];
  2915. outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14,
  2916. CONST_BITS+PASS1_BITS+3)
  2917. & RANGE_MASK];
  2918. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15,
  2919. CONST_BITS+PASS1_BITS+3)
  2920. & RANGE_MASK];
  2921. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15,
  2922. CONST_BITS+PASS1_BITS+3)
  2923. & RANGE_MASK];
  2924. wsptr += 8; /* advance pointer to next row */
  2925. }
  2926. }
  2927. /*
  2928. * Perform dequantization and inverse DCT on one block of coefficients,
  2929. * producing a 10x5 output block.
  2930. *
  2931. * 5-point IDCT in pass 1 (columns), 10-point in pass 2 (rows).
  2932. */
  2933. GLOBAL(void)
  2934. jpeg_idct_10x5 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  2935. JCOEFPTR coef_block,
  2936. JSAMPARRAY output_buf, JDIMENSION output_col)
  2937. {
  2938. INT32 tmp10, tmp11, tmp12, tmp13, tmp14;
  2939. INT32 tmp20, tmp21, tmp22, tmp23, tmp24;
  2940. INT32 z1, z2, z3, z4;
  2941. JCOEFPTR inptr;
  2942. ISLOW_MULT_TYPE * quantptr;
  2943. int * wsptr;
  2944. JSAMPROW outptr;
  2945. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  2946. int ctr;
  2947. int workspace[8*5]; /* buffers data between passes */
  2948. SHIFT_TEMPS
  2949. /* Pass 1: process columns from input, store into work array.
  2950. * 5-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/10).
  2951. */
  2952. inptr = coef_block;
  2953. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  2954. wsptr = workspace;
  2955. for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {
  2956. /* Even part */
  2957. tmp12 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  2958. tmp12 <<= CONST_BITS;
  2959. /* Add fudge factor here for final descale. */
  2960. tmp12 += ONE << (CONST_BITS-PASS1_BITS-1);
  2961. tmp13 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  2962. tmp14 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  2963. z1 = MULTIPLY(tmp13 + tmp14, FIX(0.790569415)); /* (c2+c4)/2 */
  2964. z2 = MULTIPLY(tmp13 - tmp14, FIX(0.353553391)); /* (c2-c4)/2 */
  2965. z3 = tmp12 + z2;
  2966. tmp10 = z3 + z1;
  2967. tmp11 = z3 - z1;
  2968. tmp12 -= z2 << 2;
  2969. /* Odd part */
  2970. z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  2971. z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  2972. z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c3 */
  2973. tmp13 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c1-c3 */
  2974. tmp14 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c1+c3 */
  2975. /* Final output stage */
  2976. wsptr[8*0] = (int) RIGHT_SHIFT(tmp10 + tmp13, CONST_BITS-PASS1_BITS);
  2977. wsptr[8*4] = (int) RIGHT_SHIFT(tmp10 - tmp13, CONST_BITS-PASS1_BITS);
  2978. wsptr[8*1] = (int) RIGHT_SHIFT(tmp11 + tmp14, CONST_BITS-PASS1_BITS);
  2979. wsptr[8*3] = (int) RIGHT_SHIFT(tmp11 - tmp14, CONST_BITS-PASS1_BITS);
  2980. wsptr[8*2] = (int) RIGHT_SHIFT(tmp12, CONST_BITS-PASS1_BITS);
  2981. }
  2982. /* Pass 2: process 5 rows from work array, store into output array.
  2983. * 10-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/20).
  2984. */
  2985. wsptr = workspace;
  2986. for (ctr = 0; ctr < 5; ctr++) {
  2987. outptr = output_buf[ctr] + output_col;
  2988. /* Even part */
  2989. /* Add range center and fudge factor for final descale and range-limit. */
  2990. z3 = (INT32) wsptr[0] +
  2991. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  2992. (ONE << (PASS1_BITS+2)));
  2993. z3 <<= CONST_BITS;
  2994. z4 = (INT32) wsptr[4];
  2995. z1 = MULTIPLY(z4, FIX(1.144122806)); /* c4 */
  2996. z2 = MULTIPLY(z4, FIX(0.437016024)); /* c8 */
  2997. tmp10 = z3 + z1;
  2998. tmp11 = z3 - z2;
  2999. tmp22 = z3 - ((z1 - z2) << 1); /* c0 = (c4-c8)*2 */
  3000. z2 = (INT32) wsptr[2];
  3001. z3 = (INT32) wsptr[6];
  3002. z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c6 */
  3003. tmp12 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c2-c6 */
  3004. tmp13 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c2+c6 */
  3005. tmp20 = tmp10 + tmp12;
  3006. tmp24 = tmp10 - tmp12;
  3007. tmp21 = tmp11 + tmp13;
  3008. tmp23 = tmp11 - tmp13;
  3009. /* Odd part */
  3010. z1 = (INT32) wsptr[1];
  3011. z2 = (INT32) wsptr[3];
  3012. z3 = (INT32) wsptr[5];
  3013. z3 <<= CONST_BITS;
  3014. z4 = (INT32) wsptr[7];
  3015. tmp11 = z2 + z4;
  3016. tmp13 = z2 - z4;
  3017. tmp12 = MULTIPLY(tmp13, FIX(0.309016994)); /* (c3-c7)/2 */
  3018. z2 = MULTIPLY(tmp11, FIX(0.951056516)); /* (c3+c7)/2 */
  3019. z4 = z3 + tmp12;
  3020. tmp10 = MULTIPLY(z1, FIX(1.396802247)) + z2 + z4; /* c1 */
  3021. tmp14 = MULTIPLY(z1, FIX(0.221231742)) - z2 + z4; /* c9 */
  3022. z2 = MULTIPLY(tmp11, FIX(0.587785252)); /* (c1-c9)/2 */
  3023. z4 = z3 - tmp12 - (tmp13 << (CONST_BITS - 1));
  3024. tmp12 = ((z1 - tmp13) << CONST_BITS) - z3;
  3025. tmp11 = MULTIPLY(z1, FIX(1.260073511)) - z2 - z4; /* c3 */
  3026. tmp13 = MULTIPLY(z1, FIX(0.642039522)) - z2 + z4; /* c7 */
  3027. /* Final output stage */
  3028. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,
  3029. CONST_BITS+PASS1_BITS+3)
  3030. & RANGE_MASK];
  3031. outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,
  3032. CONST_BITS+PASS1_BITS+3)
  3033. & RANGE_MASK];
  3034. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,
  3035. CONST_BITS+PASS1_BITS+3)
  3036. & RANGE_MASK];
  3037. outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,
  3038. CONST_BITS+PASS1_BITS+3)
  3039. & RANGE_MASK];
  3040. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,
  3041. CONST_BITS+PASS1_BITS+3)
  3042. & RANGE_MASK];
  3043. outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,
  3044. CONST_BITS+PASS1_BITS+3)
  3045. & RANGE_MASK];
  3046. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13,
  3047. CONST_BITS+PASS1_BITS+3)
  3048. & RANGE_MASK];
  3049. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13,
  3050. CONST_BITS+PASS1_BITS+3)
  3051. & RANGE_MASK];
  3052. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14,
  3053. CONST_BITS+PASS1_BITS+3)
  3054. & RANGE_MASK];
  3055. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14,
  3056. CONST_BITS+PASS1_BITS+3)
  3057. & RANGE_MASK];
  3058. wsptr += 8; /* advance pointer to next row */
  3059. }
  3060. }
  3061. /*
  3062. * Perform dequantization and inverse DCT on one block of coefficients,
  3063. * producing an 8x4 output block.
  3064. *
  3065. * 4-point IDCT in pass 1 (columns), 8-point in pass 2 (rows).
  3066. */
  3067. GLOBAL(void)
  3068. jpeg_idct_8x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  3069. JCOEFPTR coef_block,
  3070. JSAMPARRAY output_buf, JDIMENSION output_col)
  3071. {
  3072. INT32 tmp0, tmp1, tmp2, tmp3;
  3073. INT32 tmp10, tmp11, tmp12, tmp13;
  3074. INT32 z1, z2, z3;
  3075. JCOEFPTR inptr;
  3076. ISLOW_MULT_TYPE * quantptr;
  3077. int * wsptr;
  3078. JSAMPROW outptr;
  3079. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  3080. int ctr;
  3081. int workspace[8*4]; /* buffers data between passes */
  3082. SHIFT_TEMPS
  3083. /* Pass 1: process columns from input, store into work array.
  3084. * 4-point IDCT kernel,
  3085. * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT].
  3086. */
  3087. inptr = coef_block;
  3088. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  3089. wsptr = workspace;
  3090. for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {
  3091. /* Even part */
  3092. tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  3093. tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  3094. tmp10 = (tmp0 + tmp2) << PASS1_BITS;
  3095. tmp12 = (tmp0 - tmp2) << PASS1_BITS;
  3096. /* Odd part */
  3097. /* Same rotation as in the even part of the 8x8 LL&M IDCT */
  3098. z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  3099. z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  3100. z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
  3101. /* Add fudge factor here for final descale. */
  3102. z1 += ONE << (CONST_BITS-PASS1_BITS-1);
  3103. tmp0 = RIGHT_SHIFT(z1 + MULTIPLY(z2, FIX_0_765366865), /* c2-c6 */
  3104. CONST_BITS-PASS1_BITS);
  3105. tmp2 = RIGHT_SHIFT(z1 - MULTIPLY(z3, FIX_1_847759065), /* c2+c6 */
  3106. CONST_BITS-PASS1_BITS);
  3107. /* Final output stage */
  3108. wsptr[8*0] = (int) (tmp10 + tmp0);
  3109. wsptr[8*3] = (int) (tmp10 - tmp0);
  3110. wsptr[8*1] = (int) (tmp12 + tmp2);
  3111. wsptr[8*2] = (int) (tmp12 - tmp2);
  3112. }
  3113. /* Pass 2: process rows from work array, store into output array.
  3114. * Note that we must descale the results by a factor of 8 == 2**3,
  3115. * and also undo the PASS1_BITS scaling.
  3116. * 8-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
  3117. */
  3118. wsptr = workspace;
  3119. for (ctr = 0; ctr < 4; ctr++) {
  3120. outptr = output_buf[ctr] + output_col;
  3121. /* Even part: reverse the even part of the forward DCT.
  3122. * The rotator is c(-6).
  3123. */
  3124. /* Add range center and fudge factor for final descale and range-limit. */
  3125. z2 = (INT32) wsptr[0] +
  3126. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  3127. (ONE << (PASS1_BITS+2)));
  3128. z3 = (INT32) wsptr[4];
  3129. tmp0 = (z2 + z3) << CONST_BITS;
  3130. tmp1 = (z2 - z3) << CONST_BITS;
  3131. z2 = (INT32) wsptr[2];
  3132. z3 = (INT32) wsptr[6];
  3133. z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
  3134. tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
  3135. tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
  3136. tmp10 = tmp0 + tmp2;
  3137. tmp13 = tmp0 - tmp2;
  3138. tmp11 = tmp1 + tmp3;
  3139. tmp12 = tmp1 - tmp3;
  3140. /* Odd part per figure 8; the matrix is unitary and hence its
  3141. * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
  3142. */
  3143. tmp0 = (INT32) wsptr[7];
  3144. tmp1 = (INT32) wsptr[5];
  3145. tmp2 = (INT32) wsptr[3];
  3146. tmp3 = (INT32) wsptr[1];
  3147. z2 = tmp0 + tmp2;
  3148. z3 = tmp1 + tmp3;
  3149. z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* c3 */
  3150. z2 = MULTIPLY(z2, - FIX_1_961570560); /* -c3-c5 */
  3151. z3 = MULTIPLY(z3, - FIX_0_390180644); /* -c3+c5 */
  3152. z2 += z1;
  3153. z3 += z1;
  3154. z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
  3155. tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* -c1+c3+c5-c7 */
  3156. tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* c1+c3-c5-c7 */
  3157. tmp0 += z1 + z2;
  3158. tmp3 += z1 + z3;
  3159. z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
  3160. tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* c1+c3-c5+c7 */
  3161. tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* c1+c3+c5-c7 */
  3162. tmp1 += z1 + z3;
  3163. tmp2 += z1 + z2;
  3164. /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
  3165. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp3,
  3166. CONST_BITS+PASS1_BITS+3)
  3167. & RANGE_MASK];
  3168. outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp3,
  3169. CONST_BITS+PASS1_BITS+3)
  3170. & RANGE_MASK];
  3171. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp2,
  3172. CONST_BITS+PASS1_BITS+3)
  3173. & RANGE_MASK];
  3174. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp2,
  3175. CONST_BITS+PASS1_BITS+3)
  3176. & RANGE_MASK];
  3177. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp1,
  3178. CONST_BITS+PASS1_BITS+3)
  3179. & RANGE_MASK];
  3180. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp1,
  3181. CONST_BITS+PASS1_BITS+3)
  3182. & RANGE_MASK];
  3183. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13 + tmp0,
  3184. CONST_BITS+PASS1_BITS+3)
  3185. & RANGE_MASK];
  3186. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp0,
  3187. CONST_BITS+PASS1_BITS+3)
  3188. & RANGE_MASK];
  3189. wsptr += DCTSIZE; /* advance pointer to next row */
  3190. }
  3191. }
  3192. /*
  3193. * Perform dequantization and inverse DCT on one block of coefficients,
  3194. * producing a 6x3 output block.
  3195. *
  3196. * 3-point IDCT in pass 1 (columns), 6-point in pass 2 (rows).
  3197. */
  3198. GLOBAL(void)
  3199. jpeg_idct_6x3 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  3200. JCOEFPTR coef_block,
  3201. JSAMPARRAY output_buf, JDIMENSION output_col)
  3202. {
  3203. INT32 tmp0, tmp1, tmp2, tmp10, tmp11, tmp12;
  3204. INT32 z1, z2, z3;
  3205. JCOEFPTR inptr;
  3206. ISLOW_MULT_TYPE * quantptr;
  3207. int * wsptr;
  3208. JSAMPROW outptr;
  3209. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  3210. int ctr;
  3211. int workspace[6*3]; /* buffers data between passes */
  3212. SHIFT_TEMPS
  3213. /* Pass 1: process columns from input, store into work array.
  3214. * 3-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/6).
  3215. */
  3216. inptr = coef_block;
  3217. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  3218. wsptr = workspace;
  3219. for (ctr = 0; ctr < 6; ctr++, inptr++, quantptr++, wsptr++) {
  3220. /* Even part */
  3221. tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  3222. tmp0 <<= CONST_BITS;
  3223. /* Add fudge factor here for final descale. */
  3224. tmp0 += ONE << (CONST_BITS-PASS1_BITS-1);
  3225. tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  3226. tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */
  3227. tmp10 = tmp0 + tmp12;
  3228. tmp2 = tmp0 - tmp12 - tmp12;
  3229. /* Odd part */
  3230. tmp12 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  3231. tmp0 = MULTIPLY(tmp12, FIX(1.224744871)); /* c1 */
  3232. /* Final output stage */
  3233. wsptr[6*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS);
  3234. wsptr[6*2] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS);
  3235. wsptr[6*1] = (int) RIGHT_SHIFT(tmp2, CONST_BITS-PASS1_BITS);
  3236. }
  3237. /* Pass 2: process 3 rows from work array, store into output array.
  3238. * 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12).
  3239. */
  3240. wsptr = workspace;
  3241. for (ctr = 0; ctr < 3; ctr++) {
  3242. outptr = output_buf[ctr] + output_col;
  3243. /* Even part */
  3244. /* Add range center and fudge factor for final descale and range-limit. */
  3245. tmp0 = (INT32) wsptr[0] +
  3246. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  3247. (ONE << (PASS1_BITS+2)));
  3248. tmp0 <<= CONST_BITS;
  3249. tmp2 = (INT32) wsptr[4];
  3250. tmp10 = MULTIPLY(tmp2, FIX(0.707106781)); /* c4 */
  3251. tmp1 = tmp0 + tmp10;
  3252. tmp11 = tmp0 - tmp10 - tmp10;
  3253. tmp10 = (INT32) wsptr[2];
  3254. tmp0 = MULTIPLY(tmp10, FIX(1.224744871)); /* c2 */
  3255. tmp10 = tmp1 + tmp0;
  3256. tmp12 = tmp1 - tmp0;
  3257. /* Odd part */
  3258. z1 = (INT32) wsptr[1];
  3259. z2 = (INT32) wsptr[3];
  3260. z3 = (INT32) wsptr[5];
  3261. tmp1 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */
  3262. tmp0 = tmp1 + ((z1 + z2) << CONST_BITS);
  3263. tmp2 = tmp1 + ((z3 - z2) << CONST_BITS);
  3264. tmp1 = (z1 - z2 - z3) << CONST_BITS;
  3265. /* Final output stage */
  3266. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0,
  3267. CONST_BITS+PASS1_BITS+3)
  3268. & RANGE_MASK];
  3269. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0,
  3270. CONST_BITS+PASS1_BITS+3)
  3271. & RANGE_MASK];
  3272. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1,
  3273. CONST_BITS+PASS1_BITS+3)
  3274. & RANGE_MASK];
  3275. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1,
  3276. CONST_BITS+PASS1_BITS+3)
  3277. & RANGE_MASK];
  3278. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2,
  3279. CONST_BITS+PASS1_BITS+3)
  3280. & RANGE_MASK];
  3281. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2,
  3282. CONST_BITS+PASS1_BITS+3)
  3283. & RANGE_MASK];
  3284. wsptr += 6; /* advance pointer to next row */
  3285. }
  3286. }
  3287. /*
  3288. * Perform dequantization and inverse DCT on one block of coefficients,
  3289. * producing a 4x2 output block.
  3290. *
  3291. * 2-point IDCT in pass 1 (columns), 4-point in pass 2 (rows).
  3292. */
  3293. GLOBAL(void)
  3294. jpeg_idct_4x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  3295. JCOEFPTR coef_block,
  3296. JSAMPARRAY output_buf, JDIMENSION output_col)
  3297. {
  3298. INT32 tmp0, tmp2, tmp10, tmp12;
  3299. INT32 z1, z2, z3;
  3300. JCOEFPTR inptr;
  3301. ISLOW_MULT_TYPE * quantptr;
  3302. INT32 * wsptr;
  3303. JSAMPROW outptr;
  3304. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  3305. int ctr;
  3306. INT32 workspace[4*2]; /* buffers data between passes */
  3307. SHIFT_TEMPS
  3308. /* Pass 1: process columns from input, store into work array. */
  3309. inptr = coef_block;
  3310. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  3311. wsptr = workspace;
  3312. for (ctr = 0; ctr < 4; ctr++, inptr++, quantptr++, wsptr++) {
  3313. /* Even part */
  3314. tmp10 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  3315. /* Odd part */
  3316. tmp0 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  3317. /* Final output stage */
  3318. wsptr[4*0] = tmp10 + tmp0;
  3319. wsptr[4*1] = tmp10 - tmp0;
  3320. }
  3321. /* Pass 2: process 2 rows from work array, store into output array.
  3322. * 4-point IDCT kernel,
  3323. * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT].
  3324. */
  3325. wsptr = workspace;
  3326. for (ctr = 0; ctr < 2; ctr++) {
  3327. outptr = output_buf[ctr] + output_col;
  3328. /* Even part */
  3329. /* Add range center and fudge factor for final descale and range-limit. */
  3330. tmp0 = wsptr[0] + ((((INT32) RANGE_CENTER) << 3) + (ONE << 2));
  3331. tmp2 = wsptr[2];
  3332. tmp10 = (tmp0 + tmp2) << CONST_BITS;
  3333. tmp12 = (tmp0 - tmp2) << CONST_BITS;
  3334. /* Odd part */
  3335. /* Same rotation as in the even part of the 8x8 LL&M IDCT */
  3336. z2 = wsptr[1];
  3337. z3 = wsptr[3];
  3338. z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
  3339. tmp0 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
  3340. tmp2 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
  3341. /* Final output stage */
  3342. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0,
  3343. CONST_BITS+3)
  3344. & RANGE_MASK];
  3345. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0,
  3346. CONST_BITS+3)
  3347. & RANGE_MASK];
  3348. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2,
  3349. CONST_BITS+3)
  3350. & RANGE_MASK];
  3351. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2,
  3352. CONST_BITS+3)
  3353. & RANGE_MASK];
  3354. wsptr += 4; /* advance pointer to next row */
  3355. }
  3356. }
  3357. /*
  3358. * Perform dequantization and inverse DCT on one block of coefficients,
  3359. * producing a 2x1 output block.
  3360. *
  3361. * 1-point IDCT in pass 1 (columns), 2-point in pass 2 (rows).
  3362. */
  3363. GLOBAL(void)
  3364. jpeg_idct_2x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  3365. JCOEFPTR coef_block,
  3366. JSAMPARRAY output_buf, JDIMENSION output_col)
  3367. {
  3368. DCTELEM tmp0, tmp1;
  3369. ISLOW_MULT_TYPE * quantptr;
  3370. JSAMPROW outptr;
  3371. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  3372. ISHIFT_TEMPS
  3373. /* Pass 1: empty. */
  3374. /* Pass 2: process 1 row from input, store into output array. */
  3375. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  3376. outptr = output_buf[0] + output_col;
  3377. /* Even part */
  3378. tmp0 = DEQUANTIZE(coef_block[0], quantptr[0]);
  3379. /* Add range center and fudge factor for final descale and range-limit. */
  3380. tmp0 += (((DCTELEM) RANGE_CENTER) << 3) + (1 << 2);
  3381. /* Odd part */
  3382. tmp1 = DEQUANTIZE(coef_block[1], quantptr[1]);
  3383. /* Final output stage */
  3384. outptr[0] = range_limit[(int) IRIGHT_SHIFT(tmp0 + tmp1, 3) & RANGE_MASK];
  3385. outptr[1] = range_limit[(int) IRIGHT_SHIFT(tmp0 - tmp1, 3) & RANGE_MASK];
  3386. }
  3387. /*
  3388. * Perform dequantization and inverse DCT on one block of coefficients,
  3389. * producing an 8x16 output block.
  3390. *
  3391. * 16-point IDCT in pass 1 (columns), 8-point in pass 2 (rows).
  3392. */
  3393. GLOBAL(void)
  3394. jpeg_idct_8x16 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  3395. JCOEFPTR coef_block,
  3396. JSAMPARRAY output_buf, JDIMENSION output_col)
  3397. {
  3398. INT32 tmp0, tmp1, tmp2, tmp3, tmp10, tmp11, tmp12, tmp13;
  3399. INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27;
  3400. INT32 z1, z2, z3, z4;
  3401. JCOEFPTR inptr;
  3402. ISLOW_MULT_TYPE * quantptr;
  3403. int * wsptr;
  3404. JSAMPROW outptr;
  3405. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  3406. int ctr;
  3407. int workspace[8*16]; /* buffers data between passes */
  3408. SHIFT_TEMPS
  3409. /* Pass 1: process columns from input, store into work array.
  3410. * 16-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/32).
  3411. */
  3412. inptr = coef_block;
  3413. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  3414. wsptr = workspace;
  3415. for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {
  3416. /* Even part */
  3417. tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  3418. tmp0 <<= CONST_BITS;
  3419. /* Add fudge factor here for final descale. */
  3420. tmp0 += ONE << (CONST_BITS-PASS1_BITS-1);
  3421. z1 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  3422. tmp1 = MULTIPLY(z1, FIX(1.306562965)); /* c4[16] = c2[8] */
  3423. tmp2 = MULTIPLY(z1, FIX_0_541196100); /* c12[16] = c6[8] */
  3424. tmp10 = tmp0 + tmp1;
  3425. tmp11 = tmp0 - tmp1;
  3426. tmp12 = tmp0 + tmp2;
  3427. tmp13 = tmp0 - tmp2;
  3428. z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  3429. z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  3430. z3 = z1 - z2;
  3431. z4 = MULTIPLY(z3, FIX(0.275899379)); /* c14[16] = c7[8] */
  3432. z3 = MULTIPLY(z3, FIX(1.387039845)); /* c2[16] = c1[8] */
  3433. tmp0 = z3 + MULTIPLY(z2, FIX_2_562915447); /* (c6+c2)[16] = (c3+c1)[8] */
  3434. tmp1 = z4 + MULTIPLY(z1, FIX_0_899976223); /* (c6-c14)[16] = (c3-c7)[8] */
  3435. tmp2 = z3 - MULTIPLY(z1, FIX(0.601344887)); /* (c2-c10)[16] = (c1-c5)[8] */
  3436. tmp3 = z4 - MULTIPLY(z2, FIX(0.509795579)); /* (c10-c14)[16] = (c5-c7)[8] */
  3437. tmp20 = tmp10 + tmp0;
  3438. tmp27 = tmp10 - tmp0;
  3439. tmp21 = tmp12 + tmp1;
  3440. tmp26 = tmp12 - tmp1;
  3441. tmp22 = tmp13 + tmp2;
  3442. tmp25 = tmp13 - tmp2;
  3443. tmp23 = tmp11 + tmp3;
  3444. tmp24 = tmp11 - tmp3;
  3445. /* Odd part */
  3446. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  3447. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  3448. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  3449. z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
  3450. tmp11 = z1 + z3;
  3451. tmp1 = MULTIPLY(z1 + z2, FIX(1.353318001)); /* c3 */
  3452. tmp2 = MULTIPLY(tmp11, FIX(1.247225013)); /* c5 */
  3453. tmp3 = MULTIPLY(z1 + z4, FIX(1.093201867)); /* c7 */
  3454. tmp10 = MULTIPLY(z1 - z4, FIX(0.897167586)); /* c9 */
  3455. tmp11 = MULTIPLY(tmp11, FIX(0.666655658)); /* c11 */
  3456. tmp12 = MULTIPLY(z1 - z2, FIX(0.410524528)); /* c13 */
  3457. tmp0 = tmp1 + tmp2 + tmp3 -
  3458. MULTIPLY(z1, FIX(2.286341144)); /* c7+c5+c3-c1 */
  3459. tmp13 = tmp10 + tmp11 + tmp12 -
  3460. MULTIPLY(z1, FIX(1.835730603)); /* c9+c11+c13-c15 */
  3461. z1 = MULTIPLY(z2 + z3, FIX(0.138617169)); /* c15 */
  3462. tmp1 += z1 + MULTIPLY(z2, FIX(0.071888074)); /* c9+c11-c3-c15 */
  3463. tmp2 += z1 - MULTIPLY(z3, FIX(1.125726048)); /* c5+c7+c15-c3 */
  3464. z1 = MULTIPLY(z3 - z2, FIX(1.407403738)); /* c1 */
  3465. tmp11 += z1 - MULTIPLY(z3, FIX(0.766367282)); /* c1+c11-c9-c13 */
  3466. tmp12 += z1 + MULTIPLY(z2, FIX(1.971951411)); /* c1+c5+c13-c7 */
  3467. z2 += z4;
  3468. z1 = MULTIPLY(z2, - FIX(0.666655658)); /* -c11 */
  3469. tmp1 += z1;
  3470. tmp3 += z1 + MULTIPLY(z4, FIX(1.065388962)); /* c3+c11+c15-c7 */
  3471. z2 = MULTIPLY(z2, - FIX(1.247225013)); /* -c5 */
  3472. tmp10 += z2 + MULTIPLY(z4, FIX(3.141271809)); /* c1+c5+c9-c13 */
  3473. tmp12 += z2;
  3474. z2 = MULTIPLY(z3 + z4, - FIX(1.353318001)); /* -c3 */
  3475. tmp2 += z2;
  3476. tmp3 += z2;
  3477. z2 = MULTIPLY(z4 - z3, FIX(0.410524528)); /* c13 */
  3478. tmp10 += z2;
  3479. tmp11 += z2;
  3480. /* Final output stage */
  3481. wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp0, CONST_BITS-PASS1_BITS);
  3482. wsptr[8*15] = (int) RIGHT_SHIFT(tmp20 - tmp0, CONST_BITS-PASS1_BITS);
  3483. wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp1, CONST_BITS-PASS1_BITS);
  3484. wsptr[8*14] = (int) RIGHT_SHIFT(tmp21 - tmp1, CONST_BITS-PASS1_BITS);
  3485. wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp2, CONST_BITS-PASS1_BITS);
  3486. wsptr[8*13] = (int) RIGHT_SHIFT(tmp22 - tmp2, CONST_BITS-PASS1_BITS);
  3487. wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp3, CONST_BITS-PASS1_BITS);
  3488. wsptr[8*12] = (int) RIGHT_SHIFT(tmp23 - tmp3, CONST_BITS-PASS1_BITS);
  3489. wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp10, CONST_BITS-PASS1_BITS);
  3490. wsptr[8*11] = (int) RIGHT_SHIFT(tmp24 - tmp10, CONST_BITS-PASS1_BITS);
  3491. wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp11, CONST_BITS-PASS1_BITS);
  3492. wsptr[8*10] = (int) RIGHT_SHIFT(tmp25 - tmp11, CONST_BITS-PASS1_BITS);
  3493. wsptr[8*6] = (int) RIGHT_SHIFT(tmp26 + tmp12, CONST_BITS-PASS1_BITS);
  3494. wsptr[8*9] = (int) RIGHT_SHIFT(tmp26 - tmp12, CONST_BITS-PASS1_BITS);
  3495. wsptr[8*7] = (int) RIGHT_SHIFT(tmp27 + tmp13, CONST_BITS-PASS1_BITS);
  3496. wsptr[8*8] = (int) RIGHT_SHIFT(tmp27 - tmp13, CONST_BITS-PASS1_BITS);
  3497. }
  3498. /* Pass 2: process rows from work array, store into output array.
  3499. * Note that we must descale the results by a factor of 8 == 2**3,
  3500. * and also undo the PASS1_BITS scaling.
  3501. * 8-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
  3502. */
  3503. wsptr = workspace;
  3504. for (ctr = 0; ctr < 16; ctr++) {
  3505. outptr = output_buf[ctr] + output_col;
  3506. /* Even part: reverse the even part of the forward DCT.
  3507. * The rotator is c(-6).
  3508. */
  3509. /* Add range center and fudge factor for final descale and range-limit. */
  3510. z2 = (INT32) wsptr[0] +
  3511. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  3512. (ONE << (PASS1_BITS+2)));
  3513. z3 = (INT32) wsptr[4];
  3514. tmp0 = (z2 + z3) << CONST_BITS;
  3515. tmp1 = (z2 - z3) << CONST_BITS;
  3516. z2 = (INT32) wsptr[2];
  3517. z3 = (INT32) wsptr[6];
  3518. z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
  3519. tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
  3520. tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
  3521. tmp10 = tmp0 + tmp2;
  3522. tmp13 = tmp0 - tmp2;
  3523. tmp11 = tmp1 + tmp3;
  3524. tmp12 = tmp1 - tmp3;
  3525. /* Odd part per figure 8; the matrix is unitary and hence its
  3526. * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
  3527. */
  3528. tmp0 = (INT32) wsptr[7];
  3529. tmp1 = (INT32) wsptr[5];
  3530. tmp2 = (INT32) wsptr[3];
  3531. tmp3 = (INT32) wsptr[1];
  3532. z2 = tmp0 + tmp2;
  3533. z3 = tmp1 + tmp3;
  3534. z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* c3 */
  3535. z2 = MULTIPLY(z2, - FIX_1_961570560); /* -c3-c5 */
  3536. z3 = MULTIPLY(z3, - FIX_0_390180644); /* -c3+c5 */
  3537. z2 += z1;
  3538. z3 += z1;
  3539. z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
  3540. tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* -c1+c3+c5-c7 */
  3541. tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* c1+c3-c5-c7 */
  3542. tmp0 += z1 + z2;
  3543. tmp3 += z1 + z3;
  3544. z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
  3545. tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* c1+c3-c5+c7 */
  3546. tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* c1+c3+c5-c7 */
  3547. tmp1 += z1 + z3;
  3548. tmp2 += z1 + z2;
  3549. /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
  3550. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp3,
  3551. CONST_BITS+PASS1_BITS+3)
  3552. & RANGE_MASK];
  3553. outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp3,
  3554. CONST_BITS+PASS1_BITS+3)
  3555. & RANGE_MASK];
  3556. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp2,
  3557. CONST_BITS+PASS1_BITS+3)
  3558. & RANGE_MASK];
  3559. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp2,
  3560. CONST_BITS+PASS1_BITS+3)
  3561. & RANGE_MASK];
  3562. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp1,
  3563. CONST_BITS+PASS1_BITS+3)
  3564. & RANGE_MASK];
  3565. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp1,
  3566. CONST_BITS+PASS1_BITS+3)
  3567. & RANGE_MASK];
  3568. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13 + tmp0,
  3569. CONST_BITS+PASS1_BITS+3)
  3570. & RANGE_MASK];
  3571. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp0,
  3572. CONST_BITS+PASS1_BITS+3)
  3573. & RANGE_MASK];
  3574. wsptr += DCTSIZE; /* advance pointer to next row */
  3575. }
  3576. }
  3577. /*
  3578. * Perform dequantization and inverse DCT on one block of coefficients,
  3579. * producing a 7x14 output block.
  3580. *
  3581. * 14-point IDCT in pass 1 (columns), 7-point in pass 2 (rows).
  3582. */
  3583. GLOBAL(void)
  3584. jpeg_idct_7x14 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  3585. JCOEFPTR coef_block,
  3586. JSAMPARRAY output_buf, JDIMENSION output_col)
  3587. {
  3588. INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16;
  3589. INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26;
  3590. INT32 z1, z2, z3, z4;
  3591. JCOEFPTR inptr;
  3592. ISLOW_MULT_TYPE * quantptr;
  3593. int * wsptr;
  3594. JSAMPROW outptr;
  3595. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  3596. int ctr;
  3597. int workspace[7*14]; /* buffers data between passes */
  3598. SHIFT_TEMPS
  3599. /* Pass 1: process columns from input, store into work array.
  3600. * 14-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/28).
  3601. */
  3602. inptr = coef_block;
  3603. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  3604. wsptr = workspace;
  3605. for (ctr = 0; ctr < 7; ctr++, inptr++, quantptr++, wsptr++) {
  3606. /* Even part */
  3607. z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  3608. z1 <<= CONST_BITS;
  3609. /* Add fudge factor here for final descale. */
  3610. z1 += ONE << (CONST_BITS-PASS1_BITS-1);
  3611. z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  3612. z2 = MULTIPLY(z4, FIX(1.274162392)); /* c4 */
  3613. z3 = MULTIPLY(z4, FIX(0.314692123)); /* c12 */
  3614. z4 = MULTIPLY(z4, FIX(0.881747734)); /* c8 */
  3615. tmp10 = z1 + z2;
  3616. tmp11 = z1 + z3;
  3617. tmp12 = z1 - z4;
  3618. tmp23 = RIGHT_SHIFT(z1 - ((z2 + z3 - z4) << 1), /* c0 = (c4+c12-c8)*2 */
  3619. CONST_BITS-PASS1_BITS);
  3620. z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  3621. z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  3622. z3 = MULTIPLY(z1 + z2, FIX(1.105676686)); /* c6 */
  3623. tmp13 = z3 + MULTIPLY(z1, FIX(0.273079590)); /* c2-c6 */
  3624. tmp14 = z3 - MULTIPLY(z2, FIX(1.719280954)); /* c6+c10 */
  3625. tmp15 = MULTIPLY(z1, FIX(0.613604268)) - /* c10 */
  3626. MULTIPLY(z2, FIX(1.378756276)); /* c2 */
  3627. tmp20 = tmp10 + tmp13;
  3628. tmp26 = tmp10 - tmp13;
  3629. tmp21 = tmp11 + tmp14;
  3630. tmp25 = tmp11 - tmp14;
  3631. tmp22 = tmp12 + tmp15;
  3632. tmp24 = tmp12 - tmp15;
  3633. /* Odd part */
  3634. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  3635. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  3636. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  3637. z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
  3638. tmp13 = z4 << CONST_BITS;
  3639. tmp14 = z1 + z3;
  3640. tmp11 = MULTIPLY(z1 + z2, FIX(1.334852607)); /* c3 */
  3641. tmp12 = MULTIPLY(tmp14, FIX(1.197448846)); /* c5 */
  3642. tmp10 = tmp11 + tmp12 + tmp13 - MULTIPLY(z1, FIX(1.126980169)); /* c3+c5-c1 */
  3643. tmp14 = MULTIPLY(tmp14, FIX(0.752406978)); /* c9 */
  3644. tmp16 = tmp14 - MULTIPLY(z1, FIX(1.061150426)); /* c9+c11-c13 */
  3645. z1 -= z2;
  3646. tmp15 = MULTIPLY(z1, FIX(0.467085129)) - tmp13; /* c11 */
  3647. tmp16 += tmp15;
  3648. z1 += z4;
  3649. z4 = MULTIPLY(z2 + z3, - FIX(0.158341681)) - tmp13; /* -c13 */
  3650. tmp11 += z4 - MULTIPLY(z2, FIX(0.424103948)); /* c3-c9-c13 */
  3651. tmp12 += z4 - MULTIPLY(z3, FIX(2.373959773)); /* c3+c5-c13 */
  3652. z4 = MULTIPLY(z3 - z2, FIX(1.405321284)); /* c1 */
  3653. tmp14 += z4 + tmp13 - MULTIPLY(z3, FIX(1.6906431334)); /* c1+c9-c11 */
  3654. tmp15 += z4 + MULTIPLY(z2, FIX(0.674957567)); /* c1+c11-c5 */
  3655. tmp13 = (z1 - z3) << PASS1_BITS;
  3656. /* Final output stage */
  3657. wsptr[7*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);
  3658. wsptr[7*13] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);
  3659. wsptr[7*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS);
  3660. wsptr[7*12] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS);
  3661. wsptr[7*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS);
  3662. wsptr[7*11] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS);
  3663. wsptr[7*3] = (int) (tmp23 + tmp13);
  3664. wsptr[7*10] = (int) (tmp23 - tmp13);
  3665. wsptr[7*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS);
  3666. wsptr[7*9] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS);
  3667. wsptr[7*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS);
  3668. wsptr[7*8] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS);
  3669. wsptr[7*6] = (int) RIGHT_SHIFT(tmp26 + tmp16, CONST_BITS-PASS1_BITS);
  3670. wsptr[7*7] = (int) RIGHT_SHIFT(tmp26 - tmp16, CONST_BITS-PASS1_BITS);
  3671. }
  3672. /* Pass 2: process 14 rows from work array, store into output array.
  3673. * 7-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/14).
  3674. */
  3675. wsptr = workspace;
  3676. for (ctr = 0; ctr < 14; ctr++) {
  3677. outptr = output_buf[ctr] + output_col;
  3678. /* Even part */
  3679. /* Add range center and fudge factor for final descale and range-limit. */
  3680. tmp23 = (INT32) wsptr[0] +
  3681. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  3682. (ONE << (PASS1_BITS+2)));
  3683. tmp23 <<= CONST_BITS;
  3684. z1 = (INT32) wsptr[2];
  3685. z2 = (INT32) wsptr[4];
  3686. z3 = (INT32) wsptr[6];
  3687. tmp20 = MULTIPLY(z2 - z3, FIX(0.881747734)); /* c4 */
  3688. tmp22 = MULTIPLY(z1 - z2, FIX(0.314692123)); /* c6 */
  3689. tmp21 = tmp20 + tmp22 + tmp23 - MULTIPLY(z2, FIX(1.841218003)); /* c2+c4-c6 */
  3690. tmp10 = z1 + z3;
  3691. z2 -= tmp10;
  3692. tmp10 = MULTIPLY(tmp10, FIX(1.274162392)) + tmp23; /* c2 */
  3693. tmp20 += tmp10 - MULTIPLY(z3, FIX(0.077722536)); /* c2-c4-c6 */
  3694. tmp22 += tmp10 - MULTIPLY(z1, FIX(2.470602249)); /* c2+c4+c6 */
  3695. tmp23 += MULTIPLY(z2, FIX(1.414213562)); /* c0 */
  3696. /* Odd part */
  3697. z1 = (INT32) wsptr[1];
  3698. z2 = (INT32) wsptr[3];
  3699. z3 = (INT32) wsptr[5];
  3700. tmp11 = MULTIPLY(z1 + z2, FIX(0.935414347)); /* (c3+c1-c5)/2 */
  3701. tmp12 = MULTIPLY(z1 - z2, FIX(0.170262339)); /* (c3+c5-c1)/2 */
  3702. tmp10 = tmp11 - tmp12;
  3703. tmp11 += tmp12;
  3704. tmp12 = MULTIPLY(z2 + z3, - FIX(1.378756276)); /* -c1 */
  3705. tmp11 += tmp12;
  3706. z2 = MULTIPLY(z1 + z3, FIX(0.613604268)); /* c5 */
  3707. tmp10 += z2;
  3708. tmp12 += z2 + MULTIPLY(z3, FIX(1.870828693)); /* c3+c1-c5 */
  3709. /* Final output stage */
  3710. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,
  3711. CONST_BITS+PASS1_BITS+3)
  3712. & RANGE_MASK];
  3713. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,
  3714. CONST_BITS+PASS1_BITS+3)
  3715. & RANGE_MASK];
  3716. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,
  3717. CONST_BITS+PASS1_BITS+3)
  3718. & RANGE_MASK];
  3719. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,
  3720. CONST_BITS+PASS1_BITS+3)
  3721. & RANGE_MASK];
  3722. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,
  3723. CONST_BITS+PASS1_BITS+3)
  3724. & RANGE_MASK];
  3725. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,
  3726. CONST_BITS+PASS1_BITS+3)
  3727. & RANGE_MASK];
  3728. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23,
  3729. CONST_BITS+PASS1_BITS+3)
  3730. & RANGE_MASK];
  3731. wsptr += 7; /* advance pointer to next row */
  3732. }
  3733. }
  3734. /*
  3735. * Perform dequantization and inverse DCT on one block of coefficients,
  3736. * producing a 6x12 output block.
  3737. *
  3738. * 12-point IDCT in pass 1 (columns), 6-point in pass 2 (rows).
  3739. */
  3740. GLOBAL(void)
  3741. jpeg_idct_6x12 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  3742. JCOEFPTR coef_block,
  3743. JSAMPARRAY output_buf, JDIMENSION output_col)
  3744. {
  3745. INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15;
  3746. INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25;
  3747. INT32 z1, z2, z3, z4;
  3748. JCOEFPTR inptr;
  3749. ISLOW_MULT_TYPE * quantptr;
  3750. int * wsptr;
  3751. JSAMPROW outptr;
  3752. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  3753. int ctr;
  3754. int workspace[6*12]; /* buffers data between passes */
  3755. SHIFT_TEMPS
  3756. /* Pass 1: process columns from input, store into work array.
  3757. * 12-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/24).
  3758. */
  3759. inptr = coef_block;
  3760. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  3761. wsptr = workspace;
  3762. for (ctr = 0; ctr < 6; ctr++, inptr++, quantptr++, wsptr++) {
  3763. /* Even part */
  3764. z3 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  3765. z3 <<= CONST_BITS;
  3766. /* Add fudge factor here for final descale. */
  3767. z3 += ONE << (CONST_BITS-PASS1_BITS-1);
  3768. z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  3769. z4 = MULTIPLY(z4, FIX(1.224744871)); /* c4 */
  3770. tmp10 = z3 + z4;
  3771. tmp11 = z3 - z4;
  3772. z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  3773. z4 = MULTIPLY(z1, FIX(1.366025404)); /* c2 */
  3774. z1 <<= CONST_BITS;
  3775. z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  3776. z2 <<= CONST_BITS;
  3777. tmp12 = z1 - z2;
  3778. tmp21 = z3 + tmp12;
  3779. tmp24 = z3 - tmp12;
  3780. tmp12 = z4 + z2;
  3781. tmp20 = tmp10 + tmp12;
  3782. tmp25 = tmp10 - tmp12;
  3783. tmp12 = z4 - z1 - z2;
  3784. tmp22 = tmp11 + tmp12;
  3785. tmp23 = tmp11 - tmp12;
  3786. /* Odd part */
  3787. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  3788. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  3789. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  3790. z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
  3791. tmp11 = MULTIPLY(z2, FIX(1.306562965)); /* c3 */
  3792. tmp14 = MULTIPLY(z2, - FIX_0_541196100); /* -c9 */
  3793. tmp10 = z1 + z3;
  3794. tmp15 = MULTIPLY(tmp10 + z4, FIX(0.860918669)); /* c7 */
  3795. tmp12 = tmp15 + MULTIPLY(tmp10, FIX(0.261052384)); /* c5-c7 */
  3796. tmp10 = tmp12 + tmp11 + MULTIPLY(z1, FIX(0.280143716)); /* c1-c5 */
  3797. tmp13 = MULTIPLY(z3 + z4, - FIX(1.045510580)); /* -(c7+c11) */
  3798. tmp12 += tmp13 + tmp14 - MULTIPLY(z3, FIX(1.478575242)); /* c1+c5-c7-c11 */
  3799. tmp13 += tmp15 - tmp11 + MULTIPLY(z4, FIX(1.586706681)); /* c1+c11 */
  3800. tmp15 += tmp14 - MULTIPLY(z1, FIX(0.676326758)) - /* c7-c11 */
  3801. MULTIPLY(z4, FIX(1.982889723)); /* c5+c7 */
  3802. z1 -= z4;
  3803. z2 -= z3;
  3804. z3 = MULTIPLY(z1 + z2, FIX_0_541196100); /* c9 */
  3805. tmp11 = z3 + MULTIPLY(z1, FIX_0_765366865); /* c3-c9 */
  3806. tmp14 = z3 - MULTIPLY(z2, FIX_1_847759065); /* c3+c9 */
  3807. /* Final output stage */
  3808. wsptr[6*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);
  3809. wsptr[6*11] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);
  3810. wsptr[6*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS);
  3811. wsptr[6*10] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS);
  3812. wsptr[6*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS);
  3813. wsptr[6*9] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS);
  3814. wsptr[6*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS);
  3815. wsptr[6*8] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS);
  3816. wsptr[6*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS);
  3817. wsptr[6*7] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS);
  3818. wsptr[6*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS);
  3819. wsptr[6*6] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS);
  3820. }
  3821. /* Pass 2: process 12 rows from work array, store into output array.
  3822. * 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12).
  3823. */
  3824. wsptr = workspace;
  3825. for (ctr = 0; ctr < 12; ctr++) {
  3826. outptr = output_buf[ctr] + output_col;
  3827. /* Even part */
  3828. /* Add range center and fudge factor for final descale and range-limit. */
  3829. tmp10 = (INT32) wsptr[0] +
  3830. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  3831. (ONE << (PASS1_BITS+2)));
  3832. tmp10 <<= CONST_BITS;
  3833. tmp12 = (INT32) wsptr[4];
  3834. tmp20 = MULTIPLY(tmp12, FIX(0.707106781)); /* c4 */
  3835. tmp11 = tmp10 + tmp20;
  3836. tmp21 = tmp10 - tmp20 - tmp20;
  3837. tmp20 = (INT32) wsptr[2];
  3838. tmp10 = MULTIPLY(tmp20, FIX(1.224744871)); /* c2 */
  3839. tmp20 = tmp11 + tmp10;
  3840. tmp22 = tmp11 - tmp10;
  3841. /* Odd part */
  3842. z1 = (INT32) wsptr[1];
  3843. z2 = (INT32) wsptr[3];
  3844. z3 = (INT32) wsptr[5];
  3845. tmp11 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */
  3846. tmp10 = tmp11 + ((z1 + z2) << CONST_BITS);
  3847. tmp12 = tmp11 + ((z3 - z2) << CONST_BITS);
  3848. tmp11 = (z1 - z2 - z3) << CONST_BITS;
  3849. /* Final output stage */
  3850. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,
  3851. CONST_BITS+PASS1_BITS+3)
  3852. & RANGE_MASK];
  3853. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,
  3854. CONST_BITS+PASS1_BITS+3)
  3855. & RANGE_MASK];
  3856. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,
  3857. CONST_BITS+PASS1_BITS+3)
  3858. & RANGE_MASK];
  3859. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,
  3860. CONST_BITS+PASS1_BITS+3)
  3861. & RANGE_MASK];
  3862. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,
  3863. CONST_BITS+PASS1_BITS+3)
  3864. & RANGE_MASK];
  3865. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,
  3866. CONST_BITS+PASS1_BITS+3)
  3867. & RANGE_MASK];
  3868. wsptr += 6; /* advance pointer to next row */
  3869. }
  3870. }
  3871. /*
  3872. * Perform dequantization and inverse DCT on one block of coefficients,
  3873. * producing a 5x10 output block.
  3874. *
  3875. * 10-point IDCT in pass 1 (columns), 5-point in pass 2 (rows).
  3876. */
  3877. GLOBAL(void)
  3878. jpeg_idct_5x10 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  3879. JCOEFPTR coef_block,
  3880. JSAMPARRAY output_buf, JDIMENSION output_col)
  3881. {
  3882. INT32 tmp10, tmp11, tmp12, tmp13, tmp14;
  3883. INT32 tmp20, tmp21, tmp22, tmp23, tmp24;
  3884. INT32 z1, z2, z3, z4, z5;
  3885. JCOEFPTR inptr;
  3886. ISLOW_MULT_TYPE * quantptr;
  3887. int * wsptr;
  3888. JSAMPROW outptr;
  3889. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  3890. int ctr;
  3891. int workspace[5*10]; /* buffers data between passes */
  3892. SHIFT_TEMPS
  3893. /* Pass 1: process columns from input, store into work array.
  3894. * 10-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/20).
  3895. */
  3896. inptr = coef_block;
  3897. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  3898. wsptr = workspace;
  3899. for (ctr = 0; ctr < 5; ctr++, inptr++, quantptr++, wsptr++) {
  3900. /* Even part */
  3901. z3 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  3902. z3 <<= CONST_BITS;
  3903. /* Add fudge factor here for final descale. */
  3904. z3 += ONE << (CONST_BITS-PASS1_BITS-1);
  3905. z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  3906. z1 = MULTIPLY(z4, FIX(1.144122806)); /* c4 */
  3907. z2 = MULTIPLY(z4, FIX(0.437016024)); /* c8 */
  3908. tmp10 = z3 + z1;
  3909. tmp11 = z3 - z2;
  3910. tmp22 = RIGHT_SHIFT(z3 - ((z1 - z2) << 1), /* c0 = (c4-c8)*2 */
  3911. CONST_BITS-PASS1_BITS);
  3912. z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  3913. z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  3914. z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c6 */
  3915. tmp12 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c2-c6 */
  3916. tmp13 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c2+c6 */
  3917. tmp20 = tmp10 + tmp12;
  3918. tmp24 = tmp10 - tmp12;
  3919. tmp21 = tmp11 + tmp13;
  3920. tmp23 = tmp11 - tmp13;
  3921. /* Odd part */
  3922. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  3923. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  3924. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  3925. z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
  3926. tmp11 = z2 + z4;
  3927. tmp13 = z2 - z4;
  3928. tmp12 = MULTIPLY(tmp13, FIX(0.309016994)); /* (c3-c7)/2 */
  3929. z5 = z3 << CONST_BITS;
  3930. z2 = MULTIPLY(tmp11, FIX(0.951056516)); /* (c3+c7)/2 */
  3931. z4 = z5 + tmp12;
  3932. tmp10 = MULTIPLY(z1, FIX(1.396802247)) + z2 + z4; /* c1 */
  3933. tmp14 = MULTIPLY(z1, FIX(0.221231742)) - z2 + z4; /* c9 */
  3934. z2 = MULTIPLY(tmp11, FIX(0.587785252)); /* (c1-c9)/2 */
  3935. z4 = z5 - tmp12 - (tmp13 << (CONST_BITS - 1));
  3936. tmp12 = (z1 - tmp13 - z3) << PASS1_BITS;
  3937. tmp11 = MULTIPLY(z1, FIX(1.260073511)) - z2 - z4; /* c3 */
  3938. tmp13 = MULTIPLY(z1, FIX(0.642039522)) - z2 + z4; /* c7 */
  3939. /* Final output stage */
  3940. wsptr[5*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);
  3941. wsptr[5*9] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);
  3942. wsptr[5*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS);
  3943. wsptr[5*8] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS);
  3944. wsptr[5*2] = (int) (tmp22 + tmp12);
  3945. wsptr[5*7] = (int) (tmp22 - tmp12);
  3946. wsptr[5*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS);
  3947. wsptr[5*6] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS);
  3948. wsptr[5*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS);
  3949. wsptr[5*5] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS);
  3950. }
  3951. /* Pass 2: process 10 rows from work array, store into output array.
  3952. * 5-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/10).
  3953. */
  3954. wsptr = workspace;
  3955. for (ctr = 0; ctr < 10; ctr++) {
  3956. outptr = output_buf[ctr] + output_col;
  3957. /* Even part */
  3958. /* Add range center and fudge factor for final descale and range-limit. */
  3959. tmp12 = (INT32) wsptr[0] +
  3960. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  3961. (ONE << (PASS1_BITS+2)));
  3962. tmp12 <<= CONST_BITS;
  3963. tmp13 = (INT32) wsptr[2];
  3964. tmp14 = (INT32) wsptr[4];
  3965. z1 = MULTIPLY(tmp13 + tmp14, FIX(0.790569415)); /* (c2+c4)/2 */
  3966. z2 = MULTIPLY(tmp13 - tmp14, FIX(0.353553391)); /* (c2-c4)/2 */
  3967. z3 = tmp12 + z2;
  3968. tmp10 = z3 + z1;
  3969. tmp11 = z3 - z1;
  3970. tmp12 -= z2 << 2;
  3971. /* Odd part */
  3972. z2 = (INT32) wsptr[1];
  3973. z3 = (INT32) wsptr[3];
  3974. z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c3 */
  3975. tmp13 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c1-c3 */
  3976. tmp14 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c1+c3 */
  3977. /* Final output stage */
  3978. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp13,
  3979. CONST_BITS+PASS1_BITS+3)
  3980. & RANGE_MASK];
  3981. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp13,
  3982. CONST_BITS+PASS1_BITS+3)
  3983. & RANGE_MASK];
  3984. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp14,
  3985. CONST_BITS+PASS1_BITS+3)
  3986. & RANGE_MASK];
  3987. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp14,
  3988. CONST_BITS+PASS1_BITS+3)
  3989. & RANGE_MASK];
  3990. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12,
  3991. CONST_BITS+PASS1_BITS+3)
  3992. & RANGE_MASK];
  3993. wsptr += 5; /* advance pointer to next row */
  3994. }
  3995. }
  3996. /*
  3997. * Perform dequantization and inverse DCT on one block of coefficients,
  3998. * producing a 4x8 output block.
  3999. *
  4000. * 8-point IDCT in pass 1 (columns), 4-point in pass 2 (rows).
  4001. */
  4002. GLOBAL(void)
  4003. jpeg_idct_4x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  4004. JCOEFPTR coef_block,
  4005. JSAMPARRAY output_buf, JDIMENSION output_col)
  4006. {
  4007. INT32 tmp0, tmp1, tmp2, tmp3;
  4008. INT32 tmp10, tmp11, tmp12, tmp13;
  4009. INT32 z1, z2, z3;
  4010. JCOEFPTR inptr;
  4011. ISLOW_MULT_TYPE * quantptr;
  4012. int * wsptr;
  4013. JSAMPROW outptr;
  4014. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  4015. int ctr;
  4016. int workspace[4*8]; /* buffers data between passes */
  4017. SHIFT_TEMPS
  4018. /* Pass 1: process columns from input, store into work array.
  4019. * Note results are scaled up by sqrt(8) compared to a true IDCT;
  4020. * furthermore, we scale the results by 2**PASS1_BITS.
  4021. * 8-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
  4022. */
  4023. inptr = coef_block;
  4024. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  4025. wsptr = workspace;
  4026. for (ctr = 4; ctr > 0; ctr--) {
  4027. /* Due to quantization, we will usually find that many of the input
  4028. * coefficients are zero, especially the AC terms. We can exploit this
  4029. * by short-circuiting the IDCT calculation for any column in which all
  4030. * the AC terms are zero. In that case each output is equal to the
  4031. * DC coefficient (with scale factor as needed).
  4032. * With typical images and quantization tables, half or more of the
  4033. * column DCT calculations can be simplified this way.
  4034. */
  4035. if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
  4036. inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&
  4037. inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&
  4038. inptr[DCTSIZE*7] == 0) {
  4039. /* AC terms all zero */
  4040. int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;
  4041. wsptr[4*0] = dcval;
  4042. wsptr[4*1] = dcval;
  4043. wsptr[4*2] = dcval;
  4044. wsptr[4*3] = dcval;
  4045. wsptr[4*4] = dcval;
  4046. wsptr[4*5] = dcval;
  4047. wsptr[4*6] = dcval;
  4048. wsptr[4*7] = dcval;
  4049. inptr++; /* advance pointers to next column */
  4050. quantptr++;
  4051. wsptr++;
  4052. continue;
  4053. }
  4054. /* Even part: reverse the even part of the forward DCT.
  4055. * The rotator is c(-6).
  4056. */
  4057. z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  4058. z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  4059. z2 <<= CONST_BITS;
  4060. z3 <<= CONST_BITS;
  4061. /* Add fudge factor here for final descale. */
  4062. z2 += ONE << (CONST_BITS-PASS1_BITS-1);
  4063. tmp0 = z2 + z3;
  4064. tmp1 = z2 - z3;
  4065. z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  4066. z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  4067. z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
  4068. tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
  4069. tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
  4070. tmp10 = tmp0 + tmp2;
  4071. tmp13 = tmp0 - tmp2;
  4072. tmp11 = tmp1 + tmp3;
  4073. tmp12 = tmp1 - tmp3;
  4074. /* Odd part per figure 8; the matrix is unitary and hence its
  4075. * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
  4076. */
  4077. tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
  4078. tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  4079. tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  4080. tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  4081. z2 = tmp0 + tmp2;
  4082. z3 = tmp1 + tmp3;
  4083. z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* c3 */
  4084. z2 = MULTIPLY(z2, - FIX_1_961570560); /* -c3-c5 */
  4085. z3 = MULTIPLY(z3, - FIX_0_390180644); /* -c3+c5 */
  4086. z2 += z1;
  4087. z3 += z1;
  4088. z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
  4089. tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* -c1+c3+c5-c7 */
  4090. tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* c1+c3-c5-c7 */
  4091. tmp0 += z1 + z2;
  4092. tmp3 += z1 + z3;
  4093. z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
  4094. tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* c1+c3-c5+c7 */
  4095. tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* c1+c3+c5-c7 */
  4096. tmp1 += z1 + z3;
  4097. tmp2 += z1 + z2;
  4098. /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
  4099. wsptr[4*0] = (int) RIGHT_SHIFT(tmp10 + tmp3, CONST_BITS-PASS1_BITS);
  4100. wsptr[4*7] = (int) RIGHT_SHIFT(tmp10 - tmp3, CONST_BITS-PASS1_BITS);
  4101. wsptr[4*1] = (int) RIGHT_SHIFT(tmp11 + tmp2, CONST_BITS-PASS1_BITS);
  4102. wsptr[4*6] = (int) RIGHT_SHIFT(tmp11 - tmp2, CONST_BITS-PASS1_BITS);
  4103. wsptr[4*2] = (int) RIGHT_SHIFT(tmp12 + tmp1, CONST_BITS-PASS1_BITS);
  4104. wsptr[4*5] = (int) RIGHT_SHIFT(tmp12 - tmp1, CONST_BITS-PASS1_BITS);
  4105. wsptr[4*3] = (int) RIGHT_SHIFT(tmp13 + tmp0, CONST_BITS-PASS1_BITS);
  4106. wsptr[4*4] = (int) RIGHT_SHIFT(tmp13 - tmp0, CONST_BITS-PASS1_BITS);
  4107. inptr++; /* advance pointers to next column */
  4108. quantptr++;
  4109. wsptr++;
  4110. }
  4111. /* Pass 2: process 8 rows from work array, store into output array.
  4112. * 4-point IDCT kernel,
  4113. * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT].
  4114. */
  4115. wsptr = workspace;
  4116. for (ctr = 0; ctr < 8; ctr++) {
  4117. outptr = output_buf[ctr] + output_col;
  4118. /* Even part */
  4119. /* Add range center and fudge factor for final descale and range-limit. */
  4120. tmp0 = (INT32) wsptr[0] +
  4121. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  4122. (ONE << (PASS1_BITS+2)));
  4123. tmp2 = (INT32) wsptr[2];
  4124. tmp10 = (tmp0 + tmp2) << CONST_BITS;
  4125. tmp12 = (tmp0 - tmp2) << CONST_BITS;
  4126. /* Odd part */
  4127. /* Same rotation as in the even part of the 8x8 LL&M IDCT */
  4128. z2 = (INT32) wsptr[1];
  4129. z3 = (INT32) wsptr[3];
  4130. z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
  4131. tmp0 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
  4132. tmp2 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
  4133. /* Final output stage */
  4134. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0,
  4135. CONST_BITS+PASS1_BITS+3)
  4136. & RANGE_MASK];
  4137. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0,
  4138. CONST_BITS+PASS1_BITS+3)
  4139. & RANGE_MASK];
  4140. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2,
  4141. CONST_BITS+PASS1_BITS+3)
  4142. & RANGE_MASK];
  4143. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2,
  4144. CONST_BITS+PASS1_BITS+3)
  4145. & RANGE_MASK];
  4146. wsptr += 4; /* advance pointer to next row */
  4147. }
  4148. }
  4149. /*
  4150. * Perform dequantization and inverse DCT on one block of coefficients,
  4151. * producing a 3x6 output block.
  4152. *
  4153. * 6-point IDCT in pass 1 (columns), 3-point in pass 2 (rows).
  4154. */
  4155. GLOBAL(void)
  4156. jpeg_idct_3x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  4157. JCOEFPTR coef_block,
  4158. JSAMPARRAY output_buf, JDIMENSION output_col)
  4159. {
  4160. INT32 tmp0, tmp1, tmp2, tmp10, tmp11, tmp12;
  4161. INT32 z1, z2, z3;
  4162. JCOEFPTR inptr;
  4163. ISLOW_MULT_TYPE * quantptr;
  4164. int * wsptr;
  4165. JSAMPROW outptr;
  4166. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  4167. int ctr;
  4168. int workspace[3*6]; /* buffers data between passes */
  4169. SHIFT_TEMPS
  4170. /* Pass 1: process columns from input, store into work array.
  4171. * 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12).
  4172. */
  4173. inptr = coef_block;
  4174. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  4175. wsptr = workspace;
  4176. for (ctr = 0; ctr < 3; ctr++, inptr++, quantptr++, wsptr++) {
  4177. /* Even part */
  4178. tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  4179. tmp0 <<= CONST_BITS;
  4180. /* Add fudge factor here for final descale. */
  4181. tmp0 += ONE << (CONST_BITS-PASS1_BITS-1);
  4182. tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  4183. tmp10 = MULTIPLY(tmp2, FIX(0.707106781)); /* c4 */
  4184. tmp1 = tmp0 + tmp10;
  4185. tmp11 = RIGHT_SHIFT(tmp0 - tmp10 - tmp10, CONST_BITS-PASS1_BITS);
  4186. tmp10 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  4187. tmp0 = MULTIPLY(tmp10, FIX(1.224744871)); /* c2 */
  4188. tmp10 = tmp1 + tmp0;
  4189. tmp12 = tmp1 - tmp0;
  4190. /* Odd part */
  4191. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  4192. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  4193. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  4194. tmp1 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */
  4195. tmp0 = tmp1 + ((z1 + z2) << CONST_BITS);
  4196. tmp2 = tmp1 + ((z3 - z2) << CONST_BITS);
  4197. tmp1 = (z1 - z2 - z3) << PASS1_BITS;
  4198. /* Final output stage */
  4199. wsptr[3*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS);
  4200. wsptr[3*5] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS);
  4201. wsptr[3*1] = (int) (tmp11 + tmp1);
  4202. wsptr[3*4] = (int) (tmp11 - tmp1);
  4203. wsptr[3*2] = (int) RIGHT_SHIFT(tmp12 + tmp2, CONST_BITS-PASS1_BITS);
  4204. wsptr[3*3] = (int) RIGHT_SHIFT(tmp12 - tmp2, CONST_BITS-PASS1_BITS);
  4205. }
  4206. /* Pass 2: process 6 rows from work array, store into output array.
  4207. * 3-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/6).
  4208. */
  4209. wsptr = workspace;
  4210. for (ctr = 0; ctr < 6; ctr++) {
  4211. outptr = output_buf[ctr] + output_col;
  4212. /* Even part */
  4213. /* Add range center and fudge factor for final descale and range-limit. */
  4214. tmp0 = (INT32) wsptr[0] +
  4215. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  4216. (ONE << (PASS1_BITS+2)));
  4217. tmp0 <<= CONST_BITS;
  4218. tmp2 = (INT32) wsptr[2];
  4219. tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */
  4220. tmp10 = tmp0 + tmp12;
  4221. tmp2 = tmp0 - tmp12 - tmp12;
  4222. /* Odd part */
  4223. tmp12 = (INT32) wsptr[1];
  4224. tmp0 = MULTIPLY(tmp12, FIX(1.224744871)); /* c1 */
  4225. /* Final output stage */
  4226. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0,
  4227. CONST_BITS+PASS1_BITS+3)
  4228. & RANGE_MASK];
  4229. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0,
  4230. CONST_BITS+PASS1_BITS+3)
  4231. & RANGE_MASK];
  4232. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp2,
  4233. CONST_BITS+PASS1_BITS+3)
  4234. & RANGE_MASK];
  4235. wsptr += 3; /* advance pointer to next row */
  4236. }
  4237. }
  4238. /*
  4239. * Perform dequantization and inverse DCT on one block of coefficients,
  4240. * producing a 2x4 output block.
  4241. *
  4242. * 4-point IDCT in pass 1 (columns), 2-point in pass 2 (rows).
  4243. */
  4244. GLOBAL(void)
  4245. jpeg_idct_2x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  4246. JCOEFPTR coef_block,
  4247. JSAMPARRAY output_buf, JDIMENSION output_col)
  4248. {
  4249. INT32 tmp0, tmp2, tmp10, tmp12;
  4250. INT32 z1, z2, z3;
  4251. JCOEFPTR inptr;
  4252. ISLOW_MULT_TYPE * quantptr;
  4253. INT32 * wsptr;
  4254. JSAMPROW outptr;
  4255. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  4256. int ctr;
  4257. INT32 workspace[2*4]; /* buffers data between passes */
  4258. SHIFT_TEMPS
  4259. /* Pass 1: process columns from input, store into work array.
  4260. * 4-point IDCT kernel,
  4261. * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT].
  4262. */
  4263. inptr = coef_block;
  4264. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  4265. wsptr = workspace;
  4266. for (ctr = 0; ctr < 2; ctr++, inptr++, quantptr++, wsptr++) {
  4267. /* Even part */
  4268. tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  4269. tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  4270. tmp10 = (tmp0 + tmp2) << CONST_BITS;
  4271. tmp12 = (tmp0 - tmp2) << CONST_BITS;
  4272. /* Odd part */
  4273. /* Same rotation as in the even part of the 8x8 LL&M IDCT */
  4274. z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  4275. z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  4276. z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
  4277. tmp0 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
  4278. tmp2 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
  4279. /* Final output stage */
  4280. wsptr[2*0] = tmp10 + tmp0;
  4281. wsptr[2*3] = tmp10 - tmp0;
  4282. wsptr[2*1] = tmp12 + tmp2;
  4283. wsptr[2*2] = tmp12 - tmp2;
  4284. }
  4285. /* Pass 2: process 4 rows from work array, store into output array. */
  4286. wsptr = workspace;
  4287. for (ctr = 0; ctr < 4; ctr++) {
  4288. outptr = output_buf[ctr] + output_col;
  4289. /* Even part */
  4290. /* Add range center and fudge factor for final descale and range-limit. */
  4291. tmp10 = wsptr[0] +
  4292. ((((INT32) RANGE_CENTER) << (CONST_BITS+3)) +
  4293. (ONE << (CONST_BITS+2)));
  4294. /* Odd part */
  4295. tmp0 = wsptr[1];
  4296. /* Final output stage */
  4297. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS+3)
  4298. & RANGE_MASK];
  4299. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS+3)
  4300. & RANGE_MASK];
  4301. wsptr += 2; /* advance pointer to next row */
  4302. }
  4303. }
  4304. /*
  4305. * Perform dequantization and inverse DCT on one block of coefficients,
  4306. * producing a 1x2 output block.
  4307. *
  4308. * 2-point IDCT in pass 1 (columns), 1-point in pass 2 (rows).
  4309. */
  4310. GLOBAL(void)
  4311. jpeg_idct_1x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  4312. JCOEFPTR coef_block,
  4313. JSAMPARRAY output_buf, JDIMENSION output_col)
  4314. {
  4315. DCTELEM tmp0, tmp1;
  4316. ISLOW_MULT_TYPE * quantptr;
  4317. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  4318. ISHIFT_TEMPS
  4319. /* Process 1 column from input, store into output array. */
  4320. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  4321. /* Even part */
  4322. tmp0 = DEQUANTIZE(coef_block[DCTSIZE*0], quantptr[DCTSIZE*0]);
  4323. /* Add range center and fudge factor for final descale and range-limit. */
  4324. tmp0 += (((DCTELEM) RANGE_CENTER) << 3) + (1 << 2);
  4325. /* Odd part */
  4326. tmp1 = DEQUANTIZE(coef_block[DCTSIZE*1], quantptr[DCTSIZE*1]);
  4327. /* Final output stage */
  4328. output_buf[0][output_col] =
  4329. range_limit[(int) IRIGHT_SHIFT(tmp0 + tmp1, 3) & RANGE_MASK];
  4330. output_buf[1][output_col] =
  4331. range_limit[(int) IRIGHT_SHIFT(tmp0 - tmp1, 3) & RANGE_MASK];
  4332. }
  4333. #endif /* IDCT_SCALING_SUPPORTED */
  4334. #endif /* DCT_ISLOW_SUPPORTED */